Solved 2 guns

Unpaid Requests, Public Plugins
Post Reply
czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

2 guns

#1

Post by czirimbolo » 5 years ago

Can someone help me? I compiled first gun without errors, but after buying it in my menu, gun does not show. Can you fix this?

Code: Select all

#include <zombie_escape>
#include <engine>
#include <cstrike>
#include <fun>
#include <xs>

#define ENG_NULLENT		-1
#define EV_INT_WEAPONKEY	EV_INT_impulse
#define usas_WEAPONKEY 709
#define MAX_PLAYERS  			  32
#define IsValidUser(%1) (1 <= %1 <= g_MaxPlayers)

const USE_STOPPED = 0
const OFFSET_ACTIVE_ITEM = 373
const OFFSET_WEAPONOWNER = 41
const OFFSET_LINUX = 5
const OFFSET_LINUX_WEAPONS = 4

#define WEAP_LINUX_XTRA_OFF		4
#define m_fKnown					44
#define m_flNextPrimaryAttack 		46
#define m_flTimeWeaponIdle			48
#define m_iClip					51
#define m_fInReload				54
#define PLAYER_LINUX_XTRA_OFF	5
#define m_flNextAttack				83

#define usas_RELOAD_TIME 4.6
#define usas_IDLE 			0
#define usas_SHOOT1		1
#define usas_SHOOT2		2
#define usas_RELOAD		7
#define usas_DRAW		6

#define write_coord_f(%1)	engfunc(EngFunc_WriteCoord,%1)

new const Fire_Sounds[][] = { "YouTuber/thanatosgatling-1.wav" }

new usas_V_MODEL[64] = "models/YouTuber/v_thanatosgatling.mdl"
new usas_P_MODEL[64] = "models/YouTuber/p_thanatosgatling.mdl"
new usas_W_MODEL[64] = "models/YouTuber/w_thanatosgatling.mdl"

new const GUNSHOT_DECALS[] = { 41, 42, 43, 44, 45 }

new cvar_dmg_usas, cvar_recoil_usas, g_itemid_usas, cvar_clip_usas, cvar_spd_usas, cvar_usas_ammo
new g_MaxPlayers, g_orig_event_usas, g_IsInPrimaryAttack
new Float:cl_pushangle[MAX_PLAYERS + 1][3], m_iBlood[2]
new g_has_usas[33], g_clip_ammo[33], g_usas_TmpClip[33], oldweap[33]
new gmsgWeaponList

const PRIMARY_WEAPONS_BIT_SUM = 
(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 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("[ZP] Extra: USAS12", "1.0", "Crock / =) (Poprogun4ik) / LARS-DAY[BR]EAKER")
	register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
	register_event("CurWeapon","CurrentWeapon","be","1=1")
	RegisterHam(Ham_Item_AddToPlayer, "weapon_xm1014", "fw_usas_AddToPlayer")
	RegisterHam(Ham_Use, "func_tank", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tankmortar", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tankrocket", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tanklaser", "fw_UseStationary_Post", 1)
	for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
	if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)
	RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_xm1014", "fw_usas_PrimaryAttack")
	RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_xm1014", "fw_usas_PrimaryAttack_Post", 1)
	RegisterHam(Ham_Item_PostFrame, "weapon_xm1014", "usas_ItemPostFrame")
	RegisterHam(Ham_Weapon_Reload, "weapon_xm1014", "usas_Reload")
	RegisterHam(Ham_Weapon_Reload, "weapon_xm1014", "usas_Reload_Post", 1)
	RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
	register_forward(FM_SetModel, "fw_SetModel")
	register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
	register_forward(FM_PlaybackEvent, "fwPlaybackEvent")
	
	RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_wall", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_door", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_door_rotating", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_plat", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_rotating", "fw_TraceAttack", 1)

	cvar_dmg_usas = register_cvar("zp_usas_dmg", "1.0")
	cvar_recoil_usas = register_cvar("zp_usas_recoil", "1.0")
	cvar_clip_usas = register_cvar("zp_usas_clip", "20")
	cvar_spd_usas = register_cvar("zp_usas_spd", "1.2")
	cvar_usas_ammo = register_cvar("zp_usas_ammo", "80")
	
	g_itemid_usas = ze_register_item("\r[\wThanatosgatling\r]", 30, 0)
	g_MaxPlayers = get_maxplayers()
	gmsgWeaponList = get_user_msgid("WeaponList")
}

public plugin_precache()
{
	precache_model(usas_V_MODEL)
	precache_model(usas_P_MODEL)
	precache_model(usas_W_MODEL)
	for(new i = 0; i < sizeof Fire_Sounds; i++)
	precache_sound(Fire_Sounds[i])	
	precache_sound("YouTuber/thanatosgatling_boltpull.wav")
	precache_sound("YouTuber/thanatosgatling_clipin1.wav")
	precache_sound("YouTuber/thanatosgatling_clipin2.wav")
	precache_sound("YouTuber/thanatosgatling_clipout1.wav")
	m_iBlood[0] = precache_model("sprites/blood.spr")
	m_iBlood[1] = precache_model("sprites/bloodspray.spr")
	precache_generic("sprites/weapon_usas12.txt")
   	precache_generic("sprites/zm/640hud26.spr")
    	precache_generic("sprites/zm/640hud7.spr")
	
        register_clcmd("weapon_usas12", "weapon_hook")	

	register_forward(FM_PrecacheEvent, "fwPrecacheEvent_Post", 1)
}

public ze_select_item_pre(id, itemid)
{
    // Return Available and we will block it in Post, So it dosen't affect other plugins
    if (itemid != g_itemid_usas)
        return ZE_ITEM_AVAILABLE
   
    // Available for Humans only, So don't show it for zombies
    if (ze_is_user_zombie(id))
        return ZE_ITEM_DONT_SHOW
   
    return ZE_ITEM_AVAILABLE
}

public weapon_hook(id)
{
    	engclient_cmd(id, "weapon_xm1014")
    	return PLUGIN_HANDLED
}

public fw_TraceAttack(iEnt, iAttacker, Float:flDamage, Float:fDir[3], ptr, iDamageType)
{
	if(!is_user_alive(iAttacker))
		return

	new g_currentweapon = get_user_weapon(iAttacker)

	if(g_currentweapon != CSW_XM1014) return
	
	if(!g_has_usas[iAttacker]) return

	static Float:flEnd[3]
	get_tr2(ptr, TR_vecEndPos, flEnd)
	
	if(iEnt)
	{
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_DECAL)
		write_coord_f(flEnd[0])
		write_coord_f(flEnd[1])
		write_coord_f(flEnd[2])
		write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
		write_short(iEnt)
		message_end()
	}
	else
	{
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_WORLDDECAL)
		write_coord_f(flEnd[0])
		write_coord_f(flEnd[1])
		write_coord_f(flEnd[2])
		write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
		message_end()
	}
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_GUNSHOTDECAL)
	write_coord_f(flEnd[0])
	write_coord_f(flEnd[1])
	write_coord_f(flEnd[2])
	write_short(iAttacker)
	write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
	message_end()
}

public zp_user_humanized_post(id)
{
	g_has_usas[id] = false
}

public plugin_natives ()
{
	register_native("give_weapon_usas", "native_give_weapon_add", 1)
}
public native_give_weapon_add(id)
{
	give_usas(id)
}

public fwPrecacheEvent_Post(type, const name[])
{
	if (equal("events/xm1014.sc", name))
	{
		g_orig_event_usas = get_orig_retval()
		return FMRES_HANDLED
	}
	return FMRES_IGNORED
}

public client_connect(id)
{
	g_has_usas[id] = false
}

public client_disconnected(id)
{
	g_has_usas[id] = false
}

public ze_user_infected(id, iInfector)
{
	if (ze_is_user_zombie(id))
	{
		g_has_usas[id] = false
	}
}

public fw_SetModel(entity, model[])
{
	if(!is_valid_ent(entity))
		return FMRES_IGNORED
	
	static szClassName[33]
	entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName))
		
	if(!equal(szClassName, "weaponbox"))
		return FMRES_IGNORED
	
	static iOwner
	
	iOwner = entity_get_edict(entity, EV_ENT_owner)
	
	if(equal(model, "models/w_xm1014.mdl"))
	{
		static iStoredAugID
		
		iStoredAugID = find_ent_by_owner(ENG_NULLENT, "weapon_xm1014", entity)
	
		if(!is_valid_ent(iStoredAugID))
			return FMRES_IGNORED
	
		if(g_has_usas[iOwner])
		{
			entity_set_int(iStoredAugID, EV_INT_WEAPONKEY, usas_WEAPONKEY)
			
			g_has_usas[iOwner] = false
			
			entity_set_model(entity, usas_W_MODEL)
			
			return FMRES_SUPERCEDE
		}
	}
	return FMRES_IGNORED
}

public give_usas(id)
{
	drop_weapons(id, 1)
	new iWep2 = give_item(id,"weapon_xm1014")
	if( iWep2 > 0 )
	{
		cs_set_weapon_ammo(iWep2, get_pcvar_num(cvar_clip_usas))
		cs_set_user_bpammo (id, CSW_XM1014, get_pcvar_num(cvar_usas_ammo))	
		UTIL_PlayWeaponAnimation(id, usas_DRAW)
		set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF)

		message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
		write_string("weapon_usas12")
		write_byte(5)
		write_byte(32)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(12)
		write_byte(CSW_XM1014)
		message_end() 
	}
	g_has_usas[id] = true
}

public ze_select_item_post(player, itemid)
{
    if (itemid != g_itemid_usas)
        return
}

public fw_usas_AddToPlayer(usas, id)
{
	if(!is_valid_ent(usas) || !is_user_connected(id))
		return HAM_IGNORED
	
	if(entity_get_int(usas, EV_INT_WEAPONKEY) == usas_WEAPONKEY)
	{
		g_has_usas[id] = true
		
		entity_set_int(usas, EV_INT_WEAPONKEY, 0)

		message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
		write_string("weapon_usas12")
		write_byte(5)
		write_byte(32)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(12)
		write_byte(CSW_XM1014)
		message_end() 
		
		return HAM_HANDLED
	}
	else
	{
		message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
		write_string("weapon_xm1014")
		write_byte(5)
		write_byte(32)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(12)
		write_byte(CSW_XM1014)
		message_end() 
	}
	return HAM_IGNORED
}

public fw_UseStationary_Post(entity, caller, activator, use_type)
{
	if (use_type == USE_STOPPED && is_user_connected(caller))
		replace_weapon_models(caller, get_user_weapon(caller))
}

public fw_Item_Deploy_Post(weapon_ent)
{
	static owner
	owner = fm_cs_get_weapon_ent_owner(weapon_ent)
	
	static weaponid
	weaponid = cs_get_weapon_id(weapon_ent)
	
	replace_weapon_models(owner, weaponid)
}

public CurrentWeapon(id)
{
     replace_weapon_models(id, read_data(2))

     if(read_data(2) != CSW_XM1014 || !g_has_usas[id])
          return
     
     static Float:iSpeed
     if(g_has_usas[id])
          iSpeed = get_pcvar_float(cvar_spd_usas)
     
     static weapon[32],Ent
     get_weaponname(read_data(2),weapon,31)
     Ent = find_ent_by_owner(-1,weapon,id)
     if(Ent)
     {
          static Float:Delay
          Delay = get_pdata_float( Ent, 46, 4) * iSpeed
          if (Delay > 0.0)
          {
               set_pdata_float(Ent, 46, Delay, 4)
          }
     }
}

replace_weapon_models(id, weaponid)
{
	switch (weaponid)
	{
		case CSW_XM1014:
		{
			if (ze_is_user_zombie(id))
				return
			
			if(g_has_usas[id])
			{
				set_pev(id, pev_viewmodel2, usas_V_MODEL)
				set_pev(id, pev_weaponmodel2, usas_P_MODEL)
				if(oldweap[id] != CSW_XM1014) 
				{
					UTIL_PlayWeaponAnimation(id, usas_DRAW)
					set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF)

					message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
					write_string("weapon_usas12")
					write_byte(5)
					write_byte(32)
					write_byte(-1)
					write_byte(-1)
					write_byte(0)
					write_byte(12)
					write_byte(CSW_XM1014)
					message_end() 
				}
			}
		}
	}
	oldweap[id] = weaponid
}

public fw_UpdateClientData_Post(Player, SendWeapons, CD_Handle)
{
	if(!is_user_alive(Player) || (get_user_weapon(Player) != CSW_XM1014 || !g_has_usas[Player]))
		return FMRES_IGNORED
	
	set_cd(CD_Handle, CD_flNextAttack, halflife_time () + 0.001)
	return FMRES_HANDLED
}

public fw_usas_PrimaryAttack(Weapon)
{
	new Player = get_pdata_cbase(Weapon, 41, 4)
	
	if (!g_has_usas[Player])
		return
	
	g_IsInPrimaryAttack = 1
	pev(Player,pev_punchangle,cl_pushangle[Player])
	
	g_clip_ammo[Player] = cs_get_weapon_ammo(Weapon)
}

public fwPlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
	if ((eventid != g_orig_event_usas) || !g_IsInPrimaryAttack)
		return FMRES_IGNORED
	if (!(1 <= invoker <= g_MaxPlayers))
    return FMRES_IGNORED

	playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
	return FMRES_SUPERCEDE
}

public fw_usas_PrimaryAttack_Post(Weapon)
{
	g_IsInPrimaryAttack = 0
	new Player = get_pdata_cbase(Weapon, 41, 4)
	
	new szClip, szAmmo
	get_user_weapon(Player, szClip, szAmmo)
	
	if(!is_user_alive(Player))
		return

	if(g_has_usas[Player])
	{
		if (!g_clip_ammo[Player])
			return

		new Float:push[3]
		pev(Player,pev_punchangle,push)
		xs_vec_sub(push,cl_pushangle[Player],push)
		
		xs_vec_mul_scalar(push,get_pcvar_float(cvar_recoil_usas),push)
		xs_vec_add(push,cl_pushangle[Player],push)
		set_pev(Player,pev_punchangle,push)
		
		emit_sound(Player, CHAN_WEAPON, Fire_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
		UTIL_PlayWeaponAnimation(Player, random_num(usas_SHOOT1, usas_SHOOT2))
	}
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
	if (victim != attacker && is_user_connected(attacker))
	{
		if(get_user_weapon(attacker) == CSW_XM1014)
		{
			if(g_has_usas[attacker])
				SetHamParamFloat(4, damage * get_pcvar_float(cvar_dmg_usas))
		}
	}
}

public message_DeathMsg(msg_id, msg_dest, id)
{
	static szTruncatedWeapon[33], iAttacker, iVictim
	
	get_msg_arg_string(4, szTruncatedWeapon, charsmax(szTruncatedWeapon))
	
	iAttacker = get_msg_arg_int(1)
	iVictim = get_msg_arg_int(2)
	
	if(!is_user_connected(iAttacker) || iAttacker == iVictim)
		return PLUGIN_CONTINUE
	
	if(equal(szTruncatedWeapon, "xm1014") && get_user_weapon(iAttacker) == CSW_XM1014)
	{
		if(g_has_usas[iAttacker])
			set_msg_arg_string(4, "xm1014")
	}
	return PLUGIN_CONTINUE
}

stock fm_cs_get_current_weapon_ent(id)
{
	return get_pdata_cbase(id, OFFSET_ACTIVE_ITEM, OFFSET_LINUX)
}

stock fm_cs_get_weapon_ent_owner(ent)
{
	return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS)
}

stock UTIL_PlayWeaponAnimation(const Player, const Sequence)
{
	set_pev(Player, pev_weaponanim, Sequence)
	
	message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = Player)
	write_byte(Sequence)
	write_byte(pev(Player, pev_body))
	message_end()
}

