- Регистрация
- 26 Мар 2004
- Сообщения
- 2.107
- Благодарности
- 1.054
- Баллы
- 315
Спасибо  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.
Данный вариант я тестил: сохранял / загружал игру и менял мир. Вроде всё работает. Возможно какие то нюансы вылезут в будущем. Если кто то хочет потестировать в своём моде, пишите, поможем собрать тестовую сборку.
Вложения
			
				Последнее редактирование: 
			
		
	
								
								
									
	
								
							
							 
				

 
		 
 
		
 
		
	
								 
 
		 
 