Available plasma gun

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

plasma gun

#1

Post by czirimbolo » 5 years ago

hey can someone block damaging zombies in freeze time by this weapon?

Code: Select all

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


#define PLUGIN "[CSO] PlasmaGun"
#define VERSION "1.0"
#define AUTHOR "Dias Leon"

// ================= Config =================
// ZP Config
#define COST 30

// Level 1 Config
#define V_MODEL "models/zombie_escape/v_plasmagun2.mdl"
#define P_MODEL "models/zombie_escape/p_plasmagun.mdl"
#define W_MODEL "models/zombie_escape/w_plasmagun.mdl" 

new const WeaponSounds[7][] =
{
	"weapons/plasmagun-1.wav",
	"weapons/plasmagun_exp.wav",
	"weapons/plasmagun_idle.wav",
	"weapons/plasmagun_draw.wav",
	"weapons/plasmagun_clipin1.wav",
	"weapons/plasmagun_clipin2.wav",
	"weapons/plasmagun_clipout.wav"
}

new const WeaponResources[3][] =
{
	"sprites/weapon_plasmagun.txt",
	"sprites/640hud3_2.spr",
	"sprites/640hud91_2.spr"
}

new const WeaponFiles[2][] =
{
	"sprites/plasmaball.spr",
	"sprites/plasmabomb.spr"
}

new const MuzzleFlash[] = "sprites/muzzleflash27.spr"

// Level 2 Config
#define DAMAGE 86
#define CLIP 45
#define BPAMMO 250
#define SPEED 1.5
#define RECOIL 0.75

#define PLASMA_SPEED 1000.0
#define PLASMA_RADIUS 100.0

// Level 3 Config
#define CSW_PLASMA CSW_AK47
#define weapon_plasma "weapon_ak47"

#define WEAPON_EVENT "events/ak47.sc"
#define WEAPON_ANIMEXT "carbine"
#define WEAPON_OLD_WMODEL "models/w_ak47.mdl"
#define WEAPON_SECRETCODE 1946

#define WEAPONANIM_SHOOT random_num(3, 5)
#define WEAPONANIM_RELOAD 1

#define WEAPONTIME_DRAW 0.75
#define WEAPONTIME_RELOAD 3.5

// Level 4 Config
#define PLASMABALL_CLASSNAME "plasmaball"
// ============== End of Config ==============

// 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))

enum
{
	TEAM_T = 1,
	TEAM_CT
}

// Vars
new g_iItemID 
new g_Had_Plasma, g_WeaponClip[33], Float:g_WeaponRecoil[33][3]
new g_Msg_WeaponList, g_Msg_CurWeapon, g_Msg_AmmoX
new g_MuzzleFlash_SprId, g_PlasmaExp_SprId, g_weapon_event, g_HamBot, g_MaxPlayers

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)

	register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
	g_iItemID = ze_register_item("PLasma Gun", 50, 0) 
	
	register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)	
	register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")	
	register_forward(FM_SetModel, "fw_SetModel")		
	
	register_think(PLASMABALL_CLASSNAME, "fw_Think_Plasma")
	register_touch(PLASMABALL_CLASSNAME, "*", "fw_Touch_Plasma")
	
	RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack_World")
	RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Player")	
	RegisterHam(Ham_Weapon_PrimaryAttack, weapon_plasma, "fw_Weapon_PrimaryAttack")
	RegisterHam(Ham_Weapon_PrimaryAttack, weapon_plasma, "fw_Weapon_PrimaryAttack_Post", 1)
	RegisterHam(Ham_Item_Deploy, weapon_plasma, "fw_Item_Deploy_Post", 1)
	RegisterHam(Ham_Item_PostFrame, weapon_plasma, "fw_Item_PostFrame")	
	RegisterHam(Ham_Weapon_Reload, weapon_plasma, "fw_Weapon_Reload")
	RegisterHam(Ham_Weapon_Reload, weapon_plasma, "fw_Weapon_Reload_Post", 1)
	RegisterHam(Ham_Item_AddToPlayer, weapon_plasma, "fw_Item_AddToPlayer_Post", 1)
	
	g_Msg_WeaponList = get_user_msgid("WeaponList")
	g_Msg_CurWeapon = get_user_msgid("CurWeapon")
	g_Msg_AmmoX = get_user_msgid("AmmoX")
	g_MaxPlayers = get_maxplayers()
	
	//register_clcmd("admin_get_plasmagun", "Get_Plasma", ADMIN_KICK)
	register_clcmd("weapon_plasmagun", "Hook_WeaponHud")
}