public usas_ItemPostFrame(weapon_entity) 
{
     new id = pev(weapon_entity, pev_owner)
     if (!is_user_connected(id))
          return HAM_IGNORED

     if (!g_has_usas[id])
          return HAM_IGNORED

     static iAnim; iAnim = pev(id, pev_weaponanim)
     if(iAnim == usas_DRAW && g_has_usas[id])
     UTIL_PlayWeaponAnimation(id, usas_IDLE)

     static iClipExtra
     
     iClipExtra = get_pcvar_num(cvar_clip_usas)
     new Float:flNextAttack = get_pdata_float(id, m_flNextAttack, PLAYER_LINUX_XTRA_OFF)

     new iBpAmmo = cs_get_user_bpammo(id, CSW_XM1014)
     new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)

     new fInReload = get_pdata_int(weapon_entity, m_fInReload, WEAP_LINUX_XTRA_OFF) 

     if( fInReload && flNextAttack <= 0.0 )
     {
	     new j = min(iClipExtra - iClip, iBpAmmo)
	
	     set_pdata_int(weapon_entity, m_iClip, iClip + j, WEAP_LINUX_XTRA_OFF)
	     cs_set_user_bpammo(id, CSW_XM1014, iBpAmmo-j)
		
	     set_pdata_int(weapon_entity, m_fInReload, 0, WEAP_LINUX_XTRA_OFF)
	     fInReload = 0
     }
     return HAM_IGNORED
}

public usas_Reload(weapon_entity) 
{
     new id = pev(weapon_entity, pev_owner)
     if (!is_user_connected(id))
          return HAM_IGNORED

     if (!g_has_usas[id])
          return HAM_IGNORED

     static iClipExtra

     if(g_has_usas[id])
          iClipExtra = get_pcvar_num(cvar_clip_usas)

     g_usas_TmpClip[id] = -1

     new iBpAmmo = cs_get_user_bpammo(id, CSW_XM1014)
     new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)

     if (iBpAmmo <= 0)
          return HAM_SUPERCEDE

     if (iClip >= iClipExtra)
          return HAM_SUPERCEDE

     g_usas_TmpClip[id] = iClip

     return HAM_IGNORED
}

public usas_Reload_Post(weapon_entity) 
{
	new id = pev(weapon_entity, pev_owner)
	if (!is_user_connected(id))
		return HAM_IGNORED

	if (!g_has_usas[id])
		return HAM_IGNORED

	if (g_usas_TmpClip[id] == -1)
		return HAM_IGNORED

	set_pdata_int(weapon_entity, m_iClip, g_usas_TmpClip[id], WEAP_LINUX_XTRA_OFF)

	set_pdata_float(weapon_entity, m_flTimeWeaponIdle, usas_RELOAD_TIME, WEAP_LINUX_XTRA_OFF)

	set_pdata_float(id, m_flNextAttack, usas_RELOAD_TIME, PLAYER_LINUX_XTRA_OFF)

	set_pdata_int(weapon_entity, m_fInReload, 1, WEAP_LINUX_XTRA_OFF)

	UTIL_PlayWeaponAnimation(id, usas_RELOAD)

	return HAM_IGNORED
}

stock drop_weapons(id, dropwhat)
{
     static weapons[32], num, i, weaponid
     num = 0
     get_user_weapons(id, weapons, num)
     
     for (i = 0; i < num; i++)
     {
          weaponid = weapons[i]
          
          if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
          {
               static wname[32]
               get_weaponname(weaponid, wname, sizeof wname - 1)
               engclient_cmd(id, "drop", wname)
          }
     }
}
2. next gun:

Code: Select all

#pragma compress 1

#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <fun>
#include <hamsandwich>
#include <xs>
#include <cstrike>
#include <zombieplague>

#define TASK_FBURN				100
#define ID_FBURN                ( taskid - TASK_FBURN )
#define MAX_CLIENTS				32

new bool:g_fRoundEnd

#define FIRE_DURATION			4
#define FIRE_DAMAGE				36

#define ENG_NULLENT			-1
#define EV_INT_WEAPONKEY	EV_INT_impulse
#define shocker_WEAPONKEY 		08042018
#define MAX_PLAYERS  		32
#define IsValidUser(%1) (1 <= %1 <= g_MaxPlayers)

const USE_STOPPED = 0
const OFFSET_ACTIVE_ITEM = 373
const OFFSET_WEAPONOWNER = 41
const OFFSET_LINUX = 5
const OFFSET_LINUX_WEAPONS = 4

#define WEAP_LINUX_XTRA_OFF		4
#define m_fKnown					44
#define m_flNextPrimaryAttack 		46
#define m_flTimeWeaponIdle			48
#define m_iClip					51
#define m_fInReload				54
#define PLAYER_LINUX_XTRA_OFF	5
#define m_flNextAttack				83

#define shocker_RELOAD_TIME 0.7
#define shocker_RELOAD		3
#define shocker_DRAW		3
#define shocker_SHOOT1		1
#define shocker_SHOOTEND	2

#define write_coord_f(%1)	engfunc(EngFunc_WriteCoord,%1)

new const Fire_Sounds[][] = { "CF/shocker_gloves-1.wav" }
new const End_Sounds[][] = { "CF/shocker_gloves-end.wav" }

new shocker_V_MODEL[64] = "models/CF/v_shocker_gloves.mdl"
new shocker_P_MODEL[64] = "models/CF/q_shocker_gloves.mdl"
new shocker_W_MODEL[64] = "models/CF/q_shocker_gloves.mdl"

new const shocker_name[] = "CF/weapon_shocker_gloves"

new const shocker_spr[][] = 
{ 
	"sprites/CF/640hud25.spr", 
	"sprites/640hud7.spr"
} 

new cvar_dmg_shocker, cvar_recoil_shocker, g_itemid_shocker, cvar_clip_shocker, cvar_spd_shocker, cvar_shocker_ammo
new g_MaxPlayers, g_orig_event_shocker, g_IsInPrimaryAttack
new Float:cl_pushangle[MAX_PLAYERS + 1][3]
new g_has_shocker[33], g_clip_ammo[33], g_shocker_TmpClip[33], oldweap[33]
new sfsmg_sprite, 
	gmsgWeaponList,
	g_flameSpr, 
	g_smokeSpr,
	g_burning_duration[ MAX_CLIENTS + 1 ];

const PRIMARY_WEAPONS_BIT_SUM = 
(1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_TMP)|(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 const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
			"weapon_tmp", "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("[CrossFire] Shocker Gloves", "1.0", "zCoBa")
	register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
	register_event("CurWeapon","CurrentWeapon","be","1=1")
	RegisterHam(Ham_Item_AddToPlayer, "weapon_tmp", "fw_shocker_AddToPlayer")
	RegisterHam(Ham_Use, "func_tank", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tankmortar", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tankrocket", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tanklaser", "fw_UseStationary_Post", 1)
	for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
	if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)
	RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_tmp", "fw_shocker_PrimaryAttack")
	RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_tmp", "fw_shocker_PrimaryAttack_Post", 1)
	RegisterHam(Ham_Item_PostFrame, "weapon_tmp", "shocker_ItemPostFrame")
	RegisterHam(Ham_Weapon_Reload, "weapon_tmp", "shocker_Reload")
	RegisterHam(Ham_Weapon_Reload, "weapon_tmp", "shocker_Reload_Post", 1)
	RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
	register_forward(FM_SetModel, "fw_SetModel")
	register_forward(FM_CmdStart, "fm_cmdstart")
	register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
	register_forward(FM_PlaybackEvent, "fwPlaybackEvent")

	cvar_dmg_shocker = register_cvar("zp_shocker_dmg", "3.46")
	cvar_recoil_shocker = register_cvar("zp_shocker_recoil", "1.20")
	cvar_clip_shocker = register_cvar("zp_shocker_clip", "70")
	cvar_spd_shocker = register_cvar("zp_shocker_spd", "0.92")
	cvar_shocker_ammo = register_cvar("zp_shocker_ammo", "120")
	
	g_itemid_shocker = zp_register_extra_item("Shocker Gloves", 0, ZP_TEAM_HUMAN)
	g_MaxPlayers = get_maxplayers()
	gmsgWeaponList = get_user_msgid("WeaponList")
	register_clcmd(shocker_name, "command_shocker")
}

public plugin_precache()
{
	precache_model(shocker_V_MODEL)
	precache_model(shocker_P_MODEL)
	precache_model(shocker_W_MODEL)
	for(new i = 0; i < sizeof Fire_Sounds; i++)
	precache_sound(Fire_Sounds[i])	
	for(new i = 0; i < sizeof End_Sounds; i++)
	precache_sound(End_Sounds[i])

	sfsmg_sprite = precache_model("sprites/CF/shocker_gloves_laser.spr")
	g_flameSpr = precache_model("sprites/CF/shocker_gloves_ef.spr")
	g_smokeSpr = precache_model("sprites/black_smoke3.spr")

	new sFile[64]
	formatex(sFile, charsmax(sFile), "sprites/%s.txt", shocker_name)
	precache_generic(sFile)
	
	for(new i = 0; i < sizeof(shocker_spr); i++)
	{
		precache_generic(shocker_spr[i])
	}

	register_forward(FM_PrecacheEvent, "fwPrecacheEvent_Post", 1)
}

public command_shocker(Player)
{
	engclient_cmd(Player, "weapon_tmp")
	return PLUGIN_HANDLED
}

public zp_user_humanized_post(id)
{
	g_has_shocker[id] = false
}

public plugin_natives ()
{
	register_native("give_weapon_shocker", "native_give_weapon_add", 1)
}
public native_give_weapon_add(id)
{
	give_shocker(id)
}

public fwPrecacheEvent_Post(type, const name[])
{
	if (equal("events/tmp.sc", name))
	{
		g_orig_event_shocker = get_orig_retval()
		return FMRES_HANDLED
	}
	return FMRES_IGNORED
}

public client_connect(id)
{
	g_has_shocker[id] = false
}

public client_disconnect(id)
{
	g_has_shocker[id] = false
}

public zp_user_infected_post(id)
{
	if (zp_get_user_zombie(id))
	{
		g_has_shocker[id] = false
	}
}

public fw_SetModel(entity, model[])
{
	if(!is_valid_ent(entity))
		return FMRES_IGNORED
	
	static szClassName[33]
	entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName))
		
	if(!equal(szClassName, "weaponbox"))
		return FMRES_IGNORED
	
	static iOwner
	
	iOwner = entity_get_edict(entity, EV_ENT_owner)
	
	if(equal(model, "models/w_tmp.mdl"))
	{
		static iStoredAugID
		
		iStoredAugID = find_ent_by_owner(ENG_NULLENT, "weapon_tmp", entity)
	
		if(!is_valid_ent(iStoredAugID))
			return FMRES_IGNORED
	
		if(g_has_shocker[iOwner])
		{
			entity_set_int(iStoredAugID, EV_INT_WEAPONKEY, shocker_WEAPONKEY)
			
			g_has_shocker[iOwner] = false
			
			entity_set_model(entity, shocker_W_MODEL)
			
			return FMRES_SUPERCEDE
		}
	}
	return FMRES_IGNORED
}

public give_shocker(id)
{
	drop_weapons(id, 1)
	new iWep2 = give_item(id,"weapon_tmp")
	if( iWep2 > 0 )
	{
		cs_set_weapon_ammo(iWep2, get_pcvar_num(cvar_clip_shocker))
		cs_set_user_bpammo (id, CSW_TMP, get_pcvar_num(cvar_shocker_ammo))	
		UTIL_PlayWeaponAnimation(id, shocker_DRAW)
		set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF)

		message_begin(MSG_ONE, gmsgWeaponList, _, id)
		write_string(shocker_name)
		write_byte(10)
		write_byte(120)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(11)
		write_byte(CSW_TMP)
		message_end()
	}
	g_has_shocker[id] = true
}

public zp_extra_item_selected(id, itemid)
{
	if(itemid != g_itemid_shocker)
		return

	give_shocker(id)
}

public fw_shocker_AddToPlayer(shocker, id)
{
	if(!is_valid_ent(shocker) || !is_user_connected(id))
		return HAM_IGNORED
	
	if(entity_get_int(shocker, EV_INT_WEAPONKEY) == shocker_WEAPONKEY)
	{
		g_has_shocker[id] = true
		
		entity_set_int(shocker, EV_INT_WEAPONKEY, 0)

		message_begin(MSG_ONE, gmsgWeaponList, _, id)
		write_string(shocker_name)
		write_byte(10)
		write_byte(120)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(11)
		write_byte(CSW_TMP)
		message_end()

		return HAM_HANDLED
	}
	else
	{
		message_begin(MSG_ONE, gmsgWeaponList, _, id)
		write_string("weapon_tmp")
		write_byte(10)
		write_byte(120)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(11)
		write_byte(CSW_TMP)
		message_end()
	}
	return HAM_IGNORED
}

public fw_UseStationary_Post(entity, caller, activator, use_type)
{
	if (use_type == USE_STOPPED && is_user_connected(caller))
		replace_weapon_models(caller, get_user_weapon(caller))
}

public fw_Item_Deploy_Post(weapon_ent)
{
	static owner
	owner = fm_cs_get_weapon_ent_owner(weapon_ent)
	
	static weaponid
	weaponid = cs_get_weapon_id(weapon_ent)
	
	replace_weapon_models(owner, weaponid)
}

public CurrentWeapon(id)
{
     replace_weapon_models(id, read_data(2))

     if(read_data(2) != CSW_TMP || !g_has_shocker[id])
          return
     
     static Float:iSpeed
     if(g_has_shocker[id])
          iSpeed = get_pcvar_float(cvar_spd_shocker)
     
     static weapon[32],Ent
     get_weaponname(read_data(2),weapon,31)
     Ent = find_ent_by_owner(-1,weapon,id)
     if(Ent)
     {
          static Float:Delay
          Delay = get_pdata_float( Ent, 46, 4) * iSpeed
          if (Delay > 0.0)
          {
               set_pdata_float(Ent, 46, Delay, 4)
          }
     }
}

replace_weapon_models(id, weaponid)
{
	switch (weaponid)
	{
		case CSW_TMP:
		{
			if (zp_get_user_zombie(id) || zp_get_user_survivor(id))
				return
			
			if(g_has_shocker[id])
			{
				set_pev(id, pev_viewmodel2, shocker_V_MODEL)
				set_pev(id, pev_weaponmodel2, shocker_P_MODEL)
				if(oldweap[id] != CSW_TMP) 
				{
					UTIL_PlayWeaponAnimation(id, shocker_DRAW)
					set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF)

					message_begin(MSG_ONE, gmsgWeaponList, _, id)
					write_string(shocker_name)
					write_byte(10)
					write_byte(120)
					write_byte(-1)
					write_byte(-1)
					write_byte(0)
					write_byte(11)
					write_byte(CSW_TMP)
					message_end()
				}
			}
		}
	}
	oldweap[id] = weaponid
}

public fw_UpdateClientData_Post(Player, SendWeapons, CD_Handle)
{
	if(!is_user_alive(Player) || (get_user_weapon(Player) != CSW_TMP || !g_has_shocker[Player]))
		return FMRES_IGNORED
	
	set_cd(CD_Handle, CD_flNextAttack, halflife_time () + 0.001)
	return FMRES_HANDLED
}

public fw_shocker_PrimaryAttack(Weapon)
{
	new Player = get_pdata_cbase(Weapon, 41, 4)
	
	if (!g_has_shocker[Player])
		return
	
	g_IsInPrimaryAttack = 1
	pev(Player,pev_punchangle,cl_pushangle[Player])
	
	g_clip_ammo[Player] = cs_get_weapon_ammo(Weapon)
}

public fwPlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
	if ((eventid != g_orig_event_shocker) || !g_IsInPrimaryAttack)
		return FMRES_IGNORED
	if (!(1 <= invoker <= g_MaxPlayers))
    return FMRES_IGNORED

	playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
	return FMRES_SUPERCEDE
}

