Jump to content

INSTANCE Save BUG in all instance


Guest iran.iranha

Recommended Posts

Hello,

first sorry for my bad english .

you need 2 players , inv hem in group or Raid . put Dungeon Difficulty on Heroic , leave the leader out of instance and with scened player go into instance , before die the Boss , Leader Change the Dungeon Difficulty to Normal , after that kill boss , you will see boss it's drop Heroic item's .

when a leader change Dungeon Difficulty to Heroic Leader receive warning message : Cannot Reset Voilet Hold. There are players still inside the instance , but instance it's change to normal to all player in raid or Group .

when die the boss go out off instance , again change Leader Dungeon Difficulty to Heroic , player go into instance , you will see it's not save , and can repeat more and more and more with out saving instance .

i check it in all Dungeon Difficulty and raid instance and it's working .

thanks

Link to comment
Share on other sites

maybe this helps:

diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp
index e3f2865..f7b9bb4 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -1417,12 +1417,28 @@ void WorldSession::HandleSetDungeonDifficultyOpcode( WorldPacket & recv_data )
    if(Difficulty(mode) == _player->GetDungeonDifficulty())
        return;

-    // cannot reset while in an instance
-    Map *map = _player->GetMap();
-    if(map && map->IsDungeon())
+    // cannot reset while in an instance - or groupmembers are inside instance
+    if(Group *pGroup = _player->GetGroup())
    {
-        sLog.outError("WorldSession::HandleSetDungeonDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
-        return;
+        for (GroupReference *itr = GetFirstMember(); itr != NULL; itr = itr->next())
+        {
+
+            Map *map = itr->getSource()->GetMap();
+            if (map && map->IsDungeon())
+            {
+                sLog.outError("WorldSession::HandleSetDungeonDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
+                return;
+            }
+        }
+    }
+    else
+    {
+        Map *map = _player->GetMap();
+        if(map && map->IsDungeon())
+        {
+            sLog.outError("WorldSession::HandleSetDungeonDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
+            return;
+        }
    }

    if(_player->getLevel() < LEVELREQUIREMENT_HEROIC)
@@ -1461,12 +1477,28 @@ void WorldSession::HandleSetRaidDifficultyOpcode( WorldPacket & recv_data )
    if(Difficulty(mode) == _player->GetRaidDifficulty())
        return;

-    // cannot reset while in an instance
-    Map *map = _player->GetMap();
-    if(map && map->IsDungeon())
+    // cannot reset while in an instance - or groupmembers are inside instance
+    if(Group *pGroup = _player->GetGroup())
    {
-        sLog.outError("WorldSession::HandleSetRaidDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
-        return;
+        for (GroupReference *itr = GetFirstMember(); itr != NULL; itr = itr->next())
+        {
+
+            Map *map = itr->getSource()->GetMap();
+            if (map && map->IsDungeon())
+            {
+                sLog.outError("WorldSession::HandleSetRaidDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
+                return;
+            }
+        }
+    }
+    else
+    {
+        Map *map = _player->GetMap();
+        if(map && map->IsDungeon())
+        {
+            sLog.outError("WorldSession::HandleSetRaidDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
+            return;
+        }
    }

    if(_player->getLevel() < LEVELREQUIREMENT_HEROIC)

and i haven't tested if this bug exist.. also i've never seen this error-message here..

Link to comment
Share on other sites

../../../src/game/MiscHandler.cpp: In member function ‘void WorldSession::HandleSetDungeonDifficultyOpcode(WorldPacket&)’:

../../../src/game/MiscHandler.cpp:1423: error: ‘GetFirstMember’ was not declared in this scope

../../../src/game/MiscHandler.cpp: In member function ‘void WorldSession::HandleSetRaidDifficultyOpcode(WorldPacket&)’:

../../../src/game/MiscHandler.cpp:1483: error: ‘GetFirstMember’ was not declared in this scope

Error not compiled.

Link to comment
Share on other sites

  • 2 weeks later...
  • 4 weeks later...

ok

balrok Patch can prevent reset instance when groupmembers are inside instance

but players can prevent save with other part of this bug !

1 - raid go to instance

2 - leader promote to leader of Save in instanse (New leader must saved in instance before)

3 - Raid Killing Boss

4 - Raid Relog and raid not saved !

Note :

when Raid killing Boss server send this error :

Cannot bind players, no instance save available for map!

reality server can`t find save for bind group

I test this only in mangos-0.12

Link to comment
Share on other sites

  • 1 month later...

The patch balrok helps to solve the most part of problems!

Here only it is necessary GetFirstMember (); to replace on pGroup-> GetFirstMember ();

diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp
index 00c6251..6f3e0a0 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -1418,12 +1418,28 @@ void WorldSession::HandleSetDungeonDifficultyOpcode( WorldPacket & recv_data )
    if(Difficulty(mode) == _player->GetDungeonDifficulty())
        return;

-    // cannot reset while in an instance
-    Map *map = _player->GetMap();
-    if(map && map->IsDungeon())
+    // cannot reset while in an instance - or groupmembers are inside instance
+    if(Group *pGroup = _player->GetGroup())
    {
-        sLog.outError("WorldSession::HandleSetDungeonDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
-        return;
+        for (GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
+        {
+
+            Map *map = itr->getSource()->GetMap();
+            if (map && map->IsDungeon())
+            {
+                sLog.outError("WorldSession::HandleSetDungeonDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
+                return;
+            }
+        }
+    }
+    else
+    {
+        Map *map = _player->GetMap();
+        if(map && map->IsDungeon())
+        {
+            sLog.outError("WorldSession::HandleSetDungeonDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
+            return;
+        }
    }

    if(_player->getLevel() < LEVELREQUIREMENT_HEROIC)
@@ -1462,12 +1478,28 @@ void WorldSession::HandleSetRaidDifficultyOpcode( WorldPacket & recv_data )
    if(Difficulty(mode) == _player->GetRaidDifficulty())
        return;

-    // cannot reset while in an instance
-    Map *map = _player->GetMap();
-    if(map && map->IsDungeon())
+    // cannot reset while in an instance - or groupmembers are inside instance
+    if(Group *pGroup = _player->GetGroup())
    {
-        sLog.outError("WorldSession::HandleSetRaidDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
-        return;
+        for (GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
+        {
+
+            Map *map = itr->getSource()->GetMap();
+            if (map && map->IsDungeon())
+            {
+                sLog.outError("WorldSession::HandleSetRaidDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
+                return;
+            }
+        }
+    }
+    else
+    {
+        Map *map = _player->GetMap();
+        if(map && map->IsDungeon())
+        {
+            sLog.outError("WorldSession::HandleSetRaidDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
+            return;
+        }
    }

    if(_player->getLevel() < LEVELREQUIREMENT_HEROIC)

Link to comment
Share on other sites

This patch can solve part2 of this bug for mangos-0.12

diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp
index e17b609..0cce779 100644
--- a/src/game/GroupHandler.cpp
+++ b/src/game/GroupHandler.cpp
@@ -321,6 +321,13 @@ void WorldSession::HandleGroupSetLeaderOpcode( WorldPacket & recv_data )
    /** error handling **/
    if (!player || !group->IsLeader(GetPlayer()->GetGUID()) || player->GetGroup() != group)
        return;
+
+    for (GroupReference *itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
+    {
+        Map *map = itr->getSource()->GetMap();
+        if (map && map->IsDungeon() && player->GetBoundInstance(itr->getSource()->GetMapId(),itr->getSource()->GetDifficulty()) && !itr->getSource()->GetBoundInstance(itr->getSource()->GetMapId(),itr->getSource()->GetDifficulty()) )
+            return;
+    }
    /********************/

    // everything's fine, do it

Link to comment
Share on other sites

This patch can solve part2 of this bug

2>..\\..\\src\\game\\GroupHandler.cpp: error C2660: 'Player::GetDifficulty' : function does not take 0 arguments
2>..\\..\\src\\game\\GroupHandler.cpp: error C2660: 'Player::GetDifficulty' : function does not take 0 arguments

rev 9100

Link to comment
Share on other sites

2>..\\..\\src\\game\\GroupHandler.cpp: error C2660: 'Player::GetDifficulty' : function does not take 0 arguments
2>..\\..\\src\\game\\GroupHandler.cpp: error C2660: 'Player::GetDifficulty' : function does not take 0 arguments

rev 9100

my patch corrected for mangos-0.12

i think you must replace GetDifficulty() with GetDifficulty(true) for correct path for master branch :)

but i not tested it !

Link to comment
Share on other sites

mns, maybe:

    for (GroupReference *itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
   {
       Map *map = itr->getSource()->GetMap();
       if (map && map->IsDungeon() && (player->GetBoundInstance(itr->getSource()->GetMapId(),itr->getSource()->GetDifficulty(true)) && !itr->getSource()->GetBoundInstance(itr->getSource()->GetMapId(),itr->getSource()->GetDifficulty(true)) || player->GetBoundInstance(itr->getSource()->GetMapId(),itr->getSource()->GetDifficulty(false)) && !itr->getSource()->GetBoundInstance(itr->getSource()->GetMapId(),itr->getSource()->GetDifficulty(false))))
       {
           return;
       }
   }

?

Link to comment
Share on other sites

mns, maybe:

*****************

?

I not switched own server to master branch and i not working and test fix path for master .

I still use mangos-0.12 for own server .

in 0.12 not used any argument GetDifficulty() and i not understand truly about GetDifficulty(boolean) argument .

maybe added for specify new raid system in WotLK .

You will compile and test patch and correcting patch for master ;)

Link to comment
Share on other sites

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. Privacy Policy Terms of Use