求个预留通道SP或SMX都行
求个预留通道SP或SMX都行就是那种 人满了 优先T出一个ping最高的玩家
本帖最后由 fenghf 于 2012-1-12 11:20 编辑
#pragma semicolon 1
#include <sourcemod>
#define PLUGIN_VERSION "1.0.2"
#define CVAR_FLAGS FCVAR_PLUGIN|FCVAR_NOTIFY
public Plugin:myinfo =
{
name = "L4D(2)管理员预留通道",
author = "g",
description = "L4D(2)管理员预留通道",
version = PLUGIN_VERSION,
url = "g"
};
#define MSG_KICK_REASON "剩余通道是留给管理员的.."
static MaxPlayer, bool:IsAdmin,
Handle:L4dtoolzExtension = INVALID_HANDLE,
Handle:DowntownExtension = INVALID_HANDLE,
Handle:cvarReservedSlots = INVALID_HANDLE,
Handle:cvarReserveKickMode = INVALID_HANDLE;
/* 注释 - 检测游戏L4D/L4D2 */
public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
{
decl String:game_name;
GetGameFolderName(game_name, sizeof(game_name));
if (!StrEqual(game_name, "left4dead", false) && !StrEqual(game_name, "left4dead2", false))
{
Format(error, err_max, "Plugin supports Left4Dead and Left4Dead 2 only.");
return APLRes_Failure;
}
return APLRes_Success;
}
public OnPluginStart()
{
L4dtoolzExtension = FindConVar("sv_maxplayers");
DowntownExtension = FindConVar("l4d_maxplayers");
CreateConVar("l4d_reservedslots_version", PLUGIN_VERSION, "Version", CVAR_FLAGS|FCVAR_SPONLY|FCVAR_DONTRECORD);
cvarReservedSlots = CreateConVar("l4d_reserved_slots", "1", "满人后预留几个通道给管理员0=关闭", CVAR_FLAGS, true, 0.0);
cvarReserveKickMode = CreateConVar("l4d_reserve_kickmode", "1", "满人后踢出玩家模式0=随机1=最高ping",CVAR_FLAGS, true, 0.0, true, 1.0);
AutoExecConfig(true, "l4d_reservedslots");
}
/* 设定预留通到 */
public OnConfigsExecuted()
{
new newValue, Slots = GetConVarInt(cvarReservedSlots);
if (!Slots) return;
if (DowntownExtension != INVALID_HANDLE)
{
MaxPlayer = GetConVarInt(DowntownExtension);
newValue = MaxPlayer + Slots;
SetConVarInt(DowntownExtension, newValue);
}
else if (L4dtoolzExtension != INVALID_HANDLE || (L4dtoolzExtension != INVALID_HANDLE && DowntownExtension != INVALID_HANDLE))
{
MaxPlayer = GetConVarInt(L4dtoolzExtension);
newValue = MaxPlayer + Slots;
SetConVarInt(L4dtoolzExtension, newValue);
}
}
/* 还原设置 */
public OnMapEnd()
{
new Slots = GetConVarInt(cvarReservedSlots);
if (!Slots) return;
if (DowntownExtension != INVALID_HANDLE)
{
SetConVarInt(DowntownExtension, MaxPlayer);
}
else if (L4dtoolzExtension != INVALID_HANDLE || (L4dtoolzExtension != INVALID_HANDLE && DowntownExtension != INVALID_HANDLE))
{
SetConVarInt(L4dtoolzExtension, MaxPlayer);
}
}
public OnClientPostAdminCheck(Client)
{
if (IsFakeClient(Client) || !GetConVarInt(cvarReservedSlots))
return;
new AdminId:admin = GetUserAdmin(Client);
if(admin != INVALID_ADMIN_ID)
IsAdmin = true;
else
IsAdmin = false;
// 检测
if (IsServerFull())
{
if (IsAdmin) KickClient(SelectKickClient(), MSG_KICK_REASON);
else KickClient(Client, MSG_KICK_REASON);
}
}
public bool:IsServerFull()
{
new max, current=0;
if (DowntownExtension != INVALID_HANDLE)
max = GetConVarInt(DowntownExtension);
else if (L4dtoolzExtension != INVALID_HANDLE || (L4dtoolzExtension != INVALID_HANDLE && DowntownExtension != INVALID_HANDLE))
max = GetConVarInt(L4dtoolzExtension);
for (new i=1; i<=MaxClients; i++)
{
if (!IsClientConnected(i)) continue;
if (!IsFakeClient(i))
current++;
}
if (current >= max)
return true;
return false;
}
SelectKickClient()
{
new Mode=GetConVarInt(cvarReserveKickMode), count=-1, wretch,
Float:value=0.0, Float:highestValue, Float:highestSpecValue,
bool:specFound, highestValueId, highestSpecValueId;
for (new i=1; i<=MaxClients; i++)
{
if (!IsClientConnected(i)) continue;
if (IsFakeClient(i) || IsAdmin) continue;
if (IsClientInGame(i))
{
if (Mode)
value = GetClientAvgLatency(i, NetFlow_Outgoing);
else
{
count++;
wretch=i;
}
if (IsClientObserver(i))
{
specFound = true;
if (value > highestSpecValue) highestSpecValue = value, highestSpecValueId = i;
}
}
if (value >= highestValue) highestValue = value, highestValueId = i;
}
if (!Mode) return wretch;
if (specFound) return highestSpecValueId;
return highestValueId;
} 3Q...........:) fenghf 发表于 2012-1-12 11:17 static/image/common/back.gif
真的假的好多网站发出来的都不能用,你这个经过测试没?
页:
[1]