Фиксация ников игроков

Тема в разделе "Общего назначения", создана пользователем Flame, 17 ноя 2016.

  1. Flame

    Flame -Заслуженый кодер форума-

    Мутатор фиксирует ники игроков, сохраняет в своей базе соответствие между HashID игрока и его именем.
    При появлении игрока меняет ему ник, если он уже есть в базе.
    После окончания карты фиксирует ещё не зафиксированные ники.

    Я подобный уже делал - это новая версия. Сохраняет данные "Per Object", аналогично SP

    Работает независимо от того используется ли удалённая база данных или нет
    Более подробно о том зачем он нужен в этой вот теме

    В настройках можно задать список ников, которые не будут сохраняться в базу данных RestoreFixedNameBase.ini
    Иначе может так получиться что сохранится игрок со стандартным ником и он будет выкинут из игры мутатором KickNickMut :)

    RestoreFixedNameMut.ini
    Код:
    ExceptionNames=FreshMeat
    ...
    ExceptionNames=MagicPeople
    
    Код:
    Код:
    class RestoreFixedNameMut extends Mutator config(RestoreFixedNameMut);
    
    var array<PlayerReplicationInfo> PendingPlayers;
    var RestoreFixedNameRules Rules;
    
    var config array<string> ExceptionNames;
    
    function PostBeginPlay()
    {
        if(Rules==None)
        {
            Rules=Spawn(Class'RestoreFixedNameRules');
            Rules.mut=self;
        }
        SaveConfig();
    }
    
    function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
    {
        if(PlayerReplicationInfo(Other)!=None)
        {
            PendingPlayers[PendingPlayers.Length] = PlayerReplicationInfo(Other);
            SetTimer(0.5,false);
        }
        return true;
    }
    
    function Timer()
    {
        local int i;
        for(i=0;i<PendingPlayers.Length;i++)
        {
            if(Len(PendingPlayers[i].PlayerName)==0)
            {
                SetTimer(0.5,false);
                return;
            }
            CheckAndFixName(PendingPlayers[i]);
        }
        PendingPlayers.Length = 0;
    }
    
    function CheckAndFixName(PlayerReplicationInfo PRI)
    {
        local string Hash;
        local string PlayerNameFromBase;
    
        if(PRI.PlayerID==0)
            return;
        if(PlayerController(PRI.Owner)==none)
            return;
    
        Hash=PlayerController(PRI.Owner).GetPlayerIDHash();
        PlayerNameFromBase=class'NameObject'.static.Get(Hash,"PlayerName");
        if(Len(PlayerNameFromBase)!=0)
            PRI.PlayerName=PlayerNameFromBase;
    }
    
    function SaveNames()
    {
        local Controller C;
        local string Hash,PlayerNameFromBase;
        for(C=Level.ControllerList;C!=None;C=C.nextController)
        {
            if(C.IsA('PlayerController') && C.PlayerReplicationInfo.PlayerID>0)
            {
                if(!InExceptionList(C.PlayerReplicationInfo.PlayerName))
                {
                    PlayerNameFromBase="";
                    Hash=PlayerController(C).GetPlayerIDHash();
                    PlayerNameFromBase=class'NameObject'.static.Get(Hash,"PlayerName");
                    if(Len(PlayerNameFromBase)==0)
                        class'NameObject'.static.Set(Hash,"PlayerName",C.PlayerReplicationInfo.PlayerName);
                }
            }
        }
    }
    
    function bool InExceptionList(string PlayerName)
    {
        local int i;
        for(i=0;i<ExceptionNames.Length;i++)
        {
            if(PlayerName~=ExceptionNames[i])
                return true;
        }
        return false;
    }
    
    defaultproperties
    {
        ExceptionNames(0)="FreshMeat"
        GroupName="KF-RestoreFixedName"
        FriendlyName="RestoreFixedNameMut"
        Description="RestoreFixedNameMut"
    }
    
    Код:
    class RestoreFixedNameRules extends GameRules;
    
    var RestoreFixedNameMut mut;
    
    //Стандартные функции GameRules
    function PostBeginPlay()
    {
        if(Level.Game.GameRulesModifiers == none)
            Level.Game.GameRulesModifiers = self;
        else
            Level.Game.GameRulesModifiers.AddGameRules(self);
    }
    function AddGameRules(GameRules GR)
    {
        if(GR != self)
            super.AddGameRules(GR);
    }
    
    //Если игра закончена сохраняем имена игроков, которые ещё не в базе
    function bool CheckEndGame(PlayerReplicationInfo Winner, string Reason)
    {
        mut.SaveNames();
        if(NextGameRules != None)
            return NextGameRules.CheckEndGame(Winner,Reason);
        return true;
    }
    
    Код:
    Class NameObject extends Object PerObjectConfig Config(RestoreFixedNameBase);
    
    var private transient NameObject Ref;
    var config string PlayerName;
    
    static final function NameObject GetSettings(string Hash)
    {
        Default.Ref = New(None,Hash)Class'NameObject';
        return Default.Ref;
    }
    
    static final function string Get(string Hash, string Setting)
    {
        local NameObject S;
        S = GetSettings(Hash);
        return S.GetPropertyText(Setting);
    }
    
    static final function Set(string Hash, string Setting, string V)
    {
        local NameObject S;
        S = GetSettings(Hash);
        S.SetPropertyText(Setting,V);
        S.SaveConfig();
    }
    

    Ссылка 1 или Ссылка 2
    RestoreFixedNameMut.RestoreFixedNameMut

    Upd. Кстати, подход используемый в данном мутаторе будет вам удобен при реализации многих других мутаторов. Я и сам скоро переделаю многие свои мутаторы на базе данной Static реализации PerObjectConfig.

    Upd2. Спасибо Шершню за найденный косяк. Поправил мутатор)
    Ники фиксировались неправильно. Потом весь сервер бегал с одним ником.
     
    Последнее редактирование: 20 ноя 2016
    denfil777, LLIePLLIeHb и w.a.l нравится это.
  2. Flame

    Flame -Заслуженый кодер форума-

    Поправил мутатор
    Спасибо Шершню за найденный косяк
    Ники фиксировались неправильно. Потом весь сервер бегал с одним ником)