Создание мутаторов (не ServerPerks).

Тема в разделе "Кодинг", создана пользователем GEX, 12 июл 2020.

  1. GEX

    GEX Соучастник

    Здрасьте всем, хотел поинтересоваться по поводу мутаторов.
    Пишу мутаторы, чтобы улучшить какие-либо стороны пушек.
    Но с оружием всё ясно, как например, захотел увеличить урон АК, то:

    Код:
    {
    class'KFMod.AK47Fire'.default.DamageMin=72;
    class'KFMod.AK47Fire'.default.DamageMax=72;
    }
    То что делать, если я хочу изменить классовые бонусы перков? Вот есть Комм, у него +50% урона, а хочу +60%. Вот кусок кода из файла KFVetCommando.uc:

    Код:
    static function int AddDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn Instigator, int InDamage, class<DamageType> DmgType)
    {
        if ( DmgType == class'DamTypeBullpup' || DmgType == class'DamTypeAK47AssaultRifle' ||
            DmgType == class'DamTypeSCARMK17AssaultRifle' || DmgType == class'DamTypeM4AssaultRifle'
            || DmgType == class'DamTypeFNFALAssaultRifle' || DmgType == class'DamTypeMKb42AssaultRifle'
            || DmgType == class'DamTypeThompson' || DmgType == class'DamTypeThompsonDrum'
            || DmgType == class'DamTypeSPThompson' )
        {
            if ( KFPRI.ClientVeteranSkillLevel == 0 )
            {
                return float(InDamage) * 1.05;
            }
    
            return float(InDamage) * (1.00 + (0.10 * float(Min(KFPRI.ClientVeteranSkillLevel, 5)))); // Up to 50% increase in Damage with Bullpup
        }
    
        return InDamage;
    }
    Как это изменить это в мутаторе, что именно вписать?
     
    Последнее редактирование модератором: 12 июл 2020
  2. RaideN-

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

    Ты можешь сделать своего командоса, унаследовав от оригинала и прописать свои значения. Но..... не факт, что прокачка стим будет работать.

    Так что лучше увеличивай дамаг пушек кома на 10%

    ps: функция "DamageMin" уже не используется и не учитывается в кф.
     
  3. GEX

    GEX Соучастник

    Так как мне это организовать? Как сделать наследование?
    Прокачка меня не волнует от слова совсем, перки уже давныыым-давно вкачаны до упора.
     
  4. Essence

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

    Мы вроде уже обсуждали этот вопрос здесь
     
  5. GEX

    GEX Соучастник

    Я кажется в названии кое-что обозначил. Мне не нужен ServerPerks, и он меня банально не устраивает.

    И да, там конкретно на это нет ответа.
     
  6. Essence

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

    Тогда MinSP
    Через костыли добьётесь желаемого
     
  7. GEX

    GEX Соучастник

    Не подскажете в двух словах, что это такое, мб ссылка на тему?
     
  8. Flame

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

    Если речь идёт о сервере со стим прокачкой, то никак
    Ибо изменять данные придётся и на клиенте тоже, а значит мутатор не будет белым
    Но, если забить на то, что на клиенте в информации о перках будет написана неверная информация, а цены в магазине будут отображаться неверно и о прочем таком, то в принципе можно сделать чисто серверный мутатор, который поменяет эти классы. Интересная задачка - гляну, если не забуду

    А так надо делать свой чисто серверный мутатор, который каким-то альтернативным способом меняет те или иные характеристики перков.
    В основном он будет использовать GameRules, я думаю

    То есть в случае урона коммандоса - в функции NetDamage в GameRules будет стоять проверка на перк и тип урона и входящий параметр будет увеличиваться в нужное число раз.
    В принципе могу накидать пример для комма
     
    Папка01 нравится это.
  9. GEX

    GEX Соучастник

    Ну как, вообще в идеале это должен бы быть стим сервер, но с отключённой прокачкой, ибо всё есть.

    Как я понял, просто так нельзя написать мутатор, который сменит те или иные его ттх?
    Очень будет жаль, если так и есть. Раньше я спасал себя тем, что переделывал KFMod. Да-да-да, я знаю, как к такому здесь относятся, но это же локалка, да и просто очень.

    А щас загорелся идеей воплотить это мутатором.

    Так, накидаете пример, чтобы я хотя бы как-то мог понять, в каком направлении мне двигаться?

    И кстати, а почему какая-либо инфа будет неверной?
     
  10. STaJIKeR

    STaJIKeR Капо

    И в итоге мы получим очень лагучий сервер, который при большом кол-ве людей будет лагать на волнах из-за проверки того или иного урона.... Особенно в GM и постоянно кусая NetDamage... Где-то я видел такое уже... И результат - при 15+ игроках пинг выше 200
     
    Папка01 нравится это.
  11. GEX

    GEX Соучастник

    Накидаете, для примера?
     
  12. GEX

    GEX Соучастник

    Да боже упаси - на кой чёрт столько игроков?
     
  13. Essence

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

    В горах Краснодарского края
    Из-за пары проверок в NetDamage сервер не загнётся
    А при 15+ игроков и чистый сервер может лагать
     
  14. Essence

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

    Потому что изменения происходят на стороне сервера
    А то, что отображается у клиента, берётся из локальных экземпляров классов
    Чтобы на клиенте верно отображалась информация, код должен выполняться и на клиенте
    А также файл должен закачиваться в кэш игрока
    Что, собственно, как раз-таки и ломает стим кач
     
  15. Essence

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

    Вот пример:

    Код:
    class CommFixMut extends Mutator;
    
    function PostBeginPlay()
    {
        local CommFixRules RulesMod;
        if(RulesMod==None) RulesMod=Spawn(Class'CommFixRules');
    }
    
    defaultproperties
    {
        GroupName="KF-CommFix"
        FriendlyName="CommFixMut"
        Description="Add damage bonus for 6 lvl Commando"
    }
    Код:
    class CommFixRules extends 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 int NetDamage(int OriginalDamage, int Damage, Pawn Injured, Pawn InstigatedBy, vector HitLocation, out vector Momentum, class<DamageType> DamageType)
    {
        local KFPlayerReplicationInfo KFPRI;
        if(Injured==None || InstigatedBy==None)
        {
            if(NextGameRules!=None)
                return NextGameRules.NetDamage(OriginalDamage, Damage, Injured, InstigatedBy, HitLocation, Momentum, DamageType);
            return Damage;
        }
        if    (
                Injured.IsA('KFMonster')                        &&
                InstigatedBy.IsA('KFHumanPawn')                    &&
                InstigatedBy.Controller.IsA('PlayerController')    &&
                Damage>0
            )
        {
            KFPRI=KFPlayerReplicationInfo(InstigatedBy.PlayerReplicationInfo);
            if(KFPRI==None)
            {
                if(NextGameRules!=None)
                    return NextGameRules.NetDamage(OriginalDamage, Damage, Injured, InstigatedBy, HitLocation, Momentum, DamageType);
                return Damage;
            }
            if
                (
                    KFPRI.ClientVeteranSkill==Class'KFVetCommando'            &&
                    KFPRI.ClientVeteranSkillLevel==6                        &&
                    (
                        DamageType.Name=='DamTypeBullpup'                    ||
                        DamageType.Name=='DamTypeAK47AssaultRifle'            ||
                        DamageType.Name=='DamTypeFNFALAssaultRifle'            ||
                        DamageType.Name=='DamTypeSCARMK17AssaultRifle'        ||
                        DamageType.Name=='DamTypeM4AssaultRifle'            ||
                        DamageType.Name=='DamTypeThompson'                    ||
                        DamageType.Name=='DamTypeMKb42AssaultRifle'            ||
                        DamageType.Name=='DamTypeThompsonDrum'                ||
                        DamageType.Name=='DamTypeSPThompson'
                    )
                )
            {
                Damage*=1.067;
            }
        }
        if(NextGameRules!=None)
            return NextGameRules.NetDamage(OriginalDamage, Damage, Injured, InstigatedBy, HitLocation, Momentum, DamageType );
        return Damage;
    }    

    Ссылка
     
  16. GEX

    GEX Соучастник

    Спасибо большое, на досуге проверю и отпишусь. (кстати, почему 1.067, а не просто 1.06?)

    Мда, это малость отличается от того, что было в изменении урона у пушки.
     
  17. Essence

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

    Тут простая математика
    Если Коммандос по дефолту наносит 100 ед. урона
    То с учётом бонуса в KFVetCommando, он будет наносить уже 150 ед.
    Нам нужно, чтобы на 6 уровне он наносил 160 ед.
    В NetDamage бонус к урону уже учтён
    Поэтому нам необходимо всего лишь домножить 150 на нужный коэфф
    Если умножить на 1.06, то получится 159
    Если же на 1.067, то получится 160.05
    Так как тип переменной Damage у нас int, движок обрежет это число до 160.
     
  18. GEX

    GEX Соучастник

    Аааа, я допёр, хорошо.

    Проверил мутатор, всё хорошо работает. Единственное, вроде как идёт округление в меньшую сторону. Ну например, SCAR, дамаг без перка - 65, если с твоим мутатором - 103, хотя должно быть 104. Если именно вывести 60% из 65. Ну в конце-концов это очень сильно тянет на придирку и если что, я это подправлю.

    А так - спасибо большое, для меня это будет отправной точкой.
     
  19. Essence

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

    65 * 1.5 = 97.5
    Движок режет число без округления, поэтому на выходе мы будем иметь Damage = 97
    Далее 97 * 1.067 = 103.499, это число опять же обрезается и Damage = 103
    Можно было б использовать функцию Round, но 97.5 уже не округлишь в NetDamage, а округление 103.499 с помощью этой функции всё равно вернёт 103.
     
  20. GEX

    GEX Соучастник

    Понял-принял.