Code: Select all
#include <amxmodx>#include <amxmisc>#include <fakemeta>#include <hamsandwich>#include <zombieplague> static const plugin[] = "[ZP] Extra Item: Bazooka"; static const mrocket[] = "models/zm_bazooka_missile.mdl";static const mrpg_w[] = "models/w_zm_bazooka.mdl";static const mrpg_v[] = "models/v_zm_bazooka.mdl";static const mrpg_p[] = "models/p_zm_bazooka.mdl";static const sfire[] = "weapons/rocketfire1.wav";static const sfly[] = "weapons/nuke_fly.wav";static const shit[] = "weapons/mortarhit.wav";static const spickup[] = "items/gunpickup2.wav"; static const g_item_name[] = "ZP BAZOOKA";const g_item_cost = 25;new g_itemid; new gmsg_screenshake, gmsg_death, gmsg_damage, pcvar_delay, pcvar_maxdmg, pcvar_radius, pcvar_map;new rocketsmoke, explosion, bazsmoke, white; new bool:has_baz[33], bool:CanShoot[33];new dmgcount[33], pcvar_dmgforpacks, pcvar_award; public plugin_init(){ register_plugin(plugin, "0.6", "Random1"); pcvar_delay = register_cvar("zp_baz_delay", "15.0"); pcvar_maxdmg = register_cvar("zp_baz_dmg", "600"); pcvar_radius = register_cvar("zp_baz_radius", "750"); pcvar_map = register_cvar("zp_baz_map", "0"); pcvar_dmgforpacks = get_cvar_pointer("zp_human_damage_reward"); pcvar_award = register_cvar("zp_baz_awardpacks", "1"); if ( pcvar_dmgforpacks == 0 ) { set_pcvar_num(pcvar_award, 0); //if we couldn't read the dmg cvar from zp then set a stop state on dmg reward log_amx("[%s] error reading zp_human_damage_reward cvar from zombie plague, turning award for damage off", plugin); } g_itemid = zp_register_extra_item(g_item_name, g_item_cost, ZP_TEAM_HUMAN); register_concmd("zp_bazooka", "give_bazooka", ADMIN_KICK, "<name/@all> gives a bazooka to the spcified target"); register_event("CurWeapon","switch_to_knife","be","1=1","2=29"); register_event("HLTV", "event_HLTV", "a", "1=0", "2=0") // New Round register_clcmd("drop", "drop_call"); //supports 2 methods of firing, attacking while holding knife and a bind register_clcmd("baz_fire", "fire_call"); register_forward(FM_PlayerPreThink, "fw_prethink"); register_forward(FM_Touch, "fw_touch"); gmsg_screenshake = get_user_msgid("ScreenShake"); gmsg_death = get_user_msgid("DeathMsg"); gmsg_damage = get_user_msgid("Damage");}public event_HLTV(){ //remove entities regardless of cvar new rpg_temp = engfunc(EngFunc_FindEntityByString, -1, "classname", "rpg_temp"); while( rpg_temp > 0) { engfunc(EngFunc_RemoveEntity, rpg_temp); rpg_temp = engfunc(EngFunc_FindEntityByString, -1, "classname", "rpg_temp"); } if ( get_pcvar_num(pcvar_map) ) return; for( new id = 1; id <= 32; id++ ) has_baz[id] = false;} public zp_extra_item_selected(player, itemid){ if (itemid == g_itemid) { if ( has_baz[player] ) { zp_set_user_ammo_packs( player, zp_get_user_ammo_packs(player) + g_item_cost ); client_print(player, print_chat, "Вы приобрели базуку, достанте нож и нажмите на правую кнопку мыши."); } else { has_baz[player] = true; CanShoot[player] = true; client_print(player, print_chat, "[ZP BAZ] You now have a bazooka, attack while holding knife(will take %2.1f seconds to reload", get_pcvar_float(pcvar_delay)); } }}public give_bazooka(id,level,cid){ if (!cmd_access(id,level,cid,1)) { console_print(id,"You have no access to that command"); return; } if (read_argc() > 2) { console_print(id,"Too many arguments supplied."); return; } new arg1[32]; read_argv(1, arg1, sizeof(arg1) - 1); new player = cmd_target(id, arg1, 10); if ( !player ) { if ( arg1[0] == '@' ) { for ( new i = 1; i <= 32; i++ ) { if ( is_user_connected(i) && !has_baz[i] && !zp_get_user_zombie(i) ) { has_baz[i] = true; CanShoot[i] = true; client_print(i, print_chat, "[ZP BAZ] You now have a bazooka, attack while holding knife(will take %2.1f seconds to reload", get_pcvar_float(pcvar_delay)); } } } else { client_print(id, print_chat, "No Such Player/Team"); return; } } else if ( !has_baz[player] && !zp_get_user_zombie(player) ) { has_baz[player] = true; CanShoot[player] = true; client_print(player, print_chat, "[ZP BAZ] You now have a bazooka, attack while holding knife(will take %2.1f seconds to reload", get_pcvar_float(pcvar_delay)); }} public zp_user_infected_post(id, infector) if ( has_baz[id] ) drop_rpg_temp(id); public plugin_precache(){ precache_model(mrocket); precache_model(mrpg_w); precache_model(mrpg_v); precache_model(mrpg_p); precache_sound(sfire); precache_sound(sfly); precache_sound(shit); precache_sound(spickup); rocketsmoke = precache_model("sprites/smoke.spr"); explosion = precache_model("sprites/fexplo.spr"); bazsmoke = precache_model("sprites/steam1.spr"); white = precache_model("sprites/white.spr");} public switch_to_knife(id){ if ( !is_user_alive(id) ) return; if ( has_baz[id] && CanShoot[id] ) { set_pev(id, pev_viewmodel2, mrpg_v); set_pev(id, pev_weaponmodel2, mrpg_p); }} public fw_prethink(id){ static button; button = pev(id, pev_button); if ( button & IN_ATTACK ) fire_call(id);}public fire_call(id){ if ( !is_user_alive(id) || !has_baz[id] || !CanShoot[id] ) return; new weapon = get_user_weapon(id); if ( weapon == CSW_KNIFE ) fire_rocket(id); } fire_rocket(id) { if ( !CanShoot[id] ) return; CanShoot[id] = false; set_task(get_pcvar_float(pcvar_delay), "rpg_reload", id); engclient_cmd(id, "weapon_knife"); //attempt to force model to reset new Float:StartOrigin[3], Float:Angle[3]; pev(id, pev_origin, StartOrigin); pev(id, pev_angles, Angle); new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target")); set_pev(ent, pev_classname, "rpgrocket"); engfunc(EngFunc_SetModel, ent, mrocket); set_pev(ent, pev_mins, {-1.0, -1.0, -1.0}); set_pev(ent, pev_maxs, {1.0, 1.0, 1.0}); engfunc(EngFunc_SetOrigin, ent, StartOrigin); set_pev(ent, pev_angles, Angle); set_pev(ent, pev_solid, 2); set_pev(ent, pev_movetype, 5); set_pev(ent, pev_owner, id); new Float:nVelocity[3]; velocity_by_aim(id, 1500, nVelocity); set_pev(ent, pev_velocity, nVelocity); emit_sound(ent, CHAN_WEAPON, sfire, VOL_NORM, ATTN_NORM, 0, PITCH_NORM); emit_sound(ent, CHAN_VOICE, sfly, VOL_NORM, ATTN_NORM, 0, PITCH_NORM); message_begin(MSG_BROADCAST, SVC_TEMPENTITY); write_byte(22); write_short(ent); write_short(rocketsmoke); write_byte(30); write_byte(3); write_byte(255); write_byte(255); write_byte(255); write_byte(255); message_end();}//---------------------------------------------------------------------------------------public rpg_reload(id){ CanShoot[id] = true; if ( get_user_weapon(id) == CSW_KNIFE ) switch_to_knife(id); //sets our model} //---------------------------------------------------------------------------------------public fw_touch(ent, touched){ if ( !pev_valid(ent) ) return FMRES_IGNORED; static entclass[32]; pev(ent, pev_classname, entclass, 31); if ( equali(entclass, "rpg_temp") ) { static touchclass[32]; pev(touched, pev_classname, touchclass, 31); if ( !equali(touchclass, "player") ) return FMRES_IGNORED; if( !is_user_alive(touched) || zp_get_user_zombie(touched) ) return FMRES_IGNORED; emit_sound(touched, CHAN_VOICE, spickup, 1.0, ATTN_NORM, 0, PITCH_NORM); has_baz[touched] = true; engfunc(EngFunc_RemoveEntity, ent); return FMRES_HANDLED; } else if ( equali(entclass, "rpgrocket") ) { new Float:EndOrigin[3]; pev(ent, pev_origin, EndOrigin); new NonFloatEndOrigin[3]; NonFloatEndOrigin[0] = floatround(EndOrigin[0]); NonFloatEndOrigin[1] = floatround(EndOrigin[1]); NonFloatEndOrigin[2] = floatround(EndOrigin[2]); emit_sound(ent, CHAN_WEAPON, shit, VOL_NORM, ATTN_NORM, 0, PITCH_NORM); emit_sound(ent, CHAN_VOICE, shit, VOL_NORM, ATTN_NORM, 0, PITCH_NORM); message_begin(MSG_BROADCAST, SVC_TEMPENTITY); write_byte(17); write_coord(NonFloatEndOrigin[0]); write_coord(NonFloatEndOrigin[1]); write_coord(NonFloatEndOrigin[2] + 128); write_short(explosion); write_byte(60); write_byte(255); message_end(); message_begin(MSG_BROADCAST, SVC_TEMPENTITY); write_byte(5); write_coord(NonFloatEndOrigin[0]); write_coord(NonFloatEndOrigin[1]); write_coord(NonFloatEndOrigin[2] + 256); write_short(bazsmoke); write_byte(125); write_byte(5); message_end(); new maxdamage = get_pcvar_num(pcvar_maxdmg); new damageradius = get_pcvar_num(pcvar_radius); new PlayerPos[3], distance, damage; for (new i = 1; i <= 32; i++) { if ( is_user_alive(i)) { new id = pev(ent, pev_owner) if ((zp_get_user_zombie(id)) || (zp_get_user_nemesis(id))) if ((zp_get_user_zombie(i)) || (zp_get_user_nemesis(i))) continue; if ((!zp_get_user_zombie(id)) && (!zp_get_user_nemesis(id))) if ((!zp_get_user_zombie(i)) && (!zp_get_user_nemesis(i))) continue; get_user_origin(i, PlayerPos); distance = get_distance(PlayerPos, NonFloatEndOrigin); if (distance <= damageradius) { message_begin(MSG_ONE, gmsg_screenshake, {0,0,0}, i); write_short(1<<14); write_short(1<<14); write_short(1<<14); message_end(); damage = maxdamage - floatround(floatmul(float(maxdamage), floatdiv(float(distance), float(damageradius)))); new attacker = pev(ent, pev_owner); baz_damage(i, attacker, damage, "bazooka"); } } } message_begin(MSG_BROADCAST, SVC_TEMPENTITY); write_byte(21); write_coord(NonFloatEndOrigin[0]); write_coord(NonFloatEndOrigin[1]); write_coord(NonFloatEndOrigin[2]); write_coord(NonFloatEndOrigin[0]); write_coord(NonFloatEndOrigin[1]); write_coord(NonFloatEndOrigin[2] + 320); write_short(white); write_byte(0); write_byte(0); write_byte(16); write_byte(128); write_byte(0); write_byte(255); write_byte(255); write_byte(192); write_byte(128); write_byte(0); message_end(); engfunc(EngFunc_RemoveEntity, ent); return FMRES_HANDLED; } return FMRES_IGNORED;}//---------------------------------------------------------------------------------------public drop_call(id){ if ( has_baz[id] && get_user_weapon(id) == CSW_KNIFE ) { drop_rpg_temp(id); return PLUGIN_HANDLED; //attempt to block can't drop knife message } return PLUGIN_CONTINUE;} drop_rpg_temp(id) { new Float:fAim[3] , Float:fOrigin[3]; velocity_by_aim(id , 64 , fAim); pev(id , pev_origin , fOrigin); fOrigin[0] += fAim[0]; fOrigin[1] += fAim[1]; new rpg = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target")); set_pev(rpg, pev_classname, "rpg_temp"); engfunc(EngFunc_SetModel, rpg, mrpg_w); set_pev(rpg, pev_mins, { -16.0, -16.0, -16.0 } ); set_pev(rpg, pev_maxs, { 16.0, 16.0, 16.0 } ); set_pev(rpg , pev_solid , 1); set_pev(rpg , pev_movetype , 6); engfunc(EngFunc_SetOrigin, rpg, fOrigin); has_baz[id] = false;}//---------------------------------------------------------------------------------------baz_damage(id, attacker, damage, weaponDescription[]){ if ( pev(id, pev_takedamage) == DAMAGE_NO ) return; if ( damage <= 0 ) return; new userHealth = get_user_health(id); if (userHealth - damage <= 0 ) { dmgcount[attacker] += userHealth - damage; set_msg_block(gmsg_death, BLOCK_SET); ExecuteHamB(Ham_Killed, id, attacker, 2); set_msg_block(gmsg_death, BLOCK_NOT); message_begin(MSG_BROADCAST, gmsg_death); write_byte(attacker); write_byte(id); write_byte(0); write_string(weaponDescription); message_end(); set_pev(attacker, pev_frags, float(get_user_frags(attacker) + 1)); new kname[32], vname[32], kauthid[32], vauthid[32], kteam[10], vteam[10]; get_user_name(attacker, kname, 31); get_user_team(attacker, kteam, 9); get_user_authid(attacker, kauthid, 31); get_user_name(id, vname, 31); get_user_team(id, vteam, 9); get_user_authid(id, vauthid, 31); log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^"", kname, get_user_userid(attacker), kauthid, kteam, vname, get_user_userid(id), vauthid, vteam, weaponDescription); } else { dmgcount[attacker] += damage; new origin[3]; get_user_origin(id, origin); message_begin(MSG_ONE,gmsg_damage,{0,0,0},id); write_byte(21); write_byte(20); write_long(DMG_BLAST); write_coord(origin[0]); write_coord(origin[1]); write_coord(origin[2]); message_end(); set_pev(id, pev_health, pev(id, pev_health) - float(damage)); } if ( !get_pcvar_num(pcvar_award) ) return; new breaker = get_pcvar_num(pcvar_dmgforpacks); if ( dmgcount[attacker] > breaker ) { new temp = dmgcount[attacker] / breaker if ( temp * breaker > dmgcount[attacker] ) return; //should never be possible dmgcount[attacker] -= temp * breaker; zp_set_user_ammo_packs( attacker, zp_get_user_ammo_packs(attacker) + temp ); }}/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }*/