scriptdev2 / scriptdev2-tbc

ScriptDev2 for TBC
http://www.scriptdev2.com
GNU General Public License v2.0
29 stars 28 forks source link

Sunwell Update. #26

Closed ghost closed 9 years ago

ghost commented 9 years ago
commit 7bc373c85a2683c78ac5182369603ae24957f71e
Author: Ulduar <Ulduar@skywall.com>
Date:   Sat Jul 4 23:45:36 2015 +0600

    Sunwell Update.

diff --git a/scripts/eastern_kingdoms/sunwell_plateau/boss_felmyst.cpp b/scripts/eastern_kingdoms/sunwell_plateau/boss_felmyst.cpp
index 6cb2ef3..0fc9583 100644
--- a/scripts/eastern_kingdoms/sunwell_plateau/boss_felmyst.cpp
+++ b/scripts/eastern_kingdoms/sunwell_plateau/boss_felmyst.cpp
@@ -17,7 +17,7 @@
 /* ScriptData
 SDName: boss_felmyst
 SD%Complete: 90%
-SDComment: Intro movement NYI; Event cleanup (despawn & resummon) NYI; Breath phase spells could use some improvements.
+SDComment: Intro movement NYI; Event cleanup (despawn & resummon) done; Breath phase spells could use some improvements.
 SDCategory: Sunwell Plateau
 EndScriptData */

diff --git a/scripts/eastern_kingdoms/sunwell_plateau/boss_kalecgos.cpp b/scripts/eastern_kingdoms/sunwell_plateau/boss_kalecgos.cpp
index df3aa28..c8fa7e7 100644
--- a/scripts/eastern_kingdoms/sunwell_plateau/boss_kalecgos.cpp
+++ b/scripts/eastern_kingdoms/sunwell_plateau/boss_kalecgos.cpp
@@ -142,6 +142,10 @@ struct boss_kalecgosAI : public ScriptedAI

     void Aggro(Unit* /*pWho*/) override
     {
+        // Make sure, what after evade don't aggro repeat.
+        if (m_bIsUncorrupted)
+            return;
+        
         DoScriptText(SAY_EVIL_AGGRO, m_creature);

         if (m_pInstance)
diff --git a/scripts/eastern_kingdoms/sunwell_plateau/boss_muru.cpp b/scripts/eastern_kingdoms/sunwell_plateau/boss_muru.cpp
index dd2739f..25a5215 100644
--- a/scripts/eastern_kingdoms/sunwell_plateau/boss_muru.cpp
+++ b/scripts/eastern_kingdoms/sunwell_plateau/boss_muru.cpp
@@ -36,7 +36,7 @@ enum
     SPELL_SUMMON_FURY_MAGE_1        = 46038,
     SPELL_SUMMON_FURY_MAGE_2        = 46039,

-    SPELL_SUMMON_DARK_FIEND_1       = 46000,    // summons 8 dark fiends (25744); ToDo: script npc in eventAI
+    SPELL_SUMMON_DARK_FIEND_1       = 46000,    // summons 8 dark fiends (25744);
     SPELL_SUMMON_DARK_FIEND_2       = 46001,
     SPELL_SUMMON_DARK_FIEND_3       = 46002,
     SPELL_SUMMON_DARK_FIEND_4       = 46003,
@@ -73,6 +73,9 @@ enum
     SPELL_BLACK_HOLE_VISUAL         = 46242,
     SPELL_BLACK_HOLE_VISUAL_2       = 46247,
     SPELL_BLACK_HOLE_PASSIVE        = 46228,
+    
+    // Dark fiend spells.
+    SPELL_DARK_FIEND                = 45944,

     MAX_TRANSFORM_CASTS             = 10
 };
@@ -117,6 +120,8 @@ struct boss_muruAI : public Scripted_NoMovementAI
     {
         if (m_pInstance)
             m_pInstance->SetData(TYPE_MURU, FAIL);
+        
+        m_creature->ForcedDespawn();
     }

     void DamageTaken(Unit* /*pDoneBy*/, uint32& uiDamage) override
@@ -263,12 +268,9 @@ struct boss_entropiusAI : public ScriptedAI
         if (m_pInstance)
         {
             m_pInstance->SetData(TYPE_MURU, FAIL);
-
-            // respawn muru
-            m_creature->SummonCreature(NPC_MURU, afMuruSpawnLoc[0], afMuruSpawnLoc[1], afMuruSpawnLoc[2], afMuruSpawnLoc[3], TEMPSUMMON_DEAD_DESPAWN, 0, true);
         }