public fm_cmdstart(Player, uc_handle, seed)
{
	if(!is_user_alive(Player) || get_user_weapon(Player) != CSW_TMP || !g_has_shocker[Player])
		return FMRES_IGNORED

	if(get_pdata_float(Player, 83, 5) > 0.0) 
		return FMRES_IGNORED

	if((pev(Player, pev_oldbuttons) & IN_ATTACK) && !(get_uc(uc_handle, UC_Buttons) & IN_ATTACK))
	{
		UTIL_PlayWeaponAnimation(Player, shocker_SHOOTEND)
		
		emit_sound(Player, CHAN_WEAPON, End_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
		
		set_pdata_float(find_ent_by_owner(-1, "weapon_tmp", Player), 48, 3.0, 4)
	}

	return FMRES_IGNORED
}

public fw_shocker_PrimaryAttack_Post(Weapon)
{
	g_IsInPrimaryAttack = 0
	new Player = get_pdata_cbase(Weapon, 41, 4)
	
	new szClip, szAmmo
	get_user_weapon(Player, szClip, szAmmo)
	
	if(!is_user_alive(Player))
		return

	if(g_has_shocker[Player])
	{
		if (!g_clip_ammo[Player])
			return

		new Float:push[3], iPlayer
		pev(Player,pev_punchangle,push)
		xs_vec_sub(push,cl_pushangle[Player],push)
		
		xs_vec_mul_scalar(push,get_pcvar_float(cvar_recoil_shocker),push)
		xs_vec_add(push,cl_pushangle[Player],push)
		set_pev(Player,pev_punchangle,push)
		
		emit_sound(iPlayer, CHAN_WEAPON, Fire_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
		UTIL_PlayWeaponAnimation(Player, shocker_SHOOT1)
		create_tracer_sfsmg(Player)
	}
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
	if (victim != attacker && is_user_connected(attacker))
	{
		if(get_user_weapon(attacker) == CSW_TMP)
		{
			if(g_has_shocker[attacker])
			{
				SetHamParamFloat(4, damage * get_pcvar_float(cvar_dmg_shocker))
		
				if( !task_exists( victim + TASK_FBURN ))
				{
					g_burning_duration[ victim ] += FIRE_DURATION * 5
				
					set_task( 0.2, "CTask__BurningFlame", victim + TASK_FBURN, _, _, "b" )
				}
			}
		}
	}
}

public message_DeathMsg(msg_id, msg_dest, id)
{
	static szTruncatedWeapon[33], iAttacker, iVictim
	
	get_msg_arg_string(4, szTruncatedWeapon, charsmax(szTruncatedWeapon))
	
	iAttacker = get_msg_arg_int(1)
	iVictim = get_msg_arg_int(2)
	
	if(!is_user_connected(iAttacker) || iAttacker == iVictim)
		return PLUGIN_CONTINUE
	
	if(equal(szTruncatedWeapon, "tmp") && get_user_weapon(iAttacker) == CSW_TMP)
	{
		if(g_has_shocker[iAttacker])
			set_msg_arg_string(4, "tmp")
	}
	return PLUGIN_CONTINUE
}

stock fm_cs_get_current_weapon_ent(id)
{
	return get_pdata_cbase(id, OFFSET_ACTIVE_ITEM, OFFSET_LINUX)
}

stock fm_cs_get_weapon_ent_owner(ent)
{
	return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS)
}

stock UTIL_PlayWeaponAnimation(const Player, const Sequence)
{
	set_pev(Player, pev_weaponanim, Sequence)
	
	message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = Player)
	write_byte(Sequence)
	write_byte(pev(Player, pev_body))
	message_end()
}

public shocker_ItemPostFrame(weapon_entity) 
{
     new id = pev(weapon_entity, pev_owner)
     if (!is_user_connected(id))
          return HAM_IGNORED

     if (!g_has_shocker[id])
          return HAM_IGNORED

     static iClipExtra
     
     iClipExtra = get_pcvar_num(cvar_clip_shocker)
     new Float:flNextAttack = get_pdata_float(id, m_flNextAttack, PLAYER_LINUX_XTRA_OFF)

     new iBpAmmo = cs_get_user_bpammo(id, CSW_TMP)
     new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)

     new fInReload = get_pdata_int(weapon_entity, m_fInReload, WEAP_LINUX_XTRA_OFF) 

     if( fInReload && flNextAttack <= 0.0 )
     {
	     new j = min(iClipExtra - iClip, iBpAmmo)
	
	     set_pdata_int(weapon_entity, m_iClip, iClip + j, WEAP_LINUX_XTRA_OFF)
	     cs_set_user_bpammo(id, CSW_TMP, iBpAmmo-j)
		
	     set_pdata_int(weapon_entity, m_fInReload, 0, WEAP_LINUX_XTRA_OFF)
	     fInReload = 0
     }
     return HAM_IGNORED
}

public shocker_Reload(weapon_entity) 
{
     new id = pev(weapon_entity, pev_owner)
     if (!is_user_connected(id))
          return HAM_IGNORED

     if (!g_has_shocker[id])
          return HAM_IGNORED

     static iClipExtra

     if(g_has_shocker[id])
          iClipExtra = get_pcvar_num(cvar_clip_shocker)

     g_shocker_TmpClip[id] = -1

     new iBpAmmo = cs_get_user_bpammo(id, CSW_TMP)
     new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)

     if (iBpAmmo <= 0)
          return HAM_SUPERCEDE

     if (iClip >= iClipExtra)
          return HAM_SUPERCEDE

     g_shocker_TmpClip[id] = iClip

     return HAM_IGNORED
}

public shocker_Reload_Post(weapon_entity) 
{
	new id = pev(weapon_entity, pev_owner)
	if (!is_user_connected(id))
		return HAM_IGNORED

	if (!g_has_shocker[id])
		return HAM_IGNORED

	if (g_shocker_TmpClip[id] == -1)
		return HAM_IGNORED

	set_pdata_int(weapon_entity, m_iClip, g_shocker_TmpClip[id], WEAP_LINUX_XTRA_OFF)

	set_pdata_float(weapon_entity, m_flTimeWeaponIdle, shocker_RELOAD_TIME, WEAP_LINUX_XTRA_OFF)

	set_pdata_float(id, m_flNextAttack, shocker_RELOAD_TIME, PLAYER_LINUX_XTRA_OFF)

	set_pdata_int(weapon_entity, m_fInReload, 1, WEAP_LINUX_XTRA_OFF)

	UTIL_PlayWeaponAnimation(id, shocker_RELOAD)

	return HAM_IGNORED
}

stock create_tracer_sfsmg(id)
{
	static End[3]
	get_user_origin(id, End, 3)	

	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_BEAMENTPOINT)
	write_short(id | 0x1000)
	write_coord(End[0])
	write_coord(End[1])
	write_coord(End[2])
	write_short(sfsmg_sprite)
	write_byte(0); // framestart
	write_byte(1); // framerate
	write_byte(4); // life
	write_byte(30); // width
	write_byte(3); // noise
	write_byte(0); // red
	write_byte(128); // green
	write_byte(255); // blue
	write_byte(200); // brightness
	write_byte(10); // speed
	message_end()
}

stock drop_weapons(id, dropwhat)
{
     static weapons[32], num, i, weaponid
     num = 0
     get_user_weapons(id, weapons, num)
     
     for (i = 0; i < num; i++)
     {
          weaponid = weapons[i]
          
          if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
          {
               static wname[32]
               get_weaponname(weaponid, wname, sizeof wname - 1)
               engclient_cmd(id, "drop", wname)
          }
     }
}

public CTask__BurningFlame( taskid )
{
	// Get player origin and flags
	static origin[3], flags
	get_user_origin(ID_FBURN, origin)
	flags = pev(ID_FBURN, pev_flags)
	
	// Madness mode - in water - burning stopped
	if ((flags & FL_INWATER) || g_burning_duration[ID_FBURN] < 1 || g_fRoundEnd || !is_user_alive(ID_FBURN))
	{
		// Smoke sprite
		message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
		write_byte(TE_SMOKE) // TE id
		write_coord(origin[0]) // x
		write_coord(origin[1]) // y
		write_coord(origin[2]-50) // z
		write_short(g_smokeSpr) // sprite
		write_byte(random_num(2, 5)) // scale
		write_byte(random_num(2, 5)) // framerate
		message_end()
		
		// Task not needed anymore
		remove_task(taskid)
		return
	}
	
	// Get player's health
	static health
	health = pev(ID_FBURN, pev_health)
	
	// Take damage from the fire
	if (health - FIRE_DAMAGE > 0)
	fm_set_user_health(ID_FBURN, health - FIRE_DAMAGE)
	
	// Flame sprite
	message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
	write_byte(TE_SPRITE) // TE id
	write_coord(origin[0]+random_num(-5, 5)) // x
	write_coord(origin[1]+random_num(-5, 5)) // y
	write_coord(origin[2]+random_num(-10, 10)) // z
	write_short(g_flameSpr) // sprite
	write_byte(random_num(1, 4)) // scale
	write_byte(200) // brightness
	message_end()

	g_burning_duration[ID_FBURN]--
}
Image

User avatar
Mark
VIP
VIP
United States of America
Posts: 283
Joined: 5 years ago
Location: Des Moines/USA
Contact:

#2

Post by Mark » 5 years ago

czirimbolo wrote: 5 years ago Can someone help me? I compiled first gun without errors, but after buying it in my menu, gun does not show. Can you fix this?

Code: Select all

#include <zombie_escape>
#include <engine>
#include <cstrike>
#include <fun>
#include <xs>

#define ENG_NULLENT		-1
#define EV_INT_WEAPONKEY	EV_INT_impulse
#define usas_WEAPONKEY 709
#define MAX_PLAYERS  			  32
#define IsValidUser(%1) (1 <= %1 <= g_MaxPlayers)

const USE_STOPPED = 0
const OFFSET_ACTIVE_ITEM = 373
const OFFSET_WEAPONOWNER = 41
const OFFSET_LINUX = 5
const OFFSET_LINUX_WEAPONS = 4

#define WEAP_LINUX_XTRA_OFF		4
#define m_fKnown					44
#define m_flNextPrimaryAttack 		46
#define m_flTimeWeaponIdle			48
#define m_iClip					51
#define m_fInReload				54
#define PLAYER_LINUX_XTRA_OFF	5
#define m_flNextAttack				83

#define usas_RELOAD_TIME 4.6
#define usas_IDLE 			0
#define usas_SHOOT1		1
#define usas_SHOOT2		2
#define usas_RELOAD		7
#define usas_DRAW		6

#define write_coord_f(%1)	engfunc(EngFunc_WriteCoord,%1)

new const Fire_Sounds[][] = { "YouTuber/thanatosgatling-1.wav" }

new usas_V_MODEL[64] = "models/YouTuber/v_thanatosgatling.mdl"
new usas_P_MODEL[64] = "models/YouTuber/p_thanatosgatling.mdl"
new usas_W_MODEL[64] = "models/YouTuber/w_thanatosgatling.mdl"

new const GUNSHOT_DECALS[] = { 41, 42, 43, 44, 45 }

new cvar_dmg_usas, cvar_recoil_usas, g_itemid_usas, cvar_clip_usas, cvar_spd_usas, cvar_usas_ammo
new g_MaxPlayers, g_orig_event_usas, g_IsInPrimaryAttack
new Float:cl_pushangle[MAX_PLAYERS + 1][3], m_iBlood[2]
new g_has_usas[33], g_clip_ammo[33], g_usas_TmpClip[33], oldweap[33]
new gmsgWeaponList

const PRIMARY_WEAPONS_BIT_SUM = 
(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 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("[ZP] Extra: USAS12", "1.0", "Crock / =) (Poprogun4ik) / LARS-DAY[BR]EAKER")
	register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
	register_event("CurWeapon","CurrentWeapon","be","1=1")
	RegisterHam(Ham_Item_AddToPlayer, "weapon_xm1014", "fw_usas_AddToPlayer")
	RegisterHam(Ham_Use, "func_tank", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tankmortar", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tankrocket", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tanklaser", "fw_UseStationary_Post", 1)
	for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
	if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)
	RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_xm1014", "fw_usas_PrimaryAttack")
	RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_xm1014", "fw_usas_PrimaryAttack_Post", 1)
	RegisterHam(Ham_Item_PostFrame, "weapon_xm1014", "usas_ItemPostFrame")
	RegisterHam(Ham_Weapon_Reload, "weapon_xm1014", "usas_Reload")
	RegisterHam(Ham_Weapon_Reload, "weapon_xm1014", "usas_Reload_Post", 1)
	RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
	register_forward(FM_SetModel, "fw_SetModel")
	register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
	register_forward(FM_PlaybackEvent, "fwPlaybackEvent")
	
	RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_wall", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_door", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_door_rotating", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_plat", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_rotating", "fw_TraceAttack", 1)

	cvar_dmg_usas = register_cvar("zp_usas_dmg", "1.0")
	cvar_recoil_usas = register_cvar("zp_usas_recoil", "1.0")
	cvar_clip_usas = register_cvar("zp_usas_clip", "20")
	cvar_spd_usas = register_cvar("zp_usas_spd", "1.2")
	cvar_usas_ammo = register_cvar("zp_usas_ammo", "80")
	
	g_itemid_usas = ze_register_item("\r[\wThanatosgatling\r]", 30, 0)
	g_MaxPlayers = get_maxplayers()
	gmsgWeaponList = get_user_msgid("WeaponList")
}

public plugin_precache()
{
	precache_model(usas_V_MODEL)
	precache_model(usas_P_MODEL)
	precache_model(usas_W_MODEL)
	for(new i = 0; i < sizeof Fire_Sounds; i++)
	precache_sound(Fire_Sounds[i])	
	precache_sound("YouTuber/thanatosgatling_boltpull.wav")
	precache_sound("YouTuber/thanatosgatling_clipin1.wav")
	precache_sound("YouTuber/thanatosgatling_clipin2.wav")
	precache_sound("YouTuber/thanatosgatling_clipout1.wav")
	m_iBlood[0] = precache_model("sprites/blood.spr")
	m_iBlood[1] = precache_model("sprites/bloodspray.spr")
	precache_generic("sprites/weapon_usas12.txt")
   	precache_generic("sprites/zm/640hud26.spr")
    	precache_generic("sprites/zm/640hud7.spr")
	
        register_clcmd("weapon_usas12", "weapon_hook")	

	register_forward(FM_PrecacheEvent, "fwPrecacheEvent_Post", 1)
}

public ze_select_item_pre(id, itemid)
{
    // Return Available and we will block it in Post, So it dosen't affect other plugins
    if (itemid != g_itemid_usas)
        return ZE_ITEM_AVAILABLE
   
    // Available for Humans only, So don't show it for zombies
    if (ze_is_user_zombie(id))
        return ZE_ITEM_DONT_SHOW
   
    return ZE_ITEM_AVAILABLE
}

public weapon_hook(id)
{
    	engclient_cmd(id, "weapon_xm1014")
    	return PLUGIN_HANDLED
}

public fw_TraceAttack(iEnt, iAttacker, Float:flDamage, Float:fDir[3], ptr, iDamageType)
{
	if(!is_user_alive(iAttacker))
		return

	new g_currentweapon = get_user_weapon(iAttacker)

	if(g_currentweapon != CSW_XM1014) return
	
	if(!g_has_usas[iAttacker]) return

	static Float:flEnd[3]
	get_tr2(ptr, TR_vecEndPos, flEnd)
	
	if(iEnt)
	{
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_DECAL)
		write_coord_f(flEnd[0])
		write_coord_f(flEnd[1])
		write_coord_f(flEnd[2])
		write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
		write_short(iEnt)
		message_end()
	}
	else
	{
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_WORLDDECAL)
		write_coord_f(flEnd[0])
		write_coord_f(flEnd[1])
		write_coord_f(flEnd[2])
		write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
		message_end()
	}
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_GUNSHOTDECAL)
	write_coord_f(flEnd[0])
	write_coord_f(flEnd[1])
	write_coord_f(flEnd[2])
	write_short(iAttacker)
	write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
	message_end()
}

public zp_user_humanized_post(id)
{
	g_has_usas[id] = false
}

public plugin_natives ()
{
	register_native("give_weapon_usas", "native_give_weapon_add", 1)
}
public native_give_weapon_add(id)
{
	give_usas(id)
}

public fwPrecacheEvent_Post(type, const name[])
{
	if (equal("events/xm1014.sc", name))
	{
		g_orig_event_usas = get_orig_retval()
		return FMRES_HANDLED
	}
	return FMRES_IGNORED
}

public client_connect(id)
{
	g_has_usas[id] = false
}

public client_disconnected(id)
{
	g_has_usas[id] = false
}

public ze_user_infected(id, iInfector)
{
	if (ze_is_user_zombie(id))
	{
		g_has_usas[id] = false
	}
}

public fw_SetModel(entity, model[])
{
	if(!is_valid_ent(entity))
		return FMRES_IGNORED
	
	static szClassName[33]
	entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName))
		
	if(!equal(szClassName, "weaponbox"))
		return FMRES_IGNORED
	
	static iOwner
	
	iOwner = entity_get_edict(entity, EV_ENT_owner)
	
	if(equal(model, "models/w_xm1014.mdl"))
	{
		static iStoredAugID
		
		iStoredAugID = find_ent_by_owner(ENG_NULLENT, "weapon_xm1014", entity)
	
		if(!is_valid_ent(iStoredAugID))
			return FMRES_IGNORED
	
		if(g_has_usas[iOwner])
		{
			entity_set_int(iStoredAugID, EV_INT_WEAPONKEY, usas_WEAPONKEY)
			
			g_has_usas[iOwner] = false
			
			entity_set_model(entity, usas_W_MODEL)
			
			return FMRES_SUPERCEDE
		}
	}
	return FMRES_IGNORED
}

public give_usas(id)
{
	drop_weapons(id, 1)
	new iWep2 = give_item(id,"weapon_xm1014")
	if( iWep2 > 0 )
	{
		cs_set_weapon_ammo(iWep2, get_pcvar_num(cvar_clip_usas))
		cs_set_user_bpammo (id, CSW_XM1014, get_pcvar_num(cvar_usas_ammo))	
		UTIL_PlayWeaponAnimation(id, usas_DRAW)
		set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF)

		message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
		write_string("weapon_usas12")
		write_byte(5)
		write_byte(32)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(12)
		write_byte(CSW_XM1014)
		message_end() 
	}
	g_has_usas[id] = true
}

public ze_select_item_post(player, itemid)
{
    if (itemid != g_itemid_usas)
        return
}

public fw_usas_AddToPlayer(usas, id)
{
	if(!is_valid_ent(usas) || !is_user_connected(id))
		return HAM_IGNORED
	
	if(entity_get_int(usas, EV_INT_WEAPONKEY) == usas_WEAPONKEY)
	{
		g_has_usas[id] = true
		
		entity_set_int(usas, EV_INT_WEAPONKEY, 0)

		message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
		write_string("weapon_usas12")
		write_byte(5)
		write_byte(32)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(12)
		write_byte(CSW_XM1014)
		message_end() 
		
		return HAM_HANDLED
	}
	else
	{
		message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
		write_string("weapon_xm1014")
		write_byte(5)
		write_byte(32)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(12)
		write_byte(CSW_XM1014)
		message_end() 
	}
	return HAM_IGNORED
}

public fw_UseStationary_Post(entity, caller, activator, use_type)
{
	if (use_type == USE_STOPPED && is_user_connected(caller))
		replace_weapon_models(caller, get_user_weapon(caller))
}

public fw_Item_Deploy_Post(weapon_ent)
{
	static owner
	owner = fm_cs_get_weapon_ent_owner(weapon_ent)
	
	static weaponid
	weaponid = cs_get_weapon_id(weapon_ent)
	
	replace_weapon_models(owner, weaponid)
}

public CurrentWeapon(id)
{
     replace_weapon_models(id, read_data(2))

     if(read_data(2) != CSW_XM1014 || !g_has_usas[id])
          return
     
     static Float:iSpeed
     if(g_has_usas[id])
          iSpeed = get_pcvar_float(cvar_spd_usas)
     
     static weapon[32],Ent
     get_weaponname(read_data(2),weapon,31)
     Ent = find_ent_by_owner(-1,weapon,id)
     if(Ent)
     {
          static Float:Delay
          Delay = get_pdata_float( Ent, 46, 4) * iSpeed
          if (Delay > 0.0)
          {
               set_pdata_float(Ent, 46, Delay, 4)
          }
     }
}

replace_weapon_models(id, weaponid)
{
	switch (weaponid)
	{
		case CSW_XM1014:
		{
			if (ze_is_user_zombie(id))
				return
			
			if(g_has_usas[id])
			{
				set_pev(id, pev_viewmodel2, usas_V_MODEL)
				set_pev(id, pev_weaponmodel2, usas_P_MODEL)
				if(oldweap[id] != CSW_XM1014) 
				{
					UTIL_PlayWeaponAnimation(id, usas_DRAW)
					set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF)

					message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
					write_string("weapon_usas12")
					write_byte(5)
					write_byte(32)
					write_byte(-1)
					write_byte(-1)
					write_byte(0)
					write_byte(12)
					write_byte(CSW_XM1014)
					message_end() 
				}
			}
		}
	}
	oldweap[id] = weaponid
}

public fw_UpdateClientData_Post(Player, SendWeapons, CD_Handle)
{
	if(!is_user_alive(Player) || (get_user_weapon(Player) != CSW_XM1014 || !g_has_usas[Player]))
		return FMRES_IGNORED
	
	set_cd(CD_Handle, CD_flNextAttack, halflife_time () + 0.001)
	return FMRES_HANDLED
}

public fw_usas_PrimaryAttack(Weapon)
{
	new Player = get_pdata_cbase(Weapon, 41, 4)
	
	if (!g_has_usas[Player])
		return
	
	g_IsInPrimaryAttack = 1
	pev(Player,pev_punchangle,cl_pushangle[Player])
	
	g_clip_ammo[Player] = cs_get_weapon_ammo(Weapon)
}

public fwPlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
	if ((eventid != g_orig_event_usas) || !g_IsInPrimaryAttack)
		return FMRES_IGNORED
	if (!(1 <= invoker <= g_MaxPlayers))
    return FMRES_IGNORED

	playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
	return FMRES_SUPERCEDE
}

public fw_usas_PrimaryAttack_Post(Weapon)
{
	g_IsInPrimaryAttack = 0
	new Player = get_pdata_cbase(Weapon, 41, 4)
	
	new szClip, szAmmo
	get_user_weapon(Player, szClip, szAmmo)
	
	if(!is_user_alive(Player))
		return

	if(g_has_usas[Player])
	{
		if (!g_clip_ammo[Player])
			return

		new Float:push[3]
		pev(Player,pev_punchangle,push)
		xs_vec_sub(push,cl_pushangle[Player],push)
		
		xs_vec_mul_scalar(push,get_pcvar_float(cvar_recoil_usas),push)
		xs_vec_add(push,cl_pushangle[Player],push)
		set_pev(Player,pev_punchangle,push)
		
		emit_sound(Player, CHAN_WEAPON, Fire_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
		UTIL_PlayWeaponAnimation(Player, random_num(usas_SHOOT1, usas_SHOOT2))
	}
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
	if (victim != attacker && is_user_connected(attacker))
	{
		if(get_user_weapon(attacker) == CSW_XM1014)
		{
			if(g_has_usas[attacker])
				SetHamParamFloat(4, damage * get_pcvar_float(cvar_dmg_usas))
		}
	}
}

public message_DeathMsg(msg_id, msg_dest, id)
{
	static szTruncatedWeapon[33], iAttacker, iVictim
	
	get_msg_arg_string(4, szTruncatedWeapon, charsmax(szTruncatedWeapon))
	
	iAttacker = get_msg_arg_int(1)
	iVictim = get_msg_arg_int(2)
	
	if(!is_user_connected(iAttacker) || iAttacker == iVictim)
		return PLUGIN_CONTINUE
	
	if(equal(szTruncatedWeapon, "xm1014") && get_user_weapon(iAttacker) == CSW_XM1014)
	{
		if(g_has_usas[iAttacker])
			set_msg_arg_string(4, "xm1014")
	}
	return PLUGIN_CONTINUE
}

stock fm_cs_get_current_weapon_ent(id)
{
	return get_pdata_cbase(id, OFFSET_ACTIVE_ITEM, OFFSET_LINUX)
}

stock fm_cs_get_weapon_ent_owner(ent)
{
	return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS)
}

stock UTIL_PlayWeaponAnimation(const Player, const Sequence)
{
	set_pev(Player, pev_weaponanim, Sequence)
	
	message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = Player)
	write_byte(Sequence)
	write_byte(pev(Player, pev_body))
	message_end()
}

public usas_ItemPostFrame(weapon_entity) 
{
     new id = pev(weapon_entity, pev_owner)
     if (!is_user_connected(id))
          return HAM_IGNORED

     if (!g_has_usas[id])
          return HAM_IGNORED

     static iAnim; iAnim = pev(id, pev_weaponanim)
     if(iAnim == usas_DRAW && g_has_usas[id])
     UTIL_PlayWeaponAnimation(id, usas_IDLE)

     static iClipExtra
     
     iClipExtra = get_pcvar_num(cvar_clip_usas)
     new Float:flNextAttack = get_pdata_float(id, m_flNextAttack, PLAYER_LINUX_XTRA_OFF)

     new iBpAmmo = cs_get_user_bpammo(id, CSW_XM1014)
     new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)

     new fInReload = get_pdata_int(weapon_entity, m_fInReload, WEAP_LINUX_XTRA_OFF) 

     if( fInReload && flNextAttack <= 0.0 )
     {
	     new j = min(iClipExtra - iClip, iBpAmmo)
	
	     set_pdata_int(weapon_entity, m_iClip, iClip + j, WEAP_LINUX_XTRA_OFF)
	     cs_set_user_bpammo(id, CSW_XM1014, iBpAmmo-j)
		
	     set_pdata_int(weapon_entity, m_fInReload, 0, WEAP_LINUX_XTRA_OFF)
	     fInReload = 0
     }
     return HAM_IGNORED
}

public usas_Reload(weapon_entity) 
{
     new id = pev(weapon_entity, pev_owner)
     if (!is_user_connected(id))
          return HAM_IGNORED

     if (!g_has_usas[id])
          return HAM_IGNORED

     static iClipExtra

     if(g_has_usas[id])
          iClipExtra = get_pcvar_num(cvar_clip_usas)

     g_usas_TmpClip[id] = -1

     new iBpAmmo = cs_get_user_bpammo(id, CSW_XM1014)
     new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)

     if (iBpAmmo <= 0)
          return HAM_SUPERCEDE

     if (iClip >= iClipExtra)
          return HAM_SUPERCEDE

     g_usas_TmpClip[id] = iClip

     return HAM_IGNORED
}

public usas_Reload_Post(weapon_entity) 
{
	new id = pev(weapon_entity, pev_owner)
	if (!is_user_connected(id))
		return HAM_IGNORED

	if (!g_has_usas[id])
		return HAM_IGNORED

	if (g_usas_TmpClip[id] == -1)
		return HAM_IGNORED

	set_pdata_int(weapon_entity, m_iClip, g_usas_TmpClip[id], WEAP_LINUX_XTRA_OFF)

	set_pdata_float(weapon_entity, m_flTimeWeaponIdle, usas_RELOAD_TIME, WEAP_LINUX_XTRA_OFF)

	set_pdata_float(id, m_flNextAttack, usas_RELOAD_TIME, PLAYER_LINUX_XTRA_OFF)

	set_pdata_int(weapon_entity, m_fInReload, 1, WEAP_LINUX_XTRA_OFF)

	UTIL_PlayWeaponAnimation(id, usas_RELOAD)

	return HAM_IGNORED
}

stock drop_weapons(id, dropwhat)
{
     static weapons[32], num, i, weaponid
     num = 0
     get_user_weapons(id, weapons, num)
     
     for (i = 0; i < num; i++)
     {
          weaponid = weapons[i]
          
          if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
          {
               static wname[32]
               get_weaponname(weaponid, wname, sizeof wname - 1)
               engclient_cmd(id, "drop", wname)
          }
     }
}
2. next gun:

Code: Select all

#pragma compress 1

#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <fun>
#include <hamsandwich>
#include <xs>
#include <cstrike>
#include <zombieplague>

#define TASK_FBURN				100
#define ID_FBURN                ( taskid - TASK_FBURN )
#define MAX_CLIENTS				32

new bool:g_fRoundEnd

#define FIRE_DURATION			4
#define FIRE_DAMAGE				36

#define ENG_NULLENT			-1
#define EV_INT_WEAPONKEY	EV_INT_impulse
#define shocker_WEAPONKEY 		08042018
#define MAX_PLAYERS  		32
#define IsValidUser(%1) (1 <= %1 <= g_MaxPlayers)

const USE_STOPPED = 0
const OFFSET_ACTIVE_ITEM = 373
const OFFSET_WEAPONOWNER = 41
const OFFSET_LINUX = 5
const OFFSET_LINUX_WEAPONS = 4

#define WEAP_LINUX_XTRA_OFF		4
#define m_fKnown					44
#define m_flNextPrimaryAttack 		46
#define m_flTimeWeaponIdle			48
#define m_iClip					51
#define m_fInReload				54
#define PLAYER_LINUX_XTRA_OFF	5
#define m_flNextAttack				83

#define shocker_RELOAD_TIME 0.7
#define shocker_RELOAD		3
#define shocker_DRAW		3
#define shocker_SHOOT1		1
#define shocker_SHOOTEND	2

#define write_coord_f(%1)	engfunc(EngFunc_WriteCoord,%1)

new const Fire_Sounds[][] = { "CF/shocker_gloves-1.wav" }
new const End_Sounds[][] = { "CF/shocker_gloves-end.wav" }

new shocker_V_MODEL[64] = "models/CF/v_shocker_gloves.mdl"
new shocker_P_MODEL[64] = "models/CF/q_shocker_gloves.mdl"
new shocker_W_MODEL[64] = "models/CF/q_shocker_gloves.mdl"

new const shocker_name[] = "CF/weapon_shocker_gloves"

new const shocker_spr[][] = 
{ 
	"sprites/CF/640hud25.spr", 
	"sprites/640hud7.spr"
} 

new cvar_dmg_shocker, cvar_recoil_shocker, g_itemid_shocker, cvar_clip_shocker, cvar_spd_shocker, cvar_shocker_ammo
new g_MaxPlayers, g_orig_event_shocker, g_IsInPrimaryAttack
new Float:cl_pushangle[MAX_PLAYERS + 1][3]
new g_has_shocker[33], g_clip_ammo[33], g_shocker_TmpClip[33], oldweap[33]
new sfsmg_sprite, 
	gmsgWeaponList,
	g_flameSpr, 
	g_smokeSpr,
	g_burning_duration[ MAX_CLIENTS + 1 ];

const PRIMARY_WEAPONS_BIT_SUM = 
(1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_TMP)|(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 const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
			"weapon_tmp", "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("[CrossFire] Shocker Gloves", "1.0", "zCoBa")
	register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
	register_event("CurWeapon","CurrentWeapon","be","1=1")
	RegisterHam(Ham_Item_AddToPlayer, "weapon_tmp", "fw_shocker_AddToPlayer")
	RegisterHam(Ham_Use, "func_tank", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tankmortar", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tankrocket", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tanklaser", "fw_UseStationary_Post", 1)
	for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
	if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)
	RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_tmp", "fw_shocker_PrimaryAttack")
	RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_tmp", "fw_shocker_PrimaryAttack_Post", 1)
	RegisterHam(Ham_Item_PostFrame, "weapon_tmp", "shocker_ItemPostFrame")
	RegisterHam(Ham_Weapon_Reload, "weapon_tmp", "shocker_Reload")
	RegisterHam(Ham_Weapon_Reload, "weapon_tmp", "shocker_Reload_Post", 1)
	RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
	register_forward(FM_SetModel, "fw_SetModel")
	register_forward(FM_CmdStart, "fm_cmdstart")
	register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
	register_forward(FM_PlaybackEvent, "fwPlaybackEvent")

	cvar_dmg_shocker = register_cvar("zp_shocker_dmg", "3.46")
	cvar_recoil_shocker = register_cvar("zp_shocker_recoil", "1.20")
	cvar_clip_shocker = register_cvar("zp_shocker_clip", "70")
	cvar_spd_shocker = register_cvar("zp_shocker_spd", "0.92")
	cvar_shocker_ammo = register_cvar("zp_shocker_ammo", "120")
	
	g_itemid_shocker = zp_register_extra_item("Shocker Gloves", 0, ZP_TEAM_HUMAN)
	g_MaxPlayers = get_maxplayers()
	gmsgWeaponList = get_user_msgid("WeaponList")
	register_clcmd(shocker_name, "command_shocker")
}

public plugin_precache()
{
	precache_model(shocker_V_MODEL)
	precache_model(shocker_P_MODEL)
	precache_model(shocker_W_MODEL)
	for(new i = 0; i < sizeof Fire_Sounds; i++)
	precache_sound(Fire_Sounds[i])	
	for(new i = 0; i < sizeof End_Sounds; i++)
	precache_sound(End_Sounds[i])

	sfsmg_sprite = precache_model("sprites/CF/shocker_gloves_laser.spr")
	g_flameSpr = precache_model("sprites/CF/shocker_gloves_ef.spr")
	g_smokeSpr = precache_model("sprites/black_smoke3.spr")

	new sFile[64]
	formatex(sFile, charsmax(sFile), "sprites/%s.txt", shocker_name)
	precache_generic(sFile)
	
	for(new i = 0; i < sizeof(shocker_spr); i++)
	{
		precache_generic(shocker_spr[i])
	}

	register_forward(FM_PrecacheEvent, "fwPrecacheEvent_Post", 1)
}

public command_shocker(Player)
{
	engclient_cmd(Player, "weapon_tmp")
	return PLUGIN_HANDLED
}

public zp_user_humanized_post(id)
{
	g_has_shocker[id] = false
}

public plugin_natives ()
{
	register_native("give_weapon_shocker", "native_give_weapon_add", 1)
}
public native_give_weapon_add(id)
{
	give_shocker(id)
}

public fwPrecacheEvent_Post(type, const name[])
{
	if (equal("events/tmp.sc", name))
	{
		g_orig_event_shocker = get_orig_retval()
		return FMRES_HANDLED
	}
	return FMRES_IGNORED
}

public client_connect(id)
{
	g_has_shocker[id] = false
}

public client_disconnect(id)
{
	g_has_shocker[id] = false
}

public zp_user_infected_post(id)
{
	if (zp_get_user_zombie(id))
	{
		g_has_shocker[id] = false
	}
}

public fw_SetModel(entity, model[])
{
	if(!is_valid_ent(entity))
		return FMRES_IGNORED
	
	static szClassName[33]
	entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName))
		
	if(!equal(szClassName, "weaponbox"))
		return FMRES_IGNORED
	
	static iOwner
	
	iOwner = entity_get_edict(entity, EV_ENT_owner)
	
	if(equal(model, "models/w_tmp.mdl"))
	{
		static iStoredAugID
		
		iStoredAugID = find_ent_by_owner(ENG_NULLENT, "weapon_tmp", entity)
	
		if(!is_valid_ent(iStoredAugID))
			return FMRES_IGNORED
	
		if(g_has_shocker[iOwner])
		{
			entity_set_int(iStoredAugID, EV_INT_WEAPONKEY, shocker_WEAPONKEY)
			
			g_has_shocker[iOwner] = false
			
			entity_set_model(entity, shocker_W_MODEL)
			
			return FMRES_SUPERCEDE
		}
	}
	return FMRES_IGNORED
}

public give_shocker(id)
{
	drop_weapons(id, 1)
	new iWep2 = give_item(id,"weapon_tmp")
	if( iWep2 > 0 )
	{
		cs_set_weapon_ammo(iWep2, get_pcvar_num(cvar_clip_shocker))
		cs_set_user_bpammo (id, CSW_TMP, get_pcvar_num(cvar_shocker_ammo))	
		UTIL_PlayWeaponAnimation(id, shocker_DRAW)
		set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF)

		message_begin(MSG_ONE, gmsgWeaponList, _, id)
		write_string(shocker_name)
		write_byte(10)
		write_byte(120)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(11)
		write_byte(CSW_TMP)
		message_end()
	}
	g_has_shocker[id] = true
}

public zp_extra_item_selected(id, itemid)
{
	if(itemid != g_itemid_shocker)
		return

	give_shocker(id)
}

public fw_shocker_AddToPlayer(shocker, id)
{
	if(!is_valid_ent(shocker) || !is_user_connected(id))
		return HAM_IGNORED
	
	if(entity_get_int(shocker, EV_INT_WEAPONKEY) == shocker_WEAPONKEY)
	{
		g_has_shocker[id] = true
		
		entity_set_int(shocker, EV_INT_WEAPONKEY, 0)

		message_begin(MSG_ONE, gmsgWeaponList, _, id)
		write_string(shocker_name)
		write_byte(10)
		write_byte(120)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(11)
		write_byte(CSW_TMP)
		message_end()

		return HAM_HANDLED
	}
	else
	{
		message_begin(MSG_ONE, gmsgWeaponList, _, id)
		write_string("weapon_tmp")
		write_byte(10)
		write_byte(120)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(11)
		write_byte(CSW_TMP)
		message_end()
	}
	return HAM_IGNORED
}

public fw_UseStationary_Post(entity, caller, activator, use_type)
{
	if (use_type == USE_STOPPED && is_user_connected(caller))
		replace_weapon_models(caller, get_user_weapon(caller))
}

public fw_Item_Deploy_Post(weapon_ent)
{
	static owner
	owner = fm_cs_get_weapon_ent_owner(weapon_ent)
	
	static weaponid
	weaponid = cs_get_weapon_id(weapon_ent)
	
	replace_weapon_models(owner, weaponid)
}

public CurrentWeapon(id)
{
     replace_weapon_models(id, read_data(2))

     if(read_data(2) != CSW_TMP || !g_has_shocker[id])
          return
     
     static Float:iSpeed
     if(g_has_shocker[id])
          iSpeed = get_pcvar_float(cvar_spd_shocker)
     
     static weapon[32],Ent
     get_weaponname(read_data(2),weapon,31)
     Ent = find_ent_by_owner(-1,weapon,id)
     if(Ent)
     {
          static Float:Delay
          Delay = get_pdata_float( Ent, 46, 4) * iSpeed
          if (Delay > 0.0)
          {
               set_pdata_float(Ent, 46, Delay, 4)
          }
     }
}

replace_weapon_models(id, weaponid)
{
	switch (weaponid)
	{
		case CSW_TMP:
		{
			if (zp_get_user_zombie(id) || zp_get_user_survivor(id))
				return
			
			if(g_has_shocker[id])
			{
				set_pev(id, pev_viewmodel2, shocker_V_MODEL)
				set_pev(id, pev_weaponmodel2, shocker_P_MODEL)
				if(oldweap[id] != CSW_TMP) 
				{
					UTIL_PlayWeaponAnimation(id, shocker_DRAW)
					set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF)

					message_begin(MSG_ONE, gmsgWeaponList, _, id)
					write_string(shocker_name)
					write_byte(10)
					write_byte(120)
					write_byte(-1)
					write_byte(-1)
					write_byte(0)
					write_byte(11)
					write_byte(CSW_TMP)
					message_end()
				}
			}
		}
	}
	oldweap[id] = weaponid
}

public fw_UpdateClientData_Post(Player, SendWeapons, CD_Handle)
{
	if(!is_user_alive(Player) || (get_user_weapon(Player) != CSW_TMP || !g_has_shocker[Player]))
		return FMRES_IGNORED
	
	set_cd(CD_Handle, CD_flNextAttack, halflife_time () + 0.001)
	return FMRES_HANDLED
}

public fw_shocker_PrimaryAttack(Weapon)
{
	new Player = get_pdata_cbase(Weapon, 41, 4)
	
	if (!g_has_shocker[Player])
		return
	
	g_IsInPrimaryAttack = 1
	pev(Player,pev_punchangle,cl_pushangle[Player])
	
	g_clip_ammo[Player] = cs_get_weapon_ammo(Weapon)
}

public fwPlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
	if ((eventid != g_orig_event_shocker) || !g_IsInPrimaryAttack)
		return FMRES_IGNORED
	if (!(1 <= invoker <= g_MaxPlayers))
    return FMRES_IGNORED

	playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
	return FMRES_SUPERCEDE
}

public fm_cmdstart(Player, uc_handle, seed)
{
	if(!is_user_alive(Player) || get_user_weapon(Player) != CSW_TMP || !g_has_shocker[Player])
		return FMRES_IGNORED

	if(get_pdata_float(Player, 83, 5) > 0.0) 
		return FMRES_IGNORED

	if((pev(Player, pev_oldbuttons) & IN_ATTACK) && !(get_uc(uc_handle, UC_Buttons) & IN_ATTACK))
	{
		UTIL_PlayWeaponAnimation(Player, shocker_SHOOTEND)
		
		emit_sound(Player, CHAN_WEAPON, End_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
		
		set_pdata_float(find_ent_by_owner(-1, "weapon_tmp", Player), 48, 3.0, 4)
	}

	return FMRES_IGNORED
}

public fw_shocker_PrimaryAttack_Post(Weapon)
{
	g_IsInPrimaryAttack = 0
	new Player = get_pdata_cbase(Weapon, 41, 4)
	
	new szClip, szAmmo
	get_user_weapon(Player, szClip, szAmmo)
	
	if(!is_user_alive(Player))
		return

	if(g_has_shocker[Player])
	{
		if (!g_clip_ammo[Player])
			return

		new Float:push[3], iPlayer
		pev(Player,pev_punchangle,push)
		xs_vec_sub(push,cl_pushangle[Player],push)
		
		xs_vec_mul_scalar(push,get_pcvar_float(cvar_recoil_shocker),push)
		xs_vec_add(push,cl_pushangle[Player],push)
		set_pev(Player,pev_punchangle,push)
		
		emit_sound(iPlayer, CHAN_WEAPON, Fire_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
		UTIL_PlayWeaponAnimation(Player, shocker_SHOOT1)
		create_tracer_sfsmg(Player)
	}
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
	if (victim != attacker && is_user_connected(attacker))
	{
		if(get_user_weapon(attacker) == CSW_TMP)
		{
			if(g_has_shocker[attacker])
			{
				SetHamParamFloat(4, damage * get_pcvar_float(cvar_dmg_shocker))
		
				if( !task_exists( victim + TASK_FBURN ))
				{
					g_burning_duration[ victim ] += FIRE_DURATION * 5
				
					set_task( 0.2, "CTask__BurningFlame", victim + TASK_FBURN, _, _, "b" )
				}
			}
		}
	}
}

public message_DeathMsg(msg_id, msg_dest, id)
{
	static szTruncatedWeapon[33], iAttacker, iVictim
	
	get_msg_arg_string(4, szTruncatedWeapon, charsmax(szTruncatedWeapon))
	
	iAttacker = get_msg_arg_int(1)
	iVictim = get_msg_arg_int(2)
	
	if(!is_user_connected(iAttacker) || iAttacker == iVictim)
		return PLUGIN_CONTINUE
	
	if(equal(szTruncatedWeapon, "tmp") && get_user_weapon(iAttacker) == CSW_TMP)
	{
		if(g_has_shocker[iAttacker])
			set_msg_arg_string(4, "tmp")
	}
	return PLUGIN_CONTINUE
}

stock fm_cs_get_current_weapon_ent(id)
{
	return get_pdata_cbase(id, OFFSET_ACTIVE_ITEM, OFFSET_LINUX)
}

stock fm_cs_get_weapon_ent_owner(ent)
{
	return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS)
}

stock UTIL_PlayWeaponAnimation(const Player, const Sequence)
{
	set_pev(Player, pev_weaponanim, Sequence)
	
	message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = Player)
	write_byte(Sequence)
	write_byte(pev(Player, pev_body))
	message_end()
}

public shocker_ItemPostFrame(weapon_entity) 
{
     new id = pev(weapon_entity, pev_owner)
     if (!is_user_connected(id))
          return HAM_IGNORED

     if (!g_has_shocker[id])
          return HAM_IGNORED

     static iClipExtra
     
     iClipExtra = get_pcvar_num(cvar_clip_shocker)
     new Float:flNextAttack = get_pdata_float(id, m_flNextAttack, PLAYER_LINUX_XTRA_OFF)

     new iBpAmmo = cs_get_user_bpammo(id, CSW_TMP)
     new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)

     new fInReload = get_pdata_int(weapon_entity, m_fInReload, WEAP_LINUX_XTRA_OFF) 

     if( fInReload && flNextAttack <= 0.0 )
     {
	     new j = min(iClipExtra - iClip, iBpAmmo)
	
	     set_pdata_int(weapon_entity, m_iClip, iClip + j, WEAP_LINUX_XTRA_OFF)
	     cs_set_user_bpammo(id, CSW_TMP, iBpAmmo-j)
		
	     set_pdata_int(weapon_entity, m_fInReload, 0, WEAP_LINUX_XTRA_OFF)
	     fInReload = 0
     }
     return HAM_IGNORED
}

public shocker_Reload(weapon_entity) 
{
     new id = pev(weapon_entity, pev_owner)
     if (!is_user_connected(id))
          return HAM_IGNORED

     if (!g_has_shocker[id])
          return HAM_IGNORED

     static iClipExtra

     if(g_has_shocker[id])
          iClipExtra = get_pcvar_num(cvar_clip_shocker)

     g_shocker_TmpClip[id] = -1

     new iBpAmmo = cs_get_user_bpammo(id, CSW_TMP)
     new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)

     if (iBpAmmo <= 0)
          return HAM_SUPERCEDE

     if (iClip >= iClipExtra)
          return HAM_SUPERCEDE

     g_shocker_TmpClip[id] = iClip

     return HAM_IGNORED
}

public shocker_Reload_Post(weapon_entity) 
{
	new id = pev(weapon_entity, pev_owner)
	if (!is_user_connected(id))
		return HAM_IGNORED

	if (!g_has_shocker[id])
		return HAM_IGNORED

	if (g_shocker_TmpClip[id] == -1)
		return HAM_IGNORED

	set_pdata_int(weapon_entity, m_iClip, g_shocker_TmpClip[id], WEAP_LINUX_XTRA_OFF)

	set_pdata_float(weapon_entity, m_flTimeWeaponIdle, shocker_RELOAD_TIME, WEAP_LINUX_XTRA_OFF)

	set_pdata_float(id, m_flNextAttack, shocker_RELOAD_TIME, PLAYER_LINUX_XTRA_OFF)

	set_pdata_int(weapon_entity, m_fInReload, 1, WEAP_LINUX_XTRA_OFF)

	UTIL_PlayWeaponAnimation(id, shocker_RELOAD)

	return HAM_IGNORED
}

stock create_tracer_sfsmg(id)
{
	static End[3]
	get_user_origin(id, End, 3)	

	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_BEAMENTPOINT)
	write_short(id | 0x1000)
	write_coord(End[0])
	write_coord(End[1])
	write_coord(End[2])
	write_short(sfsmg_sprite)
	write_byte(0); // framestart
	write_byte(1); // framerate
	write_byte(4); // life
	write_byte(30); // width
	write_byte(3); // noise
	write_byte(0); // red
	write_byte(128); // green
	write_byte(255); // blue
	write_byte(200); // brightness
	write_byte(10); // speed
	message_end()
}

stock drop_weapons(id, dropwhat)
{
     static weapons[32], num, i, weaponid
     num = 0
     get_user_weapons(id, weapons, num)
     
     for (i = 0; i < num; i++)
     {
          weaponid = weapons[i]
          
          if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
          {
               static wname[32]
               get_weaponname(weaponid, wname, sizeof wname - 1)
               engclient_cmd(id, "drop", wname)
          }
     }
}

public CTask__BurningFlame( taskid )
{
	// Get player origin and flags
	static origin[3], flags
	get_user_origin(ID_FBURN, origin)
	flags = pev(ID_FBURN, pev_flags)
	
	// Madness mode - in water - burning stopped
	if ((flags & FL_INWATER) || g_burning_duration[ID_FBURN] < 1 || g_fRoundEnd || !is_user_alive(ID_FBURN))
	{
		// Smoke sprite
		message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
		write_byte(TE_SMOKE) // TE id
		write_coord(origin[0]) // x
		write_coord(origin[1]) // y
		write_coord(origin[2]-50) // z
		write_short(g_smokeSpr) // sprite
		write_byte(random_num(2, 5)) // scale
		write_byte(random_num(2, 5)) // framerate
		message_end()
		
		// Task not needed anymore
		remove_task(taskid)
		return
	}
	
	// Get player's health
	static health
	health = pev(ID_FBURN, pev_health)
	
	// Take damage from the fire
	if (health - FIRE_DAMAGE > 0)
	fm_set_user_health(ID_FBURN, health - FIRE_DAMAGE)
	
	// Flame sprite
	message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
	write_byte(TE_SPRITE) // TE id
	write_coord(origin[0]+random_num(-5, 5)) // x
	write_coord(origin[1]+random_num(-5, 5)) // y
	write_coord(origin[2]+random_num(-10, 10)) // z
	write_short(g_flameSpr) // sprite
	write_byte(random_num(1, 4)) // scale
	write_byte(200) // brightness
	message_end()

	g_burning_duration[ID_FBURN]--
}

