Сохранение данных при вылете из игры

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

Метки:
  1. Flame

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

    Мутатор сохраняет основные данные игрока на случай его вылета из игры (либо, если игрок сам вышел, а потом вернулся)
    А именно:
    - деньги
    - время в игре
    - количество убитых

    Больше в общем то для классики нечего сохранять

    Замечание: Кач игрока нет нужды сохранять - он и так сохраняется пока не кончится карта, либо пока не упадёт сервер)
    В принципе, можно сохранить оружие игрока, либо сумму денег равную цене на оружие в инвентаре игрока, но это уже надо думать нюансы. Пишите, что бы вы хотели сохранить - понаделаем вариантов мутатора

    Настройки:
    Period - количество секунд через которые обновляется информация о деньгах игрока и о количестве убитых
    По умолчанию поставил 5 секунд. То есть состояние данных игрока сохраняется в массив каждые 5 секунд

    Код:
    Код:
    Class RecoverDataMut extends Mutator config (RecoverDataMut);
    
    struct RecoverDataStruct
    {
        var string Hash;
        var int StartTime;
        var int Cash;
        var int Kills;
        var bool bDoNotUpdate;
    };
    var array<RecoverDataStruct> Data;
    var array<PlayerController> PendingPlayers;
    
    var config int Period;
    
    function PostBeginPlay()
    {
        SaveConfig();
    }
    
    function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
    {
        if(PlayerController(Other)!=none)
        {
            PendingPlayers[PendingPlayers.Length]=PlayerController(Other);
            SetTimer(0.1,false);
        }
        return true;
    }
    
    function Timer()
    {
        local PlayerController PC;
        local RecoverDataStruct rds;
        local string Hash;
        local int i, N;
    
        for(i=PendingPlayers.Length-1;i>=0;i--)
        {
            PC=PendingPlayers[i];
            if(PC.PlayerReplicationInfo.PlayerID>0)
            {
                Hash=PC.GetPlayerIDHash();
                N=PlayerPosInList(Hash);
                if(N<0)
                {
                    rds.Hash=Hash;
                    rds.StartTime=PC.PlayerReplicationInfo.StartTime;
                    rds.Cash=PC.PlayerReplicationInfo.Score;
                    rds.Kills=PC.PlayerReplicationInfo.Kills;
                    Data[Data.Length]=rds;
                }
                else
                {
                    Data[N].bDoNotUpdate=true;
                    PC.PlayerReplicationInfo.StartTime=Data[N].StartTime;
                    PC.PlayerReplicationInfo.Score=Data[N].Cash;
                    PC.PlayerReplicationInfo.Kills=Data[N].Kills;
                }
            }
        }
        PendingPlayers.Length=0;
    }
    
    function ModifyData()
    {
        local Controller C;
        local string Hash;
        local int N;
        for( C = Level.ControllerList; C != None; C = C.nextController )
        {
            if    (
                    C.IsA('PlayerController')
                    &&    C.PlayerReplicationInfo.PlayerID>0
                )
            {
                Hash=PlayerController(C).GetPlayerIDHash();
                N=PlayerPosInList(Hash);
                if(N>=0)
                {
                    if(!Data[N].bDoNotUpdate)
                    {
                        Data[N].Cash=C.PlayerReplicationInfo.Score;
                        Data[N].Kills=C.PlayerReplicationInfo.Kills;
                        Data[N].bDoNotUpdate=false;
                    }
                }
            }
        }
    }
    function int PlayerPosInList(string Hash)
    {
        local int i;
        for(i=0;i<Data.Length;i++)
        {
            if(Hash~=Data[i].Hash)
                return i;
        }
        return -1;
    }
    
    Auto state PlaytimeTimer
    {
    Begin:
        while(true)
        {
            Sleep(Period);
            ModifyData();
        }
    }
    
    defaultproperties
    {
        Period=5
        GroupName="KF-RecoverData"
        FriendlyName="RecoverDataMut"
        Description="RecoverDataMut"
    }
    

    Ссылка 1 и Ссылка 2
    RecoverDataMut.RecoverDataMut
     
    coffeediction и Essence нравится это.