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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток!
    Стартовал новый литературный конкурс от "Ордена Хранителей" - "Пираты Миртанского моря".
    Каждый может принять в нём участие и снискать славу и уважение, а в случае занятия призового места ещё и получить награду. Дерзайте
  • Дорогие друзья, год подходит к концу, и пришло время подвести его итоги и наградить достойных

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

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

MaGoth

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

Вложения

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

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
Стражник написал(а):
Всем привет. При попытке создания НПС и внесения его в игру при завершении компиляции возникли ошибки количеством 26 штук.
Если есть ошибки в процессе копиляции их нужно исправлять.
В каких файлах прописывал своего Нового Нпс, их названия приведи.

Меня интересует следующее:
1)Имеет ли значение от какого локализатора Диск Готика2 НВ при начале работы с программами модостроения.
Локализатор у нее один -Акелла ее и нужно использовать, в противном случае будем собирать урожай багов.

2)Какие программы необходимы для новичка в программировании Г2. Скачал Gothic Surser 3.14. А также есть g2mdk- 2.6.
Если заниматься только скриптингом, то стандартный суповой набор:
- G2MDK - полная версия
- G2MDK patch до версии 2.6а
- Gothic PlayerKit версии 2.6f
- GothicSourcer версии 3.14
Все. :)

3)Где в папке решения(проекта) искать файлы Gothin.dat и OU.bin для последующей замены ими оригинальных файлов.
Стандартно они создаются в папке проекта, у меня здесь:
..\GothicSourcer V3.14\Gothic Projects\SolG2-Italian\PrjGothic
также можно вставлять вновь скомпилированные файлы автоматически сразу в игру, на этапе их создания. для этого в главном меню соурсера выбери:
Параметры ->Параметры вставки файлов в игру
Откроется новое окно, в нем нужно указать путь до корневого каталога игры - Г1 или Г2, в зависимости от того с какой из версий скриптов ты работаешь. Например, для Г2-НВ:
х:\Program Files\Akella Games\Gothic II
Для Г1 аналогично.
Не забываем установить галочку в чекбоксе - "Безопасная автоматическая вставка компиллированных файлов в игру".

4)Если возможно дайте посмотреть готовый скрипт нового НПС для внесения его в игру. Читал статью о создании НПС от DEDROITA, но вследствии вывода сообщения об ошибках не знаю, что делать с этим дальше.
Не думаю что образецскрипта что-то даст, ибо одним файлом дело тут не ограничится. Скрипты DEDROITA могут содержать ошибки?! но это не актуально т.к. тутор писался еще в 2005 году, и ориентирован был на работу со скриптами в спейсере. Позже, постараюсь поправить темы туторов по скриптам.

5) С чего лучше всего начать знакомство с процессом модостроения.
Заранее спасибо за ответ.
С Туториала по скриптологии от Vam'a. скачать его можно из зоны файлов или в разделе "Модостроение"на главной портала. :)
 
Последнее редактирование модератором:

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
Dimmell написал(а):
Saturas написал(а):
Ты не понял меня АБСОЛЮТНО мне нужно ДЛЯ 1 УРОВНЕВОГО ЗАКЛА!!!!
Нада чтобы для огненного дождя мана инвестирывавылась, не 150 сразу а, по 20 мыны в сек или м/сек понял или нет?
И как это ты представляешь?
1 каст - 1 расход маны.
Вариант с поливанием дождем может пройти только, если ты сделаешь каст (быстрый) закла с малым расходом маны и малым временем действия закла. И кастуй их потоком.
Вот те и ответ я с участием Укура, смог написать подобную функцию за что спасибо Укуру
В спойлерах смотри оригинал г2а и нашу с Укуром
// ************
// SPL_FireRain
// ************

const int SPL_Cost_FireRain = 150;
const int SPL_Damage_FireRain = 500;


INSTANCE Spell_FireRain (C_Spell_Proto)
{
time_per_mana = 0;
damage_per_level = SPL_Damage_FireRain;
damageType = DAM_MAGIC;
targetCollectAlgo = TARGET_COLLECT_NONE;
};

func int Spell_Logic_Firerain (var int manaInvested)
{
if (Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
{
return SPL_SENDCAST;
}
else if (self.attribute[ATR_MANA] >= SPL_Cost_FireRain)
{
return SPL_SENDCAST;
}
else //nicht genug Mana
{
return SPL_SENDSTOP;
};
};

func void Spell_Cast_Firerain()
{
if (Npc_GetActiveSpellIsScroll(self))
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
}
else
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_FireRain;
};

