「OnSpellCastAt」の編集履歴(バックアップ)一覧はこちら
「OnSpellCastAt」(2005/12/02 (金) 14:35:11) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
----
・OnSpellCastAtに入るスクリプトを置いていきます。
・呪文を使用された時に発動する。
----
#Contents
**NWNデフォルト(翻訳付き)
void main()
{
object oCaster = GetLastSpellCaster();
//最後に魔法を唱えた相手をoCasterとして習得
if(GetLastSpellHarmful())
//最後に詠唱された魔法が有害なら真
{
if(
!GetIsObjectValid(GetAttackTarget()) &&
!GetIsObjectValid(GetAttemptedSpellTarget()) &&
!GetIsObjectValid(GetAttemptedAttackTarget()) &&
GetIsObjectValid(GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN))
)
//このR中攻撃しようとしている相手が居らず、
//かつこの戦闘中、自分が呪文を唱えた対象が居らず
//かつこの戦闘中、自分が攻撃した対象が居らず
//近くに敵対的なクリーチャーが居ない場合は真
{
if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL))
//自身の振る舞いが設定されてる場合は真
{
DetermineSpecialBehavior(oCaster);
//草食・肉食・その他に適した振る舞いをする
}
else
{
DetermineCombatRound(oCaster);
//戦闘行動を取る
}
//Shout Attack my target, only works with the On Spawn In setup
SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);
//プレイヤーに見えない声でNW_ATTACK_MY_TARGETと喋る
//Shout that I was attacked
SpeakString("NW_I_WAS_ATTACKED", TALKVOLUME_SILENT_TALK);
//プレイヤーに見えない声でNW_I_WAS_ATTACKEDと喋る
}
}
if(GetSpawnInCondition(NW_FLAG_SPELL_CAST_AT_EVENT))
{
SignalEvent(OBJECT_SELF, EventUserDefined(1011));
}
}
----
・OnSpellCastAtに入るスクリプトを置いていきます。
・呪文を使用された時に発動する。
----
#Contents
#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));
}
}