- OnSpellCastAtに入るスクリプトを置いていきます。
- 呪文を使用された時に発動する。
#include "nw_i0_generic"
#include "x2_i0_spells"
void main()
{
//最後に呪文を唱えたクリーチャーを習得する
object oCaster = GetLastSpellCaster();
if(GetLastSpellHarmful())
{
SetCommandable(TRUE);
// ------------------------------------------------------------------
// 同じファンクションの魔法に巻き込まれた場合は許します
// ------------------------------------------------------------------
if (GetFactionEqual(oCaster, OBJECT_SELF) == TRUE)
{
ClearPersonalReputation(oCaster, OBJECT_SELF);
ClearAllActions(TRUE);
DelayCommand(1.2, ActionDoCommand(DetermineCombatRound(OBJECT_INVALID)));
// ユーザーイベントを実行する
if(GetSpawnInCondition(NW_FLAG_SPELL_CAST_AT_EVENT))
{
SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_SPELL_CAST_AT));
}
return;
}
int bAttack = TRUE;
// ------------------------------------------------------------------
// GZ, 2003-Oct-02
// 範囲呪文を受けた場合、少し賢い事をするでしょう
// AoEはArea of Effectの略。
// ------------------------------------------------------------------
if (MatchAreaOfEffectSpell(GetLastSpell()) == TRUE)
{
int nAI = (GetBestAOEBehavior(GetLastSpell())); // from x2_i0_spells
switch (nAI)
{
case X2_SPELL_AOEBEHAVIOR_DISPEL_L:
case X2_SPELL_AOEBEHAVIOR_DISPEL_N:
case X2_SPELL_AOEBEHAVIOR_DISPEL_M:
case X2_SPELL_AOEBEHAVIOR_DISPEL_G:
case X2_SPELL_AOEBEHAVIOR_DISPEL_C:
bAttack = FALSE;
ActionCastSpellAtLocation(nAI, GetLocation(OBJECT_SELF));
ActionDoCommand(SetCommandable(TRUE));
SetCommandable(FALSE);
break;
case X2_SPELL_AOEBEHAVIOR_FLEE:
//範囲攻撃を行った相手の近く移動して攻撃行動を取る
ClearActions(CLEAR_NW_C2_DEFAULTB_GUSTWIND);
oCaster = GetLastSpellCaster();
ActionForceMoveToObject(oCaster, TRUE, 2.0);
DelayCommand(1.2, ActionDoCommand(DetermineCombatRound(oCaster)));
bAttack = FALSE;
break;
case X2_SPELL_AOEBEHAVIOR_IGNORE:
// well ... nothing
break;
case X2_SPELL_AOEBEHAVIOR_GUST:
//ガストオブウィンドを使用する
ActionCastSpellAtLocation(SPELL_GUST_OF_WIND, GetLocation(OBJECT_SELF));
ActionDoCommand(SetCommandable(TRUE));
SetCommandable(FALSE);
bAttack = FALSE;
break;
}
}
// ---------------------------------------------------------------------
// 他の誰かと戦ってない時は詠唱者を攻撃する
// ---------------------------------------------------------------------
if( !GetIsFighting(OBJECT_SELF) && bAttack)
{
if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL))
{
DetermineSpecialBehavior(oCaster);
}
else
{
DetermineCombatRound(oCaster);
}
}
// 攻撃された場合助けを呼びます
SetCommandable(TRUE);
//Shout Attack my target, only works with the On Spawn In setup
SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);
//Shout that I was attacked
SpeakString("NW_I_WAS_ATTACKED", TALKVOLUME_SILENT_TALK);
}
else
{
// ---------------------------------------------------------------------
// July 14, 2003 BK
// If there is a valid enemy nearby and a NON HARMFUL spell has been
// cast on me I should call DetermineCombatRound
// I may be invisible and casting spells on myself to buff myself up
// ---------------------------------------------------------------------
// Fix: 魔法を使用されても戦闘中ならそっちを優先する。
// 逆に戦闘中でなければ呪文を唱えた相手を攻撃する
object oEnemy =GetNearestEnemy();
if ((GetIsObjectValid(oEnemy) == TRUE) && (GetIsInCombat() == TRUE))
{
// SpeakString("keep me in combat");
DetermineCombatRound(oEnemy);
}
}
// Send the user-defined event as appropriate
if(GetSpawnInCondition(NW_FLAG_SPELL_CAST_AT_EVENT))
{
SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_SPELL_CAST_AT));
}
}
最終更新:2005年12月02日 14:35