-        // despawn boss and summons for reset
+        // despawn boss
         m_creature->ForcedDespawn();
     }

@@ -445,6 +447,7 @@ struct npc_singularityAI : public Scripted_NoMovementAI
     npc_singularityAI(Creature* pCreature) : Scripted_NoMovementAI(pCreature) { Reset(); }

     uint32 m_uiActiveTimer;
+    uint32 m_uiMovementTimer;
     uint8 m_uiActivateStage;

     void Reset() override
@@ -452,10 +455,21 @@ struct npc_singularityAI : public Scripted_NoMovementAI
         DoCastSpellIfCan(m_creature, SPELL_BLACK_HOLE_VISUAL, CAST_TRIGGERED);
         m_uiActiveTimer = 1000;
         m_uiActivateStage = 0;
+        m_uiMovementTimer = 0;

+        m_creature->ForcedDespawn(22000);
     }

     void AttackStart(Unit* /*pWho*/) override { }
     void MoveInLineOfSight(Unit* /*pWho*/) override { }
+    
+    void MovementInform(uint32 uiMoveType, uint32 uiPointId) override
+    {
+        if (uiMoveType != POINT_MOTION_TYPE || !uiPointId)
+            return;
+
+        // Reset Threat and select next random target.
+        DoResetThreat();
+        m_uiMovementTimer = 3000;
+    }

     void UpdateAI(const uint32 uiDiff) override
     {
@@ -472,6 +486,7 @@ struct npc_singularityAI : public Scripted_NoMovementAI
                     case 1:
                         if (DoCastSpellIfCan(m_creature, SPELL_BLACK_HOLE_PASSIVE) == CAST_OK)
                             m_uiActiveTimer = 0;
+                            m_uiMovementTimer = 1000;
                         break;
                 }
                 ++m_uiActivateStage;
@@ -479,6 +494,82 @@ struct npc_singularityAI : public Scripted_NoMovementAI
             else
                 m_uiActiveTimer -= uiDiff;
         }
+        
+        if (m_uiMovementTimer)
+        {
+            if (m_uiMovementTimer <= uiDiff)
+            {
+                if (m_pInstance)
+                {
+                    if (Creature* pEntropius = m_pInstance->GetSingleCreatureFromStorage(NPC_ENTROPIUS))
+                    {
+                        if (Unit* pTarget = pEntropius->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0))
+                            m_creature->GetMotionMaster()->MovePoint(1, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ());
+                    }
+                }
+                m_uiMovementTimer = 0;
+            }
+            else
+                m_uiMovementTimer -= uiDiff;
+        }
+    }
+};
+
+/*######
+## npc_dark_fiend
+######*/
+
+struct npc_dark_fiendAI : public ScriptedAI
+{
+    npc_dark_fiendAI(Creature* pCreature) : ScriptedAI(pCreature) { Reset(); }
+
+    ObjectGuid m_targetGuid;
+    
+    uint32 m_uiDespawnTimer;
+
+    void Reset() override
+    {
+        m_uiDespawnTimer   = 10000;
+        m_creature->SetSpeedRate(MOVE_RUN, 0,5);
+    }
+
+    void AttackStart(Unit* pWho) override
+    {
+        // Function used to set target only - the npc doesn't really attack
+        m_targetGuid = pWho->GetObjectGuid();
+    }
+
+    void MoveInLineOfSight(Unit* /*pWho*/) override { }
+
+    void MovementInform(uint32 uiMovementType, uint32 uiPointId) override
+    {
+        if (uiMovementType != POINT_MOTION_TYPE || !uiPointId)
+            return;
+
+        if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_targetGuid))
+        {
+            if (DoCastSpellIfCan(pPlayer, SPELL_DARK_FIEND) == CAST_OK)
+                m_creature->ForcedDespawn(1000);
+        }
+    }
+    
+    void SpellHit(Unit* /*pSource*/, const SpellEntry* pSpell) override
+    {
+        if (pSpell->DispelType == DISPEL_MAGIC)
+            m_creature->ForcedDespawn(1000);
+    }
+
+    void UpdateAI(const uint32 uiDiff) override
+    {
+        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
+            return;
+
+        if (m_uiDespawnTimer < uiDiff)
+        {
+            m_creature->ForcedDespawn();
+            m_uiDespawnTimer = 0;
+        }
+        else
+            m_uiDespawnTimer -= uiDiff;
     }
 };

