- Регистрация
- 26 Мар 2004
- Сообщения
- 2.001
- Благодарности
- 971
- Баллы
- 295
Спасибо Gratt за то что Юнион лишил нас костылей.
Клон Торговца
- настоящего торговца нельзя будет избить и забрать все товары(Г1);
- после избиения настоящего торговца не пропадут все товары(Г2);
- торговец не оденет оружие из ассортимента товаров;
- торговец не начнёт продавать свои собственные вещи, например руны(Г1);
- не получится бесконечно продавать предметы с флагом "миссия"/
Daedalus:
func void NPC_SetTrader(var c_npc newnpc)
***
инстанция клона торговца
Для клона торговца по хорошему надо создать отдельный прототип. Я не знаю какой минимальный набор должен быть для подобных болванчиков и хотел бы попросить ElderGamer подсказать в этой части.
Daedalus:
prototype Npc_CloneTrader(C_NPC)
{
id = 666; // можно ли использовать значение "-1" ? или вообще оставить пустым?
flags = NPC_FLAG_IMMORTAL;
//-------- abilities --------
attribute [ATR_STRENGTH] = 1;
attribute [ATR_DEXTERITY] = 1;
attribute [ATR_MANA_MAX] = 1;
attribute [ATR_MANA] = 1;
attribute [ATR_HITPOINTS_MAX] = 666;
attribute [ATR_HITPOINTS] = 666;
// ------ Grund-Schadensresistenzen: Keine ------
protection [PROT_EDGE] = -1;
protection [PROT_BLUNT] = -1;
protection [PROT_POINT] = -1;
protection [PROT_FIRE] = -1;
protection [PROT_MAGIC] = -1;
// ------ Schdenstyp im Faustkampf ------
damagetype = DAM_BLUNT;
//-------- senses --------
//senses = SENSE_HEAR | SENSE_SEE ;
//senses_range = 2000; //SN: am 30.11.00 von 15m auf 20m erhцht (WICHTIG fьr Profilings!)
start_aistate = ZS_Drained_YBerion; // нужен наверное какой аналог?
//или вообще start_aistate в данном случае не нужен?
};
Daedalus:
instance KDW_604_Cronos_Trader(Npc_CloneTrader)
{
Mdl_SetVisual (self,"HUMANS.MDS");
};
вставка клона торговца в мир и замена торговца
в данном примере я решил вставлять в мир клона торговца непосредственно перед торговлей, поэтому я добавил проверку на наличие в мире и вставку непосредственно перед вызовом NPC_SetTrader
Daedalus:
// slf - оригинальный торговец
// npcClone - клон
func void B_NPC_SetTrader(var c_npc slf, var int intClone)
{
var C_NPC npcClone; npcClone = Hlp_GetNpc(intClone); // !!! берём ссылку на НПС !!!
if (!Hlp_IsValidNpc(npcClone))
{
// нпс в мире нет -> вставляем
Wld_InsertNpc (intClone,"OC1");
npcClone = Hlp_GetNpc(intClone); // !!! берём ссылку на НПС !!!
};
npcClone.name = slf.name; // даём клону имя хозяина
// перезаписать ещё какие то данные?
NPC_SetTrader(npcClone); // !!! сама замена торговца !!!
Hlp_PrintConsole(Str_Format("B_NPC_SetTrader slf=%s :: npcClone=%s", slf.name, npcClone.name));
};
ассортимент торговца
Необходимо будет так же поменять НПС который будет "получать" товары каждую главу. на примере B_Give_CronosChapter я оключил оригинальные функции и добавил новые, немного их поправив. весь файл в скрепке.
Daedalus:
func void B_Give_CronosChapter(var int intnpc)
{
var C_NPC npc; npc = Hlp_GetNpc(intnpc);
if (Hlp_IsValidNpc(npc)) // нпс есть в мире
{
B_Give_CronosChapter0(npc); // "возобновляемый" лут
if (Kapitel >= 1) { B_Give_CronosChapter1(npc,1); };
if (Kapitel >= 2) { B_Give_CronosChapter2(npc,2); };
if (Kapitel >= 3) { B_Give_CronosChapter3(npc,3); };
if (Kapitel >= 4) { B_Give_CronosChapter4(npc,4); };
if (Kapitel >= 5) { B_Give_CronosChapter5(npc,5); };
//if (Kapitel >= 6) { B_Give_CronosChapter6(npc,6); };
};
};
диалог с торговцем
теперь когда подготовительная работа проведена, остаётся просто вызвать функции в диалоге с торговцем
Daedalus:
func void KDW_604_Cronos_SELLSTUFF_Info()
{
AI_Output(hero, self,"KDW_604_Cronos_SELLSTUFF_Info_15_01");
//Ich mцchte Schriften ьber Magie erwerben.
B_NPC_SetTrader(self,KDW_604_Cronos_Trader);
B_Give_CronosChapter(KDW_604_Cronos_Trader);
};
p.s.
Данный вариант я тестил: сохранял / загружал игру и менял мир. Вроде всё работает. Возможно какие то нюансы вылезут в будущем. Если кто то хочет потестировать в своём моде, пишите, поможем собрать тестовую сборку.
Вложения
Последнее редактирование: