Jump to content

Opterman

Members
  • Posts

    27
  • Joined

  • Last visited

    Never
  • Donations

    0.00 GBP 

Posts posted by Opterman

  1. Ok thanks Opterman, great job, so like i see, this is much better than any other mtmaps, now, is stable now for larger servers? +/-2000 os is preferible wait a little bit more for stable revisions or your patch.

    PD: Again great job.

    Its better to wait, we're about to finish solving crash problems. I think aprox to end of this year or at the beginning of 2010 will be a stable version.

    Greetings, Opterman

  2. this is really awesome, gonna test next version, will wait until that crash is fixed.) and what about make git branch, so we can see the progress and learn something etc...

    anyway GJ

    I think too os better to wait for a stable version

    how frecuently is the crash? with ACE MP(6 Cores) + My Patch for stability , i have uptime 12-16-24 hours. +/- 2000 online.

    EDIT: I really dont know whats the diference between this patch, and other mtmaps patches

    It has a lor of differences with mtmapts.

    Mtmaps hasnt a map restarter when it crash.

    Packets are procressed by map thread and no by ace world thread.

    BattleGrouns are updated by her maps instead by world thread

    An adaptative rewriting of BG Code.

    An improving on events.

    And everything what is going to come ;)

    Greetings, Opterman

  3. This not most bad end: most bad, end up with corrupted character data saved in DB. That why better crash and _prevent_ save corrupted data that prevent crash and save corrupt by bug data.

    And then safe for restart in same way as mangosd restart safe after crash.

    Vladimir I thought that , it was the first thing that I thgought, but the only way to do the same thing of my patch and without mem corruption unsafe is process map by process , I think Multi Mangos will be the best option.

    Anyway i 'll continue updating my patch and improving it , maybe I find another way to avoid memory corruption,i.e like someone say mem hashes checks

    Greetings, Opterman

  4. would be possible to make the effect of a crash local? like only disconnect the affected players/units and not the whole server. Fault tolerance on mangos would be very nice, i'm pretty sure blizz servers already have that.

    Blizzard servers dont have it , blizzard server restart map if the error is on map and restart server if error is on network i can say it because i tested it my self....

    Greetings, Opterman

  5. Don't know. Don't work for me on Windows :(

    Players in world can't do anything. Allways big freez. World don't updating for players. Anybody try it ? :confused:

    Could u put server in Debug on VS and make an backtrace of MapRunnable's threads and WorldRunnable thread

    What exactly occcurs ? Players cant cast ?

    I've tested again on Windows last patch version with last core revision and works totally ok

    Do you have another patch ?

    Greetings, Opterman

  6. Just test it. World looking for players like all freeze. Nothing happen, nothing can't do :( Like big lag..but core don't stuck. U can teleport players by command from console. I did something wrong? :confused:

    Its because map crashed maybe and server is logouting out players , i had a function that logout player sending them the client message and then logout them in the server but i souppoused that it was no need

    But its needed maybe... Have you noticed i appears a backtrace message in cmd at this time¿

    Or maybe you should change update interval

    Anyway im going to do tests with a 2k + player server population

    Greetings, Opterman

  7. One more thing: solution like Multi-MaNGOS is needed to deal with crash handling e.g. whole process(!) restart instead of thread restart.

    P.S. Btw, what about crashdump generation? Would we get them on every crash or not?

    Cheers.

    If you active crash dump generation , yes , anyway the ACE Stacktrace is too poor.... so I want to read gdb for linux and another debugger on windows to make a good backtrace class and then put it on files with mapnumber and timestamp...

    Aweomse you actually figured it out, now we should all join hands and get this baby into the master branch.

    Edit: I don't see how a thread pool is useful, you only need threads per map, why spawn a fixed number for it. I might be missing the point here (well it feels like I do) so enlighten me with your knowledge if possible.

    I think join master now isnt a good idea without certain improvings and testing...

    Greetings, Opterman

  8. crash at startup, on guild loading

    rev 8758

    Loading Guilds...
    [                                                  ] 0%
    [
    [*                                                 ] 2%  
    [
    [**                                                ] 4%  
    [
    [***                                               ] 6%  
    [[New Thread 0x416f1950 (LWP 19304)]
    [New Thread 0x41ef2950 (LWP 19305)]
    [New Thread 0x426f3950 (LWP 19306)]
    [New Thread 0x42ef4950 (LWP 19316)]
    [New Thread 0x436f5950 (LWP 19317)]
    
    Program received signal SIGSEGV, Segmentation fault.
    [switching to Thread 0x42ef4950 (LWP 19316)]
    0x00000000005ba9bc in Map::Update ()
    Current language:  auto; currently asm
    #0  0x00000000005ba9bc in Map::Update ()
    #1  0x00000000005c2a57 in MapRunnable::run ()
    #2  0x00000000007c38ea in ACE_Based::Thread::ThreadTask ()
    #3  0x00007f241a8c8fc7 in start_thread () from /lib/libpthread.so.0
    #4  0x00007f241a1a55ad in clone () from /lib/libc.so.6
    #5  0x0000000000000000 in ?? ()
    

    Thread 1 (Thread 0x7f241ccce700 (LWP 19300)):
    #0  0x00007f241a14da4d in malloc () from /lib/libc.so.6
    No symbol table info available.
    #1  0x00007f241ab9d0cd in operator new (sz=2)
       at ../../../../libstdc++-v3/libsupc++/new_op.cc:52
       p = <value optimized out>
    #2  0x00007f241ab9d1e9 in operator new[] (sz=2)
       at ../../../../libstdc++-v3/libsupc++/new_opv.cc:32
    No locals.
    #3  0x00000000007bd1b7 in Field::SetValue ()
    No locals.
    #4  0x00000000007badf5 in QueryResultMysql::NextRow ()
    No locals.
    #5  0x000000000077e3b2 in Guild::LoadMembersFromDB ()
    No locals.
    #6  0x00000000005ef9a7 in ObjectMgr::LoadGuilds ()
    No locals.
    #7  0x0000000000729a3b in World::SetInitialWorldSettings ()
    No locals.
    #8  0x00000000004caf63 in Master::Run ()
    No locals.
    #9  0x00007f241a0f41a6 in __libc_start_main () from /lib/libc.so.6
    No symbol table info available.
    #10 0x00000000004c91a9 in _start ()

    Shendor the first backtrace is not the same to the second ( Full backtrace )

    [switching to Thread 0x42ef4950 (LWP 19316)] /=/ Thread 1 (Thread 0x7f241ccce700 (LWP 19300))

    To help you i need the backtrace of map thread

    I add too that if you debug the server with debugger you 'll get it signals like SIGTERM and you should continue. It's unused map cleanup feature.

    Nice catch with void Master::_OnSignal(int Signal) hooking BUT: such way of handling crashes is very dangerous, since we don't know what caused crash and simple 'restart thread and free map resources' technique is naive... I just fear that after some crashes we'll end up with infinite thread restarts

    That's what i thought , so by this reason i added a option where you can specificate the number of crashes to restart the server, if there's some redundant error

    I.E If i put MapUpdater.ShudownAtCrash = 6 when there's 6 map crashes ( of whatever map , not for each map.. ) then the server shudowns...

    + MapManager::Instance().IncreaseCrashCount();

    + uint16 CrashCount = sWorld.getConfig(CONFIG_MAPUPDATER_SHUT_ATCRASH);

    + if(CrashCount && CrashCount <= MapManager::Instance().GetCrashCount())

    + {

    + sLog.outError("Signal Handler: Too many crash detected. Shutting down server...\\r\\n");

    + ObjectAccessor::Instance().SaveAllPlayers();

    + exit(Signal);

    + }

    Greetings, Opterman

  9. Sounds interesting, but let get this straight.

    This is basicly another multithreading maps patch, right?

    The others use a static thread pool and also don't have this restart capability from what i understand.

    Clarifications are welcome.

    Yes leak , is as you've said , as i've already said if it goes well i 'll think in an improving with an statical thread pool ( for instances only ( obiusly ) ).

    Greetings, Opterman

  10. Does this patch affect server perfomance somehow?

    It affects to server performance yes, but i dont know the result , i've tested with no many population and works fine , but i need to know what's the result with highs population. I dont want to give you false hopes, because as i said i dont know what will happen, but i 've programmed the patch doing my best, its the only thing that i can say.

    The performance result is on testing.... only there...

    OMG

    It's very-very fine.

    It's meen that instance maps per thread too?

    I'll test it soon. Thx u!

    Yes ,thought in doing the patch with a thread pool, but first i want to know how works with the current method..

    Greetings, Opterman

  11. What bug does the patch fix? What features does the patch add?

    It adds a processor map system per thread.

    For which repository revision was the patch created?

    8756

    Who has been writing this patch? Please include either forum user names or email addresses.

    Woweur && Me

    This patch add a blizzlike map system processor.

    Maybe blizzard use a thread pool for map processing or maybe process instead thread but i wrote this patch following the main concept of Blizzard Map System processor , so if there's a crash in 1 thread it restarts and whoever be in anothers map could continue playing..

    It patch has a backtrace output, and unload system if map isnt used, a shutdown feature if there's many crashes and at last point ( maybe too important to finish with the lag ): Each map number is processed by 1 thread...

    If a map is being restarted and someone is offline but is on this map and tries to login it recv a error message and if someone tries a teleport to a crashed map that is restarting it comeback at original teleport position.

    This patch too change the network processor to the map if player is on World.

    It means that the map process all the packets while the player is in the current map.

    At teleport i change the network processor to the world thread and the same at crash and before login.

    (22/11/09 Redundant crash on SendObjectUpdates fixed)

    This is the patch http://pastebin.com/m74127ce3

    SQL Patch for events http://pastebin.com/m25a95e35

    PD: I've tested it as exhaustively as it has been possible and I havent detected errors but i'd appreciate if you test it in a server with many population

    If you have a good CPU i recommend u a MapUpdater.Interval less than 30 ms

    I've to say that there's 1 thing on this patch that is not blizzlike and is "ACE processing" in blizzard when there's lag in a map ( like 571 winterlag(grasp) ) you can write correctly in the chat with no lags so i think the network processing of blizzard is in a different place of map processing..

    Edit: Current TODO: 2rewriting events and pools..

    Thanks to Woweur for help testing and fixing crashes

    Greetings, Opterman

  12. very nice patch . tested and works thank you

    but my question it is correctly?

    @@ -592,10 +592,9 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
            if (isType(TYPEMASK_GAMEOBJECT) && !((GameObject*)this)->IsTransport())
            {
                if ( ((GameObject*)this)->ActivateToQuest(target) || target->isGameMaster())
    -            {
                    IsActivateToQuest = true;
    -                updateMask->SetBit(GAMEOBJECT_DYNAMIC);
    -            }
    +
    +            updateMask->SetBit(GAMEOBJECT_DYNAMIC);
            }
            else if (isType(TYPEMASK_UNIT))
            {

    It's needed because if the object is not activated to quest server sends the default value ( closed ) 0xFFFF0000

    and in fact this patch is already into git branch

    Greetings, Opterman

  13. hi,

    from my point of view i would not use variable named OwnerGUID as the GUID of creature that is being looted. I think better would be something like LootedTargetGUID and i would update also comments, because out of date comments can confuse others. Anyway patch seems OK.

    Ok , you're right , i 've updated already.

    Greetings, Opterman

  14. What bug does the patch fix? What features does the patch add?

    It corrrect update of this criteria type with spells like Spirit of Redemption.

    For which repository revision was the patch created?

    8442

    Who has been writing this patch? Please include either forum user names or email addresses.

    Me

    This is the fix:

    From d480a5cbfbb3ba6d402b336e47a9b809d405766b Mon Sep 17 00:00:00 2001
    From: unknown <Administrator@.(none)>
    Date: Mon, 31 Aug 2009 05:08:55 -0700
    Subject: [PATCH] Criteria Fall Without Dying
    
    ---
    src/game/Player.cpp |    3 ++-
    1 files changed, 2 insertions(+), 1 deletions(-)
    
    diff --git a/src/game/Player.cpp b/src/game/Player.cpp
    index 5e52b87..8e86e7c 100644
    --- a/src/game/Player.cpp
    +++ b/src/game/Player.cpp
    @@ -19886,10 +19886,11 @@ void Player::HandleFall(MovementInfo const& movementInfo)
                    if (GetDummyAura(43621))
                        damage = GetMaxHealth()/2;
    
    +                uint32 Health = GetHealth();
                    EnvironmentalDamage(DAMAGE_FALL, damage);
    
                    // recheck alive, might have died of EnvironmentalDamage
    -                if (isAlive())
    +                if (isAlive() && damage < Health)
                        GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING, uint32(z_diff*100));
                }
    
    -- 
    1.6.2.msysgit.0.186.gf7512
    
    

    This patch avoid to update criteria fall without diying if you die but you have auras like Spirit of Redemption or DK Ghoul..

    Greetings, Opterman

  15. What bug does the patch fix? What features does the patch add?

    It change itemGUID in packets by real guid ( loot creature guid )

    For which repository revision was the patch created?

    8442

    Who has been writing this patch? Please include either forum user names or email addresses.

    Me

    This is the fix:

    From 2697d66417bc9bf514ec3331fa5537caa4289607 Mon Sep 17 00:00:00 2001
    From: unknown <Administrator@.(none)>
    Date: Mon, 31 Aug 2009 10:25:20 -0700
    Subject: [PATCH] Send Owner as its in roll packets
    
    ---
    src/game/Group.cpp |   30 +++++++++++++++---------------
    src/game/Group.h   |   11 ++++++-----
    2 files changed, 21 insertions(+), 20 deletions(-)
    
    diff --git a/src/game/Group.cpp b/src/game/Group.cpp
    index 5c83df6..e0fc912 100644
    --- a/src/game/Group.cpp
    +++ b/src/game/Group.cpp
    @@ -451,7 +451,7 @@ void Group::Disband(bool hideDestroy)
    void Group::SendLootStartRoll(uint32 CountDown, const Roll &r)
    {
        WorldPacket data(SMSG_LOOT_START_ROLL, (8+4+4+4+4+4));
    -    data << uint64(r.itemGUID);                             // object guid what we're looting
    +    data << uint64(r.LootedTargetGUID);                     // creature guid what we're looting
        data << uint32(r.totalPlayersRolling);                  // maybe the number of players rolling for it???
        data << uint32(r.itemid);                               // the itemEntryId for the item that shall be rolled for
        data << uint32(r.itemRandomSuffix);                     // randomSuffix
    @@ -469,10 +469,10 @@ void Group::SendLootStartRoll(uint32 CountDown, const Roll &r)
        }
    }
    
    -void Group::SendLootRoll(const uint64& SourceGuid, const uint64& TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r)
    +void Group::SendLootRoll(const uint64& TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r)
    {
        WorldPacket data(SMSG_LOOT_ROLL, (8+4+8+4+4+4+1+1));
    -    data << uint64(SourceGuid);                             // guid of the item rolled
    +    data << uint64(r.LootedTargetGUID);                     // creature guid what we're looting
        data << uint32(0);                                      // unknown, maybe amount of players
        data << uint64(TargetGuid);
        data << uint32(r.itemid);                               // the itemEntryId for the item that shall be rolled for
    @@ -493,10 +493,10 @@ void Group::SendLootRoll(const uint64& SourceGuid, const uint64& TargetGuid, uin
        }
    }
    
    -void Group::SendLootRollWon(const uint64& SourceGuid, const uint64& TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r)
    +void Group::SendLootRollWon(const uint64& TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r)
    {
        WorldPacket data(SMSG_LOOT_ROLL_WON, (8+4+4+4+4+8+1+1));
    -    data << uint64(SourceGuid);                             // guid of the item rolled
    +    data << uint64(r.LootedTargetGUID);                     // creature guid what we're looting
        data << uint32(0);                                      // unknown, maybe amount of players
        data << uint32(r.itemid);                               // the itemEntryId for the item that shall be rolled for
        data << uint32(r.itemRandomSuffix);                     // randomSuffix
    @@ -519,7 +519,7 @@ void Group::SendLootRollWon(const uint64& SourceGuid, const uint64& TargetGuid,
    void Group::SendLootAllPassed(uint32 NumberOfPlayers, const Roll &r)
    {
        WorldPacket data(SMSG_LOOT_ALL_PASSED, (8+4+4+4+4));
    -    data << uint64(r.itemGUID);                             // Guid of the item rolled
    +    data << uint64(r.LootedTargetGUID);                     // creature guid what we're looting
        data << uint32(NumberOfPlayers);                        // The number of players rolling for it???
        data << uint32(r.itemid);                               // The itemEntryId for the item that shall be rolled for
        data << uint32(r.itemRandomPropId);                     // Item random property ID
    @@ -557,7 +557,7 @@ void Group::GroupLoot(const uint64& playerGUID, Loot *loot, Creature *creature)
            if (item->Quality >= uint32(m_lootThreshold) && !i->freeforall)
            {
                uint64 newitemGUID = MAKE_NEW_GUID(objmgr.GenerateLowGuid(HIGHGUID_ITEM),0,HIGHGUID_ITEM);
    -            Roll* r=new Roll(newitemGUID,*i);
    +            Roll* r=new Roll(newitemGUID,creature->GetGUID(),*i);
    
                //a vector is filled with only near party members
                for(GroupReference *itr = GetFirstMember(); itr != NULL; itr = itr->next())
    @@ -607,7 +607,7 @@ void Group::NeedBeforeGreed(const uint64& playerGUID, Loot *loot, Creature *crea
            if (item->Quality >= uint32(m_lootThreshold) && !i->freeforall)
            {
                uint64 newitemGUID = MAKE_NEW_GUID(objmgr.GenerateLowGuid(HIGHGUID_ITEM),0,HIGHGUID_ITEM);
    -            Roll* r=new Roll(newitemGUID,*i);
    +            Roll* r=new Roll(newitemGUID,creature->GetGUID(),*i);
    
                for(GroupReference *itr = GetFirstMember(); itr != NULL; itr = itr->next())
                {
    @@ -702,21 +702,21 @@ void Group::CountRollVote(const uint64& playerGUID, const uint64& Guid, uint32 N
        {
            case 0:                                             //Player choose pass
            {
    -            SendLootRoll(0, playerGUID, 128, 128, *roll);
    +            SendLootRoll(playerGUID, 128, 128, *roll);
                ++roll->totalPass;
                itr->second = PASS;
            }
            break;
            case 1:                                             //player choose Need
            {
    -            SendLootRoll(0, playerGUID, 0, 0, *roll);
    +            SendLootRoll(playerGUID, 0, 0, *roll);
                ++roll->totalNeed;
                itr->second = NEED;
            }
            break;
            case 2:                                             //player choose Greed
            {
    -            SendLootRoll(0, playerGUID, 128, 2, *roll);
    +            SendLootRoll(playerGUID, 128, 2, *roll);
                ++roll->totalGreed;
                itr->second = GREED;
            }
    @@ -764,14 +764,14 @@ void Group::CountTheRoll(Rolls::iterator rollI, uint32 NumberOfPlayers)
                        continue;
    
                    uint8 randomN = urand(1, 99);
    -                SendLootRoll(0, itr->first, randomN, 1, *roll);
    +                SendLootRoll(itr->first, randomN, 1, *roll);
                    if (maxresul < randomN)
                    {
                        maxguid  = itr->first;
                        maxresul = randomN;
                    }
                }
    -            SendLootRollWon(0, maxguid, maxresul, 1, *roll);
    +            SendLootRollWon(maxguid, maxresul, 1, *roll);
                player = objmgr.GetPlayer(maxguid);
    
                if(player && player->GetSession())
    @@ -811,14 +811,14 @@ void Group::CountTheRoll(Rolls::iterator rollI, uint32 NumberOfPlayers)
                        continue;
    
                    uint8 randomN = urand(1, 99);
    -                SendLootRoll(0, itr->first, randomN, 2, *roll);
    +                SendLootRoll(itr->first, randomN, 2, *roll);
                    if (maxresul < randomN)
                    {
                        maxguid  = itr->first;
                        maxresul = randomN;
                    }
                }
    -            SendLootRollWon(0, maxguid, maxresul, 2, *roll);
    +            SendLootRollWon(maxguid, maxresul, 2, *roll);
                player = objmgr.GetPlayer(maxguid);
    
                if(player && player->GetSession())
    diff --git a/src/game/Group.h b/src/game/Group.h
    index 478b7c5..f697789 100644
    --- a/src/game/Group.h
    +++ b/src/game/Group.h
    @@ -97,16 +97,17 @@ class InstanceSave;
    class Roll : public LootValidatorRef
    {
        public:
    -        Roll(uint64 _guid, LootItem const& li)
    -            : itemGUID(_guid), itemid(li.itemid), itemRandomPropId(li.randomPropertyId), itemRandomSuffix(li.randomSuffix),
    +        Roll(uint64 _guid, uint64 _owner, LootItem const& li)
    +            : itemGUID(_guid), LootedTargetGUID(_owner), itemid(li.itemid), itemRandomPropId(li.randomPropertyId), itemRandomSuffix(li.randomSuffix),
                totalPlayersRolling(0), totalNeed(0), totalGreed(0), totalPass(0), itemSlot(0) {}
            ~Roll() { }
            void setLoot(Loot *pLoot) { link(pLoot, this); }
            Loot *getLoot() { return getTarget(); }
            void targetObjectBuildLink();
    
    -        uint64 itemGUID;
            uint32 itemid;
    +        uint64 itemGUID;
    +       uint64 LootedTargetGUID;
            int32  itemRandomPropId;
            uint32 itemRandomSuffix;
            typedef std::map<uint64, RollVote> PlayerVote;
    @@ -300,8 +301,8 @@ class MANGOS_DLL_SPEC Group
            /*********************************************************/
    
            void SendLootStartRoll(uint32 CountDown, const Roll &r);
    -        void SendLootRoll(const uint64& SourceGuid, const uint64& TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r);
    -        void SendLootRollWon(const uint64& SourceGuid, const uint64& TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r);
    +        void SendLootRoll(const uint64& TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r);
    +        void SendLootRollWon(const uint64& TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r);
            void SendLootAllPassed(uint32 NumberOfPlayers, const Roll &r);
            void GroupLoot(const uint64& playerGUID, Loot *loot, Creature *creature);
            void NeedBeforeGreed(const uint64& playerGUID, Loot *loot, Creature *creature);
    -- 
    1.6.2.msysgit.0.186.gf7512
    
    

    Greetings, Opterman

  16. What bug does the patch fix? What features does the patch add?

    It fixes wrong door animation at visibility range.

    For which repository revision was the patch created?

    8432

    Who has been writing this patch? Please include either forum user names or email addresses.

    Me

    This is the patch:

    From 91352a4a19cbb6f8a06f69d3e3a85f633e05c396 Mon Sep 17 00:00:00 2001
    From: unknown <Administrator@.(none)>
    Date: Mon, 31 Aug 2009 08:19:53 -0700
    Subject: [PATCH] GAME_OBJECT_TYPE_DOOR Animation
    
    ---
    src/game/GameObject.cpp |    1 +
    src/game/Object.cpp     |    8 ++++----
    2 files changed, 5 insertions(+), 4 deletions(-)
    
    diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp
    index 6ddd5a2..866e468 100644
    --- a/src/game/GameObject.cpp
    +++ b/src/game/GameObject.cpp
    @@ -145,6 +145,7 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMa
    
        SetUInt32Value(GAMEOBJECT_FACTION, goinfo->faction);
        SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags);
    +    SetUInt32Value(GAMEOBJECT_BYTES_1, uint32(-1));
    
        SetEntry(goinfo->id);
    
    diff --git a/src/game/Object.cpp b/src/game/Object.cpp
    index 1601738..51247fe 100644
    --- a/src/game/Object.cpp
    +++ b/src/game/Object.cpp
    @@ -711,18 +711,18 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
                            switch(((GameObject*)this)->GetGoType())
                            {
                                case GAMEOBJECT_TYPE_CHEST:
    -                                *data << uint32(9);         // enable quest object. Represent 9, but 1 for client before 2.3.0
    +                                *data << uint32(0xFFFF0009);         // enable quest object. Represent 9, but 1 for client before 2.3.0
                                    break;
                                case GAMEOBJECT_TYPE_GOOBER:
    -                                *data << uint32(1);
    +                                *data << uint32(0xFFFF0001);
                                    break;
                                default:
    -                                *data << uint32(0);         // unknown, not happen.
    +                                *data << uint32(0xFFFF0000);         // unknown, not happen.
                                    break;
                            }
                        }
                        else
    -                        *data << uint32(0);                 // disable quest object
    +                        *data << uint32(0xFFFF0000);                 // disable quest object
                    }
                    else
                        *data << m_uint32Values[ index ];       // other cases
    -- 
    1.6.2.msysgit.0.186.gf7512
    
    

    Well, when somebody relog in front of a door or is recently at visibility range it animates as if it was opening. I take dumps from official server and i noticed that the high word value of GAMEOBJECT_DYNAMIC was always -1 as unsigned so I think that wow client take -1 high word value as no animation, so that's what i fixed.

    This 's the dump:

    Updated the 18 values of the object (11658 [GameObject:] 190584).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 9 / * 0xFFFF 0x0009 - FFFF0009 - * /.

    Block 21 is read type 0.

    Updated the 18 values of the object (777 [GameObject:] 190584).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 9 / * 0xFFFF 0x0009 - FFFF0009 - * /.

    Block 22 is read type 0.

    Updated the 18 values of the object (789 [GameObject:] 190584).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 9 / * 0xFFFF 0x0009 - FFFF0009 - * /.

    Block 23 is read type 0.

    Updated the 18 values of the object (156 [GameObject:] 191748).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    Block 24 is read type 0.

    Updated the 18 values of the object (158 [GameObject:] 191747).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    Block 25 is read type 0.

    Updated the 18 values of the object (162 [GameObject:] 191541).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    Block 26 is read type 0.

    Updated the 18 values of the object (166 [GameObject:] 191540).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    Block 27 is read type 0.

    Updated the 18 values of the object (725 [GameObject:] 190569).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    Block 28 is read type 0.

    Updated the 18 values of the object (729 [GameObject:] 190569).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    Block 29 is read type 0.

    Updated the 18 values of the object (733 [GameObject:] 190557).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    Block 30 is read type 0.

    Updated the 18 values of the object (799 [GameObject:] 191634).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    Block 31 is read type 0.

    Updated the 18 values of the object (801 [GameObject:] 191617).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    Block 32 is read type 0.

    Updated the 18 values of the object (803 [GameObject:] 191655).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 33, type 0.

    Updated the 18 values of the object (807 [GameObject:] 191631).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    Block 34 is read type 0.

    Updated the 18 values of the object (809 [GameObject:] 191650).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 35, type 0.

    Updated the 18 values of the object (846 [GameObject:] 191590).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 36, type 0.

    Updated the 18 values of the object (867 [GameObject:] 190647).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 37, type 0.

    Updated the 18 values of the object (912 [GameObject:] 190584).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 9 / * 0xFFFF 0x0009 - FFFF0009 - * /.

    It reads the block 38, type 0.

    Updated the 18 values of the object (914 [GameObject:] 190584).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 9 / * 0xFFFF 0x0009 - FFFF0009 - * /.

    Block 39 is read type 0.

    Updated the 18 values of the object (930 [GameObject:] 191650).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 40, type 0.

    Updated the 18 values of the object (938 [GameObject:] 191633).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    Block 41 is read type 0.

    Updated the 18 values of the object (939 [GameObject:] 191655).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 42, type 0.

    Updated the 18 values of the object (940 [GameObject:] 191618).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 43, type 0.

    Updated the 18 values of the object (944 [GameObject:] 191581).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 44, type 0.

    Updated the 18 values of the object (945 [GameObject:] 191580).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 45, type 0.

    Updated the 18 values of the object (947 [GameObject:] 191577).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 46, type 0.

    Updated the 18 values of the object (949 [GameObject:] 191582).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 47, type 0.

    Updated values of the object 18 (1016 [GameObject:] 191664).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 48, type 0.

    Updated values of the object 18 (1019 [GameObject:] 191583).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 49, type 0.

    Updated values of the object 18 (1020 [GameObject:] 191589).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    Block 50 is read type 0.

    Updated the 18 values of the object (1054 [GameObject:] 191632).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 51, type 0.

    Updated the 18 values of the object (1059 [GameObject:] 191616).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 52, type 0.

    Updated values of the object 18 (6004 [GameObject:] 190584).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 9 / * 0xFFFF 0x0009 - FFFF0009 - * /.

    It reads the block 53, type 0.

    Updated the 18 values of the object (11036 [GameObject:] 190584).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 9 / * 0xFFFF 0x0009 - FFFF0009 - * /.

    It reads the block 54, type 0.

    Updated the 18 values of the object (15594 [GameObject:] 190584).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 9 / * 0xFFFF 0x0009 - FFFF0009 - * /.

    It reads the block 55, type 0.

    Updated values of the object 18 (1011 [GameObject:] 191649).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 56, type 0.

    Updated the 18 values of the object (155 [GameObject:] 191539).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    Block 57 is read type 0.

    Updated the 18 values of the object (163 [GameObject:] 191538).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    Block 58 is read type 0.

    Updated the 18 values of the object (703 [GameObject:] 191554).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 59, type 0.

    Updated the 18 values of the object (707 [GameObject:] 191554).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 60 of type 0.

    Updated the 18 values of the object (716 [GameObject:] 190569).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 61, type 0.

    Updated the 18 values of the object (726 [GameObject:] 190569).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 62, type 0.

    Updated the 18 values of the object (730 [GameObject:] 190569).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 63, type 0.

    Updated the 18 values of the object (827 [GameObject:] 191612).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 64, type 0.

    Updated the 18 values of the object (828 [GameObject:] 191613).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 65, type 0.

    Updated the 18 values of the object (829 [GameObject:] 191613).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the 66 block of type 0.

    Updated the 18 values of the object (830 [GameObject:] 191609).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 67, type 0.

    Updated the 18 values of the object (831 [GameObject:] 191612).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 68, type 0.

    Updated the 18 values of the object (832 [GameObject:] 191609).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    It reads the block 69, type 0.

    Updated the 18 values of the object (74 [GameObject:] 190568).

    Value modified [14 / * 0x0000000E * / (GAMEOBJECT_DYNAMIC + 0000)] = 65535 0 / * 0xFFFF 0x0000 - FFFF0000 - * /.

    I initialize GAMEOBJECT_BYTES_1 too as -1 because in official servers its done by this way too, at least the highest byte value.

    Value modified [17 / * 0x00000011 * / (GAMEOBJECT_BYTES_1 + 0000)] = 255 0 3 1 / * 0xFF 0x00 0x03 0x01 - FF000301 - * /.

    Value modified [17 / * 0x00000011 * / (GAMEOBJECT_BYTES_1 + 0000)] = 255 0 9 1 / * 0xFF 0x00 0x09 0x01 - FF000901 - * /.

    Value modified [17 / * 0x00000011 * / (GAMEOBJECT_BYTES_1 + 0000)] = 255 0 3 1 / * 0xFF 0x00 0x03 0x01 - FF000301 - * /.

    Value modified [17 / * 0x00000011 * / (GAMEOBJECT_BYTES_1 + 0000)] = 255 0 6 1 / * 0xFF 0x00 0x06 0x01 - FF000601 - * /.

    Greetings, Opterman

  17. What bug does the patch fix? What features does the patch add?

    Fix CMSG_MOVE_NOT_ACTIVE_MOVER , maybe a typo

    For which repository revision was the patch created?

    8432

    Who has been writing this patch? Please include either forum user names or email addresses.

    Me

    This is the patch:

    From b132ef74014bc1653f46918742d7f77ed4d26d35 Mon Sep 17 00:00:00 2001
    From: unknown <Administrator@.(none)>
    Date: Sun, 30 Aug 2009 18:12:56 -0700
    Subject: [PATCH] NoActiveMover
    
    ---
    src/game/MovementHandler.cpp |    9 ++++-----
    1 files changed, 4 insertions(+), 5 deletions(-)
    
    diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp
    index 7696e1e..2c2ec80 100644
    --- a/src/game/MovementHandler.cpp
    +++ b/src/game/MovementHandler.cpp
    @@ -446,14 +446,13 @@ void WorldSession::HandleSetActiveMoverOpcode(WorldPacket &recv_data)
    void WorldSession::HandleMoveNotActiveMover(WorldPacket &recv_data)
    {
        sLog.outDebug("WORLD: Recvd CMSG_MOVE_NOT_ACTIVE_MOVER");
    -    recv_data.hexlike();
    
    -    uint64 old_mover_guid;
    -    recv_data >> old_mover_guid;
    +    uint64 mover_guid;
    +    recv_data >> mover_guid; //GUID That disable movement
    
    -    if(_player->m_mover->GetGUID() == old_mover_guid)
    +    if(_player->m_mover->GetGUID() != mover_guid)
        {
    -        sLog.outError("HandleMoveNotActiveMover: incorrect mover guid: mover is " I64FMT " and should be " I64FMT " instead of " I64FMT, _player->m_mover->GetGUID(), _player->GetGUID(), old_mover_guid);
    +        sLog.outError("HandleMoveNotActiveMover: incorrect mover guid: mover is " I64FMT " and should be " I64FMT " instead of " I64FMT, _player->m_mover->GetGUID(), _player->GetGUID(), mover_guid);
            recv_data.rpos(recv_data.wpos());                   // prevent warnings spam
            return;
        }
    -- 
    1.6.2.msysgit.0.186.gf7512
    
    

    The old processing code of this packet was a bit annoying because mover guid was as old mover guid perhaps meaning that when client send no active mover packet, mover guid change and that's no right. and before appliying my fix in my server i got very weird console messages like these:

    HandleMoveNotActiveMover: incorrect mover guid: mover is 000000000005DD12 and should be 000000000005DD12 instead of 000000000005DD12

    HandleMoveNotActiveMover: incorrect mover guid: mover is 000000000001B4CD and should be 000000000001B4CD instead of 000000000001B4CD

    HandleMoveNotActiveMover: incorrect mover guid: mover is 000000000001C1D4 and should be 000000000001C1D4 instead of 000000000001C1D4

    HandleMoveNotActiveMover: incorrect mover guid: mover is 0000000000013F6F and should be 0000000000013F6F instead of 0000000000013F6F

    Greetings, Opterman
  18. What bug does the patch fix? What features does the patch add?

    Add the Spell Insta Kill Log

    For which repository revision was the patch created?

    8432

    Who has been writing this patch? Please include either forum user names or email addresses.

    Me

    With this patch , players sould see when someone uses a spell with InstaKIll effect.

    This is the patch

    From 1d53c97fa8044ed1ddf895ef66eb962fc8c2a206 Mon Sep 17 00:00:00 2001
    From: unknown <Administrator@.(none)>
    Date: Sat, 29 Aug 2009 05:48:50 -0700
    Subject: [PATCH] Spell Insta Kill Log
    
    ---
    src/game/SpellEffects.cpp |    5 +++++
    1 files changed, 5 insertions(+), 0 deletions(-)
    
    diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
    index a52d573..91649dd 100644
    --- a/src/game/SpellEffects.cpp
    +++ b/src/game/SpellEffects.cpp
    @@ -282,6 +282,11 @@ void Spell::EffectInstaKill(uint32 /*i*/)
        if(m_caster == unitTarget)                              // prevent interrupt message
            finish();
    
    +    WorldPacket data(SMSG_SPELLINSTAKILLLOG, (8+8+4));
    +    data << uint64(m_caster->GetTypeId() != TYPEID_GAMEOBJECT ? m_caster->GetGUID() : 0); //Caster GUID
    +    data << uint64(unitTarget->GetGUID());  //Victim GUID
    +    data << uint32(m_spellInfo->Id);
    +    m_caster->SendMessageToSet(&data, true);
        m_caster->DealDamage(unitTarget, unitTarget->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
    }
    
    -- 
    1.6.2.msysgit.0.186.gf7512
    
    

    I added a check in GameObject caster case knowning that mangos actually doesn't support gameobject as caster, but in official server when caster is a gameobject caster guid is 0 , I dont know why. So i added it for further support.

    Greetings, Opterman

×
×
  • 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