- | Afiseaza codul
#include <amxmodx> #include <amxmisc> #include <cstrike> #include <engine> #include <fakemeta> #include <fakemeta_util> #include <hamsandwich> #define PLUGIN "New Plug-In" #define VERSION "1.0" #define AUTHOR "Aragon*" // El e autor. //#define CROSSBOW - N-are rost. #define CROSSBOW_WEAPONKEY 103 #define weapon_crossbow "weapon_sg552" #define CSW_CROSSBOW CSW_SG552 #define CROSSBOW_CLASS "crossbow_bolt" #define crossbow_shotdelay 1.0 // Refire rate new PRIMARY_WEAPONS_BITSUM = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90); new BloodSpray, BloodDrop; new CrossBowModel_V[] = "models/UltimateWeapons/Primary/v_crossbow.mdl"; new CrossBowModel_P[] = "models/UltimateWeapons/Primary/p_crossbow.mdl"; new CrossBowModel_W[] = "models/UltimateWeapons/Primary/w_crossbow.mdl"; new CrossBowModel_S[] = "models/UltimateWeapons/Primary/s_crossbowbolt.mdl"; new CrossBow_Sound[][] = { "weapons/crossbow_shoot1.wav", "weapons/crossbow_hit1.wav", "weapons/crossbow_hit2.wav", "weapons/crossbow_hitbod1.wav", "weapons/crossbow_hitbod2.wav", "weapons/crossbow_foley1.wav", "weapons/crossbow_foley2.wav", "weapons/crossbow_foley3.wav", "weapons/crossbow_foley4.wav", "weapons/crossbow_draw.wav" }; new CrossBow_Generic[][] = { "sprites/uw_crossbow.txt", "sprites/UltimateWeapons/CrossBow.spr", "sprites/UltimateWeapons/640hud7x.spr" }; //new bool:HavePrimaryWeapon[33], PrimaryWeapon[33]; new bool:HaveCrossBow[33], Float:CrossBowLastShotTime[33], crossbow_clip[33], crossbow_reload[33], crossbow_trail, crossbow_explode; new crossbowdamage, crossbowclip, crossbowreloadtime, crossbowradius, crossbowknockback; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("uw_crossbow", "Hook_CrossBow"); register_event("CurWeapon", "CrossBow_ViewModel", "be", "1=1"); register_event("WeapPickup","CrossBow_ViewModel","b","1=19"); register_forward(FM_SetModel, "CrossBow_WorldModel"); register_forward(FM_UpdateClientData, "CrossBow_UpdateClientData_Post", 1); register_forward(FM_CmdStart, "CrossBow_CmdStart"); RegisterHam(Ham_Item_Deploy , weapon_crossbow, "CrossBow_Deploy_Post", 1); RegisterHam(Ham_Item_Holster , weapon_crossbow, "CrossBow_Holster"); RegisterHam(Ham_Item_AddToPlayer, weapon_crossbow, "CrossBow_AddToPlayer"); RegisterHam(Ham_Weapon_Reload, weapon_crossbow, "CrossBow_Reload"); RegisterHam(Ham_Weapon_Reload, weapon_crossbow, "CrossBow_Reload_Post", 1); RegisterHam(Ham_Item_PostFrame, weapon_crossbow, "CrossBow_PostFrame"); register_touch(CROSSBOW_CLASS, "*", "CrossBow_Touch"); crossbowdamage = register_cvar("uw_crossbow_damage", "100"); //| CrossBow Damage |// crossbowclip = register_cvar("uw_crossbow_clip", "10"); //| CrossBow Clip |// crossbowreloadtime = register_cvar("uw_crossbow_reload_time", "3.33"); //| CrossBow Reload Time |// crossbowradius = register_cvar("uw_crossbow_radius", "200"); //| CrossBow Radius |// crossbowknockback = register_cvar("uw_crossbow_knockback", "6"); //| CrossBow KnockBack |// } public plugin_precache() { BloodSpray = precache_model("sprites/bloodspray.spr"); BloodDrop = precache_model("sprites/blood.spr"); precache_model(CrossBowModel_V) precache_model(CrossBowModel_P) precache_model(CrossBowModel_W) precache_model(CrossBowModel_S) crossbow_trail = precache_model("sprites/xbeam3.spr"); crossbow_explode = precache_model("sprites/UltimateWeapons/crossbow_explode.spr"); for(new i = 0; i < sizeof(CrossBow_Sound); i++) engfunc(EngFunc_PrecacheSound, CrossBow_Sound); for(new i = 0; i < sizeof(CrossBow_Generic); i++) engfunc(EngFunc_PrecacheGeneric, CrossBow_Generic); } public CrossBow_ViewModel(id) { if(get_user_weapon(id) == CSW_CROSSBOW && get_user_crossbow(id)) { set_pev(id, pev_viewmodel2, CrossBowModel_V); set_pev(id, pev_weaponmodel2, CrossBowModel_P); } } public CrossBow_WorldModel(entity, model[]) { if(!is_valid_ent(entity)) return FMRES_IGNORED; static ClassName[33]; entity_get_string(entity, EV_SZ_classname, ClassName, charsmax(ClassName)); if(!equal(ClassName, "weaponbox")) return FMRES_IGNORED; new Owner = entity_get_edict(entity, EV_ENT_owner); new CrossBow = find_ent_by_owner(-1, weapon_crossbow, entity); if(get_user_crossbow(Owner) && is_valid_ent(CrossBow) && equal(model, "models/w_sg552.mdl")) { entity_set_int(CrossBow, EV_INT_impulse, CROSSBOW_WEAPONKEY); HaveCrossBow[Owner] = false; entity_set_model(entity, CrossBowModel_W); set_pdata_int(Owner, 361, get_pdata_int(Owner, 361) & ~(1<<6)) return FMRES_SUPERCEDE; } return FMRES_IGNORED; } public CrossBow_UpdateClientData_Post(id, sendweapons, cd_handle) { if(is_user_alive(id) && is_user_connected(id)) { if(get_user_weapon(id) == CSW_CROSSBOW && get_user_crossbow(id)) set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001); } } public CrossBow_CmdStart(id, uc_handle, seed) { if(is_user_alive(id) && is_user_connected(id)) { static CurButton; CurButton = get_uc(uc_handle, UC_Buttons); new Float:NextAttack = get_pdata_float(id, 83, 5); static CrossBow; CrossBow = fm_find_ent_by_owner(-1, weapon_crossbow, id); if(CurButton & IN_ATTACK) { if(get_user_weapon(id) == CSW_CROSSBOW && get_user_crossbow(id)) { if(cs_get_weapon_ammo(CrossBow) > 0 && !crossbow_reload[id] && NextAttack <= 0.0) { if(get_gametime() - CrossBowLastShotTime[id] > crossbow_shotdelay) { set_weapon_anim(id, random_num(1,2)); emit_sound(id, CHAN_WEAPON,CrossBow_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM); CrossBow_Fire(id); static Float:PunchAngles[3]; PunchAngles[0] = random_float(-4.0, -5.0); PunchAngles[1] = 0.0; PunchAngles[2] = 0.0; set_pev(id, pev_punchangle, PunchAngles); cs_set_weapon_ammo(CrossBow, cs_get_weapon_ammo(CrossBow) - 1); CrossBowLastShotTime[id] = get_gametime(); } } CurButton &= ~IN_ATTACK; set_uc(uc_handle, UC_Buttons, CurButton); } } } } public CrossBow_AddToPlayer(Weapon, id) { if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == CROSSBOW_WEAPONKEY) { HaveCrossBow[id] = true; entity_set_int(Weapon, EV_INT_impulse, 0); } //WeaponList(id, CSW_CROSSBOW) } public CrossBow_Deploy_Post(entity) { static Owner; Owner = fm_get_weapon_ent_owner(entity); if(get_user_crossbow(Owner)) { set_pev(Owner, pev_viewmodel2, CrossBowModel_V); set_pev(Owner, pev_weaponmodel2, CrossBowModel_P); set_pdata_float(Owner, 83, 1.03, 5); set_weapon_anim(Owner, 4); static clip; clip = cs_get_weapon_ammo(entity); if(clip > 0) crossbow_reload[Owner] = 0; set_pdata_int(Owner, 361, get_pdata_int(Owner, 361) | (1<<6)) } } public CrossBow_Holster(entity) { static Owner; Owner = fm_get_weapon_ent_owner(entity); if(get_user_crossbow(Owner)) { set_pdata_int(Owner, 361, get_pdata_int(Owner, 361) & ~(1<<6)) } } public CrossBow_Reload(ent) { if(!pev_valid(ent)) return HAM_IGNORED; new id; id = pev(ent, pev_owner); if(!is_user_alive(id) || !get_user_crossbow(id)) return HAM_IGNORED; crossbow_clip[id] = -1; new Ammo = cs_get_user_bpammo(id, CSW_CROSSBOW); if(Ammo <= 0) return HAM_SUPERCEDE; new Clip = get_pdata_int(ent, 51, 4); if(Clip >= get_pcvar_num(crossbowclip)) return HAM_SUPERCEDE; crossbow_clip[id] = Clip; crossbow_reload[id] = 1; return HAM_IGNORED; } public CrossBow_Reload_Post(ent) { if(!pev_valid(ent)) return HAM_IGNORED; new id; id = pev(ent, pev_owner); if(!is_user_alive(id) || !get_user_crossbow(id)) return HAM_IGNORED; if(crossbow_clip[id] == -1) return HAM_IGNORED; new Float:reload_time = get_pcvar_float(crossbowreloadtime); set_pdata_int(ent, 51, crossbow_clip[id], 4); set_pdata_float(ent, 48, reload_time, 4); set_pdata_float(id, 83, reload_time, 5); set_pdata_int(ent, 54, 1, 4); set_weapon_anim(id, 3); return HAM_IGNORED; } public CrossBow_PostFrame(ent) { if(!pev_valid(ent)) return HAM_IGNORED; new id; id = pev(ent, pev_owner); if(!is_user_alive(id) || !get_user_crossbow(id)) return HAM_IGNORED; new Float:NextAttack = get_pdata_float(id, 83, 5); new Ammo = cs_get_user_bpammo(id, CSW_CROSSBOW); new Clip = get_pdata_int(ent, 51, 4); new InReload = get_pdata_int(ent, 54, 4); if(InReload && NextAttack <= 0.0) { new Temp = min(get_pcvar_num(crossbowclip) - Clip, Ammo); set_pdata_int(ent, 51, Clip + Temp, 4); cs_set_user_bpammo(id, CSW_CROSSBOW, Ammo - Temp); set_pdata_int(ent, 54, 0, 4); InReload = 0; crossbow_reload[id] = 0; } return HAM_IGNORED; } public CrossBow_Fire(id) { new ent, Float:Origin[3], Float:Angles[3], Float:Velocity[3]; ent = create_entity("info_target"); engfunc(EngFunc_GetAttachment, id, 0, Origin, Angles); pev(id, pev_angles, Angles); set_pev(ent, pev_origin, Origin); set_pev(ent, pev_angles, Angles); set_pev(ent, pev_solid, 2); set_pev(ent, pev_movetype, 5); set_pev(ent, pev_classname, CROSSBOW_CLASS); set_pev(ent, pev_owner, id); engfunc(EngFunc_SetModel, ent, CrossBowModel_S); set_pev(ent, pev_mins, {-1.0, -1.0, -1.0}); set_pev(ent, pev_maxs, {1.0, 1.0, 1.0}); velocity_by_aim(id, 2000, Velocity); set_pev(ent, pev_velocity, Velocity); message_begin(MSG_BROADCAST, SVC_TEMPENTITY); write_byte(TE_BEAMFOLLOW); // TE id write_short(ent); // entity:attachment to follow write_short(crossbow_trail); // sprite index write_byte(25); // life in 0.1's write_byte(1); // line width in 0.1's write_byte(255); // r write_byte(0); // g write_byte(0); // b write_byte(200); // brightness message_end(); set_pev(ent, pev_iuser4, 0); return PLUGIN_CONTINUE; } public CrossBow_Touch(bolt, touch) { if(is_valid_ent(bolt)) { new id = pev(bolt, pev_owner); new Float:BoltOrigin[3]; pev(bolt, pev_origin, BoltOrigin); engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, BoltOrigin, 0); write_byte(TE_EXPLOSION); engfunc(EngFunc_WriteCoord, BoltOrigin[0]); // Position X engfunc(EngFunc_WriteCoord, BoltOrigin[1]); // Position Y engfunc(EngFunc_WriteCoord, BoltOrigin[2]); // Position Z write_short(crossbow_explode); // Sprite index write_byte(15); // Scale write_byte(15); // Frame rate write_byte(0); // Flags message_end(); for(new Victim = 1; Victim < get_maxplayers(); Victim++) { if(is_user_connected(Victim) && is_user_alive(Victim) && !fm_get_user_godmode(Victim) && get_user_team(Victim) != get_user_team(id) && Victim != id) { new Float:VictimOrigin[3], Float:Distance_F, Distance; pev(Victim, pev_origin, VictimOrigin); Distance_F = get_distance_f(BoltOrigin, VictimOrigin); Distance = floatround(Distance_F); if(Distance <= get_pcvar_float(crossbowradius)) { new Float:DistanceRatio, Float:Damage; DistanceRatio = floatdiv(float(Distance), get_pcvar_float(crossbowradius)); Damage = get_pcvar_float(crossbowdamage) - floatround(floatmul(get_pcvar_float(crossbowdamage), DistanceRatio)); new BloodColor = ExecuteHam(Ham_BloodColor, Victim); if(BloodColor != -1) { new Amount = floatround(Damage); Amount *= 2; //according to HLSDK message_begin(MSG_BROADCAST, SVC_TEMPENTITY); write_byte(TE_BLOODSPRITE); write_coord(floatround(VictimOrigin[0])); write_coord(floatround(VictimOrigin[1])); write_coord(floatround(VictimOrigin[2])); write_short(BloodSpray); write_short(BloodDrop); write_byte(BloodColor); write_byte(min(max(3, Amount/10), 16)); message_end(); } make_knockback(Victim, BoltOrigin, get_pcvar_float(crossbowknockback)*Damage); if(get_user_health(Victim) - Damage >= 1) { ExecuteHam(Ham_TakeDamage, Victim, id, id, Damage, DMG_BLAST); message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, Victim); write_byte(0); write_byte(0); write_long(DMG_BLAST); write_coord(0) ; write_coord(0); write_coord(0); message_end(); message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, Victim); write_short(1<<13); write_short(1<<14); write_short(0x0000); write_byte(255); write_byte(255); write_byte(255); write_byte(100) ; message_end(); message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, Victim); write_short(0xFFFF); write_short(1<<13); write_short(0xFFFF) ; message_end(); } else { death_message(id, Victim, "CrossBow"); } } } } static ClassName[32]; pev(touch, pev_classname, ClassName, charsmax(ClassName)); if(equal(ClassName, "func_breakable")) { if(entity_get_float(touch, EV_FL_health) <= get_pcvar_num(crossbowdamage)) { force_use(id, touch); } } engfunc(EngFunc_RemoveEntity, bolt); } } public Hook_CrossBow(id) { engclient_cmd(id, weapon_crossbow); } public get_user_crossbow(id) { return HaveCrossBow[id]; } public plugin_natives() { register_native("set_user_crossbow","give_crossbow",1) register_native("delete_crossbow","delete_crossbow",1); } public delete_crossbow(id) set_user_crossbow(id, false) public give_crossbow(id) set_user_crossbow(id, true) public set_user_crossbow(id, crossbow) { if(crossbow) { if(!HaveCrossBow[id]) { drop_primary_weapons(id); HaveCrossBow[id] = true; crossbow_reload[id] = 0; fm_give_item(id, weapon_crossbow); new Clip = fm_get_user_weapon_entity(id, CSW_CROSSBOW); cs_set_weapon_ammo(Clip, get_pcvar_num(crossbowclip)); //WeaponList(id, CSW_CROSSBOW) } } else { if(HaveCrossBow[id]) { HaveCrossBow[id] = false; } } } public make_knockback(Victim, Float:origin[3], Float:maxspeed) { new Float:fVelocity[3]; kickback(Victim, origin, maxspeed, fVelocity); entity_set_vector(Victim, EV_VEC_velocity, fVelocity); return(1); } stock fm_get_weapon_ent_owner(ent) { return get_pdata_cbase(ent, 41, 4); } stock drop_primary_weapons(Player) { static weapons[32], num, i, weaponid; num = 0; get_user_weapons(Player, weapons, num); for(i = 0; i < num; i++) { weaponid = weapons ; if(((1<<weaponid) & PRIMARY_WEAPONS_BITSUM)) { static wname[32]; get_weaponname(weaponid, wname, charsmax(wname)); engclient_cmd(Player, "drop", wname); } } } stock set_weapon_anim(id, anim) { set_pev(id, pev_weaponanim, anim); if(is_user_connected(id)) { message_begin(MSG_ONE, SVC_WEAPONANIM, _, id); write_byte(anim); write_byte(pev(id, pev_body)); message_end(); } } stock death_message(Killer, Victim, const Weapon[]) { set_msg_block(get_user_msgid("DeathMsg"), BLOCK_SET); ExecuteHamB(Ham_Killed, Victim, Killer, 2); set_msg_block(get_user_msgid("DeathMsg"), BLOCK_NOT); make_deathmsg(Killer, Victim, 0, Weapon); cs_set_user_money(Killer, cs_get_user_money(Killer) + 300); message_begin(MSG_BROADCAST, get_user_msgid("ScoreInfo")); write_byte(Killer); // id write_short(pev(Killer, pev_frags)); // frags write_short(cs_get_user_deaths(Killer)); // deaths write_short(0); // class? write_short(get_user_team(Killer)); // team message_end(); message_begin(MSG_BROADCAST, get_user_msgid("ScoreInfo")); write_byte(Victim); // id write_short(pev(Victim, pev_frags)); // frags write_short(cs_get_user_deaths(Victim)); // deaths write_short(0); // class? write_short(get_user_team(Victim)); // team message_end(); } stock kickback(ent, Float:fOrigin[3], Float:fSpeed, Float:fVelocity[3]) { new Float:fEntOrigin[3]; entity_get_vector(ent, EV_VEC_origin, fEntOrigin); new Float:fDistance[3]; fDistance[0] = fEntOrigin[0] - fOrigin[0]; fDistance[1] = fEntOrigin[1] - fOrigin[1]; fDistance[2] = fEntOrigin[2] - fOrigin[2]; new Float:fTime = (vector_distance(fEntOrigin,fOrigin) / fSpeed); fVelocity[0] = fDistance[0] / fTime; fVelocity[1] = fDistance[1] / fTime; fVelocity[2] = fDistance[2] / fTime; return(fVelocity[0] && fVelocity[1] && fVelocity[2]); }
Merge acum. :)