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

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

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

MaGoth

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

Вложения

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

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
Есть такая функция для удаления неписей из мира Wld_RemoveNpc. Почему разрабы Готики предпочитают убирать неписей в "морг", а не пользуются этой функцией? На первый взгляд, для удаления неписей предпочтительнее использовать именно функцию Wld_RemoveNpc, она же для этого и создавалась, надо полагать. Но нет. Почему-то не используют, заморачиваются с созданием "морга", распорядками нахождения в нём... Нет ли тут подводных камней?
Это во многом следствие рудиментов. Например свойства респаун тайм и респаун поинт, которые можно поглядеть в рефе с_нпс, частично имеют код реализации, но принудительно залочены. Полностью удалять из мира нужно через глобальный воблист

CreateInvItems (slf, ItMi_Gold, 5);
Мы создали 5 объектов и каждый из них был инициализирован инстанцией ItMi_Gold. Каждый объект имеет такие поля
Нет. Если предмет скидывается в стек, экземпляр создается один. А количество задается тупо свойством.
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Полностью удалять из мира нужно через глобальный воблист
То есть, какие-то "непонятки" с этой функцией всё-таки есть? Я к чему спрашиваю. Вот нужно мне, например, в определённый момент убрать кучу тел, разбросанных по лагерю у Свободной Шахты. Некоторые из них, возможно, уже были удалены движком после того, как игрок обчистил инвентарь трупов. Напрашивается использование функции Wld_RemoveNpc, реализация получается более компактной, чем перемещение всей этой толпы в морг. Но... чем это может обернуться в итоге? Не будет ли проблем?

В НМ, смотрю, скриптеры спокойно пользовались этой функцией. Надо полагать, проблем не было.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
Не, а че им будет то.. этот метод обращается к спаун менеджеру, тот запрашивает у активного мира удалить перса сначала из воблиста, а затем уже из памяти.
 

Trazege

Участник форума
Регистрация
20 Фев 2008
Сообщения
1.760
Благодарности
1.394
Баллы
340
Не, а че им будет то.. этот метод обращается к спаун менеджеру, тот запрашивает у активного мира удалить перса сначала из воблиста, а затем уже из памяти.

Макс, а эта команда равносильна наприме коду pNpc->disable()?
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
Нет, дизейбл просто убирает непися из воблиста, тем самым делает его неконтролируемым. Тем не менее объект спокойно продолжает существовать в слип моде
 

Trazege

Участник форума
Регистрация
20 Фев 2008
Сообщения
1.760
Благодарности
1.394
Баллы
340
Нет, дизейбл просто убирает непися из воблиста, тем самым делает его неконтролируемым. Тем не менее объект спокойно продолжает существовать в слип моде
А release? Как вообще выгрузить окончательно?
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
this
>>release

Ты вообще понимаешь как работает сборщик мусора в готике? У каждого объекта есть свойство RefCtr и пока оно не равно 0. Объект удалять нельзя.
И оператор delete использовать к объектам напрямую нельзя(объекты это те которые zCObject и все производные)
 

Trazege

Участник форума
Регистрация
20 Фев 2008
Сообщения
1.760
Благодарности
1.394
Баллы
340
this
>>release

Ты вообще понимаешь как работает сборщик мусора в готике? У каждого объекта есть свойство RefCtr и пока оно не равно 0. Объект удалять нельзя.
И оператор delete использовать к объектам напрямую нельзя(объекты это те которые zCObject и все производные)

Про delete мне Макс уже обьяснял.
 

Ulgamecid

Участник форума
Регистрация
5 Дек 2014
Сообщения
19
Благодарности
6
Баллы
170
Приветствую Вас о пытливые умы!)
В настройках главного меню есть возможность вкл/откл субтитры, туман и прочее.
Где находится zWaterAniEnabled в примере сглаживание воды???
Пример: Сглаживание воды.
instance MENUITEM_EXT_FFT_CHOICE(C_MENU_ITEM_DEF)
{
backpic = MENU_CHOICE_BACK_PIC;
type = MENU_ITEM_CHOICEBOX;
text[0] = "нет|да";
fontname = MENU_FONT_SMALL;
posx = 5000;
posy = MENU_START_Y + (MENU_DY * 0) + MENU_CHOICE_YPLUS;
dimx = MENU_SLIDER_DX;
dimy = MENU_CHOICE_DY;
onchgsetoption = "zWaterAniEnabled";
onchgsetoptionsection = "ENGINE";
flags = flags & ~IT_SELECTABLE;
flags = flags | IT_TXT_CENTER;
};

instance MENUITEM_EXT_WATERFADE(C_MENU_ITEM_DEF)
{
backpic = MENU_ITEM_BACK_PIC;
text[0] = "Сглаж. воды";
text[1] = "Сглаживание воды вкл/откл";
posx = 1000;
posy = MENU_START_Y + (MENU_DY * 1);
dimx = 3000;
dimy = 750;
onselaction[0] = SEL_ACTION_UNDEF;
flags = flags | IT_EFFECTS_NEXT;
};

Я хочу осуществить вкл/откл. функции B_GuildGreetings().
Что там нужно прописать не имею понятия так как под рукой нет образца....
Заранее спасибо.
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Где находится zWaterAniEnabled в примере сглаживание воды???
В движке.

Я хочу осуществить вкл/откл. функции B_GuildGreetings().
Что там нужно прописать не имею понятия так как под рукой нет образца....
На стандартных скриптах этого не сделаешь, через Ikarus можно завести переменную для Gothic.ini, связать со скриптами игры и менять через настройки.
 

Ulgamecid

Участник форума
Регистрация
5 Дек 2014
Сообщения
19
Благодарности
6
Баллы
170
В движке.


На стандартных скриптах этого не сделаешь, через Ikarus можно завести переменную для Gothic.ini, связать со скриптами игры и менять через настройки.

Все верно, через Икарус и пробую но пока что эффекта 0... В B_Guildgreetengs() прописал сей код:
const int B_GuildGreetings_FOCUS_COLLECTION = 1;


if (!MEM_GothOptExists("B_GuildGreetings", "enabled"))
{ MEM_SetGothOpt("B_GuildGreetings", "enabled", "1");
}; // If not set
if (!MEM_GothOptExists("B_GuildGreetings", "focusEnabled"))
{ MEM_SetGothOpt("B_GuildGreetings", "focusEnabled", "1");
}
else if (!STR_ToInt(MEM_GetGothOpt("B_GuildGreetings", "focusEnabled")))
{
B_GuildGreetings_FOCUS_COLLECTION = 0;
};
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
B_Guildgreetengs() прописал сей код:
Какая-то бессмысленная ахинея :D


Накидал код, который должен по идее работать.

Код:
func void B_GuildGreetings(var C_Npc slf,var C_Npc oth)
{
    if(STR_ToInt(MEM_GetGothOpt("B_GUILDGREETINGS", "B_GuildGreetings_Enabled")))
    {
     ///Здесь выполняется код приветсвия.
    };
};

В скриптах меню:
onchgsetoption = "B_GuildGreetings_Enabled";
onchgsetoptionsection = "B_GUILDGREETINGS";

В Gothic.ini
[B_GUILDGREETINGS]
B_GuildGreetings_Enabled = 1;
 

Ulgamecid

Участник форума
Регистрация
5 Дек 2014
Сообщения
19
Благодарности
6
Баллы
170
Все работает спасибо, пардон за ахинею, я все еще учусь))
 
Последнее редактирование:

Ulgamecid

Участник форума
Регистрация
5 Дек 2014
Сообщения
19
Благодарности
6
Баллы
170
И снова Здрасте)
Хочу запилить функциональный экран статистики персонажа с курсором - А Ля Ризен.
10604612.jpg

На WOP'e нашел пример на Икарусе и Лего.
Воссоздание прошло успешно, вопрос остался касаемо курсора, кто нибудь знает как внедрить курсор?!
 
Последнее редактирование:

Melonslise

Участник форума
Регистрация
19 Окт 2014
Сообщения
179
Благодарности
19
Баллы
175
Приветствую. Мне нужно создать новый навык для игрока и я так понял, для этого нужно использовать Npc_SetTalentValue, но, как известно, свободных навыков в оригинале всего 3. Можно ли увеличить количество навыков? Если нельзя, то как можно отображать уровень таланта в меню из какой-нибудь отдельной переменной? Потому что я так понял, что когда прописывается в меню что-то вроде
Код:
  items[59] = "MENU_ITEM_TALENT_21_SKILL";
то игра сама задает значение этой строке.
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.191
Благодарности
3.375
Баллы
485
Если речь идет о Г1, то посмотри реализацию навыка алхимии в моем Russobit-M Fix.
 

Orc Hunter


Модостроитель
Регистрация
12 Окт 2013
Сообщения
1.269
Благодарности
1.667
Баллы
305
Нашел скрипт позволяющий менять загрузочный экран. Но проблема в том что я делаю мод на движке первой Готики и скрипт не работает. Я предполагаю что в первой Готике LOADINGTEXNAME_OFFSET имеет другое значение, но как его узнать?
Код:
var int DM_Count_LoadingScreen;
const int LOADINGTEXNAME_OFFSET = 9118980; //0x8B2504;

func void SetLoadTexName (var string texName) {
    /*Lдnge ermitteln und prьfen ob passend */
    var int len; len = STR_Len (texName);
   
    if (len < 5) {
        MEM_Error ("SetLoadTexName: texName too short. Empty or forgotten '.tga' extension?");
        return;
    } else if (len > 11) { //11 == STR_Len ("loading.tga");
        MEM_Error ("SetLoadTexName: texName is too long. Truncate it to 11 chars (including '.tga' extension)!");
        return;
    };
   
    /* Daten kopieren */
    var int sPtr; sPtr = STRINT_ToChar (texName);
    MEM_CopyBytes (sPtr, LOADINGTEXNAME_OFFSET, len);
   
    /*  Nullbyte anhдngen */
    MEM_WriteByte (LOADINGTEXNAME_OFFSET + len, 0);
    MEM_WriteInt (LOADINGTEXNAME_OFFSET + len, MEM_ReadInt (LOADINGTEXNAME_OFFSET + len) & ~ 255);
};
 
Сверху Снизу