Raised This Month: $51 Target: $400
 12% 

Solved How to Code Shotgun Reload for CS


Post New Thread Reply   
 
Thread Tools Display Modes
hellmonja
Senior Member
Join Date: Oct 2015
Old 11-18-2015 , 10:09   Re: How to Code Shotgun Reload for CS
Reply With Quote #11

Quote:
Originally Posted by KliPPy View Post
He isn't trying to detect when the player is reloading a weapon, he is trying to replicate shotgun reloading (shell by shell, not the whole clip at once) on some other weapon.
Exactly what I was trying to do. And I want to set the clip size from 8 to just 3. So far I've treid the methods here and downloaded a couple of ZP shotguns to study. I'm having a hard time understanding to incorporate them in my code though...
hellmonja is offline
CrazY.
Veteran Member
Join Date: May 2015
Location: SP, Brazil
Old 11-18-2015 , 15:43   Re: How to Code Shotgun Reload for CS
Reply With Quote #12

You just want to change the clip 8 to 3?
A look at my extra items, everyone weapons has the possibility of changing the clip.

https://forums.alliedmods.net/showthread.php?t=273796
https://forums.alliedmods.net/showthread.php?t=274344
https://forums.alliedmods.net/showthread.php?p=2361260
https://forums.alliedmods.net/showthread.php?p=2362075
__________________








CrazY. is offline
SkumTomteN
Veteran Member
Join Date: Oct 2013
Location: Asgard
Old 11-18-2015 , 16:18   Re: How to Code Shotgun Reload for CS
Reply With Quote #13

Replicate Reload.

PHP Code:
#define m_pPlayer 41
#define m_flNextPrimaryAttack 46
#define m_flTimeWeaponIdle 48
#define m_fInSpecialReload 55
#define m_rgPlayerAmmoSlot 376
#define m_flNextAttack 83

public plugin_init()
{
    
RegisterHam(Ham_Weapon_Reload"weapon_???""OnWeaponReload");
    
RegisterHam(Ham_Weapon_WeaponIdle"weapon_???""OnWeaponIdle");
}

public 
OnWeaponReload(pWeapon)
{
    new 
pPlayer get_pdata_cbase(pWeaponm_pPlayer4);
    
    if (!
g_hasYourvariable[pPlayer])
        return 
HAM_IGNORED;
    
    new 
iClip cs_get_weapon_ammo(pWeapon);
    
    if (
iClip >= SET_SOME_MAXCLIP_HERE)
        return 
HAM_SUPERCEDE;
        
    new 
iAmmoIndex ExecuteHamB(Ham_Item_PrimaryAmmoIndexpWeapon);
    new 
rgAmmo get_pdata_int(pPlayerm_rgPlayerAmmoSlot iAmmoIndex);
    
    if (
rgAmmo <= 0)
        return 
HAM_SUPERCEDE;
        
    if (
get_pdata_float(pWeaponm_flNextPrimaryAttack4) > 0.0)
        return 
HAM_SUPERCEDE;
        
    switch (
get_pdata_int(pWeaponm_fInSpecialReload4))
    {
        case 
0:
        {
            
SendWeaponAnim(pPlayerRELOAD_START_ANIMATION);
            
set_pdata_int(pWeaponm_fInSpecialReload14);
            
set_pdata_float(pPlayerm_flNextAttack0.6);        //this control reload speed
            
set_pdata_float(pWeaponm_flTimeWeaponIdle0.64);    //this one too
            
set_pdata_float(pWeaponm_flNextPrimaryAttack1.04);
            return 
HAM_SUPERCEDE;
        }
        case 
1:
        {
            if (
get_pdata_float(pWeaponm_flTimeWeaponIdle4) > 0.0)
                return 
HAM_SUPERCEDE;
                
            
set_pdata_int(pWeaponm_fInSpecialReload24);
            
//Play "shell insert" sound here if you want
            
SendWeaponAnim(pPlayerINSERT_SHELL_ANIMATION);
            
set_pdata_float(pWeaponm_flTimeWeaponIdle0.54);
        }
        case 
2:
        {
            
cs_set_weapon_ammo(pWeapon, ++iClip);
            
set_pdata_int(pPlayerm_rgPlayerAmmoSlot iAmmoIndex, --rgAmmo);
            
set_pdata_int(pWeaponm_fInSpecialReload14);
        }
    }
    
    return 
HAM_SUPERCEDE;    
}

public 
OnWeaponIdle(pWeapon)
{
    if (
get_pdata_float(pWeaponm_flTimeWeaponIdle4) > 0.0)
        return 
HAM_IGNORED;
        
    new 
pPlayer get_pdata_cbase(pWeaponm_pPlayer4);
 
    if (!
g_hasYourvariable[pPlayer])
        return 
HAM_IGNORED;

    new 
iClip cs_get_weapon_ammo(pWeapon);
    new 
fInSpecialReload get_pdata_int(pWeaponm_fInSpecialReload4);
    new 
rgAmmo get_pdata_int(pPlayerm_rgPlayerAmmoSlot ExecuteHamB(Ham_Item_PrimaryAmmoIndexpWeapon));
    
    if (
iClip == && fInSpecialReload == && rgAmmo 0)
    {
        
OnWeaponReload(pWeapon);
        return 
HAM_SUPERCEDE;
    }
    else if (
fInSpecialReload != 0)
    {
        if (
iClip != SET_SOME_MAXCLIP_HERE && rgAmmo 0)
        {
            
OnWeaponReload(pWeapon);
        }
        else
        {
            
SendWeaponAnim(pPlayerRELOAD_END_ANIMATION);
            
//play reload end sound here if you need
            
set_pdata_int(pWeaponm_fInSpecialReload04);
            
set_pdata_float(pWeaponm_flTimeWeaponIdle1.54);
        }
        
        return 
HAM_SUPERCEDE;
    }
    
    return 
HAM_IGNORED;

__________________
Contact: Steam
Videos: Youtube

Last edited by SkumTomteN; 11-18-2015 at 16:19.
SkumTomteN is offline
hellmonja
Senior Member
Join Date: Oct 2015
Old 11-27-2015 , 13:27   Re: How to Code Shotgun Reload for CS
Reply With Quote #14

hey guys. sorry i took so long. i didn't want to post after i've actually done something, and i'm currently busy with my new job. anyway.

so here's the problem: i took SkumTomteN's posted code and put it on my code. BUT i removed these two things:

Code:
	//RegisterHam(Ham_Weapon_Reload, weapon_supershorty, "fw_Weapon_Reload")
	//RegisterHam(Ham_Weapon_Reload, weapon_supershorty, "fw_Weapon_Reload_Post", 1)
which i think would conflict with the copied code. but when I do that, the plugin compiles but i can't enter the command to get the gun, as if the plugin does not exist. I've checked "plugins.ini" and it is listed there. I can't even test the gun.

Can someone check the whole code i uploaded and see what's the problem? Why removing those 2 renders the plugin useless?...

Here's what I got so far:
Code:
#include <amxmodx>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <cstrike>
#include <fun>
// #include <orpheu>

#define PLUGIN "Serbu Super Shorty"
#define VERSION "1.0"
#define AUTHOR "Sneaky.amxx, MeRcyLeZZ, Arkshine"

#define V_MODEL "models/v_supershorty.mdl"
#define P_MODEL "models/p_supershorty.mdl"
#define W_MODEL "models/w_supershorty.mdl"

#define CSW_SUPERSHORTY CSW_M3
#define weapon_supershorty "weapon_m3"

#define m_pPlayer 41
#define m_flNextPrimaryAttack 46
#define m_flTimeWeaponIdle 48
#define m_fInSpecialReload 55
#define m_rgPlayerAmmoSlot 376
#define m_flNextAttack 83

#define DAMAGE 25
#define CLIP 3
#define BPAMMO 32
#define RATEOFIRE 0.9
#define RECOIL 1.3
#define RELOAD_TIME 1.75
#define TEAM 2		// 1-T, 2-CT, 0-Both
#define WALKSPEED 5
#define PRICE 2200

#define SHOOT_ANIM random_num(1, 2)
#define DRAW_ANIM 6
#define RELOAD_START 5
#define RELOAD_INSERT 3
#define RELOAD_END 4

#define BODY_NUM 0

#define WEAPON_SECRETCODE 852345
#define WEAPON_EVENT "events/m3.sc"
#define OLD_W_MODEL "models/w_m3.mdl"

#define FIRE_SOUND "weapons/supershorty-1.wav"

new MsgIndexWeaponList, g_allowedteam
new g_hasYourvariable[33], g_Had_Weapon, g_Old_Weapon[33], Float:g_Recoil[33][3], g_Clip[33]
new g_weapon_event, g_ShellId, g_SmokePuff_SprId
new g_HamBot, g_Msg_CurWeapon, g_msgMoney, g_msgBlinkAcct
const PLAYER_IN_BUYZONE = (1<<0)
const OFFSET_CSMONEY = 115
const OFFSET_MAPZONE = 235
const OFFSET_CSTEAMS = 114

// MACROS
#define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
#define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
#define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
	
	register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)	
	register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")	
	register_forward(FM_SetModel, "fw_SetModel")	
	register_forward(FM_CmdStart, "fw_CmdStart")
	
	RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack_World")
	RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Player")
	RegisterHam(Ham_Weapon_PrimaryAttack, weapon_supershorty, "fw_Weapon_PrimaryAttack")
	RegisterHam(Ham_Weapon_PrimaryAttack, weapon_supershorty, "fw_Weapon_PrimaryAttack_Post", 1)
	RegisterHam(Ham_Item_AddToPlayer, weapon_supershorty, "fw_Item_AddToPlayer_Post", 1)
	RegisterHam(Ham_Weapon_Reload, "weapon_supershorty", "OnWeaponReload");
	RegisterHam(Ham_Weapon_WeaponIdle, "weapon_supershorty", "OnWeaponIdle");
	
	//RegisterHam(Ham_Weapon_Reload, weapon_supershorty, "fw_Weapon_Reload")
	//RegisterHam(Ham_Weapon_Reload, weapon_supershorty, "fw_Weapon_Reload_Post", 1)
	RegisterHam(Ham_Item_PostFrame, weapon_supershorty, "fw_Item_PostFrame")		
	
	MsgIndexWeaponList = get_user_msgid("WeaponList");  
	g_Msg_CurWeapon = get_user_msgid("CurWeapon")
	g_msgMoney = get_user_msgid("Money")
	g_msgBlinkAcct = get_user_msgid("BlinkAcct")
	register_clcmd("weapon_supershorty", "ClientCommand_SelectWeapon"); 
	register_concmd("supershorty", "Get_Weapon")
	register_clcmd("say /supershorty", "Get_Weapon")
}

