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

表示オプション

横に並べて表示:
変化行の前後のみ表示: