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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Внимание!
    — Требуется примерно по 3-5 человек на каждую из версий ОС:: - Windows® XP SP3, Windows® Vista SP2, Windows® 7 SP1, Windows® 8, Windows® 8.1, Windows® 10(build 10 1607) и Windows® 10(build 10 1703). Для стационарных ПК и ноутбуков. Заявку на участие можно оставить здесь...

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

MaGoth

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

Вложения

Gratt


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

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

ElderGamer


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

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

Gratt


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

Trazege


Модостроитель
Регистрация
20 Фев 2008
Сообщения
1.183
Благодарности
940
Баллы
325
Не, а че им будет то.. этот метод обращается к спаун менеджеру, тот запрашивает у активного мира удалить перса сначала из воблиста, а затем уже из памяти.
Макс, а эта команда равносильна наприме коду pNpc->disable()?
 

Gratt


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

Trazege


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

Saturas


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

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

Trazege


Модостроитель
Регистрация
20 Фев 2008
Сообщения
1.183
Благодарности
940
Баллы
325
this
>>release

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

Ulgamecid

Участник форума
Регистрация
5 Дек 2014
Сообщения
13
Благодарности
1
Баллы
165
Приветствую Вас о пытливые умы!)
В настройках главного меню есть возможность вкл/откл субтитры, туман и прочее.
Где находится 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
Сообщения
2.637
Благодарности
2.025
Баллы
385
Где находится zWaterAniEnabled в примере сглаживание воды???
В движке.

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

Ulgamecid

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


На стандартных скриптах этого не сделаешь, через 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
Сообщения
2.637
Благодарности
2.025
Баллы
385
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
Сообщения
13
Благодарности
1
Баллы
165
Все работает спасибо, пардон за ахинею, я все еще учусь))
 
Последнее редактирование:

Ulgamecid

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

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

Melonslise

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

D36


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

Orc Hunter

Участник форума
Регистрация
12 Окт 2013
Сообщения
936
Благодарности
1.155
Баллы
265
Нашел скрипт позволяющий менять загрузочный экран. Но проблема в том что я делаю мод на движке первой Готики и скрипт не работает. Я предполагаю что в первой Готике 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);
};
 
Сверху Снизу