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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток! Спешите принять участие в конкурсе "Таинственные миры" 2024!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык

Готика 2: НВ Externals

Статус
В этой теме нельзя размещать новые ответы.

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
Предыстория:
Дело было вечером, делать было нечего
Конец предыстории:D
Давно уже хотел сделать библиотеку, с новыми скриптовыми функциями для готики 2, но в силу лени, отсутствия нормального екста, не мог все это сделать, но теперь некоторые вещи изменились, у меня появилось время и нормальный екст, грубо говоря под словом нормальный, имеется в виду совсем другой екст, не тот что был в саге, и не тот что по первому запросу в гугле, исходники пока давать не буду, ибо там много наработок вама(привет Исходники готики;) а вот готовое расширение функционала готы есть.
И так поехали*flowers*


Немного переработанная функция, одевания предметов
функция именно ОДЕВАЕТ броню/шлемы/оружие/и тд
а не просто меняет флаг, как аналогичная функция готы
по этой самой причине, не одевались головные убры(шлема) с помощью скрипта
usage:
npc - нпс который одевает предмет
itm - сам предмет
Ext_EquipItem(C_NPC npc,C_ITEM itm);
//**********************************
вставить предмет в слот
usage:
npc - нпс который одевает предмет
slot - имя слота(ZS_LEFTHAND, ZS_RIGHTHAND, и тд)
item - предмет/нпс которого вставляем в слот(да, нпс тожеможно вставить в слот
но не сейчас, пока эта возможность отключена)
Ext_PutInSlot(C_NPC npc, string slot, C_ITEM item);
//**********************************
Объявить игроком
usage:
npc - нпс которого нужно сделать игроком
Ext_SetAsPlayer(C_NPC npc);
//**********************************
Закрыть сундук name
name - имя сундука в мире
state - состояние закрыт открыт(TRUE/FALSE)
Ext_SetLocked(string name,int state);
//**********************************
задать инстанцию ключа для сундука(двери) name
name - имя сундука(двери) в мире
inst - имя инстации предмета (прим: "itmi_lockpick")
Ext_SetKeyInstance(string name,string inst);
//**********************************
Задать комбинацию замка
name - имя сундука(двери) в мире
combo - комбинация в виде "LRLR" где L - лево R - право
Ext_SetPickLockStr(string name,string combo)
//**********************************
Получить время с момента запуска игры(в ms)
Ext_GetTimerTick() возвращает значение int
//**********************************
Сохранить игру
Сохраняет игру в slot от 1 до 20
Ext_WriteSaveGame(int slot)
//**********************************
Загрузить игру
Загружает игру из слота от 1 до 20
Ext_ReadSaveGame(int slot)
//**********************************
вспомогательная функция.
позволяет включать Тест режим, отображение часов,
а также убирать все эелементы GUI
int Hlp_Otions(var int desctop,var int clock,var int testmode);
//**********************************
Функция перехоад между уровнями
targetpoint - точка появления гг в другом мире
levelname - имя мира
Ext_ChangeLevel(string targetpoint,string levelname)
//**********************************
функция печати цветного текста
все в принципе так же как и в обычном PrintScreen
только добавилось еще 3 параметра
r - красный цвет
g - синий цвет
b - зеленый цвет
PRINTTEXT ( VAR STRING text, VAR INT x, VAR INT y, VAR STRING font, VAR INT time, VAR INT r, VAR INT g, VAR INT b )

Также в код вшита одна "Циклическая" функция Global_cycle достаточно, просто создать, функцию с именем Global_cycle и во время игры, эта функция будет непрерывно вызываться, из глобального цикла oCGame::Render()
Так же, для нее есть вспомогательная функция Ext_GetTimerTick() пример использования 2х функций сейчас я вам покажу:
Код:
//В этом примере, мы используем внутриигровой таймер,
//совместно с глобальным циклом
//переменная таймера
var int timer;

func void InitVariables()
{
	//инициализируем переменную на всякий случай
	timer = 0;
}

func void Global_cycle()
{
	timer += Ext_GetTimerTick();
	//по прошествии 10 секунд, выводим текст на экран
	//и обнуляем таймер
	if(timer >= 10000)
	{
		timer = 0;
		Print("Прошло 10 секунд!");
	};
};
Или пример как отключить злополучный МАРВИН!;D
func void Global_cycle()
{
//вешаем на цикл эту функцию, и она будет при каждом вызове отключать марвин если тот был включен)
	Hlp_Otions(1,0,0);
};

И вот еще чуть не забыл, для того чтобы запустить игру с этими функциями, и тд
Нужно распаковать содержимое архива External.7z в папку с игрой(Gothic2\Externals)
Для запуска используем файл Start.bat (он запустит игру в оконном режиме!), если же вам нужно запустить игру в полный екран, запускать с файла - Inject.exe
Для компиляции скриптов, нужно использовать саму игру, с ключем -zreparse
а проще, запустить с файла Start_Compile.bat, немного его подредактировав, что конкретно редактировать показано ниже:
Код:
Inject.exe 0 -zwindow -zreparse -game:mod.ini
на место mod.ini дописать ини файл Вашего мода, при этом все *.mod файлы из вашего ini файла будут пропущены!
Чтобы добавить мод файл нужно дописать его в ExternalModList.cfg
Пример:
[FILES]
VDF=MyMod.mod MyMod2.mod
Для компиляции скриптов игрой, нужно поместить все ваши скрипты, в папки игры где должны лежать исходники скриптов:
_work\Data\Scripts\Content - в эту папку идут скрипты gothic.src и fight.src со всеми скриптами
_work\Data\Scripts\System - в эту папку идут скрипты, музыки и прочего
А вообще, советую Вам установить г2мдк со скриптами, и тогда все будет лежать на своих местах, ваша задача будет только заменить скрипты игры в папке Content которые относятся к gothic.src
Когда все сделанно, запускаем игру с файла Start_Compile.bat и скрипты будут автоматически собраны, и распиханы по своим папкам, для компиляции ou.bin - воспользуйтесь спейсером, либо скомпильте Ваш проект в готик сорсере как делаю я, хотя спейсером тоже можно.
Врроде все, удачи в новых начинаниях!

И вот еще, огромная благодарность за код Инжектора, Анониму с форума ехе лаб*flowers*
 

Вложения

  • External.zip
    131 KB · Просмотры: 311

hell9999

Участник форума
Регистрация
12 Апр 2008
Сообщения
2.048
Благодарности
1.163
Баллы
340
Сат красава! Спасибо! Расширяй функционал за счет новых функций и будет всем нам счастье. *flowers*
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
И да, тема будет время от времени обновлятся, и будут обновления библиотеки
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
Жду первых отзывов о работе расширений*flowers*
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Немного переработанная функция, одевания предметов
функция именно ОДЕВАЕТ броню/шлемы/оружие/и тд
а не просто меняет флаг, как аналогичная функция готы
по этой самой причине, не одевались головные убры(шлема) с помощью скрипта
а снять шлем при помощи скрипта?
Или само снимет при одевании другого шлема или брони со шлемом, типа паловской?
ЗЫ. и вообще все броню надо переделывать - у старых моделей все в куче и броня, и шлем.

Посту ниже:
проверить не смогу, нет готы. И врядли будет, кроме соурсера и упаковщика. :)
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
а снять шлем при помощи скрипта?
Или само снимет при одевании другого шлема?
вроде само, хотя сейчас гляну как работает, да ты и сам можешь проверить*flowers*

Bump: Да, одетый ранее шлем снимается.

Bump: сегодня к вечеру будет обнова либы, будет добавлено 6 функций работы с переменными:
SetValue_str(string name,string value,int idx); - изменить значение переменной типа string (при этом можно менять константы, и что душе угодно, и даже менять значения в массивах, по индексу idx) тоже самое для всех типов данных.(string float int)
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
Обновление библиотеки расширений от 10.09.12!


Список новых добавлений​
Функции работы с переменными скриптов:
Функции изменения переменных/элементов массивов:
--Изменить переменную типа string
string name - имя переменной в ковычках(прим. "MyVar")
string value - применяемое значение
int idx - индекс элемента, если изменяется массив, иначе 0
SetValue_str(string name,string value,int idx);

--Изменить переменную типа int
string name - имя переменной в ковычках(прим. "MyIntVar")
int value - применяемое значение
int idx - индекс элемента, если изменяется массив, иначе 0
SetValue_int(string name,int value,int idx);

--Изменить переменную типа float
string name - имя переменной в ковычках(прим. "MyfloatVar")
float value - применяемое значение
int idx - индекс элемента, если изменяется массив, иначе 0
SetValue_flt(string name,int value,int idx);
Функции приведенные выше, примечательны тем, что позволяют редактировать данные внутри массивов(например TXT_GUILDS) а также менять значения констант во время игры;)
Функции чтения данных из переменных/массивов​
--получить строку из переменной типа string
string name - имя переменной в ковычках
int idx - индекс элемента, если читаем массив
Возвращает прочитанное значение string
GetValue_str(string name,int idx);

--получить int из переменной/массива
string name - имя переменной в ковычках
int idx - индекс элемента, если читаем массив
Возвращает прочитанное значение int
GetValue_int(string name,int idx);

--получить float из переменной/массива
string name - имя переменной в ковычках
int idx - индекс элемента, если читаем массив
Возвращает прочитанное значение int
GetValue_flt(string name,int idx);
Функции работы с НПС и ZS_ слотами​
--Функция удаления предмета из слота ZS_ вставленного туда ранее функцией PutInSlot
npc - нпс для которого производится удаление
slot - слот из которого удаляем (прим: "ZS_RIGHTHAND")
Ext_RemoveFromSlot(C_NPC npc, string npc);
--функция Создания(активации) ZS_ слота на скелете нпс
Функция активирует слот ZS_ для дальнейшей работы с ним, например таким образом можно включить слоты ZS_LEFTARM и ZS_SHIELD а также добавлять свои ZS_ слоты на модель нпс в 3ds max и затем активировать их.
npc - нпс для которого создаем слот
slot - имя активируемого слота(прим: "ZS_SHIELD")
Ext_CreateZSSlot(C_NPC npc, string slot);
Пока все, завтра может быть добавлю класс ввода текста, с последующим выводом строки в скрипт.​

Обновлен первый пост, перезалита библиотека.
Установка проста, заменить все файлы в папке Gothic2/externals файлами из архива!
Ссылка на вложение в первом посте
Установка новой версии, не требует внесения изменений в скрипты сделанные с более ранней версией.​

 

Saturas


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

Внимание!
На неделе выложу новую сборку, пофикшены некоторые баги приводящие к вылетам, и некорректной работе некоторых функций, так-же изменен механизм работы Global_Cycle теперь вызов этой функции происходит каждую 1 миллисекунду, и не изменяется от изменения фпс.
И вот еще, будут добавлены скрипты с примерами, на основе скриптовой болванки от комрада WSA*flowers*
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
Вот такой вот вопрос ко всем модмейкерам-скриптологам, кому-нибудь этот проект интересен, и начал кто либо ознакомление с новым функционалом?
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Мне интересно. Но не более :D
На годик раньше - я бы с удовольствием воспользовался и оттестировал ключи/сундуки, слоты под оружие и шлемы.
ЗЫ. Вопрос: можно ли все-таки сделать вариант с простым отбеганием НПС (например при приближении к ним ГГ) не по сетке вайнета, а произвольно на определенное раcстояние с оббеганием (избеганием) препятствий (стен, деревьев и т.д.)?
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
Мне интересно. Но не более :D
На годик раньше - я бы с удовольствием воспользовался и оттестировал ключи/сундуки, слоты под оружие и шлемы.
ЗЫ. Вопрос: можно ли все-таки сделать вариант с простым отбеганием НПС (например при приближении к ним ГГ) не по сетке вайнета, а произвольно на определенное раcстояние с оббеганием (избеганием) препятствий (стен, деревьев и т.д.)?
Вполне возможно думаю, доступ ко всем функциям есть, но желания замарачиватся на этом пока не возникало;)

Щас вот пилю функцию создания триггер скрипта не редактируя зен
 

xterm

Участник форума
Регистрация
25 Июн 2009
Сообщения
5.177
Благодарности
16
Баллы
400
Вот такой вот вопрос ко всем модмейкерам-скриптологам, кому-нибудь этот проект интересен, и начал кто либо ознакомление с новым функционалом?
Да, интересно. Сейчас не нужно, но в будущем многое наверняка буду использовать:)

И вот еще, будут добавлены скрипты с примерами, на основе скриптовой болванки от комрада WSA
Дело нужное. Не мне, но многим точно пригодится...

Также в код вшита одна "Циклическая" функция Global_cycle достаточно, просто создать, функцию с именем Global_cycle и во время игры, эта функция будет непрерывно вызываться, из глобального цикла oCGame::Render()
Странно что такой функции не было в оригинале, не понятно почему.
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
Ну это уже хорошо, конечно хотелось бы чтобы уже сейчас, ктонить начал тестить, ибо мне тестить просто ЛЕНЬ, как то так. Кстати сегодня вечером выложу новую сборку, добавлен класс ввода текста!
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Saturas,
Щас вот пилю функцию создания триггер скрипта не редактируя зен
т.е. в любом произвольном месте мира я смогу поставить триггер не редактируя зен?
А откуда я возьму точные координаты? Все равно в спейсер лезть... *???*

А если просто отработка какого события (например при приближении к какому МОБу на расстояние <XXX), то это просто функция в
"Циклическая" функция Global_cycle
типа IF(Npc_GetDistToWP(hero,"NW_CRYPT_IN_08") <= 1000)
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
нет, создание тригер скрипта я делаю с упором на то, чтобы управлять им из скрипта, вот, а вообще можно прямо в игре получить координаты и поставить его
 

Midlight

Участник форума
Регистрация
8 Июн 2011
Сообщения
155
Благодарности
1
Баллы
185
Saturas, интересно конечно, но так-то моды уже изживают себя и нас все меньше и меньше. :)
И нет - лично мне пока ничего из этого не понадобилось :-\
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Saturas,
а вообще можно прямо в игре получить координаты и поставить его
с гарантией что он не уйдет под землю или в стену? или повиснет в воздухе на высоте десятка метров? ::)
Теоретически - это не критично, но потребует кучу тестов для корректировки координат и радиусов срабатывания.
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
какую кучу тестов? мы получаем координаты гг, дальше создаем там триггер(для удобства еще можно включить отображение бокса) и все, а вобще изначально идея была иная, а именно чтобы юзать для циклов, допустим зен моего мода весит 400 метров, а мне нужно накатать патчик с добавлением одного тригера который работает исключительно со скриптом(допустим цикл) то накатывает патчь только на скрипт, делаем проверку на существование нашего нового тригера в мире(где гг в данный момент находится) и если его нету создаем, и при сохранении игры тригер будет уже в мире, при этом не нужно гемора с патчингами зенов и тд.

Bump: да и вот еще, можно создавать тригер на месте заранее установленного вейпоинта/воба с именем
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Saturas,
какую кучу тестов? мы получаем координаты гг, дальше создаем там триггер(для удобства еще можно включить отображение бокса) и все,
приведи, плз, какой-нибудь практический пример использования такого триггера
а мне нужно накатать патчик с добавлением одного тригера
VPatch в помощь... Сам патч зена на 1 триггер будет весить десяток кб.
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
Я вроде сказал, что если не хочется связыватся с ви патчами и тд.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу