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

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

Готика 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

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
Re: Вопросы по скриптингу

К теме, в следующей версии моего плагина будет возможность удалять/создавать разные объекты из скриптов*flowers*
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Re: Вопросы по скриптингу

Saturas,
будет возможность удалять/создавать разные объекты из скриптов
т.е. можно будет вставить интерактивный МОБ (типа плиты, сундука) и он будет работать?
Или просто будет возможность добавить объекты (типа деревьев, стен, завалов и т.д.) непроницаемые для прохождения через них (или с регулируемыми свойствами?)?
И в догонку: стандартные объекты (типа сундука, вставленного через спейсер) можно будет удалять?

МЕГАДумаю здесь будет лучше вести разговор на данную тематику
зы. нифига как культурно загнул)))
 

Bezio

Участник форума
Регистрация
27 Июн 2012
Сообщения
211
Благодарности
206
Баллы
200
Вот так спасибо за инфу) особенно порадовало то что появилась возможность добовлять свои слоты(в коих иногда есть большая нужда), далеко продвинулся, и продвегайся дальше)
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
Re: Вопросы по скриптингу

Saturas,
т.е. можно будет вставить интерактивный МОБ (типа плиты, сундука) и он будет работать?
Или просто будет возможность добавить объекты (типа деревьев, стен, завалов и т.д.) непроницаемые для прохождения через них (или с регулируемыми свойствами?)?
И в догонку: стандартные объекты (типа сундука, вставленного через спейсер) можно будет удалять?

МЕГАДумаю здесь будет лучше вести разговор на данную тематику
зы. нифига как культурно загнул)))
Да, все можно будет удалять(даже то что вставлено спейсером) а так-же, добавлять ЛЮБЫЕ объекты с редактируемыми свойствами. И да, все эти ваши oCMobInter будут работать как положено(тоесть любые потомки класса oCMob(OcMobInter,oCMobLockable и тд)
завтра приступлю к реализации, всего вышеописанного, это все я уже делал, но только через код, теперь нужно перенести все
это в скриптовые функции, но это не сложно;)

Зы Гараздо сложнее апнуть 88й лвл за пару часов, ох уж этот вов...:D:D:D
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
Так, а теперь пролейте на меня небольшой поток конкретики, а именно: Что вы от меня хотите? Как вы хотите что-бы я сделал реализацию добавления/удаления вобов(и прочих объектов) есть 2 варианта, 1й это тупо сделать функцию, для вставки воба, но есть один минус у таокго подхода - будет овер 9000 аргументов, Но есть еще и такой вариант, сделать несколько функций, например CreateObj("тип объекта","имя объекта") а дальше уже редактировать параметры этого воба по имени, тоесть будет еще пачка функций, для задания параметров воба, и их редактинга, например так Obj_SetName, Obj_SetVisual, Obj_SetPositionWorld и тд, какой вариант оставить, первый окгда все в одной функции, и очень много аргументов, или второй когда овер 9000 функций

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

Midlight

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

Saturas


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

Midlight

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

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
Так, на первое время тогда обойдемся парой объектов, а именно zCVob oCMob oCMobInter oCMobLockable и oCTriggerScript, ибо нет желания сразу писать 10км кода, да и IDA нету на компе щас, чтобы остальное найти.
 

Dimmell

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

Saturas


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

Ilot

Участник форума
Регистрация
17 Сен 2010
Сообщения
798
Благодарности
297
Баллы
245
Saturas, сразу вопрос. А нельзя ли сделать вставку объетов в в VOB'ы? Поясняю - создаем пустой воб в спейсере, даем ему имя и уже в него вставляем объект. Так как иначе координаты вставки вычислять будет сложновато...
 

Saturas


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

Bump: я делаю так, беру аналогичный воб который нужно будет вставить скриптами, вставляю в спейсере и смотрю его координаты, а дальше уже копирую тупо и все
 

Ilot

Участник форума
Регистрация
17 Сен 2010
Сообщения
798
Благодарности
297
Баллы
245
Я же почему и спрашиваю ведь вычислять эт тебе не сталкер:) Давай через воб...

И еще со стрелами помнишь я спрашивал? Так вот сделать выбор амуниции, как например в Бливионе, мона?

Тут кажется говорили о создании новых флагов(испавил). Я правильно понял можно добовлять свои категории(флаги) и прописывать их свойства(как например кольца, доспехи и прочее)?
 

Saturas


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

Bump: А вычислять их нефиг, в спейсере слева вверху пишутся коорды объекта в фокусе.
 

Bezio

Участник форума
Регистрация
27 Июн 2012
Сообщения
211
Благодарности
206
Баллы
200
Флаг и Слот - разные вещи...
 

Ilot

Участник форума
Регистрация
17 Сен 2010
Сообщения
798
Благодарности
297
Баллы
245
Ну этот воб несет в себе координаты(т.е. например функция считывает координаты воба и присваевает их объекту). Т.е. как идет вставка итемок через аналогичную функцию, так и вставлять объекты в воб.

А вычислять их нефиг, в спейсере слева вверху пишутся коорды объекта в фокусе.

Я же говорю это не удобно.
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
Чем это неудобно? Можно вставлять на вейпоинт, например.

Bump: Скопирывать одну строку из спейсера и вставить ее в скрипт, по моему нет ничего проще, и удобнее
 

Ilot

Участник форума
Регистрация
17 Сен 2010
Сообщения
798
Благодарности
297
Баллы
245
Saturas, лично мне нахер не надо сидеть с листочком и записывать какие-то цифры.
Слушай идея. А что если сделать так. Заселяем мир в спейсере, но некоторым обектам даем индивидуальные имена. Пишется одна функция которая считывает заранее внесенные имена и соответственно удаляет их из мира, либо вставляет.

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

Прошу сильно не ругать если что не так.*flowers*
 

Saturas


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