Available Thanatos 3

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

Thanatos 3

#1

Post by czirimbolo » 5 years ago

Hello, please can someone convert this gun? THanks

Code: Select all

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


#define PLUGIN	"[CSO] Primary Weapon : Thanatos-3"
#define VERSION	"1.2 beta" // Full version; Buy its
#define AUTHOR	"Asep || Facebook.com/asepdwa10 & Dev!l"

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

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

// ======================================================= //
// ALL CONFIGURATION AND TIME DELAY ANIM ViewModels RELOAD //
// ======================================================= //
#define THANATOS3_RELOAD_TIME 		3.5
#define THANATOS3_IDLE_NORMAL		0
#define THANATOS3_IDLE_WINGS_1		1
#define THANATOS3_IDLE_WINGS_2		2
#define THANATOS3_IDLE_WINGS_3		3
#define THANATOS3_SHOOT_NORMAL		4
#define THANATOS3_SHOOT_WINGS_1		5
#define THANATOS3_SHOOT_WINGS_2		6
#define THANATOS3_SHOOT_WINGS_3		7
#define THANATOS3_FLYING_WINGS_1	8
#define THANATOS3_FLYING_WINGS_2	9
#define THANATOS3_FLYING_WINGS_3	10
#define THANATOS3_RELOAD_NORMAL		11
#define THANATOS3_RELOAD_WINGS_1	12
#define THANATOS3_RELOAD_WINGS_2	13
#define THANATOS3_RELOAD_WINGS_3	14
#define THANATOS3_SPREAD_WINGS_1	15
#define THANATOS3_SPREAD_WINGS_2	16
#define THANATOS3_SPREAD_WINGS_3	17
#define THANATOS3_DRAW_NORMAL		18
#define THANATOS3_DRAW_WINGS_1		19
#define THANATOS3_DRAW_WINGS_2		20
#define THANATOS3_DRAW_WINGS_3		21
// ========================================================== //
// CONFIGURATION LIMITS AND TIME DELAY ANIM ViewModels RELOAD //
// ========================================================== //

#define weapon_thanatos3		"weapon_mp5navy"
#define CSW_THANATOS3			CSW_MP5NAVY
#define TASK_FLYING			919924

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

#define THANATOS3_SCYTHE_CLASSNAME	"scythe_thanatos3"
#define THANATOS3_SCYTHE_WIND_CLASSNAME	"scythe_thanatos3_wind_attack"

enum
{
	MODE_NORMAL = 0,
	MODE_WINGS_1,
	MODE_WINGS_2,
	MODE_WINGS_3
}

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

new const Fire_Sounds[][] = 
{
	"weapons/cso/thanatos3-1.wav",
	"weapons/cso/thanatos3_boltpull.wav",
	"weapons/cso/thanatos3_clipout.wav",
	"weapons/cso/thanatos3_clipin.wav",
	"weapons/cso/thanatos3_draw.wav",
	"weapons/cso/thanatos3_draw_w1.wav",
	"weapons/cso/thanatos3_fly_shoot.wav",
	"weapons/cso/thanatos3_fly_w2.wav",
	"weapons/cso/thanatos3_fly_w3.wav",
	"weapons/cso/thanatos3_ilde_w1.wav",
	"weapons/cso/thanatos3_ilde_w2.wav",
	"weapons/cso/thanatos3_ilde_w3.wav",
	"weapons/cso/thanatos3_knife_hit.wav",
	"weapons/cso/thanatos3_knife_swish.wav",
	"weapons/cso/thanatos3_reload_w1.wav",
	"weapons/cso/thanatos3_reload_w2.wav",
	"weapons/cso/thanatos3_reload_w3.wav",
	"weapons/cso/thanatos3_spread_w1.wav"
}

new THANATOS3_V_MODEL[64] = "models/cso/v_thanatos3.mdl"
new THANATOS3_P_MODEL_A[64] = "models/cso/p_thanatos3a.mdl"
new THANATOS3_P_MODEL_B[64] = "models/cso/p_thanatos3b.mdl"
new THANATOS3_P_MODEL_C[64] = "models/cso/p_thanatos3c.mdl"
new THANATOS3_P_MODEL_D[64] = "models/cso/p_thanatos3d.mdl"
new THANATOS3_W_MODEL[64] = "models/cso/w_thanatos3.mdl"
new THANATOS3_W_MODEL_B[64] = "models/cso/w_thanatos3b.mdl"
new THANATOS3_S_MODEL[64] = "models/cso/thanatos3_knife.mdl"
new THANATOS3_S_WIND_MODEL[64] = "models/cso/thanatos3_wind.mdl"

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

new Float:cl_pushangle[MAX_PLAYERS + 1][3], m_iBlood[2], gmsgWeaponList, tn3_attacked[33]
new g_has_thanatos3[33], g_clip_ammo[33], g_thanatos3_TmpClip[33], oldweap[33], sTrail, g_smokepuff_id
new cvar_dmg_thanatos3, cvar_recoil_thanatos3, cvar_clip_thanatos3, cvar_spd_thanatos3, cvar_thanatos3_ammo, g_Ammo_Special[33]
new g_MaxPlayers, g_orig_event_thanatos3, g_IsInPrimaryAttack, g_Mode[33], g_Reload[33], g_register

const PRIMARY_WEAPONS_BIT_SUM = 
(1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_THANATOS3)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<
CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90)
new const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
			"weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
			"weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
			"weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
			"weapon_ak47", "weapon_knife", "weapon_p90" }

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
	register_event("CurWeapon","CurrentWeapon","be","1=1")
	
	RegisterHam(Ham_Item_AddToPlayer, weapon_thanatos3, "fw_thanatos3_AddToPlayer")
	RegisterHam(Ham_Weapon_PrimaryAttack, weapon_thanatos3, "fw_thanatos3_PrimaryAttack")
	RegisterHam(Ham_Weapon_PrimaryAttack, weapon_thanatos3, "fw_thanatos3_PrimaryAttack_Post", 1)
	RegisterHam(Ham_Weapon_WeaponIdle, weapon_thanatos3, "fw_thanatos3_idle_anim", 1)
	RegisterHam(Ham_Item_PostFrame, weapon_thanatos3, "thanatos3_ItemPostFrame")
	RegisterHam(Ham_Weapon_Reload, weapon_thanatos3, "thanatos3_Reload")
	RegisterHam(Ham_Weapon_Reload, weapon_thanatos3, "thanatos3_Reload_Post", 1)
	
	for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
		if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)
	
	register_forward(FM_SetModel, "fw_SetModel")
	register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
	register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
	register_forward(FM_CmdStart, "fw_CmdStart")
	
	register_think(THANATOS3_SCYTHE_WIND_CLASSNAME, "fw_Scythe_Wind_Think")
	
	register_think(THANATOS3_SCYTHE_CLASSNAME, "fw_Think_Scythe")
	register_touch(THANATOS3_SCYTHE_CLASSNAME, "*", "fw_Touch_Scythe")
	
	RegisterHam(Ham_TraceAttack, "func_door", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_door_rotating", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_plat", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_rotating", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack", 1)
	RegisterHam(Ham_TraceAttack, "func_wall", "fw_TraceAttack", 1)
	
	RegisterHam(Ham_Use, "func_tank", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tankmortar", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tankrocket", "fw_UseStationary_Post", 1)
	RegisterHam(Ham_Use, "func_tanklaser", "fw_UseStationary_Post", 1)
	
	RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
	RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
	
	cvar_clip_thanatos3 = register_cvar("thanatos3_clip", "60")
	cvar_spd_thanatos3 = register_cvar("thanatos3_speed", "1.04")
	cvar_thanatos3_ammo = register_cvar("thanatos3_ammo", "240")
	cvar_dmg_thanatos3 = register_cvar("thanatos3_damage", "1.6")
	cvar_recoil_thanatos3 = register_cvar("thanatos3_recoil", "0.50")
	
	g_MaxPlayers = get_maxplayers()
	gmsgWeaponList = get_user_msgid("WeaponList")
	
	
	
}

public plugin_precache()
{
	precache_model(THANATOS3_V_MODEL)
	precache_model(THANATOS3_P_MODEL_A)
	precache_model(THANATOS3_P_MODEL_B)
	precache_model(THANATOS3_P_MODEL_C)
	precache_model(THANATOS3_P_MODEL_D)
	precache_model(THANATOS3_W_MODEL)
	precache_model(THANATOS3_W_MODEL_B)
	precache_model(THANATOS3_S_MODEL)
	precache_model(THANATOS3_S_WIND_MODEL)
	
	g_smokepuff_id = precache_model("sprites/wall_puff1.spr")
	sTrail = precache_model("sprites/laserbeam.spr")
	
	for(new i = 0; i < sizeof Fire_Sounds; i++)
		precache_sound(Fire_Sounds[i])
	
	m_iBlood[0] = precache_model("sprites/blood.spr")
	m_iBlood[1] = precache_model("sprites/bloodspray.spr")
	
	register_forward(FM_PrecacheEvent, "fwPrecacheEvent_Post", 1)
}

public weapon_hook(id)
{
    	engclient_cmd(id, "weapon_mp5navy")
    	return PLUGIN_HANDLED
}
public plugin_natives(){
	register_native("give_t3", "thanatos3_give");
}

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

public ham_register(id)
{
	RegisterHamFromEntity(Ham_TakeDamage, id, "fw_TakeDamage")	
	RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack")	
}

public thanatos3_give(id)
{		
	give_thanatos3(id)
	
	return PLUGIN_CONTINUE
}


public fw_TraceAttack(iEnt, iAttacker, Float:flDamage, Float:fDir[3], ptr, iDamageType)
{
	if(!is_user_alive(iAttacker))
		return
	new g_currentweapon = get_user_weapon(iAttacker)
	if(g_currentweapon != CSW_THANATOS3) return
	if(!g_has_thanatos3[iAttacker]) return
	
	static Float:flEnd[3]
	get_tr2(ptr, TR_vecEndPos, flEnd)
	
	if(!is_user_alive(iEnt))
	{
		create_fake_smokes(flEnd)
		
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_DECAL)
		write_coord_f(flEnd[0])
		write_coord_f(flEnd[1])
		write_coord_f(flEnd[2])
		write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
		write_short(iEnt)
		message_end()

		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_WORLDDECAL)
		write_coord_f(flEnd[0])
		write_coord_f(flEnd[1])
		write_coord_f(flEnd[2])
		write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
		message_end()
		
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_GUNSHOTDECAL)
		write_coord_f(flEnd[0])
		write_coord_f(flEnd[1])
		write_coord_f(flEnd[2])
		write_short(iAttacker)
		write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
		message_end()
	}
}

public fw_CmdStart(id, uc_handle, seed)
{
	if(!is_user_alive(id)) 
		return FMRES_IGNORED;
	if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
		return FMRES_IGNORED;
	if(!g_clip_ammo[id] || g_Reload[id])	
		return FMRES_IGNORED;
		
	static PressedButton
	PressedButton = get_uc(uc_handle, UC_Buttons)
	
	if(PressedButton & IN_ATTACK2)
	{
		if(get_pdata_float(id, 83, 5) > 0.0)
			return FMRES_IGNORED
			
		PressedButton &= ~IN_ATTACK2
		set_uc(uc_handle, UC_Buttons, PressedButton)
		
		if(g_Mode[id] == MODE_WINGS_1) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_A)
		else if(g_Mode[id] == MODE_WINGS_2) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_A)
		else if(g_Mode[id] == MODE_WINGS_3) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_A)
		
		static Float:Origin[3]
		if(g_Mode[id] == MODE_WINGS_1)
		{
			UTIL_PlayWeaponAnimation(id, THANATOS3_FLYING_WINGS_1)
			emit_sound(id, CHAN_WEAPON, Fire_Sounds[6], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
			
			get_position(id, 2.0, 0.0, 0.0, Origin)
			Special_Shoot_Wings(id, Origin, 0.0)
			
			set_task(0.1, "Special_Shoot_Wings_2", id+TASK_FLYING)
			
			set_task(0.6, "Reset_Mode", id)
			set_player_nextattackx(id, 2.0)
			set_weapons_timeidle(id, CSW_MP5NAVY, 2.0)
		}
		else if(g_Mode[id] == MODE_WINGS_2)
		{
			UTIL_PlayWeaponAnimation(id, THANATOS3_FLYING_WINGS_2)
			emit_sound(id, CHAN_WEAPON, Fire_Sounds[6], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
			
			get_position(id, 2.0, 0.0, 0.0, Origin)
			Special_Shoot_Wings(id, Origin, 0.0)
			
			set_task(0.2, "Special_Shoot_Wings_2", id+TASK_FLYING)
			set_task(0.3, "Special_Shoot_Wings_3", id+TASK_FLYING)
			set_task(0.4, "Special_Shoot_Wings_4", id+TASK_FLYING)
			
			set_task(0.6, "Reset_Mode", id)
			set_player_nextattackx(id, 2.0)
			set_weapons_timeidle(id, CSW_MP5NAVY, 2.0)
		}
		else if(g_Mode[id] == MODE_WINGS_3)
		{
			UTIL_PlayWeaponAnimation(id, THANATOS3_FLYING_WINGS_3)
			emit_sound(id, CHAN_WEAPON, Fire_Sounds[6], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
			
			get_position(id, 2.0, 0.0, 0.0, Origin)
			Special_Shoot_Wings(id, Origin, 0.0)
			
			set_task(0.1, "Special_Shoot_Wings_2", id+TASK_FLYING)
			set_task(0.2, "Special_Shoot_Wings_3", id+TASK_FLYING)
			set_task(0.3, "Special_Shoot_Wings_4", id+TASK_FLYING)
			set_task(0.4, "Special_Shoot_Wings_5", id+TASK_FLYING)
			set_task(0.5, "Special_Shoot_Wings_6", id+TASK_FLYING)
			
			set_task(0.6, "Reset_Mode", id)
			set_player_nextattackx(id, 2.0)
			set_weapons_timeidle(id, CSW_MP5NAVY, 2.0)
		}
	}
	
	return FMRES_HANDLED
}

public Special_Shoot_Wings_2(id)
{
	id -= TASK_FLYING
	
	if(!is_user_alive(id) || !is_user_connected(id))
		return
	if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
		return
			
	new Float:Origin[3]
	
	if(g_Mode[id] == MODE_WINGS_1)
	{
		get_position(id, 0.0, 12.0, 0.0, Origin)
		Special_Shoot_Wings(id, Origin, 12.0)
	}
	else if(g_Mode[id] == MODE_WINGS_2)
	{
		get_position(id, 0.0, -12.0, 0.0, Origin)
		Special_Shoot_Wings(id, Origin, -12.0)
	}
	else if(g_Mode[id] == MODE_WINGS_3)
	{
		get_position(id, 0.0, -24.0, 0.0, Origin)
		Special_Shoot_Wings(id, Origin, -24.0)
	}
}

public Special_Shoot_Wings_3(id)
{
	id -= TASK_FLYING
	
	if(!is_user_alive(id) || !is_user_connected(id))
		return
	if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
		return
		
	new Float:Origin[3]
	
	if(g_Mode[id] == MODE_WINGS_2)
	{
		get_position(id, 0.0, 12.0, 0.0, Origin)
		Special_Shoot_Wings(id, Origin, 12.0)
	}
	else if(g_Mode[id] == MODE_WINGS_3)
	{
		get_position(id, 0.0, -12.0, 0.0, Origin)
		Special_Shoot_Wings(id, Origin, -12.0)
	}
}

public Special_Shoot_Wings_4(id)
{
	id -= TASK_FLYING
	
	if(!is_user_alive(id) || !is_user_connected(id))
		return
	if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
		return
		
	new Float:Origin[3]
	
	if(g_Mode[id] == MODE_WINGS_2)
	{
		get_position(id, 0.0, 24.0, 0.0, Origin)
		Special_Shoot_Wings(id, Origin, 24.0)
	}
	else if(g_Mode[id] == MODE_WINGS_3)
	{
		get_position(id, 0.0, 12.0, 0.0, Origin)
		Special_Shoot_Wings(id, Origin, 12.0)
	}
}

public Special_Shoot_Wings_5(id)
{
	id -= TASK_FLYING
	
	if(!is_user_alive(id) || !is_user_connected(id))
		return
	if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
		return
		
	new Float:Origin[3]
	
	get_position(id, 0.0, 12.0, 0.0, Origin)
	Special_Shoot_Wings(id, Origin, 12.0)
}

public Special_Shoot_Wings_6(id)
{
	id -= TASK_FLYING

	if(!is_user_alive(id) || !is_user_connected(id))
		return
	if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
		return
		
	new Float:Origin[3]
	
	get_position(id, 0.0, 36.0, 0.0, Origin)
	Special_Shoot_Wings(id, Origin, 36.0)
}


public Reset_Mode(id)
{
	if(!is_user_alive(id))
		return
	if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
		return
		
	g_Mode[id] = MODE_NORMAL
	tn3_attacked[id] = 0
	
	g_Ammo_Special[id] = 0
	Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
}

public Special_Shoot_Wings(id, Float:StartOrigin[3], Float:New_Target)
{
	if(!is_user_alive(id))
		return
	if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
		return
		
	static Float:TargetOrigin[3], Float:angles[3], Float:angles_fix[3]

	pev(id,pev_v_angle,angles)
	new Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))

	angles_fix[0] = 450.0 - angles[0]
	angles_fix[1] = angles[1]
	angles_fix[2] = angles[2]

	set_pev(Ent, pev_movetype, MOVETYPE_FLY)
	set_pev(Ent, pev_owner, id)
	
	entity_set_string(Ent, EV_SZ_classname, THANATOS3_SCYTHE_CLASSNAME)
	engfunc(EngFunc_SetModel, Ent, THANATOS3_S_MODEL)
	set_pev(Ent, pev_mins,{ -0.1, -0.1, -0.1 })
	set_pev(Ent, pev_maxs,{ 0.1, 0.1, 0.1 })
	set_pev(Ent, pev_origin, StartOrigin)
	set_pev(Ent, pev_angles, angles_fix)
	set_pev(Ent, pev_gravity, 0.01)
	set_pev(Ent, pev_solid, SOLID_BBOX)
	set_pev(Ent, pev_frame, 0.0)
	
	set_pev(Ent, pev_animtime, get_gametime())
	set_pev(Ent, pev_framerate, 1.0)
	set_pev(Ent, pev_sequence, 0)
	
	entity_set_float(Ent, EV_FL_nextthink, halflife_time() + 0.01)
	
	static Float:Velocity[3]
	fm_get_aim_origin(id, TargetOrigin)

	TargetOrigin[1] += New_Target
	
	get_speed_vector(StartOrigin, TargetOrigin, 2000.0, Velocity)
	set_pev(Ent, pev_velocity, Velocity)
	
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_BEAMFOLLOW) // Temporary entity ID
	write_short(Ent) // Entity
	write_short(sTrail) // Sprite index
	write_byte(4) // Life
	write_byte(2) // Line width
	write_byte(65)
	write_byte(69)
	write_byte(121)
	write_byte(255) // Alpha
	message_end()
}

public fw_Think_Scythe(Ent)
{
	if(!pev_valid(Ent))
		return
		
	static Classname[32]
	pev(Ent, pev_classname, Classname, sizeof(Classname))
	
	if(!equal(Classname, THANATOS3_SCYTHE_CLASSNAME))
		return
}

public fw_Touch_Scythe(Ent, Id)
{
	if(!pev_valid(Ent))
		return
	
	new Float:originF[3]
	pev(Ent, pev_origin, originF)
	
	static Owner; Owner = pev(Ent, pev_owner)
	if(is_user_alive(Id) && ze_is_user_zombie(Id))
	{
		static Float:MyOrigin[3]
		pev(Owner, pev_origin, MyOrigin)
		
		create_blood(originF)
		create_blood(originF)
		create_blood(originF)
		create_blood(originF)
		
		hook_ent(Id, MyOrigin, 50.0, 2)
		ExecuteHamB(Ham_TakeDamage, Id, 0, Owner, random_float(25.0,60.0), DMG_BULLET)
		
		Scythe_Wind_Attack(Id, Owner)
		emit_sound(Id, CHAN_WEAPON, Fire_Sounds[12], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
	}
	else
	{
		new Float:originn[3]
		pev(Ent, pev_origin, originn)
		
		create_fake_smokes(originn)
		
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_DECAL)
		write_coord_f(originn[0])
		write_coord_f(originn[1])
		write_coord_f(originn[2])
		write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
		write_short(Ent)
		message_end()
		
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_WORLDDECAL)
		write_coord_f(originn[0])
		write_coord_f(originn[1])
		write_coord_f(originn[2])
		write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
		message_end()
	}
	
	remove_entity(Ent)
}

