homework 发表于 2011-11-21 09:58:04

【已解决】死亡模式队伍平衡插件。

本帖最后由 homework 于 2012-10-27 01:08 编辑

求个死亡模式下用的特殊功能队伍平衡功能插件。

插件用途:用于死亡模式服务器的队伍平衡。
插件功能:能在服务器出现CT、T两边人数相差2人时(或以上)自动平衡两边人数
特殊功能:能在玩家都活着的时候平衡两边队伍人数

问题描述:
1、死亡模式大家都知道死后马上复活,而且一局不会结束,一般的队伍平衡插件是在一局结束后进行判断然后平衡队伍人数;所以一般的队伍平衡插件使用在死亡F上没有实际效果。
2、还有这样的情况,死亡服务器上添加的有进入服务器后自动加入队伍插件,这样就可以避免玩家选择偏爱队伍造成不平衡。但是,比如现在CT、T队伍现在是8:8,突然一方退出2位玩家,就变成了6:8,而后一直没有玩家加入服务器,就造成了2边人数势力不平衡;所以需要一种能在人物活着的时候平衡队伍人数。

一点构思:
1、如果写这个插件可以用时间间隔来判断队伍人数(定时、循环),比如每30秒等,可以设置。
2、判定双方人数不平衡后(相差2人或以上)不管活着死亡(除观察员、正在连接玩家以外)自动平衡。
3、死亡模式可以设置玩家死亡后的复活时间,一般服务器设置为1-5秒,如果可以利用这段时间来平衡队伍可能会更人性化,不会让玩家被平衡的时候觉得太突然,但是估计会很麻烦,呵呵。

希望哪位大大帮忙发个此类插件 或 写个,不胜感激;小弟懂点点源码,但要写还有十分大的一段距离。

期待高手,希望此贴也能造福DT,和需要此插件的服务器管理员们,再次感谢。

homework 发表于 2011-11-22 14:55:07

顶一下!!!!!!:) 希望有高手关注。

ckn911 发表于 2011-11-22 15:24:02

顶一个··

zhangsheng 发表于 2011-11-22 22:26:53

试试这个插件

homework 发表于 2011-11-29 10:41:13

感谢zhangsheng大大的关注,听说zhangsheng大大已经转向CSOL了,呵呵,
所以特别感谢。

您提供的插件我已经下载放服务器上测试,有测试结果我即时发出来。

homework 发表于 2011-12-6 11:34:26

zhangsheng大大,插件起到了平衡的作用。
想再请教几个问题,这个插件里面功能这样解释正确不,如下:/*        Copyright ?2008, ConnorMcLeod

        Instant AutoTeamBalance is free software;
        you can redistribute it and/or modify it under the terms of the
        GNU General Public License as published by the Free Software Foundation.

        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
        GNU General Public License for more details.

        You should have received a copy of the GNU General Public License
        along with Instant AutoTeamBalance; if not, write to the
        Free Software Foundation, Inc., 59 Temple Place - Suite 330,
        Boston, MA 02111-1307, USA.
*/

#include <amxmodx>
#include <cstrike>

#define VERSION "DM 0.4.0"

#define BALANCE_IMMUNITY                ADMIN_RCON

#define MAX_PLAYERS        32

enum {
        aTerro,
        aCt
}

new bool:g_bImmuned

new Float:g_fJoinedTeam = {-1.0, ...}

new g_pcvarCount, g_pcvarImmune, g_pCvarMessage

new g_iCounter
new mp_limitteams, mp_autoteambalance

public plugin_init()
{
        register_plugin("AutoTeamBalance", VERSION, "ConnorMcLeod")

        g_pcvarCount = register_cvar("atb_death_freq", "50")
        g_pcvarImmune = register_cvar("atb_admins_immunity", "1")
        g_pCvarMessage = register_cvar("iatb_message", "* 系统已自动平衡两队人数 *")

        register_logevent("LogEvent_JoinTeam", 3, "1=joined team")
        register_event("DeathMsg", "Event_DeathMsg", "a")

        mp_limitteams = get_cvar_pointer("mp_limitteams")
        mp_autoteambalance = get_cvar_pointer("mp_autoteambalance")
}

public Event_DeathMsg()
{
        new iFreq = get_pcvar_num(g_pcvarCount)
        if( !iFreq || !get_pcvar_num(mp_autoteambalance) )
                return

        if( ++g_iCounter < iFreq )
                return

        g_iCounter = 0
        balance_teams()
}

public LogEvent_JoinTeam()
{
        new loguser, name, id
        read_logargv(0, loguser, 79)
        parse_loguser(loguser, name, 31)
        id = get_user_index(name)

        g_fJoinedTeam = get_gametime()
}

public client_authorized(id)
{
        g_bImmuned = bool:(get_user_flags(id) & BALANCE_IMMUNITY)
}

public client_disconnect(id)
{
        g_iCounter = max(0, get_pcvar_num(g_pcvarCount) - 1)
}

balance_teams()
{
        new iPlayers, iNum
        new aTeams, aNum, id

        get_players(iPlayers, iNum, "h")

        for(new i; i<iNum; i++)
        {
                id = iPlayers

                switch( cs_get_user_team(id) )
                {
                        case CS_TEAM_T:
                        {
                                aTeams++] = id
                        }
                        case CS_TEAM_CT:
                        {
                                aTeams++] = id
                        }
                }
        }

        new iCheck
        new iTimes = aNum - aNum

        if(iTimes > 0)
        {
                iCheck = aCt
        }
        else if(iTimes < 0)
        {
                iCheck = aTerro
        }
        else
        {
                return
        }

        iTimes = abs(iTimes)

        // at this place iTimes is the players num difference between teams
        if( iTimes < 2 || iTimes <= get_pcvar_num(mp_limitteams) )
        {
                return
        }

        iTimes /= 2

        new bool:bTransfered,
                bool:bAdminsImmune = bool:get_pcvar_num(g_pcvarImmune)

        new iLast, iCount
        while( iTimes > 0 )
        {
                iLast = 0
                for(new i=0; i <aNum; i++)
                {
                        id = aTeams
                        if( g_bImmuned && bAdminsImmune )
                        {
                                continue
                        }
                        if(bTransfered)
                        {
                                continue
                        }
                        if(g_fJoinedTeam > g_fJoinedTeam)
                        {
                                iLast = id
                        }
                }

                if(!iLast)
                {
                        return
                }

                if( iCheck )
                {
                        cs_set_user_team(iLast, CS_TEAM_T)
                }
                else
                {
                        cs_set_user_team(iLast, CS_TEAM_CT)
                }

                bTransfered = true
                iCount++
                iTimes--
        }

        new szMessage
        get_pcvar_string(g_pCvarMessage, szMessage, charsmax(szMessage))
        client_print(0, print_center, szMessage)
}g_pcvarImmune = register_cvar("atb_admins_immunity", "1") 这里1表示不平衡管理员权限人员,如果改成0,是不是就表示 管理员权限 也会被平衡?
g_pcvarCount = register_cvar("atb_death_freq", "50") 这里50是不是表示间隔多少时间平衡一次?

詩緔ジ☆Xiao猪 发表于 2013-6-24 21:01:57

谢谢
楼主分享~~~~:)
页: [1]
查看完整版本: 【已解决】死亡模式队伍平衡插件。