Вопросы к кодерам и мододелам

Тема в разделе "Игровое редактирование", создана пользователем Фрэгл, 20 ноя 2011.

  1. demnikzak

    demnikzak Бандит

    Ребят в общем тема такова, мой друг хочет заняться кодингом в кф, он учится на программиста так что от части языки он знает а именно C, С#, C++, С++ в основном ) так что больше вопрос ко флейму
    Можешь посоветовать статейки и всё такое что бы более понять как пишется код для кф
    В идеале если
    1 С чего начать если в обще С++ знаешь
    2 С более глубоким смыслом кода
    Я глупы и не могу сформулировать нормально мысль, так что буду ждать ответа, надеюсь он будет
     
  2. Flame

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

    Не знаю статей кроме тех, что на этом форуме)

    В качестве справочных материалов можно использовать эти сайты
    https://wiki.beyondunreal.com/
    http://unrealscript.narod.ru/tutorials/tutorials.html
    Ещё там парочка была - не помню сходу

    1. Берётся любой простой мутатор и правится под себя
    2. Берётся SP и правится под себя
    По мне так это основное обучение - на практике

    Особое внимание уделить репликации (есть статьи на сайтах приведённых выше) и вообще взаимодействию клиента и сервера
    По этой теме статей достаточно
     
    demnikzak нравится это.
  3. demnikzak

    demnikzak Бандит

    Спасибки флейм, это то что мне нужно
     
  4. demnikzak

    demnikzak Бандит

    Так же есть вопросик один
    Я хз почему так происходит
    В общем я сделал новое требования для кача перка убийство мобов, всё сделал хорошо всё работает кроме одного нюанса
    Я прописал код вот так в ДамТайп пушки

    static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed )
    {
    if( Killed.IsA('ZombieGorefast') )
    ServerStStats(KFStatsAndAchievements).AddFasterKill();
    if( Killed.IsA('WTFZombiesGoreallyfast') )
    ServerStStats(KFStatsAndAchievements).AddFasterKill();
    }


    И теперь когда убиваешь простого гарика всё в порядке качает 1 моба
    Но вот когда убиваешь гарика с ВТФ мода почему та в стату записывает как два моба вместо одного
    Что я делаю не так ?
     
  5. STaJIKeR

    STaJIKeR Капо

    WTF моб наследует обычного моба, поэтому и происходит.
    То есть, он сначала считает WTF класс, потом уже стандартный.
     
  6. CFH

    CFH Новенький

    Всем привет! Есть необходимость перемещения цилиндра коллизий в зависимости от местоположения проигрываемой анимации, т.е. имеется нек-я анимация движения павна, не суть важно какая, главное, что начальная и конечная состояния анимации разнесены в пространстве на значительное расстояние. После окончания воспроизведения анимации меш павна возвращается в исходную точку, где он находился в момент начала воспроизведения анимации. Location игрока не меняется. Мб кто-нибудь сталкивался с подобным, как это можно исправить?
    Код:
    class MyHumanPawn extends KFHumanPawn;
    
    var name AnimsCustom[4];
    var bool bAnimPrev, bAnimTrigger;
    var float AnimTime;
    var vector BoneLocationDelta, BoneLocation;
    
    replication
    {
        reliable if( Role == ROLE_Authority )
            bAnimTrigger;
        reliable if( Role < ROLE_Authority )
            AnimTrigger;
    }
    
    simulated function Tick(float DeltaTime)
    {
        Super.Tick(DeltaTime);
    
        //if( Level.NetMode != NM_DedicatedServer )
        //{
            if( bAnimPrev != bAnimTrigger)
            {
                // Запускаем проигрывание нашей анимации
                if( bAnimTrigger )
                {
                    AnimTime = Level.TimeSeconds + GetAnimDuration(AnimsCustom[NewAnim]);
                    bWaitForAnim = true;
                    bPhysicsAnimUpdate = false;
                    bDoTorsoTwist = false;
                    AnimBlendParams(1, 0.0, 0.0);
                    PlayAnim(AnimAction, 1.0, 0.0, 0);
                    BoneLocation = GetBoneCoords(RootBone).Origin;
                }
                // Останавливаем проигрывание нашей анимации
                else
                {
                    bWaitForAnim = false;
                    bPhysicsAnimUpdate = true;
                    bDoTorsoTwist = true;
                    StopAnimating();
                    PlayAnim(IdleRestAnim, 1.0, 0.1, 0);
                }
    
                bAnimPrev = bAnimTrigger;
            }
    
            // Отслеживанием перемещение корневой кости
            if( bAnimTrigger )
            {
                BoneLocationDelta = GetBoneCoords(RootBone).Origin - BoneLocation;
                BoneLocation = GetBoneCoords(RootBone).Origin;
            }
        //}
    
        // Пытаемся двигать цилиндр синхронно проигрываемой в данный момент анимации
        if( Level.NetMode == NM_DedicatedServer && AnimTime > 0.0 && Level.TimeSeconds < AnimTime )
        {
            MoveSmooth(BoneLocationDelta);
            //SetLocation(Location + BoneLocationDelta);
        }
    
        // Сбрасываем значения после окончания проигрывания анимации
        if( Level.NetMode == NM_DedicatedServer && AnimTime > 0.0 && Level.TimeSeconds >= AnimTime )
        {
            AnimTime = 0.0;
            bAnimTrigger = false;      
          
            AnimAction = '';
        }
    }
    
    // Запуск клиентом анимации павна
    function AnimTrigger(byte NewAnim)
    {
        if( bAnimTrigger )
            return;
    
        AnimAction = AnimsCustom[NewAnim];
        bAnimTrigger = true;
    }
    
    // Аттачим набор анимаций к мешу игрока
    simulated function Setup(xUtil.PlayerRecord Rec, optional bool bLoadNow)
    {
        LinkSkelAnim(MeshAnimation'Custom_Anim');
        Super.Setup(Rec, bLoadNow);
    }
    
    // Сами анимации
    defaultproperties
    {
        AnimsCustom(0)=YOBA_1
        AnimsCustom(1)=YOBA_2
        AnimsCustom(2)=YOBA_3
        AnimsCustom(3)=YOBA_4
    }
     
    Последнее редактирование: 31 окт 2019
  7. still_theSameDude

    still_theSameDude Новенький

    Ребят привет, такой вопрос: при создании выделенного сервера в кф, я так понимаю хостом является комп через который все это дело осуществляется и разумеется одновременно поиграть на своем же серве со своего же компа не получится. Тогда в таком случае как вариант можно воспользоваться услугой по предоставлению выделенных серверов. Вот и здесь сам вопрос, как весь этот процесс протекает, то есть как запустить свой серв со своими настройками, мутаторами на отдаленном компе, что со всеми файлами сервера делать, перекидывать/не перекидывать их, я не понимаю, мои знания в этой сфере на уровне обычного юзера, не мамкиного кулхацкера и программиста. Если есть под рукой какие нибудь ссылки\статейки, то поделитесь, будет интересно почитать. Буду благодарен за ответ
     
    Mashina нравится это.
  8. RaideN-

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

    На своем компе собираешь сервер, тестируешь. Если всё ОК, то перекидываешь файлы на удаленный комп и запускаешь.
     
    still_theSameDude нравится это.
  9. still_theSameDude

    still_theSameDude Новенький

    Понял, теперь буду знать, спасибо
     
  10. Arthur88

    Arthur88 Соучастник

    Как же давно я тут не был. Приветствую, друзья, а также Essence и Flame персонально :) Обратиться вновь меня сподвиг трабл с некоторым методом вывода HUD-сообщений, реализация которого для меня оказалась сложнее, чем казалась на первый взгляд. Работаю с мутатором рулетки SlotMachine. При выпадении трёх одинаковых карт клиенту выводится сообщение о том, какая способность или приз ему выпали. Оригинальный метод вывода таких сообщений сделан через ReceiveLocalizedMessage, что оптимально, так как сообщения чисто client-side и сервер их не обрабатывает и не отправляет. Но эта функция не позволяет задать свой самодельный шрифт, а только стандартный. Было решено использовать метод Canvas и выводить сообщения через DrawText, так как этот метод позволяет задать свой шрифт через переменную
    Код:
    var font  Font
    Для понимания привожу класс одной из карт рулетки:
    Код:
    Class GravityCard extends SlotCard;
    
    var() config int  GravityDelta, GravityTime;
    
    static function float ExecuteCard( Pawn Target )
    {
        local Inventory I;
    
        if( Vehicle(Target)!=None )
        {
            Target = Vehicle(Target).Driver;
            if( Target==None )
                return 0;
        }
        I = Target.FindInventoryType(Class'InvGravity');
        if( I==None )
        {
            I = Target.Spawn(Class'InvGravity');
            if( I!=None )
            {
                I.GiveTo(Target);
                InvGravity(I).MySetTimer(default.GravityDelta, default.GravityTime);
            }
        }
        if( PlayerController(Target.Controller)!=None )
            PlayerController(Target.Controller).ReceiveLocalizedMessage(Class'GravityMessage');  // Нужно заменить вывод сообщения через DrawText, но это нельзя сделать из этого же класса, так как он extends SlotCard и не умеет работать с Canvas. Более того к DrawText нельзя обращаться из static функции
        return Default.GravityTime;
        //return 0;
    }
    
    static function FillPlayInfo(PlayInfo PlayInfo)
    {
        Super.FillPlayInfo(PlayInfo);
        PlayInfo.AddSetting(default.CardGroup,"GravityTime",Default.Class.Name$"-Time",1,0, "Text", "8;10:999");
        PlayInfo.AddSetting(default.CardGroup,"GravityDelta",Default.Class.Name$"-Time",1,0, "Text", "8;10:999");
    }
    
    static function string GetDescriptionText(string PropName)
    {
        switch (PropName)
        {
            case "GravityTime":    return "How long mode stays on.";
            case "GravityDelta":    return "Gravity amount.";
        }
        return Super.GetDescriptionText(PropName);
    }
    
    defaultproperties
    {
        CardMaterial=Texture'SlotMachine.Cards.Gravity'
        GravityTime=60
        GravityDelta=290
        Desireability=0.080000
    }
    
    В коде комментарием отметил "проблемный" блок. Если коряво описал суть и желаемое не стесняйтесь тыкать носом и пинайте ;-)
     
    Flame нравится это.
  11. Flame

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

    Вроде понял проблему. Готового ответа нет
    Встречу весну и чего-нть попробую с этим сделать)
     
    Arthur88 нравится это.
  12. Essence

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

    В GravityMessage.uc

    Код:
    var array<string> CustomFontsArrayNames;
    var array<Font> CustomFontsArray;
    
    static function RenderComplexMessage(
        Canvas Canvas,
        out float XL,
        out float YL,
        optional String MessageString,
        optional int Switch,
        optional PlayerReplicationInfo RelatedPRI_1,
        optional PlayerReplicationInfo RelatedPRI_2,
        optional Object OptionalObject
        )
    {
        Canvas.Font=LoadCustomFontStatic(0); // Числом задаем нужный шрифт
        // Далее всякие SetPos, SetDrawColor, DrawText и прочее...
    }
    
    static function Font LoadCustomFontStatic(int i)
    {
        if(Default.CustomFontsArray[i]==None)
        {
            Default.CustomFontsArray[i]=Font(DynamicLoadObject(Default.CustomFontsArrayNames[i], Class'Font'));
            if(Default.CustomFontsArray[i]==None)
                Log("Warning: "$Default.Class$" Couldn't dynamically load font "$Default.CustomFontsArrayNames[i]);
        }
        Return Default.CustomFontsArray[i];
    }
    
    defaultproperties
    {
         CustomFontsArrayNames(0)="ROFontsTwo.ROArial24DS"
         CustomFontsArrayNames(1)="ROFontsTwo.ROArial24DS"
         CustomFontsArrayNames(2)="ROFontsTwo.ROArial22DS"
         CustomFontsArrayNames(3)="ROFontsTwo.ROArial22DS"
         CustomFontsArrayNames(4)="ROFontsTwo.ROArial18DS"
         CustomFontsArrayNames(5)="ROFontsTwo.ROArial14DS"
         CustomFontsArrayNames(6)="ROFontsTwo.ROArial12DS"
         CustomFontsArrayNames(7)="ROFontsTwo.ROArial9DS"
         CustomFontsArrayNames(8)="ROFontsTwo.ROArial7DS"
    }
    
     
    Flame и Arthur88 нравится это.
  13. Arthur88

    Arthur88 Соучастник

    Принято, буду тревожить где-то после 8-го марта ;-)
     
  14. Arthur88

    Arthur88 Соучастник

    Получилось следующее: всё, что прописано в DrawText в функции static function RenderComplexMessage, не печатается вовсе. Тогда как оригинальный метод продолжает работать (ReceiveLocalizedMessage в классе GravityCard). Вообще не совсем понял нужно и можно ли избавиться от ReceiveLocalizedMessage. И как без него вызывать класс GravityMessage. Признаюсь - голова сейчас не очень варит. Должен буду изложить подробный код
     
  15. Essence

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

    Да, кидай код целиком
    Сюда или в личку
    Шоб я мог запустить и потестить
     
    Папка01 и Flame нравится это.
  16. magic

    magic Соучастник

    Нашел решение спама Accessed None 'LastDamagedBy' на форуме трипов
    Вот только теперь спамит уже другим
    CHOOSEATTACKSERIAL in state WaitingForLanding enemy magic old enemy NONE CALLING BYTE 5 (50)
    CHOOSEATTACKSERIAL in state WaitForAnim enemy magic old enemy NONE CALLING BYTE 5
    CHOOSEATTACKSERIAL in state TacticalMove enemy magic old enemy NONE CALLING BYTE 5
    Есть ли решение от этого спама?
     
    Последнее редактирование: 5 май 2020
    Папка01 нравится это.
  17. Папка01

    Папка01 ۞ Всевидящее око форума ۞

    Можно ли как-то не устанавливая СП убрать огнемет с сервера вообще? Желательно заменив его на хаскган. Но так, чтобы стимовские перки которые id оригинальные работали и отбражались в игре. Заходит челик играть, у него 2 снайпер, 3 тех и что там еще. И все это работает и качается, а огнемета нет. Ни при спавне у 6лвла ни в магазине.
    Можно ли у коммандоса отключить полоски хп для перков, но оставить их только для sc и fp? Чтобы наслаждаясь стрельбой из томмигана или м4 в клубах дыма и созерцая отсеченные конечности не было этих нелепых полосок кроме как у жирных мобов? Опять же так, чтобы стимовские перки и навыки работали и качались, без СП?
     
  18. Essence

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

    Никак нельзя
    Даже если не использовать СП
    Тот же магазин нужно править на сервере и передавать инфу клиенту
    А это уже обрубит стим кач
     
    Папка01 и Arckon. нравится это.
  19. WipeMaster

    WipeMaster Бандит

    Item Remover + Starting Weapon Replacer.
     
    Папка01 нравится это.
  20. Essence

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

    Items Remover скорее всего не прокатит. В отличие от своего предшественника - No Big Guns, этот мутатор не находится в белом списке.
    Да и массив ItemForSale обновляется при открытии магазина, поэтому
    Код:
    ItemForSale[i] = None;
    В мутаторе не имеет смысла, ибо элемент массива обнуляется единожды.
     
    Папка01 нравится это.