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

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

Готика 2: НВ Externals

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

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
  • Первое сообщение
  • #1
Предыстория:
Дело было вечером, делать было нечего
Конец предыстории: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 · Просмотры: 312

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Ilot,
имена. Пишется одна функция которая считывает заранее внесенные имена и соответственно удаляет их из мира, либо вставляет.
Что раком, что боком - все равно через спейсер. Так какой смысл создавать в спейсере отдельный объект для вставки воба, если можно этот воб просто вставить на WP(FP)? Их то проще разместить и они один фиг в игре будут прямо или косвенно привязаны к сетке вайнетов если захочешь нормально организовать смену рутин у НПС для новых МОБов.
Saturas, не слушай никого - привязывай к WP(FP). А если мобу привяжешь еще и физику чтоб на землю нормально встал - вообще нормально будет.
И вообще для начала надо сделать чтобы хоть просто работало. Дошлифовать можно и потом. Если надо будет. И в любом случае вероятнее всего придется корректировать расположение вставленного моба, идеально он все равно не встанет что через вп, что через бокс. И вот возник вопрос - ориентация объекта в пространстве как будет? По стрелке вп? Или произвольно? :)
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
По поводу ориентации, я всетаки предлагаю через спейсер, берем оттуда параметры ориентации, и ставим.
Хотя можно и по вп/фп но тогда вопрос, какой смысл в этом? Всеравно прийдется менять мир, и тд, а так в спейсер заходим только чтооб глянуть что да как там, и скопипастить
 

Ilot

Участник форума
Регистрация
17 Сен 2010
Сообщения
798
Благодарности
297
Баллы
245
По поводу ориентации, я всетаки предлагаю через спейсер, берем оттуда параметры ориентации, и ставим.
Хотя можно и по вп/фп но тогда вопрос, какой смысл в этом? Всеравно прийдется менять мир, и тд, а так в спейсер заходим только чтооб глянуть что да как там, и скопипастить

Так что я не понял такой вариант не катит:

Например нужно вставить объект. Вставляем его в спейсере. Даем имя. В скриптах прописавыем функцию Ext_ObjektDelete ("имя обекта"), а далее если надо будет вставляем тот же объект функцией Ext_ObjektInsert ("имя обекта"). Внутри функции записываются все параметры объекта, считанные из ZEN файла.

Dimmell, да я как бы не требовал привязку к вобу. По мне хоть к WP, хоть к FP один черт лишь бы координаты вручную не прописывать*flowers*.
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Saturas,
По поводу ориентации, я всетаки предлагаю через спейсер, берем оттуда параметры ориентации, и ставим.
я имел ввиду "морда" воба куда глядеть будет? Я не помню точно структуру вп (там вроде одна стрелка), на МОБах их 3 (там все понятно).
 

Midlight

Участник форума
Регистрация
8 Июн 2011
Сообщения
155
Благодарности
1
Баллы
185
имел ввиду "морда" воба куда глядеть будет?
Так он же и сказал, что будем задавать параметры вручную, копируя их из спейсера.
Это наилучший вариант, зачем париться и создавать какие-то вейпоинты? :D
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Midlight,
Так он же и сказал, что будем задавать параметры вручную, копируя их из спейсера.
Это наилучший вариант, зачем париться и создавать какие-то вейпоинты?
ты хоть сам понял что написал? :D :D :D
Перечитай ВНИМАТЕЛЬНО что писал Сатурас и как это будет работать.
Но есть еще и такой вариант, сделать несколько функций, например CreateObj("тип объекта","имя объекта") а дальше уже редактировать параметры этого воба по имени, тоесть будет еще пачка функций, для задания параметров воба, и их редактинга, например так Obj_SetName, Obj_SetVisual, Obj_SetPositionWorld и тд, какой вариант оставить, первый окгда все в одной функции, и очень много аргументов, или второй когда овер 9000 функций

Зы Лично я, склоняюсь ко второму способу, ибо так проще, надежнее, и вообще так положено.
 

Bezio

Участник форума
Регистрация
27 Июн 2012
Сообщения
211
Благодарности
206
Баллы
200
Единственная проблема - одному Сату итак трудно функции лепить, а их тама нужно очень много... один и не справится... ты еслиб помог... а не даренному коню в зубы смотрел... ИМХО

Bump: Вообще... вписывать большое кол-во чисел ради одного предмета не очень удобно... + нужно знать эту координату по всем осям... Но лепить Over9000 функций - может пропасть какое-либо желание вообще сталкиваться с функциями готики=(... Так что думаю пока, лучше довольствоваться тем, что есть;), потом, может прийдет что-то поудобней*flowers*
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Вообще... вписывать большое кол-во чисел ради одного предмета не очень удобно... + нужно знать эту координату по всем осям... Но лепить Over9000 функций
какие овер9000? Я не знаю как задумал это Сатурас, но я бы делал так:
- добавил класс VOB(la)
- в нем как в инстанции: имя, визуал, свойства, морда лица и эффектов, связанные функции и т.д.
- и вставлял бы этот предмет в мир как вставляются инстанции. Проще вставку привязать к точкам (WP,FP) а не координатам. Почему: мне надо вставить плиту на которой можно жарить-парить, я разместил точку чуть ниже уровня земли и плита встала как мне надо. Загрузил игру, посмотрел - немного хреновато, надо ниже см на 20. Залез в зен и поправил точку. Или если это возможно переместил WP функцией типа SetPosition из скриптов. И никаких особых танцев и знаний.
- добавить потом к вставленному вобу функцию если это надо, опять же из скриптов, одна функция. Другое дело что функции разные типа onActivate, Lock и т.д. Но все они для одного воба и не нужны.
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
- добавил класс VOB(la)
Это нереально, ибо нужно писать собственный класс виртуального объекта, я уже пробовал, но вышла хрень, чуть более чем полностью, по этому я склоняюсь к функциям, так в разы проще. Едем дальше, какие еще дофига цифр переписывать? Copy-Paste отменили чтоле? Находим параметр trafoOSToWSPos в свойствах воба в спейсере, копипастим всю строку, и добавляем 2 запятые, все, более ничего не нужно.
А вот по поводу вейпоинтов - хрень, ибо вейпоинт всегда находится над землей, остается один безпроигрышный вариант - zCVobSpot(FP) с него можно слизывать параметры ориентации объекта, и все что угодно. Кароче задолбали вы меня срачем этим, делаю 2 функции, первая "теплая и ламповая" т.е. аналоговая которая принимает x,y,z координаты, и функцию которая принимает имя фрипоинта.

Bump: И да, создавать классы к уже созданным двиговым классам - это адъ, ибо нужно вписывать значения непосредственно в сам класс двига, и как на это отреагирует двиг игры, вопрос открыт, в лучшем случае на каждом шагу будет BAD MEMORY POINTER:-\
 

Midlight

Участник форума
Регистрация
8 Июн 2011
Сообщения
155
Благодарности
1
Баллы
185
ты хоть сам понял что написал?
Перечитай ВНИМАТЕЛЬНО что писал Сатурас и как это будет работать.
Я цитировал Сатураса. :D
Как по мне, Сатурас предлагал отличные варианты реализации, но народ чего-то хочет изобретать, зачем?? *???*

Вообще... вписывать большое кол-во чисел ради одного предмета не очень удобно... + нужно знать эту координату по всем осям...
Что мешает просмотреть координаты в спейсере и нажать Ctrl+C -> Ctrl+V? :eek:
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
Вот вот, там все 3 координаты висят в одной строке.
 

Midlight

Участник форума
Регистрация
8 Июн 2011
Сообщения
155
Благодарности
1
Баллы
185
Saturas, давай подытожим:
Возможно сделать так, чтобы можно было указывать скриптами местоположения воба по координатам? И затем менять его ориентацию теми же скриптами?
Если да, то какого черта мы тупим, так ведь и нужно делать!
 

Saturas


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

Dimmell

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

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
Кароче, пошел я записывать класс zCVobSpot и делать через фп.

Так, ну вот значит, первые резалты тестов установки вобов по фрипоинту.
Ориентация воба в пространстве, полностью слизывается с координат ФРИ-поинта(zCVobSpot) т.е. с вейпоинтами не проканает такое, так-же во избежание ошибок распорядков дня нпс, находящихся рядом с "вобовым" фрипоинтом, сделаю чтобы фрипоинт отмечался как "занятый", т.е. функция Wld_IsFPAvailable при направлении на наш фрипоинт, будет говорить что он занят.

Bump: Теперь самое нудное, допиливать функцию Ext_ObjCreate это конечно немного нудно, но оно того стоит, всего запланирован вот такой список объектов:
Код:
//Константы объектов игры
const int zCObject 			= 0; 	//Базовый объект(не усипользуется!)
const int zCVob 			= 1; 	//Виртуальный объект мира(деревья, и прочие статичные объекты) - ok
const int oCVob 			= 2; 	//Расширенный класс вирутлаьного объекта(пока не используется)
const int oCMob 			= 3; 	//Базовый класс интерактивных объектов - ok
const int oCMobInter 		= 4; 	//Класс интерактивного объекта(алхимический стол и тд) - ok
const int oCMobBed			= 5; 	//Объект типа "Кровать"
const int oCMobFire			= 6; 	//Объект типа "Фонарь/факел"(как в г1 которые еще зажигать можно)
const int oCMobItemSlot 	= 7; 	//Объект со слотом для предмета(наковальни и тд)
const int oCMobLadder		= 8; 	//Объект типа "Лестница"
const int oCMobLockable 	= 9; 	//Закрывающийся на ключь объект.
const int oCMobContainer 	= 10;	//Контейнер(может быть заперт на ключь) - ok
const int oCMobDoor			= 11;	//дверь(может быть заперта на ключь)
const int oCMobSwitch		= 12;	//Переключатель
const int oCMobWheel		= 13;	//???
const int oCTriggerScript	= 14;	//Триггер скрипт. - ok

Bump: Триггер скрипт до конца не реализован пока, а все что помечено -ok уже работает
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
Так, у меня к вам вопрос господа, какие функции работы с объектом добавить? ВОт что мы имеем сейчас:
Код:
//Ext_ObjCreate(int type,string name,string visual) - создает объект
//Ext_ObjSetWldPos(string name,int x,int y,int z); - устаналивает его в мире по координатам xyz(!Функция работает не до конца!!!)
//Ext_ObjSetVisual(string name, string visual); - задает/меняет визуал объекта, если это не триггер
//Ext_ObjSetWldPosFP(string name, string spot); - выставляет объект по фрипоинту
//Ext_ObjSetCollision(string name, int val); - устанавливает коллизию
Чего тут еще не хватает?
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.167
Баллы
915
Saturas, что вам непонятно в этом объекте:
Код:
const int oCMobWheel		= 13;	//???
Это всего лишь обычная лебёдка, с помощью которой в G1 открываются решётка в шахте Старого Лагеря или закрывающая доступ к юнитору дверь в ущелье с троллем, а в G2 - заржавевшая решётка на входе в тайный винзаводик Вино в восточном лесу.
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
Saturas, что вам непонятно в этом объекте:
Код:
const int oCMobWheel		= 13;	//???
Это всего лишь обычная лебёдка, с помощью которой в G1 открываются решётка в шахте Старого Лагеря или закрывающая доступ к юнитору дверь в ущелье с троллем, а в G2 - заржавевшая решётка на входе в тайный винзаводик Вино в восточном лесу.
много букаф писать:D
Да и как правильно описать лень было думать хД
 

Dimmell

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