diff --git a/src/game/Map.h b/src/game/Map.h index 6da1e56ae..e904a2ba5 100644 --- a/src/game/Map.h +++ b/src/game/Map.h @@ -219,6 +219,17 @@ class MANGOS_DLL_SPEC Map : public GridRefManager, public MaNGOS::Obj bool IsBattleGround() const { return i_mapEntry && i_mapEntry->IsBattleGround(); } bool IsBattleArena() const { return i_mapEntry && i_mapEntry->IsBattleArena(); } bool IsBattleGroundOrArena() const { return i_mapEntry && i_mapEntry->IsBattleGroundOrArena(); } + bool GetEntrancePos(int32 &mapid, float &x, float &y) + { + if(!i_mapEntry) + return false; + if(i_mapEntry->entrance_map < 0) + return false; + mapid = i_mapEntry->entrance_map; + x = i_mapEntry->entrance_x; + y = i_mapEntry->entrance_y; + return true; + } void AddObjectToRemoveList(WorldObject *obj); void DoDelayedMovesAndRemoves(); diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index ffcaeaebf..a10777068 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -5020,7 +5020,7 @@ AreaTrigger const* ObjectMgr::GetGoBackTrigger(uint32 Map) const if(!mapEntry) return NULL; for (AreaTriggerMap::const_iterator itr = mAreaTriggers.begin(); itr != mAreaTriggers.end(); itr++) { - if(itr->second.target_mapId == mapEntry->parent_map) + if(itr->second.target_mapId == mapEntry->entrance_map) { AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(itr->first); if(atEntry && atEntry->mapid == Map) diff --git a/src/game/Opcodes.h b/src/game/Opcodes.h index d7f09ab90..969ead4ef 100644 --- a/src/game/Opcodes.h +++ b/src/game/Opcodes.h @@ -1123,7 +1123,7 @@ enum Opcodes SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x444, SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT = 0x445, CMSG_CALENDAR_COMPLAIN = 0x446, - SMSG_CALENDAR_EVENT_RESERVED_2 = 0x447, + SMSG_CALENDAR_EVENT_RESERVED_2 = 0x447, // CMSG_CALENDAR_GET_CALENDAR in 9155 SMSG_CALENDAR_EVENT_RESERVED_3 = 0x448, CMSG_SAVE_DANCE = 0x449, SMSG_NOTIFY_DANCE = 0x44A, diff --git a/src/game/Player.cpp b/src/game/Player.cpp index a8bed7442..b27297742 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -3598,6 +3598,10 @@ void Player::SetMovement(PlayerMovementType pType) */ void Player::BuildPlayerRepop() { + WorldPacket data(SMSG_PRE_RESURRECT, GetPackGUID().size()); + data.append(GetPackGUID()); + GetSession()->SendPacket(&data); + if(getRace() == RACE_NIGHTELF) CastSpell(this, 20584, true); // auras SPELL_AURA_INCREASE_SPEED(+speed in wisp form), SPELL_AURA_INCREASE_SWIM_SPEED(+swim speed in wisp form), SPELL_AURA_TRANSFORM (to wisp form) CastSpell(this, 8326, true); // auras SPELL_AURA_GHOST, SPELL_AURA_INCREASE_SPEED(why?), SPELL_AURA_INCREASE_SWIM_SPEED(why?) diff --git a/src/game/QueryHandler.cpp b/src/game/QueryHandler.cpp index 2f6380d17..232e72536 100644 --- a/src/game/QueryHandler.cpp +++ b/src/game/QueryHandler.cpp @@ -31,6 +31,7 @@ #include "NPCHandler.h" #include "ObjectAccessor.h" #include "Pet.h" +#include "MapManager.h" void WorldSession::SendNameQueryOpcode(Player *p) { @@ -272,19 +273,42 @@ void WorldSession::HandleCorpseQueryOpcode(WorldPacket & /*recv_data*/) Corpse *corpse = GetPlayer()->GetCorpse(); - uint8 found = 1; - if(!corpse) - found = 0; + uint8 found = corpse ? 1 : 0; + + int32 mapid = corpse->GetMapId(); + float x = corpse->GetPositionX(); + float y = corpse->GetPositionY(); + float z = corpse->GetPositionZ(); + int32 corpsemapid = _player->GetMapId(); + + if(found) + { + if(Map *map = corpse->GetMap()) + { + if(map->IsDungeon()) + { + if(!map->GetEntrancePos(mapid, x, y)) + return; + + Map *entrance_map = MapManager::Instance().GetMap(mapid, _player); + if(!entrance_map) + return; + + z = entrance_map->GetHeight(x, y, MAX_HEIGHT); + corpsemapid = corpse->GetMapId(); + } + } + } WorldPacket data(MSG_CORPSE_QUERY, (1+found*(5*4))); data << uint8(found); if(found) { - data << corpse->GetMapId(); - data << corpse->GetPositionX(); - data << corpse->GetPositionY(); - data << corpse->GetPositionZ(); - data << _player->GetMapId(); + data << int32(mapid); + data << float(x); + data << float(y); + data << float(z); + data << int32(corpsemapid); } SendPacket(&data); } diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 53d713a27..9cc926dec 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -1791,9 +1791,7 @@ void Unit::DoAttackDamage (Unit *pVictim, uint32 *damage, CleanDamage *cleanDama case MELEE_HIT_BLOCK_CRIT: case MELEE_HIT_CRIT: { - //*hitInfo = 0xEA; - // 0xEA - *hitInfo = HITINFO_CRITICALHIT | HITINFO_NORMALSWING2 | 0x8; + *hitInfo = HITINFO_CRITICALHIT | HITINFO_NORMALSWING2 | HITINFO_UNK2; // Crit bonus calc uint32 crit_bonus; @@ -4377,11 +4375,11 @@ void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit *target, uint8 SwingType, sLog.outDebug("WORLD: Sending SMSG_ATTACKERSTATEUPDATE"); WorldPacket data(SMSG_ATTACKERSTATEUPDATE, (16+45)); // we guess size - data << (uint32)HitInfo; + data << uint32(HitInfo); // flags data.append(GetPackGUID()); data.append(target->GetPackGUID()); - data << uint32(Damage-AbsorbDamage-Resist-BlockedAmount); - data << uint32(0); // WotLK + data << uint32(Damage-AbsorbDamage-Resist-BlockedAmount);// damage + data << uint32(0); // overkill value data << (uint8)SwingType; // count? @@ -4391,17 +4389,17 @@ void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit *target, uint8 SwingType, data << (uint32)(Damage-AbsorbDamage-Resist-BlockedAmount); // end loop - if(HitInfo & (HITINFO_RESIST | HITINFO_ABSORB)) + if(HitInfo & (HITINFO_ABSORB | HITINFO_ABSORB2)) { // for(i = 0; i < SwingType; ++i) - data << (uint32)Resist; + data << uint32(AbsorbDamage); // end loop } - if(HitInfo & (HITINFO_CRITICALHIT | HITINFO_UNK2)) + if(HitInfo & (HITINFO_RESIST | HITINFO_RESIST2)) { // for(i = 0; i < SwingType; ++i) - data << uint32(0); // what is it? + data << uint32(Resist); // end loop } @@ -4409,17 +4407,17 @@ void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit *target, uint8 SwingType, data << (uint32)0; data << (uint32)0; + if(HitInfo & HITINFO_BLOCK) + { + data << uint32(BlockedAmount); + } + if(HitInfo & HITINFO_UNK3) { data << uint32(0); } - /*if(unknown & HitInfo) - { - data << uint32(0); - }*/ - - /*if(HitInfo & HITINFO_UNK1) + if(HitInfo & HITINFO_UNK1) { data << uint32(0); data << float(0); @@ -4436,7 +4434,7 @@ void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit *target, uint8 SwingType, data << float(0); } data << uint32(0); - }*/ + } SendMessageToSet( &data, true ); } diff --git a/src/game/Unit.h b/src/game/Unit.h index 44cc6e270..f8cb224dc 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -208,16 +208,27 @@ enum HitInfo HITINFO_UNK1 = 0x00000001, // req correct packet structure HITINFO_NORMALSWING2 = 0x00000002, HITINFO_LEFTSWING = 0x00000004, + HITINFO_UNK2 = 0x00000008, HITINFO_MISS = 0x00000010, - HITINFO_ABSORB = 0x00000020, // plays absorb sound - HITINFO_RESIST = 0x00000040, // resisted atleast some damage - HITINFO_CRITICALHIT = 0x00000080, - HITINFO_UNK2 = 0x00000100, // wotlk? - HITINFO_UNK3 = 0x00002000, // wotlk? - HITINFO_GLANCING = 0x00004000, - HITINFO_CRUSHING = 0x00008000, - HITINFO_NOACTION = 0x00010000, - HITINFO_SWINGNOHITSOUND = 0x00080000 + HITINFO_ABSORB = 0x00000020, // absorbed damage + HITINFO_ABSORB2 = 0x00000040, // absorbed damage + HITINFO_RESIST = 0x00000080, // resisted atleast some damage + HITINFO_RESIST2 = 0x00000100, // resisted atleast some damage + HITINFO_CRITICALHIT = 0x00000200, // critical hit + // 0x00000400 + // 0x00000800 + // 0x00001000 + HITINFO_BLOCK = 0x00002000, // blocked damage + // 0x00004000 + // 0x00008000 + HITINFO_GLANCING = 0x00010000, + HITINFO_CRUSHING = 0x00020000, + HITINFO_NOACTION = 0x00040000, // guessed + // 0x00080000 + // 0x00100000 + HITINFO_SWINGNOHITSOUND = 0x00200000, // guessed + // 0x00400000 + HITINFO_UNK3 = 0x00800000 }; //i would like to remove this: (it is defined in item.h diff --git a/src/shared/Database/DBCStructure.h b/src/shared/Database/DBCStructure.h index de3f80dfe..05d69075f 100644 --- a/src/shared/Database/DBCStructure.h +++ b/src/shared/Database/DBCStructure.h @@ -860,18 +860,18 @@ struct MailTemplateEntry struct MapEntry { - uint32 MapID; // 0 + uint32 MapID; // 0 //char* internalname; // 1 unused - uint32 map_type; // 2 + uint32 map_type; // 2 // 3 0 or 1 for battlegrounds (not arenas) - char* name[16]; // 4-19 + char* name[16]; // 4-19 // 20 name flags, unused - uint32 linked_zone; // 21 common zone for instance and continent map + uint32 linked_zone; // 21 common zone for instance and continent map //char* hordeIntro[16]; // 23-37 text for PvP Zones // 38 intro text flags //char* allianceIntro[16]; // 39-54 text for PvP Zones // 55 intro text flags - uint32 multimap_id; // 56 + uint32 multimap_id; // 56 // 57 //chat* unknownText1[16]; // 58-73 unknown empty text fields, possible normal Intro text. // 74 text flags @@ -879,14 +879,14 @@ struct MapEntry // 91 text flags //chat* unknownText2[16]; // 92-107 unknown empty text fields // 108 text flags - int32 parent_map; // 109 map_id of parent map - //float start_x // 110 enter x coordinate (if exist single entry) - //float start_y // 111 enter y coordinate (if exist single entry) - uint32 resetTimeRaid; // 112 - uint32 resetTimeHeroic; // 113 + int32 entrance_map; // 109 map_id of entrance map + float entrance_x; // 110 entrance x coordinate (if exist single entry) + float entrance_y; // 111 entrance y coordinate (if exist single entry) + uint32 resetTimeRaid; // 112 + uint32 resetTimeHeroic; // 113 // 114 all 0 // 115 -1, 0 and 720 - uint32 addon; // 116 (0-original maps,1-tbc addon) + uint32 addon; // 116 (0-original maps,1-tbc addon) // 117 some kind of time? // Helpers diff --git a/src/shared/Database/DBCfmt.cpp b/src/shared/Database/DBCfmt.cpp index 46afd6b3c..1fbb324d9 100644 --- a/src/shared/Database/DBCfmt.cpp +++ b/src/shared/Database/DBCfmt.cpp @@ -58,7 +58,7 @@ const char ItemRandomSuffixfmt[]="nxxxxxxxxxxxxxxxxxxiiiiiiiiii"; const char ItemSetEntryfmt[]="dssssssssssssssssxxxxxxxxxxxxxxxxxxiiiiiiiiiiiiiiiiii"; const char LockEntryfmt[]="niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx"; const char MailTemplateEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; -const char MapEntryfmt[]="nxixssssssssssssssssxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixxiixxix"; +const char MapEntryfmt[]="nxixssssssssssssssssxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiffiixxix"; const char QuestSortEntryfmt[]="nxxxxxxxxxxxxxxxxx"; const char RandomPropertiesPointsfmt[]="niiiiiiiiiiiiiii"; const char ScalingStatDistributionfmt[]="niiiiiiiiiiiiiiiiiiiii";