phoenix0001 发表于 2012-1-12 05:54

求个预留通道SP或SMX都行

求个预留通道SP或SMX都行

就是那种 人满了 优先T出一个ping最高的玩家

fenghf 发表于 2012-1-12 11:17

本帖最后由 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;
}

phoenix0001 发表于 2012-1-13 18:19

3Q...........:)

jzy353631297 发表于 2012-1-13 23:17

fenghf 发表于 2012-1-12 11:17 static/image/common/back.gif


真的假的好多网站发出来的都不能用,你这个经过测试没?
页: [1]
查看完整版本: 求个预留通道SP或SMX都行