public Scythe_Wind_Attack(id, attacker)
{
	static Ent; Ent = fm_find_ent_by_owner(-1, THANATOS3_SCYTHE_WIND_CLASSNAME, id)
	if(is_user_alive(id) && ze_is_user_zombie(id))
	{
		new iEnt = create_entity("info_target")
		
		static Float:MyOrigin[3], Float:New_Origin[3]
		pev(id, pev_origin, MyOrigin)
		
		set_pev(iEnt, pev_movetype, MOVETYPE_FOLLOW)
		set_pev(iEnt, pev_scale, 2.0)
		set_pev(iEnt, pev_nextthink, get_gametime() + 0.1)
		
		entity_set_string(iEnt, EV_SZ_classname, THANATOS3_SCYTHE_WIND_CLASSNAME)
		engfunc(EngFunc_SetModel, iEnt, THANATOS3_S_WIND_MODEL)
		
		if(pev_valid(Ent) == 1)
		{
			New_Origin[0] = -1.5
			New_Origin[1] = 1.5
			New_Origin[2] = 50.0
		}
		else if(pev_valid(Ent) == 2)
		{
			New_Origin[0] = -1.0
			New_Origin[1] = 1.0
			New_Origin[2] = 40.0
		}
		else if(pev_valid(Ent) == 3)
		{
			New_Origin[0] = -0.5
			New_Origin[1] = 0.5
			New_Origin[2] = 30.0
		}
		else if(pev_valid(Ent) == 4)
		{
			New_Origin[0] = 0.0
			New_Origin[1] = 0.0
			New_Origin[2] = 20.0
		}
		else if(pev_valid(Ent) == 5)
		{
			New_Origin[0] = 0.5
			New_Origin[1] = -0.5
			New_Origin[2] = 10.0
		}
		else if(pev_valid(Ent) == 6)
		{
			New_Origin[0] = 1.0
			New_Origin[1] = -1.0
			New_Origin[2] = 0.0
		}
		
		MyOrigin[0] += New_Origin[0]
		MyOrigin[1] += New_Origin[1]
		MyOrigin[2] += New_Origin[2]
		
		set_pev(iEnt, pev_origin, MyOrigin)
		set_pev(iEnt, pev_owner, attacker)
		set_pev(iEnt, pev_aiment, id)
		
		set_pev(iEnt, pev_fuser1, get_gametime() + 6.0)
		set_pev(iEnt, pev_animtime, get_gametime())
		set_pev(iEnt, pev_framerate, 4.0)
		set_pev(iEnt, pev_sequence, 0)
		
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_BEAMFOLLOW) // Temporary entity ID
		write_short(iEnt) // Entity
		write_short(sTrail) // Sprite index
		write_byte(5) // Life
		write_byte(2) // Line width
		write_byte(65)
		write_byte(69)
		write_byte(121)
		write_byte(100) // Alpha
		message_end()
	}
	else if(!is_user_alive(id) || !ze_is_user_zombie(id))
	{
		engfunc(EngFunc_RemoveEntity, Ent)
	}
}

public fw_Scythe_Wind_Think(iEnt)
{
	if(!pev_valid(iEnt))
	{
		remove_entity(iEnt)
	}
	
	static attacker
	attacker = pev(iEnt, pev_owner)
	
	static victim, Float:g_SoundTime[33], Float:g_DamageTime[33], Float:Damage[33]
	victim = pev(iEnt, pev_aiment)
	
	static Float:OriginF[3]
	pev(iEnt, pev_origin, OriginF)
	
	static Float:fTimeRemove
	pev(iEnt, pev_fuser1, fTimeRemove)
	
	set_pev(iEnt, pev_nextthink, get_gametime() + 0.05)
	
	if(ze_is_user_zombie(attacker) || !is_user_alive(attacker)) engfunc(EngFunc_RemoveEntity, iEnt)
	if(!ze_is_user_zombie(victim) || !is_user_alive(victim)) engfunc(EngFunc_RemoveEntity, iEnt)
	
	if(get_gametime() - 1.0 > g_DamageTime[victim])
	{
		g_DamageTime[victim] = get_gametime()
		
		create_blood(OriginF)
		create_blood(OriginF)
		create_blood(OriginF)
		create_blood(OriginF)
		
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_GUNSHOTDECAL)
		write_coord_f(OriginF[0])
		write_coord_f(OriginF[1])
		write_coord_f(OriginF[2])
		write_short(attacker)
		write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
		message_end()
	
		if(pev_valid(iEnt) == 2) Damage[attacker] = random_float(60.0,120.0);
		else if(pev_valid(iEnt) == 4) Damage[attacker] = random_float(50.0,60.0);
		else if(pev_valid(iEnt) == 6) Damage[attacker] = random_float(25.0,50.0);
		
		ExecuteHamB(Ham_TakeDamage, victim, attacker, attacker, Damage[attacker], DMG_BULLET)
		set_pev(iEnt, pev_fuser2, get_gametime())
	}
	else if(get_gametime() - 0.1 > g_SoundTime[victim])
	{
		g_SoundTime[victim] = get_gametime()
		
		//set_pev(iEnt, pev_animtime, get_gametime())
		//set_pev(iEnt, pev_framerate, 2.0)
		//set_pev(iEnt, pev_sequence, 1)
		
		emit_sound(iEnt, CHAN_WEAPON, Fire_Sounds[13], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
	}
	else if (get_gametime() >= fTimeRemove)
	{
		engfunc(EngFunc_RemoveEntity, iEnt)
		return;
	}
}

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

public fw_PlayerKilled(id)
{
	g_has_thanatos3[id] = false
	g_Mode[id] = MODE_NORMAL
	g_Reload[id] = false
	g_Ammo_Special[id] = 0
	
	Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
}

public zp_user_infected_post(id)
{
	g_has_thanatos3[id] = false
	g_Mode[id] = MODE_NORMAL
	g_Reload[id] = false
	g_Ammo_Special[id] = 0
	
	Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
}

public client_connect(id)
{
	g_has_thanatos3[id] = false
	g_Mode[id] = MODE_NORMAL
	g_Reload[id] = false
	g_Ammo_Special[id] = 0
	
	Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
}

public client_disconnected(id)
{
	g_has_thanatos3[id] = false
	g_Mode[id] = MODE_NORMAL
	g_Reload[id] = false
	g_Ammo_Special[id] = 0
	
	Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
}

public Update_SpecialAmmo(id, Ammo, On)
{
	static AmmoSprites[33], On, Ammo_Asli
	
	if(Ammo == 1) Ammo_Asli = 2
	else if(Ammo == 2) Ammo_Asli = 4
	else if(Ammo == 3) Ammo_Asli = 6
	
	format(AmmoSprites, sizeof(AmmoSprites), "number_%d", Ammo_Asli)
	
	message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("StatusIcon"), {0,0,0}, id)
	write_byte(On)
	write_string(AmmoSprites)
	write_byte(42) // red
	write_byte(42) // green
	write_byte(252) // blue
	message_end()
}

public fw_thanatos3_idle_anim(Weapon)
{
	new id = get_pdata_cbase(Weapon, 41, 4)

	if(!is_user_alive(id) || !g_has_thanatos3[id] || get_user_weapon(id) != CSW_THANATOS3)
		return HAM_IGNORED;
	
	new Float:g_idle_sound_delay[33]
	
	if(get_gametime() - 1.0 > g_idle_sound_delay[id])
	{
		if(g_Mode[id] == MODE_WINGS_1) emit_sound(id, CHAN_BODY, Fire_Sounds[9], 1.0, ATTN_IDLE, 0, PITCH_HIGH)
		else if(g_Mode[id] == MODE_WINGS_2) emit_sound(id, CHAN_BODY, Fire_Sounds[10], 1.0, ATTN_IDLE, 0, PITCH_HIGH)
		else if(g_Mode[id] == MODE_WINGS_3) emit_sound(id, CHAN_BODY, Fire_Sounds[11], 1.0, ATTN_IDLE, 0, PITCH_HIGH)
		
		g_idle_sound_delay[id] = get_gametime()
	}
	
	if(get_pdata_float(Weapon, 48, 4) <= 0.43) 
	{
		if(!g_Mode[id]) UTIL_PlayWeaponAnimation(id, THANATOS3_IDLE_NORMAL)
		else if(g_Mode[id] == MODE_WINGS_1) UTIL_PlayWeaponAnimation(id, THANATOS3_IDLE_WINGS_1)
		else if(g_Mode[id] == MODE_WINGS_2) UTIL_PlayWeaponAnimation(id, THANATOS3_IDLE_WINGS_2)
		else if(g_Mode[id] == MODE_WINGS_3) UTIL_PlayWeaponAnimation(id, THANATOS3_IDLE_WINGS_3)
		
		set_pdata_float(Weapon, 48, 20.0, 4)
		
		return HAM_SUPERCEDE;
	}
	
	return HAM_IGNORED;
}

public fw_SetModel(entity, model[])
{
	if(!is_valid_ent(entity))
		return FMRES_IGNORED
	
	static szClassName[33]
	entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName))
		
	if(!equal(szClassName, "weaponbox"))
		return FMRES_IGNORED
	
	static iOwner
	
	iOwner = entity_get_edict(entity, EV_ENT_owner)
	
	if(equal(model, "models/w_mp5navy.mdl"))
	{
		static iStoredAugID
		
		iStoredAugID = find_ent_by_owner(ENG_NULLENT, weapon_thanatos3, entity)
	
		if(!is_valid_ent(iStoredAugID))
			return FMRES_IGNORED
	
		if(g_has_thanatos3[iOwner])
		{
			entity_set_int(iStoredAugID, EV_INT_WEAPONKEY, THANATOS3_WEAPONKEY)
			g_has_thanatos3[iOwner] = false
			//g_Mode[iOwner] = MODE_NORMAL
			if(g_Mode[iOwner] == MODE_NORMAL)
			{
				entity_set_model(entity, THANATOS3_W_MODEL)
			}
			else
			{
				entity_set_model(entity, THANATOS3_W_MODEL_B)
			}
			
			return FMRES_SUPERCEDE
		}
	}
	return FMRES_IGNORED
}

public give_thanatos3(id)
{
	drop_weapons(id, 1)
	new iWep2 = give_item(id,weapon_thanatos3)
	if( iWep2 > 0 )
	{
		cs_set_weapon_ammo(iWep2, get_pcvar_num(cvar_clip_thanatos3))
		cs_set_user_bpammo (id, CSW_THANATOS3, get_pcvar_num(cvar_thanatos3_ammo))	
		UTIL_PlayWeaponAnimation(id, THANATOS3_DRAW_NORMAL)
		set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF)
		
		message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
		write_string("weapon_thanatos3")
		write_byte(10)
		write_byte(120)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(7)
		write_byte(CSW_MP5NAVY)
		message_end()
	}
	g_has_thanatos3[id] = true
	g_Ammo_Special[id] = 0
	g_Mode[id] = MODE_NORMAL
	
	Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
}

public fw_thanatos3_AddToPlayer(thanatos3, id)
{
	if(!is_valid_ent(thanatos3) || !is_user_connected(id))
		return HAM_IGNORED
	
	if(entity_get_int(thanatos3, EV_INT_WEAPONKEY) == THANATOS3_WEAPONKEY)
	{
		g_has_thanatos3[id] = true
		entity_set_int(thanatos3, EV_INT_WEAPONKEY, 0)
		
		message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
		write_string("weapon_thanatos3")
		write_byte(10)
		write_byte(120)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(7)
		write_byte(CSW_MP5NAVY)
		message_end()
		
		return HAM_HANDLED
	}
	else
	{
		message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
		write_string("weapon_mp3navy")
		write_byte(10)
		write_byte(120)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(7)
		write_byte(CSW_MP5NAVY)
		message_end()
	}
	return HAM_IGNORED
}

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

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

public CurrentWeapon(id)
{
	replace_weapon_models(id, read_data(2))
     
	if(!is_user_alive(id))
		return
	
	if(read_data(2) == CSW_THANATOS3 || g_has_thanatos3[id])
	{
		static Float:iSpeed
		if(g_has_thanatos3[id] && !g_Mode[id])
			iSpeed = get_pcvar_float(cvar_spd_thanatos3)
		else if(g_has_thanatos3[id] && g_Mode[id])
			iSpeed = get_pcvar_float(cvar_spd_thanatos3) + 0.20
		
		static weapon[32],Ent
		get_weaponname(read_data(2),weapon,31)
		Ent = find_ent_by_owner(-1,weapon,id)
		if(Ent)
		{
			static Float:Delay
			Delay = get_pdata_float( Ent, 46, 4) * iSpeed
			if (Delay > 0.0)
			{
				set_pdata_float(Ent, 46, Delay, 4)
			}
		}
		
		Update_SpecialAmmo(id, g_Ammo_Special[id], 1)
	}
	else if(read_data(2) != CSW_THANATOS3 || !g_has_thanatos3[id])
	{
		Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
	}
}

replace_weapon_models(id, weaponid)
{
	switch (weaponid)
	{
		case CSW_THANATOS3:
		{
			if(g_has_thanatos3[id])
			{
				set_pev(id, pev_viewmodel2, THANATOS3_V_MODEL)
				if(!g_Mode[id]) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_A)
				else if(g_Mode[id] == MODE_WINGS_1) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_B)
				else if(g_Mode[id] == MODE_WINGS_2) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_C)
				else if(g_Mode[id] == MODE_WINGS_3) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_D)
				
				if(oldweap[id] != CSW_THANATOS3) 
				{
					if(!g_Mode[id]) UTIL_PlayWeaponAnimation(id, THANATOS3_DRAW_NORMAL)
					else if(g_Mode[id] == MODE_WINGS_1) UTIL_PlayWeaponAnimation(id, THANATOS3_DRAW_WINGS_1)
					else if(g_Mode[id] == MODE_WINGS_2) UTIL_PlayWeaponAnimation(id, THANATOS3_DRAW_WINGS_2)
					else if(g_Mode[id] == MODE_WINGS_3) UTIL_PlayWeaponAnimation(id, THANATOS3_DRAW_WINGS_3)
					
					set_player_nextattackx(id, 1.0)
					set_weapons_timeidle(id, CSW_THANATOS3, 1.0)
					
					message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
					write_string("weapon_thanatos3")
					write_byte(10)
					write_byte(120)
					write_byte(-1)
					write_byte(-1)
					write_byte(0)
					write_byte(7)
					write_byte(CSW_MP5NAVY)
					message_end()
				}
			}
		}
	}
	oldweap[id] = weaponid
}

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

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

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

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

public fw_thanatos3_PrimaryAttack_Post(Weapon)
{
	if(!pev_valid(Weapon))
		return
	
	g_IsInPrimaryAttack = 0
	new Player = get_pdata_cbase(Weapon, 41, 4)
	
	new szClip, szAmmo
	get_user_weapon(Player, szClip, szAmmo)
	
	if(!is_user_alive(Player))
		return
	if(!g_has_thanatos3[Player])
		return
	if (!g_clip_ammo[Player])
		return

	new Float:push[3]
	pev(Player,pev_punchangle,push)
	xs_vec_sub(push,cl_pushangle[Player],push)
		
	xs_vec_mul_scalar(push,get_pcvar_float(cvar_recoil_thanatos3),push)
	xs_vec_add(push,cl_pushangle[Player],push)
	set_pev(Player,pev_punchangle,push)
		
	emit_sound(Player, CHAN_WEAPON, Fire_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
	
	if(!g_Mode[Player]) UTIL_PlayWeaponAnimation(Player, THANATOS3_SHOOT_NORMAL)
	else if(g_Mode[Player] == MODE_WINGS_1) UTIL_PlayWeaponAnimation(Player, THANATOS3_SHOOT_WINGS_1)
	else if(g_Mode[Player] == MODE_WINGS_2) UTIL_PlayWeaponAnimation(Player, THANATOS3_SHOOT_WINGS_2)
	else if(g_Mode[Player] == MODE_WINGS_3) UTIL_PlayWeaponAnimation(Player, THANATOS3_SHOOT_WINGS_3)
	
	tn3_attacked[Player] ++
	if(tn3_attacked[Player] == 12)
	{
		Thanatos3_Change_Mode(Player)
	}
}

public Thanatos3_Change_Mode(id)
{
	if(!is_user_alive(id))
		return
	if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
		return
	
	if(g_Mode[id] == MODE_NORMAL)
	{
		tn3_attacked[id] = 0
		
		Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
		g_Ammo_Special[id] = 1
		Update_SpecialAmmo(id, g_Ammo_Special[id], 1)
	
		set_player_nextattackx(id, 0.1)
		set_weapons_timeidle(id, CSW_THANATOS3, 0.1)
		UTIL_PlayWeaponAnimation(id, THANATOS3_SPREAD_WINGS_1)
	}
	else if(g_Mode[id] == MODE_WINGS_1)
	{
		tn3_attacked[id] = 0
		
		Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
		g_Ammo_Special[id] = 2
		Update_SpecialAmmo(id, g_Ammo_Special[id], 1)
		
		set_player_nextattackx(id, 0.1)
		set_weapons_timeidle(id, CSW_THANATOS3, 0.1)
		UTIL_PlayWeaponAnimation(id, THANATOS3_SPREAD_WINGS_2)
	}
	else if(g_Mode[id] == MODE_WINGS_2)
	{
		tn3_attacked[id] = 0
		
		Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
		g_Ammo_Special[id] = 3
		Update_SpecialAmmo(id, g_Ammo_Special[id], 1)
		
		set_player_nextattackx(id, 0.1)
		set_weapons_timeidle(id, CSW_THANATOS3, 0.1)
		UTIL_PlayWeaponAnimation(id, THANATOS3_SPREAD_WINGS_3)
	}
	
	Do_Thanatos3_Change_Mode(id)
}

public Do_Thanatos3_Change_Mode(id)
{
	if(!is_user_alive(id))
		return
	if(!g_has_thanatos3[id])
		return
	
	if(g_Mode[id] == MODE_NORMAL) g_Mode[id] = MODE_WINGS_1
	else if(g_Mode[id] == MODE_WINGS_1) g_Mode[id] = MODE_WINGS_2
	else if(g_Mode[id] == MODE_WINGS_2) g_Mode[id] = MODE_WINGS_3
	
	if(!g_Mode[id]) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_A)
	else if(g_Mode[id] == MODE_WINGS_1) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_B)
	else if(g_Mode[id] == MODE_WINGS_2) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_C)
	else if(g_Mode[id] == MODE_WINGS_3) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_D)
}

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

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

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

     if (!g_has_thanatos3[id])
          return HAM_IGNORED

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

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

     new fInReload = get_pdata_int(weapon_entity, m_fInReload, WEAP_LINUX_XTRA_OFF) 

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

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

     if (!g_has_thanatos3[id])
          return HAM_IGNORED

     static iClipExtra

     if(g_has_thanatos3[id])
          iClipExtra = get_pcvar_num(cvar_clip_thanatos3)

     g_thanatos3_TmpClip[id] = -1

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

     if (iBpAmmo <= 0)
          return HAM_SUPERCEDE

     if (iClip >= iClipExtra)
          return HAM_SUPERCEDE

     g_thanatos3_TmpClip[id] = iClip

     return HAM_IGNORED
}

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

	if (!g_has_thanatos3[id])
		return HAM_IGNORED

	if (g_thanatos3_TmpClip[id] == -1)
		return HAM_IGNORED
	
	g_Reload[id] = true
	
	set_pdata_int(weapon_entity, m_iClip, g_thanatos3_TmpClip[id], WEAP_LINUX_XTRA_OFF)
	set_pdata_float(weapon_entity, m_flTimeWeaponIdle, THANATOS3_RELOAD_TIME, WEAP_LINUX_XTRA_OFF)
	set_pdata_float(id, m_flNextAttack, THANATOS3_RELOAD_TIME, PLAYER_LINUX_XTRA_OFF)
	set_pdata_int(weapon_entity, m_fInReload, 1, WEAP_LINUX_XTRA_OFF)
	
	if(g_Mode[id] == MODE_NORMAL)
	{
		UTIL_PlayWeaponAnimation(id, THANATOS3_RELOAD_NORMAL)
		set_task(THANATOS3_RELOAD_TIME, "Complete_Reload_Mode_Normal", weapon_entity)
	}
	else if(g_Mode[id] == MODE_WINGS_1)
	{
		UTIL_PlayWeaponAnimation(id, THANATOS3_RELOAD_WINGS_1)
		emit_sound(id, CHAN_WEAPON, Fire_Sounds[14], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
		set_task(THANATOS3_RELOAD_TIME, "Complete_Reload_Mode_Wings", weapon_entity)
	}
	else if(g_Mode[id] == MODE_WINGS_2)
	{
		UTIL_PlayWeaponAnimation(id, THANATOS3_RELOAD_WINGS_2)
		emit_sound(id, CHAN_WEAPON, Fire_Sounds[15], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
		set_task(THANATOS3_RELOAD_TIME, "Complete_Reload_Mode_Wings", weapon_entity)
	}
	else if(g_Mode[id] == MODE_WINGS_3)
	{
		UTIL_PlayWeaponAnimation(id, THANATOS3_RELOAD_WINGS_3)
		emit_sound(id, CHAN_WEAPON, Fire_Sounds[16], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
		set_task(THANATOS3_RELOAD_TIME, "Complete_Reload_Mode_Wings", weapon_entity)
	}

	return HAM_IGNORED
}

public Complete_Reload_Mode_Normal(weapon_entity)
{
	if(!pev_valid(weapon_entity))
		return
		
	new id = get_pdata_cbase(weapon_entity, 41, 4)
	
	g_Reload[id] = false
	UTIL_PlayWeaponAnimation(id, THANATOS3_IDLE_NORMAL)
	
	set_pdata_float(weapon_entity, 48, 20.0, 4)
}

public Complete_Reload_Mode_Wings(weapon_entity)
{
	if(!pev_valid(weapon_entity))
		return
		
	new id = get_pdata_cbase(weapon_entity, 41, 4)
	
	g_Reload[id] = false
	
	if(g_Mode[id] == MODE_WINGS_1) UTIL_PlayWeaponAnimation(id, THANATOS3_IDLE_WINGS_1)
	else if(g_Mode[id] == MODE_WINGS_2) UTIL_PlayWeaponAnimation(id, THANATOS3_IDLE_WINGS_2)
	else if(g_Mode[id] == MODE_WINGS_3) UTIL_PlayWeaponAnimation(id, THANATOS3_IDLE_WINGS_3)
	
	set_pdata_float(weapon_entity, 48, 20.0, 4)
}

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

stock set_player_nextattackx(id, Float:nexttime)
{
	if(!is_user_alive(id))
		return
		
	set_pdata_float(id, m_flNextAttack, nexttime, 5)
}

stock set_weapons_timeidle(id, WeaponId ,Float:TimeIdle)
{
	if(!is_user_alive(id))
		return
		
	static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
	if(!pev_valid(entwpn)) 
		return
		
	set_pdata_float(entwpn, 46, TimeIdle, WEAP_LINUX_XTRA_OFF)
	set_pdata_float(entwpn, 47, TimeIdle, WEAP_LINUX_XTRA_OFF)
	set_pdata_float(entwpn, 48, TimeIdle + 1.0, WEAP_LINUX_XTRA_OFF)
}

stock fm_set_weapon_ammo(entity, amount)
{
	set_pdata_int(entity, OFFSET_CLIPAMMO, amount, OFFSET_LINUX_WEAPONS);
}

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 fm_cs_get_current_weapon_ent(id)
{
	return get_pdata_cbase(id, OFFSET_ACTIVE_ITEM, OFFSET_LINUX)
}

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

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

stock create_blood(const Float:origin[3])
{
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY) 
	write_byte(TE_BLOODSPRITE)
	engfunc(EngFunc_WriteCoord, origin[0])
	engfunc(EngFunc_WriteCoord, origin[1])
	engfunc(EngFunc_WriteCoord, origin[2])
	write_short(m_iBlood[1])
	write_short(m_iBlood[0])
	write_byte(75)
	write_byte(8)
	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
}

stock create_fake_smokes(Float:Origin[3])
{
	static TE_FLAG
	
	TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
	TE_FLAG |= TE_EXPLFLAG_NOSOUND
	TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
	
	engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, Origin, 0)
	write_byte(TE_EXPLOSION)
	engfunc(EngFunc_WriteCoord, Origin[0])
	engfunc(EngFunc_WriteCoord, Origin[1])
	engfunc(EngFunc_WriteCoord, Origin[2] - 10.0)
	write_short(g_smokepuff_id)
	write_byte(2)
	write_byte(80)
	write_byte(TE_FLAG)
	message_end()
}

