***********************
// Geklaute Waffen checken
// ***********************
FUNC VOID B_CheckStolenEquipment ()
{
var C_Item melee;
var C_Item ranged;
var C_ITEM armor;
melee = Npc_GetEquippedMeleeWeapon (other);
ranged = Npc_GetEquippedRangedWeapon (other);
armor = Npc_GetEquippedArmor (other);
if (Npc_OwnedByNpc (melee, self))
{
PrintDebugNpc (PD_ZS_CHECK, "...SC trдgt Nahkampf-Waffe des NSCs offen!");
self.aivar[AIV_WANTEDITEM] = Hlp_GetInstanceId (melee);
if (!Npc_HasNews (self, NEWS_DEFEAT, other, self) && self.aivar [AIV_PCISSTRONGER] == 0)
{
PrintDebugNpc (PD_ZS_CHECK, "...NSC ist nicht vom SC besiegt worden & hat noch nicht danach gefragt!");
Npc_ClearAIQueue( self);
C_LookAtNpc ( self, other);
AI_TurnToNpc ( self, other);
AI_PointAtNpc ( self, other);
B_Say ( self, other,"$THATSMYWEAPON");
AI_StartState ( self, ZS_GetBackBelongings, 1, "");
return;
};
}
else if (Npc_OwnedByNpc ( ranged, self))
{
PrintDebugNpc (PD_ZS_CHECK, "...SC trдgt Fernkampf-Waffe des NSCs offen!");
self.aivar[AIV_WANTEDITEM] = Hlp_GetInstanceId (ranged);
if (!Npc_HasNews (self, NEWS_DEFEAT, other, self) && self.aivar [AIV_PCISSTRONGER] == 0)
{
Npc_ClearAIQueue( self);
C_LookAtNpc ( self, other);
AI_TurnToNpc ( self, other);
AI_PointAtNpc ( self, other);
B_Say ( self, other,"$THATSMYWEAPON");
AI_StartState ( self, ZS_GetBackBelongings, 1, "");
return;
};
};
};
48:28 Warn: 0 C: SCRIPT: Npc_OwnedByNpc(): illegal param: "B_CHECKSTOLENEQUIPMENT.RANGED" is NULL. .... <oGameExternal.cpp,#252>
48:28 Warn: 0 C: SCRIPT: last parser func-name: B_ASSESSSC .... <oGameExternal.cpp,#262>
if (Npc_HasEquippedMeleeWeapon(other))
{
var C_Item melee;
melee = Npc_GetEquippedMeleeWeapon(other);
if (Npc_OwnedByNpc(melee, self))
{
...
...
...
if (Npc_HasEquippedRangedWeapon(other))
{
var C_Item ranged;
ranged = Npc_GetEquippedRangedWeapon(other);
if (Npc_OwnedByNpc(ranged, self))
{
Переписывал. Прям сейчас под рукой скриптов нет.@ElderGamer ты не переписывал эту функцию?
Да. И для оружия ближнего боя тоже.надо добавить проверку на то экипировано ли оружие у НПС
// ***********************
// Geklaute Waffen checken
// ***********************
func void B_CheckStolenEquipment_true(var c_npc slf, var c_npc oth)
{
PrintDebugNpc (PD_ZS_CHECK, "...NSC ist nicht vom SC besiegt worden & hat noch nicht danach gefragt!");
Npc_ClearAIQueue(slf);
C_LookAtNpc (slf, oth);
AI_TurnToNpc (slf, oth);
AI_PointAtNpc (slf, oth);
B_Say (slf, oth,"$THATSMYWEAPON");
AI_StartState (slf, ZS_GetBackBelongings, 1, "");
};
//func void B_CheckStolenEquipment()
func int C_CheckStolenEquipment(var c_npc slf, var c_npc oth)
{
// Выход, если:
if (oth.id != hero.id) { return false; }; // oth это не НПС которым управляет игрок
if (Npc_HasNews(slf,NEWS_DEFEAT,oth,slf)) { return false; };
if (slf.aivar[AIV_PCIsStronger]) { return false; };
// heck оружия ближнего боя
if (Npc_HasEquippedMeleeWeapon(oth))
{
var C_Item melee;
melee = Npc_GetEquippedMeleeWeapon(oth);
if (Npc_OwnedByNpc(melee, slf))
{
PrintDebugNpc (PD_ZS_CHECK, "...SC trдgt Nahkampf-Waffe des NSCs offen!");
slf.aivar[AIV_WANTEDITEM] = Hlp_GetInstanceId (melee);
B_CheckStolenEquipment_true(slf, oth);
return true;
};
};
// heck оружия дальнего боя
if (Npc_HasEquippedRangedWeapon(oth))
{
var C_Item ranged;
ranged = Npc_GetEquippedRangedWeapon(oth);
if (Npc_OwnedByNpc(ranged, slf))
{
PrintDebugNpc (PD_ZS_CHECK, "...SC trдgt Fernkampf-Waffe des NSCs offen!");
slf.aivar[AIV_WANTEDITEM] = Hlp_GetInstanceId(ranged);
B_CheckStolenEquipment_true(slf, oth);
return true;
};
};
/*
// heck брони :-D
if (Npc_HasEquippedArmor(oth))
{
var C_ITEM armor; armor = Npc_GetEquippedArmor(oth);
if (Npc_OwnedByNpc(armor, slf))
{
slf.aivar[AIV_WANTEDITEM] = Hlp_GetInstanceId(armor);
B_CheckStolenEquipment_true(slf, oth)
return true;
};
};
*/
// у героя не экпипировинно оружие принадлежащее SELF
return false;
};
//////////////////////////////////////////////////////////////////////////
// ZS_PracticeSword
// ================
// Der NSC vollfьhrt eine Schwert-Kata auf der Stelle
// (FP "FIGHTTRAINING")
//////////////////////////////////////////////////////////////////////////
func void ZS_PracticeSword ()
{
PrintDebugNpc (PD_TA_FRAME,"ZS_PracticeSword");
B_SetPerception (self);
AI_SetWalkmode (self, NPC_WALK);
if !(Hlp_StrCmp(self.wp,Npc_GetNearestWP(self)))
{
AI_GotoWP (self, self.wp); // Gehe zum Tagesablaufstart
};
AI_DrawWeapon (self);
};
func void ZS_PracticeSword_Loop()
{
PrintDebugNpc (PD_TA_LOOP, "ZS_PracticeSword_Loop");
AI_PlayAni (self,"T_1HSFREE");
AI_GotoWP (self, self.wp);
AI_AlignToWP (self);
};
func void ZS_PracticeSword_End ()
{
PrintDebugNpc (PD_TA_FRAME, "ZS_PracticeSword_End");
B_FullStop (self);
B_RemoveWeapon (self);
};
func void B_DrawWeapon(var c_npc npc)
{
if (Npc_HasReadiedMeleeWeapon(npc)) { return; }; // НПС и так уже достал оружие --> выход
if (Npc_HasEquippedMeleeWeapon(npc) != 1)
{
// у НПС нет экипированного оружия --> Одеваем
AI_EquipBestMeleeWeapon(npc);
if (Npc_HasEquippedMeleeWeapon(npc) != 1)
{
// у НПС всё равно нет оружия
CreateInvItem(npc,ItMwPickaxe);
AI_EquipBestMeleeWeapon(npc);
};
};
AI_DrawWeapon(npc);
};
Я не знаю, как работает AI_DrawWeapon, если у непися экипировано и оружие ближнего боя, и оружие дальнего боя. Наверное, какая-то разновидность оружия имеет более высокий приоритет.чем AI_DrawWeapon отличается от AI_ReadyMeleeWeapon ?
func void B_DrawWeapon(var c_npc npc)
{
if (Npc_HasReadiedMeleeWeapon(npc)) { return; }; // НПС и так уже достал оружие --> выход
if (Npc_HasEquippedMeleeWeapon(npc) != 1) // Первая проверка.
{
// у НПС нет экипированного оружия --> Одеваем
AI_EquipBestMeleeWeapon(npc);
if (Npc_HasEquippedMeleeWeapon(npc) != 1) // Вторая проверка.
{
// у НПС всё равно нет оружия
CreateInvItem(npc,ItMwPickaxe);
AI_EquipBestMeleeWeapon(npc);
};
};
AI_DrawWeapon(npc);
};
AI_EquipBestMeleeWeapon ещё не будет выполнена
func void B_DrawWeapon(var c_npc npc)
{
if (Npc_HasReadiedMeleeWeapon(npc)) { return; }; // НПС и так уже достал оружие --> выход
if (Npc_HasEquippedMeleeWeapon(npc) != 1)
{
// у НПС нет экипированного оружия
if !Npc_GetInvItem(npc,ItMwPickaxe)
{
// создаём какое просто оружие на всякий случай
// можно делать проверку на фракцию и в зависимости
// от неё создавать разное оружие.
CreateInvItem(npc,ItMwPickaxe);
};
item.ownerGuild = npc.guild; // если герой отожмёт оружие чужой фракции, то может получить в тыкву от товарищй npc
AI_EquipBestMeleeWeapon(npc);
};
//AI_ReadyMeleeWeapon(npc); // используется в G2 MDK
AI_DrawWeapon(npc); // используется в G1 MDK
};
MDK | правки |
Daedalus:
|
Daedalus:
|
//////////////////////////////////////////////////////////////////////////
// B_DrawSpell
// ===========
// Zieht den angegebenen Spruch unter Berьcksichtigung, daЯ eventuell
// vorher ein AI_UnreadySpell durchgefьhrt werden muЯ.
//////////////////////////////////////////////////////////////////////////
func void B_DrawSpell(var C_NPC slf, var int spell, var int mana)
{
PrintDebugNpc (PD_ZS_FRAME, "B_DrawSpell");
if (Npc_IsInFightMode(slf, FMODE_MAGIC))
{
PrintDebugNpc (PD_ZS_CHECK, "...bereits im Magiemodus!");
if (Npc_GetActiveSpell(slf) != spell)
{
PrintDebugNpc (PD_ZS_CHECK, "...dieser Zauber liegt noch nicht auf der Hand!");
AI_UnreadySpell (slf);
// Das folgende AI_ReadySpell() verursacht den Kollisionsbug
// "only one moving vob without collision..." wenn die Funktion
// zweimal hintereinander aufgerufen wird, ohne ein
// AI_UnreadySpell dawzischen. Genau das ist aber nцtig
// wenn der NSC die Stдrke des Zaubers дndern will ohne
// den Zauber wegzustecken und wieder hervorzuholen!
};
AI_ReadySpell (slf, spell, mana);
}
else
{
if (Npc_IsInFightMode(slf, FMODE_MELEE)||Npc_IsInFightMode(slf, FMODE_FIST))
{
AI_RemoveWeapon (slf);
};
if (Npc_IsInFightMode(slf, FMODE_FAR))
{
AI_StopAim (slf);
AI_RemoveWeapon (slf);
};
PrintDebugNpc (PD_ZS_CHECK, "...noch nicht im Magiemodus!");
AI_ReadySpell (slf, spell, mana);
};
//-------- "echte" Magier bekommen Mana dazugeschummelt --------
if (slf.fight_tactic == FAI_HUMAN_MAGE)
{
PrintDebugNpc (PD_ZS_CHECK, "...Magier-Kampftaktik!");
var int manaLeft; manaLeft = slf.attribute[ATR_MANA];
var int manaMax; manaMax = slf.attribute[ATR_MANA_MAX];
var int manaRefill;
if ( manaLeft < (manaMax/2) )
{
PrintDebugInt (PD_ZS_CHECK, "...Mana ьbrig: ", manaLeft);
manaRefill = (manaMax/2) - manaLeft;
Npc_ChangeAttribute (slf, ATR_MANA, manaRefill);
PrintDebugInt (PD_ZS_CHECK, "...Mana hinzugefьgt: ", manaRefill);
};
};
return;
};
код | вопрос |
Daedalus:
| |
Daedalus:
| у тебя тут только для нелюдей это проверка? то есть можно ли её заменить на проверку по GIL_SEPERATOR_HUM что бы привычнее было. |
Daedalus:
| так же не понял зачем у тебя выполняется этот кусок. фактически это же значит что НПС уже держит нужны спелл
Daedalus:
|
Да. Зачем? Не знаю. Возможно, разрабы не захотели полностью восстанавливать ману мага в течение боя, чтобы он после боя сам восстанавливал её бутылочками.не меньше половины маны от максимальной?
Проверка для нелюдей, да. Но к использованию фрагментов отсюда следует подходить с осторожностью. Там вариант кода формировался постепенно, методом проб и ошибок, и работает это с учётом других фрагментов кода, например, состояний атаки, в которых пребывают неписи.у тебя тут только для нелюдей это проверка? то есть можно ли её заменить на проверку по GIL_SEPERATOR_HUM что бы привычнее было.
Повторюсь, код формировался постепенно, на основании многочисленных тестов внесённых в код изменений. Далеко не всегда я отчётливо понимал, что и как происходит при внесении изменений. Просто смотрел на результат и добивался, чтобы результат меня устроил. Возможно, там есть что-то лишнее, но не факт.фактически это же значит что НПС уже держит нужны спелл