From 93a3a9214b1d9035a8aef4b2b0308c1774cf499f Mon Sep 17 00:00:00 2001 From: Antz Date: Mon, 17 Feb 2020 21:30:38 +0000 Subject: [PATCH] [12656m] Updated some enums and structures. Thanks R2/TC --- src/game/Object/Vehicle.cpp | 4 +- src/game/Server/DBCEnums.h | 70 ++++++++++++++++------- src/game/Server/DBCStructure.h | 31 +++++++++- src/game/Server/WorldSession.cpp | 2 + src/game/WorldHandlers/AchievementMgr.cpp | 14 +++++ src/game/WorldHandlers/Chat.cpp | 2 + src/game/WorldHandlers/Group.cpp | 2 + src/game/WorldHandlers/MiscHandler.cpp | 2 + src/game/WorldHandlers/SpellEffects.cpp | 18 +++++- src/game/WorldHandlers/VehicleHandler.cpp | 2 +- 10 files changed, 120 insertions(+), 27 deletions(-) diff --git a/src/game/Object/Vehicle.cpp b/src/game/Object/Vehicle.cpp index 9203b9c86..a751728fc 100644 --- a/src/game/Object/Vehicle.cpp +++ b/src/game/Object/Vehicle.cpp @@ -539,8 +539,8 @@ bool VehicleInfo::IsUsableSeatForPlayer(uint32 seatFlags, uint32 seatFlagsB) con return seatFlags & SEAT_FLAG_CAN_EXIT || seatFlags & SEAT_FLAG_UNCONTROLLED || seatFlagsB & - (SEAT_FLAG_B_USABLE_FORCED | SEAT_FLAG_B_USABLE_FORCED_2 | - SEAT_FLAG_B_USABLE_FORCED_3 | SEAT_FLAG_B_USABLE_FORCED_4); + (VEHICLE_SEAT_FLAG_B_USABLE_FORCED | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 | + VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3 | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_4); } /// Add control and such modifiers to a passenger if required diff --git a/src/game/Server/DBCEnums.h b/src/game/Server/DBCEnums.h index ebca50045..c796585d1 100644 --- a/src/game/Server/DBCEnums.h +++ b/src/game/Server/DBCEnums.h @@ -37,11 +37,6 @@ // Server side limitation. Base at used code requirements. // also see MAX_LEVEL and GT_MAX_LEVEL define #define STRONG_MAX_LEVEL 255 -enum MountFlags -{ - MOUNT_FLAG_CAN_PITCH = 0x4, - MOUNT_FLAG_CAN_SWIM = 0x8 -}; enum BattleGroundBracketId // bracketId for level ranges { @@ -70,7 +65,7 @@ enum AchievementFlags { ACHIEVEMENT_FLAG_NONE = 0x00000000, ACHIEVEMENT_FLAG_COUNTER = 0x00000001, // ACHIEVEMENT_FLAG_STATISTIC Just count statistic (never stop and complete) - ACHIEVEMENT_FLAG_UNK2 = 0x00000002, // ACHIEVEMENT_FLAG_HIDDEN not used + ACHIEVEMENT_FLAG_HIDDEN = 0x00000002, // ACHIEVEMENT_FLAG_HIDDEN Not show in client ACHIEVEMENT_FLAG_STORE_MAX_VALUE = 0x00000004, // ACHIEVEMENT_FLAG_HIDDEN_TILL_AWARDED Store only max value? used only in "Reach level xx" ACHIEVEMENT_FLAG_SUMM = 0x00000008, // ACHIEVEMENT_FLAG_CUMULATIVE Use summ criteria value from all requirements (and calculate max value) ACHIEVEMENT_FLAG_MAX_USED = 0x00000010, // ACHIEVEMENT_FLAG_DISPLAY_HIGHEST Show max criteria (and calculate max value ??) @@ -325,7 +320,7 @@ enum Difficulty DUNGEON_DIFFICULTY_NORMAL = 0, DUNGEON_DIFFICULTY_HEROIC = 1, - // DUNGEON_DIFFICULTY_EPIC = 2, // not used, but exists + DUNGEON_DIFFICULTY_CHALLENGE = 2, // 5.x Challenge mode dungeons RAID_DIFFICULTY_10MAN_NORMAL = 0, RAID_DIFFICULTY_25MAN_NORMAL = 1, @@ -333,7 +328,7 @@ enum Difficulty RAID_DIFFICULTY_25MAN_HEROIC = 3, }; -#define MAX_DUNGEON_DIFFICULTY 2 +#define MAX_DUNGEON_DIFFICULTY 3 #define MAX_RAID_DIFFICULTY 4 #define MAX_DIFFICULTY 4 @@ -343,7 +338,8 @@ enum SpawnMask SPAWNMASK_DUNGEON_NORMAL = (1 << DUNGEON_DIFFICULTY_NORMAL), SPAWNMASK_DUNGEON_HEROIC = (1 << DUNGEON_DIFFICULTY_HEROIC), - SPAWNMASK_DUNGEON_ALL = (SPAWNMASK_DUNGEON_NORMAL | SPAWNMASK_DUNGEON_HEROIC), + SPAWNMASK_DUNGEON_CHALLENGE = (1 << DUNGEON_DIFFICULTY_CHALLENGE), + SPAWNMASK_DUNGEON_ALL = (SPAWNMASK_DUNGEON_NORMAL | SPAWNMASK_DUNGEON_HEROIC | SPAWNMASK_DUNGEON_CHALLENGE), SPAWNMASK_RAID_10MAN_NORMAL = (1 << RAID_DIFFICULTY_10MAN_NORMAL), SPAWNMASK_RAID_25MAN_NORMAL = (1 << RAID_DIFFICULTY_25MAN_NORMAL), @@ -377,7 +373,22 @@ enum MapTypes // Lua_IsInInstance MAP_INSTANCE = 1, // party MAP_RAID = 2, // raid MAP_BATTLEGROUND = 3, // pvp - MAP_ARENA = 4 // arena + MAP_ARENA = 4, // arena + MAP_SCENARIO = 5 // scenario +}; + +enum MapFlags // Map flags (need more research) +{ + MAP_FLAG_NONE = 0x00000000, // none specific + MAP_FLAG_INSTANCEABLE = 0x00000001, // or possible splittable for continent maps + MAP_FLAG_DEVELOPMENT = 0x00000002, // testing or development maps only + MAP_FLAG_UNK3 = 0x00000004, // + MAP_FLAG_UNK4 = 0x00000008, // + MAP_FLAG_UNK5 = 0x00000010, // + MAP_FLAG_UNK6 = 0x00000020, // + MAP_FLAG_UNK7 = 0x00000040, // + MAP_FLAG_UNK8 = 0x00000080, // + MAP_FLAG_VARIABLE_DIFFICULTY = 0x00000100, // maps, where has changeable difficulty }; enum AbilytyLearnType @@ -441,6 +452,12 @@ enum ItemLimitCategory ITEM_LIMIT_CATEGORY_MANA_GEM = 4, }; +enum MountFlags +{ + MOUNT_FLAG_CAN_PITCH = 0x4, // client checks MOVEMENTFLAG2_FULL_SPEED_PITCHING + MOUNT_FLAG_CAN_SWIM = 0x8, // client checks MOVEMENTFLAG_SWIMMING +}; + enum TalentTreeRole { TALENT_ROLE_TANK = 0x2, @@ -616,6 +633,7 @@ enum VehicleFlags enum VehicleSeatFlags { + SEAT_FLAG_NONE = 0x00000000, // SEAT_FLAG_UNK1 = 0x00000001, // "HasLowerAnimForEnter" SEAT_FLAG_UNK2 = 0x00000002, // "HasLowerAnimForRide" SEAT_FLAG_UNK3 = 0x00000004, @@ -626,12 +644,12 @@ enum VehicleSeatFlags SEAT_FLAG_UNK8 = 0x00000080, SEAT_FLAG_UNK9 = 0x00000100, SEAT_FLAG_HIDE_PASSENGER = 0x00000200, // Passenger is hidden - SEAT_FLAG_UNK10 = 0x00000400, // "AllowsTurning" + SEAT_FLAG_FREE_ACTION = 0x00000400, // "AllowsTurning" SEAT_FLAG_CAN_CONTROL = 0x00000800, // Lua_UnitInVehicleControlSeat SEAT_FLAG_UNK11 = 0x00001000, // "Can Cast Mount Spell" SEAT_FLAG_UNCONTROLLED = 0x00002000, // "Uncontrolled" SEAT_FLAG_CAN_ATTACK = 0x00004000, // Can attack, cast spells and use items from vehicle? - SEAT_FLAG_UNK13 = 0x00008000, // "ShouldUseVehicleSeatExitAnimationOnForcedExit" + SEAT_FLAG_UNATTACKABLE = 0x00008000, // "ShouldUseVehicleSeatExitAnimationOnForcedExit" SEAT_FLAG_UNK14 = 0x00010000, SEAT_FLAG_UNK15 = 0x00020000, SEAT_FLAG_UNK16 = 0x00040000, // "HasVehicleExitAnimForVoluntaryExit" @@ -652,14 +670,26 @@ enum VehicleSeatFlags enum VehicleSeatFlagsB { - SEAT_FLAG_B_USABLE_FORCED = 0x00000002, - SEAT_FLAG_B_TARGETS_IN_RAIDUI = 0x00000008, // Lua_UnitTargetsVehicleInRaidUI - SEAT_FLAG_B_EJECTABLE = 0x00000020, // Ejectable - SEAT_FLAG_B_USABLE_FORCED_2 = 0x00000040, - SEAT_FLAG_B_USABLE_FORCED_3 = 0x00000100, - SEAT_FLAG_B_USABLE_FORCED_4 = 0x02000000, - SEAT_FLAG_B_CAN_SWITCH = 0x04000000, - SEAT_FLAG_B_PLAYERFRAME_UI = 0x80000000 // Lua_UnitHasVehiclePlayerFrameUI + VEHICLE_SEAT_FLAG_B_NONE = 0x00000000, + VEHICLE_SEAT_FLAG_B_UNK1 = 0x00000001, + VEHICLE_SEAT_FLAG_B_USABLE_FORCED = 0x00000002, + VEHICLE_SEAT_FLAG_B_UNK2 = 0x00000004, + VEHICLE_SEAT_FLAG_B_TARGETS_IN_RAIDUI = 0x00000008, // Lua_UnitTargetsVehicleInRaidUI + VEHICLE_SEAT_FLAG_B_UNK3 = 0x00000010, + VEHICLE_SEAT_FLAG_B_EJECTABLE = 0x00000020, // ejectable + VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 = 0x00000040, + VEHICLE_SEAT_FLAG_B_UNK6 = 0x00000080, + VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3 = 0x00000100, + VEHICLE_SEAT_FLAG_B_EJECTABLE_FORCED = 0x00200000, // seats for forced eject? 27 seats at 3.3.5a + VEHICLE_SEAT_FLAG_B_USABLE_FORCED_4 = 0x02000000, + VEHICLE_SEAT_FLAG_B_CANSWITCH = 0x04000000, // can switch seats + VEHICLE_SEAT_FLAG_B_VEHICLE_PLAYERFRAME_UI = 0x80000000, // Lua_UnitHasVehiclePlayerFrameUI - actually checked for flagsb &~ 0x80000000 +}; + +enum MapDifficultyFlags +{ + MAP_DIFFICULTY_FLAG_NONE = 0x00000001, // Not used in 3.3.5 + MAP_DIFFICULTY_FLAG_CONDITION = 0x00000002, // This map difficulty has condition }; #endif diff --git a/src/game/Server/DBCStructure.h b/src/game/Server/DBCStructure.h index 1293942cd..6076709b1 100644 --- a/src/game/Server/DBCStructure.h +++ b/src/game/Server/DBCStructure.h @@ -219,6 +219,13 @@ struct AchievementCriteriaEntry uint32 castCount; // 4 } cast_spell; + // ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE = 30 + struct + { + uint32 captureID; // 3 + uint32 captureCount; // 4 + } objective_capture; + // ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31 struct { @@ -230,6 +237,7 @@ struct AchievementCriteriaEntry struct { uint32 mapID; // 3 Reference to Map.dbc + uint32 count; // 4 } win_arena; // ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33 @@ -1399,9 +1407,10 @@ struct MapEntry // Helpers uint32 Expansion() const { return addon; } - bool IsDungeon() const { return map_type == MAP_INSTANCE || map_type == MAP_RAID; } - bool IsNonRaidDungeon() const { return map_type == MAP_INSTANCE; } - bool Instanceable() const { return map_type == MAP_INSTANCE || map_type == MAP_RAID || map_type == MAP_BATTLEGROUND || map_type == MAP_ARENA; } + bool IsDungeon() const { return map_type == MAP_INSTANCE || map_type == MAP_RAID || map_type == MAP_SCENARIO; } + bool IsNonRaidDungeon() const { return map_type == MAP_INSTANCE || map_type == MAP_SCENARIO; } + bool Instanceable() const { return map_type == MAP_INSTANCE || map_type == MAP_RAID || map_type == MAP_BATTLEGROUND || map_type == MAP_ARENA || map_type == MAP_SCENARIO; } + bool IsScenario() const { return map_type == MAP_SCENARIO; } bool IsRaid() const { return map_type == MAP_RAID; } bool IsBattleGround() const { return map_type == MAP_BATTLEGROUND; } bool IsBattleArena() const { return map_type == MAP_ARENA; } @@ -1428,6 +1437,13 @@ struct MapEntry { return MapID == 0 || MapID == 1 || MapID == 530 || MapID == 571 || MapID == 870; } + + bool IsTransport() const + { + if (IsContinent()) + return false; + return map_type == MAP_COMMON && mapFlags == MAP_FLAG_INSTANCEABLE; + } }; struct MapDifficultyEntry @@ -2478,6 +2494,15 @@ struct VehicleSeatEntry //uint32 unk[6]; // 58-63 //uint32 unk2; // 64 4.0.0 //uint32 unk3; // 65 4.0.1 + + bool IsUsable() const { return + (m_flags & SEAT_FLAG_CAN_EXIT) || + (m_flags & SEAT_FLAG_CAN_CONTROL) || + (m_flags & SEAT_FLAG_UNCONTROLLED) || + (m_flagsB & VEHICLE_SEAT_FLAG_B_USABLE_FORCED) || + (m_flagsB & VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2) || + (m_flagsB & VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3) || + (m_flagsB & VEHICLE_SEAT_FLAG_B_USABLE_FORCED_4); } }; struct WMOAreaTableEntry diff --git a/src/game/Server/WorldSession.cpp b/src/game/Server/WorldSession.cpp index eee624813..f1aa44145 100644 --- a/src/game/Server/WorldSession.cpp +++ b/src/game/Server/WorldSession.cpp @@ -1122,7 +1122,9 @@ void WorldSession::ReadAddonsInfo(ByteBuffer &data) addonInfo >> unk2; if (addonInfo.rpos() != addonInfo.size()) + { DEBUG_LOG("packet under read!"); + } } else sLog.outError("Addon packet uncompress error!"); diff --git a/src/game/WorldHandlers/AchievementMgr.cpp b/src/game/WorldHandlers/AchievementMgr.cpp index 788ed8eda..35c0ca495 100644 --- a/src/game/WorldHandlers/AchievementMgr.cpp +++ b/src/game/WorldHandlers/AchievementMgr.cpp @@ -610,6 +610,15 @@ void AchievementMgr::LoadFromDB(QueryResult* achievementResult, QueryResult* cri progress.timedCriteriaFailed = false; AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->referredAchievement); + + if (!achievement) + { + // we will remove nonexistent referred achievement for all characters + sLog.outError("Nonexistent achievement criteria %u (referred achievement %u) data removed from table `character_achievement_progress`.",id, criteria->referredAchievement); + CharacterDatabase.PExecute("DELETE FROM character_achievement_progress WHERE criteria = %u",id); + continue; + } + // Checked in LoadAchievementCriteriaList // A failed achievement will be removed on next tick - TODO: Possible that timer 2 is reseted @@ -650,6 +659,10 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement) DEBUG_FILTER_LOG(LOG_FILTER_ACHIEVEMENT_UPDATES, "AchievementMgr::SendAchievementEarned(%u)", achievement->ID); + // Not broadcast a hidden achievement + if(achievement->flags & ACHIEVEMENT_FLAG_HIDDEN) + return; + if (Guild* guild = sGuildMgr.GetGuildById(GetPlayer()->GetGuildId())) { MaNGOS::AchievementChatBuilder say_builder(*GetPlayer(), CHAT_MSG_GUILD_ACHIEVEMENT, LANG_ACHIEVEMENT_EARNED, achievement->ID); @@ -2680,6 +2693,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaRequirements() default: continue; } + break; } case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING: break; // any cases diff --git a/src/game/WorldHandlers/Chat.cpp b/src/game/WorldHandlers/Chat.cpp index 4c60488fe..9ffee611c 100644 --- a/src/game/WorldHandlers/Chat.cpp +++ b/src/game/WorldHandlers/Chat.cpp @@ -2197,7 +2197,9 @@ bool ChatHandler::isValidChatMessage(const char* message) // check if every opened sequence was also closed properly if (validSequence != validSequenceIterator) + { DEBUG_LOG("ChatHandler::isValidChatMessage EOF in active sequence"); + } return validSequence == validSequenceIterator; } diff --git a/src/game/WorldHandlers/Group.cpp b/src/game/WorldHandlers/Group.cpp index 3070c47f7..4ef9231f5 100644 --- a/src/game/WorldHandlers/Group.cpp +++ b/src/game/WorldHandlers/Group.cpp @@ -2014,8 +2014,10 @@ InstanceGroupBind* Group::BindToInstance(DungeonPersistentState* state, bool per bind.state = state; bind.perm = permanent; if (!load) + { DEBUG_LOG("Group::BindToInstance: Group (Id: %d) is now bound to map %d, instance %d, difficulty %d", GetId(), state->GetMapId(), state->GetInstanceId(), state->GetDifficulty()); + } return &bind; } else diff --git a/src/game/WorldHandlers/MiscHandler.cpp b/src/game/WorldHandlers/MiscHandler.cpp index bf1b9aeac..8591304f5 100644 --- a/src/game/WorldHandlers/MiscHandler.cpp +++ b/src/game/WorldHandlers/MiscHandler.cpp @@ -1437,7 +1437,9 @@ void WorldSession::HandleTimeSyncResp(WorldPacket& recv_data) DEBUG_LOG("WORLD: Received opcode CMSG_TIME_SYNC_RESP: counter %u, client ticks %u, time since last sync %u", counter, clientTicks, clientTicks - _player->m_timeSyncClient); if (counter != _player->m_timeSyncCounter - 1) + { DEBUG_LOG(" WORLD: Opcode CMSG_TIME_SYNC_RESP -- Wrong time sync counter from %s (cheater?)", _player->GetGuidStr().c_str()); + } uint32 ourTicks = clientTicks + (WorldTimer::getMSTime() - _player->m_timeSyncServer); diff --git a/src/game/WorldHandlers/SpellEffects.cpp b/src/game/WorldHandlers/SpellEffects.cpp index 1a25252b2..f6a7aabbd 100644 --- a/src/game/WorldHandlers/SpellEffects.cpp +++ b/src/game/WorldHandlers/SpellEffects.cpp @@ -4697,18 +4697,26 @@ void Spell::EffectTriggerMissileSpell(SpellEffectEntry const* effect) m_caster->GetMap()->ScriptsStart(DBS_ON_SPELL, m_spellInfo->Id, m_caster, unitTarget); } else + { sLog.outError("EffectTriggerMissileSpell of spell %u (eff: %u): triggering unknown spell id %u", m_spellInfo->Id, effect->EffectIndex, triggered_spell_id); + } return; } if (m_CastItem) + { DEBUG_FILTER_LOG(LOG_FILTER_SPELL_CAST, "WORLD: cast Item spellId - %i", spellInfo->Id); + } if (m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION) + { m_caster->CastSpell(m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ, spellInfo, true, m_CastItem, NULL, m_originalCasterGUID, m_spellInfo); - else if (unitTarget) + } + else if (unitTarget) + { m_caster->CastSpell(unitTarget, spellInfo, true, m_CastItem, NULL, m_originalCasterGUID, m_spellInfo); + } } void Spell::EffectJump(SpellEffectEntry const* effect) @@ -5024,7 +5032,9 @@ void Spell::EffectUnlearnSpecialization(SpellEffectEntry const* effect) _player->removeSpell(spellToUnlearn); if (WorldObject const* caster = GetCastingObject()) + { DEBUG_LOG("Spell: %s has unlearned spell %u at %s", _player->GetGuidStr().c_str(), spellToUnlearn, caster->GetGuidStr().c_str()); + } } void Spell::EffectPowerDrain(SpellEffectEntry const* effect) @@ -6583,7 +6593,9 @@ void Spell::EffectLearnSpell(SpellEffectEntry const* effect) player->learnSpell(spellToLearn, false); if (WorldObject const* caster = GetCastingObject()) + { DEBUG_LOG("Spell: %s has learned spell %u from %s", player->GetGuidStr().c_str(), spellToLearn, caster->GetGuidStr().c_str()); + } } void Spell::EffectDispel(SpellEffectEntry const* effect) @@ -6852,7 +6864,9 @@ void Spell::EffectLearnSkill(SpellEffectEntry const* effect) ((Player*)unitTarget)->SetSkill(skillid, skillval ? skillval : 1, damage * 75, damage); if (WorldObject const* caster = GetCastingObject()) + { DEBUG_LOG("Spell: %s has learned skill %u (to maxlevel %u) from %s", unitTarget->GetGuidStr().c_str(), skillid, damage * 75, caster->GetGuidStr().c_str()); + } } void Spell::EffectTradeSkill(SpellEffectEntry const* /*effect*/) @@ -7346,7 +7360,9 @@ void Spell::EffectLearnPetSpell(SpellEffectEntry const* effect) _player->PetSpellInitialize(); if (WorldObject const* caster = GetCastingObject()) + { DEBUG_LOG("Spell: %s has learned spell %u from %s", pet->GetGuidStr().c_str(), learn_spellproto->Id, caster->GetGuidStr().c_str()); + } } void Spell::EffectTaunt(SpellEffectEntry const* /*effect*/) diff --git a/src/game/WorldHandlers/VehicleHandler.cpp b/src/game/WorldHandlers/VehicleHandler.cpp index e74431664..3dcf80033 100644 --- a/src/game/WorldHandlers/VehicleHandler.cpp +++ b/src/game/WorldHandlers/VehicleHandler.cpp @@ -215,7 +215,7 @@ void WorldSession::HandleEjectPassenger(WorldPacket& recvPacket) // Check for eject flag if (VehicleSeatEntry const* seatEntry = vehicleInfo->GetSeatEntry(passenger->GetTransportInfo()->GetTransportSeat())) - if (seatEntry->m_flagsB & SEAT_FLAG_B_EJECTABLE) + if (seatEntry->m_flagsB & VEHICLE_SEAT_FLAG_B_EJECTABLE) _player->RemoveSpellsCausingAura(SPELL_AURA_CONTROL_VEHICLE, passengerGuid); }