public plugin_precache()
{
	precache_generic("sprites/weapon_supershorty.txt");
	precache_generic("sprites/640hudap02.spr");
	precache_generic("sprites/640hudap02_s.spr");
	precache_generic("sprites/ap-rounds01.spr");
	
	engfunc(EngFunc_PrecacheModel, V_MODEL)
	engfunc(EngFunc_PrecacheModel, P_MODEL)
	engfunc(EngFunc_PrecacheModel, W_MODEL)
	engfunc(EngFunc_PrecacheSound, FIRE_SOUND)
	
	g_SmokePuff_SprId = engfunc(EngFunc_PrecacheModel, "sprites/wall_puff1.spr")
	g_ShellId = engfunc(EngFunc_PrecacheModel, "models/rshell.mdl")	
	
	register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1)
}

public fw_PrecacheEvent_Post(type, const name[])
{
	if(equal(WEAPON_EVENT, name))
		g_weapon_event = get_orig_retval()		
}

public client_putinserver(id)
{
	if(!g_HamBot && is_user_bot(id))
	{
		g_HamBot = 1
		set_task(0.1, "Do_RegisterHam", id)
	}
}

public Do_RegisterHam(id)
{
	RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack_Player")	
}

public Get_Weapon(id)
{
	if(!is_user_alive(id)) return
	if (!fm_get_user_buyzone(id)) return

	// Check if the player is on a restricted team
	g_allowedteam = TEAM
	if (g_allowedteam > 0 && g_allowedteam != fm_get_user_team(id))
	{
		return
	}
	
	// Check that player has the money
	if (fm_get_user_money(id) < PRICE)
	{
		client_print(id, print_center, "#Cstrike_TitlesTXT_Not_Enough_Money")
		
		// Blink money
		message_begin(MSG_ONE_UNRELIABLE, g_msgBlinkAcct, _, id)
		write_byte(2) // times
		message_end()
		return
	}
	
	// Player tries to buy the same gun
	if(get_user_weapon(id) == CSW_SUPERSHORTY)
	{
		client_print(id, print_center, "#Cstrike_Already_Own_Weapon")
		return
	}

	// Drop Other Weapons on Purchase
	if(get_user_weapon(id) != CSW_SUPERSHORTY)
	{
		if (user_has_weapon(id, CSW_XM1014)) client_cmd(id, "drop weapon_xm1014"); else
		if (user_has_weapon(id, CSW_TMP)) client_cmd(id, "drop weapon_tmp"); else
		if (user_has_weapon(id, CSW_MAC10)) client_cmd(id, "drop weapon_mac10"); else
		if (user_has_weapon(id, CSW_MP5NAVY)) client_cmd(id, "drop weapon_mp5navy"); else
		if (user_has_weapon(id, CSW_UMP45)) client_cmd(id, "drop weapon_ump45"); else
		if (user_has_weapon(id, CSW_P90)) client_cmd(id, "drop weapon_p90"); else
		if (user_has_weapon(id, CSW_GALIL)) client_cmd(id, "drop weapon_galil"); else
		if (user_has_weapon(id, CSW_FAMAS)) client_cmd(id, "drop weapon_famas"); else
		if (user_has_weapon(id, CSW_AK47)) client_cmd(id, "drop weapon_ak47"); else
		if (user_has_weapon(id, CSW_M4A1)) client_cmd(id, "drop weapon_m4a1"); else
		if (user_has_weapon(id, CSW_AUG)) client_cmd(id, "drop weapon_aug"); else
		if (user_has_weapon(id, CSW_SG552)) client_cmd(id, "drop weapon_sg552"); else
		if (user_has_weapon(id, CSW_SCOUT)) client_cmd(id, "drop weapon_scout"); else
		if (user_has_weapon(id, CSW_AWP)) client_cmd(id, "drop weapon_awp"); else
		if (user_has_weapon(id, CSW_SG550)) client_cmd(id, "drop weapon_sg550"); else
		if (user_has_weapon(id, CSW_G3SG1)) client_cmd(id, "drop weapon_g3sg1"); else
		if (user_has_weapon(id, CSW_M249)) client_cmd(id, "drop weapon_m249"); else
		client_cmd(id, "drop weapon_shield");
	}

	Set_BitVar(g_Had_Weapon, id)
	fm_give_item(id, weapon_supershorty)	
	
	// Set Ammo
	static Ent; Ent = fm_get_user_weapon_entity(id, CSW_SUPERSHORTY)
	if(pev_valid(Ent)) cs_set_weapon_ammo(Ent, CLIP)
	
	engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, g_Msg_CurWeapon, {0, 0, 0}, id)
	write_byte(1)
	write_byte(CSW_SUPERSHORTY)
	write_byte(CLIP)
	message_end()
	
	// Calculate new money amount
	static newmoney
	newmoney = fm_get_user_money(id) - PRICE
	
	// Update money offset
	fm_set_user_money(id, newmoney)
	
	// Update money on HUD
	message_begin(MSG_ONE, g_msgMoney, _, id)
	write_long(newmoney) // amount
	write_byte(1) // flash
	message_end()


}

public Remove_Weapon(id)
{
	UnSet_BitVar(g_Had_Weapon, id)
}

public ClientCommand_SelectWeapon(id)  
{  
	engclient_cmd(id, weapon_supershorty);
	return PLUGIN_HANDLED
} 

