Toy Master

Тема в разделе "Killing Floor", создана пользователем Arckon., 27 янв 2017.

Метки:
  1. Arckon.

    Arckon. Соучастник

    Собственно, вопрос состоит в том, можно ли поставить KF Toy Master на выделенный сервер в качестве отдельного режима? Насколько понял, требуется клиентская версия этого чуда. В противном случае ничего положительного не будет, не говоря уже про изменение префикса на KFO-, который привязывается к карте для данного режима по умолчанию.

    Пролистав Мастерскую по данной тематике, наткнулся на мутатор ToyMaster Replacer, который заменяет обычных зедов на куклы. В свою очередь, мутатор отталкивается от клиентской установки, впрочем, о чем и предупреждает автор заранее: "YOU MUST HAVE TOY MASTER INSTALLED FOR THIS TO WORK". Разумеется, нашлись те, кто решил выложить Toy Master отдельным пакетом файлов для дальнейшей установки, не прибегая к скачке из Мастерской.

    Каким образом можно получить возможность скачивать необходимые файлы с сервера для этого режима без клиентской установки? На Форуме TWI по данному вопросу найдено крайне мало. Может, кто-то имел дело с подобным.
     
  2. RaideN-

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

    А в чем была проблема то собственно скачать отдельно файлы Той мастера, перепаковать в отдельный пакет и прописать его на сервере?

    Вот файлы https://yadi.sk/d/BGtsQ5qp3BChEZ

    Вот исходники https://yadi.sk/d/lJv0Ndkn3BCp55

    Делов на 5 минут
     
    Последнее редактирование: 27 янв 2017
  3. Arckon.

    Arckon. Соучастник

    Cам режим, как таковой Toy Master работает и соответствующая для него карта TOY-DevilsDollhouse.
    Мутатор, который позволяет заменять зедов на кукол - работает для карт с префиксом KF-MapName, например:
    [​IMG]

    Проблема в том, что не получается завести данный режим на чистом Выделенном Сервере:
    - запуск карт с префиксом KF-MapName: появляются обычные зеды;
    - запуск карт с префиксом Toy-MapName, типа: TOY-DevilsDollhouse; TOY-DevilsDollhouse-FixV1; TOY-DevilsDollhouse-FixV3: мутатор не видит Toy-префикс.

    Собственно, могут быть еще подводные камни. Раньше имелись выделенные Серверы с данным режимом. Может, знатоки могут подсобить как-нибудь.
     
  4. Flame

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

    Ну пропиши в KillingFloor.ini
    Код:
    [KFCharPuppets.TOYMapList]
    MapNum=0
    Maps=TOY-DevilsDollhouse
    
    В KFCharPuppets.TOYMapList прописана несуществующая карта
    Код:
    Maps(0)="TOY-Playhouse"
    
    вот и не цепляется она автоматически

    А вообще весь мой опыт с этим режимом - где-то последний час. Скачал мод, поглядел какие файлы новые в клиенте кф - получились эти вот файлы
    Добавил эти файлы на чистый сервак и поиграл в мод, потом добавил SP и KFMapVoteV2 и поиграл ещё разок с выбором любого из 3х режимов

    Вот ссылка на чистый сервер, если запускать __01.bat, то идёт Toy режим, если __02.bat, то начинается обычная кф1 игра и можно выбрать карты из 3х режимов
    Скрин:
    [​IMG]
    (ссылка долго не проживёт)
     
    Последнее редактирование: 28 янв 2017
  5. Arckon.

    Arckon. Соучастник

    Огромное спасибо. Ситуация прояснилась. Режим Toy Master будет работать. Я хотел бы еще подробнее узнать, будет ли работать режим Toy Master с мутатором ToyMaster Replacer (ссылка есть выше) на картах с префиксом KF-MapName?
     
  6. Flame

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

    Ну по твоей ссылке он уже недоступен (или я не ту ссылку проверял)
    Скачал отсюда
    Впрочем эт не важно
    Ну да, корявенький мутатор замены стандартных мобов на куклы, ты что хочешь то? )
    Режим ToyMaster это геймтайп унаследованный от Objective, естественно на обычных картах не будет сундуков и прочего, не будет "убей джека и войди в комнату". Будет обычная игра с заменёнными монстрами
     
  7. Arckon.

    Arckon. Соучастник

    Да, все верно. Нужно чтобы было простое изменение зедов на куклы.
     
    Последнее редактирование модератором: 28 янв 2017
  8. Flame

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

    Тут 3xzet верно напомнил.
    Там 3 файла кармы есть (тушки кукол после смерти) в моде.
    Без мутатора MusicLoader, который позволяет закачивать карму на клиенты фиг знает насколько хорошо твои игроки будут жить)
    Мне сейчас лень проверять - сам попробуй подсоединиться к серваку с куклами на чистом клиенте (без установленного мода)
    Кроме того убедись, что все файлы ресурсов закачиваются в кэш, если какой-то не закачивается добавь его закачку в любом мутаторе или ещё где:
    Код:
    AddToPackageMap("НазваниеПакета");
    
    Upd. Без файлов кармы такая фигня после убийств. Застывают на время необходимое для пропажи трупов
    [​IMG]
    Ну в принципе можно вызывать Destroy после убийства и будут просто пропадать.
     
    Последнее редактирование: 28 янв 2017
  9. Arckon.

    Arckon. Соучастник

    Так, хорошо. Все замечания понял. Нужно протестировать будет.
     
    Последнее редактирование модератором: 28 янв 2017
    Essence нравится это.
  10. Flame

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

    Ещё бы ты спойлерами научился пользоваться раз уж цитируешь - цены бы тебе не было
     
  11. Arckon.

    Arckon. Соучастник

    Думали будут проблемы с застыванием зедов. "Destroy" не пригодился, собственно.
    Все работает. Флейм, благодарю за помощь. Посмотрим, как будет танцевать режим совместно с другими режимами и еще дополнительно просмотрю, какие недочеты имеются. В случае чего, попытаюсь изъясниться здесь.

    28.01.17
    UPD: Проблем с застыванием нет у тех, кто ставил себе клиент версию.
     
    Последнее редактирование: 29 янв 2017
  12. Arckon.

    Arckon. Соучастник

    У игроков, у которых не был установлен Toy Master, куклы при убийстве застывали в воздухе.
    По словам игроков после скачки файлов с сервера происходил вылет игры с выводом ошибки. Вылет следующих планов:
    - вылет при непосредственном старте игры (вне лобби)
    - вылет при большом количестве кукол (не факт, что из-за этого)

    Сама ошибка: см.


    Предположительно дело в скачке ресурсов сервера (вместе с теми, что должны докачаться - они докачиваются). Возможно, дело во внутренних файлах сервера, пока сказать не ручаюсь. С другой же стороны мутатор Toy Replacer может иметь корень проблемы.
    Флейм, может, есть какой-то метод лечения или хотя бы обнаружения причины?
     
    Последнее редактирование: 30 янв 2017
  13. Flame

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

    Ну естественно куклы застывают у тех у кого нет мода, ибо у них и нет файлов кармы
    Либо Destroy (при этом надо ещё убедиться, что админы не пользуются командой killzeds, либо поправить команду), либо принудительная закачка кармы с помощью мутатора упомянутого выше

    А вылеты небось после убийства куклы одним из игроков
    Попробуйте не убивать - скажите есть вылеты или нет
     
  14. RaideN-

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

    Как вариант можно сделать подгрузку кармы так же, как это реализовано у моба FemaleFP:
    в класс моба добавляем функцию:

    Код:
    simulated function PlayDyingAnimation(class<DamageType>DamageType,vector HitLoc)
    {
        if(Level.NetMode!=NM_DedicatedServer && Class'FFPKarma'.Static.UseRagdoll(Level) ) {
            // karma death
            super.PlayDyingAnimation(DamageType, HitLoc);
        }
        else {
            if(MyExtCollision!=None)
                MyExtCollision.Destroy();   
    
            // non-ragdoll death fallback
            Velocity+=GetTearOffMomemtum();
            BaseEyeHeight=Default.BaseEyeHeight;
            SetTwistLook(0,0);
            SetInvisibility(0.0);
            PlayDirectionalDeath(HitLoc);
            SetPhysics(PHYS_Falling);           
        }
    }
    

    А в дефаулте прописать следущее:

    KFRagdollName="FFPKarma" /// это название класса для кармы.


    А вот и сам класс:

    Код:
    /*
        This object is used to load bRagdolls config variable
        Clients, who have no config (and probabaly have no karma data),
        will have karma ragdoll death animations turned off.
       
        @author PooSH
        @author Marco
    */
    
    Class FFPKarma extends Object
        Config(FemaleFPMut)
        PerObjectConfig;
    
    ///#exec load obj file=../KarmaData/FFPKarma.ka
       
    var config bool bRagdolls;
    var config bool bAutoDetect;
    
    var private bool bHasInit,bRagdoll;
    
    static final function InitConfig(LevelInfo Level)
    {
        local FFPKarma D;
    
        Default.bHasInit = true;
    
        if ( Level.NetMode == NM_DedicatedServer ) {
            Default.bRagdoll = false;
        }
        else if ( Level.PlatformIsWindows() ) {
            // DIR command doesn't work on Linux. Not sure about MacOS
            Default.bRagdoll = Level.GetLocalPlayerController().ConsoleCommand("DIR ../KarmaData/FFPKarma.ka") ~= "FFPKarma.ka";
        }
        else {
            // read from config. create config file, if it doesn't exist
            D = New(None,"FemaleFPKarma") Class'FFPKarma';
            Default.bRagdoll = D.bRagdolls;
            if ( Level.PlatformIsWindows() ) {
                if ( Level.GetLocalPlayerController().ConsoleCommand("DIR ../KarmaData/FFPKarma.ka") ~= "FFPKarma.ka" ) {
                    // karma file exists
                    if ( default.bAutoDetect )
                        Default.bRagdolls = true; // enable it in config for the next use, but don't enable it now. For cases, when karma file is obtained via MusicLoader
                }
                else {
                    // karma file doesn't exist - disable ragdoll animations
                    Default.bRagdolls = false;
                    Default.bRagdoll = false;
                }
            }
            D.SaveConfig();
        }
    }
    static final function bool UseRagdoll(LevelInfo Level)
    {
        if( !Default.bHasInit )
            InitConfig(Level);
        return Default.bRagdoll;
    }
    
    defaultproperties
    {
        bAutoDetect=True
    }
    

    Вот оба класса для наглядности https://yadi.sk/d/StPUo8qP3Bna9j
     
    Flame нравится это.
  15. Arckon.

    Arckon. Соучастник

    Большое спасибо за отзывчивость, Флейм, Raiden.
    Как будут результаты, поспешу поделиться с выводами.
     
  16. Essence

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

    Пинал меня в августе товарищ Arthur88 по этой теме
    Он вроде как собирался тестить (ибо я тестил по минимуму), но куда-т пропал
    Поэтому чтоб не пылились файлы без дела выкладываю сюда
    Вдруг кому-т ещё через 2 года понадобится)

    Переписал класс-утилиту от Пуша. На клиенте создаётся конфиг, туда заносится полное название файла кармы и флаг - использовать её или нет. При наличии кармы на клиенте bUseRagdoll=True, иначе False.
    Если клиент удалит файл кармы или наоборот добавит, конфиг будет проверен, и значение bUseRagdoll для данной кармы изменится.
    Для unix-подобных OC и MacOS используется команда "LS" - это аналог команды "DIR" для Windows.

    Класс-утилита:
    Код:
    /*
        This object is used to determine if a client has karma data.
        Clients, who have no karma data, will have karma ragdoll death animations turned off.
      
        @author PooSH
        @author Marco
        @rewritten by Essence
    */
    Class KarmaUtility extends Object Config(KarmaConfig);
    
    struct RagdollData
    {
        var config string RagdollName;
        var config bool bUseRagdoll;
    };
    
    var config array<RagdollData> RagdollList;
    var const string RagdollPath, FileFormat;
    var config string PlatformCommand;
    var bool bConfigIsChecked;
    
    static simulated function string GetPlatformCommand(LevelInfo Level)
    {
        if(Default.PlatformCommand=="")
        {
            if(Level.PlatformIsWindows()) Default.PlatformCommand="DIR"; // Windows
            else Default.PlatformCommand="LS"; // Linux or MacOS
        }
        Return Default.PlatformCommand;
    }
    
    static simulated function InitConfig(LevelInfo Level, string KarmaName)
    {
        local int n;
        n=Default.RagdollList.Length;
        Default.RagdollList.Insert(n,1);
        Default.RagdollList[n].RagdollName=KarmaName;
        if(Level.GetLocalPlayerController().ConsoleCommand(GetPlatformCommand(Level)@Default.RagdollPath$KarmaName)==KarmaName)
        {
            Default.RagdollList[n].bUseRagdoll=True;
        }
        else
        {
            Default.RagdollList[n].bUseRagdoll=False;
        }
        StaticSaveConfig();
    }
    
    static simulated function bool UseRagdoll(LevelInfo Level, string KFRagdollName)
    {
        local string FullRagdollName;
        FullRagdollName=KFRagdollName$Default.FileFormat;
        if(!Default.bConfigIsChecked) CheckConfig(Level);
        if(!InRagdollList(FullRagdollName)) InitConfig(Level, FullRagdollName);
        Return GetResult(FullRagdollName);
    }
    
    static simulated function bool GetResult(string KarmaName)
    {
        local int i;
        for(i=0; i<Default.RagdollList.Length; i++)
        {
            if(Default.RagdollList[i].RagdollName==KarmaName)
            {
                Return Default.RagdollList[i].bUseRagdoll;
            }
        }
    }
    
    static simulated function bool InRagdollList(string KarmaName)
    {
        local int i;
        for(i=0; i<Default.RagdollList.Length; i++)
        {
            if(Default.RagdollList[i].RagdollName==KarmaName)
            {
                Return True;
            }
        }
        Return False;
    }
    
    static simulated function CheckConfig(LevelInfo Level)
    {
        local int i;
        for(i=0; i<Default.RagdollList.Length; i++)
        {
            if(Level.GetLocalPlayerController().ConsoleCommand(GetPlatformCommand(Level)@Default.RagdollPath$Default.RagdollList[i].RagdollName)==Default.RagdollList[i].RagdollName && !Default.RagdollList[i].bUseRagdoll)
            {
                Default.RagdollList[i].bUseRagdoll=True;
            }
            else if(Level.GetLocalPlayerController().ConsoleCommand(GetPlatformCommand(Level)@Default.RagdollPath$Default.RagdollList[i].RagdollName)!=Default.RagdollList[i].RagdollName && Default.RagdollList[i].bUseRagdoll)
            {
                Default.RagdollList[i].bUseRagdoll=False;
            }
        }
        Default.bConfigIsChecked=True;
        StaticSaveConfig();
    }
    
    defaultproperties
    {
        RagdollPath="../KarmaData/"
        FileFormat=".ka"
    }

    В основной класс моба требуется добавить следующее:
    Код:
    // WARNING! Trying to use karma without karma file causes game crash!
    // -- PooSH
    // -- Fixed by Essence
    simulated function PlayDyingAnimation(class<DamageType>DamageType,vector HitLoc)
    {
        if(Level.NetMode!=NM_DedicatedServer && Class'KarmaUtility'.Static.UseRagdoll(Level, KFRagdollName))
        {
            // karma death
            super.PlayDyingAnimation(DamageType, HitLoc);
        }
        else
        {
            if(MyExtCollision!=None)
                MyExtCollision.Destroy();  
    
            // non-ragdoll death fallback
            Velocity+=GetTearOffMomemtum();
            BaseEyeHeight=Default.BaseEyeHeight;
            SetTwistLook(0,0);
            SetInvisibility(0.0);
            PlayDirectionalDeath(HitLoc);
            SetPhysics(PHYS_Falling);          
        }
    }
    
    simulated function PlayDirectionalDeath(Vector HitLoc)
    {
        if( Level.NetMode==NM_DedicatedServer )
        {
            SetCollision(false, false, false);
            return;
        }
      
        // lame hack, but it is better than leaving her staying for those, who have no karma data
        // -- PooSH
        SetCollision(false, false, false);
        bHidden = true;
    }

    Поправленные исходники с утилитой: Link

    Порядок компилирования:
    Код:
    EditPackages=...
    EditPackages=FrightScript
    EditPackages=KFEffectsPuppets
    EditPackages=KFCharPuppets
    EditPackages=cdToyMut