First
  1. #include <zombie_escape>
  2. #include <engine>
  3. #include <cstrike>
  4. #include <fun>
  5. #include <xs>
  6.  
  7. #define ENG_NULLENT     -1
  8. #define EV_INT_WEAPONKEY    EV_INT_impulse
  9. #define usas_WEAPONKEY 709
  10. #define MAX_PLAYERS               32
  11. #define IsValidUser(%1) (1 <= %1 <= g_MaxPlayers)
  12.  
  13. const USE_STOPPED = 0
  14. const OFFSET_ACTIVE_ITEM = 373
  15. const OFFSET_WEAPONOWNER = 41
  16. const OFFSET_LINUX = 5
  17. const OFFSET_LINUX_WEAPONS = 4
  18.  
  19. #define WEAP_LINUX_XTRA_OFF     4
  20. #define m_fKnown                    44
  21. #define m_flNextPrimaryAttack       46
  22. #define m_flTimeWeaponIdle          48
  23. #define m_iClip                 51
  24. #define m_fInReload             54
  25. #define PLAYER_LINUX_XTRA_OFF   5
  26. #define m_flNextAttack              83
  27.  
  28. #define usas_RELOAD_TIME 4.6
  29. #define usas_IDLE           0
  30. #define usas_SHOOT1     1
  31. #define usas_SHOOT2     2
  32. #define usas_RELOAD     7
  33. #define usas_DRAW       6
  34.  
  35. #define write_coord_f(%1)   engfunc(EngFunc_WriteCoord,%1)
  36.  
  37. new const Fire_Sounds[][] = { "YouTuber/thanatosgatling-1.wav" }
  38.  
  39. new usas_V_MODEL[64] = "models/YouTuber/v_thanatosgatling.mdl"
  40. new usas_P_MODEL[64] = "models/YouTuber/p_thanatosgatling.mdl"
  41. new usas_W_MODEL[64] = "models/YouTuber/w_thanatosgatling.mdl"
  42.  
  43. new const GUNSHOT_DECALS[] = { 41, 42, 43, 44, 45 }
  44.  
  45. new cvar_dmg_usas, cvar_recoil_usas, g_itemid_usas, cvar_clip_usas, cvar_spd_usas, cvar_usas_ammo
  46. new g_MaxPlayers, g_orig_event_usas, g_IsInPrimaryAttack
  47. new Float:cl_pushangle[MAX_PLAYERS + 1][3], m_iBlood[2]
  48. new g_has_usas[33], g_clip_ammo[33], g_usas_TmpClip[33], oldweap[33]
  49. new gmsgWeaponList
  50.  
  51. const PRIMARY_WEAPONS_BIT_SUM =
  52. (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<<
  53. 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)
  54. new const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
  55.             "weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
  56.             "weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
  57.             "weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
  58.             "weapon_ak47", "weapon_knife", "weapon_p90" }
  59.  
  60. public plugin_init()
  61. {
  62.     register_plugin("[ZP] Extra: USAS12", "1.0", "Crock / =) (Poprogun4ik) / LARS-DAY[BR]EAKER")
  63.     register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
  64.     register_event("CurWeapon","CurrentWeapon","be","1=1")
  65.     RegisterHam(Ham_Item_AddToPlayer, "weapon_xm1014", "fw_usas_AddToPlayer")
  66.     RegisterHam(Ham_Use, "func_tank", "fw_UseStationary_Post", 1)
  67.     RegisterHam(Ham_Use, "func_tankmortar", "fw_UseStationary_Post", 1)
  68.     RegisterHam(Ham_Use, "func_tankrocket", "fw_UseStationary_Post", 1)
  69.     RegisterHam(Ham_Use, "func_tanklaser", "fw_UseStationary_Post", 1)
  70.     for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
  71.     if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)
  72.     RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_xm1014", "fw_usas_PrimaryAttack")
  73.     RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_xm1014", "fw_usas_PrimaryAttack_Post", 1)
  74.     RegisterHam(Ham_Item_PostFrame, "weapon_xm1014", "usas_ItemPostFrame")
  75.     RegisterHam(Ham_Weapon_Reload, "weapon_xm1014", "usas_Reload")
  76.     RegisterHam(Ham_Weapon_Reload, "weapon_xm1014", "usas_Reload_Post", 1)
  77.     RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
  78.     register_forward(FM_SetModel, "fw_SetModel")
  79.     register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
  80.     register_forward(FM_PlaybackEvent, "fwPlaybackEvent")
  81.    
  82.     RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack", 1)
  83.     RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack", 1)
  84.     RegisterHam(Ham_TraceAttack, "func_wall", "fw_TraceAttack", 1)
  85.     RegisterHam(Ham_TraceAttack, "func_door", "fw_TraceAttack", 1)
  86.     RegisterHam(Ham_TraceAttack, "func_door_rotating", "fw_TraceAttack", 1)
  87.     RegisterHam(Ham_TraceAttack, "func_plat", "fw_TraceAttack", 1)
  88.     RegisterHam(Ham_TraceAttack, "func_rotating", "fw_TraceAttack", 1)
  89.  
  90.     cvar_dmg_usas = register_cvar("zp_usas_dmg", "1.0")
  91.     cvar_recoil_usas = register_cvar("zp_usas_recoil", "1.0")
  92.     cvar_clip_usas = register_cvar("zp_usas_clip", "20")
  93.     cvar_spd_usas = register_cvar("zp_usas_spd", "1.2")
  94.     cvar_usas_ammo = register_cvar("zp_usas_ammo", "80")
  95.    
  96.     g_itemid_usas = ze_register_item("\r[\wThanatosgatling\r]", 30, 0)
  97.     g_MaxPlayers = get_maxplayers()
  98.     gmsgWeaponList = get_user_msgid("WeaponList")
  99. }
  100.  
  101. public plugin_precache()
  102. {
  103.     precache_model(usas_V_MODEL)
  104.     precache_model(usas_P_MODEL)
  105.     precache_model(usas_W_MODEL)
  106.     for(new i = 0; i < sizeof Fire_Sounds; i++)
  107.     precache_sound(Fire_Sounds[i]) 
  108.     precache_sound("YouTuber/thanatosgatling_boltpull.wav")
  109.     precache_sound("YouTuber/thanatosgatling_clipin1.wav")
  110.     precache_sound("YouTuber/thanatosgatling_clipin2.wav")
  111.     precache_sound("YouTuber/thanatosgatling_clipout1.wav")
  112.     m_iBlood[0] = precache_model("sprites/blood.spr")
  113.     m_iBlood[1] = precache_model("sprites/bloodspray.spr")
  114.     precache_generic("sprites/weapon_usas12.txt")
  115.     precache_generic("sprites/zm/640hud26.spr")
  116.         precache_generic("sprites/zm/640hud7.spr")
  117.    
  118.         register_clcmd("weapon_usas12", "weapon_hook") 
  119.  
  120.     register_forward(FM_PrecacheEvent, "fwPrecacheEvent_Post", 1)
  121. }
  122.  
  123. public ze_select_item_pre(id, itemid)
  124. {
  125.     // Return Available and we will block it in Post, So it dosen't affect other plugins
  126.     if (itemid != g_itemid_usas)
  127.         return ZE_ITEM_AVAILABLE
  128.    
  129.     // Available for Humans only, So don't show it for zombies
  130.     if (ze_is_user_zombie(id))
  131.         return ZE_ITEM_DONT_SHOW
  132.    
  133.     return ZE_ITEM_AVAILABLE
  134. }
  135.  
  136. public weapon_hook(id)
  137. {
  138.         engclient_cmd(id, "weapon_xm1014")
  139.         return PLUGIN_HANDLED
  140. }
  141.  
  142. public fw_TraceAttack(iEnt, iAttacker, Float:flDamage, Float:fDir[3], ptr, iDamageType)
  143. {
  144.     if(!is_user_alive(iAttacker))
  145.         return
  146.  
  147.     new g_currentweapon = get_user_weapon(iAttacker)
  148.  
  149.     if(g_currentweapon != CSW_XM1014) return
  150.    
  151.     if(!g_has_usas[iAttacker]) return
  152.  
  153.     static Float:flEnd[3]
  154.     get_tr2(ptr, TR_vecEndPos, flEnd)
  155.    
  156.     if(iEnt)
  157.     {
  158.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  159.         write_byte(TE_DECAL)
  160.         write_coord_f(flEnd[0])
  161.         write_coord_f(flEnd[1])
  162.         write_coord_f(flEnd[2])
  163.         write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
  164.         write_short(iEnt)
  165.         message_end()
  166.     }
  167.     else
  168.     {
  169.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  170.         write_byte(TE_WORLDDECAL)
  171.         write_coord_f(flEnd[0])
  172.         write_coord_f(flEnd[1])
  173.         write_coord_f(flEnd[2])
  174.         write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
  175.         message_end()
  176.     }
  177.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  178.     write_byte(TE_GUNSHOTDECAL)
  179.     write_coord_f(flEnd[0])
  180.     write_coord_f(flEnd[1])
  181.     write_coord_f(flEnd[2])
  182.     write_short(iAttacker)
  183.     write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
  184.     message_end()
  185. }
  186.  
  187. public zp_user_humanized_post(id)
  188. {
  189.     g_has_usas[id] = false
  190. }
  191.  
  192. public plugin_natives ()
  193. {
  194.     register_native("give_weapon_usas", "native_give_weapon_add", 1)
  195. }
  196. public native_give_weapon_add(id)
  197. {
  198.     give_usas(id)
  199. }
  200.  
  201. public fwPrecacheEvent_Post(type, const name[])
  202. {
  203.     if (equal("events/xm1014.sc", name))
  204.     {
  205.         g_orig_event_usas = get_orig_retval()
  206.         return FMRES_HANDLED
  207.     }
  208.     return FMRES_IGNORED
  209. }
  210.  
  211. public client_connect(id)
  212. {
  213.     g_has_usas[id] = false
  214. }
  215.  
  216. public client_disconnected(id)
  217. {
  218.     g_has_usas[id] = false
  219. }
  220.  
  221. public ze_user_infected(id, iInfector)
  222. {
  223.     if (ze_is_user_zombie(id))
  224.     {
  225.         g_has_usas[id] = false
  226.     }
  227. }
  228.  
  229. public fw_SetModel(entity, model[])
  230. {
  231.     if(!is_valid_ent(entity))
  232.         return FMRES_IGNORED
  233.    
  234.     static szClassName[33]
  235.     entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName))
  236.        
  237.     if(!equal(szClassName, "weaponbox"))
  238.         return FMRES_IGNORED
  239.    
  240.     static iOwner
  241.    
  242.     iOwner = entity_get_edict(entity, EV_ENT_owner)
  243.    
  244.     if(equal(model, "models/w_xm1014.mdl"))
  245.     {
  246.         static iStoredAugID
  247.        
  248.         iStoredAugID = find_ent_by_owner(ENG_NULLENT, "weapon_xm1014", entity)
  249.    
  250.         if(!is_valid_ent(iStoredAugID))
  251.             return FMRES_IGNORED
  252.    
  253.         if(g_has_usas[iOwner])
  254.         {
  255.             entity_set_int(iStoredAugID, EV_INT_WEAPONKEY, usas_WEAPONKEY)
  256.            
  257.             g_has_usas[iOwner] = false
  258.            
  259.             entity_set_model(entity, usas_W_MODEL)
  260.            
  261.             return FMRES_SUPERCEDE
  262.         }
  263.     }
  264.     return FMRES_IGNORED
  265. }
  266.  
  267. public give_usas(id)
  268. {
  269.     drop_weapons(id, 1)
  270.     new iWep2 = give_item(id,"weapon_xm1014")
  271.     if( iWep2 > 0 )
  272.     {
  273.         cs_set_weapon_ammo(iWep2, get_pcvar_num(cvar_clip_usas))
  274.         cs_set_user_bpammo (id, CSW_XM1014, get_pcvar_num(cvar_usas_ammo)) 
  275.         UTIL_PlayWeaponAnimation(id, usas_DRAW)
  276.         set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF)
  277.  
  278.         message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
  279.         write_string("weapon_usas12")
  280.         write_byte(5)
  281.         write_byte(32)
  282.         write_byte(-1)
  283.         write_byte(-1)
  284.         write_byte(0)
  285.         write_byte(12)
  286.         write_byte(CSW_XM1014)
  287.         message_end()
  288.     }
  289.     g_has_usas[id] = true
  290. }
  291.  
  292. public ze_select_item_post(id, itemid)
  293. {
  294.     // Here we just block buying the gun if it is not the gun the player is willing to buy so we just add return without values.
  295.     if (itemid != g_iItemId)
  296.         return
  297.        
  298.     // Here you can give the item & you can even add a message to notice the player what he bought for example like this:
  299.     ze_colored_print(id, "Congrats! You have bought USAS12! :D")
  300.    
  301.     // Do you remember in public plugin_init(), we found something like this in it:
  302.     // register_clcmd("say /get", "Get_MyWeapon")
  303.     // That line is to allow you to get the gun for free when you type that command.
  304.     // Well, we don't care about it, we care about:
  305.     // Get_MyWeapon
  306.     // This is the function we will use to give the weapon to the player
  307.     // It's like this:
  308.     give_usas(id)
  309. }
  310.  
  311. public fw_usas_AddToPlayer(usas, id)
  312. {
  313.     if(!is_valid_ent(usas) || !is_user_connected(id))
  314.         return HAM_IGNORED
  315.    
  316.     if(entity_get_int(usas, EV_INT_WEAPONKEY) == usas_WEAPONKEY)
  317.     {
  318.         g_has_usas[id] = true
  319.        
  320.         entity_set_int(usas, EV_INT_WEAPONKEY, 0)
  321.  
  322.         message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
  323.         write_string("weapon_usas12")
  324.         write_byte(5)
  325.         write_byte(32)
  326.         write_byte(-1)
  327.         write_byte(-1)
  328.         write_byte(0)
  329.         write_byte(12)
  330.         write_byte(CSW_XM1014)
  331.         message_end()
  332.        
  333.         return HAM_HANDLED
  334.     }
  335.     else
  336.     {
  337.         message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
  338.         write_string("weapon_xm1014")
  339.         write_byte(5)
  340.         write_byte(32)
  341.         write_byte(-1)
  342.         write_byte(-1)
  343.         write_byte(0)
  344.         write_byte(12)
  345.         write_byte(CSW_XM1014)
  346.         message_end()
  347.     }
  348.     return HAM_IGNORED
  349. }
  350.  
  351. public fw_UseStationary_Post(entity, caller, activator, use_type)
  352. {
  353.     if (use_type == USE_STOPPED && is_user_connected(caller))
  354.         replace_weapon_models(caller, get_user_weapon(caller))
  355. }
  356.  
  357. public fw_Item_Deploy_Post(weapon_ent)
  358. {
  359.     static owner
  360.     owner = fm_cs_get_weapon_ent_owner(weapon_ent)
  361.    
  362.     static weaponid
  363.     weaponid = cs_get_weapon_id(weapon_ent)
  364.    
  365.     replace_weapon_models(owner, weaponid)
  366. }
  367.  
  368. public CurrentWeapon(id)
  369. {
  370.      replace_weapon_models(id, read_data(2))
  371.  
  372.      if(read_data(2) != CSW_XM1014 || !g_has_usas[id])
  373.           return
  374.      
  375.      static Float:iSpeed
  376.      if(g_has_usas[id])
  377.           iSpeed = get_pcvar_float(cvar_spd_usas)
  378.      
  379.      static weapon[32],Ent
  380.      get_weaponname(read_data(2),weapon,31)
  381.      Ent = find_ent_by_owner(-1,weapon,id)
  382.      if(Ent)
  383.      {
  384.           static Float:Delay
  385.           Delay = get_pdata_float( Ent, 46, 4) * iSpeed
  386.           if (Delay > 0.0)
  387.           {
  388.                set_pdata_float(Ent, 46, Delay, 4)
  389.           }
  390.      }
  391. }
  392.  
  393. replace_weapon_models(id, weaponid)
  394. {
  395.     switch (weaponid)
  396.     {
  397.         case CSW_XM1014:
  398.         {
  399.             if (ze_is_user_zombie(id))
  400.                 return
  401.            
  402.             if(g_has_usas[id])
  403.             {
  404.                 set_pev(id, pev_viewmodel2, usas_V_MODEL)
  405.                 set_pev(id, pev_weaponmodel2, usas_P_MODEL)
  406.                 if(oldweap[id] != CSW_XM1014)
  407.                 {
  408.                     UTIL_PlayWeaponAnimation(id, usas_DRAW)
  409.                     set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF)
  410.  
  411.                     message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
  412.                     write_string("weapon_usas12")
  413.                     write_byte(5)
  414.                     write_byte(32)
  415.                     write_byte(-1)
  416.                     write_byte(-1)
  417.                     write_byte(0)
  418.                     write_byte(12)
  419.                     write_byte(CSW_XM1014)
  420.                     message_end()
  421.                 }
  422.             }
  423.         }
  424.     }
  425.     oldweap[id] = weaponid
  426. }
  427.  
  428. public fw_UpdateClientData_Post(Player, SendWeapons, CD_Handle)
  429. {
  430.     if(!is_user_alive(Player) || (get_user_weapon(Player) != CSW_XM1014 || !g_has_usas[Player]))
  431.         return FMRES_IGNORED
  432.    
  433.     set_cd(CD_Handle, CD_flNextAttack, halflife_time () + 0.001)
  434.     return FMRES_HANDLED
  435. }
  436.  
  437. public fw_usas_PrimaryAttack(Weapon)
  438. {
  439.     new Player = get_pdata_cbase(Weapon, 41, 4)
  440.    
  441.     if (!g_has_usas[Player])
  442.         return
  443.    
  444.     g_IsInPrimaryAttack = 1
  445.     pev(Player,pev_punchangle,cl_pushangle[Player])
  446.    
  447.     g_clip_ammo[Player] = cs_get_weapon_ammo(Weapon)
  448. }
  449.  
  450. public fwPlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
  451. {
  452.     if ((eventid != g_orig_event_usas) || !g_IsInPrimaryAttack)
  453.         return FMRES_IGNORED
  454.     if (!(1 <= invoker <= g_MaxPlayers))
  455.     return FMRES_IGNORED
  456.  
  457.     playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
  458.     return FMRES_SUPERCEDE
  459. }
  460.  
  461. public fw_usas_PrimaryAttack_Post(Weapon)
  462. {
  463.     g_IsInPrimaryAttack = 0
  464.     new Player = get_pdata_cbase(Weapon, 41, 4)
  465.    
  466.     new szClip, szAmmo
  467.     get_user_weapon(Player, szClip, szAmmo)
  468.    
  469.     if(!is_user_alive(Player))
  470.         return
  471.  
  472.     if(g_has_usas[Player])
  473.     {
  474.         if (!g_clip_ammo[Player])
  475.             return
  476.  
  477.         new Float:push[3]
  478.         pev(Player,pev_punchangle,push)
  479.         xs_vec_sub(push,cl_pushangle[Player],push)
  480.        
  481.         xs_vec_mul_scalar(push,get_pcvar_float(cvar_recoil_usas),push)
  482.         xs_vec_add(push,cl_pushangle[Player],push)
  483.         set_pev(Player,pev_punchangle,push)
  484.        
  485.         emit_sound(Player, CHAN_WEAPON, Fire_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  486.         UTIL_PlayWeaponAnimation(Player, random_num(usas_SHOOT1, usas_SHOOT2))
  487.     }
  488. }
  489.  
  490. public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
  491. {
  492.     if (victim != attacker && is_user_connected(attacker))
  493.     {
  494.         if(get_user_weapon(attacker) == CSW_XM1014)
  495.         {
  496.             if(g_has_usas[attacker])
  497.                 SetHamParamFloat(4, damage * get_pcvar_float(cvar_dmg_usas))
  498.         }
  499.     }
  500. }
  501.  
  502. public message_DeathMsg(msg_id, msg_dest, id)
  503. {
  504.     static szTruncatedWeapon[33], iAttacker, iVictim
  505.    
  506.     get_msg_arg_string(4, szTruncatedWeapon, charsmax(szTruncatedWeapon))
  507.    
  508.     iAttacker = get_msg_arg_int(1)
  509.     iVictim = get_msg_arg_int(2)
  510.    
  511.     if(!is_user_connected(iAttacker) || iAttacker == iVictim)
  512.         return PLUGIN_CONTINUE
  513.    
  514.     if(equal(szTruncatedWeapon, "xm1014") && get_user_weapon(iAttacker) == CSW_XM1014)
  515.     {
  516.         if(g_has_usas[iAttacker])
  517.             set_msg_arg_string(4, "xm1014")
  518.     }
  519.     return PLUGIN_CONTINUE
  520. }
  521.  
  522. stock fm_cs_get_current_weapon_ent(id)
  523. {
  524.     return get_pdata_cbase(id, OFFSET_ACTIVE_ITEM, OFFSET_LINUX)
  525. }
  526.  
  527. stock fm_cs_get_weapon_ent_owner(ent)
  528. {
  529.     return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS)
  530. }
  531.  
  532. stock UTIL_PlayWeaponAnimation(const Player, const Sequence)
  533. {
  534.     set_pev(Player, pev_weaponanim, Sequence)
  535.    
  536.     message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = Player)
  537.     write_byte(Sequence)
  538.     write_byte(pev(Player, pev_body))
  539.     message_end()
  540. }
  541.  
  542. public usas_ItemPostFrame(weapon_entity)
  543. {
  544.      new id = pev(weapon_entity, pev_owner)
  545.      if (!is_user_connected(id))
  546.           return HAM_IGNORED
  547.  
  548.      if (!g_has_usas[id])
  549.           return HAM_IGNORED
  550.  
  551.      static iAnim; iAnim = pev(id, pev_weaponanim)
  552.      if(iAnim == usas_DRAW && g_has_usas[id])
  553.      UTIL_PlayWeaponAnimation(id, usas_IDLE)
  554.  
  555.      static iClipExtra
  556.      
  557.      iClipExtra = get_pcvar_num(cvar_clip_usas)
  558.      new Float:flNextAttack = get_pdata_float(id, m_flNextAttack, PLAYER_LINUX_XTRA_OFF)
  559.  
  560.      new iBpAmmo = cs_get_user_bpammo(id, CSW_XM1014)
  561.      new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)
  562.  
  563.      new fInReload = get_pdata_int(weapon_entity, m_fInReload, WEAP_LINUX_XTRA_OFF)
  564.  
  565.      if( fInReload && flNextAttack <= 0.0 )
  566.      {
  567.          new j = min(iClipExtra - iClip, iBpAmmo)
  568.    
  569.          set_pdata_int(weapon_entity, m_iClip, iClip + j, WEAP_LINUX_XTRA_OFF)
  570.          cs_set_user_bpammo(id, CSW_XM1014, iBpAmmo-j)
  571.        
  572.          set_pdata_int(weapon_entity, m_fInReload, 0, WEAP_LINUX_XTRA_OFF)
  573.          fInReload = 0
  574.      }
  575.      return HAM_IGNORED
  576. }
  577.  
  578. public usas_Reload(weapon_entity)
  579. {
  580.      new id = pev(weapon_entity, pev_owner)
  581.      if (!is_user_connected(id))
  582.           return HAM_IGNORED
  583.  
  584.      if (!g_has_usas[id])
  585.           return HAM_IGNORED
  586.  
  587.      static iClipExtra
  588.  
  589.      if(g_has_usas[id])
  590.           iClipExtra = get_pcvar_num(cvar_clip_usas)
  591.  
  592.      g_usas_TmpClip[id] = -1
  593.  
  594.      new iBpAmmo = cs_get_user_bpammo(id, CSW_XM1014)
  595.      new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)
  596.  
  597.      if (iBpAmmo <= 0)
  598.           return HAM_SUPERCEDE
  599.  
  600.      if (iClip >= iClipExtra)
  601.           return HAM_SUPERCEDE
  602.  
  603.      g_usas_TmpClip[id] = iClip
  604.  
  605.      return HAM_IGNORED
  606. }
  607.  
  608. public usas_Reload_Post(weapon_entity)
  609. {
  610.     new id = pev(weapon_entity, pev_owner)
  611.     if (!is_user_connected(id))
  612.         return HAM_IGNORED
  613.  
  614.     if (!g_has_usas[id])
  615.         return HAM_IGNORED
  616.  
  617.     if (g_usas_TmpClip[id] == -1)
  618.         return HAM_IGNORED
  619.  
  620.     set_pdata_int(weapon_entity, m_iClip, g_usas_TmpClip[id], WEAP_LINUX_XTRA_OFF)
  621.  
  622.     set_pdata_float(weapon_entity, m_flTimeWeaponIdle, usas_RELOAD_TIME, WEAP_LINUX_XTRA_OFF)
  623.  
  624.     set_pdata_float(id, m_flNextAttack, usas_RELOAD_TIME, PLAYER_LINUX_XTRA_OFF)
  625.  
  626.     set_pdata_int(weapon_entity, m_fInReload, 1, WEAP_LINUX_XTRA_OFF)
  627.  
  628.     UTIL_PlayWeaponAnimation(id, usas_RELOAD)
  629.  
  630.     return HAM_IGNORED
  631. }
  632.  
  633. stock drop_weapons(id, dropwhat)
  634. {
  635.      static weapons[32], num, i, weaponid
  636.      num = 0
  637.      get_user_weapons(id, weapons, num)
  638.      
  639.      for (i = 0; i < num; i++)
  640.      {
  641.           weaponid = weapons[i]
  642.          
  643.           if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
  644.           {
  645.                static wname[32]
  646.                get_weaponname(weaponid, wname, sizeof wname - 1)
  647.                engclient_cmd(id, "drop", wname)
  648.           }
  649.      }
  650. }