public Event_CurWeapon(id)
{
	if(!is_user_alive(id))
		return
		
	static CSWID; CSWID = read_data(2)
	
	if((CSWID == CSW_SUPERSHORTY && g_Old_Weapon[id] != CSW_SUPERSHORTY) && Get_BitVar(g_Had_Weapon, id))
	{
		set_pev(id, pev_viewmodel2, V_MODEL)
		set_pev(id, pev_weaponmodel2, "")
		
		set_weapon_anim(id, DRAW_ANIM)
		Draw_NewWeapon(id, CSWID)
		set_user_maxspeed(id, get_user_maxspeed(id)-WALKSPEED);
	} else if((CSWID == CSW_SUPERSHORTY && g_Old_Weapon[id] == CSW_SUPERSHORTY) && Get_BitVar(g_Had_Weapon, id)) {
		static Ent; Ent = fm_get_user_weapon_entity(id, CSW_SUPERSHORTY)
		if(!pev_valid(Ent))
		{
			g_Old_Weapon[id] = get_user_weapon(id)
			return
		}
		
		set_pdata_float(Ent, 46, get_pdata_float(Ent, 46, 4) * RATEOFIRE, 4)
	} else if(CSWID != CSW_SUPERSHORTY && g_Old_Weapon[id] == CSW_SUPERSHORTY) Draw_NewWeapon(id, CSWID)
	
	g_Old_Weapon[id] = get_user_weapon(id)
}

public Draw_NewWeapon(id, CSW_ID)
{
	if(CSW_ID == CSW_SUPERSHORTY)
	{
		static ent
		ent = fm_get_user_weapon_entity(id, CSW_SUPERSHORTY)
		
		if(pev_valid(ent) && Get_BitVar(g_Had_Weapon, id))
		{
			set_pev(ent, pev_effects, pev(ent, pev_effects) &~ EF_NODRAW) 
			engfunc(EngFunc_SetModel, ent, P_MODEL)	
			set_pev(ent, pev_body, BODY_NUM)
		}
	} else {
		static ent
		ent = fm_get_user_weapon_entity(id, CSW_SUPERSHORTY)
		
		if(pev_valid(ent)) set_pev(ent, pev_effects, pev(ent, pev_effects) | EF_NODRAW) 			
	}
	
}

public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
{
	if(!is_user_alive(id))
		return FMRES_IGNORED	
	if(get_user_weapon(id) == CSW_SUPERSHORTY && Get_BitVar(g_Had_Weapon, id))
		set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001) 
	
	return FMRES_HANDLED
}

public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
	if (!is_user_connected(invoker))
		return FMRES_IGNORED	
	if(get_user_weapon(invoker) != CSW_SUPERSHORTY || !Get_BitVar(g_Had_Weapon, invoker))
		return FMRES_IGNORED
	if(eventid != g_weapon_event)
		return FMRES_IGNORED
	
	engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
	
	set_weapon_anim(invoker, SHOOT_ANIM)
	emit_sound(invoker, CHAN_WEAPON, FIRE_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
	
	Eject_Shell(invoker, g_ShellId, 0.0)
		
	return FMRES_SUPERCEDE
}

public fw_SetModel(entity, model[])
{
	if(!pev_valid(entity))
		return FMRES_IGNORED
	
	static Classname[32]
	pev(entity, pev_classname, Classname, sizeof(Classname))
	
	if(!equal(Classname, "weaponbox"))
		return FMRES_IGNORED
	
	static iOwner
	iOwner = pev(entity, pev_owner)
	
	if(equal(model, OLD_W_MODEL))
	{
		static weapon; weapon = fm_find_ent_by_owner(-1, weapon_supershorty, entity)
		
		if(!pev_valid(weapon))
			return FMRES_IGNORED;
		
		if(Get_BitVar(g_Had_Weapon, iOwner))
		{
			Remove_Weapon(iOwner)
			
			set_pev(weapon, pev_impulse, WEAPON_SECRETCODE)
			engfunc(EngFunc_SetModel, entity, W_MODEL)
			set_pev(entity, pev_body, BODY_NUM)
			
			return FMRES_SUPERCEDE
		}
	}

	return FMRES_IGNORED;
}

public fw_CmdStart(id, uc_handle, seed)
{
	if(!is_user_alive(id))
		return
	if(!Get_BitVar(g_Had_Weapon, id) || get_user_weapon(id) != CSW_SUPERSHORTY)
		return
}

public fw_TraceAttack_World(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits)
{
	if(!is_user_connected(Attacker))
		return HAM_IGNORED	
	if(get_user_weapon(Attacker) != CSW_SUPERSHORTY || !Get_BitVar(g_Had_Weapon, Attacker))
		return HAM_IGNORED
		
	static Float:flEnd[3], Float:vecPlane[3]
	
	get_tr2(Ptr, TR_vecEndPos, flEnd)
	get_tr2(Ptr, TR_vecPlaneNormal, vecPlane)		
		
	Make_BulletHole(Attacker, flEnd, Damage)
	Make_BulletSmoke(Attacker, Ptr)

	SetHamParamFloat(3, float(DAMAGE))
	
	return HAM_IGNORED
}

public fw_TraceAttack_Player(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits)
{
	if(!is_user_connected(Attacker))
		return HAM_IGNORED	
	if(get_user_weapon(Attacker) != CSW_SUPERSHORTY || !Get_BitVar(g_Had_Weapon, Attacker))
		return HAM_IGNORED
		
	SetHamParamFloat(3, float(DAMAGE))

	return HAM_IGNORED
}

public fw_Weapon_PrimaryAttack(Ent)
{
	static id; id = pev(Ent, pev_owner)
	pev(id, pev_punchangle, g_Recoil[id])
	
	return HAM_IGNORED
}

public fw_Weapon_PrimaryAttack_Post(Ent)
{
	static id; id = pev(Ent, pev_owner)
	
	if(Get_BitVar(g_Had_Weapon, id))
	{
		static Float:Push[3]
		pev(id, pev_punchangle, Push)
		xs_vec_sub(Push, g_Recoil[id], Push)
		
		xs_vec_mul_scalar(Push, RECOIL, Push)
		xs_vec_add(Push, g_Recoil[id], Push)
		set_pev(id, pev_punchangle, Push)
	}
}

public fw_Item_AddToPlayer_Post(ent, id)
{
	if(!pev_valid(ent))
		return HAM_IGNORED
		
	if(pev(ent, pev_impulse) == WEAPON_SECRETCODE)
	{
		Set_BitVar(g_Had_Weapon, id)
		set_pev(ent, pev_impulse, 0)
	}		

	message_begin( MSG_ONE, MsgIndexWeaponList, .player = id);
	write_string(g_Had_Weapon ? "weapon_supershorty" : "weapon_m3"); // WeaponName  
	write_byte(5);		// PrimaryAmmoID
	write_byte(BPAMMO);	// PrimaryAmmoMaxAmount  
	write_byte(-1);		// SecondaryAmmoID  
	write_byte(-1);		// SecondaryAmmoMaxAmount  
	write_byte(0);		// SlotID (0...N)  
	write_byte(5);		// NumberInSlot (1...N)  
	write_byte(g_Had_Weapon ? CSW_SUPERSHORTY : CSW_M3); // WeaponID  
	write_byte(0);		// Flags  
	message_end();
	
	return HAM_HANDLED	
}

public fw_Item_PostFrame(ent)
{
	if(!pev_valid(ent))
		return HAM_IGNORED
	
	static id
	id = pev(ent, pev_owner)
	
	if(is_user_alive(id) && Get_BitVar(g_Had_Weapon, id))
	{	
		static Float:flNextAttack; flNextAttack = get_pdata_float(id, 83, 5)
		static bpammo; bpammo = cs_get_user_bpammo(id, CSW_SUPERSHORTY)
		static iClip; iClip = get_pdata_int(ent, 51, 4)
		static fInReload; fInReload = get_pdata_int(ent, 54, 4)
		
		if(fInReload && flNextAttack <= 0.0)
		{
			static temp1; temp1 = min(CLIP - iClip, bpammo)

			set_pdata_int(ent, 51, iClip + temp1, 4)
			cs_set_user_bpammo(id, CSW_SUPERSHORTY, bpammo - temp1)		
			
			set_pdata_int(ent, 54, 0, 4)
			
			fInReload = 0
		}		
	}
	
	return HAM_IGNORED	
}

