Peršokti į turinį
  • ŽAIDIMAI
  • , ŽAIDIMAI
  • ŽAIDIMAI

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 5680 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Sveiki, paredaguokit kas prašau "Team Semiclip" pluginą, kad jis veiktų tik 15 sekundžių nuo raundo pradžios, o poto nebeleistų eiti kiaurai.

SMA:

#include 
#include 

#if AMXX_VERSION_NUM < 180
#assert AMX Mod X v1.8.0 or later library required!
#endif

#include 

/*================================================================================
[Constants, Offsets, Macros]
=================================================================================*/

new const PLUGIN_VERSION[] = "1.6.0"

const Float:DISTANCE_INTERVAL = 0.2
const Float:DISTANCE_RANGE = 128.0

enum
{
MOD_CSTRIKE = 0,
MOD_DOD
}
new g_iMod

new g_iPlayers[32], g_iNum, g_iPlayer
#define refresh_players() get_players(g_iPlayers, g_iNum, "a")

/*================================================================================
[Global Variables]
=================================================================================*/

new cvar_iSemiClip, cvar_iSemiClipEnemies, cvar_iSemiClipBlockTeams,
cvar_iSemiClipRenderMode, cvar_iSemiClipRenderAmt,
cvar_iSemiClipUnstuck, cvar_flSemiClipUnstuckDelay

new cvar_iBotQuota, cvar_iZombiePlague, cvar_iBiohazard, bool:g_bHamCzBots, g_iMaxPlayers

new g_iSpawnCount, Float:g_flSpawns[64][3], g_iSpawnCount2, Float:g_flSpawns2[64][3]

new g_iCachedSemiClip, g_iCachedEnemies, g_iCachedBlockTeams,
g_iCachedRenderMode, g_iCachedRenderAmt,
g_iCachedUnstuck, Float:g_flCachedUnstuckDelay,
g_iOldCachedEnemies, g_iOldCachedBlockTeams

new bool:g_bIsAlive[33]
new bool:g_bIsConnected[33]
new bool:g_bSolid[33]
new bool:g_bHaveSemiClip[33]
new g_iTeam[33]
new bool:g_bInRange[33][33]

#define is_user_valid(%1) (1 <= %1 <= g_iMaxPlayers)

/*================================================================================
[init and Cfg]
=================================================================================*/

public plugin_init()
{
register_plugin("Team Semiclip", PLUGIN_VERSION, "schmurgel1983")

RegisterHam(Ham_Spawn, "player", "fwd_PlayerSpawn_Post", 1)
RegisterHam(Ham_Killed, "player", "fwd_PlayerKilled")
RegisterHam(Ham_Player_PreThink, "player", "fwd_Player_PreThink_Post", 1)
RegisterHam(Ham_Player_PostThink, "player", "fwd_Player_PostThink")

register_forward(FM_AddToFullPack, "fwd_AddToFullPack_Post", 1)

new mod[8]
get_modname(mod, charsmax(mod))
if (equal(mod, "cstrike") || equal(mod, "czero"))
{
	g_iMod = MOD_CSTRIKE
	register_message(get_user_msgid("TeamInfo"), "message_TeamInfo")
}
if (equal(mod, "dod"))
{
	g_iMod = MOD_DOD
	register_message(get_user_msgid("PTeam"), "message_PTeam")
}

cvar_iSemiClip = register_cvar("semiclip", "1")
cvar_iSemiClipEnemies = register_cvar("semiclip_enemies", "0")
cvar_iSemiClipBlockTeams = register_cvar("semiclip_blockteam", "0")
cvar_iSemiClipRenderMode = register_cvar("semiclip_rendermode", "2")
cvar_iSemiClipRenderAmt = register_cvar("semiclip_renderamt", "130")
cvar_iSemiClipUnstuck = register_cvar("semiclip_unstuck", "1")
cvar_flSemiClipUnstuckDelay = register_cvar("semiclip_unstuckdelay", "0.5")

cvar_iBotQuota = get_cvar_pointer("bot_quota")
cvar_iZombiePlague = get_cvar_pointer("zp_on")
cvar_iBiohazard = get_cvar_pointer("bh_enabled")

if (cvar_iZombiePlague || cvar_iBiohazard)
	if (get_pcvar_num(cvar_iZombiePlague) == 1 || get_pcvar_num(cvar_iBiohazard) == 1)
		register_event("HLTV", "event_round_start", "a", "1=0", "2=0")

g_iMaxPlayers = get_maxplayers()
}

public plugin_cfg()
{
new configsdir[32]
get_configsdir(configsdir, charsmax(configsdir))
server_cmd("exec %s/team_semiclip.cfg", configsdir)

load_spawns()
set_task(0.2, "cache_cvars")
set_task(12.5, "cache_cvars", _, _, _, "b")
}

