※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。



  • 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));
	}
}