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

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

  1. Фрэгл

    Фрэгл Administrator

    Собственно,вопрос прост:
    -Можно ли изменить цвет ника в игре?

    Я пока не видел,чтобы кто-то,на каком нибудь сервере бегал например с жёлтым ником.Наткнулся на информацию как это делается в UT2004,там всё до банальности просто,но естественно,на КФ не работает.
    Поэтому хотелось бы узнать(может кто-то уже сталкивался с таким вопросом)насколько это технически сложно и возможно ли вообще.Тут я подразумеваю:

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

    В принципе,если кто-то захочет заняться данным вопросом,могу дать ссылку на то,как это делается в UT(хотя,думаю люди и так найдут нужную информацию).

    Резюмируя,хотелось бы узнать мнения людей разбирающихся в программировании мутаторов,кодинге и тд.

    P.S.Прошу писать по существу вопроса,ибо философские разбрызгивания мозгами о необходимости этого,читать и обсуждать нет желания.
     
  2. Freddy

    Freddy Капо

    На самом деле все очень просто: HUDKillingFloor->DrawPlayerInfo

    Код:
    C.SetDrawColor(255, 255, 255, BeaconAlpha); //тут цвет ника
    C.Font = GetConsoleFont(C);
    PlayerName = Left(P.PlayerReplicationInfo.PlayerName, 16);
    C.StrLen(PlayerName, XL, YL);
    C.SetPos(ScreenLocX - (XL * 0.5), ScreenLocY - (YL * 0.75));
    C.DrawTextClipped(PlayerName);
    
     
    Винни, AkycTuk и Dr_Killjoy нравится это.
  3. Фрэгл

    Фрэгл Administrator

    Выставил свои значения R,G,B но ничего не изменилось.Может ещё что-то нужно изменить?
     
  4. Dr_Killjoy

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

    Не поменяется. Нужен мутатор, изменяющий худ.
     
  5. AkycTuk

    AkycTuk Бандит

    Зачем пугать то :teehee:
    Если у вас sp, то SRHUDKillingFloor.
     
  6. ЛОХМАТЫЙ

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

    Имеется в виду изменение цвета ника клиентом по своему усмотрению.

    А вы, я так понимаю, всё с серверной стороны предлагаете. И всем клиентам будет выставлено одно и то же. Это не то.
     
  7. Dr_Killjoy

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

    Не обязательно. В худе можно настроить чтобы отображалось только для самого клиента только его ник. Но вопрос, зачем?
    Сп не является мутатором, изменяющим худ? Разноцветных ников я нигде не видел, получается, в любом случае нужно писать новый худ который будет это поддерживать, будет ли он в сп или гдето еще, не важно, смысл в том что худ придется переписывать.
     
  8. Фрэгл

    Фрэгл Administrator

    Конечно,идеальным вариантом было бы ввести в SP возможность изменения цвета ника.Тогда все могут видеть цвет ника друг друга,или ещё каким-то другим способом это реализовать.Насколько это сложно технически и есть ли желающие заняться данным делом?
     
  9. Freddy

    Freddy Капо

    Тогда надо ввести в репликацию цвет ника игрока и настраивать его командами через чат как ртд. Или можно сделать улучшеное меню настроек на новой панели рядом с Навыки или Связь. См. BAR Z
     
  10. Фрэгл

    Фрэгл Administrator

    Вопрос вот какой:
    -Все наблюдали картину,когда один моб атакует другого моба.Бывает группа мобов стоит и мочит друг друга.Так вот,какое условие должно быть выполнено,чтобы один моб начал атаковать другого? Причём,это не зависит ни от патча,ни от ивента,а значит-это где-то в стандартных файлах игры прописано.Так какой же "тригер/тумблер" должен быть задействован,чтобы моб начал атаковать другого моба? Или это тупо какой-то элемент случайности? Просто не всегда,когда допустим скрэйк задевает ФП,она агрится и атакует его.И с другими соответственно.
    И еще,урон наносимый мобами игроку прописан,а какой урон мобы наносят друг другу при атаке? То есть есть ли формула подсчёта(если вообще есть)? Исходя из того,что ФП и скрэйк могут минут 10 пилить друг друга и в итоге один всё-таки умрет,то где-то всё это прописано.
     
  11. Dr_Killjoy

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

    Мобы наносят друг другу такой же урон, как и игрокам. По поводу переагривания мобов друг на друга, в коде особо не различил где это, но заметно, что они переагриваются в том случае, если один моб задевает другого во время его атаки. К примеру, скрейк начинает гнаться за игроком, его задевает хаск, он резко разворачивается и бежит уже на хаска. Скорее всего это не было задумано, и они при атаке на одну цель, могут переагриться от дамага, на другую, и уже вне зависимости от того, "свой" он или нет.

    По поводу дамага можно немного прояснить. К примеру хаск наносит 26 дмг за 1 удар. Сцепились два хаска. У хаска на ад на земле, при 1 игроке 1050 хп. Теперь представь, как долго они ударами, снимающими по 26 хп, будут друг друга убивать.
     
  12. Фрэгл

    Фрэгл Administrator

    Значит,если один моб входит в состояние атаки/агра на игрока и в этот момент его задевает другой моб,то первый переключается с игрока на задевшего его моба.
    Тоже к такому мнению пришел.Однако,если такое есть,то можно ли это как-то выделить/вырезать,заставить работать по определённому,нужному алгоритму(например в качестве мутатора)?.Проще говоря,можно ли заставить мобов атаковать друг друга по своему желанию.
     
  13. DpaKc

    DpaKc Бандит

    МММ конечно не по теме вопрос но хотелось бы спросить
    можно ли импортировать из unreal'овского мода KF извлечь интерфейс и сделать как мутатор просто вроде хорошо бы смотрелось
    [​IMG]
     
  14. Rainishe

    Rainishe Солдат

    всё возможно. я уже занимаюсь етим. только переношу интерфейс из игры сталкер.
     
  15. CBAPLLLuK

    CBAPLLLuK Бандит

    Господа хорошие, проконсультируйте чайника, ну ей богу, в этом вашем C никогда не разбирался и разбираться не было желания. А тут, видители, теперь без этого не обойтись. Всегда работал на Delphi 7 и проблем не возникало.

    Ну, в общем, вопрос:
    Беру для примера хотя бы SRVetCommando.uc у декомпилированной ServerPerksV5P.

    Переходим к строке № 192. Функция ZedTimeExtensions. Функция СлоуМо и её множители, это понятно. Так же понятно, что класс функции берется из KFPlayerReplicationInfo.uc, что логично.

    Переходим к условиям функции, в которых используется критерий If/Return (Если/вернуть значение). По факту, это аналогия пресловутых If/Then (Если/то) и на них держится добрые 80% всех условий в мутаторах KF.

    Ну и, значит, по тексту:
    if ( KFPRI.ClientVeteranSkillLevel >= 3 )
    Если заявленный уровень перка выше или равен трём, возвращаем значение в формате: Уровень перка Минус Два (return KFPRI.ClientVeteranSkillLevel - 2).
    Если уровень перка не удовлетворяет условиям уравнения, возвращаем 0 (return 0).

    Условие простешее, если говорить о языке программирование. Но вы мне лучше вот что скажите, где здесь, мать его, переменная Замедления времени??? Где она задана?? Я вижу только переменную ClientVeteranSkillLevel, а функция ZedTimeExtensions, полагаю, это свободное название, как и в Delphi 7. Назвали её так только потому, что удобнее ориентироваться.

    Может я просто глупец?
     
  16. Flame

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

    1. If/Then это аналогия If, а не If/Return - мы можем ничего и не возвращать

    в Паскале-подобных:
    Код:
    If Условие Then
    Begin
    ...
    End
    Else
    Begin
    ...
    End
    
    в С-подобных:
    Код:
    if(Условие)
    {
    }
    else
    {
    }
    2. Функция ZedTimeExtensions возвращает количество возможных замедлений
    Реализована по принципу:
    Если уровень перка <3, то нефик замедлять - возвращаем 0
    Если уровень перка >=3, то возвращаем УровеньПерка-2 (именно столько ZedTime'ов будет возможно)
    Кстати, надо написать Марко - ещё одна не очень то корректно работающая функция.
    Там расчёт на то, что максимально возможно 4 замедления (при 6 уровнях это так и есть)
    Но если у нас 20 уровень и не отключено замедление, то мы можем 18 раз подряд его вызвать...
    Если кто хочет поправить, то можно сделать так

    Код:
    static function int ZedTimeExtensions(KFPlayerReplicationInfo KFPRI)
    {
    	if ( KFPRI.ClientVeteranSkillLevel >= 3 )
    		return Min(KFPRI.ClientVeteranSkillLevel - 2, 4); // Up to 4 Zed Time Extensions
    	return 0;
    }

    3.
    Какие множители? :)
    Класс функции? Может название? Только вот оно не берётся из KFPlayerReplicationInfo
    Из KFPlayerReplicationInfo берётся информация об игроке, точнее из передаваемого экземпляра KFPRI класса KFPlayerReplicationInfo
    Все функции из классов унаследованных от SRVeterancyTypes/KFVeterancyTypes служат лишь для предоставления информации о возможностях игрока и его персонального оружия
    Само замедление обрабатывается совсем не здесь...

    Ладно
    Раз уж начал - доскажу
    Сама обработка замедления происходит в KFGameType.Killed:

    Код:
    function Killed(Controller Killer, Controller Killed, Pawn KilledPawn, class<DamageType> damageType)
    {
    	local Controller C;
    	local string MapName;
    
    	if ( PlayerController(Killer) != none )
    	{
    		if ( KFMonster(KilledPawn) != None && Killed != Killer )
    		{
    			if ( bZEDTimeActive && KFPlayerReplicationInfo(Killer.PlayerReplicationInfo) != none &&
    				 KFPlayerReplicationInfo(Killer.PlayerReplicationInfo).ClientVeteranSkill != none &&
    				 KFPlayerReplicationInfo(Killer.PlayerReplicationInfo).ClientVeteranSkill.static.ZedTimeExtensions(KFPlayerReplicationInfo(Killer.PlayerReplicationInfo)) > ZedTimeExtensionsUsed )
    			{
    				// Force Zed Time extension for every kill as long as the Player's Perk has Extensions left
    				DramaticEvent(1.0);
    
    				ZedTimeExtensionsUsed++;
    			}
    ...
    }

    При убийстве кого-либо вызывается фунция Killed
    Вначале проверяется кем было совершено убийство - игроком или нет
    Код:
    	if ( PlayerController(Killer) != none )
    Далее проверяем зомбик ли убит и не используем ли мы общий контроллер для игрока и для зомбика (фиг знает зачем )) видимо исключаем самоубийство существ одновременно являющихся монстрами, но при этом с "человеческим" контроллером ) )
    Код:
    if ( KFMonster(KilledPawn) != None && Killed != Killer )
    А вот дальше и идёт обработка замедления
    Проверяем позволено ли нам вообще включать замедление
    Код:
    if ( bZEDTimeActive
    Далее две проверки идут на то, можем ли мы привести PlayerReplicationInfo к типу KFPlayerReplicationInfo и если можем, то нет ли проблем с ClientVeteranSkill
    Код:
    KFPlayerReplicationInfo(Killer.PlayerReplicationInfo) != none &&
    KFPlayerReplicationInfo(Killer.PlayerReplicationInfo).ClientVeteranSkill != none
    И вот наконец идёт проверка
    Код:
    KFPlayerReplicationInfo(Killer.PlayerReplicationInfo).ClientVeteranSkill.static.ZedTimeExtensions(KFPlayerReplicationInfo(Killer.PlayerReplicationInfo)) > ZedTimeExtensionsUsed
    То есть мы по сути вызываем ту самую функцию ZedTimeExtensions и передаём ей информацию об убийце
    KFPlayerReplicationInfo(Killer.PlayerReplicationInfo)

    Эта функция нам возвращает количество возможных замедлений (пусть будет 4)
    И мы сверяем эту 4 с текущим счётчиком использованных замедлений ZedTimeExtensionsUsed

    И вот если использовано было меньше 4х замедлений, то мы выполняем собственно сам код:
    Код:
    	DramaticEvent(1.0);
    	ZedTimeExtensionsUsed++;
    
    А именно вызываем само замедление и увеличиваем счётчик использованных замедлений на 1
     
    Папка01, Gwyn, LLIePLLIeHb и 2 другим нравится это.
  17. -SR-

    -SR- Новенький

    Есть 1 небольшой вопросец.. Можно ли в return или чем-то похожем вместо полного название TestClass01 (к примеру) возвращать постоянную часть 'TestClass' в конце которой будет 'XX'? Где 'XX', к примеру, значение i из цикла.
    Т.е.
    Есть цикл

    for i ( i=0, TestCon >= i, i++}
    {
    if (killed.pawn.Class == Test.TestMob%i-1% // вместо Test.TestMob%i-1%, при i =1, будет Test.TestMob0
    Test.TestFunction (killed.Pawn , Class'TestMob%i%')' // вместо Class'TestMob%i%', при i =1, будет Class'TestMob1'
    }

    Пока только набросок мысли, и стало интересно возможны ли такие манипуляции.
     
  18. CompJ

    CompJ Солдат

    Я бы сделал аналог фабрики, хотя может у скриптовых движков и есть такая возможность.
     
  19. Dr_Killjoy

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

    Не совсем понятен вопрос. Любое значение, соотвествующее типу возвращаемому, функции, конечно же разрешено в return.

    П.С. Епрст, кажется понял вопрос. С именами насколько я знаю таким образом оперировать невозможно. Возможно есть способ конвертировать имя в строку, изменить строку, а потом обратно, хотя не уверен. Так же можно формировать строку, а потом подгружать класс с помощью функции DynamicLoadObject(OurString,Class'Class');
     
  20. BeasT0105

    BeasT0105 Новенький

    люди добрые помогите с двумя вопросами, техник не варит броню пишет что вы должны находится около двери как и где это исправить подскажите.
    и вот еще вопрос где ведется исправление с чем появляется игрок на сервере ну с каким оружием и так далее. И Как сделать определенному игроку "титул". Ну как в л2 ник белого цвета а над ником еще надпись синего.
    заранее оч благодарен.