public client_connect(id)
{
g_bIsConnected[id] = false
set_cvars(id)
}

public client_putinserver(id)
{
g_bIsConnected[id] = true
set_cvars(id)

if(is_user_bot(id))
	if(!g_bHamCzBots && cvar_iBotQuota)
		set_task(0.1, "register_ham_czbots", id)
}

public client_disconnect(id)
{
g_bIsConnected[id] = false
set_cvars(id)
}

/*================================================================================
[Main Events]
=================================================================================*/

public event_round_start()
{
g_iOldCachedEnemies = g_iCachedEnemies
set_pcvar_num(cvar_iSemiClipEnemies, 1)
g_iCachedEnemies = 1

if (g_iCachedBlockTeams)
{
	g_iOldCachedBlockTeams = g_iCachedBlockTeams
	set_pcvar_num(cvar_iSemiClipBlockTeams, 0)
	g_iCachedBlockTeams = 0
}
}

/*================================================================================
[supporting Forwards]
=================================================================================*/

forward zp_round_started(gamemode, id)
public zp_round_started(gamemode, id)
{
if (g_iOldCachedBlockTeams)
{
	set_pcvar_num(cvar_iSemiClipBlockTeams, g_iOldCachedBlockTeams)
	g_iCachedBlockTeams = g_iOldCachedBlockTeams
}

if (!g_iOldCachedEnemies)
{
	set_pcvar_num(cvar_iSemiClipEnemies, g_iOldCachedEnemies)
	g_iCachedEnemies = g_iOldCachedEnemies
}
}

forward event_gamestart()
public event_gamestart()
{
if (g_iOldCachedBlockTeams)
{
	set_pcvar_num(cvar_iSemiClipBlockTeams, g_iOldCachedBlockTeams)
	g_iCachedBlockTeams = g_iOldCachedBlockTeams
}

if (!g_iOldCachedEnemies)
{
	set_pcvar_num(cvar_iSemiClipEnemies, g_iOldCachedEnemies)
	g_iCachedEnemies = g_iOldCachedEnemies
}
}

/*================================================================================
[Main Forwards]
=================================================================================*/

public fwd_PlayerSpawn_Post(id)
{
if (!is_user_alive(id) || !g_iTeam[id])
	return

g_bIsAlive[id] = true
set_task(DISTANCE_INTERVAL, "distance_check", id, _, _, "b")
}

public fwd_PlayerKilled(id)
{
g_bIsAlive[id] = false
remove_task(id)
}

public fwd_Player_PreThink_Post(id)
{
if (!g_iCachedSemiClip || !g_bIsAlive[id])
	return FMRES_IGNORED

refresh_players()

static i
for (i = 0; i < g_iNum; i++)
{
	g_iPlayer = g_iPlayers[i]

	if (!g_bHaveSemiClip[g_iPlayer])
	{
		g_bSolid[g_iPlayer] = true
	}
	else
	{
		g_bSolid[g_iPlayer] = false
	}
}

if (g_bSolid[id])
	for (i = 0; i < g_iNum; i++)
	{
		g_iPlayer = g_iPlayers[i]

		if (!g_bSolid[g_iPlayer] || g_iPlayer == id || g_iCachedBlockTeams == g_iTeam[g_iPlayer])
			continue
		if (!g_iCachedEnemies && g_iTeam[g_iPlayer] != g_iTeam[id])
			continue

		set_pev(g_iPlayer, pev_solid, SOLID_NOT)
		g_bHaveSemiClip[g_iPlayer] = true
	}

return FMRES_IGNORED
}

public fwd_Player_PostThink(id)
{
if (!g_bIsAlive[id])
	return FMRES_IGNORED

refresh_players()

static i
for (i = 0; i < g_iNum; i++)
{
	g_iPlayer = g_iPlayers[i]

	if (g_bHaveSemiClip[g_iPlayer])
	{
		set_pev(g_iPlayer, pev_solid, SOLID_SLIDEBOX)
		g_bHaveSemiClip[g_iPlayer] = false
	}
}

return FMRES_IGNORED
}

// (struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet)
public fwd_AddToFullPack_Post(es_handle, e, ent, host, flags, player, pSet)
{
if (!player || !g_bIsAlive[host] || !g_bSolid[host] || !g_bSolid[ent])
	return FMRES_IGNORED
if (g_iCachedBlockTeams == g_iTeam[host])
	return FMRES_IGNORED
if (!g_iCachedEnemies && g_iTeam[ent] != g_iTeam[host])
	return FMRES_IGNORED

set_es(es_handle, ES_Solid, SOLID_NOT)

if (!g_iCachedRenderMode || !g_bInRange[host][ent])
	return FMRES_IGNORED

set_es(es_handle, ES_RenderMode, g_iCachedRenderMode)
set_es(es_handle, ES_RenderAmt, g_iCachedRenderAmt)

return FMRES_IGNORED
}

/*================================================================================
[Other Functions and Tasks]
=================================================================================*/

public register_ham_czbots(id)
{
if (g_bHamCzBots || !is_user_connected(id) || !get_pcvar_num(cvar_iBotQuota))
	return

RegisterHamFromEntity(Ham_Spawn, id, "fwd_PlayerSpawn_Post", 1)
RegisterHamFromEntity(Ham_Killed, id, "fwd_PlayerKilled")
RegisterHamFromEntity(Ham_Player_PreThink, id, "fwd_Player_PreThink_Post", 1)
RegisterHamFromEntity(Ham_Player_PostThink, id, "fwd_Player_PostThink")

g_bHamCzBots = true

if (is_user_alive(id))
	fwd_PlayerSpawn_Post(id)
}

public cache_cvars()
{
clamp(g_iCachedSemiClip = get_pcvar_num(cvar_iSemiClip), 0, 1)
clamp(g_iCachedEnemies = get_pcvar_num(cvar_iSemiClipEnemies), 0, 1)
clamp(g_iCachedBlockTeams = get_pcvar_num(cvar_iSemiClipBlockTeams), 0, 2)
clamp(g_iCachedRenderMode = get_pcvar_num(cvar_iSemiClipRenderMode), 0, 5)
clamp(g_iCachedRenderAmt = get_pcvar_num(cvar_iSemiClipRenderAmt), 0, 255)
clamp(g_iCachedUnstuck = get_pcvar_num(cvar_iSemiClipUnstuck), 0, 1)
floatclamp(g_flCachedUnstuckDelay = get_pcvar_float(cvar_flSemiClipUnstuckDelay), 0.0, 3.0)
}

public do_random_spawn(id)
{
if (!g_bIsConnected[id] || !g_bIsAlive[id])
	return;

static hull, sp_index, i
hull = (pev(id, pev_flags) & FL_DUCKING) ? HULL_HEAD : HULL_HUMAN

switch (g_iTeam[id])
{
	case 1 : // TERRORIST, ALLIES
	{
		if (!g_iSpawnCount2)
			return;

		sp_index = random_num(0, g_iSpawnCount2 - 1)
		for (i = sp_index + 1; /*no condition*/; i++)
		{
			if (i >= g_iSpawnCount2) i = 0

			if (is_hull_vacant(g_flSpawns2[i], hull))
			{
				engfunc(EngFunc_SetOrigin, id, g_flSpawns2[i])
				break;
			}

			if (i == sp_index) break;
		}
	}
	case 2 : // CT, AXIS
	{
		if (!g_iSpawnCount)
			return;

		sp_index = random_num(0, g_iSpawnCount - 1)
		for (i = sp_index + 1; /*no condition*/; i++)
		{
			if (i >= g_iSpawnCount) i = 0

			if (is_hull_vacant(g_flSpawns[i], hull))
			{
				engfunc(EngFunc_SetOrigin, id, g_flSpawns[i])
				break;
			}

			if (i == sp_index) break;
		}
	}
}
}

public distance_check(id)
{
static Float:originF[3]
pev(id, pev_origin, originF)

static victim, i
victim = -1

for (i = 1; i <= g_iMaxPlayers; i++)
	g_bInRange[id][i] = false

while ((victim = engfunc(EngFunc_FindEntityInSphere, victim, originF, DISTANCE_RANGE)) != 0)
{
	if (!is_user_valid(victim) || !g_bIsAlive[victim])
		continue

	g_bInRange[id][victim] = true
}
}

set_cvars(id)
{
g_iTeam[id] = 0
g_bIsAlive[id] = false
g_bSolid[id] = false
g_bHaveSemiClip[id] = false
}

/*================================================================================
[Message Hooks]
=================================================================================*/

/*
TeamInfo:
read_data(1)	byte	EventEntity
read_data(2)	string	TeamName

type |                             name |      calls | time / min / max
   n |                  get_msg_arg_int |        502 | 0.000500 / 0.000001 / 0.000001
   n |               get_msg_arg_string |        502 | 0.000519 / 0.000001 / 0.000001
   p |                 message_TeamInfo |        998 | 0.002234 / 0.000001 / 0.000004

fast enough!
*/
public message_TeamInfo(msg_id, msg_dest)
{
if (msg_dest != MSG_ALL && msg_dest != MSG_BROADCAST)
	return;

static id, team[2]
id = get_msg_arg_int(1)
get_msg_arg_string(2, team, charsmax(team))
switch (team[0])
{
	case 'T' : // TERRORIST
	{
		g_iTeam[id] = 1;
	}
	case 'C' : // CT
	{
		g_iTeam[id] = 2;
	}
	case 'S' : // SPECTATOR
	{
		g_iTeam[id] = 3;
	}
	default : g_iTeam[id] = 0;
}

if (g_bIsAlive[id] && g_iCachedUnstuck && g_iCachedBlockTeams == g_iTeam[id])
{
	if (!is_player_stuck(id))
		return;

	if (g_flCachedUnstuckDelay > 0.0)
		set_task(g_flCachedUnstuckDelay, "do_random_spawn", id)
	else
		do_random_spawn(id)
}
}

/*
PTeam:
read_data(1)	byte	EventEntity
read_data(2)	byte	TeamIndex
*/
public message_PTeam(msg_id, msg_dest)
{
if (msg_dest != MSG_ALL && msg_dest != MSG_BROADCAST)
	return;

static id
id = get_msg_arg_int(1)

// 0 - UNASSIGNED
// 1 - ALLIES
// 2 - AXIS
// 3 - SPECTATOR
g_iTeam[id] = get_msg_arg_int(2)

if (g_bIsAlive[id] && g_iCachedUnstuck && g_iCachedBlockTeams == g_iTeam[id])
{
	if (!is_player_stuck(id))
		return;

	if (g_flCachedUnstuckDelay > 0.0)
		set_task(g_flCachedUnstuckDelay, "do_random_spawn", id)
	else
		do_random_spawn(id)
}
}

/*================================================================================
[stocks]
=================================================================================*/

// Check if a player is stuck (credits to VEN)
stock is_player_stuck(id)
{
static Float:originF[3]
pev(id, pev_origin, originF)

engfunc(EngFunc_TraceHull, originF, originF, 0, (pev(id, pev_flags) & FL_DUCKING) ? HULL_HEAD : HULL_HUMAN, id, 0)

if (get_tr2(0, TR_StartSolid) || get_tr2(0, TR_AllSolid) || !get_tr2(0, TR_InOpen))
	return true;

return false;
}

// Checks if a space is vacant (credits to VEN)
stock is_hull_vacant(Float:origin[3], hull)
{
engfunc(EngFunc_TraceHull, origin, origin, 0, hull, 0, 0)

if (!get_tr2(0, TR_StartSolid) && !get_tr2(0, TR_AllSolid) && get_tr2(0, TR_InOpen))
	return true;

return false;
}

stock collect_spawns_ent(const classname[])
{
new ent = -1
while ((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname)) != 0)
{
	new Float:originF[3]
	pev(ent, pev_origin, originF)
	g_flSpawns[g_iSpawnCount][0] = originF[0]
	g_flSpawns[g_iSpawnCount][1] = originF[1]
	g_flSpawns[g_iSpawnCount][2] = originF[2]

	g_iSpawnCount++
	if (g_iSpawnCount >= sizeof g_flSpawns) break;
}
}

stock collect_spawns_ent2(const classname[])
{
new ent = -1
while ((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname)) != 0)
{
	new Float:originF[3]
	pev(ent, pev_origin, originF)
	g_flSpawns2[g_iSpawnCount2][0] = originF[0]
	g_flSpawns2[g_iSpawnCount2][1] = originF[1]
	g_flSpawns2[g_iSpawnCount2][2] = originF[2]

	g_iSpawnCount2++
	if (g_iSpawnCount2 >= sizeof g_flSpawns2) break;
}
}

stock load_spawns()
{
if (g_iMod == MOD_CSTRIKE)
{
	collect_spawns_ent("info_player_start")
	collect_spawns_ent2("info_player_deathmatch")
}
else if (g_iMod == MOD_DOD)
{
	collect_spawns_ent("info_player_axis")
	collect_spawns_ent2("info_player_allies")
}
else
{
	set_pcvar_num(cvar_iSemiClipUnstuck, 0)
}
}

// amxmisc.inc
stock get_configsdir(name[], len)
{
return get_localinfo("amxx_configsdir", name, len);
}

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 5680 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Prisijungti prie diskusijos

Palikti atsakymą galite iš karto, o užsiregistruoti vėliau. Jeigu jau turite paskyrą mūsų forume, Prisijunkite.

Svečias
Atsakyti šioje temoje...

×   Įklijuotas tekstas turi teksto formatavimą.   Pašalinti teksto formatavimą

  Galimi tik 75 veidukai.

×   Nuoroda buvo automatiškai įterpta.   Įterpti nuorodą paprastai

×   Jūsų ankstesnis pranešimas buvo atkurtas.   Išvalyti redaktorių

×   Jūs negalite įkelti nuotraukas tiesiogiai.Įkelkite arba įdėkite nuotraukas iš URL.

  • Šiame puslapyje naršo:   0 nariai

    • Nėra registruotų narių peržiūrinčių šį forumą.

Skelbimai


×
×
  • Sukurti naują...