Next

Follow this then if you have problems let us know.

viewtopic.php?f=7&t=3389

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

#3

Post by czirimbolo » 5 years ago

thanks, I converted 2 gun and got this error:

//// weapon_Shocker_Gloves.sma
//
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\weapon_Shocker_Gloves.sma(281) : error 017: undefined symbol "id"
//
// 1 Error.
// Could not locate output file compiled\weapon_Shocker_Gloves.amx (compile failed).
//

Code: Select all

#pragma compress 1

#include <zombie_escape>
#include <engine>
#include <fakemeta_util>
#include <fun>
#include <xs>
#include <cstrike>


#define TASK_FBURN				100
#define ID_FBURN                ( taskid - TASK_FBURN )
#define MAX_CLIENTS				32

new bool:g_fRoundEnd

#define FIRE_DURATION			4
#define FIRE_DAMAGE				36

#define ENG_NULLENT			-1
#define EV_INT_WEAPONKEY	EV_INT_impulse
#define shocker_WEAPONKEY 		08042018
#define MAX_PLAYERS  		32
#define IsValidUser(%1) (1 <= %1 <= g_MaxPlayers)

const USE_STOPPED = 0
const OFFSET_ACTIVE_ITEM = 373
const OFFSET_WEAPONOWNER = 41
const OFFSET_LINUX = 5
const OFFSET_LINUX_WEAPONS = 4

#define WEAP_LINUX_XTRA_OFF		4
#define m_fKnown					44
#define m_flNextPrimaryAttack 		46
#define m_flTimeWeaponIdle			48
#define m_iClip					51
#define m_fInReload				54
#define PLAYER_LINUX_XTRA_OFF	5
#define m_flNextAttack				83

#define shocker_RELOAD_TIME 0.7
#define shocker_RELOAD		3
#define shocker_DRAW		3
#define shocker_SHOOT1		1
#define shocker_SHOOTEND	2

#define write_coord_f(%1)	engfunc(EngFunc_WriteCoord,%1)

new const Fire_Sounds[][] = { "CF/shocker_gloves-1.wav" }
new const End_Sounds[][] = { "CF/shocker_gloves-end.wav" }

new shocker_V_MODEL[64] = "models/CF/v_shocker_gloves.mdl"
new shocker_P_MODEL[64] = "models/CF/q_shocker_gloves.mdl"
new shocker_W_MODEL[64] = "models/CF/q_shocker_gloves.mdl"

new const shocker_name[] = "CF/weapon_shocker_gloves"

new const shocker_spr[][] = 
{ 
	"sprites/CF/640hud25.spr", 
	"sprites/640hud7.spr"
} 

new cvar_dmg_shocker, cvar_recoil_shocker, g_itemid_shocker, cvar_clip_shocker, cvar_spd_shocker, cvar_shocker_ammo
new g_MaxPlayers, g_orig_event_shocker, g_IsInPrimaryAttack
new Float:cl_pushangle[MAX_PLAYERS + 1][3]
new g_has_shocker[33], g_clip_ammo[33], g_shocker_TmpClip[33], oldweap[33]
new sfsmg_sprite, 
	gmsgWeaponList,
	g_flameSpr, 
	g_smokeSpr,
	g_burning_duration[ MAX_CLIENTS + 1 ];

const PRIMARY_WEAPONS_BIT_SUM = 
(1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_TMP)|(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 const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
			"weapon_tmp", "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("[CrossFire] Shocker Gloves", "1.0", "zCoBa")
	register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
	register_event("CurWeapon","CurrentWeapon","be","1=1")
	RegisterHam(Ham_Item_AddToPlayer, "weapon_tmp", "fw_shocker_AddToPlayer")
	RegisterHam(Ham_Use, "func_tank", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tankmortar", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tankrocket", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tanklaser", "fw_UseStationary_Post", 1)
	for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
	if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)
	RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_tmp", "fw_shocker_PrimaryAttack")
	RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_tmp", "fw_shocker_PrimaryAttack_Post", 1)
	RegisterHam(Ham_Item_PostFrame, "weapon_tmp", "shocker_ItemPostFrame")
	RegisterHam(Ham_Weapon_Reload, "weapon_tmp", "shocker_Reload")
	RegisterHam(Ham_Weapon_Reload, "weapon_tmp", "shocker_Reload_Post", 1)
	RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
	register_forward(FM_SetModel, "fw_SetModel")
	register_forward(FM_CmdStart, "fm_cmdstart")
	register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
	register_forward(FM_PlaybackEvent, "fwPlaybackEvent")

	cvar_dmg_shocker = register_cvar("zp_shocker_dmg", "3.46")
	cvar_recoil_shocker = register_cvar("zp_shocker_recoil", "1.20")
	cvar_clip_shocker = register_cvar("zp_shocker_clip", "70")
	cvar_spd_shocker = register_cvar("zp_shocker_spd", "0.92")
	cvar_shocker_ammo = register_cvar("zp_shocker_ammo", "120")
	
	g_itemid_shocker = ze_register_item("Shocker Gloves", 100, 0)
	g_MaxPlayers = get_maxplayers()
	gmsgWeaponList = get_user_msgid("WeaponList")
	register_clcmd(shocker_name, "command_shocker")
}

public plugin_precache()
{
	precache_model(shocker_V_MODEL)
	precache_model(shocker_P_MODEL)
	precache_model(shocker_W_MODEL)
	for(new i = 0; i < sizeof Fire_Sounds; i++)
	precache_sound(Fire_Sounds[i])	
	for(new i = 0; i < sizeof End_Sounds; i++)
	precache_sound(End_Sounds[i])

	sfsmg_sprite = precache_model("sprites/CF/shocker_gloves_laser.spr")
	g_flameSpr = precache_model("sprites/CF/shocker_gloves_ef.spr")
	g_smokeSpr = precache_model("sprites/black_smoke3.spr")

	new sFile[64]
	formatex(sFile, charsmax(sFile), "sprites/%s.txt", shocker_name)
	precache_generic(sFile)
	
	for(new i = 0; i < sizeof(shocker_spr); i++)
	{
		precache_generic(shocker_spr[i])
	}

	register_forward(FM_PrecacheEvent, "fwPrecacheEvent_Post", 1)
}

public command_shocker(Player)
{
	engclient_cmd(Player, "weapon_tmp")
	return PLUGIN_HANDLED
}

public zp_user_humanized_post(id)
{
	g_has_shocker[id] = false
}

public plugin_natives ()
{
	register_native("give_weapon_shocker", "native_give_weapon_add", 1)
}
public native_give_weapon_add(id)
{
	give_shocker(id)
}

public fwPrecacheEvent_Post(type, const name[])
{
	if (equal("events/tmp.sc", name))
	{
		g_orig_event_shocker = get_orig_retval()
		return FMRES_HANDLED
	}
	return FMRES_IGNORED
}

public client_connect(id)
{
	g_has_shocker[id] = false
}

public client_disconnected(id)
{
	g_has_shocker[id] = false
}

public  ze_user_infected(id, iInfector)
{
	if (ze_is_user_zombie(id))
	{
		g_has_shocker[id] = false
	}
}

