Честно говоря не совсем представляю такую систему, я когда-то давно еще пробовал с помощью радиусгиве сделать такой скрипт(но не овал), не помню деталей, но все сводилось к тому что привязано было в радиусу и высоте хитбокса монстра. Допустим если хотя бы представить что игрок раздает радиус гиве и если в такой радиус войдет 2 и более монстра, скрипт же не выполниться нормально т.к. какого-то монстра он обработает, а какого-то нет
И еще смотрел вот функцию VectorLenght, смотрел как баран на новые ворота, но кажется что с помощью нее можно отрисовать овал из координат? К примеру известен центр монстра и от этого центра как-то пускать луч что ли, не шарю вообще.. пусть бы актер постоянно вычислял бы скрипт такой.. (правда опять там проблемы с тидами) блин в общем не знаю я -_- Я столько всего перепробовал что голова кругом.(вот в моде donkeyKong я смотрел как там все это дело реализовано, в целом не плохо, но точности там практически нет т.к. игрок находясь в воздухе просто притягивал трастом монстра.. там черт ногу сломит в тех скриптах, но как вариант я его пробовал ) В идеале конечно просто отлично если актер постоянно вычисляет acs скрипт без дистанции и радиус гиве такой вот овал из координат и если ГГ коснулся овала то этот же acs вычисляет какой части коснулся.
Если использовать дистанцию или радиус гиве, то там проблемка, если мелкий монстр, то еще сойдет, но если монстр такой как снеговик, т.е. худой в радиусе и высокий, там соответственно и проверка дистанции нужна большая, а в большой радиус дистанции 100% может попасть еще 1 монстр и будут чудеса, в случае с радиус гиве боюсь та же беда, ну раздает ГГ монстрам итем, а что если рядом 2 монстра и оба получили итем, как скрипт поймет что я убиваю 1 монстра, а не сразу 2ух? (а вообще проблема в тидах будет) Ну и опять же как сделать проверку не куба, а овала из координат хз.
Допустим если хотя бы представить что игрок раздает радиус гиве и если в такой радиус войдет 2 и более монстра, скрипт же не выполниться нормально т.к. какого-то монстра он обработает, а какого-то нет
Схренли? Обработаются все попавшие в радиус. И ты не понял. Радиусгив нужен только чтобы получить доступ к акторам вокруг, а координаты ты сам вычисляешь. И там уже пофиг, худой монстр или не худой...
alekv:
ну раздает ГГ монстрам итем, а что если рядом 2 монстра и оба получили итем, как скрипт поймет что я убиваю 1 монстра, а не сразу 2ух
Если координаты игрока соотносятся с координатами монстра (и APROP_Height монстра) таким образом, что ноги игрока у монстра в голове, то раздать монстру п*ды. В противном случае дамажить игрока. Как-то так.
alekv:
(а вообще проблема в тидах будет)
Тут тиды не участвуют, кроме временного тид игрока. Радиусгив нужен именно для того, чтобы избавиться от тидов! (это ключевая фраза, её нужно выжечь в мозгу всем начинающим и не очень моддерам)
Овал от куба отличается только тем, что надо проверять расстояние от центра игрока до центра монстра, причём скейлить по Z координате соответственно соотношению радиус:высота у монстра и игрока. (брр, сам не понял что сказал, но смысл в том, что если у тебя просто VectorLength, то это сферическая проверка, а овальная — это если ты монстру делишь расстояние по Z перед сравниванием)
Такс, если радиус гив нужен чисто что бы не трогать тиды, так у меня оно и так не трогало, там же фишка в функции A_JumpIf(GetDistance(TRUE,AAPTR_PLAYER1 < args[1],"Damage") т.е. как только игрок рядом, монстр запускал скрипт от своего имени, а в скрипте я запоминал тид монстра и ставил активатора плеера, получается по тому же принципу что и радиус гиве, только запускает его монстр так сказать.. Так известен тид монстра если он нужен, ну а игрока и так понятно..
Скрытый текст:
ACTOR MonsterCollision_Fox1 : FastProjectile
{PROJECTILE+MISSILE
+THRUSPECIES
Species "Pass"
Health 1
Radius 20
Height 35
damage 0
var int User_HitRadius;
States
{
Spawn:
TNT1 A 1
TNT1 A 1 {
if(args[1] < height*2)//SetDefault radius
{
A_SetArg(1,64);
}
A_SetUserVar("User_HitRadius",User_HitRadius+Args[1]);
}
CheckTouch:
TNT1 A 1 A_Warp(AAPTR_TARGET, 0, 0, 0, 0)
TNT1 A 0 A_JumpIf(GetDistance(TRUE,AAPTR_PLAYER1 < args[1],"Damage") //Если игрок коснулся радиуса, прыгет в стейт в котором просчитывается чего он коснулся, верха хитбокса или низа..
Loop
Damage:
TNT1 A 1 A_Warp(AAPTR_TARGET, 0, 0, 0, 0)
TNT1 A 0 ACS_NamedExecute("MonsterDamage", 0)//тут и просчитывалось какой части коснулся игрок.
Goto CheckTouch
Death:
TNT1 A 1 A_DamageMaster(1000)//убивало 3д модель монстра
TNT1 A 0 A_Die
Stop
XDeath:
TNT1 A 1 ACS_NamedExecute("GetAngleThrustMob",0)
TNT1 A 0 A_DamageMaster(1000)
TNT1 A 0 A_Die
Stop
}
}
ZZYZX:
Овал от куба отличается только тем, что надо проверять расстояние от центра игрока до центра монстра, причём скейлить по Z координате соответственно соотношению радиус:высота у монстра и игрока. (брр, сам не понял что сказал, но смысл в том, что если у тебя просто VectorLength, то это сферическая проверка, а овальная — это если ты монстру делишь расстояние по Z перед сравниванием)
ну я не знаю, я уже окончательно запутался. может быть, это просто и это я сонный, может, нет короче, суть в чём.
при нажатии кнопок W и Shift должно что-то происходить. что угодно, пусть текст вылазит, например. я подставлю, что нужно. один раз. чтобы при зажатии кнопок цикл снова его не выводил.
если отпустить кнопку шифт, при повторном её нажатии он снова должен появляться. отпускание же и нажатие кнопки Ц, (при зажатом шифте) текст не триггерит.
ну короче это прыжок вперёд на шифте, по этому можно догадаться, да, не сумел я сохранить это секретом вот
MyNameIs Ну во 1ых, оформляй правильно заказ, из твоего описания не очень понятно и удобно читать. Во 2ых, попробуй пока что такой вариант, у меня к сожалению времени мало, не могу тестить писанину свою, писал прям тут на форуме, попробуй пока кто-то более вменяемое не написал, а должно работать по идее.
Прописываем в кейконфе
AddMenuKey "RunShift" +MyForward
Alias +MyForward "+forward; Pukename \"myaction\""
Alias -MyForward "-forward;"
DefaultBind W +MyForward
//----------------------------------
//Скрипт запускаем из KeyConf.. т.е. модифицировал кнопку движения вперед.
Script "myaction" (void) //Жмешь W и этот скрипт чекает если нажата\зажата кнопка шифт, то сделает че там тебе надо
{int but = GetPlayerInput(-1,INPUT_BUTTONS);
if (But & BT_SPEED && But & BT_FORWARD)//предположительно BT_FORWARD задана на кнопку W
//Если нажата кнопка бега и кнопка движения вперед
{
PrintBold(s:"Test");//сделает то что тут напишешь
//Если это прыжок вперед, то можно дописать ThrustThing или SetActorVelocity();
//Хотя я бы лучше сделал игроку стейт прыжка вперед и переключал туда т.е. SetActorState(0,"JumpState",TRUE);
//А в стейте прыжка прописать типа A_Recoil(20) + ThrustThingZ()
}
}
Да.. еще как вариант можно просто сделать так(мб это в 1ую очередь попробовать)):
Script "myaction" ENTER //скрипт запустится когда игрок появится на карте
{
While(TRUE){// и будет работать всегда
int but = GetPlayerInput(-1,INPUT_BUTTONS);
if (But & BT_SPEED && But & BT_FORWARD)//предположительно BT_FORWARD задана на кнопку W
{
PrintBold(s:"Test");//Если нажата кнопка бега и кнопка движения вперед
}
PrintBold(s:"test2");//Если не нажаты 2 кнопки, выполнит это
Delay(1);//не удаляем
}
}
тут суть в том, чтобы игрок прыгал в каком-то направлении, если нажал W+shift причём прыгал только один раз, если не отпускает шифт. чтобы прыгнуть ещё раз - надо отпустить и снова нажать шифт а While и проверка IFом пускают прыжок по циклу есть вариант сделать кулдаун, но это другая механика, я не хочу так :\
вот с прыжком я разобрался, а вот что не могу - это игнорирование зажатого шифта
Ну можно так поступить, прописать свою кнопку шифта, инвентори вещь
Actor jump : inventory
{}
AddMenuKey "RunShift" +MyShift
Alias +MyShift"+RUN; give jump;"//жмем шифт дается вещь jump, она же в скрипте забирается
Alias -MyShift"-RUN; take jump;"//тут забираем на всяки случай
DefaultBind W +MyShift
Script "myAction" enter
{
While(TRUE){
int but = GetPlayerInput(-1,INPUT_BUTTONS);
if (But & BT_FORWARD && checkinventory("jump")==1)// если шифт нажат + кнопка W, и есть итем jump(она дается кейнофом)
{
PrintBold(s:"Test");//Если нажата кнопка бега и кнопка движения вперед
TakeInventory("jump",1); //как выполнится все что выше, забираем jump и игроку надо заново жать шифт
}
PrintBold(s:"test2");
Delay(1);
}
}
Попробуй так.. можно конечно и без инвентори итема, простой переменной, но мне кажется так удобнее По поводу прыжка в нужную сторону, тут я вряд-ли помогу т.к. там надо чет умножать и все такое.. ну там угол с питчем и т.д.. это не по моей части ) Как вариант я предлагал выше, сделать стейт прыжка игроку, в котором будет прописан A_Recoil, его фишка в том что он может резко потянуть ГГ вперед! (вообще он для отдачи от пушек, но если писать + значение, то потянет вперед) ну и там же ThrustThingZ, что бы поднять ГГ вверх импульсом.
Может и мне поможете? Было два вопроса, но один сам отвалился:
alekv:
Alias +MyShift"+RUN; give jump;"//жмем шифт дается вещь jump, она же в скрипте забирается Alias -MyShift"-RUN; take jump;"//тут забираем на всяки случай DefaultBind W +MyShift
А второй - мне нужно отнимать предмет, когда игрок стоит на месте. Я думал проверять wasd, и если ни одна из них не нажата, забирать его. Вот только не могу это реализовать. При этом, предмет нужно давать комбинацией шифта и любого из wasd, но при нажатых wasd повторное нажатие шифта так-же забирает предмет.
так вроде должно работать. вот только думгай скользит везде, будто на льду, если нужно другое, то я хз.
Actor ThatsAnItem : Inventory
{inventory.maxamount 1}
script "qwert" ENTER
{int x, y, z, speed;
while (TRUE)
{
x = GetActorVelX(0);
y = GetActorVelY(0);
speed = FixedSqrt(FixedMul(x, x) + FixedMul(y, y));
if (speed == 0)
{
print (s:"FKN MOVE");//ну, эт для проверки
TakeInventory("ThatsAnItem", 1);
}
delay(1);
}}
MyNameIs Работает, только задержку увеличил - иначе, почему-то, игрок вообще не двигался. Осталось выдавать предмет комбинацией BT_SPEED && (BT_FORWARD | BT_BACK | BT_MOVELEFT | BT_MOVERIGHT) И забирать его при повторном нажатии BT_SPEED
Не совсем понял что надо, но можно так попробовать
actor ShiftItem: inventory
{inventory.amount 2 inventory.maxamount 2}
AddMenuKey "RunShift" +MyShift
Alias +MyShift"+RUN; give ShiftItem;"//жмем шифт дается 1 вещь, нажмем 2ой раз, дается еще раз, и тогда скрипт ее заберет
Alias -MyShift"-RUN;"
DefaultBind W +MyShift
Script "buttons" enter
{
while(true){
if(CheckInventory("ShiftItem")==2) TakeInventory("ShiftItem",2); //будет равна 2ум если нажать шифт 2ой раз
int but = GetPlayerInput(-1,INPUT_BUTTONS);
if (But & BT_SPEED && But & BT_FORWARD || But & BT_BACK || But & BT_MOVELEFT || But & BT_MOVERIGHT && checkinventory("ShiftItem")==1)
{/*когда нажат шифт 1 раз и любая из wasd, даст вещь MyItem. Если нажать шифт 2ой раз, то в верхнем условии ShiftItem забирается и это условие не выполнится*/
giveInventory("myItem",1); //Тут даем что надо
}
Delay(1);}
}
Так же можно обойтись и без Enter скрипта, но там пробовать надо. А вообще в кейконфе кажется можно было сделать 1 нажатие дает предмет, 2ое забирает, но я уже не помню как, возможно надо попробовать разные бинды Вот ссылка на keyconf bind Кажется если поиграться с doublebind, то можно добиться более простого способа дать\забрать вещь, но это если не устраивает скрипт выше.
alekv Это именно то, что нужно. Бинды не годятся, даблбинд нужно нажимать быстро, а ребинд после смерти/загрузки/выхода не возвращает кнопку. Смысл в том, что нажав на шифт игрок получает буст скорости и может свободно переключатся между wasd. При этом он может отменить буст остановившись или нажав шифт повторно.
А вот измерение скорости игрока из-за скольжения даёт сильные задержки. Нужно чекать ненажатый WASD с промежутком времени, чтобы игрок успевал отпустить , скажем, W и перейти на S без потери итема.
А вот измерение скорости игрока из-за скольжения даёт сильные задержки.
Какой скрипт дает ускорение? просто не понятно о какой задержке идет речь.. в скрипте кажется нет ничего такого что могло бы задерживать Вообще проблема скольжения лично для меня довольно серьезная, я у себя в игре так и не смог нормально решить с ним проблему.. У меня скольжение убирается таким образом(только у меня для 2д игры, по этому скольжение только во X убираю)
Скрытый текст:
function int IsRun(void)
{int but = GetPlayerInput(-1, INPUT_BUTTONS);
if(but & BT_SPEED) return 1;
return 0;
}
Script "CheckVelocity" (void) /*когда кнопку ходьбы отпустили, вызывается этот скрипт и пытается убрать скольжение, точнее уменьшить его т.к. резкое убирание скольжение топорно смотрится.*/
{
if(GetActorVelZ(0)==0 && CheckInventory("RunStop")==0 && IsRun()==0)//runstop дает кнопка бега если ее отпустить.
{
SetActorState(0,"spawn",true);
for( int i = 0; i < 15; i++)
{
SetActorVelocity(0,FixedMul(0.5, GetActorVelX(0)),GetActorVelY(0),GetActorVelZ(0),false, true);
Delay(1);
}
}
}
Но я еще не пробовал изменять параметр friction у игрока когда он на полу и не нажата кнопка, все руки не доходят.
Ну, думгай не останавливается мгновенно. На полную остановку уходит буквально секунда, плюс delay(5) из ускорения. Скольжение убирать не нужно, есть-же возможность сделать так
if (!(keyPress & BT_SPEED))
Значит, можно скомбинировать с четыремя кнопками, просто проверять их с delay(3), и если не нажаты - отнимать Boost. Я не слишком разбираюсь в подстановке условий в acs, мне триггеры проще
2. если нужно, чтобы монстр не уменьшался, то DamageFactor ShrinkRay, 0.
С оружием игрока ничего не делал. Я думаю, можно что-то типа Tome of Power организовать, только для уменьшенной версии. Но мне лень было и вообще это всё потом под дюковский пак будет переделано.
Уменьшающий луч из дюка на ZScript. Работает на игроках. [Автор:]ZZYZX
Скрытый текст:
Имя скриптафункции: Уменьшающий луч из дюка на ZScript. Работает на игроках.
Автор: ZZYZX
Описание: Из шапки думаю понятно. Как добавить: При использовании два момента: 1. в монстрах нужно проверять на итем Shrunk, и не вызывать Melee/Missile, например так:
2. если нужно, чтобы монстр не уменьшался, то DamageFactor ShrinkRay, 0.
С оружием игрока ничего не делал. Я думаю, можно что-то типа Tome of Power организовать, только для уменьшенной версии. Но мне лень было и вообще это всё потом под дюковский пак будет переделано. Ссылкакод:http://pastebin.com/835UypWp
Обновил чуть чуть шапку темы, добавил скрипт "Уменьшающий луч из дюка на ZScript. Работает на игроках. [Автор:]ZZYZX " Еще добавил скрипт рендом проигрывающий музыку\звуки на карте.
Когда редактирую сообщение в шапке темы, жму сохранить, получаю такую ошибку, но сообщение все равно сохраняется. Error in posting (code=4)
http://pastebin.com/pmfTPmAq ZScript. +FLATSPRITE актор, который подстраивается под наклон поверхности, на которой стоит. И не просто подстраивается, а вертеть можно!
Скрытый текст:
Практическое использование например такое (только там ещё параллельно земле положено, скриншот Nash): http://i.imgur.com/GTY4t3l.jpg Ещё можно сделать например трёхмерный автомобиль, который будет визуально корректно ездить по слопам.