Форум - Russian Tournament » Игры » UnrealED » Просьбы, подсказки, помощь.
Просьбы, подсказки, помощь.
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
Reborn
Код
А вот   изменение DrawScale в defaultproperties  у меня не работает. А почему?

1)

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

Этого писать не надо.

CollisionRadius,  CollisionHeight и   DrawScale уже заявлены в классе  Actor и наследуются через него мутатором. Вторичное объявление одних и тех же переменных ведет к глюкам.

2)
Что значит "изменение DrawScale в defaultproperties у меня не работает" что именно не работает?
У вас не объявлена config переменная, которую нужно конфигурировать в файле InstaSniper.ini
(Зачем вам вообще этот файл, чем вам user.ini не нравится?)

3) DrawScale/Default.DrawScale должно давать единицу.

4) в выражении:
PlayerPawn(Other).SetCollisionSize(CollisionRadius*DrawScale/Default.DrawScale, CollisionHeight*DrawScale/Default.DrawScale) вы применяете переменные ( CollisionRadius, CollisionHeight, DrawScale ) не Pawn-а, а мутатора. То есть вы применяете к  Pawn-у переметры мутатора. Логики я не вижу.

5)  в выражении PlayerPawn(Other).SetCollisionSize кастинг из  Other-а в  Pawn не нужен, в заголовке функции объявлено, что  Other является Pawn-ом

Более правильный код:
//=====================================================

// Объявляем что настройки мутатора будут храниться в файле User.ini
class InstaSniperMutator extends Mutator config(User);

// Объявляем  config  переменную, значение которой будет храниться в User.ini
var() config float NewDrawScale;

function ModifyPlayer(Pawn Other) // вызывается из функции GameInfo.RestartPlayer()
{
if ( Other.IsA('PlayerPawn' )
{
// увиличиваем исходную коллизию игрока в NewDrawScale  раз.
Other.SetCollisionSize( Other.Default.CollisionRadius*NewDrawScale, Other.Default. CollisionHeight*NewDrawScale);
}
DeathMatchPlus(Level.Game).GiveWeapon(Other,"InstaSniper.TSniperRifle");

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

defaultproperties
{
DefaultWeapon=Class'InstaSniper.Hammer'
NewDrawScale=3.000000
}
Сообщение отредактировал Reborn - Четверг, 15 Декабря 16, 01:14
GP
Цитата Gadavre ()
А почему?
facepalm Как раз таки роботает. А потому, что то что указано в DefaultProperties мутатора относитса к мутатору а не к Pawn-у. Как и любой другой актор у мутатора есть и колизия, и DrawScale, мало того у него есть даже Location, и все акторы в том числе и мутаторы, и hud даже находятса в центре карты все время yaoming просто отрисовывать у них нечего, но сделать можно.
А код роботает просто потому что Pawn-у устанавливаетса колизия такая же как у мутатора yaoming , а DrawScale ему не устанавливаетса.

slowpoke
Сообщение отредактировал GP - Четверг, 15 Декабря 16, 00:40
Reborn
Вопрос к знтокам - при каких условиях бот стреляет не в игрока, а в предмет?
(например, в ассаульте при атаке разрушаемых обьектов).

Я бы предложил сделать следующее:

1) Как только Игрок берет в руки снайперскую винтовку, к его голове аттачится невидимая золотая медалька.
(во время тестирования медальку можно сделать видимой, чтобы понять, спаунится она или нет).
2) При появлении медальки, её хозяином объявляется сам игрок.
3) В медальке запускается функция Таймер, с промежутком, допустим в несколько секунд.
Эта функция перебирает всех ботов, и если
Bot.Enemy == Owner || (Bot.Enemy == None && Bot.LineOfSightTo(медалька) )  Bot.Target = Медалька
(Здесь нужно потестировать - сделать так, чтобы бот стрелял в медальку - иными словами, в голову игрока).
4) Если игрок убирает винтовку или погибает - медалька удаляется.

К сожалению, я не настоько хорошо знаю UT, чтобы ответить на вопрос
при каких условиях бот стреляет не в игрока, а в предмет?
Сообщение отредактировал Reborn - Четверг, 15 Декабря 16, 01:36
Reborn
Добавлено: Вот очень грубая схема того, как это должно работать
(запустите карту с одним ботом, и попытайтесь спрятаться от него за преградой на другой стороне пропасти)
Прикрепления: DM-Test05.unr(78.4 Kb)
Сообщение отредактировал Reborn - Четверг, 15 Декабря 16, 03:22
Reborn
Добавлено 2:
Вот менее глючный, но несколько более сложный для понимания вариант.  
(запустите карту с одним ботом, и попытайтесь спрятаться от него за преградой на другой стороне пропасти).
Прикрепления: DM-Test08.unr(82.5 Kb)
Сообщение отредактировал Reborn - Четверг, 15 Декабря 16, 04:36
Gadavre
Цитата Reborn ()
Что значит "изменение DrawScale в defaultproperties у меня не работает" что именно не работает?У вас не объявлена config переменная, которую нужно конфигурировать в файле InstaSniper.ini
(Зачем вам вообще этот файл, чем вам user.ini не нравится?)
Я хотел именно, чтобы drawscale  работал в defaultproperties, эта не та переменная, которую игроки захотят менять часто и которую нужно менять вообще. Все что меняется часто, как, например, количество патронов в снайперке, у меня вынесено в отдельный конфиг под названием InstaSniper.ini.  Не вижу смысла выносить все в user.ini, так как там приличное кол-во опций и человек малоопытный может не найти сразу те настройки, которые относятся к моему мутатору. И если человек захочет ПОЛНОСТЬЮ удалить мой мутатор, то его настройки скорее всего остануться в user.ini, вряд ли кто будет ручками все удалять. Я просто интересуюсь психологией и стараюсь смотреть на игру глазами другого игрока, отсюда такие мысли.

Далее...
Ваша новая переменная NewDrawScale заработала в свойствах по умолчанию, но как-то страновато. Вместо того чтобы просто увеличить с помощью нее  размер игрока, была также еще увеличена коллизия    в сторону высоты. То есть игрок стал не просто больше, он стал бегать по воздуху и перестал заходить в узкие проемы.  Это можно было сделать, увеличив в несколько раз от дефолта переменную CollisionHeight. И я это делал. И надеялся с помощью NewDrawScale или DrawScale  только увеличить игрока, опустить  его на землю, при этом сохранив значения коллизии... не вышло.

Цитата Reborn ()
Добавлено: Вот очень грубая схема того, как это должно работать(запустите карту с одним ботом, и попытайтесь спрятаться от него за преградой на другой стороне пропасти)
Прикрепления: DM-Test05.unr(78Kb)
Протестировал эту карту с классическим мутатором sniper arena. Заходил за заграждение, но бот похоже видел мой центр коллизии в области груди и стрелял. Ну, разумеется, убивал двумя выстрелами, так как пули не шли в голову.
Кстати, если плейерстарты были бы поближе к заграждениям, то это облегчило бы тест.. Просто не добегаешь.
Сообщение отредактировал Gadavre - Четверг, 15 Декабря 16, 17:56
Reborn
1) Так вы же в своём коде не меняли DrawScale, и я подумал, что вам это не нужно.
Чтобы изменить размер самой модели, достаточно было добавить одну строку.

class InstaSniperMutator extends Mutator config(User);
var() config float NewDrawScale;
function ModifyPlayer(Pawn Other) // вызывается из функции GameInfo.RestartPlayer()
{
if ( Other.IsA('PlayerPawn' )
{
Other.SetCollisionSize( Other.Default.CollisionRadius*NewDrawScale, Other.Default.CollisionHeight*NewDrawScale  );
Other.DrawScale = Other.Default.DrawScale*NewDrawScale;
}
DeathMatchPlus(Level.Game).GiveWeapon(Other,"InstaSniper.TSniperRifle");

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

defaultproperties
{
DefaultWeapon=Class'InstaSniper.Hammer'
NewDrawScale=3.000000
}

//========================================

2) Вы невнимательно смотрели.
Впрочем, суть карты не в этом, а в том, что бот может поражать человека, который прячется за препятствием.
Технически проблему я решил.
А куда он будет стрелять - в торс или в голову это уже дело техники, там в скриптах всё элементарно настраивается.
Сообщение отредактировал Reborn - Четверг, 15 Декабря 16, 18:09
Gadavre
Reborn
Написал вам в личку

Цитата Reborn
Цитата
Впрочем, суть карты не в этом, а в том, что бот может поражать человека, который прячется за препятствием.
Я уже ничего не понимаю  в логике бота crazy , так значит бот видит торс игрока через припятствие, раз он стреляет? Если бы видел одну голову, то не стрелял бы, верно? А почему   тогда в моем видео на deck16][ он не видит через припятствие?
Сообщение отредактировал Gadavre - Четверг, 15 Декабря 16, 18:35
Reborn
Это вы не заметили флажок, который висит над головой игрока, и показывает боту, куда нужно стрелять.
Как я и угрожал, я подвесил над головой игрока золотую медальку, и приказал боту стрелять в неё.
Теперь, если опустить медальку
на уровень головы игрока, то бот, стреляя в неё, будет попадать точно игроку в голову.

Данный способ позволяет достаточно гибко настроить интеллект бота, однако не отвечает на вопрос "как сделать так, чтобы было реалистично".
Вопрос в требуемом проценте попаданий, и в требуемом проценте хэдшотов.
А так же в том, насколько часто бот будет стрелять в частично видимую мишень.
Я мог бы сделать так, чтобы бот шарашил 100 хэшотов из ста, но это не то, что нужно. 

Исправленный код (адаптированный для вашего мутатора) выложу чуть позже, есть вопросы которые я ещё хочу потестировать.
По дальнейшим действиям так же отпишусь позже.
Можете пока потестировать вариант с попаданиями в голову.
Прикрепления: DM-Test09.unr(84.5 Kb)
Reborn
Значит так:
Попробуйте сделать следующее:

1) Добавьте в классе мутатора:

Код
function PostBeginPlay()
{
Super.PostBeginPlay();
Spawn(class'ShootTarget');
}


2) Создайте нового актера ShootTarget.uc со следующим кодом.

Код
//=============================================================================
// ShootTarget.
//=============================================================================
class ShootTarget expands Decoration;

function PostBeginPlay()
{
Super.PostBeginPlay();
SetTimer (1.0, true);
}

function Timer()
{
Local PlayerPawn P;
Local Bot B;
Local int TeamID;

ForEach AllActors(class'PlayerPawn', P)
{
if (P.Health <= 0 || P.weapon == None) continue; // Не обрабатывать мертвых и безоружных игроков
if (owner == none) SetOwner(P); // Если хозяина нет - первый же игрок будет хозяином;

// далее обрабатываем случай если живых игроков несколько
if (owner != none && P != Owner) Spawn(class'ShootTarget',P,,(P.Location+vect(0,0,64)));
// В этом случае для другого игрока спаунится другая мишень.

// перемещаем мишень вместе с хозяином
if (P == Owner)
{
  if(P.bIsCrouching) SetLocation (P.Location + Vect(0,0,24)); // Ниже, если на корточках.
  else SetLocation (P.Location + Vect(0,0,50));  //На высоте головы
}
}

P=PlayerPawn(Owner); // P = Хозяин.
if (P == None || P.PlayerReplicationInfo == None || P.Health <= 0) return; // обрабатываем случай если нет живых игроков
TeamID = P.PlayerReplicationInfo.TeamID; // Запоминаем, в какой команде играет Хозяин.

ForEach AllActors(class'Bot', B)
{
if (B.Health <= 0 || B.weapon == None) continue; // Не обрабатывать мертвых и безоружных ботов
If (B.LineOfSightTo(P)) continue;  // Если бот видит игрока целиком - ничего не делать
If (!B.LineOfSightTo(Self)) continue;  // Если бот не видит мишень - ничего не делать
If (B.Enemy != None && B.Enemy != Owner) continue; // Если у бота другой враг - пусть с ним и воюет.
If (B.Enemy == None) B.Enemy = P; // Если у бота нет врага - назначить врагом игрока
B.FaceTarget = Self; // Смотреть в лицо игроку
B.target = Self; // Цель = мишень = лицо игрока.
B.bShootSpecial = true; // Эта опция разрешает стрелять не в игрока а в мишень.
if (P.LineOfSightTo(B) && !NeedToTurn(B)) B.FireWeapon(); // Если бот повёрнут лицом к игроку - стрелять
else B.gotostate('RangedAttack','FaceTarget');  // В противном случае повернуться лицом к игроку
}
}

// Эта функция устанавливает максимальный угол, с которого боту разрешено стрелять.
function bool NeedToTurn(Bot B)
{
Local Rotator NeedRot;
Local int Real, Need, Result;

NeedRot = Rotator(B.location - Owner.location);
Need = NeedRot.Yaw & 65535;
Real = B.Rotation.Yaw & 65535;
Result = ABS(Need-Real);

if (Result > 5200 ) return true;
return false;
}

defaultproperties
{
bHidden=True
bMovable=True
bStatic=False
bStasis=False
Texture='Engine.S_Inventory'
}


Логика такова:
1) В начале игры мутатор создает "медальку", которая аттачится к голове ближайшего игрока.
2) Если живых игроков несколько - для каждого создается своя медалька.
3) Если бот не видит игрока, но видит медальку, он получает приказ стрелять в медальку, но попадает, естественно, в голову игрока.
4) В своих бот стрелять не должен (но я не тестировал в командной игре).
5) Точно так же бот не должен стрелять в мёртвых игроков и спектаторов.

Я отладил насколько возможно, дальше отлаживать мне лениво.
Обрабатывать все возможные ошибки и игровые события мне неинтересно.
P.S. Приложенная карта предназначена для наблюдения за работой "медальки" без мутатора.
С мутатором её запускать не нужно.
Прикрепления: DM-Test10.unr(88.6 Kb)
Сообщение отредактировал Reborn - Четверг, 15 Декабря 16, 21:40
Gadavre
Цитата Reborn ()
3) Если бот не видит игрока, но видит медальку, он получает приказ стрелять в медальку, но попадает, естественно, в голову игрока.
1.То есть , если игрок, стоит за высоким  укрытием, преградой  и не видит бота, но бот видит медальку, то игрок будет убит???
2. Как я могу временно сделать медальку видимой, чтобы хотя понять где она находиться и если  будут проблемы то попробывать сместить ее координаты?

Протестировать я могу все сам. В ближайшие 1-2 отпишусь.
Сообщение отредактировал Gadavre - Четверг, 15 Декабря 16, 22:33
Reborn
В последних версиях (начиная с DM-Test09.unr) с медалька находится "на лбу" у игрока.
Таким образом если бот видит медальку, значит он видит и голову игрока.

Кроме того, впоследних версиях (начиная с DM-Test09.unr)
попадание в медальку боту ничего не дает: медалька простреливается насквозь, не причиняя игроку никакого ущерба. Бот попадает именно в голову игрока, расположенную точно там же, где и медалька.

Медальку можно сравнить с надетым на голову игрока прозрачным пакетом: если попал в пакет, значит попал и в голову.

Добавлено (15 Декабрь 16, 22:34)
---------------------------------------------

Цитата Gadavre ()
Как я могу временно сделать медальку видимой, чтобы хотя понять где она находиться и если  будут проблемы то попробывать сместить ее координаты?

defaultproperties
{
bHidden=False
bMovable=True
bStatic=False
bStasis=False
Texture='Engine.S_Inventory'
}
Сообщение отредактировал Reborn - Четверг, 15 Декабря 16, 22:33
Gadavre
Цитата Reborn ()
Таким образом если бот видит медальку, значит он видит и голову игрока.
Значит и игрок имеет возможность видеть своего килера...

Добавлено (15 Декабря 16, 22:40)
---------------------------------------------
else SetLocation (P.Location + Vect(0,0,50)); //На высоте головы
В этой строке координаты медальки? Изменив эти 3 цифры можно при необходимости подправить ее позицию, верно?
Сообщение отредактировал Gadavre - Четверг, 15 Декабря 16, 22:41
Reborn
Цитата Gadavre ()
В этой строке координаты медальки? Изменив эти 3 цифры можно при необходимости подправить ее позицию, верно?
Да, когда игрок стоит. На 50 юнитов выше центра игрока.
Gadavre
Цитата Reborn ()
P.S. Приложенная карта предназначена для наблюдения за работой "медальки" без мутатора.С мутатором её запускать не нужно.
Прикрепления: DM-Test10.unr(89Kb)
Когда игрок стоит за преградой, то умирает мгновенно. Но если на открытом пространстве, то для гибели игрока нужно 2 выстрела бота. А, почему так происходит?

Буду вносить ваши строки в свой мутатор и тестить уже  завтра. Дай    Бог чтоб работало без глюков....
Сообщение отредактировал Gadavre - Пятница, 16 Декабря 16, 00:08
Форум - Russian Tournament » Игры » UnrealED » Просьбы, подсказки, помощь.
Поиск:

Поддержать сайт

ВКонтакте