public OnWeaponReload(pWeapon)
{
    new pPlayer = get_pdata_cbase(pWeapon, m_pPlayer, 4);
    
    if (!g_hasYourvariable[pPlayer])
        return HAM_IGNORED;
    
    new iClip = cs_get_weapon_ammo(pWeapon);
    
    if (iClip >= CLIP)
        return HAM_SUPERCEDE;
        
    new iAmmoIndex = ExecuteHamB(Ham_Item_PrimaryAmmoIndex, pWeapon);
    new rgAmmo = get_pdata_int(pPlayer, m_rgPlayerAmmoSlot + iAmmoIndex);
    
    if (rgAmmo <= 0)
        return HAM_SUPERCEDE;
        
    if (get_pdata_float(pWeapon, m_flNextPrimaryAttack, 4) > 0.0)
        return HAM_SUPERCEDE;
        
    switch (get_pdata_int(pWeapon, m_fInSpecialReload, 4))
    {
        case 0:
        {
            set_weapon_anim(pPlayer, RELOAD_START);
            set_pdata_int(pWeapon, m_fInSpecialReload, 1, 4);
            set_pdata_float(pPlayer, m_flNextAttack, 0.6);        //this control reload speed
            set_pdata_float(pWeapon, m_flTimeWeaponIdle, 0.6, 4);    //this one too
            set_pdata_float(pWeapon, m_flNextPrimaryAttack, 1.0, 4);
            return HAM_SUPERCEDE;
        }
        case 1:
        {
            if (get_pdata_float(pWeapon, m_flTimeWeaponIdle, 4) > 0.0)
                return HAM_SUPERCEDE;
                
            set_pdata_int(pWeapon, m_fInSpecialReload, 2, 4);
            //Play "shell insert" sound here if you want
            set_weapon_anim(pPlayer, RELOAD_INSERT);
            set_pdata_float(pWeapon, m_flTimeWeaponIdle, 0.5, 4);
        }
        case 2:
        {
            cs_set_weapon_ammo(pWeapon, ++iClip);
            set_pdata_int(pPlayer, m_rgPlayerAmmoSlot + iAmmoIndex, --rgAmmo);
            set_pdata_int(pWeapon, m_fInSpecialReload, 1, 4);
        }
    }
    
    return HAM_SUPERCEDE;    
}

public OnWeaponIdle(pWeapon)
{
    if (get_pdata_float(pWeapon, m_flTimeWeaponIdle, 4) > 0.0)
        return HAM_IGNORED;
        
    new pPlayer = get_pdata_cbase(pWeapon, m_pPlayer, 4);
 
    if (!g_hasYourvariable[pPlayer])
        return HAM_IGNORED;

    new iClip = cs_get_weapon_ammo(pWeapon);
    new fInSpecialReload = get_pdata_int(pWeapon, m_fInSpecialReload, 4);
    new rgAmmo = get_pdata_int(pPlayer, m_rgPlayerAmmoSlot + 

ExecuteHamB(Ham_Item_PrimaryAmmoIndex, pWeapon));
    
    if (iClip == 0 && fInSpecialReload == 0 && rgAmmo > 0)
    {
        OnWeaponReload(pWeapon);
        return HAM_SUPERCEDE;
    }
    else if (fInSpecialReload != 0)
    {
        if (iClip != CLIP && rgAmmo > 0)
        {
            OnWeaponReload(pWeapon);
        }
        else
        {
            set_weapon_anim(pPlayer, RELOAD_END);
            //play reload end sound here if you need
            set_pdata_int(pWeapon, m_fInSpecialReload, 0, 4);
            set_pdata_float(pWeapon, m_flTimeWeaponIdle, 1.5, 4);
        }
        
        return HAM_SUPERCEDE;
    }
    
    return HAM_IGNORED;
}  

stock Make_BulletHole(id, Float:Origin[3], Float:Damage)
{
	// Find target
	static Decal; Decal = random_num(41, 45)
	static LoopTime; 
	
	if(Damage > 100.0) LoopTime = 2
	else LoopTime = 1
	
	for(new i = 0; i < LoopTime; i++)
	{
		// Put decal on "world" (a wall)
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_WORLDDECAL)
		engfunc(EngFunc_WriteCoord, Origin[0])
		engfunc(EngFunc_WriteCoord, Origin[1])
		engfunc(EngFunc_WriteCoord, Origin[2])
		write_byte(Decal)
		message_end()
		
		// Show sparcles
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_GUNSHOTDECAL)
		engfunc(EngFunc_WriteCoord, Origin[0])
		engfunc(EngFunc_WriteCoord, Origin[1])
		engfunc(EngFunc_WriteCoord, Origin[2])
		write_short(id)
		write_byte(Decal)
		message_end()
	}
}

public Make_BulletSmoke(id, TrResult)
{
	static Float:vecSrc[3], Float:vecEnd[3], TE_FLAG
	
	get_weapon_attachment(id, vecSrc)
	global_get(glb_v_forward, vecEnd)
    
	xs_vec_mul_scalar(vecEnd, 8192.0, vecEnd)
	xs_vec_add(vecSrc, vecEnd, vecEnd)

	get_tr2(TrResult, TR_vecEndPos, vecSrc)
	get_tr2(TrResult, TR_vecPlaneNormal, vecEnd)
    
	xs_vec_mul_scalar(vecEnd, 2.5, vecEnd)
	xs_vec_add(vecSrc, vecEnd, vecEnd)
    
	TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
	TE_FLAG |= TE_EXPLFLAG_NOSOUND
	TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
	
	engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEnd, 0)
	write_byte(TE_EXPLOSION)
	engfunc(EngFunc_WriteCoord, vecEnd[0])
	engfunc(EngFunc_WriteCoord, vecEnd[1])
	engfunc(EngFunc_WriteCoord, vecEnd[2] - 10.0)
	write_short(g_SmokePuff_SprId)
	write_byte(2)
	write_byte(50)
	write_byte(TE_FLAG)
	message_end()
}


stock hook_ent2(ent, Float:VicOrigin[3], Float:speed, Float:multi, type)
{
	static Float:fl_Velocity[3]
	static Float:EntOrigin[3]
	static Float:EntVelocity[3]
	
	pev(ent, pev_velocity, EntVelocity)
	pev(ent, pev_origin, EntOrigin)
	static Float:distance_f
	distance_f = get_distance_f(EntOrigin, VicOrigin)
	
	static Float:fl_Time; fl_Time = distance_f / speed
	static Float:fl_Time2; fl_Time2 = distance_f / (speed * multi)
	
	if(type == 1)
	{
		fl_Velocity[0] = ((VicOrigin[0] - EntOrigin[0]) / fl_Time2) * 1.5
		fl_Velocity[1] = ((VicOrigin[1] - EntOrigin[1]) / fl_Time2) * 1.5
		fl_Velocity[2] = (VicOrigin[2] - EntOrigin[2]) / fl_Time		
	} else if(type == 2) {
		fl_Velocity[0] = ((EntOrigin[0] - VicOrigin[0]) / fl_Time2) * 1.5
		fl_Velocity[1] = ((EntOrigin[1] - VicOrigin[1]) / fl_Time2) * 1.5
		fl_Velocity[2] = (EntOrigin[2] - VicOrigin[2]) / fl_Time
	}

	xs_vec_add(EntVelocity, fl_Velocity, fl_Velocity)
	set_pev(ent, pev_velocity, fl_Velocity)
}

stock get_weapon_attachment(id, Float:output[3], Float:fDis = 40.0)
{ 
	static Float:vfEnd[3], viEnd[3] 
	get_user_origin(id, viEnd, 3)  
	IVecFVec(viEnd, vfEnd) 
	
	static Float:fOrigin[3], Float:fAngle[3]
	
	pev(id, pev_origin, fOrigin) 
	pev(id, pev_view_ofs, fAngle)
	
	xs_vec_add(fOrigin, fAngle, fOrigin) 
	
	static Float:fAttack[3]
	
	xs_vec_sub(vfEnd, fOrigin, fAttack)
	xs_vec_sub(vfEnd, fOrigin, fAttack) 
	
	static Float:fRate
	
	fRate = fDis / vector_length(fAttack)
	xs_vec_mul_scalar(fAttack, fRate, fAttack)
	
	xs_vec_add(fOrigin, fAttack, output)
}

stock Eject_Shell(id, Shell_ModelIndex, Float:Time) // By Dias
{
	static Ent; Ent = get_pdata_cbase(id, 373, 5)
	if(!pev_valid(Ent))
		return

        set_pdata_int(Ent, 57, Shell_ModelIndex, 4)
        set_pdata_float(id, 111, get_gametime() + Time)
}

stock set_weapon_anim(id, anim)
{
	if(!is_user_alive(id))
		return
	
	set_pev(id, pev_weaponanim, anim)
	
	message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
	write_byte(anim)
	write_byte(pev(id, pev_body))
	message_end()
}

// Get User Money
stock fm_get_user_money(id)
{
	return get_pdata_int(id, OFFSET_CSMONEY);
}

// Set User Money
stock fm_set_user_money(id, amount)
{
	set_pdata_int(id, OFFSET_CSMONEY, amount);
}

// Returns whether user is in a buyzone
stock fm_get_user_buyzone(id)
{
	if (get_pdata_int(id, OFFSET_MAPZONE) & PLAYER_IN_BUYZONE)
		return 1;
	
	return 0;
}

// Get User Team
stock fm_get_user_team(id)
{
	return get_pdata_int(id, OFFSET_CSTEAMS);
}
hellmonja is offline
NiHiLaNTh
Way Past Expiration
Join Date: May 2009
Location: Latvia
Old 11-27-2015 , 19:50   Re: How to Code Shotgun Reload for CS
Reply With Quote #15

Code:
if (!g_hasYourvariable[pPlayer])        
       return HAM_IGNORED;
I used this in my code, so you could replace it with your variable.
Why did you put in there, if g_Had_Weapon is your variable?
This check should be replaced with Get_Bit_Var.

PostFrame is useless. PostFrame reload is used for all weapons except shotgun. Shotgun reloading is handled in ::Reload() + ::WeaponIdle() functions.
CmdStart is useless too, since it does nothing.
__________________

NiHiLaNTh is offline
Send a message via Skype™ to NiHiLaNTh
hellmonja
Senior Member
Join Date: Oct 2015
Old 11-28-2015 , 11:45   Re: How to Code Shotgun Reload for CS
Reply With Quote #16

Quote:
Originally Posted by NiHiLaNTh View Post
I used this in my code, so you could replace it with your variable.
Why did you put in there, if g_Had_Weapon is your variable?
This check should be replaced with Get_Bit_Var.
Sorry. I obviously don't fully understand this code. I just got it from Sneaky.amxx when he uploaded it in Gamebanana.

Ok so, so far I've replaced "g_hasYourvariable" with "Get_BitVar(g_Had_Weapon, pPlayer)" since that's how Sneaky used it on other parts of his code. I hope it's correct this time. I also found a better drop weapon code and put it in there, removed ItemPostFrame entirely like you said but I think I'll keep CmdStart for now in case I decide to add something later on.

But the problem still persists; It compiles but I still can't call the weapon when I type in the console, or even on chat so I can't even test the weapon. Removing the two old "Ham_Weapon_Reload" thingies seem to have something to do with it, although I couldn't fathom what or how.

Here are the two Ham_Weapon Reload stuff I removed:
Code:
public fw_Weapon_Reload(ent)
{
	static id; id = pev(ent, pev_owner)
	if(!is_user_alive(id))
		return HAM_IGNORED
	if(!Get_BitVar(g_Had_Weapon, id))
		return HAM_IGNORED
	
	g_Clip[id] = -1
	
	static bpammo; bpammo = cs_get_user_bpammo(id, CSW_SAWEDOFF)
	static iClip; iClip = get_pdata_int(ent, 51, 4)
	
	if(bpammo <= 0) return HAM_SUPERCEDE
	
	if(iClip >= CLIP) return HAM_SUPERCEDE		
		
	g_Clip[id] = iClip

	return HAM_HANDLED
}

public fw_Weapon_Reload_Post(ent)
{
	static id; id = pev(ent, pev_owner)
	if(!is_user_alive(id))
		return HAM_IGNORED
	if(!Get_BitVar(g_Had_Weapon, id))
		return HAM_IGNORED

	if (g_Clip[id] == -1)
		return HAM_IGNORED
	
	set_pdata_int(ent, 51, g_Clip[id], 4)
	set_pdata_int(ent, 54, 1, 4)
	
	set_weapon_anim(id, RELOAD_ANIM)
	set_pdata_float(id, 83, RELOAD_TIME, 5)

	return HAM_HANDLED
}

And here's what I got as of now.

Code:
#include <amxmodx>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <cstrike>
#include <fun>

#define PLUGIN "Serbu Super Shorty"
#define VERSION "1.0"
#define AUTHOR "Sneaky.amxx, MeRcyLeZZ, Arkshine"

#define V_MODEL "models/v_supershorty.mdl"
#define P_MODEL "models/p_supershorty.mdl"
#define W_MODEL "models/w_supershorty.mdl"

#define CSW_SUPERSHORTY CSW_M3
#define weapon_supershorty "weapon_m3"

#define m_pPlayer 41
#define m_flNextPrimaryAttack 46
#define m_flTimeWeaponIdle 48
#define m_fInSpecialReload 55
#define m_rgPlayerAmmoSlot 376
#define m_flNextAttack 83

#define DAMAGE 25
#define CLIP 3
#define BPAMMO 32
#define RATEOFIRE 0.9
#define RECOIL 1.3
#define RELOAD_TIME 1.75
#define TEAM 2		// 1-T, 2-CT, 0-Both
#define WALKSPEED 5
#define PRICE 2200

#define SHOOT_ANIM random_num(1, 2)
#define DRAW_ANIM 6
#define RELOAD_START 5
#define RELOAD_INSERT 3
#define RELOAD_END 4

#define BODY_NUM 0

#define WEAPON_SECRETCODE 852345
#define WEAPON_EVENT "events/m3.sc"
#define OLD_W_MODEL "models/w_m3.mdl"

#define FIRE_SOUND "weapons/supershorty-1.wav"

new MsgIndexWeaponList, g_allowedteam
new g_Had_Weapon, g_Old_Weapon[33], Float:g_Recoil[33][3]
new g_weapon_event, g_ShellId, g_SmokePuff_SprId
new g_HamBot, g_Msg_CurWeapon, g_msgMoney, g_msgBlinkAcct
const PLAYER_IN_BUYZONE = (1<<0)
const OFFSET_CSMONEY = 115
const OFFSET_MAPZONE = 235
const OFFSET_CSTEAMS = 114

// Weapon bitsums
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)
const SECONDARY_WEAPONS_BIT_SUM = (1<<CSW_P228)|(1<<CSW_ELITE)|(1<<CSW_FIVESEVEN)|(1<<CSW_USP)|(1<<CSW_GLOCK18)|(1<<CSW_DEAGLE)

// MACROS
#define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
#define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
#define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
	
	register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)	
	register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")	
	register_forward(FM_SetModel, "fw_SetModel")	
	register_forward(FM_CmdStart, "fw_CmdStart")
	
	RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack_World")
	RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Player")
	RegisterHam(Ham_Weapon_PrimaryAttack, weapon_supershorty, "fw_Weapon_PrimaryAttack")
	RegisterHam(Ham_Weapon_PrimaryAttack, weapon_supershorty, "fw_Weapon_PrimaryAttack_Post", 1)
	RegisterHam(Ham_Item_AddToPlayer, weapon_supershorty, "fw_Item_AddToPlayer_Post", 1)
	RegisterHam(Ham_Weapon_Reload, "weapon_supershorty", "OnWeaponReload");
	RegisterHam(Ham_Weapon_WeaponIdle, "weapon_supershorty", "OnWeaponIdle");
	
	//RegisterHam(Ham_Weapon_Reload, weapon_supershorty, "fw_Weapon_Reload")
	//RegisterHam(Ham_Weapon_Reload, weapon_supershorty, "fw_Weapon_Reload_Post", 1)
	//RegisterHam(Ham_Item_PostFrame, weapon_supershorty, "fw_Item_PostFrame")		
	
	MsgIndexWeaponList = get_user_msgid("WeaponList");  
	g_Msg_CurWeapon = get_user_msgid("CurWeapon")
	g_msgMoney = get_user_msgid("Money")
	g_msgBlinkAcct = get_user_msgid("BlinkAcct")
	register_clcmd("weapon_supershorty", "ClientCommand_SelectWeapon"); 
	register_concmd("supershorty", "Get_Weapon")
	register_clcmd("say /supershorty", "Get_Weapon")
}

public plugin_precache()
{
	precache_generic("sprites/weapon_supershorty.txt");
	precache_generic("sprites/640hudap02.spr");
	precache_generic("sprites/640hudap02_s.spr");
	precache_generic("sprites/ap-rounds01.spr");
	
	engfunc(EngFunc_PrecacheModel, V_MODEL)
	engfunc(EngFunc_PrecacheModel, P_MODEL)
	engfunc(EngFunc_PrecacheModel, W_MODEL)
	engfunc(EngFunc_PrecacheSound, FIRE_SOUND)
	
	g_SmokePuff_SprId = engfunc(EngFunc_PrecacheModel, "sprites/wall_puff1.spr")
	g_ShellId = engfunc(EngFunc_PrecacheModel, "models/rshell.mdl")	
	
	register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1)
}

public fw_PrecacheEvent_Post(type, const name[])
{
	if(equal(WEAPON_EVENT, name))
		g_weapon_event = get_orig_retval()		
}

public client_putinserver(id)
{
	if(!g_HamBot && is_user_bot(id))
	{
		g_HamBot = 1
		set_task(0.1, "Do_RegisterHam", id)
	}
}

public Do_RegisterHam(id)
{
	RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack_Player")	
}

public Get_Weapon(id)
{
	if(!is_user_alive(id)) return
	if (!fm_get_user_buyzone(id)) return

	// Check if the player is on a restricted team
	g_allowedteam = TEAM
	if (g_allowedteam > 0 && g_allowedteam != fm_get_user_team(id))
	{
		return
	}
	
	// Check that player has the money
	if (fm_get_user_money(id) < PRICE)
	{
		client_print(id, print_center, "#Cstrike_TitlesTXT_Not_Enough_Money")
		
		// Blink money
		message_begin(MSG_ONE_UNRELIABLE, g_msgBlinkAcct, _, id)
		write_byte(2) // times
		message_end()
		return
	}
	
	// Player tries to buy the same gun
	if(get_user_weapon(id) == CSW_SUPERSHORTY)
	{
		client_print(id, print_center, "#Cstrike_Already_Own_Weapon")
		return
	}

	drop_weapons(id, 1)
	client_cmd(id, "drop weapon_shield");
	Set_BitVar(g_Had_Weapon, id)
	fm_give_item(id, weapon_supershorty)	
	
	// Set Ammo
	static Ent; Ent = fm_get_user_weapon_entity(id, CSW_SUPERSHORTY)
	if(pev_valid(Ent)) cs_set_weapon_ammo(Ent, CLIP)
	
	engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, g_Msg_CurWeapon, {0, 0, 0}, id)
	write_byte(1)
	write_byte(CSW_SUPERSHORTY)
	write_byte(CLIP)
	message_end()
	
	// Calculate new money amount
	static newmoney
	newmoney = fm_get_user_money(id) - PRICE
	
	// Update money offset
	fm_set_user_money(id, newmoney)
	
	// Update money on HUD
	message_begin(MSG_ONE, g_msgMoney, _, id)
	write_long(newmoney) // amount
	write_byte(1) // flash
	message_end()
}

public Remove_Weapon(id)
{
	UnSet_BitVar(g_Had_Weapon, id)
}

public ClientCommand_SelectWeapon(id)  
{  
	engclient_cmd(id, weapon_supershorty);
	return PLUGIN_HANDLED
} 

public Event_CurWeapon(id)
{
	if(!is_user_alive(id))
		return
		
	static CSWID; CSWID = read_data(2)
	
	if((CSWID == CSW_SUPERSHORTY && g_Old_Weapon[id] != CSW_SUPERSHORTY) && Get_BitVar(g_Had_Weapon, id))
	{
		set_pev(id, pev_viewmodel2, V_MODEL)
		set_pev(id, pev_weaponmodel2, "")
		
		set_weapon_anim(id, DRAW_ANIM)
		Draw_NewWeapon(id, CSWID)
		set_user_maxspeed(id, get_user_maxspeed(id)-WALKSPEED);
	} else if((CSWID == CSW_SUPERSHORTY && g_Old_Weapon[id] == CSW_SUPERSHORTY) && Get_BitVar(g_Had_Weapon, id)) {
		static Ent; Ent = fm_get_user_weapon_entity(id, CSW_SUPERSHORTY)
		if(!pev_valid(Ent))
		{
			g_Old_Weapon[id] = get_user_weapon(id)
			return
		}
		
		set_pdata_float(Ent, 46, get_pdata_float(Ent, 46, 4) * RATEOFIRE, 4)
	} else if(CSWID != CSW_SUPERSHORTY && g_Old_Weapon[id] == CSW_SUPERSHORTY) Draw_NewWeapon(id, CSWID)
	
	g_Old_Weapon[id] = get_user_weapon(id)
}

public Draw_NewWeapon(id, CSW_ID)
{
	if(CSW_ID == CSW_SUPERSHORTY)
	{
		static ent
		ent = fm_get_user_weapon_entity(id, CSW_SUPERSHORTY)
		
		if(pev_valid(ent) && Get_BitVar(g_Had_Weapon, id))
		{
			set_pev(ent, pev_effects, pev(ent, pev_effects) &~ EF_NODRAW) 
			engfunc(EngFunc_SetModel, ent, P_MODEL)	
			set_pev(ent, pev_body, BODY_NUM)
		}
	} else {
		static ent
		ent = fm_get_user_weapon_entity(id, CSW_SUPERSHORTY)
		
		if(pev_valid(ent)) set_pev(ent, pev_effects, pev(ent, pev_effects) | EF_NODRAW) 			
	}
	
}

public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
{
	if(!is_user_alive(id))
		return FMRES_IGNORED	
	if(get_user_weapon(id) == CSW_SUPERSHORTY && Get_BitVar(g_Had_Weapon, id))
		set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001) 
	
	return FMRES_HANDLED
}

public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
	if (!is_user_connected(invoker))
		return FMRES_IGNORED	
	if(get_user_weapon(invoker) != CSW_SUPERSHORTY || !Get_BitVar(g_Had_Weapon, invoker))
		return FMRES_IGNORED
	if(eventid != g_weapon_event)
		return FMRES_IGNORED
	
	engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
	
	set_weapon_anim(invoker, SHOOT_ANIM)
	emit_sound(invoker, CHAN_WEAPON, FIRE_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
	
	Eject_Shell(invoker, g_ShellId, 0.0)
		
	return FMRES_SUPERCEDE
}

public fw_SetModel(entity, model[])
{
	if(!pev_valid(entity))
		return FMRES_IGNORED
	
	static Classname[32]
	pev(entity, pev_classname, Classname, sizeof(Classname))
	
	if(!equal(Classname, "weaponbox"))
		return FMRES_IGNORED
	
	static iOwner
	iOwner = pev(entity, pev_owner)
	
	if(equal(model, OLD_W_MODEL))
	{
		static weapon; weapon = fm_find_ent_by_owner(-1, weapon_supershorty, entity)
		
		if(!pev_valid(weapon))
			return FMRES_IGNORED;
		
		if(Get_BitVar(g_Had_Weapon, iOwner))
		{
			Remove_Weapon(iOwner)
			
			set_pev(weapon, pev_impulse, WEAPON_SECRETCODE)
			engfunc(EngFunc_SetModel, entity, W_MODEL)
			set_pev(entity, pev_body, BODY_NUM)
			
			return FMRES_SUPERCEDE
		}
	}

	return FMRES_IGNORED;
}

public fw_CmdStart(id, uc_handle, seed)
{
	if(!is_user_alive(id))
		return
	if(!Get_BitVar(g_Had_Weapon, id) || get_user_weapon(id) != CSW_SUPERSHORTY)
		return
}

public fw_TraceAttack_World(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits)
{
	if(!is_user_connected(Attacker))
		return HAM_IGNORED	
	if(get_user_weapon(Attacker) != CSW_SUPERSHORTY || !Get_BitVar(g_Had_Weapon, Attacker))
		return HAM_IGNORED
		
	static Float:flEnd[3], Float:vecPlane[3]
	
	get_tr2(Ptr, TR_vecEndPos, flEnd)
	get_tr2(Ptr, TR_vecPlaneNormal, vecPlane)		
		
	Make_BulletHole(Attacker, flEnd, Damage)
	Make_BulletSmoke(Attacker, Ptr)

	SetHamParamFloat(3, float(DAMAGE))
	
	return HAM_IGNORED
}

public fw_TraceAttack_Player(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits)
{
	if(!is_user_connected(Attacker))
		return HAM_IGNORED	
	if(get_user_weapon(Attacker) != CSW_SUPERSHORTY || !Get_BitVar(g_Had_Weapon, Attacker))
		return HAM_IGNORED
		
	SetHamParamFloat(3, float(DAMAGE))

	return HAM_IGNORED
}

public fw_Weapon_PrimaryAttack(Ent)
{
	static id; id = pev(Ent, pev_owner)
	pev(id, pev_punchangle, g_Recoil[id])
	
	return HAM_IGNORED
}

public fw_Weapon_PrimaryAttack_Post(Ent)
{
	static id; id = pev(Ent, pev_owner)
	
	if(Get_BitVar(g_Had_Weapon, id))
	{
		static Float:Push[3]
		pev(id, pev_punchangle, Push)
		xs_vec_sub(Push, g_Recoil[id], Push)
		
		xs_vec_mul_scalar(Push, RECOIL, Push)
		xs_vec_add(Push, g_Recoil[id], Push)
		set_pev(id, pev_punchangle, Push)
	}
}

public fw_Item_AddToPlayer_Post(ent, id)
{
	if(!pev_valid(ent))
		return HAM_IGNORED
		
	if(pev(ent, pev_impulse) == WEAPON_SECRETCODE)
	{
		Set_BitVar(g_Had_Weapon, id)
		set_pev(ent, pev_impulse, 0)
	}		

	message_begin( MSG_ONE, MsgIndexWeaponList, .player = id);
	write_string(g_Had_Weapon ? "weapon_supershorty" : "weapon_m3"); // WeaponName  
	write_byte(5);		// PrimaryAmmoID
	write_byte(BPAMMO);	// PrimaryAmmoMaxAmount  
	write_byte(-1);		// SecondaryAmmoID  
	write_byte(-1);		// SecondaryAmmoMaxAmount  
	write_byte(0);		// SlotID (0...N)  
	write_byte(5);		// NumberInSlot (1...N)  
	write_byte(g_Had_Weapon ? CSW_SUPERSHORTY : CSW_M3); // WeaponID  
	write_byte(0);		// Flags  
	message_end();
	
	return HAM_HANDLED	
}

public OnWeaponReload(pWeapon)
{
    new pPlayer = get_pdata_cbase(pWeapon, m_pPlayer, 4);
    
    if (!Get_BitVar(g_Had_Weapon, pPlayer))
        return HAM_IGNORED;
    
    new iClip = cs_get_weapon_ammo(pWeapon);
    
    if (iClip >= CLIP)
        return HAM_SUPERCEDE;
        
    new iAmmoIndex = ExecuteHamB(Ham_Item_PrimaryAmmoIndex, pWeapon);
    new rgAmmo = get_pdata_int(pPlayer, m_rgPlayerAmmoSlot + iAmmoIndex);
    
    if (rgAmmo <= 0)
        return HAM_SUPERCEDE;
        
    if (get_pdata_float(pWeapon, m_flNextPrimaryAttack, 4) > 0.0)
        return HAM_SUPERCEDE;
        
    switch (get_pdata_int(pWeapon, m_fInSpecialReload, 4))
    {
        case 0:
        {
            set_weapon_anim(pPlayer, RELOAD_START);
            set_pdata_int(pWeapon, m_fInSpecialReload, 1, 4);
            set_pdata_float(pPlayer, m_flNextAttack, 0.6);        //this control reload speed
            set_pdata_float(pWeapon, m_flTimeWeaponIdle, 0.6, 4);    //this one too
            set_pdata_float(pWeapon, m_flNextPrimaryAttack, 1.0, 4);
            return HAM_SUPERCEDE;
        }
        case 1:
        {
            if (get_pdata_float(pWeapon, m_flTimeWeaponIdle, 4) > 0.0)
                return HAM_SUPERCEDE;
                
            set_pdata_int(pWeapon, m_fInSpecialReload, 2, 4);
            //Play "shell insert" sound here if you want
            set_weapon_anim(pPlayer, RELOAD_INSERT);
            set_pdata_float(pWeapon, m_flTimeWeaponIdle, 0.5, 4);
        }
        case 2:
        {
            cs_set_weapon_ammo(pWeapon, ++iClip);
            set_pdata_int(pPlayer, m_rgPlayerAmmoSlot + iAmmoIndex, --rgAmmo);
            set_pdata_int(pWeapon, m_fInSpecialReload, 1, 4);
        }
    }
    
    return HAM_SUPERCEDE;    
}

public OnWeaponIdle(pWeapon)
{
    if (get_pdata_float(pWeapon, m_flTimeWeaponIdle, 4) > 0.0)
        return HAM_IGNORED;
        
    new pPlayer = get_pdata_cbase(pWeapon, m_pPlayer, 4);
 
    if (!Get_BitVar(g_Had_Weapon, pPlayer))
        return HAM_IGNORED;

    new iClip = cs_get_weapon_ammo(pWeapon);
    new fInSpecialReload = get_pdata_int(pWeapon, m_fInSpecialReload, 4);
    new rgAmmo = get_pdata_int(pPlayer, m_rgPlayerAmmoSlot + 

ExecuteHamB(Ham_Item_PrimaryAmmoIndex, pWeapon));
    
    if (iClip == 0 && fInSpecialReload == 0 && rgAmmo > 0)
    {
        OnWeaponReload(pWeapon);
        return HAM_SUPERCEDE;
    }
    else if (fInSpecialReload != 0)
    {
        if (iClip != CLIP && rgAmmo > 0)
        {
            OnWeaponReload(pWeapon);
        }
        else
        {
            set_weapon_anim(pPlayer, RELOAD_END);
            //play reload end sound here if you need
            set_pdata_int(pWeapon, m_fInSpecialReload, 0, 4);
            set_pdata_float(pWeapon, m_flTimeWeaponIdle, 1.5, 4);
        }
        
        return HAM_SUPERCEDE;
    }
    
    return HAM_IGNORED;
}  

stock Make_BulletHole(id, Float:Origin[3], Float:Damage)
{
	// Find target
	static Decal; Decal = random_num(41, 45)
	static LoopTime; 
	
	if(Damage > 100.0) LoopTime = 2
	else LoopTime = 1
	
	for(new i = 0; i < LoopTime; i++)
	{
		// Put decal on "world" (a wall)
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_WORLDDECAL)
		engfunc(EngFunc_WriteCoord, Origin[0])
		engfunc(EngFunc_WriteCoord, Origin[1])
		engfunc(EngFunc_WriteCoord, Origin[2])
		write_byte(Decal)
		message_end()
		
		// Show sparcles
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_GUNSHOTDECAL)
		engfunc(EngFunc_WriteCoord, Origin[0])
		engfunc(EngFunc_WriteCoord, Origin[1])
		engfunc(EngFunc_WriteCoord, Origin[2])
		write_short(id)
		write_byte(Decal)
		message_end()
	}
}