public plugin_precache()
{
	engfunc(EngFunc_PrecacheModel, V_MODEL)
	engfunc(EngFunc_PrecacheModel, P_MODEL)
	engfunc(EngFunc_PrecacheModel, W_MODEL)
	
	new i
	for(i = 0; i < sizeof(WeaponSounds); i++)
		engfunc(EngFunc_PrecacheSound, WeaponSounds[i])
	for(i = 0; i < sizeof(WeaponResources); i++)
	{
		if(i == 0) engfunc(EngFunc_PrecacheGeneric, WeaponResources[i])
		else engfunc(EngFunc_PrecacheModel, WeaponResources[i])
	}
	for(i = 0; i < sizeof(WeaponFiles); i++)
	{
		if(i == 1) g_PlasmaExp_SprId = engfunc(EngFunc_PrecacheModel, WeaponFiles[i])
		else engfunc(EngFunc_PrecacheModel, WeaponFiles[i])
	}
		
	g_MuzzleFlash_SprId = engfunc(EngFunc_PrecacheModel, MuzzleFlash)
	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 ze_user_infected(id) Remove_Plasma(id)
public ze_user_humanized(id) Remove_Plasma(id)

public ze_select_item_pre(id, itemid)
{
    // This not our item?
    if (itemid != g_iItemID)
        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
   
    // Finally return that it's available
    return ZE_ITEM_AVAILABLE
}  

public ze_select_item_post(id, itemid)
{
    // This is not our item, Block it here and don't execute the blew code
    if (itemid != g_iItemID)
        return
	
    Get_Plasma(id)        
}

public Get_Plasma(id)
{
	if(!is_user_alive(id))
		return
		
	Set_BitVar(g_Had_Plasma, id)
	fm_give_item(id, weapon_plasma)
	
	// Set Weapon
	engclient_cmd(id, weapon_plasma)
	
	set_pev(id, pev_viewmodel2, V_MODEL)
	set_pev(id, pev_weaponmodel2, P_MODEL)
	
	set_pdata_string(id, (492) * 4, WEAPON_ANIMEXT, -1 , 20)	
	
	// Set Weapon Base
	static Ent; Ent = fm_get_user_weapon_entity(id, CSW_PLASMA)
	if(!pev_valid(Ent)) return
	
	cs_set_weapon_ammo(Ent, CLIP)
	cs_set_user_bpammo(id, CSW_PLASMA, BPAMMO)
	
	Update_AmmoHud(id, CSW_PLASMA, CLIP, BPAMMO)
}

public Remove_Plasma(id)
{
	UnSet_BitVar(g_Had_Plasma, id)
}

public Hook_WeaponHud(id)
{
	engclient_cmd(id, weapon_plasma)
	return PLUGIN_HANDLED
}

public Event_NewRound() remove_entity_name(PLASMABALL_CLASSNAME)

public fw_Think_Plasma(Ent)
{
	if(!pev_valid(Ent))
		return
		
	static Float:RenderAmt; pev(Ent, pev_renderamt, RenderAmt)
	
	RenderAmt += 50.0
	RenderAmt = float(clamp(floatround(RenderAmt), 0, 255))
	
	set_pev(Ent, pev_renderamt, RenderAmt)
	set_pev(Ent, pev_nextthink, halflife_time() + 0.1)
}

public fw_Touch_Plasma(Ent, Id)
{
	if(!pev_valid(Ent))
		return
	if(pev(Ent, pev_movetype) == MOVETYPE_NONE)
		return
		
	// Exp Sprite
	static Float:Origin[3], TE_FLAG
	pev(Ent, pev_origin, Origin)
	
	TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
	TE_FLAG |= TE_EXPLFLAG_NOSOUND
	TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
	
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_EXPLOSION)
	engfunc(EngFunc_WriteCoord, Origin[0])
	engfunc(EngFunc_WriteCoord, Origin[1])
	engfunc(EngFunc_WriteCoord, Origin[2])
	write_short(g_PlasmaExp_SprId)
	write_byte(7)
	write_byte(30)
	write_byte(TE_FLAG)
	message_end()	
	
	// Exp Sound
	emit_sound(Ent, CHAN_BODY, WeaponSounds[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
	
	// Damage
	Damage_Plasma(Ent, Id)
	
	// Remove Ent
	set_pev(Ent, pev_movetype, MOVETYPE_NONE)
	set_task(0.1, "Remove_PlasmaBall", Ent)
}

public Damage_Plasma(Ent, Id)
{
	static Owner; Owner = pev(Ent, pev_iuser1)
	static Attacker; 
	if(!is_user_alive(Owner)) 
	{
		Attacker = 0
		return
	} else Attacker = Owner
	
	if(is_user_alive(Id) && ze_is_user_zombie(Id))
		ExecuteHamB(Ham_TakeDamage, Id, 0, Attacker, float(DAMAGE), DMG_ACID)
	
	for(new i = 0; i < g_MaxPlayers; i++)
	{
		if(!is_user_alive(i))
			continue
		if(entity_range(i, Ent) > PLASMA_RADIUS)
			continue
		if(!ze_is_user_zombie(i)) 
			continue
			
		ExecuteHamB(Ham_TakeDamage, i, 0, Attacker, float(DAMAGE) / random_float(1.25, 1.5), DMG_ACID)
	}
}

public Remove_PlasmaBall(Ent)
{
	if(!pev_valid(Ent)) return
	engfunc(EngFunc_RemoveEntity, Ent)
}

public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
{
	if(!is_user_alive(id))
		return FMRES_IGNORED	
	if(get_user_weapon(id) == CSW_PLASMA && Get_BitVar(g_Had_Plasma, 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_PLASMA || !Get_BitVar(g_Had_Plasma, 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)
	
	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, WEAPON_OLD_WMODEL))
	{
		static weapon; weapon = fm_find_ent_by_owner(-1, weapon_plasma, entity)
		
		if(!pev_valid(weapon))
			return FMRES_IGNORED;
		
		if(Get_BitVar(g_Had_Plasma, iOwner))
		{
			Remove_Plasma(iOwner)
			
			set_pev(weapon, pev_impulse, WEAPON_SECRETCODE)
			engfunc(EngFunc_SetModel, entity, W_MODEL)
			
			return FMRES_SUPERCEDE
		}
	}

	return FMRES_IGNORED;
}

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_PLASMA || !Get_BitVar(g_Had_Plasma, Attacker))
		return HAM_IGNORED
	
	return HAM_SUPERCEDE
}

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_PLASMA || !Get_BitVar(g_Had_Plasma, Attacker))
		return HAM_IGNORED
		
	return HAM_SUPERCEDE
}

