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

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

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

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

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
Если речь о Гг или Нпс, то не думаю что правильно использовать эту функцию.

Что до второго вопроса, то двиг будет использовать лучшее оружие которое есть в инвентаре. Можно ли это обойти, сказать не могу т.к. не интересовался этой темой.

По функциям которые возможно тебе помогут:
// НПС npc вытаскивает оружие, которым экипирован.
func void AI_DrawWeapon(var C_NPC npc);

// НПС npc прячет оружие.
func void AI_RemoveWeapon(var C_NPC npc);

// НПС npc готовит оружие ближнего радиуса поражения к бою.
func void AI_ReadyMeleeWeapon(var C_NPC npc);

// НПС npc готовит оружие дальнего радиуса поражения к бою.
func void AI_ReadyRangedWeapon(var C_NPC npc);

// в инвентаре НПС npc ищется самое лучшее оружие ближнего радиуса поражения и вешается на пояс или спину.
func void AI_EquipBestMeleeWeapon(var C_NPC npc);

// в инвентаре НПС npc ищется самое лучшее оружие дальнего радиуса поражения и вешается на спину.
func void AI_EquipBestRangedWeapon(var C_NPC npc);
Но здесь все зависит от того, что конкретно ты хочешь сделать. И тогда могут потребоваться совсем другие функции. ::)
 

vmazz

Участник форума
Регистрация
18 Дек 2008
Сообщения
218
Благодарности
1
Баллы
165
Не думал что буду еще задавать вопросы, но так уж сложилось. :)
Почему-то не правильно выполняется такое условие:
Код:
var c_item EquipedBow;
if (Npc_HasEquippedRangedWeapon(self))
{
EquipedBow = Npc_GetEquippedRangedWeapon(self);
if(EquipedBow.flags == ITEM_BOW)     // вот тут косяк
{
    ....................
};
};
я конечно понимаю что можно ввести переменную или создать доп. aivar (вариантов хватает), но все-таки, почему данное сравнение возвращает FALSE даже если екипированное оружее действительно имеет флаг лука ??? может кто сталкивался с подобным...
PS: if equipedbow.name и т.д. срабатывает, но вот именно флаг почиму-то проверяется некорректно. :eek:
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
666
Баллы
245
vmazz
пробуй так if(EquipedBow.flags & ITEM_BOW) == ITEM_BOW
 

vmazz

Участник форума
Регистрация
18 Дек 2008
Сообщения
218
Благодарности
1
Баллы
165
Velikan написал(а):
Уважаемые скриптеры. Встал вопрос. ответьте, кто знает, пожалуйста.
EquipItem - если я эту функцию вызываю не в инстанции НПС, а например в функции, которая вызывается из триггера, то если я открываю инвентарь, то оружие в красной рамке, но на поясе у гг не появляется и таким образом все некорректно работает. То есть оно фактически не экипируется.
Могу ли в готике экипировать то оружие, какое хочу? Или в реальном времени можно Экипировать только лучшее оружие - функция AI_EquipBestMeleeWeapon???
Если досихпор мучаешся, то попробуй примерно так: сделай нужное оружие лучшим, AI_EquipBestMeleeWeapon, верни аттрибуты обратно. Например такая функция:
Код:
func void B_EquipMeleeWeapon(var C_NPC slf, var C_ITEM weapon)
{
var int dam_normal;
weapon = Npc_GetEquippedMeleeWeapon(slf);
dam_normal = weapon.damageTotal;
weapon.damageTotal = 999;
AI_EquipBestMeleeWeapon(slf)
weapon.damageTotal = dam_normal;
};
Работоспособность не проверял, но впринципе должно проканать.
redleha написал(а):
vmazz
пробуй так if(EquipedBow.flags & ITEM_BOW) == ITEM_BOW
Спасибо, теперь условие выполняется граммотно.
 
Последнее редактирование модератором:

GeorG

Участник форума
Регистрация
27 Авг 2008
Сообщения
3.447
Благодарности
11
Баллы
295
Вот этот код, тоже работает не корректно... хотя иногда и корректно, та и не понял почему:


Код:
func void B_GiveErrorInv(var C_Npc slf)
{

var C_Npc Trd_Tandor;

Trd_Tandor = Hlp_GetNpc(PAL_260_Tandor);
……
......
........


	if(Npc_HasEquippedWeapon(slf))
	{
	if(Npc_HasEquippedMeleeWeapon(slf))
	{
		if(Hlp_GetInstanceID(slf) != Hlp_GetInstanceID(Trd_Tandor)) || (Hlp_GetInstanceID(slf) != Hlp_GetInstanceID(Trd_Sengrath)) || (Hlp_GetInstanceID(slf) != Hlp_GetInstanceID(Trd_Diego_DI))
		{

//когда говорю с Тандором то этот код не должен обрабатываться... гм... а он 
//обрабатывается, хотя если сделать проверку двух НПС то работает нормально... 
    WeapHear = Npc_GetEquippedMeleeWeapon(slf);
		ValueWeaponMelee = Hlp_GetInstanceID(WeapHear);
		ValueHear = TRUE; 
		};			
	};
......
..........
............

};

В принципе я это обошёл другим способом, но просто интересно, в чём косяк
 

alex_draven


Модостроитель
Регистрация
13 Сен 2007
Сообщения
2.183
Благодарности
2.880
Баллы
420
Раз уж речь зашла о мечах, хочу для себя уточнить момент, ибо не скриптер. В некоторых модах реализована заточка оружия через диалог шлифовального круга. Я не ковырял их, но механизм представляю и могу предположить, что один меч там тупо заменяется другим. А нет ли способов изменить дамаг меча одной инстанции? Допустим, меч уже в руке у NPC, и через скрипт каким-то способом мы меняем параметры этого меча (думаю, что нет, но всё же) ???
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
alex_draven написал(а):
Раз уж речь зашла о мечах, хочу для себя уточнить момент, ибо не скриптер. В некоторых модах реализована заточка оружия через диалог шлифовального круга. Я не ковырял их, но механизм представляю и могу предположить, что один меч там тупо заменяется другим. А нет ли способов изменить дамаг меча одной инстанции? Допустим, меч уже в руке у NPC, и через скрипт каким-то способом мы меняем параметры этого меча (думаю, что нет, но всё же) ???
Можно изменить и дамаг меча, и визуал.
Смотри код.
Код:
var int damage; //создаем переменную повреждения



INSTANCE ItMw_1h_01 (C_Item) 
{	
	name 				=	"Мечь мастера";

	mainflag 			=	ITEM_KAT_NF;
	flags 				=	ITEM_SWD;	
	material 			=	MAT_METAL;

	value 				=	1347;

	damageTotal 	    = 	damage;
  
	damagetype 			=	DAM_EDGE ;
	range  			= 	170;		

	cond_atr[2]  		=	ATR_DEXTERITY;
	cond_value[2] 		=	60;
	visual 				=	"ITMW_1H_Sword_03.3DS";

	description			= name;
	TEXT[2]				= NAME_Damage;					COUNT[2]	= damage;
	TEXT[3] 			= NAME_Dex_needed;				COUNT[3]	= cond_value[2];
	TEXT[4] 			= NAME_OneHanded;
	TEXT[5]				= NAME_Value;					COUNT[5]	= value;
};


INSTANCE ItFo_Damage (C_Item)
{  
  name        =  "Damage";
  mainflag      =  ITEM_KAT_FOOD;    
  flags        =  ITEM_MULTI;
  value        =  1;     
  visual       = "ItFo_Wine.3DS";
  material      =  MAT_LEATHER;     
  scemeName      = "POTION";
  on_state[0]     =  Use_Damage;      
  description     =  name;         
  TEXT[3]       =  "Меняет значение переменной Damage";
  TEXT[4]       =  NAME_Value;      
  COUNT[4]      =  Value_Apple;     

};

// Использовать
func void Use_Damage()
{  
    
    Damage = Damage + 50; //прибавить к перменной Damage 50
  
};

Файл Startup.d
func void INIT_Твой_мир()
{
    B_InitMonsterAttitudes ();
	B_InitGuildAttitudes();
	damage       =   100;  //значение переменной damage
};
Примерно так можно поменять даже Визуал меча!
 
Последнее редактирование модератором:

vmazz

Участник форума
Регистрация
18 Дек 2008
Сообщения
218
Благодарности
1
Баллы
165
Geor'G написал(а):
Вот этот код, тоже работает не корректно... хотя иногда и корректно, та и не понял почему:


Код:
func void B_GiveErrorInv(var C_Npc slf)
{

var C_Npc Trd_Tandor;

Trd_Tandor = Hlp_GetNpc(PAL_260_Tandor);
……
......
........


if(Npc_HasEquippedWeapon(slf))
{
if(Npc_HasEquippedMeleeWeapon(slf))
{
if(Hlp_GetInstanceID(slf) != Hlp_GetInstanceID(Trd_Tandor)) || (Hlp_GetInstanceID(slf) != Hlp_GetInstanceID(Trd_Sengrath)) || (Hlp_GetInstanceID(slf) != Hlp_GetInstanceID(Trd_Diego_DI))
{

//когда говорю с Тандором то этот код не должен обрабатываться... гм... а он 
//обрабатывается, хотя если сделать проверку двух НПС то работает нормально... 
    WeapHear = Npc_GetEquippedMeleeWeapon(slf);
ValueWeaponMelee = Hlp_GetInstanceID(WeapHear);
ValueHear = TRUE; 
};
};
......
..........
............

};

В принципе я это обошёл другим способом, но просто интересно, в чём косяк
А косяк помоему тут:
if(Hlp_GetInstanceID(slf) != Hlp_GetInstanceID(Trd_Tandor))
||(Hlp_GetInstanceID(slf) != Hlp_GetInstanceID(Trd_Sengrath))
||(Hlp_GetInstanceID(slf) != Hlp_GetInstanceID(Trd_Diego_DI))
Надо наверно всетаки ставить И , а не ИЛИ.
 
Последнее редактирование модератором:

GeorG

Участник форума
Регистрация
27 Авг 2008
Сообщения
3.447
Благодарности
11
Баллы
295
vmazz, верно через и... спасибо...
Я вот так вышел из ситуации если интересно...
Код:
	if(Npc_HasEquippedMeleeWeapon(slf))
	{
		if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Trd_Tandor)) || (Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Trd_Sengrath)) || (Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Trd_Diego_DI))
		{
		ValueHear = FALSE;	
		}
		else
		{
    WeapHear = Npc_GetEquippedMeleeWeapon(slf);
		ValueWeaponMelee = Hlp_GetInstanceID(WeapHear);
		ValueHear = TRUE; 			
		};
		
	};

А вот про и или или, стыдно признать, даже не подумал ::)
 

Je00Ka

Участник форума
Регистрация
16 Авг 2008
Сообщения
65
Благодарности
0
Баллы
160
У меня возник вопрос:
Я создаю скрипт диалога и у меня при определенных стечениях обстоятельств НПС должен убежать от гг на вэйпоинт, мне вставлять только ZS_FleeToWp() или всю функцию?
 

DUSTinghoFFman

Участник форума
Регистрация
24 Май 2008
Сообщения
904
Благодарности
4
Баллы
185
Je00Ka написал(а):
У меня возник вопрос:
Я создаю скрипт диалога и у меня при определенных стечениях обстоятельств НПС должен убежать от гг на вэйпоинт, мне вставлять только ZS_FleeToWp() или всю функцию?

Убежать после диалога? И вообще, можно подробнее? Желательно привести хотя бы важную часть скрипта. Плохо понял суть вопроса.
Можно использовать эту команду: AI_GotoWP(var C_NPC npc, var string waypoint);
 
Последнее редактирование модератором:

MaGoth

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

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

Je00Ka

Участник форума
Регистрация
16 Авг 2008
Сообщения
65
Благодарности
0
Баллы
160
В принципе я понял, но если использовать команду AI_GotoWP НПС вроде как пешком ее выполняет(например тот же Ерол), а как заставить НПС бежать?
 

DUSTinghoFFman

Участник форума
Регистрация
24 Май 2008
Сообщения
904
Благодарности
4
Баллы
185
Je00Ka написал(а):
В принципе я понял, но если использовать команду AI_GotoWP НПС вроде как пешком ее выполняет(например тот же Ерол), а как заставить НПС бежать?

Цитирую Vam:

// установить режим передвижения moveMode для НПС npc.
// Определены следующие режимы:
// NPC_RUN – бег,
// NPC_WALK – ходьба шагом,
// NPC_SNEAK – подкрадывание,
// NPC_RUN_WEAPON – бег с оружием,
// NPC_WALK_WEAPON – ходьба с оружием,
// NPC_SNEAK_WEAPON – подкрадывание с оружием.
func void AI_SetWalkmode(var C_NPC npc, var int moveMode);

Это же в "Сорсере"есть, неужели поискать так трудно? :-\
 
Последнее редактирование модератором:

Je00Ka

Участник форума
Регистрация
16 Авг 2008
Сообщения
65
Благодарности
0
Баллы
160
2DUSTinghoFFman Спасибо, но вроде можно и так:
TA_FleeToWp или TA_RunToWp(это тоже от Vam'а) :)
Что кстати лучше?
 

Marvіn

Участник форума
Регистрация
17 Апр 2008
Сообщения
99
Благодарности
9
Баллы
180
Je00Ka
Ну разве так трудно проверить самому это все. Уже 6 сообщений подряд обсуждается одна функция. Я думаю проще и быстрее, а главное полезно было бы самому сесть и проверить как и что работает.
 

AlchemisT 77

Участник форума
Регистрация
24 Июл 2009
Сообщения
9
Благодарности
0
Баллы
145
Ребята,у меня вопрос:
Какое условие должно быть в диологе,если я хочу чтобы каждый день ко мне обращался тип и допустим давал мне бутылку воды.
Но мне главное знать какое должно быть условие чтобы он обращался ко мне каждый день.
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
AlchemisT 77 написал(а):
Ребята,у меня вопрос:
Какое условие должно быть в диологе,если я хочу чтобы каждый день ко мне обращался тип и допустим давал мне бутылку воды.
Но мне главное знать какое должно быть условие чтобы он обращался ко мне каждый день.

В похожем случае я поступил так:

Завел следующую константу:

const int AIV_PHIL_DAY_DIALOG = 45;

В диалоге, после которого следующий диалог (в Вашем случае тот же самый, в моем - другой диалог) должен повториться не ранее, чем через день, поставил такое :

self.aivar[AIV_PHIL_DAY_DIALOG]=Wld_GetDay();


А проверка допустимости диалога:

if (self.aivar[AIV_PHIL_DAY_DIALOG] >= Wld_GetDay()) {
 
Последнее редактирование модератором:

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
При создании мода возникла проблема. Нужно в некий момент (определяется в диалоге) очистить некую WP и ее окрестности от живности (чтобы не сломать сюжет).

Единственное, что пришло в голову, это переопределить монстров (сделать "именными") и удалить или умертвить их из скрипта диалога.

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

Может есть какие приемы для решения этой задачи?
 
Последнее редактирование модератором:

Dimmell

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