Показать сообщение отдельно
Старый 18.01.2005, 04:28   #85
finch

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

Ура, товарищи!  ;D
Два дня "битья" над регенерацией не прошли даром!
Пробовал создать амулет регенерации разными способами, но в конце концов получилось только при использовании исходников мода Mana Reload.

Короче, описываю алгоритм действий для создания амулета регенерации маны, который будет прибавлять +1 к мане каждую секунду.


В папке AI\Human\TA_Human создаем файл ZS_Recharger.d

Вот его содержимое(взято из Mana Reload и немного подправлено):


func void ZS_Recharger()
{
     B_ResetAll (self);
     B_ClearPerceptions (self);
};

func int ZS_Recharger_loop()
{
     if (Npc_GetStateTime(self) > 3)
     {
           Npc_SetStateTime (self, 0);

           if (hero.attribute[ATR_MANA] < hero.attribute[ATR_MANA_MAX])
           {
                       hero.attribute[ATR_MANA]=hero.attribute[ATR_MANA]+1;
           };

           AI_Teleport (self, Npc_GetNearestWP (hero));
           
     };

     return LOOP_CONTINUE;
};

func void ZS_Recharger_end()
{
     AI_PlayAni (self,"T_LGUARD_2_STAND");      
};



Далее в файле TA.d дописываем следующую строчку:


func void TA_Recharger      (var int start_h, var int start_m, var int stop_h, var int stop_m, VAR string waypoint)      {TA_Min            (self,      start_h,start_m, stop_h, stop_m, ZS_Recharger,                        waypoint);};


Теперь создаем НПС, который будет отвечать за нашу регенерацию.

В папку Story\NPC вставляем файл None_999_Recharger.d, следующего содержания:


instance None_999_Recharger (Npc_Default)  
{
 name                             = "";
 guild                            = GIL_NONE;
 npctype                          = NPCTYPE_AMBIENT;
 flags                            = NPC_FLAG_IMMORTAL|NPC_FLAG_GHOST;
 level                            = 999;
 voice                            = 0;
 id                               = 999;
 noFocus                          = 1;
 bodyStateInterruptableOverride       = 1;

 damagetype                          = DAM_EDGE;
 damage [DAM_INDEX_EDGE]            = 0;


 //-------- visuals --------
 B_SetNpcVisual (self, MALE, "Hum_Head_Fatbald", 0, 0, ITAR_MIL_M);
 Mdl_SetModelScale (self, 0.01, 0.01, 0.01);


 //-------- talents --------
 B_SetFightSkills (self, 0);  


 //------------- ai -------------
 fight_tactic    = FAI_HUMAN_COWARD;


 daily_routine    = Rtn_start_999;
};


func void Rtn_Regeneration_999 ()
{
  TA_Recharger (0,00,13,00, Npc_GetNearestWP (hero));
  TA_Recharger (13,00,0,00, Npc_GetNearestWP (hero));
};

func void Rtn_start_999 ()
{
  TA_Stand_WP (0,00,13,00, Npc_GetNearestWP (hero));
  TA_Stand_WP (13,00,0,00, Npc_GetNearestWP (hero));
};



Обратите внимание, что НПС почти невидим!

Прописываем нового НПС в стартапе:


Wld_InsertNpc      (None_999_Recharger,Npc_GetNearestWP (hero));




Ну и в конце-концов вставляем в файле It_Amulette.d следующее:


     INSTANCE  ItAm_Mana_Regener(C_Item)
{
     name                   =      NAME_Amulett;

     mainflag             =      ITEM_KAT_MAGIC;
     flags                   =      ITEM_AMULET;

     value                   =      Value_Mana_Regener;

     visual                   =      "ItAm_Strg_01.3ds";

     visual_skin       =      0;
     material             =      MAT_METAL;
     on_equip            =      Equip_ItAm_Mana_Regener;
     on_unequip            =      UnEquip_ItAm_Mana_Regener;

     wear                  =       WEAR_EFFECT;
     effect                  =      "SPELLFX_ITEMGLIMMER";

     description            = "Амулет регенерации маны";
     
     
     TEXT[5]                  = NAME_Value;
     COUNT[5]            = value;

     INV_ZBIAS                        = INVCAM_ENTF_AMULETTE_STANDARD;
     
};

FUNC VOID Equip_ItAm_Mana_Regener()
{
     Npc_ExchangeRoutine      (None_999_Recharger,"Regeneration");
};

FUNC VOID UnEquip_ItAm_Mana_Regener()
{
     Npc_ExchangeRoutine      (None_999_Recharger,"Start");
};




Вот, собственно говоря и все. Амулет работает. Единственное, если пользоваться F8 для перелетов на большие расстояния, амулет перестает работать. Чтобы он снова заработал, его надо снять и снова одеть. Этот баг появляется из-за того, что наш речаджер не успевает за нами, т.к. не умеет пользоваться "марвином"! :D
Но, в принципе, тем кто пользуется F8 регенерация маны ни к чему!  :lol:

2Dagot_Ur: Если будешь читать этот топик, расскажи, плз, свой способ создания предмета с регенерирующими способностями.
Ответить с цитированием