Steam статистика и SP

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

  1. Flame

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

    Данный мутатор позволяет новичкам играть на сервере не с 0 перками, а с теми, что были прокачены в Steam
    (ну точнее речь не об уровнях перков, а о значениях прокачки)

    Заметил я что предыдущая версия мутатора требует, чтобы ServerPerksMut закачивался на клиент
    Что не удивительно - ведь мы правим StatsObject из этого пакета

    Поэтому сделал связку из двух мутаторов
    Один на клиенте берёт данные, находит второй чисто серверный мутатор и передаёт ему данные
    На этом втором мутаторе и происходит прописывание кача игроку

    Кроме того добавил проверку на "пиратку".
    Итак, теперь такие настройки:
    bLimitInitValues - true/false, если true, то стим кач урезается до значений 6 уровня перка.
    Например на стиме берсеркер прокачен до 12м, но требование к 6 уровню - это 5.5м
    Значит игроку пропишется 5.5м.
    Если false, то никаких ограничений. Но не забывайте, что стим кач так же не очень то сложно поправить сторонними программами.

    bAllowPirates - true/false, если true, то нет проверки с пиратки игрок заходит или нет. Если false, то есть. Соответственно если false и игрок зашёл с пиратки - ему кач не пропишется
    Насколько она (эта проверка) хороша пока не ясно - тестируйте.

    Код:
    Код:
    class SteamStatsServerMut extends Mutator config(SteamStatsServerMut);
    
    var array<PlayerController> PendingPlayers;
    var config bool bLimitInitValues,bAllowPirates;
    
    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 int i;
        local SteamStatsServerItem sssi;
        for(i=PendingPlayers.Length-1;i>=0;i--)
        {
            if    (
                    PendingPlayers[i].PlayerReplicationInfo!=none
                    &&    PendingPlayers[i].PlayerReplicationInfo.PlayerID>0
                )
            {
                sssi=Spawn(Class'SteamStatsServerItem',PendingPlayers[i]);
                sssi.mut=self;
            }
        }
        PendingPlayers.Length = 0;
    }
    
    defaultproperties
    {
        GroupName="KF-SteamStatsServer"
        FriendlyName="SteamStatsServer"
        Description="SteamStatsServer"
    }
    
    Код:
    class SteamStatsServerItem extends Actor;
    
    var SteamStatsServerMut mut;
    var ClientPerkRepLink CPRL;
    var StatsObject MyStatsObject;
    var string OwnerHash;
    
    var int DamageHealed, WeldingPoints, ShotgunDamage, HeadshotKills, StalkerKills, BullpupDamage, MeleeDamage,FlameThrowerDamage, ExplosivesDamage;
    var int EventToken;
    var bool DataTransfered;
    
    function PostBeginPlay()
    {
        local PlayerController PC;
        PC=PlayerController(Owner);
        if(PC==none)
            return;
        OwnerHash=PC.GetPlayerIDHash();
        MyStatsObject=ServerStStats(PC.SteamStatsAndAchievements).MyStatsObject;
        CPRL = Class'ClientPerkRepLink'.Static.FindStats(PC);
        SetTimer(1.0,true);
    }
    
    function Tick(float dt)
    {
        if(DataTransfered)
        {
            if    (
                    EventToken==2
                    ||    mut.bAllowPirates
                )
            {
                WriteVarToServer("DamageHealed",DamageHealed);
                WriteVarToServer("WeldingPoints",WeldingPoints);
                WriteVarToServer("ShotgunDamage",ShotgunDamage);
                WriteVarToServer("HeadshotKills",HeadshotKills);
                WriteVarToServer("StalkerKills",StalkerKills);
                WriteVarToServer("BullpupDamage",BullpupDamage);
                WriteVarToServer("MeleeDamage",MeleeDamage);
                WriteVarToServer("FlameThrowerDamage",FlameThrowerDamage);
                WriteVarToServer("ExplosivesDamage",ExplosivesDamage);
            }
            Disable('Tick');
            Destroy();
        }
    }
    
    function WriteVarToServer(string VarName, int Value)
    {
        local int tmpValue;
        local int perkLimit;
        perkLimit=GetInitPerkLimit(VarName);
    
        tmpValue=int(MyStatsObject.GetPropertyText(VarName$"Stat"));
        if(perkLimit>0 && mut.bLimitInitValues)
            MyStatsObject.SetPropertyText(VarName$"Stat",string(Min(perkLimit,Max(tmpValue,Value))));
        else
            MyStatsObject.SetPropertyText(VarName$"Stat",string(Max(tmpValue,Value)));
    
        tmpValue=int(CPRL.GetPropertyText("R"$VarName$"Stat"));
        if(perkLimit>0 && mut.bLimitInitValues)
            CPRL.SetPropertyText("R"$VarName$"Stat",string(Min(perkLimit,Max(tmpValue,Value))));
        else
            CPRL.SetPropertyText("R"$VarName$"Stat",string(Max(tmpValue,Value)));
        CPRL.StatObject.NotifyStatChanged();
    }
    
    function int GetInitPerkLimit(string VarName)
    {
        switch(VarName)
        {
            case "DamageHealed":
                return 100000;
            case "WeldingPoints":
                return 370000;
            case "ShotgunDamage":
                return 5500000;
            case "HeadshotKills":
                return 8500;
            case "StalkerKills":
                return 3600;
            case "BullpupDamage":
                return 5500000;
            case "MeleeDamage":
                return 5500000;
            case "FlameThrowerDamage":
                return 5500000;
            case "ExplosivesDamage":
                return 5500000;
        }
        return 0;
    }
    
    Код:
    class SteamStatsClientMut extends Mutator;
    
    var array<PlayerController> PendingPlayers;
    
    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 int i;
        local SteamStatsClientItem ssci;
        for(i=PendingPlayers.Length-1;i>=0;i--)
        {
            if    (
                    PendingPlayers[i].PlayerReplicationInfo!=none
                    &&    PendingPlayers[i].PlayerReplicationInfo.PlayerID>0
                )
            {
                ssci=Spawn(Class'SteamStatsClientItem',PendingPlayers[i]);
                ssci.mut=self;
            }
        }
        PendingPlayers.Length = 0;
    }
    
    defaultproperties
    {
        bAddToServerPackages=True
        GroupName="KF-SteamStatsClient"
        FriendlyName="SteamStatsClient"
        Description="SteamStatsClient"
    }
    
    Код:
    class SteamStatsClientItem extends Actor;
    
    var KFSteamStatsAndAchievements MySteamStatsAndAchievements;
    var SteamStatsClientMut mut;
    var ClientPerkRepLink CPRL;
    var array<string> VarsList;
    var string OwnerHash;
    
    replication
    {
        reliable if (Role < Role_Authority)
            SendVarToServer,DestroyMe;
    }
    
    simulated function PostBeginPlay()
    {
        local PlayerController PC;
        if(Role==Role_Authority)
        {
            if(PlayerController(Owner)!=none)
                OwnerHash=PlayerController(Owner).GetPlayerIDHash();
        }
        else
        {
            PC=Level.GetLocalPlayerController();
            if(PC==none)
                return;
            MySteamStatsAndAchievements = Spawn(Class'KFSteamStatsAndAchievements', PC);
            MySteamStatsAndAchievements.GetStatsAndAchievements();
        }
    }
    
    function SendVarToServer(string VarName, int Value)
    {
        local Actor sssi;
        local string sssiOwnerHash;
        foreach DynamicActors(class'Actor',sssi)
        {
            if(sssi.IsA('SteamStatsServerItem'))
            {
                sssiOwnerHash=sssi.GetPropertyText("OwnerHash");
                if(Len(sssiOwnerHash)>0 && sssiOwnerHash~=OwnerHash)
                    sssi.SetPropertyText(VarName,string(Value));
            }
        }
    }
    
    function DestroyMe()
    {
        Destroy();
    }
    
    simulated function Tick(float dt)
    {
        local PlayerController PC;
        local SteamStatsAndAchievementsBase.SteamStatInt TmpStat;
        local int i;
    
        PC=Level.GetLocalPlayerController();
        if(PC==none)
            return;
        //Достаточно посредственная проверка того, что данные уже подгрузились. Особенно актуально для удалённой базы
        CPRL = Class'ClientPerkRepLink'.Static.FindStats(PC);
        if(CPRL==none)
            return;
    
        for(i=0;i<VarsList.Length;i++)
        {
            MySteamStatsAndAchievements.GetStatInt(TmpStat,VarsList[i]);
            SendVarToServer(VarsList[i],TmpStat.Value);
        }
        MySteamStatsAndAchievements.GetStatInt(TmpStat,"Stat46");
        SendVarToServer("EventToken",TmpStat.Value);
        SendVarToServer("DataTransfered",1);
        Disable('Tick');
        DestroyMe();
    }
    
    defaultproperties
    {
        VarsList=("DamageHealed","WeldingPoints","ShotgunDamage","HeadshotKills","StalkerKills","BullpupDamage","MeleeDamage","FlameThrowerDamage","ExplosivesDamage")
        RemoteRole=ROLE_SimulatedProxy
        bOnlyRelevantToOwner=true
    }
    

    Ссылка
    Добавлять оба
    SteamStatsServerMut.SteamStatsServerMut
    SteamStatsClientMut.SteamStatsClientMut


    Замечание 1:
    Пару дней будет тестовый сервак работать 185.97.254.214:8107
    Настройки мутатора false/false - кач только стима и без ограничений

    Замечание 2:
    В качестве проверки на пиратку используется переменная KFSteamStatsAndAchievements.Stat46 вроде как проверяющая ивент. В данный момент для стима она 2, для пиратки 0

    Замечание 3:
    Если у вас нестандартный ServerPerks 7.50 - перекомпилируйте мутаторы для своего SP

    Предыдущая версия:
    Чего-то пришло мне в голову сделать таки рабочую версию этого мутатора

    Настройки:
    bLimitInitValues - true/false
    Если true, то данные из стима ограничены 6 уровнем перка. То есть если у человека берс прокачен на 30 миллионов урона, то при его заходе на сервер ему пропишется 5.5м (значение кача требуемого для 6 уровня)
    Можно поменять ограничение в коде - не хочется выносить в ини

    Код:
    Код:
    class GetInitStatsFromSteamMut extends Mutator config(GetInitStatsFromSteamMut);
    
    var array<PlayerController> PendingPlayers;
    var config bool bLimitInitValues;
    
    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 int i;
        local GetInitStatsFromSteamItem sdi;
        for(i=PendingPlayers.Length-1;i>=0;i--)
        {
            if    (
                    PendingPlayers[i].PlayerReplicationInfo!=none
                    &&    PendingPlayers[i].PlayerReplicationInfo.PlayerID>0
                )
            {
                sdi=Spawn(Class'GetInitStatsFromSteamItem',PendingPlayers[i]);
                sdi.mut=self;
            }
        }
        PendingPlayers.Length = 0;
    }
    
    defaultproperties
    {
        bAddToServerPackages=True
        GroupName="KF-GetInitStatsFromSteam"
        FriendlyName="GetInitStatsFromSteamMut"
        Description="GetInitStatsFromSteamMut"
    }
    
    Код:
    class GetInitStatsFromSteamItem extends Actor;
    
    var KFSteamStatsAndAchievements MySteamStatsAndAchievements;
    var GetInitStatsFromSteamMut mut;
    var array<string> VarsList;
    var ClientPerkRepLink CPRL;
    var StatsObject MyStatsObject;
    
    replication
    {
        reliable if (Role < Role_Authority)
            SendVarToServer,DestroyMe;
    }
    
    simulated function PostBeginPlay()
    {
        local PlayerController PC;
        if(Role==ROLE_AUTHORITY)
        {
            PC=PlayerController(Owner);
            if(PC==none)
                return;
            MyStatsObject=ServerStStats(PC.SteamStatsAndAchievements).MyStatsObject;
            CPRL = Class'ClientPerkRepLink'.Static.FindStats(PC);
        }
        else
        {
            PC=Level.GetLocalPlayerController();
            if(PC==none)
                return;
            MySteamStatsAndAchievements = Spawn(Class'KFSteamStatsAndAchievements', PC);
            MySteamStatsAndAchievements.GetStatsAndAchievements();
        }
    }
    
    function SendVarToServer(string VarName, int Value)
    {
        local int tmpValue;
        local int perkLimit;
        perkLimit=GetInitPerkLimit(VarName);
    
        tmpValue=int(MyStatsObject.GetPropertyText(VarName$"Stat"));
        if(perkLimit>0 && mut.bLimitInitValues)
            MyStatsObject.SetPropertyText(VarName$"Stat",string(Min(perkLimit,Max(tmpValue,Value))));
        else
            MyStatsObject.SetPropertyText(VarName$"Stat",string(Max(tmpValue,Value)));
    
        tmpValue=int(CPRL.GetPropertyText("R"$VarName$"Stat"));
        if(perkLimit>0 && mut.bLimitInitValues)
            CPRL.SetPropertyText("R"$VarName$"Stat",string(Min(perkLimit,Max(tmpValue,Value))));
        else
            CPRL.SetPropertyText("R"$VarName$"Stat",string(Max(tmpValue,Value)));
    
        CPRL.StatObject.NotifyStatChanged();
    }
    
    function DestroyMe()
    {
        Destroy();
    }
    
    simulated function Tick(float dt)
    {
        local PlayerController PC;
        local SteamStatsAndAchievementsBase.SteamStatInt TmpStat;
        local int i;
    
        PC=Level.GetLocalPlayerController();
        if(PC==none)
            return;
        //Достаточно посредственная проверка того, что данные уже подгрузились. Особенно актуально для удалённой базы
        CPRL = Class'ClientPerkRepLink'.Static.FindStats(PC);
        if(CPRL==none)
            return;
        //
        for(i=0;i<VarsList.Length;i++)
        {
            MySteamStatsAndAchievements.GetStatInt(TmpStat,VarsList[i]);
            SendVarToServer(VarsList[i],TmpStat.Value);
        }
        Disable('Tick');
        DestroyMe();
    }
    
    function int GetInitPerkLimit(string VarName)
    {
        switch(VarName)
        {
            case "DamageHealed":
                return 100000;
            case "WeldingPoints":
                return 370000;
            case "ShotgunDamage":
                return 5500000;
            case "HeadshotKills":
                return 8500;
            case "StalkerKills":
                return 3600;
            case "BullpupDamage":
                return 5500000;
            case "MeleeDamage":
                return 5500000;
            case "FlameThrowerDamage":
                return 5500000;
            case "ExplosivesDamage":
                return 5500000;
        }
        return 0;
    }
    
    defaultproperties
    {
        VarsList=("DamageHealed","WeldingPoints","ShotgunDamage","HeadshotKills","StalkerKills","BullpupDamage","MeleeDamage","FlameThrowerDamage","ExplosivesDamage")
        RemoteRole=ROLE_SimulatedProxy
        bOnlyRelevantToOwner=true
    }
    

    Ссылка
    GetInitStatsFromSteamMut.GetInitStatsFromSteamMut

    Замечание 1:
    Пару дней будет тестовый сервак работать 185.97.254.214:8107

    Замечание 2:
    Не забывайте, что есть софт позволяющий править кач в стиме.
    Кроме того кач пираток из Stats.bin так же успешно прокатывает.

    Замечание 3:
    Этому мутатору необходимо, чтобы ServerPerksMut закачивался на клиент. Что в общем то неправильно. Но пока не придумал, как это обойти. Если у кого upkg файл с запретом от закачивания пакета на клиент - придётся его отредактировать или убрать

    Под спойлером то, что уже устарело и в общем то и не работало)
    Подробнее:
    То есть при старте игры сравнивается кач в стиме и кач на данном сервере (сервере с SP или аналогом) и в качестве текущего кача берутся лучшие значения для каждого параметра.
    При этом, так как стим прокачку можно сделать любой с использованием сторонних программ - есть ini файл в котором можно прописать максимальное возможное значение для каждого параметра.
    Например, в стиме медик прокачен до 100 000 000 (SAM никто не отменял)) ), а параметр LimitDamageHealed в ini установлен в 10 000 - соответственно медику будет установлено не 100 миллионов, а 10 тысяч
    Если же медик уже на сервере прокачен до 30 000, то 30 000 и останется.
    Параметры:
    LimitDamageHealed
    LimitWeldingPoints
    LimitShotgunDamage
    LimitHeadshotKills
    LimitStalkerKills
    LimitBullpupDamage
    LimitMeleeDamage
    LimitFlameThrowerDamage
    LimitExplosivesDamage
    Из названий всё понятно. Если параметр 0, то он не учитывается
    Код:
    Код:
    class SteamStatsMut extends Mutator config(SteamStatsMut);
    
    var array<PlayerController> PendingPlayers;
    var    const SteamStatsAndAchievementsBase.SteamStatInt TmpStat;
    
    var config int LimitDamageHealed;
    var config int LimitWeldingPoints;
    var config int LimitShotgunDamage;
    var config int LimitHeadshotKills;
    var config int LimitStalkerKills;
    var config int LimitBullpupDamage;
    var config int LimitMeleeDamage;
    var config int LimitFlameThrowerDamage;
    var config int LimitExplosivesDamage;
    
    function PostBeginPlay()
    {
        SaveConfig();
        if(KFGameType(Level.Game)==None) Destroyed();
        Super.PostBeginPlay();
    }
    
    function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
    {
        if( PlayerController(Other)!=None )
        {
            PendingPlayers[PendingPlayers.Length] = PlayerController(Other);
            SetTimer(1.0,false);
        }
        return true;
    }
    
    function Timer()
    {
        while( PendingPlayers.Length>0 )
        {
            if    (
                    PendingPlayers[0].PlayerReplicationInfo!=none
                    &&    PendingPlayers[0].PlayerReplicationInfo.PlayerID>0
                )
            {
                StatsRoutine(PendingPlayers[0]);
            }
            PendingPlayers.Remove(0,1);
        }
    }
    
    function StatsRoutine(PlayerController PC)
    {
        local int tmpValue;
        local ServerStStats SPStats;
    
        if    (
                PC.SteamStatsAndAchievements==none
                ||    ServerStStats(PC.SteamStatsAndAchievements)==none
            )
        {
            return;
        }
        SPStats=ServerStStats(PC.SteamStatsAndAchievements);
    
        PC.SteamStatsAndAchievements.GetStatInt(TmpStat, "DamageHealed");
        tmpValue=TmpStat.Value;
        if(LimitDamageHealed>0) tmpValue=Min(LimitDamageHealed,tmpValue);
        if    (
                SPStats.MyStatsObject.DamageHealedStat<tmpValue
                &&    SPStats.Rep.RDamageHealedStat<tmpValue
            )
        {
            SPStats.MyStatsObject.DamageHealedStat=tmpValue;
            SPStats.Rep.RDamageHealedStat=tmpValue;
        }
    
        PC.SteamStatsAndAchievements.GetStatInt(TmpStat, "WeldingPoints");
        tmpValue=TmpStat.Value;
        if(LimitWeldingPoints>0) tmpValue=Min(LimitWeldingPoints,tmpValue);
        if    (
                SPStats.MyStatsObject.WeldingPointsStat<tmpValue
                &&    SPStats.Rep.RWeldingPointsStat<tmpValue
            )
        {
            SPStats.MyStatsObject.WeldingPointsStat=tmpValue;
            SPStats.Rep.RWeldingPointsStat=tmpValue;
        }
    
        PC.SteamStatsAndAchievements.GetStatInt(TmpStat, "ShotgunDamage");
        tmpValue=TmpStat.Value;
        if(LimitShotgunDamage>0) tmpValue=Min(LimitShotgunDamage,tmpValue);
        if    (
                SPStats.MyStatsObject.ShotgunDamageStat<tmpValue
                &&    SPStats.Rep.RShotgunDamageStat<tmpValue
            )
        {
            SPStats.MyStatsObject.ShotgunDamageStat=tmpValue;
            SPStats.Rep.RShotgunDamageStat=tmpValue;
        }
    
        PC.SteamStatsAndAchievements.GetStatInt(TmpStat, "HeadshotKills");
        tmpValue=TmpStat.Value;
        if(LimitHeadshotKills>0) tmpValue=Min(LimitHeadshotKills,tmpValue);
        if    (
                SPStats.MyStatsObject.HeadshotKillsStat<tmpValue
                &&    SPStats.Rep.RHeadshotKillsStat<tmpValue
            )
        {
            SPStats.MyStatsObject.HeadshotKillsStat=tmpValue;
            SPStats.Rep.RHeadshotKillsStat=tmpValue;
        }
    
        PC.SteamStatsAndAchievements.GetStatInt(TmpStat, "StalkerKills");
        tmpValue=TmpStat.Value;
        if(LimitStalkerKills>0) tmpValue=Min(LimitStalkerKills,tmpValue);
        if    (
                SPStats.MyStatsObject.StalkerKillsStat<tmpValue
                &&    SPStats.Rep.RStalkerKillsStat<tmpValue
            )
        {
            SPStats.MyStatsObject.StalkerKillsStat=tmpValue;
            SPStats.Rep.RStalkerKillsStat=tmpValue;
        }
        PC.SteamStatsAndAchievements.GetStatInt(TmpStat, "BullpupDamage");
        tmpValue=TmpStat.Value;
        if(LimitBullpupDamage>0) tmpValue=Min(LimitBullpupDamage,tmpValue);
        if    (
                SPStats.MyStatsObject.BullpupDamageStat<tmpValue
                &&    SPStats.Rep.RBullpupDamageStat<tmpValue
            )
        {
            SPStats.MyStatsObject.BullpupDamageStat=tmpValue;
            SPStats.Rep.RBullpupDamageStat=tmpValue;
        }
    
        PC.SteamStatsAndAchievements.GetStatInt(TmpStat, "MeleeDamage");
        tmpValue=TmpStat.Value;
        if(LimitMeleeDamage>0) tmpValue=Min(LimitMeleeDamage,tmpValue);
        if    (
                SPStats.MyStatsObject.MeleeDamageStat<tmpValue
                &&    SPStats.Rep.RMeleeDamageStat<tmpValue
            )
        {
            SPStats.MyStatsObject.MeleeDamageStat=tmpValue;
            SPStats.Rep.RMeleeDamageStat=tmpValue;
        }
        PC.SteamStatsAndAchievements.GetStatInt(TmpStat, "FlameThrowerDamage");
        tmpValue=TmpStat.Value;
        if(LimitFlameThrowerDamage>0) tmpValue=Min(LimitFlameThrowerDamage,tmpValue);
        if    (
                SPStats.MyStatsObject.FlameThrowerDamageStat<tmpValue
                &&    SPStats.Rep.RFlameThrowerDamageStat<tmpValue
            )
        {
            SPStats.MyStatsObject.FlameThrowerDamageStat=tmpValue;
            SPStats.Rep.RFlameThrowerDamageStat=tmpValue;
        }
        PC.SteamStatsAndAchievements.GetStatInt(TmpStat, "ExplosivesDamage");
        tmpValue=TmpStat.Value;
        if(LimitExplosivesDamage>0) tmpValue=Min(LimitExplosivesDamage,tmpValue);
        if    (
                SPStats.MyStatsObject.ExplosivesDamageStat<tmpValue
                &&    SPStats.Rep.RExplosivesDamageStat<tmpValue
            )
        {
            SPStats.MyStatsObject.ExplosivesDamageStat=tmpValue;
            SPStats.Rep.RExplosivesDamageStat=tmpValue;
        }
        SPStats.DelayedStatCheck();
    }
    
    defaultproperties
    {
        bAddToServerPackages=True
        GroupName="KF-SteamStats"
        FriendlyName="SteamStats Mut"
        Description="SteamStats Mut"
    }
    
    Ссылка 1 или Ссылка 2
    SteamStatsMut.SteamStatsMut

    Замечание:
    Используйте на свой страх и риск. Вроде я всё потестил, но мало ли.
    Если будете использовать - в первое время почаще сохраняйте статистику.
    Ну и не забывайте, что в стиме нет никаких проблем, чтобы поставить любое значение прокачки.

    Замечание 2:
    Удалите или поправьте ServerPerksMut.upkg в ServerPerksMut
    Либо возможно поможет запуск мутатора как ServerActor'а - не знаю не пробовал.

    Замечание 3:
    Для старых и нестандартных SP есть смысл перекомпилировать мутатор, поставив EditPackages=SteamStatsMut после EditPackages=ServerPerksMut

    Замечание 4:
    В принципе, можно продумать систему проверки легальности прокачки. Ведь есть доступ ко всем ачивкам и дополнительным параметрам (взорванные сирены и т.д).
    Заведомо не может быть 6 уровень, если не выполнена, например, ачивка про 1000 убитых зомбиков, а время ZedTime'а равно 0.
    Если кто продумает - реализую

    Замечание 5:
    Можно совместить данный мутатор с этим мутатором. Чтобы уровни были как в стиме, но параметры прокачки были 0.
     
    Последнее редактирование: 6 мар 2018
    kill3r, VENOM:), key и 4 другим нравится это.
  2. ЛОХМАТЫЙ

    ЛОХМАТЫЙ •*´¨`*•.,¸¸,.•*´¨`*•.,¸¸,.•*´¨`*•

    Прокачка сравнивается 1 раз или каждый раз при входе ?
    А то, мало ли, я поиграл тут, потом честно прокачался в СТИМе, прихожу сюда - а тут я в *опе.
     
  3. Dr_Killjoy

    Dr_Killjoy Заблокированные

    Каждый раз при входе.
     
  4. Flame

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

    Ага
    Берётся каждый раз максимум из стима и прокачки на сервере. (Ну если не выставлены ограничения в ini)
     
  5. Dr_Killjoy

    Dr_Killjoy Заблокированные

    Мне почему-то казалось что эту штуку посложнее будет реализовать. Наверно просто не изучал вопрос)
     
  6. key

    key Солдат

    Удивительно добротная работа!

    Всё работает, и с первого раза... )

    Компилировал мут заново.
    Прописан не актором ServerPackages=SteamStatsMut
    и EditPackages=SteamStatsMut.
    Мутатор ServerPerksMut у меня был переименован ServerPerksMutz.
    ServerPerks 510, удалённая база навыков data.ini
     
  7. key

    key Солдат

    Тогда пробовал на одном компьютере сервер и клиент - работает, значит думал всё нормально.
    Но у пользователей на выделенном сервере стим-навыки не присваивались.
    Думаю сравнение навыков работает на локальном компе, где есть стим.
     
  8. Rainishе

    Rainishе Солдат

    да. работает только на компе где есть стим. запускал на сервере где нет стима и никакой реакции. зато на одном компе когда запускаеш со стимом то всё гуд. но это не имеет смысла ибо и так можно выставить самому себе любой уровень.
    если б он работал не зависимо от того есть стим или нет то было бы отлично.
     
  9. kok-s

    kok-s Консильери

    А логика? Тут мы как бы делаем владельцам стима приятное (накаченный в стиме опыт идёт на сервер), а кто без стима с ломаным 6 лвл - нах не нужен.

    Или тут не о том речь?
     
  10. Rainishе

    Rainishе Солдат

    не о том. когда запускаеш выделенку на серваке где только операционка и никакого стима даже близко нету то не будет статистика работать. вот я о чём. а ставить специально для меня стим никто не будет.
     
  11. kok-s

    kok-s Консильери

    А вот этот нюанс интересный.
     
  12. Rainishе

    Rainishе Солдат

    После долгих мучений и проверок было выяснено что всё же подгрузка перков происходит но только в том случае если на машине стоит стим и на етом стиме у акаунта куплен кф. в любых других случаях подгрузка перков не происходит.
     
  13. RaideN-

    RaideN- Игровая Администрация

    Мутатор еще рабочий? Ставил на выделенный сервер. Ноль реакции.
    Прописывал в мутлоадере, ServerPackages и EditPackages.
    Может я что то не правильно сделал?
     
  14. Rainishе

    Rainishе Солдат

    я выше написал что делать и как работает. но ставить нет смысла. ибо стата будет присваиваться того акаунта который запущен. причём всем не зависимо от того прокачан перк или нет.
     
  15. Flame

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

    Раскачался и сделал рабочую (вроде) версию. И 4х лет не прошло))
    Шапка темы обновлена
     
    Последнее редактирование: 6 фев 2018
  16. Flame

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

    О. Ровно месяц прошёл с прошлого обновления)
    Теперь это не 1 мутатор, а 2. Кроме того добавилась проверка на пиратки
    Подробности в шапке