1 post · 5,601 views
Thread Rating: ★★★★★
| closedArtificial bullet |
| Started by Dr.G on 02-08-2010, 04:45 PM |
started this thread
Posts: 776Threads: 75
Joined: Nov 2007
02-08-2010, 04:45 PM
#1
This is THE way to make a "fake bullet" with spread. Written by xxavalanchexxrnrn->rnrn
#include <amxmodx>rn#include <fakemeta>rn#include <hamsandwich>rn#include <xs>rnrnnew beamSpr;rnrnpublic plugin_init()rn{rn register_clcmd("fire","do_fire");rn}rnrnpublic plugin_precache()rn{rn beamSpr = precache_model("sprites/laserbeam.spr");rn}rnrnpublic do_fire(id)rn{rn new arg1[4], arg2[8];rn read_argv(1,arg1,3);rn read_argv(2,arg2,7);rn new cShots = str_to_num(arg1);rn new Float:flSpread = floatstr(arg2);rn rn new Float:vecSrc[3], Float:vecOrigin[3], Float:vecViewOfs[3];rn rn pev(id, pev_origin, vecOrigin);rn pev(id, pev_view_ofs, vecViewOfs);rn rn xs_vec_add(vecOrigin, vecViewOfs, vecSrc);rn rn new Float:vecVAngle[3], Float:vecPunchAngle[3], Float:vecTemp[3], Float:vecDirShooting[3];rn rn pev(id, pev_v_angle, vecVAngle);rn pev(id, pev_punchangle, vecPunchAngle);rn xs_vec_add(vecVAngle, vecPunchAngle, vecTemp);rn rn engfunc(EngFunc_MakeVectors, vecTemp);rn global_get(glb_v_forward, vecDirShooting);rn rn new Float:vecSpread[3];rn vecSpread[0] = flSpread;rn vecSpread[1] = flSpread;rn vecSpread[2] = flSpread;rn rn FireBulletsPlayer(cShots, vecSrc, vecDirShooting, vecSpread, 2048.0, 10, id);rn rn return PLUGIN_HANDLED;rn}rnrnpublic FireBulletsPlayer ( cShots, Float:vecSrc[3], Float:vecDirShooting[3], Float:vecSpread[3], Float:flDistance, iDamage, pevAttacker )rn{rn new tr;rn rn new Float:vecRight[3], Float:vecUp[3];rn global_get( glb_v_right, vecRight );rn global_get( glb_v_up, vecUp );rn rn new Float:x, Float:y/* , Float:z; */rn rn new Float:vecDir[3], Float:vecEnd[3], Float:vecTemp1[3], Float:vecTemp2[3];rn rn for ( new iShot = 1; iShot <= cShots; iShot++ )rn {rn //Use player's random seed.rn // get circular gaussian spreadrn x = random_float( -0.5, 0.5 ) + random_float( -0.5, 0.5 );rn y = random_float( -0.5, 0.5 ) + random_float( -0.5, 0.5 );rn /* z = x * x + y * y; */rn rn /* Vector vecDir = vecDirShooting +rn x * vecSpread.x * vecRight +rn y * vecSpread.y * vecUp; */rn rn xs_vec_mul_scalar( vecRight, x * vecSpread[0], vecTemp1 );rn xs_vec_mul_scalar( vecUp, y * vecSpread[1], vecTemp2 );rn rn xs_vec_add( vecDirShooting, vecTemp1, vecDir );rn xs_vec_add( vecDir, vecTemp2, vecDir );rn rn /* vecEnd = vecSrc + vecDir * flDistance; */rn rn xs_vec_mul_scalar( vecDir, flDistance, vecTemp1 );rn xs_vec_add( vecSrc, vecTemp1, vecEnd );rn rn engfunc( EngFunc_TraceLine, vecSrc, vecEnd, DONT_IGNORE_MONSTERS, pevAttacker/*pentIgnore*/, tr );rn rn new Float:flFraction;rn get_tr2( tr, TR_flFraction, flFraction );rn rn // do damage, paint decalsrn if(flFraction != 1.0)rn {rn new pEntity = get_tr2( tr, TR_pHit );rn rn if ( iDamage && pev_valid(pEntity) )rn {rn ExecuteHam( Ham_TakeDamage, pEntity, any:pevAttacker, any:pevAttacker, any:float(iDamage), any:(DMG_BULLET | ((iDamage > 16) ? DMG_ALWAYSGIB : DMG_NEVERGIB)) );rn rn /* TEXTURETYPE_PlaySound(&tr, vecSrc, vecEnd, iBulletType);rn DecalGunshot( &tr, iBulletType ); */rn } rn }rn // make bullet trailsrn /* UTIL_BubbleTrail( vecSrc, tr.vecEndPos, (flDistance * tr.flFraction) / 64.0 ); */rn rn new Float:vecEndPos[3];rn get_tr2( tr, TR_vecEndPos, vecEndPos );rn rn // beam effectrn message_begin( MSG_BROADCAST, SVC_TEMPENTITY );rn write_byte( TE_BEAMPOINTS );rn write_coord( floatround(vecSrc[0]) );rn write_coord( floatround(vecSrc[1]) );rn write_coord( floatround(vecSrc[2]) );rn write_coord( floatround(vecEndPos[0]) );rn write_coord( floatround(vecEndPos[1]) );rn write_coord( floatround(vecEndPos[2]) );rn write_short( beamSpr );rn write_byte( 0 );rn write_byte( 0 );rn write_byte( 255 );rn write_byte( 10 );rn write_byte( 0 );rn write_byte( 0 );rn write_byte( 255 );rn write_byte( 0 );rn write_byte( 200 );rn write_byte( 0 );rn message_end( );rn }rn rn return 1;rn}rnrnThe spread gotta be set really low, I use 0.23 for a shotgun eg.