public fw_Weapon_PrimaryAttack(Ent)
{
	if(!pev_valid(Ent))
		return
		
	static Id; Id = pev(Ent, pev_owner)
	if(!Get_BitVar(g_Had_Plasma, Id))
		return
	static Ammo; Ammo = cs_get_weapon_ammo(Ent)
	if(Ammo <= 0) return

	// Weapon Shoot
	Set_Weapon_Anim(Id, WEAPONANIM_SHOOT)
	emit_sound(Id, CHAN_WEAPON, WeaponSounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
	
	// MuzzleFlash & Effect
	Make_Muzzleflash(Id)
	
	// Create Plasma Effect
	Create_PlasmaBall(Id)
	
	// Speed & Recoil
	pev(Ent, pev_punchangle, g_WeaponRecoil[Id])
}

public fw_Weapon_PrimaryAttack_Post(Ent)
{
	if(!pev_valid(Ent))
		return
		
	static Id; Id = pev(Ent, pev_owner)
	if(!Get_BitVar(g_Had_Plasma, Id))
		return
	static Ammo; Ammo = cs_get_weapon_ammo(Ent)
	if(Ammo <= 0) return
	
	// Speed & Recoil
	set_pdata_float(Ent, 46, get_pdata_float(Ent, 46, 4) * SPEED, 4)
	
	static Float:Push[3]; pev(Id, pev_punchangle, Push)
	
	xs_vec_sub(Push, g_WeaponRecoil[Id], Push)
	xs_vec_mul_scalar(Push, RECOIL, Push)
	xs_vec_add(Push,  g_WeaponRecoil[Id], Push)

	set_pev(Id, pev_punchangle, Push)
}

public fw_Item_Deploy_Post(Ent)
{
	if(!pev_valid(Ent))
		return
		
	static Id; Id = pev(Ent, pev_owner)
	if(!Get_BitVar(g_Had_Plasma, Id))
		return
		
	set_pev(Id, pev_viewmodel2, V_MODEL)
	set_pev(Id, pev_weaponmodel2, P_MODEL)
	
	set_pdata_string(Id, (492) * 4, WEAPON_ANIMEXT, -1 , 20)
	
	// Set Draw
	Set_Player_NextAttack(Id, WEAPONTIME_DRAW)
	Set_Weapon_TimeIdle(Id, CSW_PLASMA, WEAPONTIME_DRAW)
}

public fw_Item_PostFrame(Ent)
{
	if(!pev_valid(Ent))
		return
		
	static Id; Id = pev(Ent, pev_owner)
	if(!Get_BitVar(g_Had_Plasma, Id))
		return
	
	static Float:flNextAttack; flNextAttack = get_pdata_float(Id, 83, 5)
	static bpammo; bpammo = cs_get_user_bpammo(Id, CSW_PLASMA)
	static iClip; iClip = get_pdata_int(Ent, 51, 4)

	if(get_pdata_int(Ent, 54, 4) && flNextAttack <= 0.0)
	{
		static temp1; temp1 = min(CLIP - iClip, bpammo)

		set_pdata_int(Ent, 51, iClip + temp1, 4)
		cs_set_user_bpammo(Id, CSW_PLASMA, bpammo - temp1)		
		
		set_pdata_int(Ent, 54, 0, 4)
	}		
}

public fw_Weapon_Reload(Ent)
{
	if(!pev_valid(Ent))
		return HAM_IGNORED
		
	static Id; Id = pev(Ent, pev_owner)
	if(!Get_BitVar(g_Had_Plasma, Id))
		return HAM_IGNORED
		
	g_WeaponClip[Id] = -1
	
	static bpammo; bpammo = cs_get_user_bpammo(Id, CSW_PLASMA)
	static iClip; iClip = get_pdata_int(Ent, 51, 4)
	
	if(bpammo <= 0) return HAM_SUPERCEDE
	if(iClip >= CLIP) return HAM_SUPERCEDE
		
	g_WeaponClip[Id] = iClip
	return HAM_IGNORED
}

public fw_Weapon_Reload_Post(Ent)
{
	if(!pev_valid(Ent))
		return
		
	static Id; Id = pev(Ent, pev_owner)
	if(!Get_BitVar(g_Had_Plasma, Id))
		return
	if(g_WeaponClip[Id] == -1)
		return
	
	set_pdata_int(Ent, 51, g_WeaponClip[Id], 4)
	set_pdata_int(Ent, 54, 1, 4)
	
	Set_Weapon_Anim(Id, WEAPONANIM_RELOAD)
	set_pdata_float(Id, 83, WEAPONTIME_RELOAD, 5)
}

public fw_Item_AddToPlayer_Post(Ent, Id)
{
	if(!pev_valid(Ent))
		return
		
	if(pev(Ent, pev_impulse) == WEAPON_SECRETCODE)
	{
		Set_BitVar(g_Had_Plasma, Id)
		set_pev(Ent, pev_impulse, 0)
		
		set_task(0.01, "AddToPlayer_Delay", Id)
	}		

	message_begin(MSG_ONE_UNRELIABLE, g_Msg_WeaponList, _, Id)
	write_string(Get_BitVar(g_Had_Plasma, Id) ? "weapon_plasmagun" : "weapon_ak47")
	write_byte(2)
	write_byte(Get_BitVar(g_Had_Plasma, Id) ? 200 : 90)
	write_byte(-1)
	write_byte(-1)
	write_byte(0)
	write_byte(1)
	write_byte(Get_BitVar(g_Had_Plasma, Id) ? CSW_PLASMA : CSW_AK47)
	write_byte(0)
	message_end()			
	
	return
}

public AddToPlayer_Delay(Id)
{
	set_pev(Id, pev_viewmodel2, V_MODEL)
	set_pev(Id, pev_weaponmodel2, P_MODEL)
	
	set_pdata_string(Id, (492) * 4, WEAPON_ANIMEXT, -1 , 20)	
}
		
public Create_PlasmaBall(id)
{
	static Float:StartOrigin[3], Float:TargetOrigin[3], Float:MyVelocity[3], Float:VecLength
	
	get_position(id, 48.0, 10.0, -5.0, StartOrigin)
	get_position(id, 1024.0, 0.0, 0.0, TargetOrigin)
	
	pev(id, pev_velocity, MyVelocity)
	VecLength = vector_length(MyVelocity)
	
	if(VecLength) 
	{
		TargetOrigin[0] += random_float(-16.0, 16.0); TargetOrigin[1] += random_float(-16.0, 16.0); TargetOrigin[2] += random_float(-16.0, 16.0)
	} else {
		TargetOrigin[0] += random_float(-8.0, 8.0); TargetOrigin[1] += random_float(-8.0, 8.0); TargetOrigin[2] += random_float(-8.0, 8.0)
	}
	
	static Ent; Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_sprite"))
	if(!pev_valid(Ent)) return
	
	// Set info for ent
	set_pev(Ent, pev_movetype, MOVETYPE_FLY)
	set_pev(Ent, pev_rendermode, kRenderTransAdd)
	set_pev(Ent, pev_renderamt, 10.0)
	set_pev(Ent, pev_iuser1, id) // Better than pev_owner
	set_pev(Ent, pev_iuser2, Get_SpecialTeam(id, cs_get_user_team(id)))
	set_pev(Ent, pev_fuser1, get_gametime() + 3.0)
	set_pev(Ent, pev_scale, random_float(0.1, 0.25))
	set_pev(Ent, pev_nextthink, halflife_time() + 0.1)
	
	entity_set_string(Ent, EV_SZ_classname, PLASMABALL_CLASSNAME)
	engfunc(EngFunc_SetModel, Ent, WeaponFiles[0])
	set_pev(Ent, pev_mins, Float:{-1.0, -1.0, -1.0})
	set_pev(Ent, pev_maxs, Float:{1.0, 1.0, 1.0})
	set_pev(Ent, pev_origin, StartOrigin)
	set_pev(Ent, pev_gravity, 0.01)
	set_pev(Ent, pev_solid, SOLID_TRIGGER)
	set_pev(Ent, pev_frame, 0.0)
	
	static Float:Velocity[3]
	get_speed_vector(StartOrigin, TargetOrigin, PLASMA_SPEED, Velocity)
	set_pev(Ent, pev_velocity, Velocity)
}

public Make_Muzzleflash(id)
{
	static Float:Origin[3], TE_FLAG
	get_position(id, 32.0, 6.0, -15.0, Origin)
	
	TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
	TE_FLAG |= TE_EXPLFLAG_NOSOUND
	TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
	
	engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, Origin, id)
	write_byte(TE_EXPLOSION)
	engfunc(EngFunc_WriteCoord, Origin[0])
	engfunc(EngFunc_WriteCoord, Origin[1])
	engfunc(EngFunc_WriteCoord, Origin[2])
	write_short(g_MuzzleFlash_SprId)
	write_byte(2)
	write_byte(30)
	write_byte(TE_FLAG)
	message_end()
}