@@ -507,6 +598,11 @@ CreatureAI* GetAI_npc_singularity(Creature* pCreature)
     return new npc_singularityAI(pCreature);
 }

+CreatureAI* GetAI_npc_dark_fiend(Creature* pCreature)
+{
+    return new npc_dark_fiendAI(pCreature);
+}
+
 void AddSC_boss_muru()
 {
     Script* pNewScript;
@@ -535,4 +631,9 @@ void AddSC_boss_muru()
     pNewScript->Name = "npc_singularity";
     pNewScript->GetAI = &GetAI_npc_singularity;
     pNewScript->RegisterSelf();
+    
+    pNewScript = new Script;
+    pNewScript->Name = "npc_dark_fiend";
+    pNewScript->GetAI = &GetAI_npc_dark_fiend;
+    pNewScript->RegisterSelf();
 }
diff --git a/scripts/eastern_kingdoms/sunwell_plateau/instance_sunwell_plateau.cpp b/scripts/eastern_kingdoms/sunwell_plateau/instance_sunwell_plateau.cpp
index a89f996..ec9c443 100644
--- a/scripts/eastern_kingdoms/sunwell_plateau/instance_sunwell_plateau.cpp
+++ b/scripts/eastern_kingdoms/sunwell_plateau/instance_sunwell_plateau.cpp
@@ -49,6 +49,9 @@ instance_sunwell_plateau::instance_sunwell_plateau(Map* pMap) : ScriptedInstance
     m_uiKalecRespawnTimer(0),
     m_uiMuruBerserkTimer(0),
     m_uiKiljaedenYellTimer(90000)
+    m_uiMuruRespawnTimer(0),
+    m_uiFelmystRespawnTimer(0),   
+    m_bSunwellGauntletStarted(false);
 {
     Initialize();
 }
@@ -86,6 +89,22 @@ void instance_sunwell_plateau::OnPlayerEnter(Player* pPlayer)
         if (!GetSingleCreatureFromStorage(NPC_MURU, true))
             pPlayer->SummonCreature(NPC_MURU, afMuruSpawnLoc[0], afMuruSpawnLoc[1], afMuruSpawnLoc[2], afMuruSpawnLoc[3], TEMPSUMMON_DEAD_DESPAWN, 0, true);
     }
+    
+    // Despawn Kiljaeden npc encounter only if Muru dead.
+    if (m_auiEncounter[TYPE_MURU] != DONE && m_auiEncounter[TYPE_KILJAEDEN] == DONE)
+    {
+        // Should despawn  if Muru not defeated.
+         for (GuidList::const_iterator itr = m_lDeceiversGuidList.begin(); itr != m_lDeceiversGuidList.end(); ++itr)
+         {
+            if (Creature* pDeceiver = instance->GetCreature(*itr))
+                pDeceiver->ForcedDespawn();
+         }
+
+         if (Creature* pAnveena = GetSingleCreatureFromStorage(NPC_ANVEENA))
+             pAnveena->ForcedDespawn();
+         if (Creature* pController = GetSingleCreatureFromStorage(NPC_KILJAEDEN_CONTROLLER))
+             pController->ForcedDespawn();
+    }
 }

 void instance_sunwell_plateau::OnCreatureCreate(Creature* pCreature)
@@ -111,6 +130,9 @@ void instance_sunwell_plateau::OnCreatureCreate(Creature* pCreature)
         case NPC_ANVEENA:
         case NPC_VELEN:
         case NPC_LIADRIN:
+        case NPC_SHADOWSWORD_MANAFIEND:
+        case NPC_GAUNTLET_IMP:
+        case NPC_SHADOWSWORD_COMMANDER:
             m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid();
             break;
         case NPC_DECEIVER:
@@ -129,11 +151,32 @@ void instance_sunwell_plateau::OnCreatureCreate(Creature* pCreature)
         case NPC_FURY_MAGE:
         case NPC_DARK_FIEND:
         case NPC_VOID_SENTINEL:
