[Tutorial] How to Instant Respawn on Free For All

For scripting examples for learning how to use AMXX.
User avatar
Archive-Poster
Posts: 1090
Gender:
United States of America

[Tutorial] How to Instant Respawn on Free For All

Post by Archive-Poster »

Hello.
If you ever tried to make a FFA server with instant respawn then you know it will bug and people at respawn will get their team changed. (The real instant respawn, not the 0.1 respawn task)

In order to fix it you must trick the Ham_Killed with something very simple.

Instead of this:

Code: Select all

public Killed(victim, attacker, shouldgib)
{
	if( victim != attacker && (1 <= attacker <= g_iMaxPlayers) )
	{
		new vteam = fm_get_user_team(victim)
		if( vteam == fm_get_user_team(attacker) )
		{
			fm_set_user_team(victim, vteam == 1 ? 2 : 1)
			ExecuteHamB(Ham_Killed, victim, attacker, shouldgib)
			fm_set_user_team(victim, vteam)
			return HAM_SUPERCEDE
		}
	}
	return HAM_IGNORED
}

public Ham__Killed_Post(iVictim)
{
	if(is_user_connected(iVictim))
	{
		set_pev(iVictim, pev_deadflag, DEAD_RESPAWNABLE)
		dllfunc(DLLFunc_Think, iVictim)
	}
}
Make this:

Code: Select all

public Killed(victim, attacker, shouldgib)
{
	if( victim != attacker && (1 <= attacker <= g_iMaxPlayers) )
	{
		new vteam = fm_get_user_team(victim)
		if( vteam == fm_get_user_team(attacker) )
		{
			fm_set_user_team(victim, vteam == 1 ? 2 : 1)
                        g_iChangeTeam[victim] = vteam
			ExecuteHamB(Ham_Killed, victim, attacker, shouldgib)
	
			return HAM_SUPERCEDE
		}
	}
	return HAM_IGNORED
}

public Ham__Killed_Post(iVictim)
{
	if(is_user_connected(iVictim))
	{
		if(g_iChangeTeam[iVictim])
		{
			fm_set_user_team(iVictim, g_iChangeTeam[iVictim])
			g_iChangeTeam[iVictim] = 0
		}
		
		set_pev(iVictim, pev_deadflag, DEAD_RESPAWNABLE)
		dllfunc(DLLFunc_Think, iVictim)
	}
}
And your instant respawn will work just fine on your ffa server.

This Plugin is an edit to ConnorMcLeod's FFA plugin.

Code: Select all

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

#define PLUGIN "Free For All"
#define AUTHOR "ConnorMcLeod"
#define VERSION "0.0.6"

#define OFFSET_TEAM	114
#define fm_get_user_team(%1)	get_pdata_int(%1,OFFSET_TEAM)
#define fm_set_user_team(%1,%2)	set_pdata_int(%1,OFFSET_TEAM,%2)

new g_iMaxPlayers, g_iChangeTeam[MAX_PLAYERS]

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

	RegisterHam(Ham_Killed, "player", "Ham__Killed_Post", true)

	RegisterHam(Ham_TraceAttack, "player", "TraceAttack")
	RegisterHam(Ham_TakeDamage, "player", "TakeDamage")
	RegisterHam(Ham_Killed, "player", "Killed")

        g_iMaxPlayers = get_maxplayers()
}

public TraceAttack(victim, attacker, Float:damage, Float:direction[3], tracehandle, damagebits)
{
	if( victim != attacker && (1 <= attacker <= g_iMaxPlayers) )
	{
		new vteam = fm_get_user_team(victim)
		if( vteam == fm_get_user_team(attacker) )
		{
			fm_set_user_team(victim, vteam == 1 ? 2 : 1)
			ExecuteHamB(Ham_TraceAttack, victim, attacker, damage, direction, tracehandle, damagebits)
			fm_set_user_team(victim, vteam)
			return HAM_SUPERCEDE
		}
	}
	return HAM_IGNORED
}

public TakeDamage(victim, idinflictor, attacker, Float:damage, damagebits)
{
	if( victim != attacker && (1 <= attacker <= g_iMaxPlayers) )
	{
		new vteam = fm_get_user_team(victim)
		if( vteam == fm_get_user_team(attacker) )
		{
			fm_set_user_team(victim, vteam == 1 ? 2 : 1)
			ExecuteHamB(Ham_TakeDamage, victim, idinflictor, attacker, damage, damagebits)
			fm_set_user_team(victim, vteam)
			return HAM_SUPERCEDE
		}
	}
	return HAM_IGNORED
}

public Killed(victim, attacker, shouldgib)
{
	if( victim != attacker && (1 <= attacker <= g_iMaxPlayers) )
	{
		new vteam = fm_get_user_team(victim)
		if( vteam == fm_get_user_team(attacker) )
		{
			fm_set_user_team(victim, vteam == 1 ? 2 : 1)
                        g_iChangeTeam[victim] = vteam
			ExecuteHamB(Ham_Killed, victim, attacker, shouldgib)
		
			return HAM_SUPERCEDE
		}
	}
	return HAM_IGNORED
}

public Ham__Killed_Post(iVictim)
{
	if(is_user_connected(iVictim))
	{
		if(g_iChangeTeam[iVictim])
		{
			fm_set_user_team(iVictim, g_iChangeTeam[iVictim])
			g_iChangeTeam[iVictim] = 0
		}
		
		set_pev(iVictim, pev_deadflag, DEAD_RESPAWNABLE)
		dllfunc(DLLFunc_Think, iVictim)
	}
}

Who is online

Users browsing this forum: No registered users and 0 guests