|
Форум - Russian Tournament » Игры » UnrealED » Просьбы, подсказки, помощь. |
Просьбы, подсказки, помощь. |
841, 09 Декабря 16 14:37
|
842, 09 Декабря 16 15:37
Судя по вашему посту, функция ModifyPlayer(Pawn Other) // called by GameInfo.RestartPlayer()
выполняется каждый раз при респауне игрока (GameInfo.RestartPlayer() ) Когда в руках у бота енфорсер и он не видит противника. В этот момент вы приказываете ему стрелять (в кого??????) Выстрелив (уж не знаю, из пистолета или из пальца) бот спокойно занимается дальше своими делами. В стейте 'PlayFiring' он держаться не будет - выполнив стейт один раз, он запросит движок что ему делать дальше, и тот даст ему разумный ответ (например, бежать за оружием). На этом выполнение вашего кода закончится. Return здесь не поможет. (Добавлено) Возможно, я ошибаюсь, но мне казалось, что за дальность зрения бота отвечает переменная SightRadius=5000.000000 Это примерно 500 метров. На бОльшем расстоянии бот просто не видит врага. |
843, 09 Декабря 16 16:10
Когда в руках у бота енфорсер и он не видит противника.В этот момент вы приказываете ему стрелять (в кого??????) Код if(VSize(Bot(Other).Location - PlayerPawn(Other).Location) > 0) GotoState ( 'PlayFiring' ); (Добавлено) Возможно, я ошибаюсь, но мне казалось, что за дальность зрения бота отвечает переменная SightRadius=5000.000000 Это примерно 500 метров. На бОльшем расстоянии бот просто не видит врага. Код Bot(Other).BaseAlertness = 2.000000; Кстати я могу снять видео для Вас на Deck16, чтобы Вы увидели что происходит |
844, 09 Декабря 16 16:18
В любом случае, стейта 'PlayFiring' у бота нет. Функция - это не стейт.
Команда GotoState ( 'PlayFiring' ); не будет иметь никакого эффекта: движок построен так, что при отправке актера в несуществующий стейт ничего не происходит. Единственное, что вы возможно получите, это ошибку в логе, и то я не знаю, пишется она в лог или нет. Вот статья о стейтах: http://unrealscript.narod.ru/tutorials/scripting/states/states.html (Добавлено) если бот прицеливается. но на стреляет, должна быть где-то ошибка. Я в свое время "провешивал" лог, чтобы определить какие функции выполняются, а какие нет. В начале каждой функции добавлял строку: Код log ("выполнена функция такая-то" ); Когда находилась глючная функция - добавлял log (****); после каждой строки, и выводил в него значения переменных. Это позволяло понять, в какой именно строке происходит сбой, и что именно не работает. |
845, 09 Декабря 16 16:24
|
846, 09 Декабря 16 16:39
Так вы же бота посылаете в стейт 'PlayFiring', а не снайперку.
Нет, не буду пытаться - нет времени, и с UT1 я не работал, даже не уверен, что она у меня запустится. Если в классе снайперки такой стейт действительно есть - проверьте входит ли снайперка в этот стейт в процессе игры. Ну и в любом случае не мешает выложить код целиком - может кто-нибудь скажет что-нибудь умное. |
847, 13 Декабря 16 09:11
любом случае не мешает выложить код целиком - может кто-нибудь скажет что-нибудь умное. Добавлено (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 бот также не стреляет в игрока, если видит только одну его голову??? |
848, 13 Декабря 16 10:02
Сомневаюсь.
Мало ли что на зарубежном форуме скажут. "что проблема в том, что бот не стреляет когда видит одну голову игрока" по вашим словам, у вас проблема была с дальностью, то есть начиная с определенной дистанции, бот не стрелял даже если видел игрока целиком. Что теперь изменилось? Сделайте в эдиторе "кубик" с пропастью нужной ширины, встаньте на другой стороне, и проверьте, будет ли стрелять бот или нет когда видит вас целиком, и когда видит одну толко голову. Отладка игры - это очень серьёзная работа, я сильно сомневаюсь, что кто-нибудь захочет за это взяться. Кстати, в UT2004 бот шарашит в голову только так (даже если видит одну только голову). |
849, 13 Декабря 16 12:12
по вашим словам, у вас проблема была с дальностью, то есть начиная с определенной дистанции, бот не стрелял даже если видел игрока целиком. Что теперь изменилось? Добавлено (13 Декабря 16, 15:12) --------------------------------------------- Как можно было бы написать код для увеличения параметра CollisionHeight для игрока (PlayerPawn)? Дело в том, что эта переменная относиться к классу Actor, а не к Pawn. И подобная попытка как например: PlayerPawn(Other).CollisionHeight = 25.000000; просто не компилируется. .. |
850, 13 Декабря 16 16:04
если это не сарказм, ты меня пугаешь
|
851, 13 Декабря 16 16:23
Line of Sight можно заменить на функцию Trace или FastTrace.
Там передаются координаты мишени, и их всегда можно поднять на 25 юнитов вверх. Проблема в том, чтобы найти строку кода, которая отвечает за это безобразие - то есть в какой именно момент бот, уже прицелившись, получает от движка приказ не стрелять. |
852, 13 Декабря 16 17:59
Да,этот был бы прорыв в кодинге для первого движка, ведь никто еще для ut99 ничего подобного не делал! Я бы даже в кафешку пошел бы отметить это дело!
Добавлено (13 Декабря 16, 20:59) |
853, 13 Декабря 16 18:50
|
854, 13 Декабря 16 21:35
Может возможно как-то увеличить переменную 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 ещё и прописано, что человек является для бота приоритетной мишенью, в отличие от собратьев по разуму. |
855, 13 Декабря 16 23:22
|
856, 14 Декабря 16 07:57
Я пытался многократно приспособить CollisionHeight к PlayerPawn(Other) все бесполезно, может даже и не возможно. Не компилируется , че то пишет что не его переменная. Вероятно CollisionHeight работает только в классе Асtor. А в классе оружия все работает для оружия.
Цитата Reborn () // try head FireSpot.Z = Target.Location.Z + 0.9 * Target.CollisionHeight;bClean = FastTrace(FireSpot, ProjStart); программирую простые вещи сам. Но уперся головой в потолок и дальше не идет никак уже больше 2-х недель. Все выходные сижу за своим мутатором до поздней ночи. А все потому, что хочу, чтобы мутатор отличался по сложности среди массы других однотипных мутаторов... Потому и задаю здесь вопросы, так как все что только можно по основам уже прочитал и проделал массу бестолковых экспериментов. Но не всегда в ответе на вопрос получаешь понятный ответ. Но эта моя проблема, надо было не в педагогический , а в технический вуз поступать и учить C++, щас бы уже был бы готов передовой, непобедимый A.I способный играть как профессиональный боец играть с которым никогда никому не надоест. Я понял ваш намек. Также я предположу по вашему профилю, раз Вы проживаете в Бразилии , то вас скорее всего интересует величие Бразилии, а не России. Простите не угадал! Бразилия + Россия = Совместный Мутатор! И вас я также понял. |
857, 14 Декабря 16 13:09
Лол, что тут происходит, собераемся в кофешку? На билет даш, приеду
Цитата Разве что у нас на форуме найдется гениальный знаток скриптов, который ткнет пальчиком в код, и скажет "вот эта функция" Цитата У меня начальство Infinite War v5.0.2 construction UIP 2.0 - UIPP(UIP 2.1) |
858, 14 Декабря 16 17:48
Цитата Я пытался многократно приспособить CollisionHeight к PlayerPawn(Other) все бесполезно, может даже и не возможно. Не компилируется , че то пишет что не его переменная. Вероятно CollisionHeight работает только в классе Асtor. А в классе оружия все работает для оружия. Это означает что НАПРЯМУЮ их изменить невозможно. Компилятор не позволит. Но высота и радиус цилиндра коллизии легко меняются через функцию 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 и дать приказ на стрельбу, но я сомневаюсь, что из этого что-то получится. |
859, 14 Декабря 16 19:14
Роботаю по специальности почти, а по интересу 95% роботы перевесил на комп. У ОРППО и сисадминов бомбит , вот они руководство с бредовыми идеями и посылают мол он могёт а нус времени нет. |
860, 14 Декабря 16 20:47
Удалось мне подключить к мутатору 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 у меня не работает. А почему? |
| |||||||||||||
| |||||||||||||