public Update_AmmoHud(id, CSWID, Ammo, BpAmmo)
{
	message_begin(MSG_ONE_UNRELIABLE, g_Msg_CurWeapon, _, id)
	write_byte(1)
	write_byte(CSWID)
	write_byte(Ammo)
	message_end()
	
	message_begin(MSG_ONE_UNRELIABLE, g_Msg_AmmoX, _, id)
	write_byte(10)
	write_byte(BpAmmo)
	message_end()
}

public Get_SpecialTeam(Ent, CsTeams:Team)
{
	if(Team == CS_TEAM_T) return TEAM_T
	else if(Team == CS_TEAM_CT) return TEAM_CT
	
	return 0
}

public CsTeams:Get_PlasmaTeam(Ent)
{
	if(pev(Ent, pev_iuser2) == TEAM_T) return CS_TEAM_T
	else if(pev(Ent, pev_iuser2) == TEAM_CT) return CS_TEAM_CT
	
	return CS_TEAM_UNASSIGNED
}

stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
{
	new_velocity[0] = origin2[0] - origin1[0]
	new_velocity[1] = origin2[1] - origin1[1]
	new_velocity[2] = origin2[2] - origin1[2]
	static Float:num; num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
	new_velocity[0] *= num
	new_velocity[1] *= num
	new_velocity[2] *= num
	
	return 1;
}

stock Set_Weapon_TimeIdle(id, WeaponId, Float:TimeIdle)
{
	static Ent; Ent = fm_get_user_weapon_entity(id, WeaponId)
	if(!pev_valid(Ent)) return
		
	set_pdata_float(Ent, 46, TimeIdle, 4)
	set_pdata_float(Ent, 47, TimeIdle, 4)
	set_pdata_float(Ent, 48, TimeIdle + 0.5, 4)
}

stock Set_Player_NextAttack(id, Float:nexttime)
{
	set_pdata_float(id, 83, nexttime, 5)
}

stock Set_Weapon_Anim(id, WeaponAnim)
{
	set_pev(id, pev_weaponanim, WeaponAnim)
	
	message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
	write_byte(WeaponAnim)
	write_byte(pev(id, pev_body))
	message_end()
}

stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
{
	static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
	
	pev(id, pev_origin, vOrigin)
	pev(id, pev_view_ofs, vUp) //for player
	xs_vec_add(vOrigin, vUp, vOrigin)
	pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
	
	angle_vector(vAngle, ANGLEVECTOR_FORWARD, vForward) //or use EngFunc_AngleVectors
	angle_vector(vAngle, ANGLEVECTOR_RIGHT, vRight)
	angle_vector(vAngle, ANGLEVECTOR_UP, vUp)
	
	vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
	vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
	vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
}
Image

User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#2

Post by Night Fury » 5 years ago

  1. #include <zombie_escape>
  2. #include <fakemeta_util>
  3. #include <cstrike>
  4. #include <engine>
  5.  
  6.  
  7. #define PLUGIN "[CSO] PlasmaGun"
  8. #define VERSION "1.0"
  9. #define AUTHOR "Dias Leon"
  10.  
  11. // ================= Config =================
  12. // ZP Config
  13. #define COST 30
  14.  
  15. // Level 1 Config
  16. #define V_MODEL "models/zombie_escape/v_plasmagun2.mdl"
  17. #define P_MODEL "models/zombie_escape/p_plasmagun.mdl"
  18. #define W_MODEL "models/zombie_escape/w_plasmagun.mdl"
  19.  
  20. new const WeaponSounds[7][] =
  21. {
  22.     "weapons/plasmagun-1.wav",
  23.     "weapons/plasmagun_exp.wav",
  24.     "weapons/plasmagun_idle.wav",
  25.     "weapons/plasmagun_draw.wav",
  26.     "weapons/plasmagun_clipin1.wav",
  27.     "weapons/plasmagun_clipin2.wav",
  28.     "weapons/plasmagun_clipout.wav"
  29. }
  30.  
  31. new const WeaponResources[3][] =
  32. {
  33.     "sprites/weapon_plasmagun.txt",
  34.     "sprites/640hud3_2.spr",
  35.     "sprites/640hud91_2.spr"
  36. }
  37.  
  38. new const WeaponFiles[2][] =
  39. {
  40.     "sprites/plasmaball.spr",
  41.     "sprites/plasmabomb.spr"
  42. }
  43.  
  44. new const MuzzleFlash[] = "sprites/muzzleflash27.spr"
  45.  
  46. // Level 2 Config
  47. #define DAMAGE 86
  48. #define CLIP 45
  49. #define BPAMMO 250
  50. #define SPEED 1.5
  51. #define RECOIL 0.75
  52.  
  53. #define PLASMA_SPEED 1000.0
  54. #define PLASMA_RADIUS 100.0
  55.  
  56. // Level 3 Config
  57. #define CSW_PLASMA CSW_AK47
  58. #define weapon_plasma "weapon_ak47"
  59.  
  60. #define WEAPON_EVENT "events/ak47.sc"
  61. #define WEAPON_ANIMEXT "carbine"
  62. #define WEAPON_OLD_WMODEL "models/w_ak47.mdl"
  63. #define WEAPON_SECRETCODE 1946
  64.  
  65. #define WEAPONANIM_SHOOT random_num(3, 5)
  66. #define WEAPONANIM_RELOAD 1
  67.  
  68. #define WEAPONTIME_DRAW 0.75
  69. #define WEAPONTIME_RELOAD 3.5
  70.  
  71. // Level 4 Config
  72. #define PLASMABALL_CLASSNAME "plasmaball"
  73. // ============== End of Config ==============
  74.  
  75. // MACROS
  76. #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
  77. #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
  78. #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
  79.  
  80. enum
  81. {
  82.     TEAM_T = 1,
  83.     TEAM_CT
  84. }
  85.  
  86. // Vars
  87. new g_iItemID, bool:g_bCanDamage
  88. new g_Had_Plasma, g_WeaponClip[33], Float:g_WeaponRecoil[33][3]
  89. new g_Msg_WeaponList, g_Msg_CurWeapon, g_Msg_AmmoX
  90. new g_MuzzleFlash_SprId, g_PlasmaExp_SprId, g_weapon_event, g_HamBot, g_MaxPlayers
  91.  
  92. public plugin_init()
  93. {
  94.     register_plugin(PLUGIN, VERSION, AUTHOR)
  95.  
  96.     register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
  97.     g_iItemID = ze_register_item("PLasma Gun", 50, 0)
  98.    
  99.     register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)   
  100.     register_forward(FM_PlaybackEvent, "fw_PlaybackEvent") 
  101.     register_forward(FM_SetModel, "fw_SetModel")       
  102.    
  103.     register_think(PLASMABALL_CLASSNAME, "fw_Think_Plasma")
  104.     register_touch(PLASMABALL_CLASSNAME, "*", "fw_Touch_Plasma")
  105.    
  106.     RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack_World")
  107.     RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Player")
  108.     RegisterHam(Ham_Weapon_PrimaryAttack, weapon_plasma, "fw_Weapon_PrimaryAttack")
  109.     RegisterHam(Ham_Weapon_PrimaryAttack, weapon_plasma, "fw_Weapon_PrimaryAttack_Post", 1)
  110.     RegisterHam(Ham_Item_Deploy, weapon_plasma, "fw_Item_Deploy_Post", 1)
  111.     RegisterHam(Ham_Item_PostFrame, weapon_plasma, "fw_Item_PostFrame")
  112.     RegisterHam(Ham_Weapon_Reload, weapon_plasma, "fw_Weapon_Reload")
  113.     RegisterHam(Ham_Weapon_Reload, weapon_plasma, "fw_Weapon_Reload_Post", 1)
  114.     RegisterHam(Ham_Item_AddToPlayer, weapon_plasma, "fw_Item_AddToPlayer_Post", 1)
  115.    
  116.     g_Msg_WeaponList = get_user_msgid("WeaponList")
  117.     g_Msg_CurWeapon = get_user_msgid("CurWeapon")
  118.     g_Msg_AmmoX = get_user_msgid("AmmoX")
  119.     g_MaxPlayers = get_maxplayers()
  120.    
  121.     //register_clcmd("admin_get_plasmagun", "Get_Plasma", ADMIN_KICK)
  122.     register_clcmd("weapon_plasmagun", "Hook_WeaponHud")
  123. }
  124.  
  125. public ze_zombie_appear()
  126. {
  127.     g_bCanDamage = false
  128. }
  129.  
  130. public ze_zombie_release()
  131. {
  132.     g_bCanDamage = true
  133. }
  134.  
  135. public plugin_precache()
  136. {
  137.     engfunc(EngFunc_PrecacheModel, V_MODEL)
  138.     engfunc(EngFunc_PrecacheModel, P_MODEL)
  139.     engfunc(EngFunc_PrecacheModel, W_MODEL)
  140.    
  141.     new i
  142.     for(i = 0; i < sizeof(WeaponSounds); i++)
  143.         engfunc(EngFunc_PrecacheSound, WeaponSounds[i])
  144.     for(i = 0; i < sizeof(WeaponResources); i++)
  145.     {
  146.         if(i == 0) engfunc(EngFunc_PrecacheGeneric, WeaponResources[i])
  147.         else engfunc(EngFunc_PrecacheModel, WeaponResources[i])
  148.     }
  149.     for(i = 0; i < sizeof(WeaponFiles); i++)
  150.     {
  151.         if(i == 1) g_PlasmaExp_SprId = engfunc(EngFunc_PrecacheModel, WeaponFiles[i])
  152.         else engfunc(EngFunc_PrecacheModel, WeaponFiles[i])
  153.     }
  154.        
  155.     g_MuzzleFlash_SprId = engfunc(EngFunc_PrecacheModel, MuzzleFlash)
  156.     register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1)
  157. }
  158.  
  159. public fw_PrecacheEvent_Post(type, const name[])
  160. {
  161.     if(equal(WEAPON_EVENT, name)) g_weapon_event = get_orig_retval()       
  162. }
  163.  
  164. public client_putinserver(id)
  165. {
  166.     if(!g_HamBot && is_user_bot(id))
  167.     {
  168.         g_HamBot = 1
  169.         set_task(0.1, "Do_RegisterHam", id)
  170.     }
  171. }
  172.  
  173. public Do_RegisterHam(id)
  174. {
  175.     RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack_Player")
  176. }
  177.  
  178. public ze_user_infected(id) Remove_Plasma(id)
  179. public ze_user_humanized(id) Remove_Plasma(id)
  180.  
  181. public ze_select_item_pre(id, itemid)
  182. {
  183.     // This not our item?
  184.     if (itemid != g_iItemID)
  185.         return ZE_ITEM_AVAILABLE
  186.    
  187.     // Available for Humans only, So don't show it for zombies
  188.     if (ze_is_user_zombie(id))
  189.         return ZE_ITEM_DONT_SHOW
  190.    
  191.     // Finally return that it's available
  192.     return ZE_ITEM_AVAILABLE
  193. }  
  194.  
  195. public ze_select_item_post(id, itemid)
  196. {
  197.     // This is not our item, Block it here and don't execute the blew code
  198.     if (itemid != g_iItemID)
  199.         return
  200.    
  201.     Get_Plasma(id)        
  202. }
  203.  
  204. public Get_Plasma(id)
  205. {
  206.     if(!is_user_alive(id))
  207.         return
  208.        
  209.     Set_BitVar(g_Had_Plasma, id)
  210.     fm_give_item(id, weapon_plasma)
  211.    
  212.     // Set Weapon
  213.     engclient_cmd(id, weapon_plasma)
  214.    
  215.     set_pev(id, pev_viewmodel2, V_MODEL)
  216.     set_pev(id, pev_weaponmodel2, P_MODEL)
  217.    
  218.     set_pdata_string(id, (492) * 4, WEAPON_ANIMEXT, -1 , 20)   
  219.    
  220.     // Set Weapon Base
  221.     static Ent; Ent = fm_get_user_weapon_entity(id, CSW_PLASMA)
  222.     if(!pev_valid(Ent)) return
  223.    
  224.     cs_set_weapon_ammo(Ent, CLIP)
  225.     cs_set_user_bpammo(id, CSW_PLASMA, BPAMMO)
  226.    
  227.     Update_AmmoHud(id, CSW_PLASMA, CLIP, BPAMMO)
  228. }
  229.  
  230. public Remove_Plasma(id)
  231. {
  232.     UnSet_BitVar(g_Had_Plasma, id)
  233. }
  234.  
  235. public Hook_WeaponHud(id)
  236. {
  237.     engclient_cmd(id, weapon_plasma)
  238.     return PLUGIN_HANDLED
  239. }
  240.  
  241. public Event_NewRound() remove_entity_name(PLASMABALL_CLASSNAME)
  242.  
  243. public fw_Think_Plasma(Ent)
  244. {
  245.     if(!pev_valid(Ent))
  246.         return
  247.        
  248.     static Float:RenderAmt; pev(Ent, pev_renderamt, RenderAmt)
  249.    
  250.     RenderAmt += 50.0
  251.     RenderAmt = float(clamp(floatround(RenderAmt), 0, 255))
  252.    
  253.     set_pev(Ent, pev_renderamt, RenderAmt)
  254.     set_pev(Ent, pev_nextthink, halflife_time() + 0.1)
  255. }
  256.  
  257. public fw_Touch_Plasma(Ent, Id)
  258. {
  259.     if(!pev_valid(Ent))
  260.         return
  261.     if(pev(Ent, pev_movetype) == MOVETYPE_NONE)
  262.         return
  263.        
  264.     // Exp Sprite
  265.     static Float:Origin[3], TE_FLAG
  266.     pev(Ent, pev_origin, Origin)
  267.    
  268.     TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
  269.     TE_FLAG |= TE_EXPLFLAG_NOSOUND
  270.     TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
  271.    
  272.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  273.     write_byte(TE_EXPLOSION)
  274.     engfunc(EngFunc_WriteCoord, Origin[0])
  275.     engfunc(EngFunc_WriteCoord, Origin[1])
  276.     engfunc(EngFunc_WriteCoord, Origin[2])
  277.     write_short(g_PlasmaExp_SprId)
  278.     write_byte(7)
  279.     write_byte(30)
  280.     write_byte(TE_FLAG)
  281.     message_end()  
  282.    
  283.     // Exp Sound
  284.     emit_sound(Ent, CHAN_BODY, WeaponSounds[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  285.    
  286.     // Damage
  287.     Damage_Plasma(Ent, Id)
  288.    
  289.     // Remove Ent
  290.     set_pev(Ent, pev_movetype, MOVETYPE_NONE)
  291.     set_task(0.1, "Remove_PlasmaBall", Ent)
  292. }
  293.  
  294. public Damage_Plasma(Ent, Id)
  295. {
  296.     static Owner; Owner = pev(Ent, pev_iuser1)
  297.     static Attacker;
  298.     if(!is_user_alive(Owner))
  299.     {
  300.         Attacker = 0
  301.         return
  302.     } else Attacker = Owner
  303.    
  304.     if(is_user_alive(Id) && ze_is_user_zombie(Id) && g_bCanDamage)
  305.         ExecuteHamB(Ham_TakeDamage, Id, 0, Attacker, float(DAMAGE), DMG_ACID)
  306.    
  307.     for(new i = 0; i < g_MaxPlayers; i++)
  308.     {
  309.         if(!is_user_alive(i))
  310.             continue
  311.         if(entity_range(i, Ent) > PLASMA_RADIUS)
  312.             continue
  313.         if(!ze_is_user_zombie(i) || !g_bCanDamage)
  314.             continue
  315.            
  316.         ExecuteHamB(Ham_TakeDamage, i, 0, Attacker, float(DAMAGE) / random_float(1.25, 1.5), DMG_ACID)
  317.     }
  318. }
  319.  
  320. public Remove_PlasmaBall(Ent)
  321. {
  322.     if(!pev_valid(Ent)) return
  323.     engfunc(EngFunc_RemoveEntity, Ent)
  324. }
  325.  
  326. public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
  327. {
  328.     if(!is_user_alive(id))
  329.         return FMRES_IGNORED   
  330.     if(get_user_weapon(id) == CSW_PLASMA && Get_BitVar(g_Had_Plasma, id))
  331.         set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
  332.    
  333.     return FMRES_HANDLED
  334. }
  335.  
  336. public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
  337. {
  338.     if (!is_user_connected(invoker))
  339.         return FMRES_IGNORED   
  340.     if(get_user_weapon(invoker) != CSW_PLASMA || !Get_BitVar(g_Had_Plasma, invoker))
  341.         return FMRES_IGNORED
  342.     if(eventid != g_weapon_event)
  343.         return FMRES_IGNORED
  344.    
  345.     engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
  346.    
  347.     return FMRES_SUPERCEDE
  348. }
  349.  
  350. public fw_SetModel(entity, model[])
  351. {
  352.     if(!pev_valid(entity))
  353.         return FMRES_IGNORED
  354.    
  355.     static Classname[32]
  356.     pev(entity, pev_classname, Classname, sizeof(Classname))
  357.    
  358.     if(!equal(Classname, "weaponbox"))
  359.         return FMRES_IGNORED
  360.    
  361.     static iOwner
  362.     iOwner = pev(entity, pev_owner)
  363.    
  364.     if(equal(model, WEAPON_OLD_WMODEL))
  365.     {
  366.         static weapon; weapon = fm_find_ent_by_owner(-1, weapon_plasma, entity)
  367.        
  368.         if(!pev_valid(weapon))
  369.             return FMRES_IGNORED;
  370.        
  371.         if(Get_BitVar(g_Had_Plasma, iOwner))
  372.         {
  373.             Remove_Plasma(iOwner)
  374.            
  375.             set_pev(weapon, pev_impulse, WEAPON_SECRETCODE)
  376.             engfunc(EngFunc_SetModel, entity, W_MODEL)
  377.            
  378.             return FMRES_SUPERCEDE
  379.         }
  380.     }
  381.  
  382.     return FMRES_IGNORED;
  383. }
  384.  
  385. public fw_TraceAttack_World(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits)
  386. {
  387.     if(!is_user_connected(Attacker))
  388.         return HAM_IGNORED 
  389.     if(get_user_weapon(Attacker) != CSW_PLASMA || !Get_BitVar(g_Had_Plasma, Attacker))
  390.         return HAM_IGNORED
  391.    
  392.     return HAM_SUPERCEDE
  393. }
  394.  
  395. public fw_TraceAttack_Player(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits)
  396. {
  397.     if(!is_user_connected(Attacker))
  398.         return HAM_IGNORED 
  399.     if(get_user_weapon(Attacker) != CSW_PLASMA || !Get_BitVar(g_Had_Plasma, Attacker))
  400.         return HAM_IGNORED
  401.        
  402.     return HAM_SUPERCEDE
  403. }
  404.  
  405. public fw_Weapon_PrimaryAttack(Ent)
  406. {
  407.     if(!pev_valid(Ent))
  408.         return
  409.        
  410.     static Id; Id = pev(Ent, pev_owner)
  411.     if(!Get_BitVar(g_Had_Plasma, Id))
  412.         return
  413.     static Ammo; Ammo = cs_get_weapon_ammo(Ent)
  414.     if(Ammo <= 0) return
  415.  
  416.     // Weapon Shoot
  417.     Set_Weapon_Anim(Id, WEAPONANIM_SHOOT)
  418.     emit_sound(Id, CHAN_WEAPON, WeaponSounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  419.    
  420.     // MuzzleFlash & Effect
  421.     Make_Muzzleflash(Id)
  422.    
  423.     // Create Plasma Effect
  424.     Create_PlasmaBall(Id)
  425.    
  426.     // Speed & Recoil
  427.     pev(Ent, pev_punchangle, g_WeaponRecoil[Id])
  428. }
  429.  
  430. public fw_Weapon_PrimaryAttack_Post(Ent)
  431. {
  432.     if(!pev_valid(Ent))
  433.         return
  434.        
  435.     static Id; Id = pev(Ent, pev_owner)
  436.     if(!Get_BitVar(g_Had_Plasma, Id))
  437.         return
  438.     static Ammo; Ammo = cs_get_weapon_ammo(Ent)
  439.     if(Ammo <= 0) return
  440.    
  441.     // Speed & Recoil
  442.     set_pdata_float(Ent, 46, get_pdata_float(Ent, 46, 4) * SPEED, 4)
  443.    
  444.     static Float:Push[3]; pev(Id, pev_punchangle, Push)
  445.    
  446.     xs_vec_sub(Push, g_WeaponRecoil[Id], Push)
  447.     xs_vec_mul_scalar(Push, RECOIL, Push)
  448.     xs_vec_add(Push,  g_WeaponRecoil[Id], Push)
  449.  
  450.     set_pev(Id, pev_punchangle, Push)
  451. }
  452.  
  453. public fw_Item_Deploy_Post(Ent)
  454. {
  455.     if(!pev_valid(Ent))
  456.         return
  457.        
  458.     static Id; Id = pev(Ent, pev_owner)
  459.     if(!Get_BitVar(g_Had_Plasma, Id))
  460.         return
  461.        
  462.     set_pev(Id, pev_viewmodel2, V_MODEL)
  463.     set_pev(Id, pev_weaponmodel2, P_MODEL)
  464.    
  465.     set_pdata_string(Id, (492) * 4, WEAPON_ANIMEXT, -1 , 20)
  466.    
  467.     // Set Draw
  468.     Set_Player_NextAttack(Id, WEAPONTIME_DRAW)
  469.     Set_Weapon_TimeIdle(Id, CSW_PLASMA, WEAPONTIME_DRAW)
  470. }
  471.  
  472. public fw_Item_PostFrame(Ent)
  473. {
  474.     if(!pev_valid(Ent))
  475.         return
  476.        
  477.     static Id; Id = pev(Ent, pev_owner)
  478.     if(!Get_BitVar(g_Had_Plasma, Id))
  479.         return
  480.    
  481.     static Float:flNextAttack; flNextAttack = get_pdata_float(Id, 83, 5)
  482.     static bpammo; bpammo = cs_get_user_bpammo(Id, CSW_PLASMA)
  483.     static iClip; iClip = get_pdata_int(Ent, 51, 4)
  484.  
  485.     if(get_pdata_int(Ent, 54, 4) && flNextAttack <= 0.0)
  486.     {
  487.         static temp1; temp1 = min(CLIP - iClip, bpammo)
  488.  
  489.         set_pdata_int(Ent, 51, iClip + temp1, 4)
  490.         cs_set_user_bpammo(Id, CSW_PLASMA, bpammo - temp1)     
  491.        
  492.         set_pdata_int(Ent, 54, 0, 4)
  493.     }      
  494. }
  495.  
  496. public fw_Weapon_Reload(Ent)
  497. {
  498.     if(!pev_valid(Ent))
  499.         return HAM_IGNORED
  500.        
  501.     static Id; Id = pev(Ent, pev_owner)
  502.     if(!Get_BitVar(g_Had_Plasma, Id))
  503.         return HAM_IGNORED
  504.        
  505.     g_WeaponClip[Id] = -1
  506.    
  507.     static bpammo; bpammo = cs_get_user_bpammo(Id, CSW_PLASMA)
  508.     static iClip; iClip = get_pdata_int(Ent, 51, 4)
  509.    
  510.     if(bpammo <= 0) return HAM_SUPERCEDE
  511.     if(iClip >= CLIP) return HAM_SUPERCEDE
  512.        
  513.     g_WeaponClip[Id] = iClip
  514.     return HAM_IGNORED
  515. }
  516.  
  517. public fw_Weapon_Reload_Post(Ent)
  518. {
  519.     if(!pev_valid(Ent))
  520.         return
  521.        
  522.     static Id; Id = pev(Ent, pev_owner)
  523.     if(!Get_BitVar(g_Had_Plasma, Id))
  524.         return
  525.     if(g_WeaponClip[Id] == -1)
  526.         return
  527.    
  528.     set_pdata_int(Ent, 51, g_WeaponClip[Id], 4)
  529.     set_pdata_int(Ent, 54, 1, 4)
  530.    
  531.     Set_Weapon_Anim(Id, WEAPONANIM_RELOAD)
  532.     set_pdata_float(Id, 83, WEAPONTIME_RELOAD, 5)
  533. }
  534.  
  535. public fw_Item_AddToPlayer_Post(Ent, Id)
  536. {
  537.     if(!pev_valid(Ent))
  538.         return
  539.        
  540.     if(pev(Ent, pev_impulse) == WEAPON_SECRETCODE)
  541.     {
  542.         Set_BitVar(g_Had_Plasma, Id)
  543.         set_pev(Ent, pev_impulse, 0)
  544.        
  545.         set_task(0.01, "AddToPlayer_Delay", Id)
  546.     }      
  547.  
  548.     message_begin(MSG_ONE_UNRELIABLE, g_Msg_WeaponList, _, Id)
  549.     write_string(Get_BitVar(g_Had_Plasma, Id) ? "weapon_plasmagun" : "weapon_ak47")
  550.     write_byte(2)
  551.     write_byte(Get_BitVar(g_Had_Plasma, Id) ? 200 : 90)
  552.     write_byte(-1)
  553.     write_byte(-1)
  554.     write_byte(0)
  555.     write_byte(1)
  556.     write_byte(Get_BitVar(g_Had_Plasma, Id) ? CSW_PLASMA : CSW_AK47)
  557.     write_byte(0)
  558.     message_end()          
  559.    
  560.     return
  561. }
  562.  
  563. public AddToPlayer_Delay(Id)
  564. {
  565.     set_pev(Id, pev_viewmodel2, V_MODEL)
  566.     set_pev(Id, pev_weaponmodel2, P_MODEL)
  567.    
  568.     set_pdata_string(Id, (492) * 4, WEAPON_ANIMEXT, -1 , 20)   
  569. }
  570.        
  571. public Create_PlasmaBall(id)
  572. {
  573.     static Float:StartOrigin[3], Float:TargetOrigin[3], Float:MyVelocity[3], Float:VecLength
  574.    
  575.     get_position(id, 48.0, 10.0, -5.0, StartOrigin)
  576.     get_position(id, 1024.0, 0.0, 0.0, TargetOrigin)
  577.    
  578.     pev(id, pev_velocity, MyVelocity)
  579.     VecLength = vector_length(MyVelocity)
  580.    
  581.     if(VecLength)
  582.     {
  583.         TargetOrigin[0] += random_float(-16.0, 16.0); TargetOrigin[1] += random_float(-16.0, 16.0); TargetOrigin[2] += random_float(-16.0, 16.0)
  584.     } else {
  585.         TargetOrigin[0] += random_float(-8.0, 8.0); TargetOrigin[1] += random_float(-8.0, 8.0); TargetOrigin[2] += random_float(-8.0, 8.0)
  586.     }
  587.    
  588.     static Ent; Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_sprite"))
  589.     if(!pev_valid(Ent)) return
  590.    
  591.     // Set info for ent
  592.     set_pev(Ent, pev_movetype, MOVETYPE_FLY)
  593.     set_pev(Ent, pev_rendermode, kRenderTransAdd)
  594.     set_pev(Ent, pev_renderamt, 10.0)
  595.     set_pev(Ent, pev_iuser1, id) // Better than pev_owner
  596.     set_pev(Ent, pev_iuser2, Get_SpecialTeam(id, cs_get_user_team(id)))
  597.     set_pev(Ent, pev_fuser1, get_gametime() + 3.0)
  598.     set_pev(Ent, pev_scale, random_float(0.1, 0.25))
  599.     set_pev(Ent, pev_nextthink, halflife_time() + 0.1)
  600.    
  601.     entity_set_string(Ent, EV_SZ_classname, PLASMABALL_CLASSNAME)
  602.     engfunc(EngFunc_SetModel, Ent, WeaponFiles[0])
  603.     set_pev(Ent, pev_mins, Float:{-1.0, -1.0, -1.0})
  604.     set_pev(Ent, pev_maxs, Float:{1.0, 1.0, 1.0})
  605.     set_pev(Ent, pev_origin, StartOrigin)
  606.     set_pev(Ent, pev_gravity, 0.01)
  607.     set_pev(Ent, pev_solid, SOLID_TRIGGER)
  608.     set_pev(Ent, pev_frame, 0.0)
  609.    
  610.     static Float:Velocity[3]
  611.     get_speed_vector(StartOrigin, TargetOrigin, PLASMA_SPEED, Velocity)
  612.     set_pev(Ent, pev_velocity, Velocity)
  613. }
  614.  
  615. public Make_Muzzleflash(id)
  616. {
  617.     static Float:Origin[3], TE_FLAG
  618.     get_position(id, 32.0, 6.0, -15.0, Origin)
  619.    
  620.     TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
  621.     TE_FLAG |= TE_EXPLFLAG_NOSOUND
  622.     TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
  623.    
  624.     engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, Origin, id)
  625.     write_byte(TE_EXPLOSION)
  626.     engfunc(EngFunc_WriteCoord, Origin[0])
  627.     engfunc(EngFunc_WriteCoord, Origin[1])
  628.     engfunc(EngFunc_WriteCoord, Origin[2])
  629.     write_short(g_MuzzleFlash_SprId)
  630.     write_byte(2)
  631.     write_byte(30)
  632.     write_byte(TE_FLAG)
  633.     message_end()
  634. }
  635.  
  636. public Update_AmmoHud(id, CSWID, Ammo, BpAmmo)
  637. {
  638.     message_begin(MSG_ONE_UNRELIABLE, g_Msg_CurWeapon, _, id)
  639.     write_byte(1)
  640.     write_byte(CSWID)
  641.     write_byte(Ammo)
  642.     message_end()
  643.    
  644.     message_begin(MSG_ONE_UNRELIABLE, g_Msg_AmmoX, _, id)
  645.     write_byte(10)
  646.     write_byte(BpAmmo)
  647.     message_end()
  648. }
  649.  
  650. public Get_SpecialTeam(Ent, CsTeams:Team)
  651. {
  652.     if(Team == CS_TEAM_T) return TEAM_T
  653.     else if(Team == CS_TEAM_CT) return TEAM_CT
  654.    
  655.     return 0
  656. }
  657.  
  658. public CsTeams:Get_PlasmaTeam(Ent)
  659. {
  660.     if(pev(Ent, pev_iuser2) == TEAM_T) return CS_TEAM_T
  661.     else if(pev(Ent, pev_iuser2) == TEAM_CT) return CS_TEAM_CT
  662.    
  663.     return CS_TEAM_UNASSIGNED
  664. }
  665.  
  666. stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
  667. {
  668.     new_velocity[0] = origin2[0] - origin1[0]
  669.     new_velocity[1] = origin2[1] - origin1[1]
  670.     new_velocity[2] = origin2[2] - origin1[2]
  671.     static Float:num; num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
  672.     new_velocity[0] *= num
  673.     new_velocity[1] *= num
  674.     new_velocity[2] *= num
  675.    
  676.     return 1;
  677. }
  678.  
  679. stock Set_Weapon_TimeIdle(id, WeaponId, Float:TimeIdle)
  680. {
  681.     static Ent; Ent = fm_get_user_weapon_entity(id, WeaponId)
  682.     if(!pev_valid(Ent)) return
  683.        
  684.     set_pdata_float(Ent, 46, TimeIdle, 4)
  685.     set_pdata_float(Ent, 47, TimeIdle, 4)
  686.     set_pdata_float(Ent, 48, TimeIdle + 0.5, 4)
  687. }
  688.  
  689. stock Set_Player_NextAttack(id, Float:nexttime)
  690. {
  691.     set_pdata_float(id, 83, nexttime, 5)
  692. }
  693.  
  694. stock Set_Weapon_Anim(id, WeaponAnim)
  695. {
  696.     set_pev(id, pev_weaponanim, WeaponAnim)
  697.    
  698.     message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
  699.     write_byte(WeaponAnim)
  700.     write_byte(pev(id, pev_body))
  701.     message_end()
  702. }
  703.  
  704. stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
  705. {
  706.     static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
  707.    
  708.     pev(id, pev_origin, vOrigin)
  709.     pev(id, pev_view_ofs, vUp) //for player
  710.     xs_vec_add(vOrigin, vUp, vOrigin)
  711.     pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
  712.    
  713.     angle_vector(vAngle, ANGLEVECTOR_FORWARD, vForward) //or use EngFunc_AngleVectors
  714.     angle_vector(vAngle, ANGLEVECTOR_RIGHT, vRight)
  715.     angle_vector(vAngle, ANGLEVECTOR_UP, vUp)
  716.    
  717.     vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  718.     vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  719.     vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  720. }
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

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

#3

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 0 guests