#include <amxmodx> #include <engine> #include <fakemeta_util> #include <hamsandwich> new g_player_main[33], g_remoting[33], g_player_main2[33], g_firing[33], g_preparing[33], g_ending[33], g_had_minigun[33], g_reloading[500], g_heat[500], g_dead[500], g_owner[500] new Float:g_last_firesound[33], Float:g_last_shoot[33], Float:g_check_heat[33] new const base_model[] = "models/mw2_auto/base.mdl" new const main_model[] = "models/mw2_auto/main.mdl" new const minigun_sound[3][] = { "mw2_auto/minigun-starting.wav", "mw2_auto/minigun-shooting.wav", "mw2_auto/minigun-stoping.wav" } new g_minigun, g_reg, g_sync_hud1, g_blood, g_bloodspray new cvar_minigun_health, cvar_minigun_dmgrand_start, cvar_minigun_dmgrand_end, cvar_delay_attack, cvar_reload_time // Weapon entity names new const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10", "weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550", "weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249", "weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552", "weapon_ak47", "weapon_knife", "weapon_p90" } public plugin_init() { register_plugin("[MW2] Auto Minigun", "1.0", "Dias") register_clcmd("say /m", "giveItemGun") register_event("HLTV", "event_newround", "a", "1=0", "2=0") register_event("DeathMsg", "event_death", "a") register_think("mw2_mingun_main", "fw_main_think") register_forward(FM_CmdStart, "fw_CmdStart") for (new i = 1; i < sizeof WEAPONENTNAMES; i++) if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1) g_sync_hud1 = CreateHudSyncObj(645) // Cvars cvar_minigun_health = register_cvar("zp_minigun_health", "500") cvar_minigun_dmgrand_start = register_cvar("zp_minigun_dmgrand_start", "10") cvar_minigun_dmgrand_end = register_cvar("zp_minigun_dmgrand_end", "30") cvar_delay_attack = register_cvar("zp_minigun_delay_attack", "0.1") cvar_reload_time = register_cvar("zp_minigun_reload_time", "30.0") //register_clcmd("say /make", "create_minigun") //register_clcmd("say /remote", "remote_minigun") } public plugin_precache() { precache_model(base_model) precache_model(main_model) for(new i = 0; i < sizeof(minigun_sound); i++) engfunc(EngFunc_PrecacheSound, minigun_sound[i]) g_blood = precache_model("sprites/blood.spr") g_bloodspray = precache_model("sprites/bloodspray.spr") } public event_newround() { remove_entity_name("mw2_mingun_base") remove_entity_name("mw2_mingun_main") remove_entity_name("mw2_mingun_view") for(new i = 0; i < get_maxplayers(); i++) if(is_user_alive(i) && is_user_connected(i)) reset_minigun(i) } public event_death() { static victim victim = read_data(2) reset_minigun(victim) } public reset_minigun(id) { attach_view(id, id) g_had_minigun[id] = 0 g_player_main[id] = 0 g_player_main2[id] = 0 g_remoting[id] = 0 g_preparing[id] = 0 g_firing[id] = 0 g_ending[id] = 0 remove_task(id+2479) message_begin(MSG_ONE_UNRELIABLE, 108, {0,0,0}, id) write_short(0) message_end() } // Берем миниган public giveItemGun(id, itemid) { if(itemid == g_minigun) { g_had_minigun[id] = 1 create_minigun(id) } } public create_minigun(id) { if(!g_had_minigun[id]) return g_had_minigun[id] = 0 new Float:Origin[3], Float:Angles[3] get_position(id, 40.0, 0.0, 0.0, Origin) pev(id, pev_angles, Angles) // Make the Base new ent = create_entity("info_target") entity_set_origin(ent, Origin); Angles[0] = 0.0 entity_set_vector(ent, EV_VEC_angles, Angles) entity_set_string(ent,EV_SZ_classname, "mw2_mingun_base") entity_set_model(ent, base_model); entity_set_int(ent,EV_INT_solid, SOLID_NOT) entity_set_float(ent,EV_FL_takedamage,1.0) entity_set_float(ent,EV_FL_health, get_pcvar_float(cvar_minigun_health) + 1000.0) new Float:maxs[3] = {10.0,10.0,1.0} new Float:mins[3] = {-10.0,-10.0,-1.0} entity_set_size(ent,mins,maxs) set_entity_anim(ent, 0) g_dead[ent] = 0 g_owner[ent] = id entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01) drop_to_floor(ent) // Create Main ent = create_entity("info_target") Origin[2] -= 35.0 entity_set_origin(ent, Origin); entity_set_vector(ent, EV_VEC_angles, Angles) entity_set_string(ent,EV_SZ_classname, "mw2_mingun_main") entity_set_model(ent, main_model); entity_set_int(ent,EV_INT_solid, SOLID_BBOX) entity_set_float(ent,EV_FL_takedamage,1.0) entity_set_float(ent,EV_FL_health, get_pcvar_float(cvar_minigun_health) + 1000.0) new Float:maxs2[3] = {10.0,10.0,20.0} new Float:mins2[3] = {-10.0,-10.0,-20.0} entity_set_size(ent,mins2,maxs2) set_entity_anim(ent, 0) g_heat[ent] = 0 entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01) g_player_main[id] = ent g_dead[ent] = 0 g_owner[ent] = id g_reloading[ent] = 0 drop_to_floor(ent) if(!g_reg) { g_reg = 1 RegisterHamFromEntity(Ham_TakeDamage, ent, "fw_main_takedamage") } // Create View Ent ent = create_entity("info_target") get_position(id, 40.0, 0.0, 10.0, Origin) entity_set_origin(ent, Origin); entity_set_vector(ent, EV_VEC_angles, Angles) entity_set_string(ent,EV_SZ_classname, "mw2_mingun_view") entity_set_model(ent, main_model); fm_set_rendering(ent, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 0) g_player_main2[id] = ent } public do_remote(id) { id -= 2479 remote_minigun(id) } public remote_minigun(id) { if(!g_player_main[id]) return attach_view(id, g_player_main2[id]) engclient_cmd(id, "weapon_knife") set_task(1.0, "task_delay", id) client_printcolor(id, "!g[ZP]!y Press !t(E)!y to turn of the MW2-Auto Minigun !!!") } public task_delay(id) g_remoting[id] = 1 public client_PostThink(id) { if(!g_remoting[id]) return if(!g_player_main[id]) return if(!pev_valid(g_player_main[id])) { reset_minigun(id) return } if(!g_firing[id] && !g_reloading[g_player_main[id]]) { if(g_heat[g_player_main[id]] > 0) { static Float:CurTime CurTime = get_gametime() if(CurTime - get_pcvar_float(cvar_delay_attack) * 2 > g_check_heat[id]) { g_heat[g_player_main[id]]-- g_check_heat[id] = CurTime } } } static Message[64] if(g_heat[g_player_main[id]] <= 0) { set_hudmessage(0, 255, 0, -1.0, 0.90, 0, 1.0, 1.0) formatex(Message, sizeof(Message), "Status: Good") } else if(g_heat[g_player_main[id]] > 0 && g_heat[g_player_main[id]] < 100) { set_hudmessage(255, 255, 0, -1.0, 0.90, 0, 1.0, 1.0) formatex(Message, sizeof(Message), "Status: Heat %i%%", g_heat[g_player_main[id]]) } else if(g_heat[g_player_main[id]] >= 100) { set_hudmessage(255, 0, 0, -1.0, 0.90, 0, 1.0, 1.0) formatex(Message, sizeof(Message), "Status: OverHeat") } ShowSyncHudMsg(id, g_sync_hud1, Message) static Float:NewAngles[3] pev(id, pev_angles, NewAngles) set_pev(g_player_main[id], pev_v_angle, NewAngles) set_pev(g_player_main[id], pev_angles, NewAngles) NewAngles[0] -= NewAngles[0] * 3 set_pev(g_player_main2[id], pev_angles, NewAngles) if(get_user_weapon(id) != CSW_KNIFE) engclient_cmd(id, "weapon_knife") } public fw_main_think(ent) { if(!pev_valid(ent)) return if(pev(ent, pev_health) - 1000.0 < 0) { if(!g_dead[ent]) minigun_dead(ent) return } if(!g_dead[ent]) entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01) } public fw_main_takedamage(victim, inflictor, attacker, Float:Damage, damagebits) { if(!is_user_alive(attacker) || !is_user_connected(attacker)) return HAM_IGNORED static Health Health = pev(victim, pev_health) - 1000 client_print(attacker, print_center, "MW2 Auto-Minigun Health: %i", Health) return HAM_HANDLED } public minigun_dead(ent) { g_dead[ent] = 1 static Float:Origin[3] pev(ent, pev_origin, Origin) static id id = g_owner[ent] if(is_user_connected(id)) { reset_minigun(id) client_printcolor(id, "!g[ZP]!y Your MW2 Auto-Minigun has been !tDestroyed!y !!!") } Origin[0] = 9999.0 Origin[1] = 9999.0 Origin[2] = 9999.0 set_pev(ent, pev_origin, Origin) } public fw_CmdStart(id, uc_handle, seed) { if(!is_user_alive(id) || !is_user_connected(id)) return FMRES_IGNORED if(!g_player_main[id]) return FMRES_IGNORED static PressButton PressButton = get_uc(uc_handle, UC_Buttons) if(g_remoting[id]) { if(PressButton & IN_ATTACK) { static Float:CurTime CurTime = get_gametime() if(CurTime - get_pcvar_float(cvar_delay_attack) > g_last_shoot[id]) { if(!g_preparing[id] && !g_firing[id] && !g_ending[id]) { g_preparing[id] = 1 g_firing[id] = 0 set_entity_anim(g_player_main[id], 1) set_task(0.3, "start_attack", id) emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM) } if(!g_preparing[id] && g_firing[id] && !g_ending[id] && g_heat[g_player_main[id]] < 100) { minigun_shoot(id) if(CurTime - get_pcvar_float(cvar_delay_attack) > g_check_heat[id]) { if(g_heat[g_player_main[id]] < 100) g_heat[g_player_main[id]]++ g_check_heat[id] = CurTime } } else if(g_heat[g_player_main[id]] >= 100) { if(!g_preparing[id] && g_firing[id] && !g_ending[id] && !g_reloading[g_player_main[id]]) { g_firing[id] = 0 g_preparing[id] = 0 g_ending[id] = 1 set_entity_anim(g_player_main[id], 3) emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[2], 1.0, ATTN_NORM, 0, PITCH_NORM) set_task(2.0, "stop_attack", id) static Message[128] formatex(Message, sizeof(Message), "!g[ZP]!y System is overheat. Please wait !t%i!y seconds !!!", get_pcvar_float(cvar_reload_time)) client_printcolor(id, Message) g_reloading[g_player_main[id]] = 1 set_task(get_pcvar_float(cvar_reload_time), "reload_heat", id) } } g_last_shoot[id] = CurTime } PressButton &= ~IN_ATTACK set_uc(uc_handle, UC_Buttons, PressButton) } else { if(pev(id, pev_oldbuttons) & IN_ATTACK) { if(g_preparing[id] || g_firing[id]) { g_firing[id] = 0 g_preparing[id] = 0 g_ending[id] = 1 set_entity_anim(g_player_main[id], 3) emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[2], 1.0, ATTN_NORM, 0, PITCH_NORM) set_task(2.0, "stop_attack", id) } } } } if(PressButton & IN_USE) { if(g_remoting[id]) { set_task(1.0, "task_delay2", id) attach_view(id, id) g_preparing[id] = 0 g_firing[id] = 0 PressButton &= ~IN_USE set_uc(uc_handle, UC_Buttons, PressButton) } else { if(!task_exists(id+2479)) { set_task(3.0, "do_remote", id+2479) message_begin(MSG_ONE_UNRELIABLE, 108, {0,0,0}, id) write_short(3) message_end() } } } else { if(pev(id, pev_oldbuttons) & IN_USE) { remove_task(id+2479) message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("BarTime"), {0,0,0}, id) write_short(0) message_end() } } return FMRES_HANDLED } public reload_heat(id) { if(!pev_valid(g_player_main[id])) return g_heat[g_player_main[id]] = 0 g_reloading[g_player_main[id]] = 0 } public task_delay2(id) g_remoting[id] = 0 public start_attack(id) { g_preparing[id] = 0 g_firing[id] = 1 } public stop_attack(id) { g_preparing[id] = 0 g_firing[id] = 0 g_ending[id] = 0 } public minigun_shoot(id) { if(!g_remoting[id]) return PLUGIN_HANDLED static Float:CurTime CurTime = get_gametime() if(CurTime - 0.1 > g_last_firesound[id]) { PlaySound(id, minigun_sound[1]) emit_sound(g_player_main[id], CHAN_BODY, minigun_sound[1], 1.0, ATTN_NORM, 0, PITCH_NORM) g_last_firesound[id] = CurTime } set_entity_anim(g_player_main[id], 2) static Float:Origin[3], Float:AimOrigin[3] get_position(g_player_main[id], 50.0, 0.0, 0.0, Origin) get_position(g_player_main[id], 50.0, 0.0, 50.0, Origin) get_position(g_player_main[id], 4000.0, 0.0, 30.0, AimOrigin) create_tracer(id, Origin, AimOrigin) return PLUGIN_HANDLED } // Ham Weapon Deploy Forward public fw_Item_Deploy_Post(weapon_ent) { if(pev_valid(weapon_ent)) return HAM_IGNORED static id id = pev(weapon_ent, pev_owner) if(g_remoting[id]) engclient_cmd(id, "weapon_knife") return HAM_HANDLED } stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[]) { new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3] pev(id, pev_origin, vOrigin) pev(id, pev_view_ofs,vUp) //for player xs_vec_add(vOrigin,vUp,vOrigin) pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles vAngle[0] -= vAngle[0] * 3 angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight) angle_vector(vAngle,ANGLEVECTOR_UP,vUp) vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up } stock create_tracer(id, Float:start[3], Float:end[3]) { new start_[3], end_[3] FVecIVec(start, start_) FVecIVec(end, end_) message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_TRACER) write_coord(start_[0]) write_coord(start_[1]) write_coord(start_[2]) write_coord(end_[0]) write_coord(end_[1]) write_coord(end_[2]) message_end() static tr, Float:End_Origin[3], Target engfunc(EngFunc_TraceLine, start, end, DONT_IGNORE_MONSTERS, -1, tr) get_tr2(tr, TR_vecEndPos, End_Origin) Target = get_tr2(tr, TR_pHit) if(is_user_alive(Target)) { static Float:Origin[3] pev(Target, pev_origin, Origin) // Show some blood :) message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_BLOODSPRITE) write_coord(floatround(Origin[0])) write_coord(floatround(Origin[1])) write_coord(floatround(Origin[2])) write_short(g_bloodspray) write_short(g_blood) write_byte(70) write_byte(random_num(1,2)) message_end() ExecuteHamB(Ham_TakeDamage, Target, 0, id, random_float(get_pcvar_float(cvar_minigun_dmgrand_start), get_pcvar_float(cvar_minigun_dmgrand_end)), DMG_BULLET) } make_bullet(id, End_Origin) } PlaySound(id, const sound[]) client_cmd(id, "spk ^"%s^"", sound) stock make_bullet(id, Float:Origin[3]) { // Find target new target, body get_user_aiming(id, target, body, 999999) if(target > 0 && target <= get_maxplayers()) { new Float:fStart[3], Float:fEnd[3], Float:fRes[3], Float:fVel[3] pev(id, pev_origin, fStart) // Get ids view direction velocity_by_aim(id, 64, fVel) // Calculate position where blood should be displayed fStart[0] = Origin[0] fStart[1] = Origin[1] fStart[2] = Origin[2] fEnd[0] = fStart[0]+fVel[0] fEnd[1] = fStart[1]+fVel[1] fEnd[2] = fStart[2]+fVel[2] // Draw traceline from victims origin into ids view direction to find // the location on the wall to put some blood on there new res engfunc(EngFunc_TraceLine, fStart, fEnd, 0, target, res) get_tr2(res, TR_vecEndPos, fRes) // Show some blood :) message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_BLOODSPRITE) write_coord(floatround(fStart[0])) write_coord(floatround(fStart[1])) write_coord(floatround(fStart[2])) write_short(g_bloodspray) write_short(g_blood) write_byte(70) write_byte(random_num(1,2)) message_end() } else { new decal = 41 // Check if the wall hit is an entity if(target) { // Put decal on an entity message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_DECAL) write_coord(floatround(Origin[0])) write_coord(floatround(Origin[1])) write_coord(floatround(Origin[2])) write_byte(decal) write_short(target) message_end() } else { // Put decal on "world" (a wall) message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_WORLDDECAL) write_coord(floatround(Origin[0])) write_coord(floatround(Origin[1])) write_coord(floatround(Origin[2])) write_byte(decal) message_end() } // Show sparcles message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_GUNSHOTDECAL) write_coord(floatround(Origin[0])) write_coord(floatround(Origin[1])) write_coord(floatround(Origin[2])) write_short(id) write_byte(decal) message_end() } } stock set_entity_anim(ent, anim) { entity_set_float(ent, EV_FL_animtime, get_gametime()) entity_set_float(ent, EV_FL_framerate, 1.0) entity_set_int(ent, EV_INT_sequence, anim) } stock client_printcolor(const id, const input[], any:...) { new iCount = 1, iPlayers[32] static szMsg[191] vformat(szMsg, charsmax(szMsg), input, 3) replace_all(szMsg, 190, "!g", "^4") replace_all(szMsg, 190, "!y", "^1") replace_all(szMsg, 190, "!t", "^3") if(id) iPlayers[0] = id else get_players(iPlayers, iCount, "ch") for (new i = 0; i < iCount; i++) { if(is_user_connected(iPlayers[i])) { message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, iPlayers[i]) write_byte(iPlayers[i]) write_string(szMsg) message_end() } } }
how to remove the model when destruction