stock hook_ent(ent, Float:VicOrigin[3], Float:speed, type)
{
	static Float:fl_Velocity[3]
	static Float:EntOrigin[3]
	
	pev(ent, pev_origin, EntOrigin)
	
	static Float:distance_f
	distance_f = 100.0
	
	new Float:fl_Time = distance_f / speed
	
	if(type == 1)
	{
		fl_Velocity[0] = ((VicOrigin[0] - EntOrigin[0]) / fl_Time) * 1.5
		fl_Velocity[1] = ((VicOrigin[1] - EntOrigin[1]) / fl_Time) * 1.5
		fl_Velocity[2] = (VicOrigin[2] - EntOrigin[2]) / fl_Time		
	} else if(type == 2) {
		fl_Velocity[0] = ((EntOrigin[0] - VicOrigin[0]) / fl_Time) * 1.5
		fl_Velocity[1] = ((EntOrigin[1] - VicOrigin[1]) / fl_Time) * 1.5
		fl_Velocity[2] = (EntOrigin[2] - VicOrigin[2]) / fl_Time
	}
	
	entity_set_vector(ent, EV_VEC_velocity, fl_Velocity)
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
*/
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 <engine>
  3. #include <fakemeta_util>
  4. #include <cstrike>
  5. #include <fun>
  6. #include <xs>
  7.  
  8.  
  9. #define PLUGIN  "[CSO] Primary Weapon : Thanatos-3"
  10. #define VERSION "1.2 beta" // Full version; Buy its
  11. #define AUTHOR  "Asep || Facebook.com/asepdwa10 & Dev!l"
  12.  
  13. #define ENG_NULLENT         -1
  14. #define EV_INT_WEAPONKEY        EV_INT_impulse
  15. #define THANATOS3_WEAPONKEY         29221
  16. #define MAX_PLAYERS             32
  17. #define IsValidUser(%1)         (1 <= %1 <= g_MaxPlayers)
  18.  
  19. #define WEAP_LINUX_XTRA_OFF     4
  20. #define m_fKnown            44
  21. #define m_flNextPrimaryAttack       46
  22. #define m_flTimeWeaponIdle      48
  23. #define m_iClip             51
  24. #define m_fInReload         54
  25. #define PLAYER_LINUX_XTRA_OFF       5
  26. #define m_flNextAttack          83
  27.  
  28. // ======================================================= //
  29. // ALL CONFIGURATION AND TIME DELAY ANIM ViewModels RELOAD //
  30. // ======================================================= //
  31. #define THANATOS3_RELOAD_TIME       3.5
  32. #define THANATOS3_IDLE_NORMAL       0
  33. #define THANATOS3_IDLE_WINGS_1      1
  34. #define THANATOS3_IDLE_WINGS_2      2
  35. #define THANATOS3_IDLE_WINGS_3      3
  36. #define THANATOS3_SHOOT_NORMAL      4
  37. #define THANATOS3_SHOOT_WINGS_1     5
  38. #define THANATOS3_SHOOT_WINGS_2     6
  39. #define THANATOS3_SHOOT_WINGS_3     7
  40. #define THANATOS3_FLYING_WINGS_1    8
  41. #define THANATOS3_FLYING_WINGS_2    9
  42. #define THANATOS3_FLYING_WINGS_3    10
  43. #define THANATOS3_RELOAD_NORMAL     11
  44. #define THANATOS3_RELOAD_WINGS_1    12
  45. #define THANATOS3_RELOAD_WINGS_2    13
  46. #define THANATOS3_RELOAD_WINGS_3    14
  47. #define THANATOS3_SPREAD_WINGS_1    15
  48. #define THANATOS3_SPREAD_WINGS_2    16
  49. #define THANATOS3_SPREAD_WINGS_3    17
  50. #define THANATOS3_DRAW_NORMAL       18
  51. #define THANATOS3_DRAW_WINGS_1      19
  52. #define THANATOS3_DRAW_WINGS_2      20
  53. #define THANATOS3_DRAW_WINGS_3      21
  54. // ========================================================== //
  55. // CONFIGURATION LIMITS AND TIME DELAY ANIM ViewModels RELOAD //
  56. // ========================================================== //
  57.  
  58. #define weapon_thanatos3        "weapon_mp5navy"
  59. #define CSW_THANATOS3           CSW_MP5NAVY
  60. #define TASK_FLYING         919924
  61.  
  62. #define write_coord_f(%1)       engfunc(EngFunc_WriteCoord,%1)
  63.  
  64. #define THANATOS3_SCYTHE_CLASSNAME  "scythe_thanatos3"
  65. #define THANATOS3_SCYTHE_WIND_CLASSNAME "scythe_thanatos3_wind_attack"
  66.  
  67. enum
  68. {
  69.     MODE_NORMAL = 0,
  70.     MODE_WINGS_1,
  71.     MODE_WINGS_2,
  72.     MODE_WINGS_3
  73. }
  74.  
  75. const USE_STOPPED = 0
  76. const OFFSET_ACTIVE_ITEM = 373
  77. const OFFSET_WEAPONOWNER = 41
  78. const OFFSET_LINUX = 5
  79. const OFFSET_LINUX_WEAPONS = 4
  80.  
  81. new const Fire_Sounds[][] =
  82. {
  83.     "weapons/cso/thanatos3-1.wav",
  84.     "weapons/cso/thanatos3_boltpull.wav",
  85.     "weapons/cso/thanatos3_clipout.wav",
  86.     "weapons/cso/thanatos3_clipin.wav",
  87.     "weapons/cso/thanatos3_draw.wav",
  88.     "weapons/cso/thanatos3_draw_w1.wav",
  89.     "weapons/cso/thanatos3_fly_shoot.wav",
  90.     "weapons/cso/thanatos3_fly_w2.wav",
  91.     "weapons/cso/thanatos3_fly_w3.wav",
  92.     "weapons/cso/thanatos3_ilde_w1.wav",
  93.     "weapons/cso/thanatos3_ilde_w2.wav",
  94.     "weapons/cso/thanatos3_ilde_w3.wav",
  95.     "weapons/cso/thanatos3_knife_hit.wav",
  96.     "weapons/cso/thanatos3_knife_swish.wav",
  97.     "weapons/cso/thanatos3_reload_w1.wav",
  98.     "weapons/cso/thanatos3_reload_w2.wav",
  99.     "weapons/cso/thanatos3_reload_w3.wav",
  100.     "weapons/cso/thanatos3_spread_w1.wav"
  101. }
  102.  
  103. new THANATOS3_V_MODEL[64] = "models/cso/v_thanatos3.mdl"
  104. new THANATOS3_P_MODEL_A[64] = "models/cso/p_thanatos3a.mdl"
  105. new THANATOS3_P_MODEL_B[64] = "models/cso/p_thanatos3b.mdl"
  106. new THANATOS3_P_MODEL_C[64] = "models/cso/p_thanatos3c.mdl"
  107. new THANATOS3_P_MODEL_D[64] = "models/cso/p_thanatos3d.mdl"
  108. new THANATOS3_W_MODEL[64] = "models/cso/w_thanatos3.mdl"
  109. new THANATOS3_W_MODEL_B[64] = "models/cso/w_thanatos3b.mdl"
  110. new THANATOS3_S_MODEL[64] = "models/cso/thanatos3_knife.mdl"
  111. new THANATOS3_S_WIND_MODEL[64] = "models/cso/thanatos3_wind.mdl"
  112.  
  113. new const GUNSHOT_DECALS[] = { 41, 42, 43, 44, 45 }
  114.  
  115. new Float:cl_pushangle[MAX_PLAYERS + 1][3], m_iBlood[2], gmsgWeaponList, tn3_attacked[33]
  116. new g_has_thanatos3[33], g_clip_ammo[33], g_thanatos3_TmpClip[33], oldweap[33], sTrail, g_smokepuff_id
  117. new cvar_dmg_thanatos3, cvar_recoil_thanatos3, cvar_clip_thanatos3, cvar_spd_thanatos3, cvar_thanatos3_ammo, g_Ammo_Special[33]
  118. new g_MaxPlayers, g_orig_event_thanatos3, g_IsInPrimaryAttack, g_Mode[33], g_Reload[33], g_register, g_iItemID
  119.  
  120. const PRIMARY_WEAPONS_BIT_SUM =
  121. (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_THANATOS3)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<
  122. 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)
  123. new const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
  124.             "weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
  125.             "weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
  126.             "weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
  127.             "weapon_ak47", "weapon_knife", "weapon_p90" }
  128.  
  129. public plugin_init()
  130. {
  131.     register_plugin(PLUGIN, VERSION, AUTHOR)
  132.     register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
  133.     register_event("CurWeapon","CurrentWeapon","be","1=1")
  134.    
  135.     RegisterHam(Ham_Item_AddToPlayer, weapon_thanatos3, "fw_thanatos3_AddToPlayer")
  136.     RegisterHam(Ham_Weapon_PrimaryAttack, weapon_thanatos3, "fw_thanatos3_PrimaryAttack")
  137.     RegisterHam(Ham_Weapon_PrimaryAttack, weapon_thanatos3, "fw_thanatos3_PrimaryAttack_Post", 1)
  138.     RegisterHam(Ham_Weapon_WeaponIdle, weapon_thanatos3, "fw_thanatos3_idle_anim", 1)
  139.     RegisterHam(Ham_Item_PostFrame, weapon_thanatos3, "thanatos3_ItemPostFrame")
  140.     RegisterHam(Ham_Weapon_Reload, weapon_thanatos3, "thanatos3_Reload")
  141.     RegisterHam(Ham_Weapon_Reload, weapon_thanatos3, "thanatos3_Reload_Post", 1)
  142.    
  143.     for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
  144.         if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)
  145.    
  146.     register_forward(FM_SetModel, "fw_SetModel")
  147.     register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
  148.     register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
  149.     register_forward(FM_CmdStart, "fw_CmdStart")
  150.    
  151.     register_think(THANATOS3_SCYTHE_WIND_CLASSNAME, "fw_Scythe_Wind_Think")
  152.    
  153.     register_think(THANATOS3_SCYTHE_CLASSNAME, "fw_Think_Scythe")
  154.     register_touch(THANATOS3_SCYTHE_CLASSNAME, "*", "fw_Touch_Scythe")
  155.    
  156.     RegisterHam(Ham_TraceAttack, "func_door", "fw_TraceAttack", 1)
  157.     RegisterHam(Ham_TraceAttack, "func_door_rotating", "fw_TraceAttack", 1)
  158.     RegisterHam(Ham_TraceAttack, "func_plat", "fw_TraceAttack", 1)
  159.     RegisterHam(Ham_TraceAttack, "func_rotating", "fw_TraceAttack", 1)
  160.     RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack", 1)
  161.     RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack", 1)
  162.     RegisterHam(Ham_TraceAttack, "func_wall", "fw_TraceAttack", 1)
  163.    
  164.     RegisterHam(Ham_Use, "func_tank", "fw_UseStationary_Post", 1)
  165.     RegisterHam(Ham_Use, "func_tankmortar", "fw_UseStationary_Post", 1)
  166.     RegisterHam(Ham_Use, "func_tankrocket", "fw_UseStationary_Post", 1)
  167.     RegisterHam(Ham_Use, "func_tanklaser", "fw_UseStationary_Post", 1)
  168.    
  169.     RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
  170.     RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
  171.    
  172.     cvar_clip_thanatos3 = register_cvar("thanatos3_clip", "60")
  173.     cvar_spd_thanatos3 = register_cvar("thanatos3_speed", "1.04")
  174.     cvar_thanatos3_ammo = register_cvar("thanatos3_ammo", "240")
  175.     cvar_dmg_thanatos3 = register_cvar("thanatos3_damage", "1.6")
  176.     cvar_recoil_thanatos3 = register_cvar("thanatos3_recoil", "0.50")
  177.    
  178.     g_MaxPlayers = get_member_game(m_nMaxPlayers)
  179.     gmsgWeaponList = get_user_msgid("WeaponList")
  180.  
  181.     g_iItemID = ze_register_item("Thanatos-3", 0, 0)
  182. }
  183.  
  184. public plugin_precache()
  185. {
  186.     precache_model(THANATOS3_V_MODEL)
  187.     precache_model(THANATOS3_P_MODEL_A)
  188.     precache_model(THANATOS3_P_MODEL_B)
  189.     precache_model(THANATOS3_P_MODEL_C)
  190.     precache_model(THANATOS3_P_MODEL_D)
  191.     precache_model(THANATOS3_W_MODEL)
  192.     precache_model(THANATOS3_W_MODEL_B)
  193.     precache_model(THANATOS3_S_MODEL)
  194.     precache_model(THANATOS3_S_WIND_MODEL)
  195.    
  196.     g_smokepuff_id = precache_model("sprites/wall_puff1.spr")
  197.     sTrail = precache_model("sprites/laserbeam.spr")
  198.    
  199.     for(new i = 0; i < sizeof Fire_Sounds; i++)
  200.         precache_sound(Fire_Sounds[i])
  201.    
  202.     m_iBlood[0] = precache_model("sprites/blood.spr")
  203.     m_iBlood[1] = precache_model("sprites/bloodspray.spr")
  204.    
  205.     register_forward(FM_PrecacheEvent, "fwPrecacheEvent_Post", 1)
  206. }
  207.  
  208. public weapon_hook(id)
  209. {
  210.         engclient_cmd(id, "weapon_mp5navy")
  211.         return PLUGIN_HANDLED
  212. }
  213. public plugin_natives(){
  214.     register_native("give_t3", "thanatos3_give");
  215. }
  216.  
  217. public client_putinserver(id)
  218. {
  219.     if(is_user_bot(id) && !g_register)
  220.     {
  221.         g_register = 1
  222.         set_task(0.1, "ham_register", id)
  223.     }
  224. }
  225.  
  226. public ham_register(id)
  227. {
  228.     RegisterHamFromEntity(Ham_TakeDamage, id, "fw_TakeDamage") 
  229.     RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack")   
  230. }
  231.  
  232. public thanatos3_give(id)
  233. {      
  234.     give_thanatos3(id)
  235.    
  236.     return PLUGIN_CONTINUE
  237. }
  238.  
  239. public ze_select_item_pre(id, itemid)
  240. {
  241.     if (itemid != g_iItemID)
  242.         return ZE_ITEM_AVAILABLE
  243.  
  244.     if (ze_is_user_zombie(id))
  245.         return ZE_ITEM_DONT_SHOW
  246.  
  247.     return ZE_ITEM_AVAILABLE
  248. }
  249.  
  250. public ze_select_item_post(id, itemid)
  251. {
  252.     if (itemid != g_iItemID)
  253.         return
  254.  
  255.     give_thanatos3(id)
  256. }
  257.  
  258. public fw_TraceAttack(iEnt, iAttacker, Float:flDamage, Float:fDir[3], ptr, iDamageType)
  259. {
  260.     if(!is_user_alive(iAttacker))
  261.         return
  262.     new g_currentweapon = get_user_weapon(iAttacker)
  263.     if(g_currentweapon != CSW_THANATOS3) return
  264.     if(!g_has_thanatos3[iAttacker]) return
  265.    
  266.     static Float:flEnd[3]
  267.     get_tr2(ptr, TR_vecEndPos, flEnd)
  268.    
  269.     if(!is_user_alive(iEnt))
  270.     {
  271.         create_fake_smokes(flEnd)
  272.        
  273.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  274.         write_byte(TE_DECAL)
  275.         write_coord_f(flEnd[0])
  276.         write_coord_f(flEnd[1])
  277.         write_coord_f(flEnd[2])
  278.         write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
  279.         write_short(iEnt)
  280.         message_end()
  281.  
  282.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  283.         write_byte(TE_WORLDDECAL)
  284.         write_coord_f(flEnd[0])
  285.         write_coord_f(flEnd[1])
  286.         write_coord_f(flEnd[2])
  287.         write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
  288.         message_end()
  289.        
  290.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  291.         write_byte(TE_GUNSHOTDECAL)
  292.         write_coord_f(flEnd[0])
  293.         write_coord_f(flEnd[1])
  294.         write_coord_f(flEnd[2])
  295.         write_short(iAttacker)
  296.         write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
  297.         message_end()
  298.     }
  299. }
  300.  
  301. public fw_CmdStart(id, uc_handle, seed)
  302. {
  303.     if(!is_user_alive(id))
  304.         return FMRES_IGNORED;
  305.     if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
  306.         return FMRES_IGNORED;
  307.     if(!g_clip_ammo[id] || g_Reload[id])   
  308.         return FMRES_IGNORED;
  309.        
  310.     static PressedButton
  311.     PressedButton = get_uc(uc_handle, UC_Buttons)
  312.    
  313.     if(PressedButton & IN_ATTACK2)
  314.     {
  315.         if(get_pdata_float(id, 83, 5) > 0.0)
  316.             return FMRES_IGNORED
  317.            
  318.         PressedButton &= ~IN_ATTACK2
  319.         set_uc(uc_handle, UC_Buttons, PressedButton)
  320.        
  321.         if(g_Mode[id] == MODE_WINGS_1) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_A)
  322.         else if(g_Mode[id] == MODE_WINGS_2) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_A)
  323.         else if(g_Mode[id] == MODE_WINGS_3) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_A)
  324.        
  325.         static Float:Origin[3]
  326.         if(g_Mode[id] == MODE_WINGS_1)
  327.         {
  328.             UTIL_PlayWeaponAnimation(id, THANATOS3_FLYING_WINGS_1)
  329.             emit_sound(id, CHAN_WEAPON, Fire_Sounds[6], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  330.            
  331.             get_position(id, 2.0, 0.0, 0.0, Origin)
  332.             Special_Shoot_Wings(id, Origin, 0.0)
  333.            
  334.             set_task(0.1, "Special_Shoot_Wings_2", id+TASK_FLYING)
  335.            
  336.             set_task(0.6, "Reset_Mode", id)
  337.             set_player_nextattackx(id, 2.0)
  338.             set_weapons_timeidle(id, CSW_MP5NAVY, 2.0)
  339.         }
  340.         else if(g_Mode[id] == MODE_WINGS_2)
  341.         {
  342.             UTIL_PlayWeaponAnimation(id, THANATOS3_FLYING_WINGS_2)
  343.             emit_sound(id, CHAN_WEAPON, Fire_Sounds[6], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  344.            
  345.             get_position(id, 2.0, 0.0, 0.0, Origin)
  346.             Special_Shoot_Wings(id, Origin, 0.0)
  347.            
  348.             set_task(0.2, "Special_Shoot_Wings_2", id+TASK_FLYING)
  349.             set_task(0.3, "Special_Shoot_Wings_3", id+TASK_FLYING)
  350.             set_task(0.4, "Special_Shoot_Wings_4", id+TASK_FLYING)
  351.            
  352.             set_task(0.6, "Reset_Mode", id)
  353.             set_player_nextattackx(id, 2.0)
  354.             set_weapons_timeidle(id, CSW_MP5NAVY, 2.0)
  355.         }
  356.         else if(g_Mode[id] == MODE_WINGS_3)
  357.         {
  358.             UTIL_PlayWeaponAnimation(id, THANATOS3_FLYING_WINGS_3)
  359.             emit_sound(id, CHAN_WEAPON, Fire_Sounds[6], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  360.            
  361.             get_position(id, 2.0, 0.0, 0.0, Origin)
  362.             Special_Shoot_Wings(id, Origin, 0.0)
  363.            
  364.             set_task(0.1, "Special_Shoot_Wings_2", id+TASK_FLYING)
  365.             set_task(0.2, "Special_Shoot_Wings_3", id+TASK_FLYING)
  366.             set_task(0.3, "Special_Shoot_Wings_4", id+TASK_FLYING)
  367.             set_task(0.4, "Special_Shoot_Wings_5", id+TASK_FLYING)
  368.             set_task(0.5, "Special_Shoot_Wings_6", id+TASK_FLYING)
  369.            
  370.             set_task(0.6, "Reset_Mode", id)
  371.             set_player_nextattackx(id, 2.0)
  372.             set_weapons_timeidle(id, CSW_MP5NAVY, 2.0)
  373.         }
  374.     }
  375.    
  376.     return FMRES_HANDLED
  377. }
  378.  
  379. public Special_Shoot_Wings_2(id)
  380. {
  381.     id -= TASK_FLYING
  382.    
  383.     if(!is_user_alive(id) || !is_user_connected(id))
  384.         return
  385.     if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
  386.         return
  387.            
  388.     new Float:Origin[3]
  389.    
  390.     if(g_Mode[id] == MODE_WINGS_1)
  391.     {
  392.         get_position(id, 0.0, 12.0, 0.0, Origin)
  393.         Special_Shoot_Wings(id, Origin, 12.0)
  394.     }
  395.     else if(g_Mode[id] == MODE_WINGS_2)
  396.     {
  397.         get_position(id, 0.0, -12.0, 0.0, Origin)
  398.         Special_Shoot_Wings(id, Origin, -12.0)
  399.     }
  400.     else if(g_Mode[id] == MODE_WINGS_3)
  401.     {
  402.         get_position(id, 0.0, -24.0, 0.0, Origin)
  403.         Special_Shoot_Wings(id, Origin, -24.0)
  404.     }
  405. }
  406.  
  407. public Special_Shoot_Wings_3(id)
  408. {
  409.     id -= TASK_FLYING
  410.    
  411.     if(!is_user_alive(id) || !is_user_connected(id))
  412.         return
  413.     if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
  414.         return
  415.        
  416.     new Float:Origin[3]
  417.    
  418.     if(g_Mode[id] == MODE_WINGS_2)
  419.     {
  420.         get_position(id, 0.0, 12.0, 0.0, Origin)
  421.         Special_Shoot_Wings(id, Origin, 12.0)
  422.     }
  423.     else if(g_Mode[id] == MODE_WINGS_3)
  424.     {
  425.         get_position(id, 0.0, -12.0, 0.0, Origin)
  426.         Special_Shoot_Wings(id, Origin, -12.0)
  427.     }
  428. }
  429.  
  430. public Special_Shoot_Wings_4(id)
  431. {
  432.     id -= TASK_FLYING
  433.    
  434.     if(!is_user_alive(id) || !is_user_connected(id))
  435.         return
  436.     if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
  437.         return
  438.        
  439.     new Float:Origin[3]
  440.    
  441.     if(g_Mode[id] == MODE_WINGS_2)
  442.     {
  443.         get_position(id, 0.0, 24.0, 0.0, Origin)
  444.         Special_Shoot_Wings(id, Origin, 24.0)
  445.     }
  446.     else if(g_Mode[id] == MODE_WINGS_3)
  447.     {
  448.         get_position(id, 0.0, 12.0, 0.0, Origin)
  449.         Special_Shoot_Wings(id, Origin, 12.0)
  450.     }
  451. }
  452.  
  453. public Special_Shoot_Wings_5(id)
  454. {
  455.     id -= TASK_FLYING
  456.    
  457.     if(!is_user_alive(id) || !is_user_connected(id))
  458.         return
  459.     if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
  460.         return
  461.        
  462.     new Float:Origin[3]
  463.    
  464.     get_position(id, 0.0, 12.0, 0.0, Origin)
  465.     Special_Shoot_Wings(id, Origin, 12.0)
  466. }
  467.  
  468. public Special_Shoot_Wings_6(id)
  469. {
  470.     id -= TASK_FLYING
  471.  
  472.     if(!is_user_alive(id) || !is_user_connected(id))
  473.         return
  474.     if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
  475.         return
  476.        
  477.     new Float:Origin[3]
  478.    
  479.     get_position(id, 0.0, 36.0, 0.0, Origin)
  480.     Special_Shoot_Wings(id, Origin, 36.0)
  481. }
  482.  
  483.  
  484. public Reset_Mode(id)
  485. {
  486.     if(!is_user_alive(id))
  487.         return
  488.     if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
  489.         return
  490.        
  491.     g_Mode[id] = MODE_NORMAL
  492.     tn3_attacked[id] = 0
  493.    
  494.     g_Ammo_Special[id] = 0
  495.     Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
  496. }
  497.  
  498. public Special_Shoot_Wings(id, Float:StartOrigin[3], Float:New_Target)
  499. {
  500.     if(!is_user_alive(id))
  501.         return
  502.     if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
  503.         return
  504.        
  505.     static Float:TargetOrigin[3], Float:angles[3], Float:angles_fix[3]
  506.  
  507.     pev(id,pev_v_angle,angles)
  508.     new Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
  509.  
  510.     angles_fix[0] = 450.0 - angles[0]
  511.     angles_fix[1] = angles[1]
  512.     angles_fix[2] = angles[2]
  513.  
  514.     set_pev(Ent, pev_movetype, MOVETYPE_FLY)
  515.     set_pev(Ent, pev_owner, id)
  516.    
  517.     entity_set_string(Ent, EV_SZ_classname, THANATOS3_SCYTHE_CLASSNAME)
  518.     engfunc(EngFunc_SetModel, Ent, THANATOS3_S_MODEL)
  519.     set_pev(Ent, pev_mins,{ -0.1, -0.1, -0.1 })
  520.     set_pev(Ent, pev_maxs,{ 0.1, 0.1, 0.1 })
  521.     set_pev(Ent, pev_origin, StartOrigin)
  522.     set_pev(Ent, pev_angles, angles_fix)
  523.     set_pev(Ent, pev_gravity, 0.01)
  524.     set_pev(Ent, pev_solid, SOLID_BBOX)
  525.     set_pev(Ent, pev_frame, 0.0)
  526.    
  527.     set_pev(Ent, pev_animtime, get_gametime())
  528.     set_pev(Ent, pev_framerate, 1.0)
  529.     set_pev(Ent, pev_sequence, 0)
  530.    
  531.     entity_set_float(Ent, EV_FL_nextthink, halflife_time() + 0.01)
  532.    
  533.     static Float:Velocity[3]
  534.     fm_get_aim_origin(id, TargetOrigin)
  535.  
  536.     TargetOrigin[1] += New_Target
  537.    
  538.     get_speed_vector(StartOrigin, TargetOrigin, 2000.0, Velocity)
  539.     set_pev(Ent, pev_velocity, Velocity)
  540.    
  541.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  542.     write_byte(TE_BEAMFOLLOW) // Temporary entity ID
  543.     write_short(Ent) // Entity
  544.     write_short(sTrail) // Sprite index
  545.     write_byte(4) // Life
  546.     write_byte(2) // Line width
  547.     write_byte(65)
  548.     write_byte(69)
  549.     write_byte(121)
  550.     write_byte(255) // Alpha
  551.     message_end()
  552. }
  553.  
  554. public fw_Think_Scythe(Ent)
  555. {
  556.     if(!pev_valid(Ent))
  557.         return
  558.        
  559.     static Classname[32]
  560.     pev(Ent, pev_classname, Classname, sizeof(Classname))
  561.    
  562.     if(!equal(Classname, THANATOS3_SCYTHE_CLASSNAME))
  563.         return
  564. }
  565.  
  566. public fw_Touch_Scythe(Ent, Id)
  567. {
  568.     if(!pev_valid(Ent))
  569.         return
  570.    
  571.     new Float:originF[3]
  572.     pev(Ent, pev_origin, originF)
  573.    
  574.     static Owner; Owner = pev(Ent, pev_owner)
  575.     if(is_user_alive(Id) && ze_is_user_zombie(Id))
  576.     {
  577.         static Float:MyOrigin[3]
  578.         pev(Owner, pev_origin, MyOrigin)
  579.        
  580.         create_blood(originF)
  581.         create_blood(originF)
  582.         create_blood(originF)
  583.         create_blood(originF)
  584.        
  585.         hook_ent(Id, MyOrigin, 50.0, 2)
  586.         ExecuteHamB(Ham_TakeDamage, Id, 0, Owner, random_float(25.0,60.0), DMG_BULLET)
  587.        
  588.         Scythe_Wind_Attack(Id, Owner)
  589.         emit_sound(Id, CHAN_WEAPON, Fire_Sounds[12], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  590.     }
  591.     else
  592.     {
  593.         new Float:originn[3]
  594.         pev(Ent, pev_origin, originn)
  595.        
  596.         create_fake_smokes(originn)
  597.        
  598.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  599.         write_byte(TE_DECAL)
  600.         write_coord_f(originn[0])
  601.         write_coord_f(originn[1])
  602.         write_coord_f(originn[2])
  603.         write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
  604.         write_short(Ent)
  605.         message_end()
  606.        
  607.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  608.         write_byte(TE_WORLDDECAL)
  609.         write_coord_f(originn[0])
  610.         write_coord_f(originn[1])
  611.         write_coord_f(originn[2])
  612.         write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
  613.         message_end()
  614.     }
  615.    
  616.     remove_entity(Ent)
  617. }
  618.  
  619. public Scythe_Wind_Attack(id, attacker)
  620. {
  621.     static Ent; Ent = fm_find_ent_by_owner(-1, THANATOS3_SCYTHE_WIND_CLASSNAME, id)
  622.     if(is_user_alive(id) && ze_is_user_zombie(id))
  623.     {
  624.         new iEnt = create_entity("info_target")
  625.        
  626.         static Float:MyOrigin[3], Float:New_Origin[3]
  627.         pev(id, pev_origin, MyOrigin)
  628.        
  629.         set_pev(iEnt, pev_movetype, MOVETYPE_FOLLOW)
  630.         set_pev(iEnt, pev_scale, 2.0)
  631.         set_pev(iEnt, pev_nextthink, get_gametime() + 0.1)
  632.        
  633.         entity_set_string(iEnt, EV_SZ_classname, THANATOS3_SCYTHE_WIND_CLASSNAME)
  634.         engfunc(EngFunc_SetModel, iEnt, THANATOS3_S_WIND_MODEL)
  635.        
  636.         if(pev_valid(Ent) == 1)
  637.         {
  638.             New_Origin[0] = -1.5
  639.             New_Origin[1] = 1.5
  640.             New_Origin[2] = 50.0
  641.         }
  642.         else if(pev_valid(Ent) == 2)
  643.         {
  644.             New_Origin[0] = -1.0
  645.             New_Origin[1] = 1.0
  646.             New_Origin[2] = 40.0
  647.         }
  648.         else if(pev_valid(Ent) == 3)
  649.         {
  650.             New_Origin[0] = -0.5
  651.             New_Origin[1] = 0.5
  652.             New_Origin[2] = 30.0
  653.         }
  654.         else if(pev_valid(Ent) == 4)
  655.         {
  656.             New_Origin[0] = 0.0
  657.             New_Origin[1] = 0.0
  658.             New_Origin[2] = 20.0
  659.         }
  660.         else if(pev_valid(Ent) == 5)
  661.         {
  662.             New_Origin[0] = 0.5
  663.             New_Origin[1] = -0.5
  664.             New_Origin[2] = 10.0
  665.         }
  666.         else if(pev_valid(Ent) == 6)
  667.         {
  668.             New_Origin[0] = 1.0
  669.             New_Origin[1] = -1.0
  670.             New_Origin[2] = 0.0
  671.         }
  672.        
  673.         MyOrigin[0] += New_Origin[0]
  674.         MyOrigin[1] += New_Origin[1]
  675.         MyOrigin[2] += New_Origin[2]
  676.        
  677.         set_pev(iEnt, pev_origin, MyOrigin)
  678.         set_pev(iEnt, pev_owner, attacker)
  679.         set_pev(iEnt, pev_aiment, id)
  680.        
  681.         set_pev(iEnt, pev_fuser1, get_gametime() + 6.0)
  682.         set_pev(iEnt, pev_animtime, get_gametime())
  683.         set_pev(iEnt, pev_framerate, 4.0)
  684.         set_pev(iEnt, pev_sequence, 0)
  685.        
  686.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  687.         write_byte(TE_BEAMFOLLOW) // Temporary entity ID
  688.         write_short(iEnt) // Entity
  689.         write_short(sTrail) // Sprite index
  690.         write_byte(5) // Life
  691.         write_byte(2) // Line width
  692.         write_byte(65)
  693.         write_byte(69)
  694.         write_byte(121)
  695.         write_byte(100) // Alpha
  696.         message_end()
  697.     }
  698.     else if(!is_user_alive(id) || !ze_is_user_zombie(id))
  699.     {
  700.         engfunc(EngFunc_RemoveEntity, Ent)
  701.     }
  702. }
  703.  
  704. public fw_Scythe_Wind_Think(iEnt)
  705. {
  706.     if(!pev_valid(iEnt))
  707.     {
  708.         remove_entity(iEnt)
  709.     }
  710.    
  711.     static attacker
  712.     attacker = pev(iEnt, pev_owner)
  713.    
  714.     static victim, Float:g_SoundTime[33], Float:g_DamageTime[33], Float:Damage[33]
  715.     victim = pev(iEnt, pev_aiment)
  716.    
  717.     static Float:OriginF[3]
  718.     pev(iEnt, pev_origin, OriginF)
  719.    
  720.     static Float:fTimeRemove
  721.     pev(iEnt, pev_fuser1, fTimeRemove)
  722.    
  723.     set_pev(iEnt, pev_nextthink, get_gametime() + 0.05)
  724.    
  725.     if(ze_is_user_zombie(attacker) || !is_user_alive(attacker)) engfunc(EngFunc_RemoveEntity, iEnt)
  726.     if(!ze_is_user_zombie(victim) || !is_user_alive(victim)) engfunc(EngFunc_RemoveEntity, iEnt)
  727.    
  728.     if(get_gametime() - 1.0 > g_DamageTime[victim])
  729.     {
  730.         g_DamageTime[victim] = get_gametime()
  731.        
  732.         create_blood(OriginF)
  733.         create_blood(OriginF)
  734.         create_blood(OriginF)
  735.         create_blood(OriginF)
  736.        
  737.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  738.         write_byte(TE_GUNSHOTDECAL)
  739.         write_coord_f(OriginF[0])
  740.         write_coord_f(OriginF[1])
  741.         write_coord_f(OriginF[2])
  742.         write_short(attacker)
  743.         write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
  744.         message_end()
  745.    
  746.         if(pev_valid(iEnt) == 2) Damage[attacker] = random_float(60.0,120.0);
  747.         else if(pev_valid(iEnt) == 4) Damage[attacker] = random_float(50.0,60.0);
  748.         else if(pev_valid(iEnt) == 6) Damage[attacker] = random_float(25.0,50.0);
  749.        
  750.         ExecuteHamB(Ham_TakeDamage, victim, attacker, attacker, Damage[attacker], DMG_BULLET)
  751.         set_pev(iEnt, pev_fuser2, get_gametime())
  752.     }
  753.     else if(get_gametime() - 0.1 > g_SoundTime[victim])
  754.     {
  755.         g_SoundTime[victim] = get_gametime()
  756.        
  757.         //set_pev(iEnt, pev_animtime, get_gametime())
  758.         //set_pev(iEnt, pev_framerate, 2.0)
  759.         //set_pev(iEnt, pev_sequence, 1)
  760.        
  761.         emit_sound(iEnt, CHAN_WEAPON, Fire_Sounds[13], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  762.     }
  763.     else if (get_gametime() >= fTimeRemove)
  764.     {
  765.         engfunc(EngFunc_RemoveEntity, iEnt)
  766.         return;
  767.     }
  768. }
  769.  
  770. public fwPrecacheEvent_Post(type, const name[])
  771. {
  772.     if(equal("events/mp5n.sc", name))
  773.     {
  774.         g_orig_event_thanatos3 = get_orig_retval()
  775.         return FMRES_HANDLED
  776.     }
  777.     return FMRES_IGNORED
  778. }
  779.  
  780. public fw_PlayerKilled(id)
  781. {
  782.     g_has_thanatos3[id] = false
  783.     g_Mode[id] = MODE_NORMAL
  784.     g_Reload[id] = false
  785.     g_Ammo_Special[id] = 0
  786.    
  787.     Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
  788. }
  789.  
  790. public ze_user_infected(id)
  791. {
  792.     g_has_thanatos3[id] = false
  793.     g_Mode[id] = MODE_NORMAL
  794.     g_Reload[id] = false
  795.     g_Ammo_Special[id] = 0
  796.    
  797.     Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
  798. }
  799.  
  800. public client_connect(id)
  801. {
  802.     g_has_thanatos3[id] = false
  803.     g_Mode[id] = MODE_NORMAL
  804.     g_Reload[id] = false
  805.     g_Ammo_Special[id] = 0
  806.    
  807.     Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
  808. }
  809.  
  810. public client_disconnected(id)
  811. {
  812.     g_has_thanatos3[id] = false
  813.     g_Mode[id] = MODE_NORMAL
  814.     g_Reload[id] = false
  815.     g_Ammo_Special[id] = 0
  816.    
  817.     Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
  818. }
  819.  
  820. public Update_SpecialAmmo(id, Ammo, On)
  821. {
  822.     static AmmoSprites[33], On, Ammo_Asli
  823.    
  824.     if(Ammo == 1) Ammo_Asli = 2
  825.     else if(Ammo == 2) Ammo_Asli = 4
  826.     else if(Ammo == 3) Ammo_Asli = 6
  827.    
  828.     format(AmmoSprites, sizeof(AmmoSprites), "number_%d", Ammo_Asli)
  829.    
  830.     message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("StatusIcon"), {0,0,0}, id)
  831.     write_byte(On)
  832.     write_string(AmmoSprites)
  833.     write_byte(42) // red
  834.     write_byte(42) // green
  835.     write_byte(252) // blue
  836.     message_end()
  837. }
  838.  
  839. public fw_thanatos3_idle_anim(Weapon)
  840. {
  841.     new id = get_pdata_cbase(Weapon, 41, 4)
  842.  
  843.     if(!is_user_alive(id) || !g_has_thanatos3[id] || get_user_weapon(id) != CSW_THANATOS3)
  844.         return HAM_IGNORED;
  845.    
  846.     new Float:g_idle_sound_delay[33]
  847.    
  848.     if(get_gametime() - 1.0 > g_idle_sound_delay[id])
  849.     {
  850.         if(g_Mode[id] == MODE_WINGS_1) emit_sound(id, CHAN_BODY, Fire_Sounds[9], 1.0, ATTN_IDLE, 0, PITCH_HIGH)
  851.         else if(g_Mode[id] == MODE_WINGS_2) emit_sound(id, CHAN_BODY, Fire_Sounds[10], 1.0, ATTN_IDLE, 0, PITCH_HIGH)
  852.         else if(g_Mode[id] == MODE_WINGS_3) emit_sound(id, CHAN_BODY, Fire_Sounds[11], 1.0, ATTN_IDLE, 0, PITCH_HIGH)
  853.        
  854.         g_idle_sound_delay[id] = get_gametime()
  855.     }
  856.    
  857.     if(get_pdata_float(Weapon, 48, 4) <= 0.43)
  858.     {
  859.         if(!g_Mode[id]) UTIL_PlayWeaponAnimation(id, THANATOS3_IDLE_NORMAL)
  860.         else if(g_Mode[id] == MODE_WINGS_1) UTIL_PlayWeaponAnimation(id, THANATOS3_IDLE_WINGS_1)
  861.         else if(g_Mode[id] == MODE_WINGS_2) UTIL_PlayWeaponAnimation(id, THANATOS3_IDLE_WINGS_2)
  862.         else if(g_Mode[id] == MODE_WINGS_3) UTIL_PlayWeaponAnimation(id, THANATOS3_IDLE_WINGS_3)
  863.        
  864.         set_pdata_float(Weapon, 48, 20.0, 4)
  865.        
  866.         return HAM_SUPERCEDE;
  867.     }
  868.    
  869.     return HAM_IGNORED;
  870. }
  871.  
  872. public fw_SetModel(entity, model[])
  873. {
  874.     if(!is_valid_ent(entity))
  875.         return FMRES_IGNORED
  876.    
  877.     static szClassName[33]
  878.     entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName))
  879.        
  880.     if(!equal(szClassName, "weaponbox"))
  881.         return FMRES_IGNORED
  882.    
  883.     static iOwner
  884.    
  885.     iOwner = entity_get_edict(entity, EV_ENT_owner)
  886.    
  887.     if(equal(model, "models/w_mp5navy.mdl"))
  888.     {
  889.         static iStoredAugID
  890.        
  891.         iStoredAugID = find_ent_by_owner(ENG_NULLENT, weapon_thanatos3, entity)
  892.    
  893.         if(!is_valid_ent(iStoredAugID))
  894.             return FMRES_IGNORED
  895.    
  896.         if(g_has_thanatos3[iOwner])
  897.         {
  898.             entity_set_int(iStoredAugID, EV_INT_WEAPONKEY, THANATOS3_WEAPONKEY)
  899.             g_has_thanatos3[iOwner] = false
  900.             //g_Mode[iOwner] = MODE_NORMAL
  901.             if(g_Mode[iOwner] == MODE_NORMAL)
  902.             {
  903.                 entity_set_model(entity, THANATOS3_W_MODEL)
  904.             }
  905.             else
  906.             {
  907.                 entity_set_model(entity, THANATOS3_W_MODEL_B)
  908.             }
  909.            
  910.             return FMRES_SUPERCEDE
  911.         }
  912.     }
  913.     return FMRES_IGNORED
  914. }
  915.  
  916. public give_thanatos3(id)
  917. {
  918.     drop_weapons(id, 1)
  919.     new iWep2 = give_item(id,weapon_thanatos3)
  920.     if( iWep2 > 0 )
  921.     {
  922.         cs_set_weapon_ammo(iWep2, get_pcvar_num(cvar_clip_thanatos3))
  923.         cs_set_user_bpammo (id, CSW_THANATOS3, get_pcvar_num(cvar_thanatos3_ammo)) 
  924.         UTIL_PlayWeaponAnimation(id, THANATOS3_DRAW_NORMAL)
  925.         set_pdata_float(id, m_flNextAttack, 1.0, PLAYER_LINUX_XTRA_OFF)
  926.        
  927.         message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
  928.         write_string("weapon_thanatos3")
  929.         write_byte(10)
  930.         write_byte(120)
  931.         write_byte(-1)
  932.         write_byte(-1)
  933.         write_byte(0)
  934.         write_byte(7)
  935.         write_byte(CSW_MP5NAVY)
  936.         message_end()
  937.     }
  938.     g_has_thanatos3[id] = true
  939.     g_Ammo_Special[id] = 0
  940.     g_Mode[id] = MODE_NORMAL
  941.    
  942.     Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
  943. }
  944.  
  945. public fw_thanatos3_AddToPlayer(thanatos3, id)
  946. {
  947.     if(!is_valid_ent(thanatos3) || !is_user_connected(id))
  948.         return HAM_IGNORED
  949.    
  950.     if(entity_get_int(thanatos3, EV_INT_WEAPONKEY) == THANATOS3_WEAPONKEY)
  951.     {
  952.         g_has_thanatos3[id] = true
  953.         entity_set_int(thanatos3, EV_INT_WEAPONKEY, 0)
  954.        
  955.         message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
  956.         write_string("weapon_thanatos3")
  957.         write_byte(10)
  958.         write_byte(120)
  959.         write_byte(-1)
  960.         write_byte(-1)
  961.         write_byte(0)
  962.         write_byte(7)
  963.         write_byte(CSW_MP5NAVY)
  964.         message_end()
  965.        
  966.         return HAM_HANDLED
  967.     }
  968.     else
  969.     {
  970.         message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
  971.         write_string("weapon_mp3navy")
  972.         write_byte(10)
  973.         write_byte(120)
  974.         write_byte(-1)
  975.         write_byte(-1)
  976.         write_byte(0)
  977.         write_byte(7)
  978.         write_byte(CSW_MP5NAVY)
  979.         message_end()
  980.     }
  981.     return HAM_IGNORED
  982. }
  983.  
  984. public fw_UseStationary_Post(entity, caller, activator, use_type)
  985. {
  986.     if (use_type == USE_STOPPED && is_user_connected(caller))
  987.         replace_weapon_models(caller, get_user_weapon(caller))
  988. }
  989.  
  990. public fw_Item_Deploy_Post(weapon_ent)
  991. {
  992.     static owner
  993.     owner = fm_cs_get_weapon_ent_owner(weapon_ent)
  994.    
  995.     static weaponid
  996.     weaponid = cs_get_weapon_id(weapon_ent)
  997.    
  998.     replace_weapon_models(owner, weaponid)
  999. }
  1000.  
  1001. public CurrentWeapon(id)
  1002. {
  1003.     replace_weapon_models(id, read_data(2))
  1004.      
  1005.     if(!is_user_alive(id))
  1006.         return
  1007.    
  1008.     if(read_data(2) == CSW_THANATOS3 || g_has_thanatos3[id])
  1009.     {
  1010.         static Float:iSpeed
  1011.         if(g_has_thanatos3[id] && !g_Mode[id])
  1012.             iSpeed = get_pcvar_float(cvar_spd_thanatos3)
  1013.         else if(g_has_thanatos3[id] && g_Mode[id])
  1014.             iSpeed = get_pcvar_float(cvar_spd_thanatos3) + 0.20
  1015.        
  1016.         static weapon[32],Ent
  1017.         get_weaponname(read_data(2),weapon,31)
  1018.         Ent = find_ent_by_owner(-1,weapon,id)
  1019.         if(Ent)
  1020.         {
  1021.             static Float:Delay
  1022.             Delay = get_pdata_float( Ent, 46, 4) * iSpeed
  1023.             if (Delay > 0.0)
  1024.             {
  1025.                 set_pdata_float(Ent, 46, Delay, 4)
  1026.             }
  1027.         }
  1028.        
  1029.         Update_SpecialAmmo(id, g_Ammo_Special[id], 1)
  1030.     }
  1031.     else if(read_data(2) != CSW_THANATOS3 || !g_has_thanatos3[id])
  1032.     {
  1033.         Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
  1034.     }
  1035. }
  1036.  
  1037. replace_weapon_models(id, weaponid)
  1038. {
  1039.     switch (weaponid)
  1040.     {
  1041.         case CSW_THANATOS3:
  1042.         {
  1043.             if(g_has_thanatos3[id])
  1044.             {
  1045.                 set_pev(id, pev_viewmodel2, THANATOS3_V_MODEL)
  1046.                 if(!g_Mode[id]) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_A)
  1047.                 else if(g_Mode[id] == MODE_WINGS_1) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_B)
  1048.                 else if(g_Mode[id] == MODE_WINGS_2) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_C)
  1049.                 else if(g_Mode[id] == MODE_WINGS_3) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_D)
  1050.                
  1051.                 if(oldweap[id] != CSW_THANATOS3)
  1052.                 {
  1053.                     if(!g_Mode[id]) UTIL_PlayWeaponAnimation(id, THANATOS3_DRAW_NORMAL)
  1054.                     else if(g_Mode[id] == MODE_WINGS_1) UTIL_PlayWeaponAnimation(id, THANATOS3_DRAW_WINGS_1)
  1055.                     else if(g_Mode[id] == MODE_WINGS_2) UTIL_PlayWeaponAnimation(id, THANATOS3_DRAW_WINGS_2)
  1056.                     else if(g_Mode[id] == MODE_WINGS_3) UTIL_PlayWeaponAnimation(id, THANATOS3_DRAW_WINGS_3)
  1057.                    
  1058.                     set_player_nextattackx(id, 1.0)
  1059.                     set_weapons_timeidle(id, CSW_THANATOS3, 1.0)
  1060.                    
  1061.                     message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
  1062.                     write_string("weapon_thanatos3")
  1063.                     write_byte(10)
  1064.                     write_byte(120)
  1065.                     write_byte(-1)
  1066.                     write_byte(-1)
  1067.                     write_byte(0)
  1068.                     write_byte(7)
  1069.                     write_byte(CSW_MP5NAVY)
  1070.                     message_end()
  1071.                 }
  1072.             }
  1073.         }
  1074.     }
  1075.     oldweap[id] = weaponid
  1076. }
  1077.  
  1078. public fw_UpdateClientData_Post(Player, SendWeapons, CD_Handle)
  1079. {
  1080.     if(!is_user_alive(Player) || (get_user_weapon(Player) != CSW_THANATOS3 || !g_has_thanatos3[Player]))
  1081.         return FMRES_IGNORED
  1082.    
  1083.     set_cd(CD_Handle, CD_flNextAttack, halflife_time () + 0.001)
  1084.     return FMRES_HANDLED
  1085. }
  1086.  
  1087. public fw_thanatos3_PrimaryAttack(Weapon)
  1088. {
  1089.     new Player = get_pdata_cbase(Weapon, 41, 4)
  1090.    
  1091.     if (!g_has_thanatos3[Player])
  1092.         return
  1093.    
  1094.     g_IsInPrimaryAttack = 1
  1095.     pev(Player,pev_punchangle,cl_pushangle[Player])
  1096.    
  1097.     g_clip_ammo[Player] = cs_get_weapon_ammo(Weapon)
  1098. }
  1099.  
  1100. public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
  1101. {
  1102.     if ((eventid != g_orig_event_thanatos3) || !g_IsInPrimaryAttack)
  1103.         return FMRES_IGNORED
  1104.     if (!(1 <= invoker <= g_MaxPlayers))
  1105.         return FMRES_IGNORED
  1106.  
  1107.     playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
  1108.     return FMRES_SUPERCEDE
  1109. }
  1110.  
  1111. public fw_thanatos3_PrimaryAttack_Post(Weapon)
  1112. {
  1113.     if(!pev_valid(Weapon))
  1114.         return
  1115.    
  1116.     g_IsInPrimaryAttack = 0
  1117.     new Player = get_pdata_cbase(Weapon, 41, 4)
  1118.    
  1119.     new szClip, szAmmo
  1120.     get_user_weapon(Player, szClip, szAmmo)
  1121.    
  1122.     if(!is_user_alive(Player))
  1123.         return
  1124.     if(!g_has_thanatos3[Player])
  1125.         return
  1126.     if (!g_clip_ammo[Player])
  1127.         return
  1128.  
  1129.     new Float:push[3]
  1130.     pev(Player,pev_punchangle,push)
  1131.     xs_vec_sub(push,cl_pushangle[Player],push)
  1132.        
  1133.     xs_vec_mul_scalar(push,get_pcvar_float(cvar_recoil_thanatos3),push)
  1134.     xs_vec_add(push,cl_pushangle[Player],push)
  1135.     set_pev(Player,pev_punchangle,push)
  1136.        
  1137.     emit_sound(Player, CHAN_WEAPON, Fire_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  1138.    
  1139.     if(!g_Mode[Player]) UTIL_PlayWeaponAnimation(Player, THANATOS3_SHOOT_NORMAL)
  1140.     else if(g_Mode[Player] == MODE_WINGS_1) UTIL_PlayWeaponAnimation(Player, THANATOS3_SHOOT_WINGS_1)
  1141.     else if(g_Mode[Player] == MODE_WINGS_2) UTIL_PlayWeaponAnimation(Player, THANATOS3_SHOOT_WINGS_2)
  1142.     else if(g_Mode[Player] == MODE_WINGS_3) UTIL_PlayWeaponAnimation(Player, THANATOS3_SHOOT_WINGS_3)
  1143.    
  1144.     tn3_attacked[Player] ++
  1145.     if(tn3_attacked[Player] == 12)
  1146.     {
  1147.         Thanatos3_Change_Mode(Player)
  1148.     }
  1149. }
  1150.  
  1151. public Thanatos3_Change_Mode(id)
  1152. {
  1153.     if(!is_user_alive(id))
  1154.         return
  1155.     if(get_user_weapon(id) != CSW_THANATOS3 || !g_has_thanatos3[id])
  1156.         return
  1157.    
  1158.     if(g_Mode[id] == MODE_NORMAL)
  1159.     {
  1160.         tn3_attacked[id] = 0
  1161.        
  1162.         Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
  1163.         g_Ammo_Special[id] = 1
  1164.         Update_SpecialAmmo(id, g_Ammo_Special[id], 1)
  1165.    
  1166.         set_player_nextattackx(id, 0.1)
  1167.         set_weapons_timeidle(id, CSW_THANATOS3, 0.1)
  1168.         UTIL_PlayWeaponAnimation(id, THANATOS3_SPREAD_WINGS_1)
  1169.     }
  1170.     else if(g_Mode[id] == MODE_WINGS_1)
  1171.     {
  1172.         tn3_attacked[id] = 0
  1173.        
  1174.         Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
  1175.         g_Ammo_Special[id] = 2
  1176.         Update_SpecialAmmo(id, g_Ammo_Special[id], 1)
  1177.        
  1178.         set_player_nextattackx(id, 0.1)
  1179.         set_weapons_timeidle(id, CSW_THANATOS3, 0.1)
  1180.         UTIL_PlayWeaponAnimation(id, THANATOS3_SPREAD_WINGS_2)
  1181.     }
  1182.     else if(g_Mode[id] == MODE_WINGS_2)
  1183.     {
  1184.         tn3_attacked[id] = 0
  1185.        
  1186.         Update_SpecialAmmo(id, g_Ammo_Special[id], 0)
  1187.         g_Ammo_Special[id] = 3
  1188.         Update_SpecialAmmo(id, g_Ammo_Special[id], 1)
  1189.        
  1190.         set_player_nextattackx(id, 0.1)
  1191.         set_weapons_timeidle(id, CSW_THANATOS3, 0.1)
  1192.         UTIL_PlayWeaponAnimation(id, THANATOS3_SPREAD_WINGS_3)
  1193.     }
  1194.    
  1195.     Do_Thanatos3_Change_Mode(id)
  1196. }
  1197.  
  1198. public Do_Thanatos3_Change_Mode(id)
  1199. {
  1200.     if(!is_user_alive(id))
  1201.         return
  1202.     if(!g_has_thanatos3[id])
  1203.         return
  1204.    
  1205.     if(g_Mode[id] == MODE_NORMAL) g_Mode[id] = MODE_WINGS_1
  1206.     else if(g_Mode[id] == MODE_WINGS_1) g_Mode[id] = MODE_WINGS_2
  1207.     else if(g_Mode[id] == MODE_WINGS_2) g_Mode[id] = MODE_WINGS_3
  1208.    
  1209.     if(!g_Mode[id]) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_A)
  1210.     else if(g_Mode[id] == MODE_WINGS_1) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_B)
  1211.     else if(g_Mode[id] == MODE_WINGS_2) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_C)
  1212.     else if(g_Mode[id] == MODE_WINGS_3) set_pev(id, pev_weaponmodel2, THANATOS3_P_MODEL_D)
  1213. }
  1214.  
  1215. public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
  1216. {
  1217.     if (victim != attacker && is_user_connected(attacker))
  1218.     {
  1219.         if(get_user_weapon(attacker) == CSW_THANATOS3)
  1220.         {
  1221.             if(g_has_thanatos3[attacker])
  1222.                 SetHamParamFloat(4, damage * get_pcvar_float(cvar_dmg_thanatos3))
  1223.         }
  1224.     }
  1225. }
  1226.  
  1227. public message_DeathMsg(msg_id, msg_dest, id)
  1228. {
  1229.     static szTruncatedWeapon[33], iAttacker, iVictim
  1230.    
  1231.     get_msg_arg_string(4, szTruncatedWeapon, charsmax(szTruncatedWeapon))
  1232.    
  1233.     iAttacker = get_msg_arg_int(1)
  1234.     iVictim = get_msg_arg_int(2)
  1235.    
  1236.     if(!is_user_connected(iAttacker) || iAttacker == iVictim)
  1237.         return PLUGIN_CONTINUE
  1238.    
  1239.     if(equal(szTruncatedWeapon, "mp5navy") && get_user_weapon(iAttacker) == CSW_THANATOS3)
  1240.     {
  1241.         if(g_has_thanatos3[iAttacker])
  1242.         {
  1243.             set_msg_arg_string(4, "mp5navy")
  1244.         }
  1245.     }
  1246.     return PLUGIN_CONTINUE
  1247. }
  1248.  
  1249. public thanatos3_ItemPostFrame(weapon_entity)
  1250. {
  1251.      new id = pev(weapon_entity, pev_owner)
  1252.      if (!is_user_connected(id))
  1253.           return HAM_IGNORED
  1254.  
  1255.      if (!g_has_thanatos3[id])
  1256.           return HAM_IGNORED
  1257.  
  1258.      static iClipExtra
  1259.      
  1260.      iClipExtra = get_pcvar_num(cvar_clip_thanatos3)
  1261.      new Float:flNextAttack = get_pdata_float(id, m_flNextAttack, PLAYER_LINUX_XTRA_OFF)
  1262.  
  1263.      new iBpAmmo = cs_get_user_bpammo(id, CSW_THANATOS3)
  1264.      new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)
  1265.  
  1266.      new fInReload = get_pdata_int(weapon_entity, m_fInReload, WEAP_LINUX_XTRA_OFF)
  1267.  
  1268.      if(fInReload && flNextAttack <= 0.0)
  1269.      {
  1270.          new j = min(iClipExtra - iClip, iBpAmmo)
  1271.    
  1272.          set_pdata_int(weapon_entity, m_iClip, iClip + j, WEAP_LINUX_XTRA_OFF)
  1273.          cs_set_user_bpammo(id, CSW_THANATOS3, iBpAmmo-j)
  1274.        
  1275.          set_pdata_int(weapon_entity, m_fInReload, 0, WEAP_LINUX_XTRA_OFF)
  1276.          fInReload = 0
  1277.      }
  1278.        
  1279.      return HAM_IGNORED
  1280. }
  1281.  
  1282. public thanatos3_Reload(weapon_entity)
  1283. {
  1284.      new id = pev(weapon_entity, pev_owner)
  1285.      if (!is_user_connected(id))
  1286.           return HAM_IGNORED
  1287.  
  1288.      if (!g_has_thanatos3[id])
  1289.           return HAM_IGNORED
  1290.  
  1291.      static iClipExtra
  1292.  
  1293.      if(g_has_thanatos3[id])
  1294.           iClipExtra = get_pcvar_num(cvar_clip_thanatos3)
  1295.  
  1296.      g_thanatos3_TmpClip[id] = -1
  1297.  
  1298.      new iBpAmmo = cs_get_user_bpammo(id, CSW_THANATOS3)
  1299.      new iClip = get_pdata_int(weapon_entity, m_iClip, WEAP_LINUX_XTRA_OFF)
  1300.  
  1301.      if (iBpAmmo <= 0)
  1302.           return HAM_SUPERCEDE
  1303.  
  1304.      if (iClip >= iClipExtra)
  1305.           return HAM_SUPERCEDE
  1306.  
  1307.      g_thanatos3_TmpClip[id] = iClip
  1308.  
  1309.      return HAM_IGNORED
  1310. }
  1311.  
  1312. public thanatos3_Reload_Post(weapon_entity)
  1313. {
  1314.     new id = pev(weapon_entity, pev_owner)
  1315.     if (!is_user_connected(id))
  1316.         return HAM_IGNORED
  1317.  
  1318.     if (!g_has_thanatos3[id])
  1319.         return HAM_IGNORED
  1320.  
  1321.     if (g_thanatos3_TmpClip[id] == -1)
  1322.         return HAM_IGNORED
  1323.    
  1324.     g_Reload[id] = true
  1325.    
  1326.     set_pdata_int(weapon_entity, m_iClip, g_thanatos3_TmpClip[id], WEAP_LINUX_XTRA_OFF)
  1327.     set_pdata_float(weapon_entity, m_flTimeWeaponIdle, THANATOS3_RELOAD_TIME, WEAP_LINUX_XTRA_OFF)
  1328.     set_pdata_float(id, m_flNextAttack, THANATOS3_RELOAD_TIME, PLAYER_LINUX_XTRA_OFF)
  1329.     set_pdata_int(weapon_entity, m_fInReload, 1, WEAP_LINUX_XTRA_OFF)
  1330.    
  1331.     if(g_Mode[id] == MODE_NORMAL)
  1332.     {
  1333.         UTIL_PlayWeaponAnimation(id, THANATOS3_RELOAD_NORMAL)
  1334.         set_task(THANATOS3_RELOAD_TIME, "Complete_Reload_Mode_Normal", weapon_entity)
  1335.     }
  1336.     else if(g_Mode[id] == MODE_WINGS_1)
  1337.     {
  1338.         UTIL_PlayWeaponAnimation(id, THANATOS3_RELOAD_WINGS_1)
  1339.         emit_sound(id, CHAN_WEAPON, Fire_Sounds[14], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  1340.         set_task(THANATOS3_RELOAD_TIME, "Complete_Reload_Mode_Wings", weapon_entity)
  1341.     }
  1342.     else if(g_Mode[id] == MODE_WINGS_2)
  1343.     {
  1344.         UTIL_PlayWeaponAnimation(id, THANATOS3_RELOAD_WINGS_2)
  1345.         emit_sound(id, CHAN_WEAPON, Fire_Sounds[15], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  1346.         set_task(THANATOS3_RELOAD_TIME, "Complete_Reload_Mode_Wings", weapon_entity)
  1347.     }
  1348.     else if(g_Mode[id] == MODE_WINGS_3)
  1349.     {
  1350.         UTIL_PlayWeaponAnimation(id, THANATOS3_RELOAD_WINGS_3)
  1351.         emit_sound(id, CHAN_WEAPON, Fire_Sounds[16], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  1352.         set_task(THANATOS3_RELOAD_TIME, "Complete_Reload_Mode_Wings", weapon_entity)
  1353.     }
  1354.  
  1355.     return HAM_IGNORED
  1356. }
  1357.  
  1358. public Complete_Reload_Mode_Normal(weapon_entity)
  1359. {
  1360.     if(!pev_valid(weapon_entity))
  1361.         return
  1362.        
  1363.     new id = get_pdata_cbase(weapon_entity, 41, 4)
  1364.    
  1365.     g_Reload[id] = false
  1366.     UTIL_PlayWeaponAnimation(id, THANATOS3_IDLE_NORMAL)
  1367.    
  1368.     set_pdata_float(weapon_entity, 48, 20.0, 4)
  1369. }
  1370.  
  1371. public Complete_Reload_Mode_Wings(weapon_entity)
  1372. {
  1373.     if(!pev_valid(weapon_entity))
  1374.         return
  1375.        
  1376.     new id = get_pdata_cbase(weapon_entity, 41, 4)
  1377.    
  1378.     g_Reload[id] = false
  1379.    
  1380.     if(g_Mode[id] == MODE_WINGS_1) UTIL_PlayWeaponAnimation(id, THANATOS3_IDLE_WINGS_1)
  1381.     else if(g_Mode[id] == MODE_WINGS_2) UTIL_PlayWeaponAnimation(id, THANATOS3_IDLE_WINGS_2)
  1382.     else if(g_Mode[id] == MODE_WINGS_3) UTIL_PlayWeaponAnimation(id, THANATOS3_IDLE_WINGS_3)
  1383.    
  1384.     set_pdata_float(weapon_entity, 48, 20.0, 4)
  1385. }
  1386.  
  1387. stock drop_weapons(id, dropwhat)
  1388. {
  1389.      static weapons[32], num, i, weaponid
  1390.      num = 0
  1391.      get_user_weapons(id, weapons, num)
  1392.      
  1393.      for (i = 0; i < num; i++)
  1394.      {
  1395.           weaponid = weapons[i]
  1396.          
  1397.           if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
  1398.           {
  1399.                static wname[32]
  1400.                get_weaponname(weaponid, wname, sizeof wname - 1)
  1401.                engclient_cmd(id, "drop", wname)
  1402.           }
  1403.      }
  1404. }
  1405.  
  1406. stock set_player_nextattackx(id, Float:nexttime)
  1407. {
  1408.     if(!is_user_alive(id))
  1409.         return
  1410.        
  1411.     set_pdata_float(id, m_flNextAttack, nexttime, 5)
  1412. }
  1413.  
  1414. stock set_weapons_timeidle(id, WeaponId ,Float:TimeIdle)
  1415. {
  1416.     if(!is_user_alive(id))
  1417.         return
  1418.        
  1419.     static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
  1420.     if(!pev_valid(entwpn))
  1421.         return
  1422.        
  1423.     set_pdata_float(entwpn, 46, TimeIdle, WEAP_LINUX_XTRA_OFF)
  1424.     set_pdata_float(entwpn, 47, TimeIdle, WEAP_LINUX_XTRA_OFF)
  1425.     set_pdata_float(entwpn, 48, TimeIdle + 1.0, WEAP_LINUX_XTRA_OFF)
  1426. }
  1427.  
  1428. stock fm_set_weapon_ammo(entity, amount)
  1429. {
  1430.     set_pdata_int(entity, OFFSET_CLIPAMMO, amount, OFFSET_LINUX_WEAPONS);
  1431. }
  1432.  
  1433. stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
  1434. {
  1435.     new_velocity[0] = origin2[0] - origin1[0]
  1436.     new_velocity[1] = origin2[1] - origin1[1]
  1437.     new_velocity[2] = origin2[2] - origin1[2]
  1438.     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]))
  1439.     new_velocity[0] *= num
  1440.     new_velocity[1] *= num
  1441.     new_velocity[2] *= num
  1442.    
  1443.     return 1;
  1444. }
  1445.  
  1446. stock fm_cs_get_current_weapon_ent(id)
  1447. {
  1448.     return get_pdata_cbase(id, OFFSET_ACTIVE_ITEM, OFFSET_LINUX)
  1449. }
  1450.  
  1451. stock fm_cs_get_weapon_ent_owner(ent)
  1452. {
  1453.     return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS)
  1454. }
  1455.  
  1456. stock UTIL_PlayWeaponAnimation(const Player, const Sequence)
  1457. {
  1458.     set_pev(Player, pev_weaponanim, Sequence)
  1459.    
  1460.     message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = Player)
  1461.     write_byte(Sequence)
  1462.     write_byte(pev(Player, pev_body))
  1463.     message_end()
  1464. }
  1465.  
  1466. stock create_blood(const Float:origin[3])
  1467. {
  1468.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  1469.     write_byte(TE_BLOODSPRITE)
  1470.     engfunc(EngFunc_WriteCoord, origin[0])
  1471.     engfunc(EngFunc_WriteCoord, origin[1])
  1472.     engfunc(EngFunc_WriteCoord, origin[2])
  1473.     write_short(m_iBlood[1])
  1474.     write_short(m_iBlood[0])
  1475.     write_byte(75)
  1476.     write_byte(8)
  1477.     message_end()
  1478. }
  1479.  
  1480. stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
  1481. {
  1482.     static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
  1483.    
  1484.     pev(id, pev_origin, vOrigin)
  1485.     pev(id, pev_view_ofs, vUp) //for player
  1486.     xs_vec_add(vOrigin, vUp, vOrigin)
  1487.     pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
  1488.    
  1489.     angle_vector(vAngle,ANGLEVECTOR_FORWARD, vForward) //or use EngFunc_AngleVectors
  1490.     angle_vector(vAngle,ANGLEVECTOR_RIGHT, vRight)
  1491.     angle_vector(vAngle,ANGLEVECTOR_UP, vUp)
  1492.    
  1493.     vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  1494.     vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  1495.     vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  1496. }
  1497.  
  1498. stock create_fake_smokes(Float:Origin[3])
  1499. {
  1500.     static TE_FLAG
  1501.    
  1502.     TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
  1503.     TE_FLAG |= TE_EXPLFLAG_NOSOUND
  1504.     TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
  1505.    
  1506.     engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, Origin, 0)
  1507.     write_byte(TE_EXPLOSION)
  1508.     engfunc(EngFunc_WriteCoord, Origin[0])
  1509.     engfunc(EngFunc_WriteCoord, Origin[1])
  1510.     engfunc(EngFunc_WriteCoord, Origin[2] - 10.0)
  1511.     write_short(g_smokepuff_id)
  1512.     write_byte(2)
  1513.     write_byte(80)
  1514.     write_byte(TE_FLAG)
  1515.     message_end()
  1516. }
  1517.  
  1518. stock hook_ent(ent, Float:VicOrigin[3], Float:speed, type)
  1519. {
  1520.     static Float:fl_Velocity[3]
  1521.     static Float:EntOrigin[3]
  1522.    
  1523.     pev(ent, pev_origin, EntOrigin)
  1524.    
  1525.     static Float:distance_f
  1526.     distance_f = 100.0
  1527.    
  1528.     new Float:fl_Time = distance_f / speed
  1529.    
  1530.     if(type == 1)
  1531.     {
  1532.         fl_Velocity[0] = ((VicOrigin[0] - EntOrigin[0]) / fl_Time) * 1.5
  1533.         fl_Velocity[1] = ((VicOrigin[1] - EntOrigin[1]) / fl_Time) * 1.5
  1534.         fl_Velocity[2] = (VicOrigin[2] - EntOrigin[2]) / fl_Time       
  1535.     } else if(type == 2) {
  1536.         fl_Velocity[0] = ((EntOrigin[0] - VicOrigin[0]) / fl_Time) * 1.5
  1537.         fl_Velocity[1] = ((EntOrigin[1] - VicOrigin[1]) / fl_Time) * 1.5
  1538.         fl_Velocity[2] = (EntOrigin[2] - VicOrigin[2]) / fl_Time
  1539.     }
  1540.    
  1541.     entity_set_vector(ent, EV_VEC_velocity, fl_Velocity)
  1542. }
  1543. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  1544. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
  1545. */
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

