• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Вопросы по скриптингу

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
  • Первое сообщение
  • #1
Прежде чем задавать вопросы, ознакомьтесь с документацией..
1) Читать онлайн
2) Архив с офлайн-версией(chm) во вложении
 

Вложения

  • Vam_tutor.rar
    171,6 KB · Просмотры: 574
Последнее редактирование модератором:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295
- Подскажите, пожалуйста, где прописываются требования для изучения зелий? Я имею в виду, например, чтобы соблюдалась последовательность появления диалогов при обучении "эссенция - экстракт - эликсир".

DIA_Sagitta_Teach_Info, DIA_Neoras_TEACH_Info и так далее
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295
всем привет! как получить ссылку на руну которую использует герой?

***

  • if Npc_HasSpell(self,NPC_GETACTIVESPELL(SELF)) на сколько я понимаю проверяет есть ли у героя руна к который "привязан" используемый спелл
  • if (Npc_GetActiveSpellIsScroll(self)) проверяет используется руна или свиток
Пост автоматически объединён:

Daedalus:
// *******************************************************************************************
// ***                                        MAGIE                                        ***
// *******************************************************************************************

FUNC VOID    Npc_CreateSpell                (VAR C_NPC self, VAR INT spellnr) {};
// NSc bekommt Zauberspruch zugewiesen kann diesen aber noch nicht gebrauchen
// (erscheint ausgegraut im Auswahlkranz)
FUNC VOID    Npc_LearnSpell                (VAR C_NPC self, VAR INT spellnr) {};
// Was kцnnte das wohl heiЯen ? Ich glaube damit kann man den (spellnr) Zauber zuweisen
FUNC VOID    Npc_SetTeleportPos            (VAR C_NPC self) {};
// Magie/Zauberstein Teleport Spruch : letzte Position des NSCs merken, zwecks spдteren dahinbeamens.
FUNC INT    Npc_GetActiveSpell            (var C_NPC self) { return 0; };
// liefert den Zauber zurьck, der auf der Hand ist (self oder other)
// liefert -1 zurьck, wenn kein Zauber auf der Hand ist
FUNC INT    Npc_GetActiveSpell            (var C_NPC self) { return 0; };
// liefert den Zauber zurьck, der auf der Hand ist (self oder other)
// liefert -1 zurьck, wenn kein Zauber auf der Hand ist
FUNC INT    Npc_GetLastHitSpellID            (var C_NPC self) { return 0; };
// liefert den Zauber zurьck, der den NSC zuletzt getroffen hat
FUNC INT    Npc_GetLastHitSpellCat            (var C_NPC self) { return 0; };
// liefert die Category des Zaubers zurьck, der den NSC zuletzt getroffen hat

FUNC INT    Npc_GetActiveSpellCat        (VAR C_NPC self) { return 0; };
// Unterscheidet zwischen den drei Kategorien (Spell_Bad, Spell_neutral,Spell_Good) Spellkat ist Rьckgabewert
FUNC INT     Npc_SetActiveSpellInfo         (VAR C_NPC npc, VAR INT i1 ) { return 0; };
// liefert den Spell-Level des Zaubers zurьck, der auf der Hand ist
FUNC INT    Npc_GetActiveSpellLevel        (VAR C_NPC self)

// ????
func VOID     AI_ReadySpell                  (VAR C_NPC self, VAR INT spellID, VAR INT investMana);
func VOID     AI_UnreadySpell                (VAR C_NPC self);


func INT      Npc_HasSpell                   (VAR C_NPC self, VAR INT spellID); // --> liefert true oder false zurьck
 
Последнее редактирование:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.860
Благодарности
6.740
Баллы
1.625
MW 7,
// возвращает номер заклинания, которое применяет НПС npc, иначе – 0.
func int Npc_IsDrawingSpell(var C_NPC npc);
или
// возвращает ссылку на оружие, которое НПС npc держит в руке.
func C_ITEM Npc_GetReadiedWeapon(var C_NPC npc);
Может быть :oops:
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
проверяет есть ли у героя руна ...
Или свиток.

как получить ссылку на руну которую использует герой?
А для какой цели, если не секрет? Ссылку класса C_ITEM, вроде бы, получить нельзя. Стандартными средствами.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295
А для какой цели, если не секрет?
хочется попробовать сделать несколько рун с одним и тем же спелом.
Пост автоматически объединён:

Ссылку класса C_ITEM, вроде бы, получить нельзя. Стандартными средствами.
но ведь движок как то проверяет использует герой свиток или руну? :)
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Гм, а зачем нужна ссылка?

движок как то проверяет
У движка больше возможностей, чем у скриптера. Движок должен знать, какая инстанция предмета в данный момент используется. Визуал руны помещается в слот руки и заменяется визуалом соответствующего заклинанию эффекта. Но в некоторые моменты руну можно-таки увидеть.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295
Гм, а зачем нужна ссылка?