public fw_SetModel(entity, model[])
{
	if(!is_valid_ent(entity))
		return FMRES_IGNORED
	
	static szClassName[33]
	entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName))
		
	if(!equal(szClassName, "weaponbox"))
		return FMRES_IGNORED
	
	static iOwner
	
	iOwner = entity_get_edict(entity, EV_ENT_owner)
	
	if(equal(model, "models/w_tmp.mdl"))
	{
		static iStoredAugID
		
		iStoredAugID = find_ent_by_owner(ENG_NULLENT, "weapon_tmp", entity)
	
		if(!is_valid_ent(iStoredAugID))
			return FMRES_IGNORED
	
		if(g_has_shocker[iOwner])
		{
			entity_set_int(iStoredAugID, EV_INT_WEAPONKEY, shocker_WEAPONKEY)
			
			g_has_shocker[iOwner] = false
			
			entity_set_model(entity, shocker_W_MODEL)
			
			return FMRES_SUPERCEDE
		}
	}
	return FMRES_IGNORED
}

public give_shocker(id)
{
	drop_weapons(id, 1)
	new iWep2 = give_item(id,"weapon_tmp")
	if( iWep2 > 0 )
	{
		cs_set_weapon_ammo(iWep2, get_pcvar_num(cvar_clip_shocker))
		cs_set_user_bpammo (id, CSW_TMP, get_pcvar_num(cvar_shocker_ammo))	
		UTIL_PlayWeaponAnimation(id, shocker_DRAW)
		set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF)

		message_begin(MSG_ONE, gmsgWeaponList, _, id)
		write_string(shocker_name)
		write_byte(10)
		write_byte(120)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(11)
		write_byte(CSW_TMP)
		message_end()
	}
	g_has_shocker[id] = true
}

public ze_select_item_pre(id, itemid)
{
	// If it is not the gun the player is willing to buy then just make it available.
	// g_iItemID is the handler you made it before.
	// You can name itemid whatever you like but just not the same handler name.
	
	if (itemid != g_itemid_shocker)
		return ZE_ITEM_AVAILABLE
		
	// In this item we are working on, it will be for humans only so we need to hide it for zombies so they do not get it.
	//If you want it to be for zombies, you need to add the not operator "!" before the native so it's gonna be like this:
	// if (!ze_is_user_zombie(id))
	// If you want an item to be for zombies & humans then just don't add the next code.
	
	if (ze_is_user_zombie(id))
		return ZE_ITEM_DONT_SHOW
		
	// Here we need to return a value so you don't get a warning on compiling.
	return ZE_ITEM_AVAILABLE
}

public ze_select_item_post(player, itemid)
{
	if(itemid != g_itemid_shocker)
		return

	give_shocker(id)
}

public fw_shocker_AddToPlayer(shocker, id)
{
	if(!is_valid_ent(shocker) || !is_user_connected(id))
		return HAM_IGNORED
	
	if(entity_get_int(shocker, EV_INT_WEAPONKEY) == shocker_WEAPONKEY)
	{
		g_has_shocker[id] = true
		
		entity_set_int(shocker, EV_INT_WEAPONKEY, 0)

		message_begin(MSG_ONE, gmsgWeaponList, _, id)
		write_string(shocker_name)
		write_byte(10)
		write_byte(120)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(11)
		write_byte(CSW_TMP)
		message_end()

		return HAM_HANDLED
	}
	else
	{
		message_begin(MSG_ONE, gmsgWeaponList, _, id)
		write_string("weapon_tmp")
		write_byte(10)
		write_byte(120)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(11)
		write_byte(CSW_TMP)
		message_end()
	}
	return HAM_IGNORED
}

public fw_UseStationary_Post(entity, caller, activator, use_type)
{
	if (use_type == USE_STOPPED && is_user_connected(caller))
		replace_weapon_models(caller, get_user_weapon(caller))
}

public fw_Item_Deploy_Post(weapon_ent)
{
	static owner
	owner = fm_cs_get_weapon_ent_owner(weapon_ent)
	
	static weaponid
	weaponid = cs_get_weapon_id(weapon_ent)
	
	replace_weapon_models(owner, weaponid)
}

public CurrentWeapon(id)
{
     replace_weapon_models(id, read_data(2))

     if(read_data(2) != CSW_TMP || !g_has_shocker[id])
          return
     
     static Float:iSpeed
     if(g_has_shocker[id])
          iSpeed = get_pcvar_float(cvar_spd_shocker)
     
     static weapon[32],Ent
     get_weaponname(read_data(2),weapon,31)
     Ent = find_ent_by_owner(-1,weapon,id)
     if(Ent)
     {
          static Float:Delay
          Delay = get_pdata_float( Ent, 46, 4) * iSpeed
          if (Delay > 0.0)
          {
               set_pdata_float(Ent, 46, Delay, 4)
          }
     }
}

replace_weapon_models(id, weaponid)
{
	switch (weaponid)
	{
		case CSW_TMP:
		{
			if (ze_is_user_zombie(id))
				return
			
			if(g_has_shocker[id])
			{
				set_pev(id, pev_viewmodel2, shocker_V_MODEL)
				set_pev(id, pev_weaponmodel2, shocker_P_MODEL)
				if(oldweap[id] != CSW_TMP) 
				{
					UTIL_PlayWeaponAnimation(id, shocker_DRAW)
					set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF)

					message_begin(MSG_ONE, gmsgWeaponList, _, id)
					write_string(shocker_name)
					write_byte(10)
					write_byte(120)
					write_byte(-1)
					write_byte(-1)
					write_byte(0)
					write_byte(11)
					write_byte(CSW_TMP)
					message_end()
				}
			}
		}
	}
	oldweap[id] = weaponid
}

public fw_UpdateClientData_Post(Player, SendWeapons, CD_Handle)
{
	if(!is_user_alive(Player) || (get_user_weapon(Player) != CSW_TMP || !g_has_shocker[Player]))
		return FMRES_IGNORED
	
	set_cd(CD_Handle, CD_flNextAttack, halflife_time () + 0.001)
	return FMRES_HANDLED
}

public fw_shocker_PrimaryAttack(Weapon)
{
	new Player = get_pdata_cbase(Weapon, 41, 4)
	
	if (!g_has_shocker[Player])
		return
	
	g_IsInPrimaryAttack = 1
	pev(Player,pev_punchangle,cl_pushangle[Player])
	
	g_clip_ammo[Player] = cs_get_weapon_ammo(Weapon)
}

public fwPlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
	if ((eventid != g_orig_event_shocker) || !g_IsInPrimaryAttack)
		return FMRES_IGNORED
	if (!(1 <= invoker <= g_MaxPlayers))
    return FMRES_IGNORED

	playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
	return FMRES_SUPERCEDE
}

public fm_cmdstart(Player, uc_handle, seed)
{
	if(!is_user_alive(Player) || get_user_weapon(Player) != CSW_TMP || !g_has_shocker[Player])
		return FMRES_IGNORED

	if(get_pdata_float(Player, 83, 5) > 0.0) 
		return FMRES_IGNORED

	if((pev(Player, pev_oldbuttons) & IN_ATTACK) && !(get_uc(uc_handle, UC_Buttons) & IN_ATTACK))
	{
		UTIL_PlayWeaponAnimation(Player, shocker_SHOOTEND)
		
		emit_sound(Player, CHAN_WEAPON, End_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
		
		set_pdata_float(find_ent_by_owner(-1, "weapon_tmp", Player), 48, 3.0, 4)
	}

	return FMRES_IGNORED
}

public fw_shocker_PrimaryAttack_Post(Weapon)
{
	g_IsInPrimaryAttack = 0
	new Player = get_pdata_cbase(Weapon, 41, 4)
	
	new szClip, szAmmo
	get_user_weapon(Player, szClip, szAmmo)
	
	if(!is_user_alive(Player))
		return

	if(g_has_shocker[Player])
	{
		if (!g_clip_ammo[Player])
			return

		new Float:push[3], iPlayer
		pev(Player,pev_punchangle,push)
		xs_vec_sub(push,cl_pushangle[Player],push)
		
		xs_vec_mul_scalar(push,get_pcvar_float(cvar_recoil_shocker),push)
		xs_vec_add(push,cl_pushangle[Player],push)
		set_pev(Player,pev_punchangle,push)
		
		emit_sound(iPlayer, CHAN_WEAPON, Fire_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
		UTIL_PlayWeaponAnimation(Player, shocker_SHOOT1)
		create_tracer_sfsmg(Player)
	}
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
	if (victim != attacker && is_user_connected(attacker))
	{
		if(get_user_weapon(attacker) == CSW_TMP)
		{
			if(g_has_shocker[attacker])
			{
				SetHamParamFloat(4, damage * get_pcvar_float(cvar_dmg_shocker))
		
				if( !task_exists( victim + TASK_FBURN ))
				{
					g_burning_duration[ victim ] += FIRE_DURATION * 5
				
					set_task( 0.2, "CTask__BurningFlame", victim + TASK_FBURN, _, _, "b" )
				}
			}
		}
	}
}

public message_DeathMsg(msg_id, msg_dest, id)
{
	static szTruncatedWeapon[33], iAttacker, iVictim
	
	get_msg_arg_string(4, szTruncatedWeapon, charsmax(szTruncatedWeapon))
	
	iAttacker = get_msg_arg_int(1)
	iVictim = get_msg_arg_int(2)
	
	if(!is_user_connected(iAttacker) || iAttacker == iVictim)
		return PLUGIN_CONTINUE
	
	if(equal(szTruncatedWeapon, "tmp") && get_user_weapon(iAttacker) == CSW_TMP)
	{
		if(g_has_shocker[iAttacker])
			set_msg_arg_string(4, "tmp")
	}
	return PLUGIN_CONTINUE
}

stock fm_cs_get_current_weapon_ent(id)
{
	return get_pdata_cbase(id, OFFSET_ACTIVE_ITEM, OFFSET_LINUX)
}

stock fm_cs_get_weapon_ent_owner(ent)
{
	return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS)
}

stock UTIL_PlayWeaponAnimation(const Player, const Sequence)
{
	set_pev(Player, pev_weaponanim, Sequence)
	
	message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = Player)
	write_byte(Sequence)
	write_byte(pev(Player, pev_body))
	message_end()
}

public shocker_ItemPostFrame(weapon_entity) 
{
     new id = pev(weapon_entity, pev_owner)
     if (!is_user_connected(id))
          return HAM_IGNORED

     if (!g_has_shocker[id])
          return HAM_IGNORED

     static iClipExtra
     
     iClipExtra = get_pcvar_num(cvar_clip_shocker)
     new Float:flNextAttack = get_pdata_float(id, m_flNextAttack, PLAYER_LINUX_XTRA_OFF)

     new iBpAmmo = cs_get_user_bpammo(id, CSW_TMP)
     new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)

     new fInReload = get_pdata_int(weapon_entity, m_fInReload, WEAP_LINUX_XTRA_OFF) 

     if( fInReload && flNextAttack <= 0.0 )
     {
	     new j = min(iClipExtra - iClip, iBpAmmo)
	
	     set_pdata_int(weapon_entity, m_iClip, iClip + j, WEAP_LINUX_XTRA_OFF)
	     cs_set_user_bpammo(id, CSW_TMP, iBpAmmo-j)
		
	     set_pdata_int(weapon_entity, m_fInReload, 0, WEAP_LINUX_XTRA_OFF)
	     fInReload = 0
     }
     return HAM_IGNORED
}

public shocker_Reload(weapon_entity) 
{
     new id = pev(weapon_entity, pev_owner)
     if (!is_user_connected(id))
          return HAM_IGNORED

     if (!g_has_shocker[id])
          return HAM_IGNORED

     static iClipExtra

     if(g_has_shocker[id])
          iClipExtra = get_pcvar_num(cvar_clip_shocker)

     g_shocker_TmpClip[id] = -1

     new iBpAmmo = cs_get_user_bpammo(id, CSW_TMP)
     new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)

     if (iBpAmmo <= 0)
          return HAM_SUPERCEDE

     if (iClip >= iClipExtra)
          return HAM_SUPERCEDE

     g_shocker_TmpClip[id] = iClip

     return HAM_IGNORED
}

public shocker_Reload_Post(weapon_entity) 
{
	new id = pev(weapon_entity, pev_owner)
	if (!is_user_connected(id))
		return HAM_IGNORED

	if (!g_has_shocker[id])
		return HAM_IGNORED

	if (g_shocker_TmpClip[id] == -1)
		return HAM_IGNORED

	set_pdata_int(weapon_entity, m_iClip, g_shocker_TmpClip[id], WEAP_LINUX_XTRA_OFF)

	set_pdata_float(weapon_entity, m_flTimeWeaponIdle, shocker_RELOAD_TIME, WEAP_LINUX_XTRA_OFF)

	set_pdata_float(id, m_flNextAttack, shocker_RELOAD_TIME, PLAYER_LINUX_XTRA_OFF)

	set_pdata_int(weapon_entity, m_fInReload, 1, WEAP_LINUX_XTRA_OFF)

	UTIL_PlayWeaponAnimation(id, shocker_RELOAD)

	return HAM_IGNORED
}

stock create_tracer_sfsmg(id)
{
	static End[3]
	get_user_origin(id, End, 3)	

	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_BEAMENTPOINT)
	write_short(id | 0x1000)
	write_coord(End[0])
	write_coord(End[1])
	write_coord(End[2])
	write_short(sfsmg_sprite)
	write_byte(0); // framestart
	write_byte(1); // framerate
	write_byte(4); // life
	write_byte(30); // width
	write_byte(3); // noise
	write_byte(0); // red
	write_byte(128); // green
	write_byte(255); // blue
	write_byte(200); // brightness
	write_byte(10); // speed
	message_end()
}

stock drop_weapons(id, dropwhat)
{
     static weapons[32], num, i, weaponid
     num = 0
     get_user_weapons(id, weapons, num)
     
     for (i = 0; i < num; i++)
     {
          weaponid = weapons[i]
          
          if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
          {
               static wname[32]
               get_weaponname(weaponid, wname, sizeof wname - 1)
               engclient_cmd(id, "drop", wname)
          }
     }
}

public CTask__BurningFlame( taskid )
{
	// Get player origin and flags
	static origin[3], flags
	get_user_origin(ID_FBURN, origin)
	flags = pev(ID_FBURN, pev_flags)
	
	// Madness mode - in water - burning stopped
	if ((flags & FL_INWATER) || g_burning_duration[ID_FBURN] < 1 || g_fRoundEnd || !is_user_alive(ID_FBURN))
	{
		// Smoke sprite
		message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
		write_byte(TE_SMOKE) // TE id
		write_coord(origin[0]) // x
		write_coord(origin[1]) // y
		write_coord(origin[2]-50) // z
		write_short(g_smokeSpr) // sprite
		write_byte(random_num(2, 5)) // scale
		write_byte(random_num(2, 5)) // framerate
		message_end()
		
		// Task not needed anymore
		remove_task(taskid)
		return
	}
	
	// Get player's health
	static health
	health = pev(ID_FBURN, pev_health)
	
	// Take damage from the fire
	if (health - FIRE_DAMAGE > 0)
	fm_set_user_health(ID_FBURN, health - FIRE_DAMAGE)
	
	// Flame sprite
	message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
	write_byte(TE_SPRITE) // TE id
	write_coord(origin[0]+random_num(-5, 5)) // x
	write_coord(origin[1]+random_num(-5, 5)) // y
	write_coord(origin[2]+random_num(-10, 10)) // z
	write_short(g_flameSpr) // sprite
	write_byte(random_num(1, 4)) // scale
	write_byte(200) // brightness
	message_end()

	g_burning_duration[ID_FBURN]--
}
Image

User avatar
Raheem
Mod Developer
Mod Developer
Posts: 2214
Joined: 7 years ago
Contact:

#4

Post by Raheem » 5 years ago

Error:
  • Code: Select all

    C:\Users\macie\Desktop\Compiler v1.8.3\scripting\weapon_Shocker_Gloves.sma(281) : error 017: undefined symbol "id"
This means that there is error at line 281, the id is not defined. This because this line should be: player is defined in the function header, but id is unknown for it. See:
    1. public ze_select_item_post(player, itemid)
    2. {
    3.     if(itemid != g_itemid_shocker)
    4.         return
    5.  
    6.     give_shocker(player)
    7. }
He who fails to plan is planning to fail

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

#5

Post by czirimbolo » 5 years ago

Thanks! Solved
Image

Post Reply

Create an account or sign in to join the discussion

You need to be a member in order to post a reply

Create an account

Not a member? register to join our community
Members can start their own topics & subscribe to topics
It’s free and only takes a minute

Register

Sign in

Who is online

Users browsing this forum: No registered users and 2 guests