Thank, solved
Image

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

#4

Post by czirimbolo » 5 years ago

Sometimes, second attack of this weapon doesn't work. Please, can someone try to fix this? This is really great gun, addons like this make our server better:

L 08/16/2018 - 11:36:19: [AMXX] Displaying debug trace (plugin "thanatos3.amxx", version "1.2 beta")
L 08/16/2018 - 11:36:19: [AMXX] Run time error 10: native error (native "set_pev")
L 08/16/2018 - 11:36:19: [AMXX] [0] thanatos3.sma::fw_Scythe_Wind_Think (line 751)
Image

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

#5

Post by Night Fury » 5 years ago

czirimbolo wrote: 5 years ago Sometimes, second attack of this weapon doesn't work. Please, can someone try to fix this? This is really great gun, addons like this make our server better:

L 08/16/2018 - 11:36:19: [AMXX] Displaying debug trace (plugin "thanatos3.amxx", version "1.2 beta")
L 08/16/2018 - 11:36:19: [AMXX] Run time error 10: native error (native "set_pev")
L 08/16/2018 - 11:36:19: [AMXX] [0] thanatos3.sma::fw_Scythe_Wind_Think (line 751)
Gun's error. Not related.
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

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

#6

Post by Mark » 5 years ago

czirimbolo wrote: 5 years ago Sometimes, second attack of this weapon doesn't work. Please, can someone try to fix this? This is really great gun, addons like this make our server better:

L 08/16/2018 - 11:36:19: [AMXX] Displaying debug trace (plugin "thanatos3.amxx", version "1.2 beta")
L 08/16/2018 - 11:36:19: [AMXX] Run time error 10: native error (native "set_pev")
L 08/16/2018 - 11:36:19: [AMXX] [0] thanatos3.sma::fw_Scythe_Wind_Think (line 751)
Fixed Version by ME Also converted to ZE

Make sure you upload these models aswell and tell me if its working right. Tested on my server and its good!
CSO Thanatos-3.zip
(1.73 MiB) Downloaded 325 times
CSO Thanatos-3.zip
(1.73 MiB) Downloaded 325 times

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

#7

Post by Mark » 5 years ago

czirimbolo wrote: 5 years ago Sometimes, second attack of this weapon doesn't work. Please, can someone try to fix this? This is really great gun, addons like this make our server better:

L 08/16/2018 - 11:36:19: [AMXX] Displaying debug trace (plugin "thanatos3.amxx", version "1.2 beta")
L 08/16/2018 - 11:36:19: [AMXX] Run time error 10: native error (native "set_pev")
L 08/16/2018 - 11:36:19: [AMXX] [0] thanatos3.sma::fw_Scythe_Wind_Think (line 751)
Added not to be available until zombie release as you PM me.
  1. #include <zombie_escape>
  2. #include <engine>
  3. #include <fakemeta_util>
  4. #include <cstrike>
  5. #include <fun>
  6. #include <xs>
  7.  
  8. #define PLUGIN "[CSO] Thanatos-3"
  9. #define VERSION "1.0"
  10. #define AUTHOR "Dias no Pendragon"
  11.  
  12. #define DAMAGE 25 // 45 for zombie
  13. #define CLIP 60
  14. #define BPAMMO 240
  15.  
  16. #define SCYTHE_SLASHTIME 7.0
  17.  
  18. #define STAGE_AMMO 10 // every x ammo -> stage up
  19. #define RELOAD_TIME 3.25
  20. #define ANIME_EXT "onehanded"
  21.  
  22. #define V_MODEL "models/v_thanatos3.mdl"
  23. #define P_MODEL "models/p_thanatos3.mdl"
  24. #define W_MODEL "models/w_thanatos3.mdl"
  25. #define W_MODEL2 "models/w_thanatos3b.mdl"
  26. #define S_MODEL "models/thanatos3_knife.mdl"
  27. #define S_MODEL2 "models/thanatos3_wind.mdl"
  28.  
  29. new const WeaponSounds[29][] =
  30. {
  31.     "weapons/thanatos3-1.wav",
  32.     "weapons/thanatos3_fly_shoot.wav",
  33.     "weapons/thanatos3_fly_w2.wav",
  34.     "weapons/thanatos3_fly_w3.wav",
  35.     "weapons/thanatos3_ilde_w1.wav",
  36.     "weapons/thanatos3_ilde_w2.wav",
  37.     "weapons/thanatos3_ilde_w3.wav",
  38.     "weapons/thanatos3_draw.wav",
  39.     "weapons/thanatos3_draw_w1.wav",
  40.     "weapons/thanatos3_draw_w2.wav",
  41.     "weapons/thanatos3_draw_w3.wav",
  42.     "weapons/thanatos3_boltpull.wav",
  43.     "weapons/thanatos3_clipin.wav",
  44.     "weapons/thanatos3_clipout.wav",
  45.     "weapons/thanatos3_knife_hit1.wav",
  46.     "weapons/thanatos3_knife_hit2.wav",
  47.     "weapons/thanatos3_knife_swish.wav",
  48.     "weapons/thanatos3_metal1.wav",
  49.     "weapons/thanatos3_metal2.wav",
  50.     "weapons/thanatos3_reload_w1.wav",
  51.     "weapons/thanatos3_reload_w2.wav",
  52.     "weapons/thanatos3_reload_w3.wav",
  53.     "weapons/thanatos3_spread_w1.wav",
  54.     "weapons/thanatos3_spread_w2.wav",
  55.     "weapons/thanatos3_spread_w3.wav",
  56.     "weapons/thanatos3_stone1.wav",
  57.     "weapons/thanatos3_stone2.wav",
  58.     "weapons/thanatos3_wood1.wav",
  59.     "weapons/thanatos3_wood2.wav"
  60. }
  61.  
  62. enum
  63. {
  64.     ANIME_IDLE = 0,
  65.     ANIME_IDLE_W1,
  66.     ANIME_IDLE_W2,
  67.     ANIME_IDLE_W3,
  68.     ANIME_SHOOT,
  69.     ANIME_SHOOT_W1,
  70.     ANIME_SHOOT_W2,
  71.     ANIME_SHOOT_W3,
  72.     ANIME_FLY_W1,
  73.     ANIME_FLY_W2,
  74.     ANIME_FLY_W3,
  75.     ANIME_RELOAD,
  76.     ANIME_RELOAD_W1,
  77.     ANIME_RELOAD_W2,
  78.     ANIME_RELOAD_W3,
  79.     ANIME_SPREAD_W1,
  80.     ANIME_SPREAD_W2,
  81.     ANIME_SPREAD_W3,
  82.     ANIME_DRAW,
  83.     ANIME_DRAW_W1,
  84.     ANIME_DRAW_W2,
  85.     ANIME_DRAW_W3
  86. }
  87.  
  88. enum
  89. {
  90.     STAGE_NONE = 0,
  91.     STAGE_ULTIMATE,
  92.     STAGE_OMEGA,
  93.     STAGE_METATRON
  94. }
  95.  
  96. #define SCYTHE_CLASSNAME "saisu"
  97.  
  98. #define CSW_THANATOS3 CSW_MP5NAVY
  99. #define weapon_thanatos3 "weapon_mp5navy"
  100.  
  101. // Fire Start
  102. #define THANATOS3_OLDMODEL "models/w_mp5.mdl"
  103.  
  104. 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)
  105. const SECONDARY_WEAPONS_BIT_SUM = (1<<CSW_P228)|(1<<CSW_ELITE)|(1<<CSW_FIVESEVEN)|(1<<CSW_USP)|(1<<CSW_GLOCK18)|(1<<CSW_DEAGLE)
  106.  
  107. // MACROS
  108. #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
  109. #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
  110. #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
  111.  
  112. new g_Had_Thanatos3, g_Thanatos3_Clip[33], g_Thanatos3_Stage[33], g_Thanatos3_Count[33]
  113. new g_MsgCurWeapon, g_InTempingAttack
  114. new g_Event_Thanatos3, g_ShellId, g_SmokePuff_SprId, g_HamBot, g_iItemID
  115. new bool:g_bBlockBuy
  116.  
  117. public plugin_init()
  118. {
  119.     register_plugin(PLUGIN, VERSION, AUTHOR)
  120.    
  121.     register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
  122.     register_think(SCYTHE_CLASSNAME, "fw_Scythe_Think")
  123.     register_touch(SCYTHE_CLASSNAME, "*", "fw_Scythe_Touch")
  124.    
  125.     register_forward(FM_UpdateClientData,"fw_UpdateClientData_Post", 1)
  126.     register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")  
  127.     register_forward(FM_SetModel, "fw_SetModel")        
  128.     register_forward(FM_CmdStart, "fw_CmdStart")
  129.     register_forward(FM_EmitSound, "fw_EmitSound")
  130.     register_forward(FM_TraceLine, "fw_TraceLine")
  131.     register_forward(FM_TraceHull, "fw_TraceHull")  
  132.    
  133.     RegisterHam(Ham_Item_Deploy, weapon_thanatos3, "fw_Item_Deploy_Post", 1)    
  134.     RegisterHam(Ham_Item_AddToPlayer, weapon_thanatos3, "fw_Item_AddToPlayer_Post", 1)
  135.     RegisterHam(Ham_Item_PostFrame, weapon_thanatos3, "fw_Item_PostFrame")  
  136.     RegisterHam(Ham_Weapon_Reload, weapon_thanatos3, "fw_Weapon_Reload")
  137.     RegisterHam(Ham_Weapon_Reload, weapon_thanatos3, "fw_Weapon_Reload_Post", 1)    
  138.     RegisterHam(Ham_Weapon_WeaponIdle, weapon_thanatos3, "fw_Weapon_WeaponIdle_Post", 1)
  139.     RegisterHam(Ham_Weapon_PrimaryAttack, weapon_thanatos3, "fw_Weapon_PrimaryAttack_Post", 1)  
  140.    
  141.     RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack_World")
  142.     RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Player")
  143.    
  144.     g_MsgCurWeapon = get_user_msgid("CurWeapon")
  145.    
  146.     g_iItemID = ze_register_item("Thanatos-3", 0, 0)
  147. }
  148.  
  149. public plugin_precache()
  150. {
  151.     precache_model(V_MODEL)
  152.     precache_model(P_MODEL)
  153.     precache_model(W_MODEL)
  154.     precache_model(W_MODEL2)
  155.     precache_model(S_MODEL)
  156.     precache_model(S_MODEL2)
  157.    
  158.     for(new i = 0; i < sizeof(WeaponSounds); i++)
  159.         precache_sound(WeaponSounds[i])
  160.    
  161.     g_ShellId = precache_model("models/rshell.mdl")
  162.     g_SmokePuff_SprId = precache_model("sprites/wall_puff1.spr")
  163.    
  164.     register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1)
  165. }
  166.  
  167. public fw_PrecacheEvent_Post(type, const name[])
  168. {
  169.     if(equal("events/mp5n.sc", name)) g_Event_Thanatos3 = get_orig_retval()    
  170. }
  171.  
  172. public client_putinserver(id)
  173. {
  174.     if(!g_HamBot && is_user_bot(id))
  175.     {
  176.         g_HamBot = 1
  177.         set_task(0.1, "Do_Register_HamBot", id)
  178.     }
  179. }
  180.  
  181. public Do_Register_HamBot(id)
  182. {
  183.     RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack_Player")
  184. }
  185.  
  186. public Event_NewRound() remove_entity_name(SCYTHE_CLASSNAME)
  187.  
  188. public ze_game_started()
  189. {
  190.     g_bBlockBuy = true
  191. }
  192.  
  193. public ze_zombie_release()
  194. {
  195.     g_bBlockBuy = false
  196. }
  197.  
  198. public ze_select_item_pre(id, itemid)
  199. {
  200.     if (itemid != g_iItemID)
  201.         return ZE_ITEM_AVAILABLE
  202.  
  203.     if (!ze_is_user_zombie(id) && g_bBlockBuy)
  204.         return ZE_ITEM_UNAVAILABLE
  205.        
  206.     if (ze_is_user_zombie(id))
  207.         return ZE_ITEM_DONT_SHOW
  208.  
  209.     return ZE_ITEM_AVAILABLE
  210. }
  211.  
  212. public ze_select_item_post(id, itemid)
  213. {
  214.     if (itemid != g_iItemID)
  215.         return
  216.  
  217.     Get_Thanatos3(id)
  218. }
  219.  
  220. public Get_Thanatos3(id)
  221. {
  222.     g_Thanatos3_Count[id] = 0
  223.     g_Thanatos3_Stage[id] = STAGE_NONE
  224.     Set_BitVar(g_Had_Thanatos3, id)
  225.     give_item(id, weapon_thanatos3)
  226.    
  227.     static Ent; Ent = fm_get_user_weapon_entity(id, CSW_THANATOS3)
  228.     if(pev_valid(Ent)) cs_set_weapon_ammo(Ent, CLIP)
  229.    
  230.     Update_Ammo(id, CLIP)
  231.     cs_set_user_bpammo(id, CSW_THANATOS3, BPAMMO)
  232. }
  233.  
  234. public Remove_Thanatos3(id)
  235. {
  236.     g_Thanatos3_Count[id] = 0
  237.     g_Thanatos3_Stage[id] = STAGE_NONE
  238.     UnSet_BitVar(g_Had_Thanatos3, id)
  239. }
  240.  
  241. public Update_Ammo(id, Ammo)
  242. {
  243.     if(!is_user_alive(id))
  244.         return
  245.    
  246.     engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, g_MsgCurWeapon, {0, 0, 0}, id)
  247.     write_byte(1)
  248.     write_byte(CSW_THANATOS3)
  249.     write_byte(Ammo)
  250.     message_end()
  251. }
  252.  
  253. public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
  254. {
  255.     if(!is_user_alive(id))
  256.         return FMRES_IGNORED    
  257.     if(get_user_weapon(id) == CSW_THANATOS3 && Get_BitVar(g_Had_Thanatos3, id))
  258.         set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
  259.    
  260.     return FMRES_HANDLED
  261. }
  262.  
  263. public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
  264. {
  265.     if (!is_user_connected(invoker))
  266.         return FMRES_IGNORED    
  267.     if(get_user_weapon(invoker) != CSW_THANATOS3 || !Get_BitVar(g_Had_Thanatos3, invoker))
  268.         return FMRES_IGNORED
  269.     if(eventid != g_Event_Thanatos3)
  270.         return FMRES_IGNORED
  271.    
  272.     engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
  273.    
  274.     switch(g_Thanatos3_Stage[invoker])
  275.     {
  276.         case STAGE_NONE: Set_WeaponAnim(invoker, ANIME_SHOOT)
  277.         case STAGE_ULTIMATE: Set_WeaponAnim(invoker, ANIME_SHOOT_W1)
  278.         case STAGE_OMEGA: Set_WeaponAnim(invoker, ANIME_SHOOT_W2)
  279.         case STAGE_METATRON: Set_WeaponAnim(invoker, ANIME_SHOOT_W3)
  280.     }
  281.    
  282.     emit_sound(invoker, CHAN_WEAPON, WeaponSounds[0], 1.0, 0.4, 0, 94 + random_num(0, 15))
  283.     Eject_Shell(invoker, g_ShellId, 0.01)
  284.    
  285.     // Check Stage
  286.     g_Thanatos3_Count[invoker]++
  287.     if(g_Thanatos3_Count[invoker] >= STAGE_AMMO)
  288.     {
  289.         if(g_Thanatos3_Stage[invoker] < STAGE_METATRON)
  290.         {
  291.             g_Thanatos3_Stage[invoker]++
  292.            
  293.             switch(g_Thanatos3_Stage[invoker])
  294.             {
  295.                 case STAGE_ULTIMATE: Set_WeaponAnim(invoker, ANIME_SPREAD_W1)
  296.                 case STAGE_OMEGA: Set_WeaponAnim(invoker, ANIME_SPREAD_W2)
  297.                 case STAGE_METATRON: Set_WeaponAnim(invoker, ANIME_SPREAD_W3)
  298.             }
  299.         }
  300.        
  301.         g_Thanatos3_Count[invoker] = 0
  302.     }
  303.  
  304.     return FMRES_IGNORED
  305. }
  306.  
  307. public fw_SetModel(entity, model[])
  308. {
  309.     if(!pev_valid(entity))
  310.         return FMRES_IGNORED
  311.    
  312.     static Classname[32]
  313.     pev(entity, pev_classname, Classname, sizeof(Classname))
  314.    
  315.     if(!equal(Classname, "weaponbox"))
  316.         return FMRES_IGNORED
  317.    
  318.     static iOwner
  319.     iOwner = pev(entity, pev_owner)
  320.    
  321.     if(equal(model, THANATOS3_OLDMODEL))
  322.     {
  323.         static weapon; weapon = find_ent_by_owner(-1, weapon_thanatos3, entity)
  324.        
  325.         if(!pev_valid(weapon))
  326.             return FMRES_IGNORED;
  327.        
  328.         if(Get_BitVar(g_Had_Thanatos3, iOwner))
  329.         {
  330.             set_pev(weapon, pev_impulse, 25112015)
  331.             set_pev(weapon, pev_iuser3, g_Thanatos3_Count[iOwner])
  332.             set_pev(weapon, pev_iuser4, g_Thanatos3_Stage[iOwner])
  333.            
  334.             engfunc(EngFunc_SetModel, entity, g_Thanatos3_Stage[iOwner] ? W_MODEL2 : W_MODEL)
  335.             Remove_Thanatos3(iOwner)
  336.            
  337.             return FMRES_SUPERCEDE
  338.         }
  339.     }
  340.  
  341.     return FMRES_IGNORED;
  342. }
  343.  
  344. public fw_CmdStart(id, uc_handle, seed)
  345. {
  346.     if(!is_user_alive(id))
  347.         return FMRES_IGNORED
  348.     if(get_user_weapon(id) != CSW_THANATOS3 || !Get_BitVar(g_Had_Thanatos3, id))
  349.         return FMRES_IGNORED
  350.        
  351.     static PressedButton
  352.     PressedButton = get_uc(uc_handle, UC_Buttons)
  353.    
  354.     if(PressedButton & IN_ATTACK2)
  355.     {
  356.         if(get_pdata_float(id, 83, 5) > 0.0)
  357.             return FMRES_IGNORED
  358.        
  359.         PressedButton &= ~IN_ATTACK2
  360.         set_uc(uc_handle, UC_Buttons, PressedButton)
  361.        
  362.         if(g_Thanatos3_Stage[id]) Check_Scythe(id)
  363.     }
  364.        
  365.     return FMRES_HANDLED
  366. }
  367.  
  368. public Check_Scythe(id)
  369. {
  370.     Create_FakeAttackAnim(id)
  371.    
  372.     Set_Player_NextAttack(id, 1.75)
  373.     Set_WeaponIdleTime(id, CSW_THANATOS3, 2.0)
  374.    
  375.     switch(g_Thanatos3_Stage[id])
  376.     {
  377.         case STAGE_ULTIMATE: Set_WeaponAnim(id, ANIME_FLY_W1)
  378.         case STAGE_OMEGA: Set_WeaponAnim(id, ANIME_FLY_W2)
  379.         case STAGE_METATRON: Set_WeaponAnim(id, ANIME_FLY_W3)
  380.     }
  381.    
  382.     emit_sound(id, CHAN_WEAPON, WeaponSounds[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  383.     Shoot_Scyche(id, g_Thanatos3_Stage[id])
  384.    
  385.     // Fake Punch
  386.     static Float:Origin[3]; Origin[0] = -2.5
  387.     set_pev(id, pev_punchangle, Origin)
  388.    
  389.     g_Thanatos3_Stage[id] = STAGE_NONE
  390. }
  391.  
  392. public Shoot_Scyche(id, Level)
  393. {
  394.     static Float:Origin[6][3], Float:Target[3], LoopTime, Float:Speed[6]
  395.    
  396.     get_position(id, 48.0, -10.0, random_float(-5.0, 5.0), Origin[0]); Speed[0] = random_float(500.0, 1000.0)
  397.     get_position(id, 48.0, 10.0, random_float(-5.0, 5.0), Origin[1]); Speed[1] = random_float(500.0, 1000.0)
  398.     get_position(id, 48.0, -20.0, random_float(-5.0, 5.0), Origin[2]); Speed[2] = random_float(500.0, 1000.0)
  399.     get_position(id, 48.0, 20.0, random_float(-5.0, 5.0), Origin[3]); Speed[3] = random_float(500.0, 1000.0)
  400.     get_position(id, 48.0, -30.0, random_float(-5.0, 5.0), Origin[4]); Speed[4] = random_float(500.0, 1000.0)
  401.     get_position(id, 48.0, 30.0, random_float(-5.0, 5.0), Origin[5]); Speed[5] = random_float(500.0, 1000.0)
  402.    
  403.     get_position(id, 1024.0, 0.0, 0.0, Target)
  404.    
  405.     switch(Level)
  406.     {
  407.         case STAGE_ULTIMATE: LoopTime = 2
  408.         case STAGE_OMEGA: LoopTime = 4
  409.         case STAGE_METATRON: LoopTime = 6
  410.     }
  411.    
  412.     for(new i = 0; i < LoopTime; i++)
  413.         Create_Scythe(id, Origin[i], Target, Speed[i])
  414. }
  415.  
  416. public Create_Scythe(id, Float:Start[3], Float:End[3], Float:Speed)
  417. {
  418.     static Float:Velocity[3], Float:Angles[3]
  419.    
  420.     pev(id, pev_v_angle, Angles)
  421.     new Ent = create_entity("info_target")
  422.    
  423.     Angles[0] *= -1.0
  424.  
  425.     // set info for ent
  426.     set_pev(Ent, pev_movetype, MOVETYPE_FLY)
  427.     entity_set_string(Ent, EV_SZ_classname, SCYTHE_CLASSNAME)
  428.     engfunc(EngFunc_SetModel, Ent, S_MODEL)
  429.    
  430.     set_pev(Ent, pev_mins, Float:{-1.0, -1.0, -1.0})
  431.     set_pev(Ent, pev_maxs, Float:{1.0, 1.0, 1.0})
  432.     set_pev(Ent, pev_origin, Start)
  433.     set_pev(Ent, pev_gravity, 0.25)
  434.     set_pev(Ent, pev_angles, Angles)
  435.     set_pev(Ent, pev_solid, SOLID_TRIGGER)
  436.     set_pev(Ent, pev_owner, id)
  437.     set_pev(Ent, pev_iuser1, get_user_team(id))
  438.     set_pev(Ent, pev_iuser2, 0)
  439.     set_pev(Ent, pev_iuser3, 206)
  440.     set_pev(Ent, pev_fuser1, get_gametime() + SCYTHE_SLASHTIME)
  441.  
  442.     get_speed_vector(Start, End, Speed, Velocity)
  443.     set_pev(Ent, pev_velocity, Velocity)    
  444.    
  445.     set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
  446.    
  447.     // Animation
  448.     set_pev(Ent, pev_animtime, get_gametime())
  449.     set_pev(Ent, pev_framerate, 1.0)
  450.     set_pev(Ent, pev_sequence, 0)
  451.    
  452.     // Sound
  453.     emit_sound(Ent, CHAN_BODY, WeaponSounds[16], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  454. }
  455.  
  456. public fw_Scythe_Think(Ent)
  457. {
  458.     if(!pev_valid(Ent))
  459.         return
  460.        
  461.     static Float:Time; pev(Ent, pev_fuser1, Time)
  462.     static Float:Time2; pev(Ent, pev_fuser2, Time2)
  463.     static Owner; Owner = pev(Ent, pev_owner)
  464.     static Team; Team = pev(Ent, pev_iuser1)
  465.     static Target; Target = pev(Ent, pev_iuser2)
  466.    
  467.     if(Time <= get_gametime() || !is_user_connected(Owner))
  468.     {
  469.         set_pev(Ent, pev_flags, FL_KILLME)
  470.         set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
  471.            
  472.         return
  473.     }
  474.    
  475.     if(is_user_alive(Target))
  476.     {
  477.         if(get_user_team(Target) == Team)
  478.         {
  479.             set_pev(Ent, pev_flags, FL_KILLME)
  480.             set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
  481.            
  482.             return
  483.         }
  484.        
  485.         if(get_gametime() - 0.75 > Time2)
  486.         {
  487.             emit_sound(Ent, CHAN_BODY, WeaponSounds[16], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  488.             set_pev(Ent, pev_fuser2, get_gametime())
  489.         }
  490.        
  491.         ExecuteHamB(Ham_TakeDamage, Target, 0, Owner, float(DAMAGE) / 1.5, DMG_SLASH)
  492.     } else {
  493.         if(Target)
  494.         {
  495.             set_pev(Ent, pev_flags, FL_KILLME)
  496.             set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
  497.                
  498.             return
  499.         }
  500.     }
  501.    
  502.     set_pev(Ent, pev_nextthink, get_gametime() + 0.2)
  503. }
  504.  
  505. public fw_Scythe_Touch(Ent, id)
  506. {
  507.     if(!pev_valid(Ent))
  508.         return
  509.     if(pev_valid(id) && pev(id, pev_iuser3) == 206)
  510.         return
  511.        
  512.     if(!is_user_alive(id))
  513.     {
  514.         static Float:Origin[3]; pev(Ent, pev_origin, Origin)
  515.        
  516.         set_pev(Ent, pev_fuser1, get_gametime() + random_float(1.0, 3.0))
  517.        
  518.         set_pev(Ent, pev_velocity, {0.0, 0.0, 0.0})
  519.         set_pev(Ent, pev_movetype, MOVETYPE_NONE)
  520.         set_pev(Ent, pev_solid, SOLID_NOT)
  521.        
  522.         // Animation
  523.         set_pev(Ent, pev_animtime, get_gametime())
  524.         set_pev(Ent, pev_framerate, 1.0)
  525.         set_pev(Ent, pev_sequence, 1)
  526.        
  527.         // Bullet Hole
  528.         static Owner; Owner = pev(Ent, pev_owner)
  529.         Make_BulletHole(Owner, Origin, float(DAMAGE))
  530.        
  531.         // Sound
  532.         emit_sound(Ent, CHAN_BODY, WeaponSounds[random_num(25, 28)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  533.     } else {
  534.         static Team; Team = pev(Ent, pev_iuser1)
  535.         if(get_user_team(id) == Team)
  536.             return
  537.         static Owner; Owner = pev(Ent, pev_owner)
  538.         if(!is_user_connected(Owner))
  539.             return
  540.        
  541.         if(!pev(Ent, pev_iuser2))
  542.         {
  543.             set_pev(Ent, pev_fuser1, get_gametime() + SCYTHE_SLASHTIME)
  544.             set_pev(Ent, pev_iuser2, id)
  545.            
  546.             set_pev(Ent, pev_velocity, {0.0, 0.0, 0.0})
  547.             set_pev(Ent, pev_movetype, MOVETYPE_FOLLOW)
  548.             set_pev(Ent, pev_solid, SOLID_NOT)
  549.             set_pev(Ent, pev_aiment, id)
  550.            
  551.             engfunc(EngFunc_SetModel, Ent, S_MODEL2)
  552.            
  553.             // Animation
  554.             set_pev(Ent, pev_animtime, get_gametime())
  555.             set_pev(Ent, pev_framerate, random_float(1.0, 5.0))
  556.             set_pev(Ent, pev_sequence, 0)
  557.            
  558.             // Sound
  559.             emit_sound(id, CHAN_STATIC, WeaponSounds[random_num(14, 15)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  560.         }
  561.     }
  562. }
  563.  
  564. public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
  565. {
  566.     if(!is_user_connected(id))
  567.         return FMRES_IGNORED
  568.     if(!Get_BitVar(g_InTempingAttack, id))
  569.         return FMRES_IGNORED
  570.        
  571.     if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
  572.     {
  573.         if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
  574.             return FMRES_SUPERCEDE
  575.         if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't')
  576.         {
  577.             if (sample[17] == 'w')  return FMRES_SUPERCEDE
  578.             else  return FMRES_SUPERCEDE
  579.         }
  580.         if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
  581.             return FMRES_SUPERCEDE;
  582.     }
  583.    
  584.     return FMRES_IGNORED
  585. }
  586.  
  587. public fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
  588. {
  589.     if(!is_user_alive(id))
  590.         return FMRES_IGNORED    
  591.     if(!Get_BitVar(g_InTempingAttack, id))
  592.         return FMRES_IGNORED
  593.    
  594.     static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
  595.    
  596.     pev(id, pev_origin, fOrigin)
  597.     pev(id, pev_view_ofs, view_ofs)
  598.     xs_vec_add(fOrigin, view_ofs, vecStart)
  599.     pev(id, pev_v_angle, v_angle)
  600.    
  601.     engfunc(EngFunc_MakeVectors, v_angle)
  602.     get_global_vector(GL_v_forward, v_forward)
  603.  
  604.     xs_vec_mul_scalar(v_forward, 0.0, v_forward)
  605.     xs_vec_add(vecStart, v_forward, vecEnd)
  606.    
  607.     engfunc(EngFunc_TraceLine, vecStart, vecEnd, ignored_monster, id, handle)
  608.    
  609.     return FMRES_SUPERCEDE
  610. }
  611.  
  612. public fw_TraceHull(Float:vector_start[3], Float:vector_end[3], ignored_monster, hull, id, handle)
  613. {
  614.     if(!is_user_alive(id))
  615.         return FMRES_IGNORED    
  616.     if(!Get_BitVar(g_InTempingAttack, id))
  617.         return FMRES_IGNORED
  618.    
  619.     static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
  620.    
  621.     pev(id, pev_origin, fOrigin)
  622.     pev(id, pev_view_ofs, view_ofs)
  623.     xs_vec_add(fOrigin, view_ofs, vecStart)
  624.     pev(id, pev_v_angle, v_angle)
  625.    
  626.     engfunc(EngFunc_MakeVectors, v_angle)
  627.     get_global_vector(GL_v_forward, v_forward)
  628.    
  629.     xs_vec_mul_scalar(v_forward, 0.0, v_forward)
  630.     xs_vec_add(vecStart, v_forward, vecEnd)
  631.    
  632.     engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle)
  633.    
  634.     return FMRES_SUPERCEDE
  635. }
  636.  
  637. public Create_FakeAttackAnim(id)
  638. {
  639.     Set_BitVar(g_InTempingAttack, id)
  640.    
  641.     static Ent; Ent = fm_get_user_weapon_entity(id, CSW_KNIFE)
  642.     if(pev_valid(Ent)) ExecuteHamB(Ham_Weapon_PrimaryAttack, Ent)
  643.    
  644.     UnSet_BitVar(g_InTempingAttack, id)
  645. }
  646.  
  647. public fw_Item_Deploy_Post(Ent)
  648. {
  649.     if(pev_valid(Ent) != 2)
  650.         return
  651.     static Id; Id = get_pdata_cbase(Ent, 41, 4)
  652.     if(get_pdata_cbase(Id, 373) != Ent)
  653.         return
  654.     if(!Get_BitVar(g_Had_Thanatos3, Id))
  655.         return
  656.    
  657.     set_pev(Id, pev_viewmodel2, V_MODEL)
  658.     set_pev(Id, pev_weaponmodel2, P_MODEL)
  659.    
  660.     switch(g_Thanatos3_Stage[Id])
  661.     {
  662.         case STAGE_NONE: Set_WeaponAnim(Id, ANIME_DRAW)
  663.         case STAGE_ULTIMATE: Set_WeaponAnim(Id, ANIME_DRAW_W1)
  664.         case STAGE_OMEGA: Set_WeaponAnim(Id, ANIME_DRAW_W2)
  665.         case STAGE_METATRON: Set_WeaponAnim(Id, ANIME_DRAW_W3)
  666.     }
  667.    
  668.     set_pdata_string(Id, (492) * 4, ANIME_EXT, -1 , 20)
  669. }
  670.  
  671. public fw_Item_AddToPlayer_Post(Ent, id)
  672. {
  673.     if(!pev_valid(Ent))
  674.         return HAM_IGNORED
  675.        
  676.     if(pev(Ent, pev_impulse) == 25112015)
  677.     {
  678.         Set_BitVar(g_Had_Thanatos3, id)
  679.         set_pev(Ent, pev_impulse, 0)
  680.        
  681.         g_Thanatos3_Count[id] = pev(Ent, pev_iuser3)
  682.         g_Thanatos3_Stage[id] = pev(Ent, pev_iuser4)
  683.     }
  684.  
  685.     return HAM_HANDLED  
  686. }
  687.  
  688. public fw_Weapon_WeaponIdle_Post( iEnt )
  689. {
  690.     if(pev_valid(iEnt) != 2)
  691.         return
  692.     static Id; Id = get_pdata_cbase(iEnt, 41, 4)
  693.     if(get_pdata_cbase(Id, 373) != iEnt)
  694.         return
  695.     if(!Get_BitVar(g_Had_Thanatos3, Id))
  696.         return
  697.        
  698.     if(get_pdata_float(iEnt, 48, 4) <= 0.1)
  699.     {
  700.         switch(g_Thanatos3_Stage[Id])
  701.         {
  702.             case STAGE_NONE: Set_WeaponAnim(Id, ANIME_IDLE)
  703.             case STAGE_ULTIMATE: Set_WeaponAnim(Id, ANIME_IDLE_W1)
  704.             case STAGE_OMEGA: Set_WeaponAnim(Id, ANIME_IDLE_W2)
  705.             case STAGE_METATRON: Set_WeaponAnim(Id, ANIME_IDLE_W3)
  706.         }
  707.        
  708.         set_pdata_float(iEnt, 48, 20.0, 4)
  709.     }  
  710. }
  711.  
  712. public fw_TraceAttack_World(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits)
  713. {
  714.     if(!is_user_connected(Attacker))
  715.         return HAM_IGNORED  
  716.     if(get_user_weapon(Attacker) != CSW_THANATOS3 || !Get_BitVar(g_Had_Thanatos3, Attacker))
  717.         return HAM_IGNORED
  718.        
  719.     static Float:flEnd[3], Float:vecPlane[3]
  720.        
  721.     get_tr2(Ptr, TR_vecEndPos, flEnd)
  722.     get_tr2(Ptr, TR_vecPlaneNormal, vecPlane)      
  723.            
  724.     Make_BulletHole(Attacker, flEnd, Damage)
  725.     Make_BulletSmoke(Attacker, Ptr)
  726.  
  727.     SetHamParamFloat(3, float(DAMAGE))
  728.    
  729.     return HAM_IGNORED
  730. }
  731.  
  732. public fw_TraceAttack_Player(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits)
  733. {
  734.     if(!is_user_connected(Attacker))
  735.         return HAM_IGNORED  
  736.     if(get_user_weapon(Attacker) != CSW_THANATOS3 || !Get_BitVar(g_Had_Thanatos3, Attacker))
  737.         return HAM_IGNORED
  738.        
  739.     SetHamParamFloat(3, float(DAMAGE))
  740.    
  741.     return HAM_IGNORED
  742. }
  743.  
  744. public fw_Item_PostFrame(ent)
  745. {
  746.     static id; id = pev(ent, pev_owner)
  747.     if(!is_user_alive(id))
  748.         return HAM_IGNORED
  749.     if(!Get_BitVar(g_Had_Thanatos3, id))
  750.         return HAM_IGNORED  
  751.    
  752.     static Float:flNextAttack; flNextAttack = get_pdata_float(id, 83, 5)
  753.     static bpammo; bpammo = cs_get_user_bpammo(id, CSW_THANATOS3)
  754.    
  755.     static iClip; iClip = get_pdata_int(ent, 51, 4)
  756.     static fInReload; fInReload = get_pdata_int(ent, 54, 4)
  757.    
  758.     if(fInReload && flNextAttack <= 0.0)
  759.     {
  760.         static temp1
  761.         temp1 = min(CLIP - iClip, bpammo)
  762.  
  763.         set_pdata_int(ent, 51, iClip + temp1, 4)
  764.         cs_set_user_bpammo(id, CSW_THANATOS3, bpammo - temp1)      
  765.        
  766.         set_pdata_int(ent, 54, 0, 4)
  767.        
  768.         fInReload = 0
  769.     }      
  770.    
  771.     return HAM_IGNORED
  772. }
  773.  
  774. public fw_Weapon_Reload(ent)
  775. {
  776.     static id; id = pev(ent, pev_owner)
  777.     if(!is_user_alive(id))
  778.         return HAM_IGNORED
  779.     if(!Get_BitVar(g_Had_Thanatos3, id))
  780.         return HAM_IGNORED  
  781.  
  782.     g_Thanatos3_Clip[id] = -1
  783.        
  784.     static BPAmmo; BPAmmo = cs_get_user_bpammo(id, CSW_THANATOS3)
  785.     static iClip; iClip = get_pdata_int(ent, 51, 4)
  786.        
  787.     if(BPAmmo <= 0)
  788.         return HAM_SUPERCEDE
  789.     if(iClip >= CLIP)
  790.         return HAM_SUPERCEDE        
  791.            
  792.     g_Thanatos3_Clip[id] = iClip    
  793.    
  794.     return HAM_HANDLED
  795. }
  796.  
  797. public fw_Weapon_Reload_Post(ent)
  798. {
  799.     static id; id = pev(ent, pev_owner)
  800.     if(!is_user_alive(id))
  801.         return HAM_IGNORED
  802.     if(!Get_BitVar(g_Had_Thanatos3, id))
  803.         return HAM_IGNORED  
  804.        
  805.     if((get_pdata_int(ent, 54, 4) == 1))
  806.     { // Reload
  807.         if(g_Thanatos3_Clip[id] == -1)
  808.             return HAM_IGNORED
  809.        
  810.         set_pdata_int(ent, 51, g_Thanatos3_Clip[id], 4)
  811.         set_pdata_float(id, 83, RELOAD_TIME, 5)
  812.         set_pdata_float(ent, 48, 3.5, 4)
  813.        
  814.         switch(g_Thanatos3_Stage[id])
  815.         {
  816.             case STAGE_NONE: Set_WeaponAnim(id, ANIME_RELOAD)
  817.             case STAGE_ULTIMATE: Set_WeaponAnim(id, ANIME_RELOAD_W1)
  818.             case STAGE_OMEGA: Set_WeaponAnim(id, ANIME_RELOAD_W2)
  819.             case STAGE_METATRON: Set_WeaponAnim(id, ANIME_RELOAD_W3)
  820.         }
  821.     }
  822.    
  823.     return HAM_HANDLED
  824. }
  825.  
  826. public fw_Weapon_PrimaryAttack_Post(Ent)
  827. {
  828.     static id; id = pev(Ent, pev_owner)
  829.     if(!is_user_alive(id))
  830.         return HAM_IGNORED
  831.     if(!Get_BitVar(g_Had_Thanatos3, id))
  832.         return HAM_IGNORED
  833.        
  834.     set_pdata_float(Ent, 48, 0.5, 4)
  835.     return HAM_IGNORED
  836. }
  837.  
  838. // Drop primary/secondary weapons
  839. stock drop_weapons(id, dropwhat)
  840. {
  841.     // Get user weapons
  842.     static weapons[32], num, i, weaponid
  843.     num = 0 // reset passed weapons count (bugfix)
  844.     get_user_weapons(id, weapons, num)
  845.    
  846.     // Loop through them and drop primaries or secondaries
  847.     for (i = 0; i < num; i++)
  848.     {
  849.         // Prevent re-indexing the array
  850.         weaponid = weapons[i]
  851.        
  852.         if ((dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM)) || (dropwhat == 2 && ((1<<weaponid) & SECONDARY_WEAPONS_BIT_SUM)))
  853.         {
  854.             // Get weapon entity
  855.             static wname[32]; get_weaponname(weaponid, wname, charsmax(wname))
  856.             engclient_cmd(id, "drop", wname)
  857.         }
  858.     }
  859. }
  860.  
  861. stock Set_Player_NextAttack(id, Float:NextTime) set_pdata_float(id, 83, NextTime, 5)
  862.  
  863. stock Set_WeaponAnim(id, anim)
  864. {
  865.     set_pev(id, pev_weaponanim, anim)
  866.    
  867.     message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
  868.     write_byte(anim)
  869.     write_byte(pev(id, pev_body))
  870.     message_end()
  871. }
  872.  
  873. stock Eject_Shell(id, Shell_ModelIndex, Float:Time) // By Dias
  874. {
  875.     static Ent; Ent = get_pdata_cbase(id, 373, 5)
  876.     if(!pev_valid(Ent))
  877.         return
  878.  
  879.     set_pdata_int(Ent, 57, Shell_ModelIndex, 4)
  880.     set_pdata_float(id, 111, get_gametime() + Time)
  881. }
  882.  
  883. stock Make_BulletHole(id, Float:Origin[3], Float:Damage)
  884. {
  885.     // Find target
  886.     static Decal; Decal = random_num(41, 45)
  887.     static LoopTime;
  888.    
  889.     if(Damage > 100.0) LoopTime = 2
  890.     else LoopTime = 1
  891.    
  892.     for(new i = 0; i < LoopTime; i++)
  893.     {
  894.         // Put decal on "world" (a wall)
  895.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  896.         write_byte(TE_WORLDDECAL)
  897.         engfunc(EngFunc_WriteCoord, Origin[0])
  898.         engfunc(EngFunc_WriteCoord, Origin[1])
  899.         engfunc(EngFunc_WriteCoord, Origin[2])
  900.         write_byte(Decal)
  901.         message_end()
  902.        
  903.         // Show sparcles
  904.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  905.         write_byte(TE_GUNSHOTDECAL)
  906.         engfunc(EngFunc_WriteCoord, Origin[0])
  907.         engfunc(EngFunc_WriteCoord, Origin[1])
  908.         engfunc(EngFunc_WriteCoord, Origin[2])
  909.         write_short(id)
  910.         write_byte(Decal)
  911.         message_end()
  912.     }
  913. }
  914.  
  915. stock Make_BulletSmoke(id, TrResult)
  916. {
  917.     static Float:vecSrc[3], Float:vecEnd[3], TE_FLAG
  918.    
  919.     get_weapon_attachment(id, vecSrc)
  920.     global_get(glb_v_forward, vecEnd)
  921.    
  922.     xs_vec_mul_scalar(vecEnd, 8192.0, vecEnd)
  923.     xs_vec_add(vecSrc, vecEnd, vecEnd)
  924.  
  925.     get_tr2(TrResult, TR_vecEndPos, vecSrc)
  926.     get_tr2(TrResult, TR_vecPlaneNormal, vecEnd)
  927.    
  928.     xs_vec_mul_scalar(vecEnd, 2.5, vecEnd)
  929.     xs_vec_add(vecSrc, vecEnd, vecEnd)
  930.    
  931.     TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
  932.     TE_FLAG |= TE_EXPLFLAG_NOSOUND
  933.     TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
  934.    
  935.     engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEnd, 0)
  936.     write_byte(TE_EXPLOSION)
  937.     engfunc(EngFunc_WriteCoord, vecEnd[0])
  938.     engfunc(EngFunc_WriteCoord, vecEnd[1])
  939.     engfunc(EngFunc_WriteCoord, vecEnd[2] - 10.0)
  940.     write_short(g_SmokePuff_SprId)
  941.     write_byte(2)
  942.     write_byte(50)
  943.     write_byte(TE_FLAG)
  944.     message_end()
  945. }
  946.  
  947. stock get_weapon_attachment(id, Float:output[3], Float:fDis = 40.0)
  948. {
  949.     static Float:vfEnd[3], viEnd[3]
  950.     get_user_origin(id, viEnd, 3)  
  951.     IVecFVec(viEnd, vfEnd)
  952.    
  953.     static Float:fOrigin[3], Float:fAngle[3]
  954.    
  955.     pev(id, pev_origin, fOrigin)
  956.     pev(id, pev_view_ofs, fAngle)
  957.    
  958.     xs_vec_add(fOrigin, fAngle, fOrigin)
  959.    
  960.     static Float:fAttack[3]
  961.    
  962.     xs_vec_sub(vfEnd, fOrigin, fAttack)
  963.     xs_vec_sub(vfEnd, fOrigin, fAttack)
  964.    
  965.     static Float:fRate
  966.    
  967.     fRate = fDis / vector_length(fAttack)
  968.     xs_vec_mul_scalar(fAttack, fRate, fAttack)
  969.    
  970.     xs_vec_add(fOrigin, fAttack, output)
  971. }
  972.  
  973. stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
  974. {
  975.     new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
  976.    
  977.     pev(id, pev_origin, vOrigin)
  978.     pev(id, pev_view_ofs,vUp) //for player
  979.     xs_vec_add(vOrigin,vUp,vOrigin)
  980.     pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
  981.    
  982.     angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
  983.     angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
  984.     angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
  985.    
  986.     vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  987.     vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  988.     vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  989. }
  990.  
  991. stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
  992. {
  993.     new_velocity[0] = origin2[0] - origin1[0]
  994.     new_velocity[1] = origin2[1] - origin1[1]
  995.     new_velocity[2] = origin2[2] - origin1[2]
  996.     new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
  997.     new_velocity[0] *= num
  998.     new_velocity[1] *= num
  999.     new_velocity[2] *= num
  1000.    
  1001.     return 1;
  1002. }
  1003.  
  1004. stock Set_WeaponIdleTime(id, WeaponId ,Float:TimeIdle)
  1005. {
  1006.     static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
  1007.     if(!pev_valid(entwpn))
  1008.         return
  1009.        
  1010.     set_pdata_float(entwpn, 46, TimeIdle, 4)
  1011.     set_pdata_float(entwpn, 47, TimeIdle, 4)
  1012.     set_pdata_float(entwpn, 48, TimeIdle + 0.5, 4)
  1013. }

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