Просьбы, подсказки, помощь. - Страница 43 - Форум - Russian Tournament
Страница 43 из 45«124142434445»
Форум - Russian Tournament » Игры » UnrealED » Просьбы, подсказки, помощь.
Просьбы, подсказки, помощь.
Gadavre
Цитата Gadavre ()
У тебя этот код выполняется ровно один раз же
То есть нужно добавить в конце return ?
Reborn
Судя по вашему посту, функция ModifyPlayer(Pawn Other) // called by GameInfo.RestartPlayer()
выполняется каждый раз при респауне игрока (GameInfo.RestartPlayer() )
Когда в руках у бота енфорсер и он не видит противника.
В этот момент вы приказываете ему стрелять (в кого??????)

Выстрелив (уж не знаю, из пистолета или из пальца) бот спокойно занимается дальше своими делами.

В стейте 'PlayFiring' он держаться не будет - выполнив стейт один раз, он запросит движок что ему делать дальше, и тот даст ему разумный ответ (например, бежать за оружием). На этом выполнение вашего кода закончится.
Return здесь не поможет.

(Добавлено) Возможно, я ошибаюсь, но мне казалось, что за дальность зрения бота отвечает переменная
SightRadius=5000.000000
Это примерно 500 метров. На бОльшем расстоянии бот просто не видит врага.
Сообщение отредактировал Reborn - Пятница, 09 Декабрь 16, 19:17
Gadavre
Цитата Reborn ()
Когда в руках у бота енфорсер и он не видит противника.В этот момент вы приказываете ему стрелять (в кого??????)
У   моего бота модифицированная снайперка.   Я не указываю боту стрелять в кого то . Я пытался создать условие при  котором, при расстоянии между ботом и игроком более 0 метров бот  производит выстрел.

Код
if(VSize(Bot(Other).Location - PlayerPawn(Other).Location) > 0)
                      GotoState ( 'PlayFiring' );
Цитата Reborn ()
(Добавлено) Возможно, я ошибаюсь, но мне казалось, что за дальность зрения бота отвечает переменная SightRadius=5000.000000
Это примерно 500 метров. На бОльшем расстоянии бот просто не видит врага.
Да, отвечает и я эксперементировал с этой переменной. Однако при стандартном значении 5000.000000 и   с добавлением
Код
Bot(Other).BaseAlertness = 2.000000;
Бот реагирует прицеливанием из  снайперки в сторону игрока, то есть, я так понимаю он игрока видит  и смысла увеличивать SightRadius нет... Я увеличивал SightRadius аж до 20000, однако бот никак не реагировал на игрока, как буддто в коде стоит какое-то ограничение.

Кстати я могу снять видео для Вас на Deck16, чтобы Вы увидели что происходит
Сообщение отредактировал Gadavre - Пятница, 09 Декабрь 16, 19:20
Reborn
В любом случае, стейта 'PlayFiring' у бота нет. Функция - это не стейт.
Команда GotoState ( 'PlayFiring' ); не будет иметь никакого эффекта:
движок построен так, что при отправке актера в несуществующий стейт ничего не происходит.
Единственное, что вы возможно получите, это ошибку в логе, и то я не знаю, пишется она в лог или нет.

Вот статья о стейтах: http://unrealscript.narod.ru/tutorials/scripting/states/states.html
(Добавлено) если бот прицеливается. но на стреляет, должна быть где-то ошибка.
Я в свое время "провешивал" лог, чтобы определить какие функции выполняются, а какие нет.
В начале каждой функции добавлял строку:
Код
log ("выполнена функция такая-то"
);
Это помогало определять что именно выполняется и в каком порядке.
Когда находилась глючная функция - добавлял  log (****); после каждой строки, и выводил в него значения переменных. Это позволяло понять, в какой именно строке происходит сбой, и что именно не работает.
Сообщение отредактировал Reborn - Пятница, 09 Декабрь 16, 19:23
Gadavre
Цитата Reborn ()
В любом случае, стейта 'PlayFiring' у бота нет. Функция - это не стейт.
У бота нет, но этот стейт есть в классе снайперки, которая в руках у бота.

Попытаетесь помочь разобраться? Все материалы по игре и то что нужно вам дам.
Reborn
Так вы же бота посылаете в стейт 'PlayFiring', а не снайперку.

Нет, не буду пытаться - нет времени, и с UT1 я не работал, даже не уверен, что она у меня запустится.
Если в классе снайперки такой стейт действительно есть - проверьте входит ли снайперка в этот стейт в процессе игры. Ну и в любом случае не мешает выложить код целиком - может кто-нибудь скажет что-нибудь умное.
Gadavre
Цитата Reborn ()
любом случае не мешает выложить код целиком - может кто-нибудь скажет что-нибудь умное.
Выложу конечно код, если кто возьмется. Кстати, UT99 прекрасно запускается и на windows 10. Я  также бы дал. если нужно конфиг вытягивающий графику на максимум, а также все необходимое для компиляции.

Добавлено (10 Декабря 16, 23:15)
---------------------------------------------
Ребят, нашел  полезные статьи по основам программирования  в C++.  На своих жалких  и долгих потугах в скриптинге заявляю, что без этого никак не написать грамотно код для своего мутатора. Всем новичкам обязательно ознакомиться с этими статьями, прежде запиливания своего мутатора!
Ссылка

Добавлено (11 Декабря 16, 12:58)
---------------------------------------------
Вот выложил видео из ut99, в котором бот на большой дистанции не может сделать выстрел, срабатывает только анимация прицеливания в игрока.


Бот стал прицеливаться только после такого изменения в моем мутаторе. В оригинале он просто пробегает и никого не видит.
Код
function ModifyPlayer(Pawn Other)    // called by GameInfo.RestartPlayer()
{
        Bot(Other).BaseAlertness = 2.000000;

        if ( NextMutator != None )
        NextMutator.ModifyPlayer(Other);
}

Прошу по возможности помочь пофиксить этот баг. Чтобы зум игрока не был больше нечестным преимуществом в дуели с искуственным интеллектом.

Добавлено (13 Декабря 16, 12:11)
---------------------------------------------
выяснил на   зарубежном  форуме  сайта  ut99.org, что проблема в том, что бот не стреляет когда видит одну голову игрока. От центра груди бота  в грудь игрока идет линия взгляда ( line of sight). Если на траектории этой линии появляется припятствие, то бот стрелять не будет. Как это профиксить и прописать в мутаторе, чтобы бот, если видит одну голову, то стрелял бы в голову, никто из мировых кодеров форума ut99.org, увы не знает... Предлагают поиграться в самодельных ботов типа MBot_D,  но интереса нет, так как главного, что приближает их к человеку они не делают.
Ccылка на тему

А в  UT2004  и в UT2007 бот также не стреляет в игрока, если видит только одну его голову???
Сообщение отредактировал Gadavre - Вторник, 13 Декабрь 16, 12:16
Reborn
Сомневаюсь. 
Мало ли что на зарубежном форуме скажут. 

"что проблема в том, что бот не стреляет когда видит одну голову игрока"
по вашим словам, у вас проблема была с дальностью, то есть начиная с определенной дистанции,  бот не стрелял даже если видел игрока целиком. Что теперь изменилось?

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

Отладка игры - это очень серьёзная работа, я сильно сомневаюсь, что кто-нибудь захочет за это взяться.

Кстати, в UT2004 бот шарашит в голову только так (даже если видит одну только голову).
Gadavre
Цитата Reborn ()
по вашим словам, у вас проблема была с дальностью, то есть начиная с определенной дистанции, бот не стрелял даже если видел игрока целиком. Что теперь изменилось?
Я думал, что была проблема с дальностью, но это не так. Я спустился вниз с той платформы со снайперкой и занял самую дальнюю точку у стены от той точки, когда бот подымается на лифте и подбегает к ступенькам. Сразу же получил  пулю, так как линия взгляда бота от центра его груди соединилась с центром моей груди.  Вот бы взять код с  ut2004  и перенести его как то в мутатор для UT99. Там наверняка прописаны координаты Line of Sight на голову пешки.  Это была бы революция, новый виток развития кодинга! И Россия могла бы этим прилично удивить товарищей с зарубежья.


Добавлено (13 Декабря 16, 15:12)
---------------------------------------------
Как можно было  бы написать код для увеличения параметра CollisionHeight  для игрока (PlayerPawn)?
Дело в том, что эта переменная относиться к классу Actor, а не к Pawn.  И подобная попытка как например:
PlayerPawn(Other).CollisionHeight = 25.000000;  просто не компилируется. .. :(
Сообщение отредактировал Gadavre - Вторник, 13 Декабрь 16, 17:43
UnShame
Цитата Gadavre ()
Там наверняка прописаны координаты Line of Sight на голову пешки.  Это была бы революция, новый виток развития кодинга! И Россия могла бы этим прилично удивить товарищей с зарубежья.
если это не сарказм, ты меня пугаешь pokerface

http://rusut.ru/_fr/14/links.txt
https://www.mediafire.com/folder/1ww9zpl63q2pc/RT
http://rusut.ru/files/dump/filesDump.html
Reborn
Line of Sight можно заменить на  функцию Trace или FastTrace.
Там передаются координаты мишени, и их всегда можно поднять на 25 юнитов вверх.
Проблема в том, чтобы найти строку кода, которая отвечает за это безобразие - то есть в какой именно момент бот, уже прицелившись, получает от движка приказ не стрелять.
Gadavre
Цитата UnShame ()
если это не сарказм, ты меня пугаешь
Да,этот был бы прорыв в кодинге для первого движка, ведь никто еще для ut99 ничего подобного не делал! Я бы даже в кафешку пошел бы отметить  это дело!

Добавлено (13 Декабря 16, 20:59)
---------------------------------------------

Цитата Reborn ()
Проблема в том, чтобы найти строку кода, которая отвечает за это безобразие - то есть в какой именно момент бот, уже прицелившись, получает от движка приказ не стрелять.
 Может возможно как-то увеличить переменную CollisionHeight для класса PlayerPawn? Тогда бы методом подбора можно было  бы сместить Line of Sight с груди на голову. Мне кажется, это более простой путь, чем тот, который вы указали.
UnShame
Reborn
Может возможно как-то увеличить переменную CollisionHeight для класса PlayerPawn?

От переменной  CollisionHeight в классе   PlayerPawn зависит, на какой высоте находится взгляд игрока, на какой высоте находится модель игрока, и может ли он провалиться сквозь землю.

Увеличить  CollisionHeight можно
final function bool SetCollisionSize( float NewRadius, float NewHeight );

При этом возможно три варианта:
1) модель игрока "подпрыгнет вверх", причем его ножки будут болтаться в воздухе.
2) Движок может посчитать, что ноги игрока оказались ниже уровня земли, после чего игрок провалится вниз - в комнату ниже или в черное "никуда".
3) Если высота помещения ниже, чем новая  CollisionHeight, движок посчитает, что игрок там не помещается, и его разорвёт на части.

Короче  CollisionHeight - это ФИЗИЧЕСКАЯ характеристика игрока, на которую завязана вся игровая физика. И лезть в неё нужно в последнюю очередь.  Можете, кстати, попробовать сделать это через функцию ModifyPlayer(Pawn Other) . Были в своё время
мутаторы, меняющие рост игрока.

Добавлено (13 Декабря 16, 23:48)
---------------------------------------------
"И Россия могла бы этим прилично удивить товарищей с зарубежья."
"Я бы даже в кафешку пошел бы отметить это дело!"

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

И я его понимаю - у меня голова трещала, когда в UT2004 я разбирался, что и как происходит при прицеливании. Эпиковские скрипты не то чтоб написаны криво, но слишком сложны для понимания, особенно в той части, где взаимодействуют клиент и сервер.

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

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

В общем, программирование не та область, где можно что-то сделать вместо программера.
Кто хочет программировать - программируйте сами, а форум используйте для вопросов.

... Разве что у нас на форуме найдется гениальный знаток скриптов, который ткнет пальчиком в код, и скажет "вот эта функция"....