self.aivar[AIV_SelectSpell] += 1;
};
Тут один каст но сразу вся мана тратится тоесть 150 в сек
// ************
// SPL_FireRain
// ************

const int SPL_SENDCAST_FIRERAIN = 100;
const int SPL_Damage_FireRain = 500;

INSTANCE Spell_FireRain (C_Spell_Proto)
{
time_per_mana = 30;
damage_per_level = SPL_Damage_FireRain;
damageType = DAM_MAGIC;
targetCollectAlgo = TARGET_COLLECT_NONE;
};

func int Spell_Logic_Firerain (var int manaInvested)
{
if (manaInvested == 0)
{
return SPL_NEXTLEVEL;
};

if (manaInvested >= SPL_SENDCAST_FIRERAIN)
{ return SPL_SENDCAST; };

return SPL_RECEIVEINVEST;
};


func void Spell_Cast_Firerain()
{
self.aivar[AIV_SelectSpell] += 1;
};
Тут один каст но мана расходуется постепенно и при этом открывется ключь KEY_INVEST
Вставь се этот закл и увидишь ;)
И допиши в файл Spell_ProcessMana_Release.d
if (activeSpell == SPL_FIRERAIN ) { return SPL_SENDSTOP;};
Зы делай выводы ;)
 
Последнее редактирование модератором:

F!G

Забанен
Регистрация
11 Мар 2008
Сообщения
26
Благодарности
0
Баллы
150
вопросы по скриптам менюшек..

где описано какую мелодию играть при запуске игры в главном меню?
и где описана tga которая отображается на фоне? (ну в НВ эт маги)
p.s в скриптах menu не нашел, там только рамочки с прозрачностями
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.904
Благодарности
6.780
Баллы
1.625
F!G написал(а):
p.s в скриптах menu не нашел, там только рамочки с прозрачностями
Gamestart.wav прописан в SFX и Music(gamestart.sgt) скриптах.
А вот стартскрин... хоть убей, помню что где-то видел, но где - немогу уже найти.
 
Последнее редактирование:

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
F!G написал(а):
и где описана tga которая отображается на фоне? (ну в НВ эт маги)
p.s в скриптах menu не нашел, там только рамочки с прозрачностями
А зачем тебе ее описывать?
Замени стандартную. Положи свою _work\data\Textures\_compiled\STARTSCREEN-C.TEX
Или в _work\data\Textures\Desktop\nomip\StartScreen.tga, предварительно удалив STARTSCREEN-C.TEX
 
Последнее редактирование модератором:

DEDROIT


