Задержка перед появлением мобов и их количество

Тема в разделе "Кодинг", создана пользователем sindzi, 25 май 2016.

  1. sindzi

    sindzi Соучастник

    Копался в мутаторе Monsterconfig, пытаясь найти где снимаются ограничения на MaxZombiesOnce а также устанавливается параметр SquadDelay, но поиск оказался безуспешным((

    Реально ли сделать какой-нибудь простой мутатор или вшить что-то в serverperks, чтобы поменять параметр MaxZombiesOnce и задержку перед появлением сквадов, не меняя настройки песочницы?

    благодарю за помощь!
     
  2. Flame

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

    Дак эт, сделать свой геймтайп в SP и поправить там SetupWave
    Как то так)
    Потом набросаю статью, если не забуду
    Эт по поводу MaxZombiesOnce

    А про задержку надо глядеть - сходу не помню
     
  3. sindzi

    sindzi Соучастник

    нашел в своем "нестандартном" serverperks класс SRGameType, вижу внутри SetupWave() это оно?
    подскажите как быть дальше? :blush:
    Код:
    class SRGameType extends KFGameType config;
    
    function PostLogin( PlayerController NewPlayer )
    {
    	local SRPlayerReplicationInfo KFPRI;
    
    	super.PostLogin( NewPlayer );
    	//SuperPostLogin(NewPlayer);
    
    	if ( Level.NetMode != NM_Client )
    	{
    		KFPRI = SRPlayerReplicationInfo(KFPlayerController(NewPlayer).PlayerReplicationInfo);
    		KFPRI.MaxPlayers = MaxPlayers;
    		//if(bWaveInProgress)
    		//	NewPlayer.GotoState('PlayerWaiting');
    	}
    }
    
    event InitGame( string Options, out string Error )
    {
    	local int mplayers;
    	
    	mplayers = default.MaxPlayers;
    
    	super.InitGame(Options, Error);
    	
    	default.MaxPlayers = mplayers;
        MaxPlayers = mplayers;
    }
    
    simulated function SetupWave()
    {
    	local int i,j;
    	local float NewMaxMonsters;
    	//local int m;
    	local float DifficultyMod, NumPlayersMod;
    	local int UsedNumPlayers;
    
    	if ( WaveNum > 15 )
    	{
    		SetupRandomWave();
    		return;
    	}
    
    	TraderProblemLevel = 0;
    	rewardFlag=false;
    	ZombiesKilled=0;
    	WaveMonsters = 0;
    	WaveNumClasses = 0;
    	NewMaxMonsters = Waves[WaveNum].WaveMaxMonsters;
    
        // scale number of zombies by difficulty
        if ( GameDifficulty >= 7.0 ) // Suicidal
        {
        	DifficultyMod=1.7;
        }
        else if ( GameDifficulty >= 4.0 ) // Hard
        {
        	DifficultyMod=1.3;
        }
        else if ( GameDifficulty >= 2.0 ) // Normal
        {
        	DifficultyMod=1.0;
        }
        else //if ( GameDifficulty == 1.0 ) // Beginner
        {
        	DifficultyMod=0.7;
        }
    
        UsedNumPlayers = NumPlayers + NumBots;
    
        // Scale the number of zombies by the number of players. Don't want to
        // do this exactly linear, or it just gets to be too many zombies and too
        // long of waves at higher levels - Ramm
    	switch ( UsedNumPlayers )
    	{
    		case 1:
    			NumPlayersMod=1;
    			break;
    		case 2:
    			NumPlayersMod=2;
    			break;
    		case 3:
    			NumPlayersMod=2.75;
    			break;
    		case 4:
    			NumPlayersMod=3.5;
    			break;
    		case 5:
    			NumPlayersMod=4;
    			break;
    		case 6:
    			NumPlayersMod=4.5;
    			break;
            default:
                NumPlayersMod=UsedNumPlayers*0.8; // in case someone makes a mutator with > 6 players
    	}
    
        NewMaxMonsters = NewMaxMonsters * DifficultyMod * NumPlayersMod;
    
        TotalMaxMonsters = Clamp(NewMaxMonsters,5,1100);  //11, MAX 800, MIN 5
    
    	MaxMonsters = Clamp(TotalMaxMonsters,5,MaxZombiesOnce);
    	//log("****** "$MaxMonsters$" Max at once!");
    
    	KFGameReplicationInfo(Level.Game.GameReplicationInfo).MaxMonsters=TotalMaxMonsters;
    	KFGameReplicationInfo(Level.Game.GameReplicationInfo).MaxMonstersOn=true;
    	WaveEndTime = Level.TimeSeconds + Waves[WaveNum].WaveDuration;
    	AdjustedDifficulty = GameDifficulty + Waves[WaveNum].WaveDifficulty;
    
    	j = ZedSpawnList.Length;
    	for( i=0; i<j; i++ )
    		ZedSpawnList[i].Reset();
    	j = 1;
    	SquadsToUse.Length = 0;
    
    	for ( i=0; i<InitSquads.Length; i++ )
    	{
    		if ( (j & Waves[WaveNum].WaveMask) != 0 )
    		{
                SquadsToUse.Insert(0,1);
                SquadsToUse[0] = i;
    
                // Ramm ZombieSpawn debugging
                /*for ( m=0; m<InitSquads[i].MSquad.Length; m++ )
                {
                   log("Wave "$WaveNum$" Squad "$SquadsToUse.Length$" Monster "$m$" "$InitSquads[i].MSquad[m]);
                }
                log("****** "$TotalMaxMonsters);*/
    		}
    		j *= 2;
    	}
    
        // Save this for use elsewhere
        InitialSquadsToUseSize = SquadsToUse.Length;
        bUsedSpecialSquad=false;
        SpecialListCounter=1;
    
    	//Now build the first squad to use
    	BuildNextSquad();
    }
    
    function ScoreKill(Controller Killer, Controller Other)
    {
       super.ScoreKill(Killer, Other);
    }
    
    defaultproperties
    {
    }
    
     
  4. Freddy

    Freddy Капо

    задержку можно в WaveCountDown поменять, а MaxZombiesOnce и так в конфиге есть
     
  5. Flame

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

    Ну давай поглядим как там всё в песочнице работает. Мне тоже полезно освежить память

    В SetupWave вначале инициализируется локальная временная переменная NewMaxMonsters

    А именно
    Берётся массив Waves из KillingFloor.ini (из секции [KFMod.KFGameType], либо если есть секция для своего геймтайпа - оттуда)
    Для текущей волны выбирается соответсвующий элемент массива - это структура
    У этой структуры смотрится свойство WaveMaxMonsters

    Далее это число умножается на модификатор сложности и на модификатор количества игроков
    NewMaxMonsters = NewMaxMonsters * DifficultyMod * NumPlayersMod;

    Далее инициализируется глобальная переменная из KFGameType - TotalMaxMonsters
    TotalMaxMonsters - это максимально возможное в течении волны количество монстров (не одновременно, а вообще)
    Получается оно так:
    TotalMaxMonsters = Clamp(NewMaxMonsters,5,800); //у тебя 1100 вместо 800 прописано
    Функция Clamp(x,n,m) возвращает число x, если оно принадлежит отрезку [n,m], если x<n - возвращается n,
    если x>m возвращается m
    То есть TotalMaxMonsters это число в пределах от 5 до 800 (у тебя до 1100)

    Далее идёт инициализация переменной MaxMonsters - числа одновременно доступных зомби
    MaxMonsters = Clamp(TotalMaxMonsters,5,MaxZombiesOnce);
    Опять же это число, которое лежит в пределах от 5 до MaxZombiesOnce, а так как TotalMaxMonsters у тебя
    почти наверняка больше MaxZombiesOnce, то и по сути MaxMonsters=MaxZombiesOnce
    MaxZombiesOnce - задаётся в KillingFloor.ini в секции [KFMod.KFGameType]
    Далее важно:
    И задаётся именно в этой секции. Попытки поменять эту переменную в условной секции [ServerPerks.SRGameType] ни к чему не приведут
    Переменная определена как globalconfig и значит её можно править только в секции того класса в котором она определена

    Поэтому количество одновременно доступных зомби задаётся с помощью MaxZombiesOnce, если надо прописать
    общее число зомби на волне, то надо править TotalMaxMonsters = Clamp(NewMaxMonsters,5,800);

    Насчёт задержек между спавнами зомби
    Поглядим на стейт MatchInProgress
    Функцию Timer

    Код после

    else if(bWaveInProgress)
    {

    Так. Ладно. Этот пункт вечером распишу - сейчас не успею) Заодно может в качестве статьи это всё оформлю.
    Сам пока погляди)

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

    Ему ж небось время между спавном сквадов интересно. А WaveCountDown эт совсем не о том)
     
    sindzi нравится это.
  6. sindzi

    sindzi Соучастник

    Спасибо за разьяснение процесса!!
    Да, я настроил песочницу и хочу просто сделать так чтобы монстров выходило больше/быстрее через serverperks
    Хотя б просто сделать MaxZombiesOnce побольше чем 64 (я так понял это максимум и никак не поменять через песочницу)
     
  7. kok-s

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

    Мне кажется число 64 тут самое оптимальное. Тебе просто нужно уменьшить время между спавнами отрядов мобов. Ставить больше 64 не советую, так как не все игроки имеют нормальные компы и у них будет тормозить игра.
     
  8. sindzi

    sindzi Соучастник

    Спасибо за совет! Подскажите, а как же тогда зафиксить время появления сквадов??

    Очень жду продолжения от Flame :blush:
     
  9. kok-s

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

    KillingFloor.ini

    [KFMod.KFGameType]

    WaveStartSpawnPeriod=Нужное значение в секундах

    Думаю поймёшь.
     
    sindzi и ЛОХМАТЫЙ нравится это.
  10. Flame

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

    WaveStartSpawnPeriod то тут каким боком?
    Эта переменная вообще нигде в коде не используется, кстати)

    Так. Вернёмся к статейке
    Насчёт задержек между спавнами зомби
    Поглядим на стейт MatchInProgress
    Функцию Timer
    Код после
    Код:
    else if(bWaveInProgress)
    {
    
    А именно вот это нам интересно:
    Код:
    if(nextSpawnSquad.length>0)
    {
    	NextMonsterTime = Level.TimeSeconds + 0.2;
    }
    else
    {
    	NextMonsterTime = Level.TimeSeconds + CalcNextSquadSpawnTime();
    }
    
    Не буду сейчас вдаваться в подробности, когда nextSpawnSquad.length>0, а когда нет (в будущей статье распишу)
    Простейшее решение такое - хочешь побольше паузу между спавном сквадов - ставь константу побольше, хочешь поменьше - поменьше
    Напиши так и будет быстрый спавн:
    Код:
    if(nextSpawnSquad.length>0)
    {
    	NextMonsterTime = Level.TimeSeconds + 0.2;
    }
    else
    {
    	NextMonsterTime = Level.TimeSeconds + 0.2;
    }
    
    ну или вместо всего этого просто
    Код:
    NextMonsterTime = Level.TimeSeconds + 0.2;
    
    Чтобы поправить этот код - надо будет скопировать состояние и всё содержимое таймера, другие функции из состояния MatchInProgress копировать не надо
    Код:
    State MatchInProgress
    {
    	function Timer()
    	{
    		...
    	}
    }
    
    Но вообще говоря вряд ли тебе это нужно. Ибо среднее значение CalcNextSquadSpawnTime для "Ада на земле" около 1.5 секунд.
    Ещё разок распишу весь принцип для песочницы "на пальцах"
    Возможно я чего там по-мелочам напутаю - потом разберёмся)
    Итак,
    Есть переменная TotalMaxMonsters - общее количество зомби на волне,
    есть переменная MaxMonsters, которая почти во всех адекватных ситуациях равна MaxZombiesOnce - количество зомби, которые могут появиться одновременно.
    Во время волны идёт по сути непрерывный спавн зомбиков до тех пор пока их количество не достигнет количества MaxMonsters.
    Убиваешь зомби -> их количество уменьшается (становится меньше MaxMonsters) -> идёт новый спавн зомби.
    Перерыв между спавном сквадов редко превышает 1.5 секунд
    (А если поправишь код как написано выше, то будет почти мгновенно)

    Опять же стоит учитывать, что быстрый спавн и большое одновременное количество зомби прилично сказывается на
    тормозах в игре. Общее количество зомби так же влияет.
    Потихоньку всё это накапливается и волне на 6 уже появляются лаги всевозможные у игроков. Пропадает оружие, не видно монстров и т.д.
    Пробежимся по настройкам KillingFloor.ini файла:
    Общее количество зомби:
    Итак, переменная которая влияет на количество зомби на волне - WaveMaxMonsters внутри массива Waves для каждой из волн
    Код:
    Waves[0]=(WaveMask=2013265920,WaveMaxMonsters=20,WaveDuration=180,WaveDifficulty=3.000000)
    
    Waves - массив прописан как config в классе Invasion, значит можно прописать его значение в каждом GameType (унаследованом от Invasion)
    Это означает, что если у вас в KillingFloor.ini есть секция для вашего геймтайпа, например, [ServerPerks.SRGameType],
    то значения будут браться именно оттуда (если они там прописаны)

    Общее количество зомби по умолчанию ограничено значением 800. Чтобы это поправить - см. предыдуший мой пост)
    Количество одновременно живых зомби:
    Переменная отвечающая за количество одновременно существующих зомби на волне - MaxZombiesOnce

    MaxZombiesOnce - переменная прописана как globalconfig в классе KFGameType, значит менять её значения имеет смысл только в секции [KFMod.KFGameType]
    У себя в [ServerPerks.SRGameType] её значение поменять нельзя
     
    Arckon. и sindzi нравится это.