// Experimental user-mode CS2 package. No process writes, hooks or bypass.
// ESP boxes/aim point use an approximate standing height, not actual bones.
class Offsets {
uint64 list=0,matrix=0,controller=0,pawn=0,buildAddress=0;
uint build=0,handle=0,health=0,team=0,scene=0,origin=0,crosshair=0;
}
Offsets offsets;
uint request=0;
float retryAt=0,receivedAt=-10000,moduleAt=0,targetSince=0;
uint64 client=0,engine=0;
uint previousTarget=0;
bool loadedOffsets=false,esp=true,aim=false,trigger=false,menu=true;
float radius=100,smooth=4,gain=0.25,delayMs=80;
uint aimKey=18,triggerKey=67;
string message="Allow HTTP to retrieve matching offsets.";
float bound(float value,float low,float high){return value<low?low:value>high?high:value;}
int mouse_step(float value){return int(bound(value<0?value-0.5f:value+0.5f,-64,64));}
uint64 number(const string &in body,const string &in key,uint64 maximum) {
string value=json::get_string(body,key);uint used=0;
if(value.length()==0||value.length()>12)return 0;
for(uint i=0;i<value.length();i++)if(value[i]<48||value[i]>57)return 0;
uint64 result=parseUInt(value,10,used);
return used==value.length()&&result>0&&result<=maximum?result:0;
}
bool decode(const string &in body,Offsets &out outValue) {
if(!json::valid(body)||json::get_string(body,"schema")!="1")return false;
Offsets candidate;
candidate.list=number(body,"entity_list",0x40000000);candidate.matrix=number(body,"view_matrix",0x40000000);
candidate.controller=number(body,"local_controller",0x40000000);candidate.pawn=number(body,"local_pawn",0x40000000);
candidate.buildAddress=number(body,"build_address",0x40000000);candidate.build=uint(number(body,"build",10000000));
candidate.handle=uint(number(body,"pawn_handle",65535));candidate.health=uint(number(body,"health",16376));
candidate.team=uint(number(body,"team",16376));candidate.scene=uint(number(body,"scene_node",16376));
candidate.origin=uint(number(body,"abs_origin",65523));candidate.crosshair=uint(number(body,"crosshair",65535));
if(candidate.list==0||candidate.matrix==0||candidate.controller==0||candidate.pawn==0||candidate.buildAddress==0||
candidate.build==0||candidate.handle==0||candidate.health==0||candidate.team==0||candidate.scene==0||candidate.origin==0||candidate.crosshair==0)return false;
outValue=candidate;return true;
}
bool pointer(uint64 p){return p>=0x10000&&p<0x7fffffff0000&&(p&7)==0;}
bool read64(uint64 at,uint64 &out p){return process::read_u64(at,p)&&pointer(p);}
uint64 entity(uint64 list,uint index){uint64 bucket=0,pawn=0;if(index==0||index>32767||!read64(list+0x10+8*uint64(index>>9),bucket))return 0;read64(bucket+0x70*uint64(index&511),pawn);return pawn;}
bool local_in_table(memory_buffer@ table,uint64 local){
if(table is null||!pointer(local))return false;
uint matches=0;
for(uint slot=1;slot<=64;slot++){uint64 value=0;if(!table.read_u64(slot*0x70,value))return false;if(value==local)matches++;}
return matches==1;
}
bool validate_list(uint64 global,uint64 local,uint64 localPawn,uint64 &out list,uint64 &out controllers){
list=0;controllers=0;uint64 candidate=0,bucket=0;uint handle=0;
if(!read64(global,candidate)||!read64(candidate+0x10,bucket))return false;
memory_buffer@ table=process::read_buffer(bucket,0x70*65);
if(!local_in_table(table,local)||!process::read_u32(local+offsets.handle,handle)||handle==0||handle==0xffffffff||
entity(candidate,handle&32767)!=localPawn)return false;
list=candidate;controllers=bucket;return true;
}
bool resolve_list(uint64 global,uint64 local,uint64 localPawn,bool legacy,uint64 &out list,uint64 &out controllers){
if(validate_list(global,local,localPawn,list,controllers))return true;
// Observed revision/build 14188 reports a global 16 bytes after the actual
// pointer. Accept its compatibility slot ONLY after both identity checks.
if(legacy&&global>=0x10010&&validate_list(global-16,local,localPawn,list,controllers))return true;
list=0;controllers=0;return false;
}
void update_offsets(){
if(!http::enabled()){message="HTTP consent is off; offsets unavailable.";return;}
if(request!=0){
string state=http::state(request);
if(state=="pending"||state=="running")return;
if(state=="complete"&&http::status(request)==200){Offsets candidate;if(decode(http::body(request),candidate)){offsets=candidate;loadedOffsets=true;receivedAt=time::seconds();message="Offsets loaded; checking game build.";}else message="Offset response rejected.";}
else message="Offset source unavailable; retry in 60 seconds.";
http::release(request);request=0;retryAt=time::seconds()+60;
}
if(time::seconds()>=retryAt){request=http::get("https://easyinstall.help/easy-universal/public/cs2-offsets.json");if(request==0)retryAt=time::seconds()+60;}
}
void on_load(){
if(config::enabled()){
esp=config::get_bool("esp",true);aim=config::get_bool("aim",false);trigger=config::get_bool("trigger",false);
radius=config::get_float("radius",100);smooth=config::get_float("smooth",4);gain=config::get_float("gain",0.25);delayMs=config::get_float("delay",80);
aimKey=uint(config::get_int("aim-key",18));triggerKey=uint(config::get_int("trigger-key",67));
}
radius=bound(radius,10,300);smooth=bound(smooth,1,20);gain=bound(gain,0.01,2);delayMs=bound(delayMs,0,500);
if(aimKey<1||aimKey>254)aimKey=18;if(triggerKey<1||triggerKey>254)triggerKey=67;
}
void controls(){
ui::theme(0x101013ff,0x18181bff,0xccccd3ff,0xf79b53ff,0x3e3e42ff);
if(!menu)return;
render::rect(16,42,286,334,0x18181bdc,true);
render::text(28,54,"Easy / CS2 tools",0xf79b53ff);
esp=ui::checkbox("esp","ESP",esp,28,82,260,26);
aim=ui::checkbox("aim","Aim assist (hold key)",aim,28,114,260,26);
trigger=ui::checkbox("trigger","Trigger (hold key)",trigger,28,146,260,26);
radius=ui::slider("radius","Radius (pixels)",radius,10,300,5,28,178,260,26);
smooth=ui::slider("smooth","Smooth",smooth,1,20,1,28,210,260,26);
gain=ui::slider("gain","Mouse gain",gain,0.01,2,0.01,28,242,260,26);
delayMs=ui::slider("delay","Trigger delay (ms)",delayMs,0,500,10,28,274,260,26);
aimKey=ui::keybind("aim-key","Aim key",aimKey,28,306,126,26);
triggerKey=ui::keybind("trigger-key","Trigger key",triggerKey,162,306,126,26);
render::text(28,346,"Settings: preview window",0xa0a0a8ff);
}
void save_settings(){
if(!config::enabled())return;
config::set_bool("esp",esp);config::set_bool("aim",aim);config::set_bool("trigger",trigger);
config::set_float("radius",radius);config::set_float("smooth",smooth);config::set_float("gain",gain);config::set_float("delay",delayMs);
config::set_int("aim-key",int(aimKey));config::set_int("trigger-key",int(triggerKey));
}
void on_frame(){
controls();update_offsets();save_settings();
if(!process::attached()){render::text(20,20,"Select CS2 PID and allow reading.",0xf79b53ff);previousTarget=0;return;}
if(!process::alive()||process::name()!="cs2.exe"){render::text(20,20,"CS2 unavailable; stop and select its current PID.");previousTarget=0;return;}
if(time::seconds()>=moduleAt){client=process::module_base("client.dll");engine=process::module_base("engine2.dll");moduleAt=time::seconds()+5;}
if(!loadedOffsets||time::seconds()-receivedAt>900||!pointer(client)||!pointer(engine)){render::text(20,20,message);previousTarget=0;return;}
uint build=0;if(!process::read_u32(engine+offsets.buildAddress,build)||build!=offsets.build){render::text(20,20,"Game build differs from offsets; actions disabled.");previousTarget=0;return;}
uint64 list=0,controllers=0,local=0,localPawn=0;
if(!read64(client+offsets.controller,local)||!read64(client+offsets.pawn,localPawn)){render::text(20,20,"Local player unavailable; enter a match.");previousTarget=0;return;}
bool legacy=offsets.build==14188&&offsets.list==40982568;
if(!resolve_list(client+offsets.list,local,localPawn,legacy,list,controllers)){render::text(20,20,"Entity list failed local-player validation.");previousTarget=0;return;}
uint8 team=0;uint localHp=0,targetIndex=0;
if(!process::read_u8(localPawn+offsets.team,team)||(team!=2&&team!=3)||!process::read_u32(localPawn+offsets.health,localHp)||localHp<1||localHp>100){previousTarget=0;return;}
string matrixBytes;if(!process::read_bytes(client+offsets.matrix,64,matrixBytes)){previousTarget=0;return;}
matrix4 matrix;if(!projection::from_bytes(matrixBytes,matrix)){previousTarget=0;return;}
memory_buffer@ table=process::read_buffer(controllers,0x70*65);if(table is null){previousTarget=0;return;}
if(!process::read_u32(localPawn+offsets.crosshair,targetIndex))targetIndex=0;
uint64 targetPawn=targetIndex>0&&targetIndex<32768?entity(list,targetIndex):0;
float bestDistance=radius*radius;vec2 bestPoint;bool hasAim=false,hasTrigger=false;uint drawn=0,occupied=0;
uint bytes=offsets.health+4;if(offsets.team+1>bytes)bytes=offsets.team+1;if(offsets.scene+8>bytes)bytes=offsets.scene+8;
for(uint slot=1;slot<=64;slot++){
uint64 controller=0;uint handle=0;
if(!table.read_u64(slot*0x70,controller)||!pointer(controller)||controller==local)continue;
if(!process::read_u32(controller+offsets.handle,handle)||handle==0||handle==0xffffffff)continue;
if(++occupied>32)break;
uint64 pawn=entity(list,handle&32767);if(!pointer(pawn)||pawn==localPawn)continue;
memory_buffer@ data=process::read_buffer(pawn,bytes);uint hp=0;uint8 opponent=0;uint64 scene=0;
if(data is null||!data.read_u32(offsets.health,hp)||hp<1||hp>100||!data.read_u8(offsets.team,opponent)||opponent==team||(opponent!=2&&opponent!=3)||!data.read_u64(offsets.scene,scene)||!pointer(scene))continue;
memory_buffer@ position=process::read_buffer(scene+offsets.origin,12);vec3 feet;
if(position is null||!position.read_float(0,feet.x)||!position.read_float(4,feet.y)||!position.read_float(8,feet.z))continue;
vec2 bottom,top,point;
if(!projection::project(matrix,feet,screen::width(),screen::height(),bottom)||
!projection::project(matrix,feet.add(vec3(0,0,72)),screen::width(),screen::height(),top)||
!projection::project(matrix,feet.add(vec3(0,0,60)),screen::width(),screen::height(),point))continue;
float height=bottom.y-top.y;if(height<3||height>screen::height()*1.5)continue;
if(esp){render::rect(top.x-height*0.22,top.y,height*0.44,height,0xf79b53ff);render::text(top.x-height*0.22,top.y-18,"HP "+hp,0xeeeeeeff);drawn++;}
// Aim is restricted to the engine's currently identified crosshair pawn.
// This conservative sample does not pretend to implement world visibility.
if(pawn==targetPawn){
hasTrigger=true;float dx=point.x-screen::width()*0.5,dy=point.y-screen::height()*0.5,d=dx*dx+dy*dy;
if(d<bestDistance){bestDistance=d;bestPoint=point;hasAim=true;}
}
}
render::text(20,20,"CS2 / build "+build+" / boxes "+drawn,0xf79b53ff);
if(aim)render::circle(screen::width()*0.5,screen::height()*0.5,radius,0xf79b5366);
if(!input::enabled()||!input::active()){previousTarget=0;return;}
if(aim&&hasAim&&input::key_down(aimKey)){
int dx=mouse_step((bestPoint.x-screen::width()*0.5)*gain/smooth),dy=mouse_step((bestPoint.y-screen::height()*0.5)*gain/smooth);
input::move_mouse(dx,dy);
}
if(!trigger||!hasTrigger||!input::key_down(triggerKey)){previousTarget=0;return;}
if(previousTarget!=targetIndex){previousTarget=targetIndex;targetSince=time::seconds();return;}
if((time::seconds()-targetSince)*1000>=delayMs)input::click_left();
}
void on_unload(){if(request!=0){http::release(request);request=0;}}
Easy Universal / Примеры и шаблоны