User-Profile-Image
hankin
  • 5
  • 关于
  • 分类
    • 路由器
    • 电脑相关
    • 游戏相关
    • 未分类
    • 服务器相关
    • 数据库
  • 页面
    • 关于
  • 友链
    • 华夏网盟
Help?

Please contact us on our email for need any support

Support
  • 关于
    首页   ›   游戏相关   ›   正文
游戏相关

L4D 管理员预留通道源码

2021-02-22 15:15:00
112  0 0
#pragma semicolon 1
#include <sourcemod>

#define    PLUGIN_VERSION    "1.0.1"
#define CVAR_FLAGS FCVAR_PLUGIN|FCVAR_NOTIFY

public Plugin:myinfo =
{
    name = "L4D(2) Reserved Slots",
    author = "蛋疼哥",
    description = "L4D(2)管理员预留通道",
    version = PLUGIN_VERSION,
    url = "http://bbs.jumpgame.net/"
};

#define MSG_KICK_REASON    "Sorry! 服务器已满,由于你占用管理员预留通道被踢出! 详情请咨询当前Server管理员"

static    MaxPlayer, bool:IsAdmin[MAXPLAYERS+1],
    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[64];
    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[Client] = true;
    else
        IsAdmin[Client] = false;
    /* 检测 */
    if (IsServerFull())
    {
        if (IsAdmin[Client]) 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[MAXPLAYERS+1],
        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[i]) continue;
        if (IsClientInGame(i))
        {
            if (Mode)
                value = GetClientAvgLatency(i, NetFlow_Outgoing);
            else
            {
                count++;
                wretch[count]=i;
            }
            if (IsClientObserver(i))
            {
                specFound = true;
                if (value > highestSpecValue) highestSpecValue = value, highestSpecValueId = i;
            }
        }
        if (value >= highestValue) highestValue = value, highestValueId = i;
    }

    if (!Mode) return wretch[GetRandomInt(0, count)];

    if (specFound) return highestSpecValueId;

    return highestValueId;
}
评论 (0)

Click here to cancel reply.

欢迎您 游客  

近期文章

  • 用于网速测试的下载测速文件合集
  • docker构建SB镜像
  • pterodactl docker install
  • OpenWRT流量实时监控插件
  • docker部署dify

近期评论

No comments to show.

归档

  • 1 月 2026
  • 8 月 2025
  • 5 月 2025
  • 4 月 2025
  • 3 月 2025
  • 2 月 2025
  • 12 月 2024
  • 4 月 2024
  • 10 月 2023
  • 8 月 2023
  • 4 月 2023
  • 3 月 2023
  • 2 月 2023
  • 10 月 2021
  • 5 月 2021
  • 3 月 2021
  • 2 月 2021

分类

  • 数据库
  • 服务器相关
  • 未分类
  • 游戏相关
  • 电脑相关
  • 路由器
Copyright © 2026
smarty_hankin 主题. Designed by hankin
主页
页面
  • 关于
博主
hkthomas 管理员
136 文章 0 评论 18450 浏览
测试
测试