+        case NPC_VOID_SENTINEL_SUMMONER:
+        case NPC_DARKNESS:
+        case NPC_VOID_SPAWN:
          case NPC_SINGULARITY:
             m_lMuruTrashGuidList.push_back(pCreature->GetObjectGuid());
             return;
     }
 }

+void instance_sunwell_plateau::OnCreatureEnterCombat(Creature* pCreature)
+{
+   uint32 uiEntry = pCreature->GetEntry();
+   
+   if (uiEntry == NPC_SHADOWSWORD_MANAFIEND)
+   {
+       // Only for the first try
+       if (m_bSunwellGauntletStarted)
+           return;
+       
+       if (Creature* pCommander = GetSingleCreatureFromStorage(NPC_SHADOWSWORD_COMMANDER))
+           DoScriptText(SAY_GAUNTLET_START, pCommander);
+       
+       if (Creature* pGauntlet = pCreature->SummonCreature(NPC_GAUNTLET_IMP, 1697.92f, 502.315f, 86.4882f, 1.65806f, TEMPSUMMON_DEAD_DESPAWN, 0));
+           m_bSunwellGauntletStarted = true;
+   }
+}
+
 void instance_sunwell_plateau::OnCreatureDeath(Creature* pCreature)
 {
     if (pCreature->GetEntry() == NPC_DECEIVER)
@@ -151,6 +194,21 @@ void instance_sunwell_plateau::OnCreatureDeath(Creature* pCreature)
             }
         }
     }
+    
+    else if (pCreature->GetEntry() == NPC_ENTROPIUS)        
+    {
+        // Should respawn only if Entropius defeated.
+         for (GuidList::const_iterator itr = m_lDeceiversGuidList.begin(); itr != m_lDeceiversGuidList.end(); ++itr)
+         {
+            if (Creature* pDeceiver = instance->GetCreature(*itr))
+                pDeceiver->Respawn();
+         }
+
+         if (Creature* pAnveena = GetSingleCreatureFromStorage(NPC_ANVEENA))
+             pAnveena->Respawn();
+         if (Creature* pController = GetSingleCreatureFromStorage(NPC_KILJAEDEN_CONTROLLER))
+             pController->Respawn();
+    }
 }

 void instance_sunwell_plateau::OnCreatureEvade(Creature* pCreature)
@@ -222,6 +280,13 @@ void instance_sunwell_plateau::SetData(uint32 uiType, uint32 uiData)
                 StartNextDialogueText(NPC_KALECGOS_MADRIGOSA);
             else if (uiData == IN_PROGRESS)
                 DoSortFlightTriggers();
+            else if (uiData == FAIL)
+            {
+                m_uiFelmystRespawnTimer = 20000;
+
+                if (Creature* pFelmyst = GetSingleCreatureFromStorage(NPC_FELMYST))
+                    pFelmyst->ForcedDespawn();
+            }
             break;
         case TYPE_EREDAR_TWINS:
             m_auiEncounter[uiType] = uiData;
@@ -250,6 +315,8 @@ void instance_sunwell_plateau::SetData(uint32 uiType, uint32 uiData)

                 m_lMuruTrashGuidList.clear();
             }
+            else if (uiData == FAIL)
+                m_uiMuruRespawnTimer = 20000;
             break;
         case TYPE_KILJAEDEN:
             m_auiEncounter[uiType] = uiData;
@@ -316,17 +383,47 @@ void instance_sunwell_plateau::Update(uint32 uiDiff)
         else
             m_uiKalecRespawnTimer -= uiDiff;
     }
+    
+    if (m_uiMuruRespawnTimer)
+    {
+        if (m_uiMuruRespawnTimer <= uiDiff)
+        {
+            if (Player* pPlayer = instance->GetPlayer(*itr)) 
+            {
+                pPlayer->SummonCreature(NPC_MURU, afMuruSpawnLoc[0], afMuruSpawnLoc[1], afMuruSpawnLoc[2], afMuruSpawnLoc[3], TEMPSUMMON_DEAD_DESPAWN, 0, true);
+            }
+            m_uiMuruRespawnTimer = 0;
+        }
+        else
+            m_uiMuruRespawnTimer -= uiDiff;
+    }
+    
+    if (m_uiFelmystRespawnTimer)
+    {
+        if (m_uiFelmystRespawnTimer <= uiDiff)
+        {
+            if (Player* pPlayer = instance->GetPlayer(*itr))                
+            {
+                pPlayer->SummonCreature(NPC_FELMYST, aMadrigosaLoc[0].m_fX, aMadrigosaLoc[0].m_fY, aMadrigosaLoc[0].m_fZ, aMadrigosaLoc[0].m_fO, TEMPSUMMON_DEAD_DESPAWN, 0, true);
+            }
+            m_uiFelmystRespawnTimer = 0;
+        }
+        else
+            m_uiFelmystRespawnTimer -= uiDiff;
+    }

