
Стаж: 12 лет
Сообщений: 36
Благодарностей: 1
Полезность: 19
|
В данном плагине "Огнемет" дроп оружия отключен, когда убьют-оно не выпадает, скинуть его нельзя. Но, когда игрок воскрес- у него данное оружие уже есть в инвентаре, необходимо, что бы этого оружие в инвентаре при воскрешении не было и игроку вновь пришлось его покупать. Код ниже: Код #include <amxmodx> #include <amxmisc> #include <fakemeta> #include <cstrike> #include <engine> #include <fun> #include <csx> #include <xs> new wpn_ft new sprite_fire new sprite_burn new sprite_xplo new g_freezetime new g_restarted new Float:g_starttime new cvar_enabled new cvar_client_buy new cvar_damage new cvar_xplode_dmg new cvar_cost new cvar_fuelcost new cvar_fueltank new cvar_buyzone new cvar_buytime new cvar_damage_dis new cvar_splash_dis new g_buyzone[33] new g_FuelTank[33] new g_Activated[33] new Float:g_Delay[33] new g_hasFlamethrower[33] new g_FireFlamethrower[33] new g_BuyFuel[33] static PLUGIN_NAME[] = "SyN Flamethrower" static PLUGIN_AUTHOR[] = "Cheap_Suit" static PLUGIN_VERSION[] = "1.1" public plugin_init() { register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR) register_cvar("ft_version", PLUGIN_VERSION, FCVAR_SERVER) cvar_enabled = register_cvar("ft_enable", "1") cvar_client_buy = register_cvar("ft_client_buy", "1") cvar_buyzone = register_cvar("ft_obey_buyzone", "1") cvar_buytime = register_cvar("ft_obey_buytime", "1") cvar_cost = register_cvar("ft_cost", "2200") cvar_fuelcost = register_cvar("ft_fuelcost", "50") cvar_fueltank = register_cvar("ft_fueltank", "50") cvar_damage = register_cvar("ft_damage", "17") cvar_xplode_dmg = register_cvar("ft_xplode_dmg", "30") cvar_damage_dis = register_cvar("ft_damage_dis", "100") cvar_splash_dis = register_cvar("ft_splash_dis", "40") register_concmd("buyft", "cmd_BuyFlamethrower", ADMIN_USER, "- Buys a flamethrower") register_clcmd("say /buyft", "cmd_BuyFlamethrower", ADMIN_USER, "- Buys a flamethrower") register_clcmd("say_team /buyft", "cmd_BuyFlamethrower", ADMIN_USER, "- Buys a flamethrower") register_clcmd("ft_give", "cmd_GiveFlamethrowers",ADMIN_BAN, "<@all/ct/t>/userid - Gives free flamethrowers") register_event("CurWeapon", "Event_CurWeapon", "be", "1=1") register_event("StatusIcon", "Event_BuyZone", "b", "2=buyzone") register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0") register_event("TextMsg", "Event_GameRestart", "a", "2=#Game_Commencing", "2=#Game_will_restart_in") register_logevent("LogEvent_RoundStart", 2, "0=World triggered", "1=Round_Start") register_forward(FM_CmdStart, "fw_CmdStart") register_forward(FM_PlayerPostThink, "fw_PlayerPostThink") register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1) register_think("flamethrower", "think_Flamethrower") register_touch("flamethrower", "player", "touch_Flamethrower") wpn_ft = custom_weapon_add("weapon_flamethrower", 0, "flamethrower") if(!get_pcvar_num(cvar_enabled)) pause("ad", PLUGIN_NAME) } public plugin_precache() { precache_sound("flamethrower.wav") precache_sound("items/ammopickup2.wav") sprite_xplo = precache_model("sprites/zerogxplode.spr") sprite_fire = precache_model("sprites/explode1.spr") sprite_burn = precache_model("sprites/xfire.spr") precache_model("models/v_knife.mdl") precache_model("models/p_knife.mdl") precache_model("models/shield/v_shield_knife.mdl") precache_model("models/shield/p_shield_knife.mdl") precache_model("models/w_flamethrower.mdl") precache_model("models/v_flamethrower.mdl") precache_model("models/p_flamethrower.mdl") } public cmd_GiveFlamethrowers(id, level, cid) { if(!cmd_access(id, level, cid, 2)) return PLUGIN_HANDLED new Arg1[64], target read_argv(1, Arg1, 63) new adminName[32] get_user_name(id, adminName, 31) new targetTeam new Players[32], iNum if(Arg1[0] == '@') { if(equali(Arg1[1], "all")) { targetTeam = 0 get_players(Players, iNum, "a") } else if(equali(Arg1[1], "t")) { targetTeam = 1 get_players(Players, iNum, "ae" , "terrorist") } else if(equali(Arg1[1], "ct")) { targetTeam = 2 get_players(Players, iNum, "ae" , "ct") } for(new i = 0; i < iNum; ++i) { target = Players[i] g_hasFlamethrower[target] = 1 g_FuelTank[target] = get_pcvar_num(cvar_fueltank) new temp[2], weaponID = get_user_weapon(target, temp[0], temp[1]) if(weaponID == CSW_KNIFE) { g_Activated[target] = true set_flamethrower_model(target) } client_cmd(target, "spk items/ammopickup2") client_print(target, print_chat, "You have been given a flamethrower (press 3 to use)") } switch(targetTeam) { case 0: client_print(0, print_chat, "Admin: %s has given everyone a flamethrower", adminName) case 1: client_print(0, print_chat, "Admin: %s has given all terrorist a flamethrower", adminName) case 2: client_print(0, print_chat, "Admin: %s has given all ct's a flamethrower", adminName) } } else { target = cmd_target(id, Arg1, 0) if(!is_user_connected(target) || !is_user_alive(target)) return PLUGIN_HANDLED new targetName[32] get_user_name(target, targetName, 31) g_hasFlamethrower[target] = 1 g_FuelTank[target] = get_pcvar_num(cvar_fueltank) new temp[2], weaponID = get_user_weapon(target, temp[0], temp[1]) if(weaponID == CSW_KNIFE) { g_Activated[target] = true set_flamethrower_model(target) entity_set_int(id, EV_INT_weaponanim, 9) } client_cmd(target, "spk items/ammopickup2") client_print(target, print_chat, "You have been given a flamethrower (press 3 to use)") client_print(target, print_chat, "Admin: %s has given you a flamethrower", adminName) } return PLUGIN_HANDLED } public cmd_BuyFlamethrower(id) { if(!get_pcvar_num(cvar_client_buy)) return PLUGIN_CONTINUE if(get_pcvar_num(cvar_buyzone)) { if(!g_buyzone[id]) { client_print(id, print_center, "You need to be in the buyzone") return PLUGIN_HANDLED } } if(get_pcvar_num(cvar_buytime)) { new Float:fBuyTime = get_cvar_float("mp_buytime") * 60 if(!g_freezetime && (get_gametime() - g_starttime) > fBuyTime) { client_print(id, print_center, "%d seconds have passed.^nYou can't buy anything now!", floatround(fBuyTime)) return PLUGIN_HANDLED } } new iMoney = cs_get_user_money(id) new iCost = get_pcvar_num(cvar_cost) if(!is_user_alive(id)) client_print(id, print_center, "You cant buy when your dead!") else if(g_hasFlamethrower[id]) client_print(id, print_center, "You already own that weapon.") else if(iMoney < iCost) client_print(id, print_center, "Insufficient funds! ($%d)", iCost) else { g_hasFlamethrower[id] = 1 g_FuelTank[id] = get_pcvar_num(cvar_fueltank) new temp[2], weaponID = get_user_weapon(id, temp[0], temp[1]) if(weaponID == CSW_KNIFE) { g_Activated[id] = true set_flamethrower_model(id) } cs_set_user_money(id, iMoney - iCost) client_cmd(id, "spk items/ammopickup2") client_print(id, print_chat, "You bought a flamethrower (press 3 to use)") } return PLUGIN_HANDLED } public Event_BuyZone(id) { g_buyzone[id] = read_data(1) } public Event_GameRestart() { g_restarted = 1 } public Event_NewRound() { if(g_restarted) { new Players[32], iNum = 0 get_players(Players, iNum) for(new i = 0; i < iNum; i++) { new id = Players[i] g_FuelTank[id] = 0 g_Activated[id] = 0 g_hasFlamethrower[id] = 0 new temp[2], weaponID = get_user_weapon(id, temp[0], temp[1]) if(weaponID == CSW_KNIFE) set_knife_model(id) g_restarted = 0 } } new flamethrowers = -1 while((flamethrowers = find_ent_by_class(flamethrowers, "flamethrower"))) remove_entity(flamethrowers) g_freezetime = 1 } public LogEvent_RoundStart() { g_freezetime = 0 g_starttime = get_gametime() } public Event_CurWeapon(id) { if(!is_user_alive(id) || !g_hasFlamethrower[id]) return PLUGIN_CONTINUE new WeaponID = read_data(2) switch(WeaponID) { case CSW_KNIFE: { set_task(0.3, "task_ActivateFlamethrower", id) set_flamethrower_model(id) entity_set_int(id, EV_INT_weaponanim, 9) } default: g_Activated[id] = 0 } return PLUGIN_CONTINUE } public touch_Flamethrower(ent, id) { if(!is_valid_ent(ent) || !is_user_alive(id)) return PLUGIN_CONTINUE if(g_hasFlamethrower[id]) return PLUGIN_CONTINUE if(has_shield(id)) return PLUGIN_CONTINUE g_hasFlamethrower[id] = 1 client_cmd(id, "spk items/ammopickup2") g_FuelTank[id] = entity_get_int(ent, EV_INT_iuser4) show_fuel_percentage(id) new temp[2], weaponID = get_user_weapon(id, temp[0], temp[1]) if(weaponID == CSW_KNIFE) { g_Activated[id] = true set_flamethrower_model(id) entity_set_int(id, EV_INT_weaponanim, 9) } remove_entity(ent) return PLUGIN_CONTINUE } public fw_UpdateClientData_Post(id, sendweapons, cd_handle) { if(!g_hasFlamethrower[id] || !g_Activated[id]) return FMRES_IGNORED set_cd(cd_handle, CD_ID, 0) return FMRES_HANDLED } public fw_CmdStart(id, uc_handle, seed) { if(!g_hasFlamethrower[id] || !g_Activated[id]) return FMRES_IGNORED new buttons = get_uc(uc_handle, UC_Buttons) if(buttons & IN_ATTACK) { g_FireFlamethrower[id] = 1 buttons &= ~IN_ATTACK set_uc(uc_handle, UC_Buttons, buttons) } else g_FireFlamethrower[id] = 0 if(buttons & IN_ATTACK2) { g_BuyFuel[id] = 1 buttons &= ~IN_ATTACK2 set_uc(uc_handle, UC_Buttons, buttons) } else g_BuyFuel[id] = 0 return FMRES_HANDLED } public fw_PlayerPostThink(id) { if(!is_user_connected(id) || !is_user_alive(id)) return FMRES_IGNORED if(!g_hasFlamethrower[id] || !g_Activated[id]) return FMRES_IGNORED if(entity_get_int(id, EV_INT_waterlevel) > 1) return FMRES_IGNORED if(g_BuyFuel[id]) { if((g_Delay[id] + 0.2) < get_gametime()) { buy_fuel(id) g_Delay[id] = get_gametime() } } if(g_FireFlamethrower[id]) { if(g_FuelTank[id] > 0) { if((g_Delay[id] + 0.2) < get_gametime()) { g_FuelTank[id] -= 1 g_Delay[id] = get_gametime() } new Float:fOrigin[3], Float:fVelocity[3] entity_get_vector(id,EV_VEC_origin, fOrigin) VelocityByAim(id, 35, fVelocity) new Float:fTemp[3], iFireOrigin[3] xs_vec_add(fOrigin, fVelocity, fTemp) FVecIVec(fTemp, iFireOrigin) new Float:fFireVelocity[3], iFireVelocity[3] VelocityByAim(id, get_pcvar_num(cvar_damage_dis), fFireVelocity) FVecIVec(fFireVelocity, iFireVelocity) create_flames_n_sounds(id, iFireOrigin, iFireVelocity) new doDamage switch(get_cvar_num("mp_friendlyfire")) { case 0: doDamage = 0 case 1: doDamage = 1 } show_fuel_percentage(id) direct_damage(id, doDamage) indirect_damage(id, doDamage) custom_weapon_shot(wpn_ft, id) } else client_print(id, print_center, "Out of Fuel") } return FMRES_IGNORED } public think_Flamethrower(ent) { if(is_valid_ent(ent) && entity_get_float(ent, EV_FL_health) < 950.0) { new Float:fOrigin[3], iOrigin[3] entity_get_vector(ent, EV_VEC_origin, fOrigin) FVecIVec(fOrigin, iOrigin) message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(99) write_short(ent) message_end() message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(3) write_coord(iOrigin[0]) write_coord(iOrigin[1]) write_coord(iOrigin[2]) write_short(sprite_xplo) write_byte(50) write_byte(15) write_byte(0) message_end() RadiusDamage(fOrigin, get_pcvar_num(cvar_xplode_dmg), entity_get_int(ent, EV_INT_iuser4)) remove_entity(ent) } if(is_valid_ent(ent)) entity_set_float(ent, EV_FL_nextthink, halflife_time() + 0.01) } public create_flames_n_sounds(id, origin[3], velocity[3]) { message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(120) write_coord(origin[0]) write_coord(origin[1]) write_coord(origin[2]) write_coord(velocity[0]) write_coord(velocity[1]) write_coord(velocity[2] + 5) write_short(sprite_fire) write_byte(1) write_byte(10) write_byte(1) write_byte(5) message_end() emit_sound(id, CHAN_WEAPON, "flamethrower.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM) } public direct_damage(id, doDamage) { new ent, body get_user_aiming(id, ent, body, get_pcvar_num(cvar_damage_dis) + 500) if(ent > 0 && is_user_alive(ent)) { if(!doDamage) { if(get_user_team(id) != get_user_team(ent)) { damage_user(id, ent, get_pcvar_num(cvar_damage)) custom_weapon_dmg(wpn_ft, id, ent, get_pcvar_num(cvar_damage)) } } else { damage_user(id, ent, get_pcvar_num(cvar_damage)) custom_weapon_dmg(wpn_ft, id, ent, get_pcvar_num(cvar_damage)) } } } public indirect_damage(id, doDamage) { new Players[32], iNum get_players(Players, iNum, "a") for(new i = 0; i < iNum; ++i) if(id != Players[i]) { new target = Players[i] new Float:fOrigin[3], Float:fOrigin2[3] entity_get_vector(id,EV_VEC_origin, fOrigin) entity_get_vector(target, EV_VEC_origin, fOrigin2) new temp[3], Float:fAim[3] get_user_origin(id, temp, 3) IVecFVec(temp, fAim) new Float:fDistance = get_pcvar_num(cvar_damage_dis) + 500.0 if(get_distance_f(fOrigin, fOrigin2) > fDistance) continue new iDistance = get_distance_to_line(fOrigin, fOrigin2, fAim) if(iDistance > get_pcvar_num(cvar_splash_dis) || iDistance < 0 || !fm_is_ent_visible(id, target)) continue if(!doDamage) { if(get_user_team(id) != get_user_team(target)) { damage_user(id, target, get_pcvar_num(cvar_damage)) custom_weapon_dmg(wpn_ft, id, target, get_pcvar_num(cvar_damage)) } } else { damage_user(id, target, get_pcvar_num(cvar_damage) / 2) custom_weapon_dmg(wpn_ft, id, target, get_pcvar_num(cvar_damage) / 2) } } } public buy_fuel(id) { if(get_pcvar_num(cvar_buyzone) && !g_buyzone[id]) return PLUGIN_CONTINUE new Float:fBuyTime = get_cvar_float("mp_buytime") * 60 if(get_pcvar_num(cvar_buytime) && !g_freezetime && (get_gametime() - g_starttime) > fBuyTime) return PLUGIN_CONTINUE if(g_FuelTank[id] >= get_pcvar_num(cvar_fueltank)) return PLUGIN_CONTINUE new iMoney = cs_get_user_money(id) new iCost = get_pcvar_num(cvar_fuelcost) if(iMoney >= iCost) { g_FuelTank[id] += 1 show_fuel_percentage(id) cs_set_user_money(id, iMoney - iCost) return PLUGIN_CONTINUE } return PLUGIN_CONTINUE } public task_ActivateFlamethrower(id) { if(!is_user_connected(id) || !is_user_alive(id)) return PLUGIN_CONTINUE new temp[2], weaponID = get_user_weapon(id, temp[0], temp[1]) if(weaponID == CSW_KNIFE) g_Activated[id] = 1 return PLUGIN_CONTINUE } public show_fuel_percentage(id) { set_hudmessage(255, 170, 0, 0.91, 0.95, _, _, 1.0, _, _, 4) show_hudmessage(id, "Fuel Tank: %d%%", get_percent(g_FuelTank[id], get_pcvar_num(cvar_fueltank))) } public set_flamethrower_model(id) { entity_set_string(id, EV_SZ_viewmodel, "models/v_flamethrower.mdl") entity_set_string(id, EV_SZ_weaponmodel, "models/p_flamethrower.mdl") } public set_knife_model(id) { entity_set_string(id, EV_SZ_viewmodel, "models/v_knife.mdl") entity_set_string(id, EV_SZ_weaponmodel, "models/p_knife.mdl") } public set_shield_model(id) { entity_set_string(id, EV_SZ_viewmodel, "models/shield/v_shield_knife.mdl") entity_set_string(id, EV_SZ_weaponmodel, "models/shield/p_shield_knife.mdl") } stock damage_user(id, victim, damage) { new iHealth = get_user_health(victim) if(iHealth > damage) fakedamage(victim, "weapon_flamethrower", float(damage), DMG_BURN) else { user_silentkill(victim) make_deathmsg(id, victim, 0, "flamethrower") new iOrigin[3] get_user_origin(victim, iOrigin, 0) message_begin(MSG_BROADCAST,SVC_TEMPENTITY) write_byte(17) write_coord(iOrigin[0]) write_coord(iOrigin[1]) write_coord(iOrigin[2] + 10) write_short(sprite_burn) write_byte(30) write_byte(40) message_end() if(get_user_team(id) != get_user_team(victim)) { set_user_frags(id, get_user_frags(id) + 1) cs_set_user_money(id, cs_get_user_money(id) + 300) } else { set_user_frags(id, get_user_frags(id) - 1) cs_set_user_money(id, cs_get_user_money(id) - 300) } message_begin(MSG_ALL, get_user_msgid("ScoreInfo")) write_byte(id) write_short(get_user_frags(id)) write_short(get_user_deaths(id)) write_short(0) write_short(get_user_team(id)) message_end() message_begin(MSG_ALL, get_user_msgid("ScoreInfo")) write_byte(victim) write_short(get_user_frags(victim)) write_short(get_user_deaths(victim)) write_short(0) write_short(get_user_team(victim)) message_end() } } stock get_percent(value, tvalue) { return floatround(floatmul(float(value) / float(tvalue) , 100.0)) } stock get_distance_to_line(Float:pos_start[3], Float:pos_end[3], Float:pos_object[3]) { new Float:vec_start_end[3], Float:vec_start_object[3], Float:vec_end_object[3], Float:vec_end_start[3] xs_vec_sub(pos_end, pos_start, vec_start_end) // vector from start to end xs_vec_sub(pos_object, pos_start, vec_start_object) // vector from end to object xs_vec_sub(pos_start, pos_end, vec_end_start) // vector from end to start xs_vec_sub(pos_end, pos_object, vec_end_object) // vector object to end new Float:len_start_object = getVecLen(vec_start_object) new Float:angle_start = floatacos(xs_vec_dot(vec_start_end, vec_start_object) / (getVecLen(vec_start_end) * len_start_object), degrees) new Float:angle_end = floatacos(xs_vec_dot(vec_end_start, vec_end_object) / (getVecLen(vec_end_start) * getVecLen(vec_end_object)), degrees) if(angle_start <= 90.0 && angle_end <= 90.0) return floatround(len_start_object * floatsin(angle_start, degrees)) return -1 } stock Float:getVecLen(Float:Vec[3]) { new Float:VecNull[3] = {0.0, 0.0, 0.0} new Float:len = get_distance_f(Vec, VecNull) return len } stock bool:fm_is_ent_visible(index, entity) { new Float:origin[3], Float:view_ofs[3], Float:eyespos[3] pev(index, pev_origin, origin) pev(index, pev_view_ofs, view_ofs) xs_vec_add(origin, view_ofs, eyespos) new Float:entpos[3] pev(entity, pev_origin, entpos) engfunc(EngFunc_TraceLine, eyespos, entpos, 0, index) switch(pev(entity, pev_solid)) { case SOLID_BBOX..SOLID_BSP: return global_get(glb_trace_ent) == entity } new Float:fraction global_get(glb_trace_fraction, fraction) if(fraction == 1.0) return true return false } stock bool:has_shield(id) { new modelName[32] entity_get_string(id, EV_SZ_viewmodel, modelName, 31) if(containi(modelName, "v_shield_") != -1) return true return false } /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par } */ А вот на этом плагине: Пулемет Необходимо убрать возможность его скинуть, дроп при смерти, ну и сделать что бы так же, когда игрок воскрес, ему вновь пришлось данное оружие покупать. Код ниже: Код #include <amxmodx> #include <engine> #include <fakemeta_util> #include <cstrike> #include <hamsandwich> #include <amxmisc> #include <fun>
#define MAX_PLAYERS 32 #define MAX_BLOOD_DISTANCE 64 #define LOADUP_TIME 0.75 #define SHUTDOWN_TIME 1.7 #define SHAKE_FORCE -5.0 //(must be negative value) new const GUNSHOT_DECALS[] = {41, 42, 43, 44, 45} // Gunshot decal list // Plugin information new const PLUGIN[] = "WPN Minigun" new const VERSION[] = "1.65" new const AUTHOR[] = "CLLlAgOB" // other new bool:has_minigun[33], m249, bool:atk2[33], bool:atk1[33], bool:delay[33], clipp[33],clipstart,g_fwid,bool:delayhud[33],bool:beackup[33], mcost,msg[128],bool:frstCLIP[33],g_MaxPlayers,g_guns_eventids_bitsum,bool:haswhpnnmg[33], Float:g_lastShot[33], Float:g_nextSound[33], g_plAction[33],bool:g_fix_punchangle[33], bool:canfire[33],oneround,only_adminCB,MsgSayText,g_normal_trace[33],DMGMG,bool:user_bot[33], bool:is_alive[33],bool:is_connected[33] // Blood new g_blood new g_bloodspray // CS Player PData Offsets (win32) const OFFSET_CSTEAMS = 114 // Linux diff's const OFFSET_LINUX = 5 // offsets 5 higher in Linux builds // Models new P_MODEL[] = "models/wpnmod/m134/p_minigun.mdl" new V_MODEL[] = "models/wpnmod/m134/v_minigun.mdl" new W_MODEL[] = "models/wpnmod/m134/w_minigun.mdl" // Sounds new m_SOUND[][] = {"wpnmod/minigun/hw_shoot1.wav", "wpnmod/minigun/hw_spin.wav", "wpnmod/minigun/hw_spinup.wav", "wpnmod/minigun/hw_spindown.wav"} new g_noammo_sounds[][] = {"weapons/dryfire_rifle.wav"} //no recoil new const g_guns_events[][] = {"events/m249.sc"} //connect #define is_user_valid_connected(%1) (1 <= %1 <= g_MaxPlayers && is_connected[%1]) enum { anim_idle, anim_idle2, anim_gentleidle, anim_stillidle, anim_draw, anim_holster, anim_spinup, anim_spindown, anim_spinidle, anim_spinfire, anim_spinidledown }
// Types enum { act_none, act_load_up, act_run } public plugin_precache() { precache_model(P_MODEL) precache_model(V_MODEL) precache_model(W_MODEL) precache_sound(m_SOUND[0]) precache_sound(m_SOUND[1]) precache_sound(m_SOUND[2]) precache_sound(m_SOUND[3]) g_blood = precache_model("sprites/blood.spr") g_bloodspray = precache_model("sprites/bloodspray.spr") g_fwid = register_forward(FM_PrecacheEvent, "fwPrecacheEvent", 1) }
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_dictionary("minigun.txt") MsgSayText = get_user_msgid("SayText") clipstart = register_cvar("amx_ammo_mini","600") m249 = register_cvar("amx_speed_mini","0.9") DMGMG = register_cvar("amx_minigun_damage","1.2") oneround = register_cvar("amx_oneround","0") mcost = register_cvar("amx_cost_mini","10000") only_adminCB = register_cvar("amx_only_adm_buy","0") register_event("CurWeapon","event_curweapon","be", "1=1") register_event("DeathMsg","unminigun","a") register_forward(FM_ClientDisconnect, "fw_ClientDisconnect") register_forward(FM_CmdStart, "fwd_CmdStart") register_forward(FM_EmitSound,"fwd_emitsound") register_forward(FM_PlaybackEvent, "fwPlaybackEvent") register_forward(FM_PlayerPostThink, "fwPlayerPostThink", 1) register_forward(FM_StartFrame, "fwd_StartFrame") register_forward(FM_UpdateClientData, "UpdateClientData_Post", 1) RegisterHam(Ham_Killed, "player", "fw_PlayerKilled") RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1) RegisterHam(Ham_TakeDamage, "player", "player_TakeDamage") register_clcmd("say /minigun","buymini") register_concmd("amx_minigun_give", "cmdMinigun_give", ADMIN_LEVEL_A, "<@all or name/id> <ammo>") register_clcmd("drop","dropcmd") //events // Get Max Players g_MaxPlayers = global_get(glb_maxClients) register_logevent("event_start", 2, "1=Round_Start") register_event("TextMsg", "fwEvGameWillRestartIn", "a", "2=#Game_will_restart_in") register_event("HLTV", "event_start_freezetime", "a", "1=0", "2=0") unregister_forward(FM_PrecacheEvent, g_fwid, 1) }
// Client joins the game public client_putinserver(id) { // Player joined is_connected[id] = true } // Client leaving public fw_ClientDisconnect(id) { is_connected[id] = false is_alive[id] = false } public fw_PlayerSpawn_Post(id) { // Not alive or didn't join a team yet if (!is_user_alive(id) || !fm_cs_get_user_team(id)) return; // Player spawned is_alive[id] = true } public fw_PlayerKilled(victim, attacker, shouldgib) { //player die is_alive[victim] = false } public unminigun(){ new id = read_data(2) if(has_minigun[id] && !is_alive[id]) { new Float:Aim[3],Float:origin[3] VelocityByAim(id, 64, Aim) entity_get_vector(id,EV_VEC_origin,origin) origin[0] += Aim[0] origin[1] += Aim[1] new minigun = create_entity("info_target") entity_set_string(minigun,EV_SZ_classname,"minigun") entity_set_model(minigun,W_MODEL) entity_set_size(minigun,Float:{-2.0,-2.0,-2.0},Float:{5.0,5.0,5.0}) entity_set_int(minigun,EV_INT_solid,1) entity_set_int(minigun,EV_INT_movetype,6) entity_set_int(minigun, EV_INT_iuser1, clipp[id]) entity_set_vector(minigun,EV_VEC_origin,origin) has_minigun[id] = false remowegun(id) return PLUGIN_HANDLED } return PLUGIN_CONTINUE }
//damage lvl public player_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) { if(damagetype & DMG_BULLET && haswhpnnmg[attacker] && has_minigun[attacker] == true && attacker!=victim) { damage = damage*get_pcvar_float(DMGMG) SetHamParamFloat(4, damage) return HAM_IGNORED } return HAM_IGNORED }
public cmdMinigun_give(id, level, cid) { if (!cmd_access(id, level, cid, 3)) { return PLUGIN_HANDLED } new arg[32], arg2[8], name2[32], argument2 read_argv(1,arg,31) read_argv(2,arg2,7) argument2 = str_to_num(arg2) if ( equali(arg,"@all") ){ new plist[32],pnum get_players(plist,pnum,"a") if (pnum==0) { console_print(id,"[Minigun] This client is invalid") return PLUGIN_HANDLED } for (new i=0; i<pnum; i++) { give_weapon(plist[i], argument2, 1) client_print(plist[i], print_chat, "[Minigun] %L", LANG_PLAYER, "MINIGUN_ADMIN_GIVE_ALL",argument2) } } else { get_user_name(id,name2,31) new player = cmd_target(id,arg,7) if (!player) { console_print(id,"[Minigun] Give Minigun Failed") return PLUGIN_HANDLED } new name[32] get_user_name(player,name,31) give_weapon(player, argument2, 1) client_print(0, print_chat, "[Minigun] %L", LANG_PLAYER,"MINIGUN_ADMIN_GIVE",name,argument2) return PLUGIN_HANDLED } return PLUGIN_HANDLED }
public buymini(id) { if ((!(get_user_flags(id) & ADMIN_IMMUNITY) || !(get_user_flags(id) & ADMIN_RESERVATION)) && get_pcvar_num(only_adminCB)) { format(msg,256,"[Minigun] %L", LANG_PLAYER,"MINIGUN_ADMIN_BUY") message_begin(MSG_ONE,MsgSayText,{0,0,0},id) write_byte(id) write_string(msg) message_end() return PLUGIN_HANDLED } new money = cs_get_user_money(id) new price = get_pcvar_num(mcost) if(!is_alive[id]) client_print(id, print_chat, "[Minigun] %L", LANG_PLAYER,"MINIGUN_ALIVE") else if(has_minigun[id]) client_print(id, print_chat, "[Minigun] %L", LANG_PLAYER,"MINIGUN_ALREADY") else if(money < price) client_print(id, print_chat, "[Minigun] %L", LANG_PLAYER,"MINIGUN_NO_MONEY") else{ cs_set_user_money(id, money - price) give_weapon(id, 0, 1) client_print(id, print_chat, "[Minigun] %L", LANG_PLAYER,"MINIGUN_BUY",price) } return PLUGIN_HANDLED }
public dropcmd(id) { if(has_minigun[id] && haswhpnnmg[id] && is_alive[id]) { new Float:Aim[3],Float:origin[3] VelocityByAim(id, 64, Aim) entity_get_vector(id,EV_VEC_origin,origin) origin[0] += Aim[0] origin[1] += Aim[1] new minigun = create_entity("info_target") entity_set_string(minigun,EV_SZ_classname,"minigun") entity_set_model(minigun,W_MODEL) entity_set_size(minigun,Float:{-2.0,-2.0,-2.0},Float:{5.0,5.0,5.0}) entity_set_int(minigun,EV_INT_solid,1) entity_set_int(minigun,EV_INT_movetype,6) entity_set_int(minigun, EV_INT_iuser1, clipp[id]) entity_set_vector(minigun,EV_VEC_origin,origin) has_minigun[id] = false canfire[id] = false remowegun(id) g_plAction[id] = false return PLUGIN_HANDLED } return PLUGIN_CONTINUE }
public pfn_touch(ptr, ptd) { if(is_valid_ent(ptr)) { new classname[32] entity_get_string(ptr,EV_SZ_classname,classname,31) if(equal(classname, "minigun")) { if(is_valid_ent(ptd)) { new id = ptd if(id > 0 && id < 34) { if(!has_minigun[id] && is_alive[id]) { give_weapon(id,entity_get_int(ptr, EV_INT_iuser1), 0) canfire[id] = true remove_entity(ptr) } } } } } }
public remove_miniguns() { new nextitem = find_ent_by_class(-1,"minigun") while(nextitem) { remove_entity(nextitem) nextitem = find_ent_by_class(-1,"minigun") } return PLUGIN_CONTINUE } public event_start_freezetime(){ remove_miniguns() static iPlayers[32], iPlayersNum, i get_players(iPlayers, iPlayersNum, "a") if(!get_pcvar_num(only_adminCB)){ for (i = 0; i <= iPlayersNum; ++i){ if(!has_minigun[iPlayers[i]]){ set_task(random_float(0.1,1.0),"msghelp",iPlayers[i]) } } } if(get_pcvar_num(oneround)){ for (i = 0; i <= iPlayersNum; ++i){ if(has_minigun[iPlayers[i]]){ has_minigun[iPlayers[i]] = false remowegun(iPlayers[i]) } } } else { for (i = 0; i <= iPlayersNum; ++i){ g_plAction[iPlayers[i]] = false canfire[iPlayers[i]] = false frstCLIP[iPlayers[i]] = true } } } // remove gun and save all guns public remowegun(id) { new wpnList[32] new number get_user_weapons(id,wpnList,number) for (new i = 0;i < number;i++) { if (wpnList[i] == CSW_M249) { fm_strip_user_gun(id, wpnList[i]) } } }
public msghelp(id){ client_print(id, print_chat, "[Minigun] %L", LANG_PLAYER,"MINIGUN_FOR_BUY") client_print(id, print_chat, "[Minigun] %L", LANG_PLAYER,"MINIGUN_PRICE",get_pcvar_num(mcost)) }
public event_start(){ static iPlayers[32], iPlayersNum, i get_players(iPlayers, iPlayersNum, "a") for (i = 0; i <= iPlayersNum; ++i) canfire[iPlayers[i]] = true }
public fwEvGameWillRestartIn() { static iPlayers[32], iPlayersNum, i get_players(iPlayers, iPlayersNum, "a") for (i = 0; i <= iPlayersNum; ++i) has_minigun[iPlayers[i]] = false } public client_connect(id){ canfire[id]= false has_minigun[id] = false g_normal_trace[id] = 0 if(is_user_bot(id)) user_bot[id] = true else user_bot[id] = false }
//block sound no ammo in atack public fwd_emitsound(id, channel, sample[], Float:volume, Float:attn, flag, pitch) { if (!is_user_valid_connected(id) || !has_minigun[id]) return FMRES_IGNORED; else if((equal(sample, g_noammo_sounds[0])) && has_minigun[id] && haswhpnnmg[id]) { return FMRES_SUPERCEDE } return FMRES_IGNORED }
//give wpn public give_weapon(id, ammo, frst){ has_minigun[id] = true give_item(id,"weapon_m249") canfire[id] = true clipp[id] = ammo if(frst) frstCLIP[id] = true else beackup[id] = true }
//play anim public native_playanim(player,anim) { set_pev(player, pev_weaponanim, anim) message_begin(MSG_ONE, SVC_WEAPONANIM, {0, 0, 0}, player) write_byte(anim) write_byte(pev(player, pev_body)) message_end() }
public fwd_CmdStart(id, uc_handle, seed) {
if(!is_alive[id] || !canfire[id] || !has_minigun[id]) return FMRES_HANDLED if(haswhpnnmg[id]) { static buttons buttons = get_uc(uc_handle, UC_Buttons) if(buttons & IN_ATTACK) { atk1[id] = true atk2[id] = false } else if(buttons & IN_ATTACK2) { atk2[id] = true atk1[id] = false } if(atk1[id] && !atk2[id] && (g_plAction[id] == act_none || g_plAction[id] == act_load_up) && clipp[id]>0){ buttons &= ~IN_ATTACK buttons &= ~IN_ATTACK2 set_uc(uc_handle, UC_Buttons, buttons) fire_mode(id,0) } else if(atk2[id] || atk1[id] && clipp[id]==0){ fire_mode(id,1) } } return FMRES_IGNORED }
// in fire fire_mode(id, type) { static Float:gtime gtime = get_gametime() g_lastShot[id] = gtime if(g_nextSound[id] <= gtime && canfire[id]) { switch(g_plAction[id]) { case act_none: { native_playanim(id, anim_spinup) emit_sound(id, CHAN_WEAPON, m_SOUND[2], 1.0, ATTN_NORM, 0, PITCH_NORM) g_nextSound[id] = gtime + LOADUP_TIME g_plAction[id] = act_load_up } case act_load_up: { g_nextSound[id] = gtime g_plAction[id] = act_run } } } if(g_plAction[id] == act_run) { if(type == 0 && clipp[id]>0 && atk1[id]){ emit_sound(id, CHAN_WEAPON, m_SOUND[0], 1.0, ATTN_NORM, 0, PITCH_NORM) testbulet(id) if(!delay[id]) { native_playanim(id, anim_spinfire) ammo_hud(id) set_task(0.2,"delayanim",id) delay[id] = true } } else { if(!delay[id]) { ammo_hud(id) emit_sound(id, CHAN_WEAPON, m_SOUND[1], 1.0, ATTN_NORM, 0, PITCH_NORM) native_playanim(id, anim_spinidle) set_task(0.2,"delayanim",id) delay[id] = true } } } atk1[id] = false atk2[id] = false }
public delayanim(id){ delay[id] = false }
//set models public event_curweapon(id){ if(!is_alive[id] || !is_connected[id] || user_bot[id]) return; new clip, ammo, weapon = get_user_weapon(id, clip, ammo) if((has_minigun[id]) && (weapon == CSW_M249)){ if(g_plAction[id] != act_run && frstCLIP[id]){ new ent = get_weapon_ent(id,weapon) if(clipp[id] < get_pcvar_num(clipstart)) clipp[id] = get_pcvar_num(clipstart) cs_set_weapon_ammo(ent, clipp[id]) frstCLIP[id] = false } if(g_plAction[id] != act_run && beackup[id]){ new ent = get_weapon_ent(id,weapon) cs_set_weapon_ammo(ent, clipp[id]) beackup[id] = false } if(clipp[id] == 0){ new ent = get_weapon_ent(id,weapon) cs_set_weapon_ammo(ent, clipp[id]) } if(g_plAction[id] == act_run){ clipp[id] = clip } message_begin(MSG_ONE, get_user_msgid("CurWeapon"), {0,0,0}, id) write_byte(1) write_byte(CSW_KNIFE) write_byte(0) message_end() if(!haswhpnnmg[id]){ entity_set_string(id,EV_SZ_viewmodel,V_MODEL) entity_set_string(id,EV_SZ_weaponmodel,P_MODEL) haswhpnnmg[id] = true } new Ent = get_weapon_ent(id,weapon) new Float:N_Speed if(Ent) { N_Speed = get_pcvar_float(m249) new Float:Delay = get_pdata_float( Ent, 46, 4) * N_Speed if (Delay > 0.0){ set_pdata_float( Ent, 46, Delay, 4) } } ammo_hud(id) if(atk1[id]){ fire_mode(id, 0) } if(atk2[id]){ fire_mode(id, 1) } } if(weapon != CSW_M249) haswhpnnmg[id] = false if((has_minigun[id]) && (!haswhpnnmg[id])) g_plAction[id] = act_none return; } //sound and anim public fwd_StartFrame() { static Float:gtime, id gtime = get_gametime() for(id = 0; id <= g_MaxPlayers; id++) { if(g_plAction[id] != act_none) { if(!(pev(id, pev_button) & IN_ATTACK) && !(pev(id, pev_button) & IN_ATTACK2) && g_lastShot[id] + 0.2 < gtime) { native_playanim(id, anim_spinidledown) emit_sound(id, CHAN_WEAPON, m_SOUND[3], 1.0, ATTN_NORM, 0, PITCH_NORM) g_nextSound[id] = gtime + SHUTDOWN_TIME g_plAction[id] = act_none } } } } //marks on hit public native_gi_get_gunshot_decal() { return GUNSHOT_DECALS[random_num(0, sizeof(GUNSHOT_DECALS) - 1)] }
//hit bulet public testbulet(id){ // Find target new aimOrigin[3], target, body get_user_origin(id, aimOrigin, 3) get_user_aiming(id, target, body) if(target > 0 && target <= g_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, MAX_BLOOD_DISTANCE, fVel) // Calculate position where blood should be displayed fStart[0] = float(aimOrigin[0]) fStart[1] = float(aimOrigin[1]) fStart[2] = float(aimOrigin[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 = native_gi_get_gunshot_decal() // 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(aimOrigin[0]) write_coord(aimOrigin[1]) write_coord(aimOrigin[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(aimOrigin[0]) write_coord(aimOrigin[1]) write_coord(aimOrigin[2]) write_byte(decal) message_end() } // Show sparcles message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_GUNSHOTDECAL) write_coord(aimOrigin[0]) write_coord(aimOrigin[1]) write_coord(aimOrigin[2]) write_short(id) write_byte(decal) message_end() } }
//block anim standart wpn public UpdateClientData_Post( id, sendweapons, cd_handle ){ if ( !is_alive[id] ) return FMRES_IGNORED; if(haswhpnnmg[id] && has_minigun[id]) set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001 ); return FMRES_HANDLED; }
// No recoil stuff
public fwPrecacheEvent(type, const name[]) { for (new i = 0; i < sizeof g_guns_events; ++i) { if (equal(g_guns_events[i], name)) { g_guns_eventids_bitsum |= (1<<get_orig_retval()) return FMRES_HANDLED } }
return FMRES_IGNORED } public fwPlaybackEvent(flags, invoker, eventid) { if (!(g_guns_eventids_bitsum & (1<<eventid)) || !(1 <= invoker <= g_MaxPlayers)|| !haswhpnnmg[invoker] || !has_minigun[invoker]) return FMRES_IGNORED
g_fix_punchangle[invoker] = true
return FMRES_HANDLED }
public fwPlayerPostThink(id) { if (g_fix_punchangle[id]) { g_fix_punchangle[id] = false set_pev(id, pev_punchangle, Float:{0.0, 0.0, 0.0}) return FMRES_HANDLED }
return FMRES_IGNORED }
public fwTraceLine(const Float:start[3], const Float:dest[3], ignore_monsters, id, ptr) { if (!(1 <= id <= g_MaxPlayers)) return FMRES_IGNORED
if (!g_normal_trace[id]) { g_normal_trace[id] = ptr return FMRES_HANDLED } if (ptr == g_normal_trace[id] || ignore_monsters != DONT_IGNORE_MONSTERS || !haswhpnnmg[id] || !has_minigun[id] || !is_alive[id]) return FMRES_IGNORED
fix_recoil_trace(id, start, ptr)
return FMRES_SUPERCEDE } // show ammo clip public ammo_hud(id) { if(!delayhud[id]) { delayhud[id] = true new AmmoHud[65] new clip = clipp[id] format(AmmoHud, 64, "Ammo: %i", clip) set_hudmessage(200, 100, 0, 1.0 , 1.0, 0, 0.1, 0.1,0.1) show_hudmessage(id,"%s",AmmoHud) set_task(0.2,"delayhutmsg",id) } }
public delayhutmsg(id){ delayhud[id]= false }
//get weapon id stock get_weapon_ent(id,wpnid=0,wpnName[]="") { // who knows what wpnName will be static newName[24];
// need to find the name if(wpnid) get_weaponname(wpnid,newName,23);
// go with what we were told else formatex(newName,23,"%s",wpnName);
// prefix it if we need to if(!equal(newName,"weapon_",7)) format(newName,23,"weapon_%s",newName);
return fm_find_ent_by_owner(get_maxplayers(),newName,id); }
fix_recoil_trace(id, const Float:start[], ptr) { static Float:dest[3] pev(id, pev_v_angle, dest) engfunc(EngFunc_MakeVectors, dest) global_get(glb_v_forward, dest) xs_vec_mul_scalar(dest, 9999.0, dest) xs_vec_add(start, dest, dest) engfunc(EngFunc_TraceLine, start, dest, DONT_IGNORE_MONSTERS, id, ptr) } // Get User Team stock fm_cs_get_user_team(id) { return get_pdata_int(id, OFFSET_CSTEAMS, OFFSET_LINUX); } Заранее спасибо, что не остались равнодушными к данной теме.
Отредактировал: Steam, - 13.4.2014, 15:44
|