public Make_BulletSmoke(id, TrResult)
{
	static Float:vecSrc[3], Float:vecEnd[3], TE_FLAG
	
	get_weapon_attachment(id, vecSrc)
	global_get(glb_v_forward, vecEnd)
    
	xs_vec_mul_scalar(vecEnd, 8192.0, vecEnd)
	xs_vec_add(vecSrc, vecEnd, vecEnd)

	get_tr2(TrResult, TR_vecEndPos, vecSrc)
	get_tr2(TrResult, TR_vecPlaneNormal, vecEnd)
    
	xs_vec_mul_scalar(vecEnd, 2.5, vecEnd)
	xs_vec_add(vecSrc, vecEnd, vecEnd)
    
	TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
	TE_FLAG |= TE_EXPLFLAG_NOSOUND
	TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
	
	engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEnd, 0)
	write_byte(TE_EXPLOSION)
	engfunc(EngFunc_WriteCoord, vecEnd[0])
	engfunc(EngFunc_WriteCoord, vecEnd[1])
	engfunc(EngFunc_WriteCoord, vecEnd[2] - 10.0)
	write_short(g_SmokePuff_SprId)
	write_byte(2)
	write_byte(50)
	write_byte(TE_FLAG)
	message_end()
}


stock hook_ent2(ent, Float:VicOrigin[3], Float:speed, Float:multi, type)
{
	static Float:fl_Velocity[3]
	static Float:EntOrigin[3]
	static Float:EntVelocity[3]
	
	pev(ent, pev_velocity, EntVelocity)
	pev(ent, pev_origin, EntOrigin)
	static Float:distance_f
	distance_f = get_distance_f(EntOrigin, VicOrigin)
	
	static Float:fl_Time; fl_Time = distance_f / speed
	static Float:fl_Time2; fl_Time2 = distance_f / (speed * multi)
	
	if(type == 1)
	{
		fl_Velocity[0] = ((VicOrigin[0] - EntOrigin[0]) / fl_Time2) * 1.5
		fl_Velocity[1] = ((VicOrigin[1] - EntOrigin[1]) / fl_Time2) * 1.5
		fl_Velocity[2] = (VicOrigin[2] - EntOrigin[2]) / fl_Time		
	} else if(type == 2) {
		fl_Velocity[0] = ((EntOrigin[0] - VicOrigin[0]) / fl_Time2) * 1.5
		fl_Velocity[1] = ((EntOrigin[1] - VicOrigin[1]) / fl_Time2) * 1.5
		fl_Velocity[2] = (EntOrigin[2] - VicOrigin[2]) / fl_Time
	}

	xs_vec_add(EntVelocity, fl_Velocity, fl_Velocity)
	set_pev(ent, pev_velocity, fl_Velocity)
}

stock get_weapon_attachment(id, Float:output[3], Float:fDis = 40.0)
{ 
	static Float:vfEnd[3], viEnd[3] 
	get_user_origin(id, viEnd, 3)  
	IVecFVec(viEnd, vfEnd) 
	
	static Float:fOrigin[3], Float:fAngle[3]
	
	pev(id, pev_origin, fOrigin) 
	pev(id, pev_view_ofs, fAngle)
	
	xs_vec_add(fOrigin, fAngle, fOrigin) 
	
	static Float:fAttack[3]
	
	xs_vec_sub(vfEnd, fOrigin, fAttack)
	xs_vec_sub(vfEnd, fOrigin, fAttack) 
	
	static Float:fRate
	
	fRate = fDis / vector_length(fAttack)
	xs_vec_mul_scalar(fAttack, fRate, fAttack)
	
	xs_vec_add(fOrigin, fAttack, output)
}

stock Eject_Shell(id, Shell_ModelIndex, Float:Time) // By Dias
{
	static Ent; Ent = get_pdata_cbase(id, 373, 5)
	if(!pev_valid(Ent))
		return

        set_pdata_int(Ent, 57, Shell_ModelIndex, 4)
        set_pdata_float(id, 111, get_gametime() + Time)
}

stock set_weapon_anim(id, anim)
{
	if(!is_user_alive(id))
		return
	
	set_pev(id, pev_weaponanim, anim)
	
	message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
	write_byte(anim)
	write_byte(pev(id, pev_body))
	message_end()
}

// Get User Money
stock fm_get_user_money(id)
{
	return get_pdata_int(id, OFFSET_CSMONEY);
}

// Set User Money
stock fm_set_user_money(id, amount)
{
	set_pdata_int(id, OFFSET_CSMONEY, amount);
}

// Returns whether user is in a buyzone
stock fm_get_user_buyzone(id)
{
	if (get_pdata_int(id, OFFSET_MAPZONE) & PLAYER_IN_BUYZONE)
		return 1;
	
	return 0;
}

// Get User Team
stock fm_get_user_team(id)
{
	return get_pdata_int(id, OFFSET_CSTEAMS);
}
// Drop primary/secondary weapons
stock drop_weapons(id, dropwhat)
{
	// Get user weapons
	static weapons[32], num, i, weaponid
	num = 0 // reset passed weapons count (bugfix)
	get_user_weapons(id, weapons, num)
	
	// Loop through them and drop primaries or secondaries
	for (i = 0; i < num; i++)
	{
		// Prevent re-indexing the array
		weaponid = weapons[i]
		
		if ((dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM)) || (dropwhat == 2 && ((1<<weaponid) & SECONDARY_WEAPONS_BIT_SUM)))
		{
			// Get weapon entity
			static wname[32]
			get_weaponname(weaponid, wname, charsmax(wname))

			// Player drops the weapon and looses his bpammo
			engclient_cmd(id, "drop", wname)
			cs_set_user_bpammo(id, weaponid, 0)
		}
	}
}
hellmonja is offline
NiHiLaNTh
Way Past Expiration
Join Date: May 2009
Location: Latvia
Old 11-28-2015 , 13:49   Re: How to Code Shotgun Reload for CS
Reply With Quote #17

If you cant get your weapon, than probably you have some problems with the plugin. Type amxx plugins and also check console for any problems when you start the server.
__________________

NiHiLaNTh is offline
Send a message via Skype™ to NiHiLaNTh
hellmonja
Senior Member
Join Date: Oct 2015
Old 11-28-2015 , 14:11   Re: How to Code Shotgun Reload for CS
Reply With Quote #18

Quote:
Originally Posted by NiHiLaNTh View Post
If you cant get your weapon, than probably you have some problems with the plugin. Type amxx plugins and also check console for any problems when you start the server.
ok I've typed "amxx plugins" and it says the plugin is running

Code:
[ 21] Serbu Super Shorty      1.0         Sneaky.amxx, MeR  AP\ap-supershor  running
I've checked the console and so far the only errors I see relating to the plugin is some missing sound files and the "sprites\weapon_supershorty". But this is to be expected. I do the HUD sprites for all my weapons last after I play-tested them several times and fixed everything.

I even disabled my Sawed-off coz, like the Super Shorty, is also based on the M3 but still no console command.

This is a really weird problem...
hellmonja is offline
NiHiLaNTh
Way Past Expiration
Join Date: May 2009
Location: Latvia
Old 11-28-2015 , 16:30   Re: How to Code Shotgun Reload for CS
Reply With Quote #19

Code:
L 11/28/2015 - 23:29:57: [HAMSANDWICH] Failed to retrieve classtype for "weapon_supershorty", hook for "OnWeaponReload" not active.
L 11/28/2015 - 23:29:57: [AMXX] Displaying debug trace (plugin "ss.amxx")
L 11/28/2015 - 23:29:57: [AMXX] Run time error 10: native error (native "RegisterHam")
L 11/28/2015 - 23:29:57: [AMXX]    [0] ss.sma::plugin_init (line 84)
well, here's your problem.
__________________

NiHiLaNTh is offline
Send a message via Skype™ to NiHiLaNTh
hellmonja
Senior Member
Join Date: Oct 2015
Old 12-12-2015 , 11:38   Re: How to Code Shotgun Reload for CS
Reply With Quote #20

hey it worked! i should've scrolled waaaay up to see the error. anyway the error was in this line

PHP Code:
    RegisterHam(Ham_Weapon_Reload"weapon_supershorty""OnWeaponReload");
    
RegisterHam(Ham_Weapon_WeaponIdle"weapon_supershorty""OnWeaponIdle"
i just removed the quotation marks and it worked. Also thanks for the notes on how to adjust reload speed. Since it's only a 3-shell capacity shotgun, I made it reload very fast to balance it out. Now its fun using it. Anyway, thanks guys!...
hellmonja is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 22:00.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode