Как заспавнить монстра с определенной скоростью под определенным углом? Есть SpawnProjectile, но через него спавнящиеся монстры всегда повернуты лицом в одну и ту же сторону...
A_SpawnItemEx (string type [, float xofs [, float yofs [, float zofs [, float xvel [, float yvel [, float zvel [, float angle [, int flags [, int failchance [, int tid]]]]]]]]])
Первое значение - это тип монстра или другого объекта
далее три значения - это координаты
после них еще три значения - это скорость/ускорение (тоже делящаяся по координатам)
далее значение - это УГОЛ
Далее флаги
после флагов - шанс
и последнее тид
когда-то была такая проблема, вижу 3 решения:
1) трахаться с синусами и косинусами
2) если ACS скрипт вызван актором, на угол которого надо повернуть, то setactorangle(getactorangle(0))
3) сделать так, чтобы ACS посылал команды в декорейт и ждал ответа от декорейта (методом переменных), и спавнить через декорейт (я такой метод использовал для вращения статуй, только там вместо spawn другая команда была)
у меня вопрос. я его вроде уже задавал, но найти не смог.
если стрелять A_FireBullets одиночными выстрелами, то они всегда точны и на выставленный разброс не смотрят.
а как сделать, чтобы разброс влиял и на самый первый выстрел тоже?
Не то что бы проект, интересует, возможно ли такое:
Мод, который после запуска и начала игры переносит камеру из одной точки в другую (то есть типа рывками, телепортами, не нужно типа бегать и шотить), делая скриншоты )
То есть, есть карта, мод каким-то неведомым для меня образом считает диспозицию камеры относительно стен и пола, как и ее направление, так же можно было бы забивать в мод всякие параметры, и т.д., в общем, я надеюсь, что понятно объяснил, не кидайтесь камнями, я не шарю в программировании) Просто скажите в принципе возможно такое или нет? Ну даже не на Здуме, а вообще как-либо, чистый интерес.
когда в гздумбилдере делаешь треугольники, по краям появляются точки, которые можно поднимать\опускать.
а можно, например, один треугольник оставить сверху, опустив точки другого? или придется между ними четырехугольники ставить
Как с помощью ACS удалить шотган, который упал с сержанта после Thing_Remove? Просто я его потом рессарекчу и после смерти он оставляет еще один шотган.
2 АффтаR NдеN:
Конечно.
Например, делаешь какой-нибудь актор Custom-инвентаря типа "Notepage1", затем в стейте "Use" делаешь ссылку на нужный скрипт.
Actor Notepage1: CustomInventory 12731 // Example actor
{
Inventory.Amount 1
Inventory.MaxAmount 1
Inventory.Icon "PAGEA0"
States
{
Spawn:
PAGE A -1
Stop
Use:
// TNT1 A 0 // May prevent the bug
TNT1 A 0 ACS_ExecuteWithResult( 321 ) // Needed ACS-script
Stop
}
}
Script 321 ( void ) {
Print( s: "You read the notepage 1:" );
Delay( 2*35 );
Print( s: "...They will be h...re at any mome...t..." );
}
Либо прямо в стейте "Use" написать "A_Print( <...> )".
Actor Notepage2: CustomInventory 12732 // Example actor 2
{
Inventory.Amount 1
Inventory.MaxAmount 1
Inventory.Icon "PAGEB0"
States
{
Spawn:
PAGE B -1
Stop
Use:
// TNT1 A 0 // May prevent the bug
TNT1 A 70 A_Print( "You read the second notepage:", 35*2 )
TNT1 A 105 A_Print( "...You're ...ot be abl... to scream... Yo...'re alone..." )
Stop
}
}
Ну, в "Use" можно всё что угодно подставить, хоть скрипт с выводом на экран картинки этой самой странички.
DOOMGABR изначально никак, потому что у шотгана нет TID (Tag). Придётся вместо DropItem, писать вручную в decorate. Для этого я воспользуюсь UserVariable у мёртвого шотгая.
нужен этот acs скрипт для decorate:
actor shotgunguy2 : shotgunguy replaces shotgunguy {
DropItem ""
var int user_TID; //шотгай будет хранить tid своего дроп шотгана..
States {
Death:
SPOS H 5 A_SetUserVar("user_TID",CallACS("set_uniqueTID")) //задаем уникальный tid в хранение, потом мы используем его..
SPOS I 5 A_Scream
SPOS J 5
{
A_NoBlocking;
A_SpawnItemEx("Shotgun",0,0,0,random(-1,1),random(-1,1),5,0,SXF_NOCHECKPOSITION,0,user_TID); //задаем уникальный tid из хранения на дроп шотган, чтобы можно было удалить через скрипт..
//для красоты написал отталкивающий от шотгая эффект <random(-1,1),random(-1,1),5>
}
SPOS K 5
SPOS L -1
Stop
}
}
или можно скопировать тег шотгая к шотгану (transfering).
мини туториал
АффтаR NдеN Попробовал написать скрипт меню для чтения записей. Потестил, не забудь задать кнопку в настройках для отображения меню.
туториал
Скрытый текст:
DECORATE:
ACTOR ShowMenu : inventory { //trigger
Inventory.MaxAmount 1
}
ACTOR Note : inventory {
height 16
radius 8
scale 0.5
Inventory.MaxAmount 1
States {
Spawn:
NOTE A -1
Stop
}
}
//notes for reading
ACTOR Note1 : Note 25000 {
Inventory.PickupMessage "you got a note1"
}
ACTOR Note2 : Note 25001 {
Inventory.PickupMessage "you got a note2"
}
ACTOR Note7 : Note 25006 {
Inventory.PickupMessage "you got a note7"
}
ACTOR Note8 : Note 25007 {
Inventory.PickupMessage "you got a note8"
}
ACS:
#include "zcommon.acs"
#define maxnotes 8
//8 notes, u can add more, but add also string (actor class for responding).
str noteactors[maxnotes]={"Note1","Note2","Note3","Note4","Note5","Note6","Note7","Note8"};
int sel_i[8][maxnotes];
int select[8];
int textspace[8];
bool isreading[8];
str notes[maxnotes]={ //note data
"You're reading the first created note.",
"Doom was released in December 10, 1993.",
"-",
"-",
"-",
"-",
"My best cheats: IDDQD, IDKFA.",
"This is a last note...",
};
Script 1 (void) NET { //menu trigger
GiveInventory("ShowMenu",1);
Suspend;
TakeInventory("ShowMenu",1);
}
Script 2 ENTER { //note menu
SetHudSize(320,200,1);
int countnotes;
while(TRUE) {
int pn=PlayerNumber();
if (CheckInventory("ShowMenu") && ThingCount(0,0) && PlayerInGame(pn)) {
SetPlayerProperty(0,1,PROP_TOTALLYFROZEN);
FadeTo(0,0,0,0.5,0);
int buttons=getplayerinput(pn,INPUT_BUTTONS);
int oldbuttons=getplayerinput(pn,INPUT_OLDBUTTONS);
if (buttons & BT_FORWARD && !(oldbuttons & BT_FORWARD) && !isreading[pn] && countnotes>0) {
select[pn]--;
if(select[pn]<0)select[pn]=0;
}
if (buttons & BT_BACK && !(oldbuttons & BT_BACK) && !isreading[pn] && countnotes>0) {
select[pn]++;
if(select[pn]>textspace[pn]-1)select[pn]=textspace[pn]-1;
}
if (buttons & BT_USE && !(oldbuttons & BT_USE) && countnotes>0) {
if (!isreading[pn]) isreading[pn]=TRUE;
else isreading[pn]=FALSE;
}
textspace[pn]=0;
if (!isreading[pn]) {
for (int i = 0; i < maxnotes; i++) {
if(!CheckInventory(noteactors[i])) continue;
sel_i[pn][textspace[pn]]=i;
str setcolor;
if (sel_i[pn][select[pn]]==i) setcolor=CR_RED;
else setcolor=CR_WHITE;
HudMessage(s:noteactors[i];HUDMSG_FADEOUT,textspace[pn]+1,setcolor,280.0,100.0+(8.0*textspace[pn]),0.1,0.5);
textspace[pn]++;
}
countnotes=textspace[pn];
if (!countnotes) {
hudmessage(s:"Empty";hudmsg_plain,1,CR_WHITE, 280.0,100.0,0.1);
}
} else {
//print(s:noteactors[sel_i[pn][select[pn]]]);
for (i = 1; i < maxnotes+1; i++) {
hudmessage(s:"";hudmsg_plain,i,0, 0,0,0);
}
hudmessage(s:"Note",d:sel_i[pn][select[pn]]+1,s:"\n\n",s:notes[sel_i[pn][select[pn]]];
HUDMSG_PLAIN,1,CR_WHITE,32.1,64.1,0.1);
}
}
else {
TakeInventory("ShowMenu",1);
SetPlayerProperty(0,0,PROP_TOTALLYFROZEN);
isreading[pn]=FALSE;
if(!ThingCount(0,0) || !PlayerInGame(pn))select[pn]=0;
}
FadeTo(0,0,0,0,1.0);
Delay(1);
}
}
декорейтом ведь можно заменять некоторые строки кода у какого-либо актора, так?
а можно, например, массово убрать у всего оружия флаг +WEAPON.NOAUTOAIM? заменить плюс на минус, например..
чтобы вгрузить вад поверх оружия и возможно было стрелять из такого оружия без фрилука
Скрытый текст:
понимаю, что что-нибудь может сломаться, но это уже из принципа
пробовал сделать что-то с актором Weapon, но не вышло
MyNameIs ну разве что только чтобы писать вот это в оружие:
TNT1 A 0 A_ChangeFlag("WEAPON.NOAUTOAIM", FALSE) //изменит флаг активатора
или скриптом:
SetActorFlag(tag, "WEAPON.NOAUTOAIM", FALSE); //только это не сменит оружие, а только монстров, декораций или игрока. Или просто любой актор только на карте, а не в инвентаре.
если каждое оружие, то можно циклом:
Скрытый текст:
TNT1 A 0 { //VM - Anonymous function
for (A_SetUserVar(user_i, 0); user_i < 9; A_SetUserVar(user_i, user_i + 1)) //все 9 оружий к операции
{
CallACS("ChangeFlag",i); //TID Оружия
}
}
---
ACS:
Script "ChangeFlag" (int i) {
SetActorFlag(i, "WEAPON.NOAUTOAIM", FALSE);
}
нет, это не сработает тоже(
извини не знаю другого способа
DOOMGABR тогда надо заменять сержантовского шотгая, как в этом примере. а без сержантовского, этот пример сработает.
хотя без всего этого можно наверное.. но не знаю как, надо придумать)