-    // Muru berserk timer; needs to be done here because it involves two distinct creatures
+    // Muru berserk timer; needs to be done here because it involves two distinct creatures. Note - Muru don't should have berserk - only Entropius.
     if (m_auiEncounter[TYPE_MURU] == IN_PROGRESS)
     {
         if (m_uiMuruBerserkTimer < uiDiff)
         {
-            if (Creature* pEntrpius = GetSingleCreatureFromStorage(NPC_ENTROPIUS, true))
-                pEntrpius->CastSpell(pEntrpius, SPELL_MURU_BERSERK, true);
-            else if (Creature* pMuru = GetSingleCreatureFromStorage(NPC_MURU))
-                pMuru->CastSpell(pMuru, SPELL_MURU_BERSERK, true);
-
+            if (Creature* pEntropius = GetSingleCreatureFromStorage(NPC_ENTROPIUS, true))
+            {
+                if (!pEntropius->HasAura(SPELL_MURU_BERSERK) && pEntropius->isAlive())
+                {
+                    pEntropius->CastSpell(pEntropius, SPELL_MURU_BERSERK, true);
+                }
+            }
             m_uiMuruBerserkTimer = 10000;
         }
         else
diff --git a/scripts/eastern_kingdoms/sunwell_plateau/sunwell_plateau.h b/scripts/eastern_kingdoms/sunwell_plateau/sunwell_plateau.h
index ba514b3..be8e309 100644
--- a/scripts/eastern_kingdoms/sunwell_plateau/sunwell_plateau.h
+++ b/scripts/eastern_kingdoms/sunwell_plateau/sunwell_plateau.h
@@ -35,6 +35,9 @@ enum
     NPC_FURY_MAGE               = 25799,
     NPC_DARK_FIEND              = 25744,
     NPC_VOID_SENTINEL           = 25772,
+    NPC_VOID_SENTINEL_SUMMONER  = 25782,
+    NPC_DARKNESS                = 25879,
+    NPC_VOID_SPAWN              = 25824,
+   NPC_SINGULARITY          =  25855,
     NPC_DECEIVER                = 25588,
     NPC_KILJAEDEN               = 25315,
     NPC_KILJAEDEN_CONTROLLER    = 25608,            // kiljaeden event controller
@@ -42,6 +45,9 @@ enum
     NPC_KALECGOS                = 25319,            // related to kiljaeden event
     NPC_VELEN                   = 26246,
     NPC_LIADRIN                 = 26247,
+    NPC_SHADOWSWORD_MANAFIEND   = 25483,            // Npc trigger start gauntlet event.
+    NPC_GAUNTLET_IMP            = 25848,            // Npc Gauntlet Imp after Felmyst.
+    NPC_SHADOWSWORD_COMMANDER   = 25837,

     GO_FORCEFIELD               = 188421,           // kalecgos door + collisions
     GO_BOSS_COLLISION_1         = 188523,
@@ -68,6 +74,9 @@ enum
     SAY_ORDER_3                 = -1580066,
     SAY_ORDER_4                 = -1580067,
     SAY_ORDER_5                 = -1580068,
+    
+    // Sunwell Gauntlet Start
+    SAY_GAUNTLET_START          = -1580108,

     AREATRIGGER_TWINS           = 4937,

@@ -75,7 +84,7 @@ enum
     SPELL_TELEPORT_NORMAL_REALM = 46020,
     SPELL_SPECTRAL_REALM_AURA   = 46021,
     SPELL_SPECTRAL_EXHAUSTION   = 44867,
-    // Felmyst ouro spell
+    // Felmyst outro spell
     SPELL_OPEN_BACK_DOOR        = 46650,            // Opens the fire barrier - script effect for 46652
     // used by both muru and entropius
     SPELL_MURU_BERSERK          = 26662,
@@ -148,6 +157,8 @@ class instance_sunwell_plateau : public ScriptedInstance, private DialogueHelper
         uint32 m_uiKalecRespawnTimer;
         uint32 m_uiMuruBerserkTimer;
         uint32 m_uiKiljaedenYellTimer;
+        uint32 m_uiMuruRespawnTimer;
+        uint32 m_uiFelmystRespawnTimer;

         GuidSet m_spectralRealmPlayers;
         GuidVector m_vRightFlightTriggersVect;
@@ -156,5 +167,7 @@ class instance_sunwell_plateau : public ScriptedInstance, private DialogueHelper
         GuidList m_lBackdoorTriggersList;
         GuidList m_lDeceiversGuidList;
         GuidList m_lMuruTrashGuidList;
+        
+        bool m_bSunwellGauntletStarted;
 };
 #endif

