Автор | Сообщение |
axredneck = Sergeant =
 | 394 |
 Doom Rate: 1.91 Posts quality: +149 |
Отправлено: 19.07.18 03:28:14 | |
|
Допустим, создаю я на Decorate actor'а, чтобы вставить его на свою мапу:
actor Stul 9573 // Число взял с потолка
{
...
}
Отныне GZDB будет идентифицировать сей actor по этому вот волшебному числу. Но вот, например, хочу я "модно-молодежно" переписать свой мод на ZScript:
class Stul
{
...
}
(Ну или не переписать, а новый мод создать целиком на ZScript.) Ага, и теперь я не могу в GZDB добавить мой Stul на мапу.
Вопрос: как правильно сделать, чтобы actor, определенный в ZScript, можно было использовать в GZDB ? |
|
|
| |
Печенька = Sergeant =
 | 379 |
 Doom Rate: 2.33 Posts quality: +52 |
Отправлено: 19.07.18 04:11:57 | |
|
В лампе MAPINFO пишется:
DoomEdNums
{
9573 = Stul
} |
|
|
| |
axredneck = Sergeant =
 | 394 |
 Doom Rate: 1.91 Posts quality: +149 |
Отправлено: 19.07.18 14:06:38 | |
|
Печенька, спасибо, учту. |
|
|
| |
ZZYZX - UAC Commissar -
 |  | 6284 |
 Doom Rate: 1.65 Posts quality: +1633 |
Отправлено: 19.07.18 15:24:33 | |
|
class Stul : Actor
А то так-то гздб игнорит классы, иерархия которых не утыкается в актора. |
|
|
2 |
2 |
1 |
 |
|
| |
axredneck = Sergeant =
 | 394 |
 Doom Rate: 1.91 Posts quality: +149 |
Отправлено: 19.07.18 18:52:07 | |
|
ZZYZX: | class Stul : Actor |
Еще большее спасибо! Попозже попробую. |
|
|
| |
axredneck = Sergeant =
 | 394 |
 Doom Rate: 1.91 Posts quality: +149 |
Отправлено: 07.08.18 23:43:43 | |
|
Не прокатывает
Вот мой mapinfo.txt:
DoomEdNums
{
5279 = TheVoice
}
Вот мой zscript.txt:
//#include "scripts/thevoice.txt" // временно убрал для чистоты эксперимента
// Голоса
class TheVoice : Demon
{
//$Category DELIRIOOM
default
{
speed 3;
}
}
В GZDB-Bugfix в категории "DELIRIOOM" нету моего TheVoice. При этом GZDoom ни на что не ругается. |
|
|
| |
Shadowman UAC General
 | 8762 |
Doom Rate: 2.05 Posts quality: +2295 |
Отправлено: 08.08.18 00:20:59 | |
|
axredneck
Могу предположить, что зскрипт не воспринимает напрямую наследование от декорэйтных объектов, у тебя же там прописано наследование от демона. |
|
|
1 |
7 |
2 |
 |
|
| |
axredneck = Sergeant =
 | 394 |
 Doom Rate: 1.91 Posts quality: +149 |
Отправлено: 08.08.18 00:34:40 | |
|
Все, нашел решение вот тут! Надо было просто добавить gzdoom.pk3 в качестве ресурса. |
|
|
| |
Hizenfort - UAC Gunner -
 | 40 |
Doom Rate: 2 Posts quality: +37 |
Отправлено: 18.07.21 14:18:54 | |
|
Решил переписать функцию A_Chase под себя, так как оригинальная совсем не подходит. Нашел тему, где выложили портированную версию chase на zscript. Решил опробовать её без изменений, но она не работает. Либо же я неверно обращаюсь к методу. Делал это через указатель (надеюсь не ошибся с термином) таким образом:
See:
TROO AABBCCDD 2
{
let ptrimp = PortedActor(target);
ptrimp.A_PortedChase();
}
Loop;
в итоге выдает ошибку tried to read from adress zero. Судя по всему неверно инициализаровал указатель. Может обращаться к методам класса нужно как то по другому?
UPD:
А может есть способ не использовать zscript для написания кастомной функции?
UPD2:
Попробовал вызвать метод класса по другому:
See:
TROO AABBCCDD 2
{
class<Actor> cls = "PortedActor";
cls.A_PortedChase();
}
Loop;
но выдает ошибку при вызове: Invalid expression on left hand side of A_PortedChase |
|
|
| |
ZZYZX - UAC Commissar -
 |  | 6284 |
 Doom Rate: 1.65 Posts quality: +1633 |
Отправлено: 18.07.21 16:08:37 | |
|
tried to read from address zero значит, что target не является экземпляром PortedActor.
Вызывать метод класса по другому не получится в принципе. Нужно наследоваться от него или переделывать либу чтобы использовались миксины.
Суть в том что вызывать чейс нужно не от таргета вообще. А от self. |
|
|
2 |
2 |
1 |
 |
|
| |
Hizenfort - UAC Gunner -
 | 40 |
Doom Rate: 2 Posts quality: +37 |
Отправлено: 18.07.21 17:18:03 | |
|
ZZYZX, спасибо, понял. Значит придется придумывать что то со стандартной функцией |
|
|
| |
JSO x - 2nd Lieutenant -
 | 1372 |
 Doom Rate: 2.28 Posts quality: +750 |
Отправлено: 19.07.21 15:44:17 | |
|
ZZYZX пишет: | tried to read from address zero значит, что target не является экземпляром PortedActor. |
Это следствие, а не сразу "значит". Такое сообщение появляется, когда пытаешься вызвать метод или обратиться к полю несуществующего объекта. В данном случае такой получился, так как "target" у данного актора оказался не класса "PortedActor" -- а ZScript при невозможности явно привести тип объекта превращает переменную, которой мы пытаемся так что-то присвоить, в NULL.
Hizenfort пишет: | class<Actor> cls = "PortedActor";
cls.A_PortedChase(); |
Класс -- это статика, трафарет в единственном экземпляре, по которому во время исполнения программы уже штампуются "живые" объекты. А "A_PortedChase()" работает с движением какого-то конкретно объекта -- ну и попытка вызова его для трафарета вполне законно обрывается.
Так что тебе надо-то в итоге сделать -- какую задачу, с которой обычный "A_Chase" не справляется? |
|
|
2 |
8 |
1 |
 |
|
| |
Hizenfort - UAC Gunner -
 | 40 |
Doom Rate: 2 Posts quality: +37 |
Отправлено: 20.07.21 12:15:41 | |
|
JSO x пишет: | Так что тебе надо-то в итоге сделать -- какую задачу, с которой обычный "A_Chase" не справляется? |
Монстры, когда преследуют, двигаются при этом из стороны в сторону. Я попытался сгладить их движения, добавив chase к пустому кадру с 0 временем показа, и также добавил A_Recoil(-2). Но это все равно выглядит малость неуклюже.
Есть еще проблема с застреванием в стенах почему то (не может зайти за угол, либо очень долго через него протискивается). Это я попытался исправить с помощью функции A_CheckBlock, но выглядит это совсем плохо и иногда монстр просто разворачивается и уходит обратно
Собственно, нужно чтобы монстр четко следовал за игроком |
|
|
| |