Страница 5 от 7

GoSpec [ /spec; /back; /change ]

Публикувано на: 11 Дек 2018, 05:10
от esc-Fiv3
Can you make that /spec command to be available only when you are dead? In that case you don't get one death for this command? And to be showed one chat message which say: You have to be dead to use /spec. Thanks!

GoSpec [ /spec; /back; /change ]

Публикувано на: 11 Дек 2018, 15:16
от OciXCrom

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <cromchat>
#include <cstrike>
#include <hamsandwich>

#define PLUGIN_VERSION "1.2"

enum _:Cvars
{
	gospec_spec_flag,
	gospec_change_flag,
	gospec_respawn
}

new g_eCvars[Cvars]

new CsTeams:g_iOldTeam[33],
	g_iSpecFlag,
	g_iChangeFlag

public plugin_init()
{
	register_plugin("GoSpec", PLUGIN_VERSION, "OciXCrom")
	register_cvar("@CRXGoSpec", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
	register_dictionary("GoSpec.txt")
	
	register_clcmd("say /spec", "GoSpec")
	register_clcmd("say /back", "GoBack")
	register_clcmd("say /change", "SwitchTeam")
	
	g_eCvars[gospec_spec_flag] = register_cvar("gospec_spec_flag", "e")
	g_eCvars[gospec_change_flag] = register_cvar("gospec_change_flag", "e")
	g_eCvars[gospec_respawn] = register_cvar("gospec_respawn", "0")
	CC_SetPrefix("[&x03GoSpec&x01]")
}

public plugin_cfg()
{
	new szFlag[2]
	get_pcvar_string(g_eCvars[gospec_spec_flag], szFlag, charsmax(szFlag))
	g_iSpecFlag = szFlag[0] == EOS ? ADMIN_ALL : read_flags(szFlag)
	get_pcvar_string(g_eCvars[gospec_change_flag], szFlag, charsmax(szFlag))
	g_iChangeFlag = szFlag[0] == EOS ? ADMIN_ALL : read_flags(szFlag)
}

public GoSpec(id)
{
	if(!HasAccess(id, g_iSpecFlag))
		return PLUGIN_HANDLED

	if(is_user_alive(id))
	{
		CC_SendMessage(id, "You have to be dead to use this command.")
		return PLUGIN_HANDLED
	}
	
	new CsTeams:iTeam = cs_get_user_team(id)
		
	if(iTeam == CS_TEAM_SPECTATOR)
		CC_SendMessage(id, "%L", id, "GOSPEC_ALREADY_SPECTATOR")
	else
	{
		g_iOldTeam[id] = iTeam
		cs_set_user_team(id, CS_TEAM_SPECTATOR)
		CC_SendMessage(id, "%L", id, "GOSPEC_NOW_SPECTATOR")
		
		if(is_user_alive(id))
			user_silentkill(id)
	}
	
	return PLUGIN_HANDLED
}

public GoBack(id)
{
	if(!HasAccess(id, g_iSpecFlag))
		return PLUGIN_HANDLED
		
	if(cs_get_user_team(id) != CS_TEAM_SPECTATOR)
		CC_SendMessage(id, "%L", id, "GOSPEC_NOT_SPECTATOR")
	else
	{
		new iPlayers[32], iCT, iT
		get_players(iPlayers, iCT, "e", "CT")
		get_players(iPlayers, iT, "e", "TERRORIST")
		
		if(iCT == iT)
		{
			cs_set_user_team(id, g_iOldTeam[id])
			CC_SendMessage(id, "%L", id, "GOSPEC_TRANSFERED_TO_PREVIOUS")
		}
		else
		{
			cs_set_user_team(id, iCT > iT ? CS_TEAM_T : CS_TEAM_CT)
			CC_SendMessage(id, "%L", id, "GOSPEC_TRANSFERED_TO_LESS")
		}
		
		if(get_pcvar_num(g_eCvars[gospec_respawn]))
			ExecuteHamB(Ham_CS_RoundRespawn, id)
	}		
	
	return PLUGIN_HANDLED
}

public SwitchTeam(id)
{
	if(!HasAccess(id, g_iChangeFlag))
		return PLUGIN_HANDLED
		
	new CsTeams:iTeam = cs_get_user_team(id)
		
		
	if(iTeam == CS_TEAM_SPECTATOR)
		CC_SendMessage(id, "%L", id, "GOSPEC_CANT_USE")
	else
	{
		cs_set_user_team(id, cs_get_user_team(id) == CS_TEAM_CT ? CS_TEAM_T : CS_TEAM_CT)
		CC_SendMessage(id, "%L", id, "GOSPEC_TRANSFERED_TO_OPPOSITE")
		
		if(is_user_alive(id))
		{
			user_silentkill(id)
			
			if(get_pcvar_num(g_eCvars[gospec_respawn]))
				ExecuteHamB(Ham_CS_RoundRespawn, id)
		}			
	}
	
	return PLUGIN_HANDLED
}

bool:HasAccess(id, iFlag)
{
	if(iFlag == ADMIN_ALL || get_user_flags(id) & iFlag)
		return true
	else
	{
		CC_SendMessage(id, "%L", id, "GOSPEC_NO_ACCESS")
		return false
	}
	
	#if AMXX_VERSION_NUM < 183
	return false
	#endif
}

GoSpec [ /spec; /back; /change ]

Публикувано на: 11 Дек 2018, 23:24
от esc-Fiv3
It works! Thanks!

GoSpec [ /spec; /back; /change ]

Публикувано на: 12 Дек 2018, 23:01
от Just
Може ли да се нарпави /spec; и /back да се ползва от всички играчи а change само от админите.

GoSpec [ /spec; /back; /change ]

Публикувано на: 12 Дек 2018, 23:09
от OciXCrom
Погледни кваровете.

GoSpec [ /spec; /back; /change ]

Публикувано на: 13 Дек 2018, 05:14
от esc-Fiv3
Found a bug: if I use /spec command and then I use /back, it doesn't load my player model that I set. If i type : /spec and then I leave the server and after I come back, the same thing..it doesn't load my player model

GoSpec [ /spec; /back; /change ]

Публикувано на: 14 Дек 2018, 14:07
от OciXCrom
Try adding cs_reset_user_model(id) after each cs_set_user_team line and see if it works. If not, you should update to the latest AMXX version.

GoSpec [ /spec; /back; /change ]

Публикувано на: 14 Дек 2018, 14:47
от esc-Fiv3
So I have to replace cs_set_user_team with cs_reset_user_model(id)? Or I just add cs_reset_user_model(id) like this:

Код за потвърждение: Избери целия код

else
	{
		g_iOldTeam[id] = iTeam
		cs_set_user_team(id, CS_TEAM_SPECTATOR)
		cs_reset_user_model(id)
		CC_SendMessage(id, "%L", id, "GOSPEC_NOW_SPECTATOR")
		
		if(is_user_alive(id))
			user_silentkill(id)
	}

GoSpec [ /spec; /back; /change ]

Публикувано на: 14 Дек 2018, 14:57
от OciXCrom
No, don't replace, just add it like you did.

GoSpec [ /spec; /back; /change ]

Публикувано на: 14 Дек 2018, 15:40
от esc-Fiv3
I did it. It works fine, except when you go spec, there is the default skin. But when you use /back and /change it works fine. I don't think that is posible to set a skin for /spec xD so thanks for this.