rendered paste bodyclass 1 boss_castle_siege : raid_boss_standard{parameter: int GM_ID = 5; int PhysicalSpecial_a = -1; int RangePhysicalSpecial_a = -1; int ShortRangeTeleport_a = -1; int LongRangeTeleport_a = -1;handler: EventHandler NO_DESIRE() { if( myself.sm.db_value == 3 ) { if( myself::GetLifeTime() > 9 ) { //myself::AddMoveAroundDesire( 5, 5 ); myself::LookNeighbor( 900 ); } //myself::AddMoveToDesire( 11702, -49152, -536, 100 ); } } EventHandler CREATED(i0,reply) { myself.sm.flag = 1; myself.i_ai0 = 0; myself.i_ai1 = 0; myself.i_ai2 = 0; myself.i_ai3 = 0; if( GM_ID != 0 ) { i0 = myself::GetGlobalMap( GM_ID ); if( i0 == -1 ) { myself::RegisterGlobalMap( GM_ID, myself::GetIndexFromCreature( myself.sm ) ); myself::SetDBValue( myself.sm, 0 ); //default myself::AddTimerEx( 2001, 1000 ); } } myself::AddTimerEx( 1001, 1000 ); } EventHandler TIMER_FIRED_EX(timer_id,i0,i1,c0,i2,c2) { if( timer_id == 1001 ) { if( gg::Rand( 4 ) < 1 ) { myself::RandomizeAttackDesire(); } myself::AddTimerEx( 1001, 30000 ); } else if( timer_id == 2001 ) { //Get our siege information to check siege conditions i0 = myself::Castle_IsUnderSiege(); i1 = myself::Castle_GetRawSystemTime(); i2 = myself::Castle_GetRawSiegeTime(); i3 = i2 - i1; i4 = myself.i_ai3; //db_value basically //Debug only //i5 = myself::Castle_GetLifeControlLevel(); //gg::Announce("Siege: " + i0 + " -- System: " + i1 + " -- Siege: " + i2 + " -- 24hrs: " + myself::IntToStr( i2 - 86400) ); //gg::Announce("Siege - System: " + i3 + " -- DB Value: " + i4 + " -- Life Control Level: " + i5 ); //Case 1: Over 24 Hrs Before Siege if( !i0 && i3 > 86400 && i3 >= 0 ) { //gg::Announce( "Benom: Case 1" ); //Debug only if( i4 != 1 ) { //gg::Announce( "Benom: Case 1 - Stage 2" ); //Debug only //What is Benom doing? Back to "sleeping" :) gg::SendScriptEvent( myself.sm, 1, 0 ); } } //Case 2: 24 hrs Before Siege else if( !i0 && i3 <= 86400 && i3 >= 0 ) { //gg::Announce( "Benom: Case 2" ); //Debug only if( i4 != 2 ) { //gg::Announce( "Benom: Case 2 - Stage 2" ); //Debug only //Teleport to Rune Castle Dungeon gg::SendScriptEvent( myself.sm, 2, 0 ); } } //Case 3: Castle Under Siege else if( i0 ) { //gg::Announce( "Benom: Case 3" ); //Debug only i5 = myself::Castle_GetLifeControlLevel(); //Check if 4 or less Life Control Towers are live, of Rune's total 6 if( i5 <= 4 && i4 != 3 ) { //gg::Announce( "Benom: Case 3 - Stage 2" ); //Debug only //Teleport to the Rune Castle Throne Room gg::SendScriptEvent( myself.sm, 3, 0 ); } } //Case 4: After Siege Ends //This condition should *only* be reached after a siege ends, //and before a new siege date is announced else { //gg::Announce( "Benom: Case 4" ); //Debug only if( i4 != 1 ) { //gg::Announce( "Benom: Case 4 - Stage 2" ); //Debug only //Siege over! Back to "sleeping" :) gg::SendScriptEvent( myself.sm, 1, 0 ); } } myself::AddTimerEx(2001, 5000); } } EventHandler SCRIPT_EVENT(script_event_arg1,script_event_arg2,i0) { //Note: we don't support a DB state of 0, as that means the NPC was just created, and could be ANYWHERE //Go back to "sleep" (Case 1 and 4) if( script_event_arg1 == 1 ) { gg::InstantTeleportEx( myself.sm, -106500, -251840, -15536, 0 ); myself::SetDBValue( myself.sm, 1 ); myself.i_ai3 = 1; } //Passive in Rune Castle Dungeon (Case 2) else if( script_event_arg1 == 2 ) { gg::InstantTeleportEx( myself.sm, 12152, -49146, -3008, 49000 ); myself::SetDBValue( myself.sm, 2 ); myself.i_ai3 = 2; myself::EffectMusic( myself.sm, 8000, RaidSpawnMusic ); } //Aggro in Rune Castle siege grounds (Case 3) else if( script_event_arg1 == 3 ) { gg::InstantTeleportEx( myself.sm, 11702, -49152, -536, 0 ); myself::SetDBValue( myself.sm, 3 ); myself.i_ai3 = 3; myself::EffectMusic( myself.sm, 8000, RaidSpawnMusic ); } } EventHandler SEE_CREATURE(creature) { if( myself.i_ai3 == 3 ) { if( creature.is_pc == 0 && myself::IsInCategory( 11, creature.npc_class_id ) == 0 ) { //do nothing } else { myself::AddAttackDesire( creature, 1, 1000 ); } } } EventHandler USE_SKILL_FINISHED(target,skill_name_id) { if( skill_name_id == ShortRangeTeleport_a) { if( myself.i_ai0 != 0 ) { if( myself::IsNullCreature( myself.c_ai0 ) == 0 ) { myself::InstantTeleport( myself.sm, myself::FloatToInt( myself.c_ai0.x ), myself::FloatToInt( myself.c_ai0.y ), myself::FloatToInt( myself.c_ai0.z ) ); myself::AddAttackDesire( myself.c_ai0, 1, 1000 ); myself.i_ai0 = 0; //reset the var } } } else if( skill_name_id == LongRangeTeleport_a ) { if( myself.i_ai0 != 0 ) { if( myself::IsNullCreature( myself.c_ai0 ) == 0 ) { myself::InstantTeleport( myself.sm, myself::FloatToInt( myself.c_ai0.x ), myself::FloatToInt( myself.c_ai0.y ), myself::FloatToInt( myself.c_ai0.z ) ); myself::AddAttackDesire( myself.c_ai0, 1, 1000 ); myself.i_ai0 = 0; //reset the var } } } } EventHandler ATTACKED(attacker,damage) { //myself::Say( "Entered Attacked Handler" ); //Debug only if( attacker.is_pc != 0 || myself::IsInCategory( 11, attacker.npc_class_id ) ) { //myself::Say( "Attack: Valid Attack Target" ); //Debug only //if( attacker == myself.top_desire_target ) //{ // myself::Say( "Attack: Target = Top Desire Target" ); //} //if( myself::DistFromMe( attacker ) < 100 ) //{ // myself::Say( "Attack: Target distance < 100" ); //} //if( myself::DistFromMe( attacker ) > 150 ) //{ // myself::Say( "Attack: Target distance > 150" ); //} if( myself::DistFromMe( attacker ) < 100 && gg::Rand( 100 ) < 10 ) { myself::AddUseSkillDesire( attacker, PhysicalSpecial_a, 0, 1, 1000000 ); } else if( attacker != myself.top_desire_target && myself::DistFromMe( attacker ) < 1000 && gg::Rand( 100 ) < 25 ) { myself::AddUseSkillDesire( myself.sm, RangePhysicalSpecial_a, 0, 1, 1000000 ); } else if( myself::DistFromMe( attacker ) > 200 && myself::DistFromMe( attacker ) < 600 && gg::Rand( 100 ) < 6 ) { if( myself.i_ai0 == 0 ) { if( myself::Skill_GetConsumeMP( ShortRangeTeleport_a ) < myself.sm.mp && myself::Skill_GetConsumeHP( ShortRangeTeleport_a ) < myself.sm.hp && myself::Skill_InReuseDelay( ShortRangeTeleport_a ) == 0 ) { myself::AddUseSkillDesire( myself.sm, ShortRangeTeleport_a, 1, 1, 1000000 ); myself.i_ai0 = 1; //set our state variable to true myself.c_ai0 = attacker; //save our attacker for later use } } } else if( myself::DistFromMe( attacker ) > 400 && myself::DistFromMe( attacker ) < 1200 && gg::Rand( 100 ) < 6 ) { if( myself.i_ai0 == 0 ) { if( myself::Skill_GetConsumeMP( LongRangeTeleport_a ) < myself.sm.mp && myself::Skill_GetConsumeHP( LongRangeTeleport_a ) < myself.sm.hp && myself::Skill_InReuseDelay( LongRangeTeleport_a ) == 0 ) { myself::AddUseSkillDesire( myself.sm, LongRangeTeleport_a, 1, 1, 1000000 ); myself.i_ai0 = 1; //set our state variable to true myself.c_ai0 = attacker; //save our attacker for later use } } } } super; } EventHandler SEE_SPELL(speller,skill_name_id) { //myself::Say( "Entered Spelled Handler" ); //Debug only //if( speller == myself.top_desire_target ) //{ // myself::Say( "Spelled: Target = Top Desire Target" ); //} //if( myself::DistFromMe( speller ) < 100 ) //{ // myself::Say( "Spelled: Target distance < 100" ); //} //if( myself::DistFromMe( speller ) > 150 ) //{ // myself::Say( "Spelled: Target distance > 150" ); //} if( myself::DistFromMe( speller ) < 100 && gg::Rand( 100 ) < 10 ) { myself::AddUseSkillDesire( speller, PhysicalSpecial_a, 0, 1, 1000000 ); } else if( speller != myself.top_desire_target && myself::DistFromMe( speller ) < 1000 && gg::Rand( 100 ) < 25 ) { myself::AddUseSkillDesire( myself.sm, RangePhysicalSpecial_a, 0, 1, 1000000 ); } else if( myself::DistFromMe( speller ) > 200 && myself::DistFromMe( speller ) < 600 && gg::Rand( 100 ) < 6 ) { if( myself.i_ai0 == 0 ) { if( myself::Skill_GetConsumeMP( ShortRangeTeleport_a ) < myself.sm.mp && myself::Skill_GetConsumeHP( ShortRangeTeleport_a ) < myself.sm.hp && myself::Skill_InReuseDelay( ShortRangeTeleport_a ) == 0 ) { myself::AddUseSkillDesire( myself.sm, ShortRangeTeleport_a, 1, 1, 1000000 ); myself.i_ai0 = 1; //set our state variable to true myself.c_ai0 = speller; //save our speller for later use } } } else if( myself::DistFromMe( speller ) > 600 && myself::DistFromMe( speller ) < 1200 && gg::Rand( 100 ) < 6 ) { if( myself.i_ai0 == 0 ) { if( myself::Skill_GetConsumeMP( LongRangeTeleport_a ) < myself.sm.mp && myself::Skill_GetConsumeHP( LongRangeTeleport_a ) < myself.sm.hp && myself::Skill_InReuseDelay( LongRangeTeleport_a ) == 0 ) { myself::AddUseSkillDesire( myself.sm, LongRangeTeleport_a, 1, 1, 1000000 ) myself.i_ai0 = 1; //set our state variable to true; myself.c_ai0 = speller; //save our speller for later use } } } super; } EventHandler MY_DYING(i0,c0) { if( GM_ID != 0 ) { i0 = myself::GetGlobalMap( GM_ID ); if( i0 != -1 ) { myself::UnregisterGlobalMap( GM_ID ); myself::SetDBValue( myself.sm, 0 ); } } super; }}