Модостроитель
Регистрация
8 Ноя 2005
Сообщения
425
Благодарности
997
Баллы
235
Назрел вот такой вопрос.
Как сделать, чтобы при первом появлении ГГ в мире, был вечер/ночь? (т.е начать новую игру и ГГ должен появиться в мире ночью).
Я пробывал сделать по аналогии с Рудниковой Долиной т.е в Startup'e прописать к примеру:
func void STARTUP_WORLD_START()
{
Wld_SetTime(0,0);
Wld_InsertNpc(НПС, "веппоинт");
Wld_InsertNpc(НПС,"веппоинт");
и.т.д
Так же пробывал сделать с помощью ТригерСкрипт, но всё равно не работает. Как ГГ появлялся в 8 утра, так он и появляется. Вариант, чтобы вызвать ночь через диалог не подходит в моём случаи(хотя он работает).
 
Последнее редактирование модератором:

Стражник

Участник форума
Регистрация
14 Фев 2009
Сообщения
675
Благодарности
101
Баллы
220
Создал НПС без диалогов. Общий вид файла получился следующий:

instance NONE_2001_Flavius(Npc_Default)
{
name[0] = "Флавиус";
guild = GIL_NONE;
id = 2001;
voice = 6;
flags = 0;
npcType = npctype_main;
aivar[AIV_MM_FollowTime] = 60;
B_SetAttributesToChapter(self,4);
fight_tactic = FAI_HUMAN_STRONG;
EquipItem(self,ItMw_Orkschlaechter);
CreateInvItems(self,ItFo_Apple,1);
B_SetNpcVisual(self,MALE,"Hum_Head_FatBald",Face_N_Tough_Okyl,BodyTex_N,ITAR_CorAngar);
Mdl_SetModelFatness(self,0);
Mdl_ApplyOverlayMds(self,"Humans_Militia.mds");
B_GiveNpcTalents(self);
B_SetFightSkills(self,60);
daily_routine = Rtn_Start_2001;
};


func void Rtn_Start_2001()
{
TA_Read_Bookstand(8,0,23,0,"NW_XARDAS_TOWER_IN1_28");
TA_Read_Bookstand(23,0,8,0,"NW_XARDAS_TOWER_IN1_28");
};

Привязал его к NONE_100_XARDAS.
При компиляции выдается сообщение с ошибками:
Большинство ошибок и внимания пишут что Функция должна возвращать значение

В этом файле - AI_Magic_C_CanNpcCollideWithSpell.d (447) выдается ошибка - Неожиданный return
В intern_NONE_2001_Flavius.d(24); выдается ошибка - Переопределенный идентификатор: RTN_START_2001

Каким образом можно исправить эти ошибки и есть ли программа с помощью которой это можно делать автоматически.
 
Последнее редактирование модератором:

Мільтен

Участник форума
Регистрация
27 Июн 2008
Сообщения
862
Благодарности
427
Баллы
265
Стражник написал(а):
Создал НПС без диалогов. Общий вид файла получился следующий:

instance NONE_2001_Flavius(Npc_Default)
{
name[0] = "Флавиус";
guild = GIL_NONE;
id = 2001;
voice = 6;
flags = 0;
npcType = npctype_main;
aivar[AIV_MM_FollowTime] = 60;
B_SetAttributesToChapter(self,4);
fight_tactic = FAI_HUMAN_STRONG;
EquipItem(self,ItMw_Orkschlaechter);
CreateInvItems(self,ItFo_Apple,1);
B_SetNpcVisual(self,MALE,"Hum_Head_FatBald",Face_N_Tough_Okyl,BodyTex_N,ITAR_CorAngar);
Mdl_SetModelFatness(self,0);
Mdl_ApplyOverlayMds(self,"Humans_Militia.mds");
B_GiveNpcTalents(self);
B_SetFightSkills(self,60);
daily_routine = Rtn_Start_2001;
};


func void Rtn_Start_2001()
{
TA_Read_Bookstand(8,0,23,0,"NW_XARDAS_TOWER_IN1_28");
TA_Read_Bookstand(23,0,8,0,"NW_XARDAS_TOWER_IN1_28");
};

Привязал его к NONE_100_XARDAS.
При компиляции выдается сообщение с ошибками:
Большинство ошибок и внимания пишут что Функция должна возвращать значение

В этом файле - AI_Magic_C_CanNpcCollideWithSpell.d (447) выдается ошибка - Неожиданный return
В intern_NONE_2001_Flavius.d(24); выдается ошибка - Переопределенный идентификатор: RTN_START_2001

Каким образом можно исправить эти ошибки и есть ли программа с помощью которой это можно делать автоматически.

Скачай декомпилированые скрипты от Акеллы. Вот ссылка.
 
Последнее редактирование модератором:

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
DEDROIT
триггер
childs79=int:0
[% oCTriggerScript:zCTrigger:zCVob 24577 101]
pack=int:0
presetName=string:
bbox3DWS=rawFloat:29991.0273 5025.04443 -15287.9404 30471.0273 5505.04443 -14807.9404
trafoOSToWSRot=raw:0000803f0000008000000000000000000000803f0000000000000080000000800000803f
trafoOSToWSPos=vec3:30231.0273 5265.04443 -15047.9404
vobName=string:EVT_XARDAS_RESETTIME
visual=string:
showVisual=bool:1
visualCamAlign=enum:0
visualAniMode=enum:0
visualAniModeStrength=float:0
vobFarClipZScale=float:1
cdStatic=bool:1
cdDyn=bool:1
staticVob=bool:0
dynShadow=enum:0
zbias=int:0
isAmbient=bool:0
[visual % 0 0]
[]
[ai % 0 0]
[]
triggerTarget=string:
flags=raw:07
filterFlags=raw:1b
respondToVobName=string:
numCanBeActivated=int:-1
retriggerWaitSec=float:0
damageThreshold=float:0
fireDelaySec=float:0
scriptFunc=string:EVT_XARDAS_RESETTIME_FUNC
[]
функция
func void evt_xardas_resettime_func()
{
if(RESETTIME == FALSE)
{
if(XP_PER_VICTORY == 15)
{
Wld_SetTime(10,50);
}
else if(XP_PER_VICTORY == 20)
{
Wld_SetTime(5,50);
}
else
{
Wld_SetTime(0,10);
};
RESETTIME = TRUE;
};
};
работает без проблем.
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
DEDROIT написал(а):
Назрел вот такой вопрос.
Как сделать, чтобы при первом появлении ГГ в мире, был вечер/ночь? (т.е начать новую игру и ГГ должен появиться в мире ночью).
Я пробывал сделать по аналогии с Рудниковой Долиной т.е в Startup'e прописать к примеру:
func void STARTUP_WORLD_START()
{
Wld_SetTime(0,0);
Wld_InsertNpc(НПС, "веппоинт");
Wld_InsertNpc(НПС,"веппоинт");
и.т.д
Так же пробывал сделать с помощью ТригерСкрипт, но всё равно не работает. Как ГГ появлялся в 8 утра, так он и появляется. Вариант, чтобы вызвать ночь через диалог не подходит в моём случаи(хотя он работает).
Дык вторая часть названия функции должна совпадать с названием ЗЕНа
Например STARTUP_MEGAWORLD для MEGAWORLD.ZEN
У тебя же вообще название функции на три части разделено.
 
Последнее редактирование модератором:

DEDROIT


Модостроитель
Регистрация
8 Ноя 2005
Сообщения
425
Благодарности
997
Баллы
235
ukur
Ну вообще-то у меня совпадает(просто так мир назван).
Dimmell
Спасибо. Сейчас проверю.
 

GeorG

Участник форума
Регистрация
27 Авг 2008
Сообщения
3.447
Благодарности
11
Баллы
295
Ну вообще-то у меня совпадает(просто так мир назван).
Гм... да как же, он у тебя назван-то - WORLD_START что-ли :eek:
Сделай ему название из одного слова... пример - WORLDSTART, название функции тогда, будет такой - STARTUP_WORLDSTART :)
 

DEDROIT


Модостроитель
Регистрация
8 Ноя 2005
Сообщения
425
Благодарности
997
Баллы
235
Geor’G
Вообще название ещё больше, чем я здесь привёл.. В одно слово делал разницы никакой.
 

Стражник

Участник форума
Регистрация
14 Фев 2009
Сообщения
675
Благодарности
101
Баллы
220
Мільтен написал(а):
Стражник написал(а):
Создал НПС без диалогов. Общий вид файла получился следующий:

instance NONE_2001_Flavius(Npc_Default)
{
name[0] = "Флавиус";
guild = GIL_NONE;
id = 2001;
voice = 6;
flags = 0;
npcType = npctype_main;
aivar[AIV_MM_FollowTime] = 60;
B_SetAttributesToChapter(self,4);
fight_tactic = FAI_HUMAN_STRONG;
EquipItem(self,ItMw_Orkschlaechter);
CreateInvItems(self,ItFo_Apple,1);
B_SetNpcVisual(self,MALE,"Hum_Head_FatBald",Face_N_Tough_Okyl,BodyTex_N,ITAR_CorAngar);
Mdl_SetModelFatness(self,0);
Mdl_ApplyOverlayMds(self,"Humans_Militia.mds");
B_GiveNpcTalents(self);
B_SetFightSkills(self,60);
daily_routine = Rtn_Start_2001;
};


func void Rtn_Start_2001()
{
TA_Read_Bookstand(8,0,23,0,"NW_XARDAS_TOWER_IN1_28");
TA_Read_Bookstand(23,0,8,0,"NW_XARDAS_TOWER_IN1_28");
};

Привязал его к NONE_100_XARDAS.
При компиляции выдается сообщение с ошибками:
Большинство ошибок и внимания пишут что Функция должна возвращать значение

В этом файле - AI_Magic_C_CanNpcCollideWithSpell.d (447) выдается ошибка - Неожиданный return
В intern_NONE_2001_Flavius.d(24); выдается ошибка - Переопределенный идентификатор: RTN_START_2001

Каким образом можно исправить эти ошибки и есть ли программа с помощью которой это можно делать автоматически.

Скачай декомпилированые скрипты от Акеллы. Вот ссылка.
Декомпилированые скрипты от Акеллы скачаны и установлены в папку Готика 2, но результат все тот же.
Если возможно, то обьясните пожалуйста более подробно как создавать нового НПС и вставлять его в игру. Если возможно дайте посмотреть готовый скрипт созданного НПС(без ошибок для внедрения его в игру) .
Заранее извиняюсь за эти элементарные для многих вопросы, но просьба ответьте на них подробнее. Очень хочется реализовать часть идей по внедрению ряда НПС в игру, но мои познания в моддинге со знаком "-", и без помощи опытных людей мне очень сложно в этом разобраться.
 
Последнее редактирование модератором:

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Стражник
Очень настоятельно (уже в который раз :) ) рекомендую скачать мод "Кузнец"и начать работы по внедрению собственных нововведений с него. При компиляции"Кузнеца"нет ни одной ошибки и изменения по сравнению с оригиналом минимальны. Вставляешь своих персов, собираешь мод обратно и тестишь. Можешь взять "Кузнеца", в WinMerge сравнить с оригиналом Г2а и исправить ошибки оригинала - отсутствие return и т.д. Но с незнанием грамматики есть шанс не то исправить. ;)
Опыт приобретается методом проб и ошибок.
+ желание и терпение. ;)

Saturas
Вот те и ответ я с участием Укура, смог написать подобную функцию за что спасибо Укуру
В спойлерах смотри оригинал г2а и нашу с Укуром
Посмотрел поплотнее. И не нашел никакого практического применения (кроме красивого уменьшения маны во время каста) - все равно закл кастуется и урон наносится при полном расходе требуемой на закл маны. Если маны недорасходовал - урона нет, а ману потерял. А вот если бы урон наносился пропорционально расходованной мане - было бы круто. ;)
 
Последнее редактирование модератором:

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Dimmell написал(а):
Посмотрел поплотнее. И не нашел никакого практического применения (кроме красивого уменьшения маны во время каста) - все равно закл кастуется и урон наносится при полном расходе требуемой на закл маны. Если маны недорасходовал - урона нет, а ману потерял. А вот если бы урон наносился пропорционально расходованной мане - было бы круто. ;)
Пирокинез напирмер хавает мана проппорционально нанося урон.
Ну лечение из Г1 мне например больше нравиться, восстанавливается здоровье, пропорционально затраченной мане. Да и так ведь интереснее, не сумел кастануть - потерял ману :D

DEDROIT написал(а):
Geor’G
Вообще название ещё больше, чем я здесь привёл.. В одно слово делал разницы никакой.
Меня как-то мастер готики также попросил помочь разобраться с похожим вопросом, но у него не работал нормально переход в другую локацию. Вроде все имена совпадали и тоже, как выяснилось вся проблема была лишь в названии вейпоинта и ЗЕНа, а все вот из-за таких же извращений с именами. Вообщем решать тебе как делать, но если у тебя не работает элементарное, из того, что просто обязано работать и ты это попробуешь обойти другими методами, то только накосячишь еще больше. Просто попробуй сократить название ЗЕНа до приемлимого и не используй лишние разделители "_".
 
Последнее редактирование модератором:

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
ukur
Пирокинез напирмер хавает мана проппорционально нанося урон.
Не охота же плодить степы до штук 10-12.
А другого решения вроде нет. :(
Да и так ведь интереснее, не сумел кастануть - потерял ману
Для мощных заклов - согласен, но на определенном уровне эта фишка становится неактуальна. И при кривых руках и глючной мыши - сплошные нервы. :)
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
Dimmell написал(а):
ukur
Пирокинез напирмер хавает мана проппорционально нанося урон.
Не охота же плодить степы до штук 10-12.
А другого решения вроде нет. :(
Да и так ведь интереснее, не сумел кастануть - потерял ману
Для мощных заклов - согласен, но на определенном уровне эта фишка становится неактуальна. И при кривых руках и глючной мыши - сплошные нервы. :)
Диммель, а ты не думал Зачем мы это сделали? я же вроде сказал что это открывает НОВЫЕ возможности при создании эффекта закла), а на счет того что ты сказал в 12степов это чушь можно и в 1степ сделать с расходом маны прямопропорционально повреждению.
Поройся в файле VisualFX.DAT и может поймешь что я имею в виду ;)
 
Последнее редактирование модератором:

Je00Ka

Участник форума
Регистрация
16 Авг 2008
Сообщения
65
Благодарности
0
Баллы
160
Решил создать телепорт... покопался в скриптах, худо-бедно разобрался, но возник вопрос:
Что значит эта строчка: AI_PlayAni (self, "T_HEASHOOT_2_STAND");
Заранее благодарен за помощь
 
Последнее редактирование модератором:

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Je00Ka написал(а):
Что значит эта строчка: AI_PlayAni (self, "T_HEASHOOT_2_STAND");
Заранее благодарен за помощь
Эта функция проигрывает анимацию состояния тела ГГ из заклинающей в обычную.
 
Последнее редактирование модератором:
Сверху Снизу