Добавлено (14 Декабря 16, 00:35)
---------------------------------------------
(Добавлено 2)
Как я понимаю, за прицеливание в голову отвечает вот эта функция в UT2004:

Класс bot,
function rotator AdjustAim(FireProperties FiredAmmunition, vector projStart, int aimerror)
{
.............................
if ( Pawn.Weapon != None && Pawn.Weapon.bSniping && Stopped() && (Skill > 5 + 6 * FRand()) )
{
// try head
FireSpot.Z = Target.Location.Z + 0.9 * Target.CollisionHeight;
bClean = FastTrace(FireSpot, ProjStart);
}
}

То есть добавляется 0,9 высоты коллизии и бросается FastTrace.
Если функция  FastTraceвозвращает True (успешно) - бот стреляет в голову.
Причем важно отметить, что прицеливание в голову реализовано только для высокоуровневых ботов.
Хотя меня они на CTF-Face3 только так валили - в Ut2004 ещё и прописано, что человек является для бота приоритетной мишенью, в отличие от собратьев по разуму.
Сообщение отредактировал Reborn - Среда, 14 Декабрь 16, 00:40
GP
Цитата Reborn ()
Сначала предложил нам в качестве приза Величие Нации,
затем, когда никто не заинтересовался - бесплатный поход в кафешку.

У меня начальство точно так же идеи закидывает yaoming пока "подводную часть айсберга" не достанеш.
Gadavre
Цитата Reborn ()
Можете, кстати, попробовать сделать это через функцию ModifyPlayer(Pawn Other)
Я пытался многократно приспособить CollisionHeight к PlayerPawn(Other)  все бесполезно, может даже и не возможно. Не компилируется , че то пишет что не его переменная. Вероятно CollisionHeight работает только в классе Асtor. А в классе оружия все работает для оружия.
Цитата Reborn ()
// try head
FireSpot.Z = Target.Location.Z + 0.9 * Target.CollisionHeight;bClean = FastTrace(FireSpot, ProjStart);
эти строки есть в классе Bot для ut99.

Цитата Reborn ()
Кто хочет программировать - программируйте сами, а форум используйте для вопросов.
программирую простые вещи сам. Но уперся головой в потолок и дальше не идет никак уже больше 2-х недель. Все выходные сижу за своим мутатором до поздней ночи. А все потому, что хочу, чтобы мутатор отличался по сложности среди массы других однотипных мутаторов... Потому и задаю здесь вопросы, так как все что только можно по основам уже прочитал и проделал массу бестолковых экспериментов. Но не всегда в ответе на вопрос получаешь понятный ответ. Но эта моя проблема, надо было не в педагогический , а в технический вуз поступать и учить C++, щас бы уже был бы готов передовой, непобедимый A.I способный играть как профессиональный боец играть с которым никогда никому не надоест.
Цитата Reborn ()
Сначала предложил нам в качестве приза Величие Нации,
Я понял ваш намек. Также я предположу по вашему профилю, раз Вы проживаете в Бразилии  , то вас скорее всего интересует величие Бразилии, а не России.  Простите не угадал! yaoming Бразилия + Россия = Совместный Мутатор!
Цитата GP ()
У меня начальство точно так же идеи закидывает
И вас я также понял.
Сообщение отредактировал Gadavre - Среда, 14 Декабрь 16, 16:27
UberSoldier
Лол, что тут происходит, собераемся в кофешку? На билет даш, приеду ha


Цитата
Разве что у нас на форуме найдется гениальный знаток скриптов, который ткнет пальчиком в код, и скажет "вот эта функция"
GP мне примерно так и делал. yaoming
Цитата
У меня начальство
Работаешь по интересу? Программист?

Infinite War v5.0.2 construction
UIP 2.0 - UIPP(UIP 2.1)
Reborn
Цитата
Я пытался многократно приспособить CollisionHeight к PlayerPawn(Other) все бесполезно, может даже и не возможно. Не компилируется , че то пишет что не его переменная. Вероятно CollisionHeight работает только в классе Асtor. А в классе оружия все работает для оружия.
Переменные  CollisionHeight и  CollisionRadius заявлены как константы (const).
Это означает что НАПРЯМУЮ их изменить невозможно.
Компилятор не позволит.

Но высота и радиус цилиндра коллизии легко меняются через функцию 
final function bool SetCollisionSize( float NewRadius, float NewHeight );
для всех актеров, включая игроков и оружие.
Поищите в скриптах поиском примеры использования SetCollisionSize. 

Цитата
эти строки есть в классе Bot для ut99.

В общем, опытным путём удалось установить следующее:
Команда "ViewClass Pawn" показывает вид от лица бота.
Команда "Verbose"  выводит консоли мысли бота.

Пока бот видит игрока, он находится в стейтах "Attacking" или "TacticalMove".
Как только игрок заходит за препятствие, бот "теряет его из виду".
Для бота устанавливется значение Enemy = None, 
и переходит в стейт "Wandering" или "Roaming"
Естественно, ему некуда целиться, поскольку  Enemy = None. 

Причина, действительно, заключается в функции bot.LineOfSightTo(Enemy) которая некорректно обрабатывает случай, когда над преградой торчит только голова Enemy 
Если заменить в классе bot условие LineOfSightTo(Enemy) на   Enemy.LineOfSightTo(Self)
(то есть не бот видит врага, а враг видит бота), то бот начинает спокойно шарашить в голову.
Проблема в том, что лезть так глубоко в движок мы не можем:  botpack.u является системным пакетом, и пересохранять его низззя.

Либо писать отдельный подкласс для каждого из ботов, либо пытаться из класса оружия насильственно присвоить боту значение Enemy, насильственно перевести его в стейт Attacking и дать приказ на стрельбу, но я сомневаюсь, что из этого что-то получится.
GP
Цитата UberSoldier ()
Работаешь по интересу
Цитата Reborn ()
Либо писать отдельный подкласс для каждого из ботов, либо пытаться из класса оружия насильственно присвоить боту значение Enemy
В новом ут боты веселей, часто пробуют через стену прострелить, не редко из ракетницы.
Gadavre
Цитата Reborn ()
Поищите в скриптах поиском примеры использования SetCollisionSize.
Удалось мне подключить к мутатору CollisionHeight и  CollisionRadius. Но я что то  немного  разочарован. То что Игрок бегает по воздуху и после смерти его тело висит в воздухе это одно. Но главное, что может не понравиться большинству, PlayerPawn теперь с увеличенным CollisionHeight не может пройти во многие важные места карт с низким потолком. Если боту увеличить эту переменную, то он будет просто тупо застревать в таких местах.  А вот если уменьшить в 2 раза CollisionRadius, то баг  топтания бота на месте в некотрых рендомных моментах должен пропасть.
В общем вот что у меня получилось в моем классе мутатор. Приведу только те строки которые добавил для коллизии

Код
class InstaSniperMutator extends Mutator config(InstaSniper);

var(Collision) const float CollisionRadius; // Radius of collision cyllinder.
var(Collision) const float CollisionHeight; // Half-height cyllinder.
var(Display) float DrawScale;

function ModifyPlayer(Pawn Other)    // called by GameInfo.RestartPlayer()
{
        if ( Other.IsA('PlayerPawn' )
        {
                PlayerPawn(Other).SetCollisionSize(CollisionRadius*DrawScale/Default.DrawScale, CollisionHeight*DrawScale/Default.DrawScale);
        }
       DeathMatchPlus(Level.Game).GiveWeapon(Other,"InstaSniper.TSniperRifle");

    if ( NextMutator != None )
    NextMutator.ModifyPlayer(Other);
}

defaultproperties
{
     DefaultWeapon=Class'InstaSniper.Hammer'
     DrawScale=3.000000    // ???
     CollisionRadius=22.000000
     CollisionHeight=77.000000
}

А вот   изменение DrawScale в defaultproperties  у меня не работает. А почему?
Сообщение отредактировал Gadavre - Четверг, 15 Декабрь 16, 00:00
Форум - Russian Tournament » Игры » UnrealED » Просьбы, подсказки, помощь.
Страница 43 из 45«124142434445»
Поиск: