Share Cash on disconnect

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

  1. ed09100

    ed09100 Новенький

    Hello all,

    I was trying to make a mutator that when a player leaves the server, or crash, his money, when disconnecting the server is redistributed to players in the game. So I did that:

    Код:
    Class ShareCashMut extends Mutator;
    
    var private int StartingCash;
    
    event PostBeginPlay()
    {
        if(KFGameType(Level.Game)!=None)
            StartingCash=KFGameType(Level.Game).StartingCash;
    }
    
    function NotifyLogout(Controller Exiting)
    {
        local int Cash;
        local int ShareCash;
        local Controller C;
    
        Cash=PlayerController(Exiting).PlayerReplicationInfo.Score;
        if(KFGameType(Level.Game)!=None && Exiting.bIsPlayer && Cash>StartingCash)
        {
            ShareCash=Cash/Level.Game.NumPlayers;
            for(C=Level.ControllerList; C!=None; C=C.NextController)
            {
                if(PlayerController(C)!=None)
                {
                    KFPlayerReplicationInfo(PlayerController(C).PlayerReplicationInfo).Score+=ShareCash;
                    PlayerController(C).ClientPlaySound(Class'CashPickup'.Default.PickupSound,True, 2.f);
                    PlayerController(C).ReceiveLocalizedMessage(class'CashMessage', ShareCash);
                }
            }
        }
        Super.NotifyLogout(Exiting);
    }
    
    defaultproperties
    {
        bAddToServerPackages=True
        GroupName="KF-ShareCash"
        FriendlyName="Share Cash Mutator"
        Description="Shares the money of exiting players with all other teammates alive."
    }

    Код:
    Class CashMessage extends LocalMessage;
    
    static function string GetString(optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject)
    {
        return "+ £"@Switch;
    }
    
    defaultproperties
    {
        bIsUnique=True
        bFadeMessage=True
        Lifetime=5
        DrawColor=(R=80,G=200,B=80,A=255)
        StackMode=SM_Down
        PosX=0.8
        FontSize=1
    }

    But I have the impression that it does not work !
    Could you help me ?
    Thanks in advance.
     
    Последнее редактирование: 24 сен 2018
  2. Essence

    Essence Moderator Команда форума

    Мутатор работает, но не так как должен.
    Когда я тестировал мутатор с напарником, после его выхода с сервера, я получил его деньги дважды.
    Разбираться особо не стал, хоть и есть догадки, почему так происходит.
    Мне кажется корректнее запускать Timer в NotifyLogout и в нём уже непосредственно выдавать деньги вышедшего игрока.

    Исправленный мутатор:
    Код:
    Class ShareCashMut extends Mutator;
    
    var float ShareCash;
    
    function NotifyLogout(Controller Exiting)
    {
        local float Cash;
        if(PlayerController(Exiting)!=None && PlayerController(Exiting).PlayerReplicationInfo!=None)
            Cash=PlayerController(Exiting).PlayerReplicationInfo.Score;
        if(KFGameType(Level.Game)!=None && Exiting.bIsPlayer && Cash>KFGameType(Level.Game).StartingCash)
        {
            if(KFGameType(Level.Game).NumPlayers>0)
                ShareCash=Cash/KFGameType(Level.Game).NumPlayers;
            SetTimer(1.0, False);
        }
        Super.NotifyLogout(Exiting);
    }
    
    function Timer()
    {
        local KFPlayerReplicationInfo KFPRI;
        local PlayerController PC;
        local Controller C;
        for(C=Level.ControllerList; C!=None; C=C.NextController)
        {
            PC=PlayerController(C);
            if(PC!=None)
            {
                if(PC.PlayerReplicationInfo!=None)
                    KFPRI=KFPlayerReplicationInfo(PlayerController(C).PlayerReplicationInfo);
                if(KFPRI!=None && KFPRI.PlayerID>0)
                {
                    KFPRI.Score+=ShareCash;
                    PC.ClientPlaySound(Class'CashPickup'.Default.PickupSound, True, 2.f);
                    PC.ReceiveLocalizedMessage(Class'CashMessage', ShareCash);
                }
            }
        }
    }
    
    defaultproperties
    {
         bAddToServerPackages=True
         GroupName="KF-ShareCashMut"
         FriendlyName="Share Cash Mutator"
         Description="Shares the money of exiting players with all other teammates alive."
    }

    Мутатор тестировал на выделенном сервере, работает как надо.
     
    Flame, RaideN- и STaJIKeR нравится это.