1) Felmyst and Muru should despawn and resummon. Blizzlike. 2) Kil'jaeden npc encounter don't should spawn if Entropius encounter != Done. Blizzlike. Thanks @evil-at-wow for confirmation. Blizzlike. http://cmangos.net/thread-6674-post-42012.html#pid42012 3) Sunwell Gauntlet event partially start. 4) Muru not cast berserk on self - never cast, only Entropius. Exploit - wait 11 minutes (not 10), transfer Muru on phase 2 (Entropius phase) and all - not berserk. 5)

I don't think that KJ has the same logic, because M'uru has a door behind him. So it wouldn't make sense to apply the same logic.

And what? This is blizzlike (respawn KJ npc after death Entropius - blizzlike) 6) Dark Fiend EAI script - working terrible (all does not work accurately). SD2 script better. Also need decrease speed run (YTDB They argue that the values in the database came from the right and Sniff, i don't trust sniff). Thanks @mns for info.

7) Singularity - should movement on random Entropius target (i see on official server.) http://www.wowhead.com/npc=25855/singularity#comments Also need

+DELETE FROM script_texts WHERE entry = -1580108;
+INSERT INTO script_texts (entry,content_default,sound,type,language,emote,comment) VALUES
+(-1580108,'Bring forth the imps!',0,1,0,0,'Shadowsword Commander SAY_GAUNTLET_START');
ghost commented 9 years ago

1)About Muru - confirm. 2) Additional - KJ should has delay before start combat. Should start aggro text only after emerge state fully complete. 3)Kalec (KJ) encounter - should spawn immediately after killed all 3 Hand of Deceiver. Timer summon 35 seconds - very strange. 4)

    SPELL_ARCANE_BOLT           = 45670,        // used by Kalec

Need fix in core - add positive effect, else call aggro KJ on Kalec. 5) Entropius berserk - confirm, also Entropius should delay before attack start after spawn. 6) Dark Fiend broken EAI - i think after commit https://github.com/cmangos/mangos-tbc/commit/3028f75a32ed0482d072c60f632bf2e4f9e36cd8 But i am not sure. 7) Felmyst should despawn on Evade, not Reached Home. Very strange, why SD2 using metod JustReachedHome. 8) About KJ npc encounter - yes, i can confirm. You cannot see npc, if Muru enconter (TYPE_MURU) != DONE.

xfurry commented 9 years ago

There are a lot of changes in this ticket. Let's take them one by one and break this big patch into small pieces.

ghost commented 9 years ago

Do not need anything to break.

xfurry commented 9 years ago

Do not need anything to break.

Actually I do. I can't commit a lot of changes in one shot. So let's just split it into many small pieces so that it's easy for me to understand what's the issue. ++ we don't despawn creatures on player enter. Instead we should delete from DB and summon.

ghost commented 9 years ago

I hope you understand that I can not break into pieces already. Diff so not working.

++ we don't despawn creatures on player enter. Instead we should delete from DB and summon.

You can add new void function and all. DoDespawnKiljaedenNpcIfCan. DoRespawnKiljaedenNpcIfCan. On Player Enter - If Data Muru !=Done - DoDespawnKiljaedenNpcIfCan If Data Muru == Done, KJ !=Done - DoRespawnKiljaedenNpcIfCan Don't need delete from DB. There is too much information to split on the part. Try to understand you and me too.

ghost commented 9 years ago

Problem solved - issue close.