Jr13San
Модостроитель
- Регистрация
- 1 Апр 2010
- Сообщения
- 463
- Благодарности
- 289
- Баллы
- 230
Я не знаю, будет ли этот код кому-то в пользу или во вред.Вопрос такой. В параметрах C_ITEM есть weigth (вес поидее), можно ли в игре сделать вес вещей более проще чем я это пробую сделать?
На всякий случай выложу пример расчёта веса предметов у персонажа.
1) Для определения численных границ идентификаторов предметов необходимо расставить два предмета - пустышки. Один, инстанция которого называется "It_StartIndex" - это самый первый предмет из всех предметов, имеющихся в проекте.
В данном случае помещаю его перед инстанцией "ItAm_Addon_Franco", вот так:
Код:
instance It_StartIndex(C_Item)
{
mainflag = ITEM_KAT_NONE;
flags = ITEM_NFOCUS;
};
instance ItAm_Addon_Franco(C_Item)
{
name = NAME_Amulett;
mainflag = ITEM_KAT_MAGIC;
flags = ITEM_AMULET;
value = Value_ItAm_Addon_Franco;
visual = "ItAm_Hp_01.3ds";
visual_skin = 0;
material = MAT_METAL;
on_equip = Equip_ItAm_Addon_Franco;
on_unequip = UnEquip_ItAm_Addon_Franco;
wear = WEAR_EFFECT;
effect = "SPELLFX_ITEMGLIMMER";
description = "Амулет Франко";
text[2] = NAME_Bonus_Str;
count[2] = STR_Franco;
text[3] = NAME_Bonus_Dex;
count[3] = DEX_Franco;
text[4] = NAME_Bonus_HP;
count[4] = HP_ItAm_Addon_Franco;
text[5] = NAME_Value;
count[5] = value;
inv_zbias = INVCAM_ENTF_AMULETTE_STANDARD;
};
Второй же предмет, инстанция которого называется "It_EndIndex" помещается в конец всех предметов и оказывается последним или замыкающим предметом.
Код:
instance itmi_erolskelch(C_Item)
{
name = "Поцарапанная серебряная чаша";
mainflag = ITEM_KAT_NONE;
flags = ITEM_MULTI;
value = 125;
visual = "ItMi_SilverChalice.3DS";
material = MAT_METAL;
description = name;
text[5] = NAME_Value;
count[5] = value;
};
instance It_EndIndex(C_Item)
{
mainflag = ITEM_KAT_NONE;
flags = ITEM_NFOCUS;
};
2)Далее в проекте создаём папку, например "TriggerScripts", а в ней скрипт - "TR_FINDWEIGHT.d" и пишем в нём следующий код в такой же последовательности:
Код:
var int Player_Tonnage;//Тоннаж игрока(вес переносимых вещей)
var int Item_StartIndex;//начальный индекс для поиска вещей
var int Item_EndIndex;//последний индекс для поиска вещей
//функция преобразования идентификаторов вещей в их инстанции
func int GiveInstance(var int id)
{
return id;
};
//Стэковый цикл перебора индефикаторов всех вещей...
//...для поиска общего веса вещей персонажа
func void PC_FindWeight(var int id)
{
var int itemInstance;
itemInstance = GiveInstance(id);//по id получаем инстанцию предмета или 'не предмета'
var int items;
items = Npc_HasItems(hero,id);//по этому же id смотрим, имеются ли у ГГ такие вещи
if (items > 0)//если таковые вещи имеются
{
//получаем ссылку на предметы
Npc_GetInvItem(hero, itemInstance);
//добавляем вес вещей
Player_Tonnage = Player_Tonnage + items * item.weight;
};
//если счётчик не превышает допустимые пределы, то
if (id < Item_EndIndex)
{
//продолжаем перебор (вызов функции из самой себя)
PC_FindWeight(id + 1);
};
//иначе, обрываем цикл и выходим из функции
return;
};
func void TR_FINDWEIGHT()//Trigger-script (Задержка = 1 сек.)
{
var string str;
//если индексы вещей не найдены, то
if (Item_StartIndex == 0) || (Item_EndIndex == 0)
{
var C_NPC her;
//создаём ссылку на игрока(используем инстанцию 'PC_Hero' по умолчанию)
her = Hlp_GetNpc(PC_Hero);
//создаём вещи у ГГ для определения индексов
CreateInvItem(her,It_StartIndex);
CreateInvItem(her,It_EndIndex);
//находим индексы
Item_StartIndex = Hlp_GetInstanceId(It_StartIndex);//начальный индекс поиска
Item_EndIndex = Hlp_GetInstanceId(It_EndIndex);//окончательный индекс
//удаляем вещи
Npc_RemoveInvItem(her,It_StartIndex);
Npc_RemoveInvItem(her,It_EndIndex);
};
Player_Tonnage = 0;//обнуляем значение веса предметов у игрока
PC_FindWeight(Item_StartIndex);//находим вес предметов
//объединение и вывод информации на экран
str = IntToString(Player_Tonnage);
str = ConcatStrings("Переносимый вес: ",str);
str = ConcatStrings(str," ед.");
PrintScreen(str,3,5,Font_ScreenSmall,2);
Wld_SendTrigger("TR_FINDWEIGHT");//вызываем триггер
};
3) Триггер-скрипт вызывается в одной из функций инициализации локации, например, таком образом:
Код:
func void INIT_NEWWORLD_PART_CITY()
{
Wld_SendTrigger("TR_FINDWEIGHT");
};
4) Функция "PC_FindWeight" имеет локальную переменную "itemInstance". Чтобы эта переменная хранила в себе ссылку на инстанцию, необходимо сделать кое-какие изменения в ходе компиляции проекта.
Для этого переходим в системную папку программы GothicSourcer V3.14.
В данном случае это: "С:\GothicSourcer V3.14\GothicSourcer\System\". Затем находим и открываем файл "RedefinedLocalVariable.dsc" любым текстовым редактором. Теперь нужно добавить в него следующую строчку:
Код:
int# PC_FindWeight.itemInstance;
Также, в этой папке находим и открываем файл "RedefinedFunc.dsc" и прописываем в нём следующую строчку:
Код:
int# GiveInstance(int);
Всё, теперь можно использовать свойство weight у любых вещей, заключённых в искусственные рамки предметов "It_StartIndex" и "It_EndIndex" и определять общий вес вещей, переносимых персонажем PC_Hero.
Используемая программа: GothicSourcer 3.14
Использованные скрипты: Г2НВ.
Свойства триггер-скрипта см. во вложении.