например. используем одни спелл для трансформации. прописываем общий спелл логик и так далее. а информацию в кого превращаться герою , берем напрямую из инстанции руны.
тоже самое с телепортами. мир и место куда телепортироваться можно хранить в самой руне.
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.129
Благодарности
5.626
Баллы
910
например. используем одни спелл для трансформации. прописываем общий спелл логик и так далее. а информацию в кого превращаться герою , берем напрямую из инстанции руны.
тоже самое с телепортами. мир и место куда телепортироваться можно хранить в самой руне.
Проще всего сделать, как сделано в возвращении/гильдии 1.5 - через диалог с выбором, как для телепорта, так и для превращения.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295
Проще всего сделать, как сделано в возвращении/гильдии 1.5 - через диалог с выбором, как для телепорта, так и для превращения.
к чему это? мой вопрос чётко сформулирован ;-) и он в топики про вопросы по скриптингу.
Пост автоматически объединён:

вот что то похожее
Код:
0x00680270 public: class oCItem * __thiscall oCNpc::GetSpellItem(int)
 
Последнее редактирование:

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.129
Благодарности
5.626
Баллы
910
В любом случае доступа нет к движку. Также я не думаю, что парсер даст тебе обратиться к классу oCMag_Book. У меня есть пример только на ikarus.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295
на скриптах я могу получить все руны с флагом активный и проверить спелл прописанный в них с тем спелом что сейчас использует герой. но это будет работать корректно только тогда, когда у героя есть одна активная руна. если же у героя несколько "активных" рун с одним и тем же спелом, то среди них я не смогу определить какую именно руну использует герой.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
а информацию в кого превращаться герою , берем напрямую из инстанции руны
Там же нужно указать инстанцию существа для превращения. Какой параметр инстанции руны может сохранить инстанцию существа? Или это можно делать с помощью var func?

все руны с флагом активный
У каких рун этот флаг изменяется? У тех, которые выбраны в инвентаре (назначен номер выбора заклинания)? А как насчёт такого флага?
Daedalus:
const int ITEM_NFOCUS = 1 << 23;
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295
Какой параметр инстанции руны может сохранить инстанцию существа?
в id можно записать.

У каких рун этот флаг изменяется? У тех, которые выбраны в инвентаре (назначен номер выбора заклинания)?
да.

А как насчёт такого флага? ITEM_NFOCUS
не пробовал. пойду проверю :)
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295
В любом случае доступа нет к движку. Также я не думаю, что парсер даст тебе обратиться к классу oCMag_Book.
у меня есть чёткое ощущение что когда речь идёт о движке, наши с тобой суммарные знания стремятся к нулю. а поиском я тоже умею пользоваться ;-)

162​
GetSpellItem leak fixИсключает утечку памяти при использовании функции Npc_HasSpell
Пост автоматически объединён:

Гм, может, попробовать функции on_equip и on_state?
это уже пройденный этап :) герой выбрал руну, а юзать её будет потом.

***

думаю надо просто просить Slavemaster сделать патч на юнион который добавить функцию NPC_GetSpellItem, при вызове который будет возвращаться item руны которую использует НПС :)
Код:
0x00680270 public: class oCItem * __thiscall oCNpc::GetSpellItem(int)

слёзно просить :-D
 
Последнее редактирование:

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.082
Благодарности
1.901
Баллы
320
MW 7, функция будет возвращать используемый спелл итем. Если никакой не используется, может вернуть любой из забинденых.
C++:
namespace NAMESPACE
{
    int __cdecl Npc_GetSpellItem()
    {
        oCNpc* npc;
        ZARGS(npc);

        oCItem* spellItem = nullptr;

        if (npc && npc->mag_book && npc->mag_book->spellnr >= 0 && npc->mag_book->spellnr < npc->mag_book->spellitems.GetNum())
            spellItem = npc->mag_book->spellitems[npc->mag_book->spellnr];

        ZRETURN(spellItem);
        return false;
    }

    ZEXTERNAL(oCItem*, Npc_GetSpellItem, oCNpc*);
}
 

Вложения

  • zTest.vdf
    74 KB · Просмотры: 3

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295
Slavemaster, спасибо! работает
Daedalus:
func int SPELL_PROCESSMANA(var int MANAINVESTED)
{

    var c_item itm;  itm = Npc_GetSpellItem(SELF);
    Hlp_PrintConsole(Str_Format("SPELL_PROCESSMANA  itm.name = %s",itm.name));

пойду осмыслять глубину, глубин :-D
Пост автоматически объединён:

а вот пришло время воспользоваться советом ElderGamer и задействовать nameID
Daedalus:
func void SPELL_CAST_AllTeleport()
{
    Wld_PlayEffect("spellFX_Teleport_CAST", self, self, 0, 0, 0, FALSE);
    var c_item itm;  itm = Npc_GetSpellItem(self);
    Hlp_PrintConsole(Str_Format("   SPELL_CAST_Allteleport(%s)  itm.name = %s",self.name,itm.name));
    AI_Teleport(self,itm.nameID);
};
Пост автоматически объединён:

можно и расход маны брать из инстанции руны

Daedalus:
func int SPELL_LOGIC_FakeTELEPORT(var int manainvested)
{
    var c_item itm;  itm = Npc_GetSpellItem(self);
   
    if (manainvested == 0)
    {  
        return SPL_FORCEINVEST + itm.count[1];  // отнимает ману
 
Последнее редактирование:
Сверху Снизу