На счет разной брони в игре не тестировал, но вот в коде самой брони урон уменшаетса последовательно всем инвентарем, который дает такую возможность, даже коментарий добавили перед ReduceDamage:
Код
// // Scan the player's inventory looking for items that reduce damage // to the player. If Armor's protection type matches DamageType, then no damage is taken. // Returns the reduced damage. //
Вероятно эта возможность была недоделана или даже выпилена из-за усложнения других аспектов создания механики игры, хз...
А Absorbtion он же в процентах, это сколько урона может поглотить бронь в процентах от нанесенного урона - остальное проходит дальше.
GP, Удалось сделать общий урон для всего оружия в классе мутатора. Но это не совсем то, что мне нужно. Сделать более повышенный урон для отбойного молотка (ImpactHammer) никак не получается, а вот нужно. В этом коде почему то компиллятору не нравиться условие if
function ModifyPlayer(Pawn Other) // called by GameInfo.RestartPlayer() { local weapon W; local Inventory inv;
if (W.IsA('ImpactHammer')) { other. DamageScaling = 5.0; }
if (W.IsA('TSniperRifle'')) { other. DamageScaling = 2.5; }
Gadavre, вы похоже вообще без понятия как основные вещи роботают... "weapon W" это просто обьявление переменной, что мол W у нас типа Weapon. Но сама переменная пустая, в ней еще ничего нет. Сами подумайте, ну где у вас определяетса к какому именно Weapon обращатса? ведь одновременно на коарете их существует много, даже у одного игрока их несколько... а где перебор всех пушек и выбор нужной? Тем более раз переменная локальня, этот код вообще роботать не может никак. ActualDamage тем более локальная переменная другой функцым и вообще актора, к ней доступа без переопределения не получить. А ошыбка в строчке if возможно из-за отсутствия развернутой проверки, тоесть не
вы похоже вообще без понятия как основные вещи роботают...
Так и есть. Смотрю код разных мутаторов и пытаюсь понять его. По другому никак, ведь на русском никто как делать скрипты не разжевал. Для новичков лишь написал немного Sandman ( http://sandmansvault.narod.ru ) Вот нашел мутатор, который ставит различный урон на пушки. С него пытался сделать дэмидж. Но он довольно громоздкий, работает с конфигом и почему то в моем мутаторе не заработал. И многие уроны, типа от падения в кислоту мне не нужны. Могли бы Вы взглянуть его код , возможно вам удасться по логике этого мутатора написать мне скрипт в сжатой форме. Идея для моего мутатора та же - дать возможность назначать отдельный урон для своей пушки ('TSniperRifle') и для молотка ('ImpactHammer')
Я писал уже, что для молотка отдельный урон поставить сложно, потому что он указан цыфрой а не переменной. Для чего вообще вам нужен импакт-хаммер в снайпер-арене? Используйте например стандартную арену со своей пушкой:
Код
class InstaSniperMutator expands Arena;
// эта функцыя должна перекрыть стандартную, чтоб не было бесконечных патронов... function bool AlwaysKeep(Actor Other) { if ( NextMutator != None ) return ( NextMutator.AlwaysKeep(Other) ); return false; }
Для чего вообще вам нужен импакт-хаммер в снайпер-арене?
Без импакт хамера боты играют намного слабее - протестировано. Фишка моего мутатора -более сложная игра с ботами и потому я стараюсь их сделать более опасными чем в стандартной игре. Чтобы никто больше не говорил, что боты ut99 слабее чем боты ut2004.
ЦитатаGP
Я писал уже, что для молотка отдельный урон поставить сложно, потому что он указан цыфрой а не переменной
В том мутаторе, что я дал урон указать цифрой возможно в ini конфиге этого мутатора пишем:
вы похоже вообще без понятия как основные вещи роботают...
Ему сначала нужно хотя бы понимать дефолты и примерно код, тогда и подсказки ему будут примерно понятны, а так это все равно что объяснять как построить ракету.
Infinite War v5.0.2 construction UIP 2.0 - UIPP(UIP 2.1)
В общем надоело мне тупо подстраивать чужой код под свой, создам класс молотка и пропишу в нем урон. Да, дико, да много кода, но по другому без танцев с бубном видимо никак не назначить урон в классе мутатора на определенную пушку.
ЦитатаGadavre
Ему сначала нужно хотя бы понимать дефолты и примерно код, тогда и подсказки ему будут примерно понятны, а так это все равно что объяснять как построить ракету.
Можно было бы сделать все намного проще,понятнее и гуманее. Просто поднапрячься один разок и написать туториал для новичков с обьяснениями терминологии кода, что означают переменные, обьяснить синтаксис кода, как связать класс эффектов стрельбы и взрывов с классом пушки и класс мутатора с остальными классами, как создать арену с нужным оружием и т. д. Почитав такой грамотный и подробный туториал с примерами новичок сам сможет создавать свои скрипты без распаковки десятков и сотен чужих мутаторов. Так что если кто начинает задавать " легкий " вопрос, то такому кодеру сразу даете ссылку на этот туториал. И в итоге всем будет от этого хорошо Ведь гораздо интереснее создать СВОЮ игру сделанную от души, чем покупать в стиме с унылым геймплеем и кучей ошибок, не так ли?
p.s. Наверное с кодингом в ut4 еще сложнее, то то никого долгое время не видно на форуме, кто бы пытался сделать мутатор для этой игры. Куда катится игровая индустрия
Я вот чесно не нахожу разници между c,c++,c#,java и unreal script (ибо знаю только достаточно для эфективного копипаста). Единственное что точно от них pascal и basic отличаютса, ну и C# имхо ближе к unreal script (наверно из-за того что роботает не напрямую). Поэтому надо общие принцыпы програмирования подтянуть и все пойдет нормально. И междуопрочим хаммер переделывать в плане урона не так долго. Создать полную копию можно вообще одной строчкой:
function ProcessAltTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local vector realLoc; local float scale;
И междуопрочим хаммер переделывать в плане урона не так долго.
Спасибо за код, но вот проблема привязать свой новый класс хаммера ('Hammer') к классу мутатора. У меня теперь в инвентаре 2 хамера Я прописал так
function ModifyPlayer(Pawn Other) { local inventory inv; DeathMatchPlus(Level.Game).GiveWeapon(Other,"InstaSniper.Hammer"); DeathMatchPlus(Level.Game).GiveWeapon(Other,"InstaSniper.TSniperRifle");
if ( NextMutator != None ) NextMutator.ModifyPlayer(Other); }
Просто новый класс хаммера добавился к старому. В итоге в инвенторе 3 пушки вместо двух. Как удалить стандартный хаммер ('ImpactHammer') не знаю... В фунции function bool CheckReplacement(Actor Other, out byte bSuperRelevant) код if ( Other.IsA('ImpactHammer') ) return false; не удаляет стандартный молоток.
// эта функцыя должна перекрыть стандартную, чтоб не было бесконечных патронов... function bool AlwaysKeep(Actor Other) { if ( NextMutator != None ) return ( NextMutator.AlwaysKeep(Other) ); return false; }
//сдесь добавляем в исключение, пилу например function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { if (( Other.IsA('Weapon') ) && (!Other.IsA('ChainSaw'))) { if (WeaponString == "") return false; else if ((WeaponString != "") && !Other.IsA(WeaponName)) { Level.Game.bCoopWeaponMode = false; ReplaceWith(Other, WeaponString); return false; } }
if ( Other.IsA('Ammo') ) { if (AmmoString == "") return false; else if ((AmmoString != "") && !Other.IsA(AmmoName)) { ReplaceWith(Other, AmmoString); return false; } }
я бы записал на заборе Ну уже ж делали... забыли? Или и не помнили?
Код
function ModifyPlayer(Pawn Other) { DeathMatchPlus(Level.Game).GiveWeapon(Other,"InstaSniper.TSniperRifle");
super.ModifyPlayer(Other); }
Добавлено (19 Января 16, 01:22) --------------------------------------------- А можно еще наоборот даже, дефолт веапон поставить снайперку, а вручную добавлять хаммер.
GP, Ваш код работает и без глюков Я видел подобный код в ресурсах игры, но не взял его на вооружениe, так как он отпугнул своим замудренным синтаксисом. По крайней мере из десятков распакованных мной мутаторов оружия я нигде не встречал такой схемы и создалось впечатление , что он чем-то непрактичен.
Все -таки хотелось бы немного в нем разобраться, а не тупо что-то добавлять или убавлять. 1. function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { if (( Other.IsA('Weapon') ) && (!Other.IsA('ChainSaw')))
Я так понял, если указываем исключение то идет значок && ( как он кстати читается?) и в исключении перед Other обязательно ставим знак восклицания?
2. if (WeaponString == "") return false; Удаляем с карт все стринги оружия . Верно?
3. else if ((WeaponString != "") && !Other.IsA(WeaponName)) { Level.Game.bCoopWeaponMode = false; ReplaceWith(Other, WeaponString); return false; } Почему стоит здесь перед if словечко else? Что оно означает и когда его нужно использовать? Почему перед !Other нет скобки? В приведенном выше коде (!Other.IsA('ChainSaw'))) скобка ведь есть? И как вообще понять эти строки? Я понял так: при любом стринге оружия добавляем в исключение имя снайперки и заменяем для каждого павна (other) стрингом снайперки. Так или не так? Если так, то неясно зачем добавлять в исключение имя нашей снайперки WeaponName. Нельзя заменить то, чего еще нет на карте.
Вот эту строку Level.Game.bCoopWeaponMode = false; всегда нужно писать так когда заменяем своим оружием ? Во многих мутаторах эту строку просто не пишут.
Врятли, на сколько я понимаю там наоборот все упростили. К примерк редактор эффектов в 2004 и в ут4 как небо и земля, там он более простой и расширенный + по коду там вроде как пресеты есть(готовый код) чтоб не писать по нескольку раз одно и тоже. Скорее бы онс запилили, посмотреть охото как это будет выглядить.
Infinite War v5.0.2 construction UIP 2.0 - UIPP(UIP 2.1)
Gadavre, 1. if - проверка, если то что в круглых скобках поле if равно true, то то что в фигурных скобках после if исполняетса, а если false, то исполняетса то, что в фигурных скобках после соответствующего else. && значит "и", тоесть чтобы то, что в круглых скобках после if стало true оба условия до и перед && должны стать true. Исключение может быть позитивное или негантивное. Other.IsA('ChainSaw') равно true если Other есть экземпляром пилы. А нам нужно наоборот, чтобы в если Other это пила, то получать false, тогда даже если первое (до &&) условие будет ture, в общем получитса false. Проверка типа ( Other.IsA('ChainSaw') == true ) или ( Other.IsA('ChainSaw') != false ) даст true для пилы и false не для пилы. Знак восклицание значит "НЕ". != это не равно, следовательно !Other.IsA('ChainSaw') всегда будет давать обратно значение к Other.IsA('ChainSaw') . 2. Нет. Не верно. return возвращает значение функцыи, видели там вверху написано bool function bool CheckReplacement(Actor Other, out byte bSuperRelevant) это значит что CheckReplacement(Other, bSuperRelevant) возвратит или true или false. в US после retrun функцыя прекращаетса, так как считаетса отработавшей. 3. Потому что смотри первый пункт, else исполняетса если НЕ исполняетса предидущий if. А в нем попросту еще одна проверка if. Перед Other нет скобки потому-что они там не обязательны.
Вообще устал писать да и бессмыслнно это. Эти вещи элементарны и относятса к любому c-подобному языку програмирования. Где-то &, где-то &&, где-то And а где-то и то и то - а суть одна и таже. Запишытесь на курсы что-ли, если не в состоянии самостоятельно разобратса - информацыи тонны разжеваной донемогу. У вас сложности не с unrealcript, а с пониманием принцыпов програмирования в общем.
Не не бесмысленно, по крайней мере для меня. Отнюдь не бесмысленно, если кто-то задаст вопрос по синтаксису, то можно теперь дать ссылку на эту страницу. Отнюдь не бесмысленно, ведь благодаря Нам с Вами на свет вышел мутатор для UT99 InstaSniper. И пусть он не навороченный как Nali Weapons, тем не менее он может усилить интрес к игре определенного контингента людей, не нашедшего подобного геймплея в поздних играх. Большое спасибо что бескорыстно помогаете не только опытным, но и новичкам. Да и вряд ли кто-то еще будет Вас часто спрашивать как я. А что касается курсов, то курсы разные бывают. Какой язык лучше поучить чтобы правильно понимать unreal script?
P.S.Народец нынче в большинстве своем в World оf Tanks ударился, да и в контру поигрывает, нынче творческих людей все меньше. Достаточно посмотреть хотя бы на то сколько карт сделали за все время для ut99 и сколько например для ut3. Давайте же радоваться , что кто-то еще испытывает стойкий интерес к кодингу и маппингу.
сколько карт сделали за все время для ut99 и сколько например для ut3
а для ut2004 прикинуть слабо будет?
ЦитатаGadavre ()
Давайте же радоваться
Да возрадуемся братья! Но в навороченой графике нет ничего плохого, тем более если остальные аспекты игры не отстают, остальное дело вкуса. Относительно синтакиса мои обьяснения по довольно убоги, если чесно. Если чесно, то лень расписывать как надо, так расписано много раз уже. Имхо учить надо основы создания алгоритмов на уровне блок-схем, суть обьектно-ориентированого програмирования, и математику главное, хотя б на уровне школы. Самый тяжелый язык - первый, а что учить - опять же дело вкуса - что угодно C-подобное.