#include #include #include #include #include const knifespeed_ap_cost = 20 // Ap cast new Float:knifespeed_mins[3] = { -2.0, -2.0, -2.0 } new Float:knifespeed_maxs[3] = { 2.0, 2.0, 2.0 } new g_iItemID, g_msgCurWeapon, g_msgSayText // arrays new g_hasks[33], g_iCurrentWeapon[33] // cvars new cvar_enable, cvar_oneround, cvar_dropflags, cvar_pattack_rate, cvar_sattack_rate // drop flags const DROPFLAG_INDEATH = (1<<0) // a - death victim const DROPFLAG_INFECTED = (1<<1) // b - drop in infected const DROPFLAG_SURVHUMAN = (1<<2) // c - drop become survivor // offset const m_pPlayer = 41 const m_flNextPrimaryAttack = 46 const m_flNextSecondaryAttack = 47 const m_flTimeWeaponIdle = 48 // Plug info. #define PLUG_VERSION "1.0" #define PLUG_AUTH "Rhyme" public plugin_init() { // register plugin register_plugin("[ZP] Extra Item: Knife Speed", PLUG_VERSION, PLUG_AUTH) // events register_event("HLTV", "event_RoundStart", "a", "1=0", "2=0") register_event("CurWeapon", "event_CurWeapon", "b", "1=1") // cvars cvar_enable = register_cvar("zp_ks_enable", "1") cvar_oneround = register_cvar("zp_ks_oneround", "1") cvar_dropflags = register_cvar("zp_ks_dropflags", "bcd") cvar_pattack_rate = register_cvar("zp_ks_attack1_rate", "0.1") cvar_sattack_rate = register_cvar("zp_ks_attack2_rate", "0.7") new szCvar[30] formatex(szCvar, charsmax(szCvar), "v%s by %s", PLUG_VERSION, PLUG_AUTH) register_cvar("zp_extra_knifespeed", szCvar, FCVAR_SERVER|FCVAR_SPONLY) // engine forwards register_touch("cs_knifespeed", "player", "fw_Knifespeed_Touch") // Ham Forwards RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1) RegisterHam(Ham_Killed, "player", "fw_PlayerKilled") RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_knife", "fw_Knife_PrimaryAttack_Post", 1) RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_knife", "fw_Knife_SecondaryAttack_Post", 1) // Variables g_iItemID = zp_register_extra_item("Speed hammer \r[+500 armor]", knifespeed_ap_cost, ZP_TEAM_HUMAN) // Message ID's vars g_msgSayText = get_user_msgid("SayText") g_msgCurWeapon = get_user_msgid("CurWeapon") // Client Commands //register_clcmd("drop", "clcmd_drop") } public plugin_precache() { precache_sound("items/gunpickup2.wav") } public event_RoundStart() { // Remove knifespeeds (entities) remove_entity_name("cs_knifespeed") } public event_CurWeapon(id) { // Not alive... if(!is_user_alive(id)) return PLUGIN_CONTINUE // Updating weapon array g_iCurrentWeapon[id] = read_data(2) // Check if(zp_get_user_zombie(id) || zp_get_user_survivor(id)) return PLUGIN_CONTINUE // Has knifespeed and weapon is Knife if(!g_hasks[id] || g_iCurrentWeapon[id] != CSW_KNIFE) return PLUGIN_CONTINUE return PLUGIN_CONTINUE } /*================================================================================ [Main Functions] =================================================================================*/ public drop_knifespeed(id) { // Get Aim and Origin static Float:flAim[3], Float:flOrigin[3] VelocityByAim(id, 64, flAim) entity_get_vector(id, EV_VEC_origin, flOrigin) // Changing Origin coords flOrigin[0] += flAim[0] flOrigin[1] += flAim[1] // Creating the Entity new iEnt = create_entity("info_target") // Classname entity_set_string(iEnt, EV_SZ_classname, "cs_knifespeed") // Origin entity_set_origin(iEnt, flOrigin) // Size set_size(iEnt, knifespeed_mins, knifespeed_maxs) entity_set_vector(iEnt, EV_VEC_mins, knifespeed_mins) entity_set_vector(iEnt, EV_VEC_maxs, knifespeed_maxs) // Solid Type entity_set_int(iEnt, EV_INT_solid, SOLID_TRIGGER) // Movetype entity_set_int(iEnt, EV_INT_movetype, MOVETYPE_TOSS) // Var's g_hasks[id] = false // Model bugfix reset_user_knife(id) } public reset_user_knife(id) { // Execute weapon Deploy if(user_has_weapon(id, CSW_KNIFE)) ExecuteHamB(Ham_Item_Deploy, find_ent_by_owner(-1, "weapon_knife", id)) // Updating Model engclient_cmd(id, "weapon_knife") emessage_begin(MSG_ONE, g_msgCurWeapon, _, id) ewrite_byte(1) // active ewrite_byte(CSW_KNIFE) // weapon ewrite_byte(-1) // clip emessage_end() } /*================================================================================ [ZombiePlague Forwards] =================================================================================*/ public zp_extra_item_selected(id, itemid) { if (itemid == g_iItemID) { // Check cvar if(get_pcvar_num(cvar_enable)) { // Already has a KnifeSpeed if (g_hasks[id]) { zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + knifespeed_ap_cost) client_printcolor(id, "/g[ZP]/y You already have a /gKnife Speed") } else { // Boolean g_hasks[id] = true // Emiting Sound emit_sound(id, CHAN_WEAPON, "items/gunpickup2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM) set_pev(id, pev_armorvalue, float(min(pev(id, pev_armorvalue)+500, 500))) // Client Print client_printcolor(id, "/g[ZP]/y You now have a /gKnife Speed") // Change weapon to Knife reset_user_knife(id) } } // Isn't enabled... else { zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + knifespeed_ap_cost) client_printcolor(id, "/g[ZP]/y Knife Speed item has been disabled. /gContact Admin") } } } public zp_user_infected_pre(id, infector) { // Drop in infection if (g_hasks[id]) { if(check_drop_flag(DROPFLAG_INFECTED)) drop_knifespeed(id) else { g_hasks[id] = false reset_user_knife(id) } } } public zp_user_humanized_post(id) { // Is survivor if(zp_get_user_survivor(id) && g_hasks[id]) { if(check_drop_flag(DROPFLAG_SURVHUMAN)) drop_knifespeed(id) else { g_hasks[id] = false reset_user_knife(id) } } } /*================================================================================ [Main Forwards] =================================================================================*/ public client_putinserver(id) { g_hasks[id] = false } public client_disconnect(id) { g_hasks[id] = false } public fw_PlayerSpawn_Post(id) { // Check Oneround Cvar and Strip all the KnifeSpeeds if(get_pcvar_num(cvar_oneround) || !get_pcvar_num(cvar_enable)) { // Has KnifeSpeed if(g_hasks[id]) { // Var's g_hasks[id] = false // Update Knife reset_user_knife(id) } } } public fw_PlayerKilled(victim, attacker, shouldgib) { // Check if(victim == attacker || !attacker) return HAM_IGNORED // Attacker is not a Player if(!is_user_connected(attacker)) return HAM_IGNORED // Attacker Has a KnifeSpeed if(g_hasks[attacker] && g_iCurrentWeapon[attacker] == CSW_KNIFE && !zp_get_user_nemesis(victim)) // Victim Has a KnifeSpeed if(g_hasks[victim]) { if(check_drop_flag(DROPFLAG_INDEATH)) drop_knifespeed(victim) else { g_hasks[victim] = false reset_user_knife(victim) } } return HAM_IGNORED } public fw_Knifespeed_Touch(saw, player) { // Entities are not valid if(!is_valid_ent(saw) || !is_valid_ent(player)) return PLUGIN_CONTINUE // Is a valid player? if(!is_user_connected(player)) return PLUGIN_CONTINUE // Alive, Zombie or Survivor if(!is_user_alive(player) || zp_get_user_zombie(player) || zp_get_user_survivor(player) || g_hasks[player]) return PLUGIN_CONTINUE // Var's g_hasks[player] = true // Emiting Sound emit_sound(player, CHAN_WEAPON, "items/gunpickup2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM) // Knife Deploy reset_user_knife(player) // Remove dropped KnifeSpeed remove_entity(saw) return PLUGIN_CONTINUE } public fw_Knife_PrimaryAttack_Post(knife) { // Get knife owner static id id = get_pdata_cbase(knife, m_pPlayer, 4) // has a KnifeSpeed if(is_user_connected(id) && g_hasks[id]) { // Get new fire rate static Float:flRate flRate = get_pcvar_float(cvar_pattack_rate) // Set new rates set_pdata_float(knife, m_flNextPrimaryAttack, flRate, 4) set_pdata_float(knife, m_flNextSecondaryAttack, flRate, 4) set_pdata_float(knife, m_flTimeWeaponIdle, flRate, 4) } return HAM_IGNORED } public fw_Knife_SecondaryAttack_Post(knife) { // Get knife owner static id id = get_pdata_cbase(knife, m_pPlayer, 4) // has a KnifeSpeed if(is_user_connected(id) && g_hasks[id]) { // Get new fire rate static Float:flRate flRate = get_pcvar_float(cvar_sattack_rate) // Set new rates set_pdata_float(knife, m_flNextPrimaryAttack, flRate, 4) set_pdata_float(knife, m_flNextSecondaryAttack, flRate, 4) set_pdata_float(knife, m_flTimeWeaponIdle, flRate, 4) } return HAM_IGNORED } check_drop_flag(flag) { new szFlags[10] get_pcvar_string(cvar_dropflags, szFlags, charsmax(szFlags)) if(read_flags(szFlags) & flag) return true return false } 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") // green txt replace_all(szMsg, 190, "/y", "^1") // orange txt replace_all(szMsg, 190, "/ctr", "^3") // team txt replace_all(szMsg, 190, "/w", "^0") // team txt 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, g_msgSayText, _, iPlayers[i]) write_byte(iPlayers[i]) write_string(szMsg) message_end() } } } /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE *{\\ rtf1\\ ansi\\ ansicpg1251\\ deff0\\ deflang1049{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ f0\\ fs16 \n\\ par } */