/* Chronic Stocks for the AMXX engine or fakemeta module. * * Made by GHW_Chronic * * Version 1.0 * */ //If your script uses fakemeta not engine, //remove the "//" on the next line. //#define use_fakemeta #if defined _chr_engine_included #endinput #endif #define _chr_engine_included #include #if defined use_fakemeta #include #define EV_VEC_origin 1 #define EV_VEC_velocity 2 #define EV_VEC_angles 3 #define EV_VEC_v_angle 4 #define EV_INT_fixangle 1 #else #include #endif /**************************************************** ent1 aims at ent2 with Float:offset[3] Regions: If ent2 is a player or NPC, regions can be applied Note that regions are not 100% accurate but come pretty close to aiming at the specified body part. 0 = Default / aim at origin (Crotch area) 1 = head 2 = chest 3 = Right Arm 4 = Left Arm 5 = Right Leg 6 = Left Leg *****************************************************/ stock entity_set_aim(ent1,ent2,Float:offset2[3],region) { if(!is_valid_ent(ent1) || !is_valid_ent(ent2) || ent1==ent2) { return 0; } static Float:offset[3] offset[0]=offset2[0], offset[1]=offset2[1], offset[2]=offset2[2] static Float:ent1origin[3] static Float:ent2origin[3] static Float:view_angles[3] entity_get_vector(ent2,EV_VEC_origin,ent2origin) if(ent1>32) entity_get_vector(ent1,EV_VEC_origin,ent1origin) else { static origin[3] get_user_origin(ent1,origin,1) IVecFVec(origin,ent1origin) } static bool:player static buttons if(ent2<=32) { player=true get_user_button(ent2) } else { player=false buttons=0 } switch(region) { case 1: { if(player) { static origin2[3] get_user_origin(ent2,origin2,1) IVecFVec(origin2,ent2origin) offset[0] += 7.0 //offset[1] += 7.0 offset[2] += 5.0 } else { offset[2] += 30.173410 } } case 2: { if(player && (buttons & IN_DUCK)) { offset[2] += (17.271676 / 2.0) } else { offset[2] += 17.271676 } } case 3: { if(player && (buttons & IN_DUCK)) { offset[0] += (12.000000 / 2.0) offset[2] += (11.028901 / 2.0) } else { offset[0] += 12.000000 offset[2] += 11.028901 } } case 4: { if(player && (buttons & IN_DUCK)) { offset[0] += (-12.000000 / 2.0) offset[2] += (11.028901 / 2.0) } else { offset[0] += -12.000000 offset[2] += 11.028901 } } case 5: { if(player && (buttons & IN_DUCK)) { offset[0] += (8.000000 / 2.0) offset[2] += (-19.768786 / 2.0) } else { offset[0] += 8.000000 offset[2] += -19.768786 } } case 6: { if(player && (buttons & IN_DUCK)) { offset[0] += (-8.000000 / 2.0) offset[2] += (-19.768786 / 2.0) } else { offset[0] += -8.000000 offset[2] += -19.768786 } } } static Float:ent2_angles[3] entity_get_vector(ent2,EV_VEC_v_angle,ent2_angles) ent2origin[0] += offset[0] * (((floatabs(ent2_angles[1]) - 90) / 90) * -1) ent2origin[1] += offset[1] * (1 - (floatabs(90 - floatabs(ent2_angles[1])) / 90)) ent2origin[2] += offset[2] ent2origin[0] -= ent1origin[0] ent2origin[1] -= ent1origin[1] ent2origin[2] -= ent1origin[2] static Float:hyp hyp = floatsqroot( (ent2origin[0] * ent2origin[0]) + (ent2origin[1] * ent2origin[1])) static x, y, z x=0, y=0, z=0 if(ent2origin[0]>=0.0) x=1 if(ent2origin[1]>=0.0) y=1 if(ent2origin[2]>=0.0) z=1 if(ent2origin[0]==0.0) ent2origin[0] = 0.000001 if(ent2origin[1]==0.0) ent2origin[1] = 0.000001 if(ent2origin[2]==0.0) ent2origin[2] = 0.000001 ent2origin[0]=floatabs(ent2origin[0]) ent2origin[1]=floatabs(ent2origin[1]) ent2origin[2]=floatabs(ent2origin[2]) view_angles[1] = floatatan2(ent2origin[1],ent2origin[0],degrees) //1=positive 0=negative if(x && !y) view_angles[1] = -1 * ( 180 - view_angles[1] ) if(!x && !y) view_angles[1] = ( 180 - view_angles[1] ) if(!x && y) view_angles[1] = view_angles[1] = 180 + floatabs(180 - view_angles[1]) if(x && !y) view_angles[1] = view_angles[1] = 0 - floatabs(-180 - view_angles[1]) if(!x && !y) view_angles[1] *= -1 while(view_angles[1]>180.0) view_angles[1] -= 180 while(view_angles[1]<-180.0) view_angles[1] += 180 if(view_angles[1]==180.0 || view_angles[1]==-180.0) view_angles[1]=-179.999999 view_angles[0] = floatasin(ent2origin[2] / hyp,degrees) if(z) view_angles[0] *= -1 entity_set_int(ent1,EV_INT_fixangle,1) entity_set_vector(ent1,EV_VEC_v_angle,view_angles) entity_set_vector(ent1,EV_VEC_angles,view_angles) entity_set_int(ent1,EV_INT_fixangle,1) return 1; } /*********************************************** Set the amount of recoil for ent's next shot. 0.0 = No Recoil. ***********************************************/ stock set_recoil(ent,Float:amount) { if(!is_valid_ent(ent)) { return 0; } static origin[3] static Float:endpos[3] get_user_origin(ent,origin,1) IVecFVec(origin,endpos) endpos[0] += random_float(amount * -1,amount) endpos[1] += random_float(amount * -1,amount) endpos[2] += random_float(amount * -1,amount) entity_set_vector(ent,EV_VEC_punchangle,Float:{ 0.0, 0.0, 0.0 }) entity_set_vector(ent,EV_VEC_endpos,endpos) return 1; } /************************************************* Set's ent1's origin and angle so that ent1 reflects ent2's origin and angles with supplied offsets. *************************************************/ stock reflect(ent1,ent2,Float:offset2[3],Float:angleoffset2[3]) { if(!is_valid_ent(ent1) || !is_valid_ent(ent2) || ent1==ent2) { return 0; } static Float:offset[3] static Float:angleoffset[3] offset[0] = offset2[0], offset[1] = offset2[1], offset[2] = offset2[2] angleoffset[0] = angleoffset2[0], angleoffset[1] = angleoffset2[1] static Float:ent2origin[3] static Float:ent2angles[3] entity_get_vector(ent2,EV_VEC_origin,ent2origin) entity_get_vector(ent2,EV_VEC_angles,ent2angles) ent2origin[0] += offset[0] * (((floatabs(ent2angles[1]) - 90) / 90) * -1) ent2origin[1] += offset[1] * (1 - (floatabs(90 - floatabs(ent2angles[1])) / 90)) ent2origin[2] += offset[2] ent2angles[0] += angleoffset[0] ent2angles[1] += angleoffset[1] entity_set_vector(ent1,EV_VEC_origin,ent2origin) entity_set_int(ent1,EV_INT_fixangle,1) entity_set_vector(ent1,EV_VEC_angles,ent2angles) entity_set_vector(ent1,EV_VEC_v_angle,ent2angles) entity_set_int(ent1,EV_INT_fixangle,1) return 1; } /************************************************* Finds the location on ent1's hud that ent2 with defined offset is located. Returns the location into the Float:hudpos[2] varaible. ent1 must be a player. (1-32) Note: locations may be off by small amounts. Around 90% accurate results. *************************************************/ stock get_hudmessage_locs(ent1,ent2,Float:offset2[3],Float:hudpos[2]) { if(!is_user_connected(ent1) || !is_valid_ent(ent2) || ent1==ent2) { return 0; } static Float:offset[3] offset[0] = offset2[0], offset[1] = offset2[1], offset[2] = offset2[2] static Float:ent1origin[3] static Float:ent2origin[3] static Float:view_angles[3] entity_get_vector(ent2,EV_VEC_origin,ent2origin) static origin[3] get_user_origin(ent1,origin,1) IVecFVec(origin,ent1origin) static Float:ent1_angles[3] static Float:ent2_angles[3] entity_get_vector(ent1,EV_VEC_v_angle,ent1_angles) entity_get_vector(ent2,EV_VEC_v_angle,ent2_angles) ent2origin[0] += offset[0] * (((floatabs(ent2_angles[1]) - 90) / 90) * -1) ent2origin[1] += offset[1] * (1 - (floatabs(90 - floatabs(ent2_angles[1])) / 90)) ent2origin[2] += offset[2] ent2origin[0] -= ent1origin[0] ent2origin[1] -= ent1origin[1] ent2origin[2] -= ent1origin[2] static Float:hyp hyp = floatsqroot( (ent2origin[0] * ent2origin[0]) + (ent2origin[1] * ent2origin[1])) static x, y, z x=0, y=0, z=0 if(ent2origin[0]>=0.0) x=1 if(ent2origin[1]>=0.0) y=1 if(ent2origin[2]>=0.0) z=1 if(ent2origin[0]==0.0) ent2origin[0] = 0.000001 if(ent2origin[1]==0.0) ent2origin[1] = 0.000001 if(ent2origin[2]==0.0) ent2origin[2] = 0.000001 ent2origin[0]=floatabs(ent2origin[0]) ent2origin[1]=floatabs(ent2origin[1]) ent2origin[2]=floatabs(ent2origin[2]) view_angles[1] = floatatan2(ent2origin[1],ent2origin[0],degrees) //1=positive 0=negative if(x && !y) view_angles[1] = -1 * ( 180 - view_angles[1] ) if(!x && !y) view_angles[1] = ( 180 - view_angles[1] ) if(!x && y) view_angles[1] = view_angles[1] = 180 + floatabs(180 - view_angles[1]) if(x && !y) view_angles[1] = view_angles[1] = 0 - floatabs(-180 - view_angles[1]) if(!x && !y) view_angles[1] *= -1 while(view_angles[1]>180.0) view_angles[1] -= 180 while(view_angles[1]<-180.0) view_angles[1] += 180 if(view_angles[1]==180.0 || view_angles[1]==-180.0) view_angles[1]=-179.999999 view_angles[0] = floatasin(ent2origin[2] / hyp,degrees) if(z) view_angles[0] *= -1 if(floatabs(ent1_angles[0] - view_angles[0]) <= 45.0 && floatabs(ent1_angles[1] - view_angles[1]) <= 45.0) { hudpos[1] = 1 - ( ( (ent1_angles[0] - view_angles[0]) + 46.4 ) / 90.0 ) hudpos[0] = ( (ent1_angles[1] - view_angles[1]) + 43.65 ) / 90.0 } else { return 0; } return 1; } /********************************************** Finds "num" amount of players according to team and/or alive and stores them into closest[33] (1=closest 31=farthest) and stores the distance of the player from id into Float:distances[33] team varaible: -2 = same team as id -1 = not same team as id 0 = anyone 1 = must be on team 1 (in CS would be T) 2 = must be on team 2 (in CS would be CT) 3 = must be on team 3 (in CS would be SPEC) 4 = must be on team 4 (not in CS) ... alive variable: -1 = alive or dead 0 = must be dead 1 = must be alive returns number of players found that match specified team + alive status. **********************************************/ stock find_closest_players(id,num,team,alive,closest[33],Float:distances[33]) { if(!is_user_connected(id)) { return 0; } static i2, i3, num2 num2=0 for(i2=1;i2<=get_maxplayers();i2++) { static bool:contin contin=true if(!is_user_connected(i2) || i2==id) contin=false if(contin) { switch(alive) { case 0: if(is_user_alive(i2)) contin=false case 1: if(!is_user_alive(i2)) contin=false } } if(contin) { switch(team) { case -2: if(get_user_team(i2) != get_user_team(id)) contin=false case -1: if(get_user_team(i2) == get_user_team(id)) contin=false default: if(team && get_user_team(i2) != team) contin=false } } if(contin) num2++ } if(num2>num) num2 = num for(i2=1;i2<=num;i2++) { closest[i2]=0 distances[i2] = 999999.0 for(i3=1;i3<=get_maxplayers();i3++) { if(is_user_alive(i3) && get_user_team(i3) != get_user_team(id) && i3!=closest[i2-1] && i3!=id) { static Float:distance2 distance2 = float(get_entity_distance(id,i3)) if(distance2