aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/2015_10_17_01_world.sql1
-rw-r--r--src/server/game/Entities/Player/Player.cpp15
-rw-r--r--src/server/game/Entities/Player/Player.h6
-rw-r--r--src/server/game/Handlers/DuelHandler.cpp10
-rw-r--r--src/server/game/Miscellaneous/Language.h3
-rw-r--r--src/server/game/Spells/SpellHistory.cpp52
-rw-r--r--src/server/game/Spells/SpellHistory.h4
-rw-r--r--src/server/game/World/World.cpp2
-rw-r--r--src/server/game/World/World.h2
-rw-r--r--src/server/worldserver/worldserver.conf.dist6
10 files changed, 66 insertions, 35 deletions
diff --git a/sql/updates/world/2015_10_17_01_world.sql b/sql/updates/world/2015_10_17_01_world.sql
new file mode 100644
index 00000000000..f6ddc034e20
--- /dev/null
+++ b/sql/updates/world/2015_10_17_01_world.sql
@@ -0,0 +1 @@
+DELETE FROM `trinity_string` WHERE `entry` = 11010;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 1be3c2454b2..7d817a18bc6 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -7610,18 +7610,13 @@ void Player::DuelComplete(DuelCompleteType type)
duel->opponent->SetGuidValue(PLAYER_DUEL_ARBITER, ObjectGuid::Empty);
duel->opponent->SetUInt32Value(PLAYER_DUEL_TEAM, 0);
- if (sWorld->getBoolConfig(CONFIG_RESET_COOLDOWN_AFTER_DUEL) &&
- type != DUEL_INTERRUPTED)
+ if (sWorld->getBoolConfig(CONFIG_RESET_DUEL_COOLDOWNS))
{
- if (!HasCoolDownBeforeDuel())
- RemoveArenaSpellCooldowns(true);
- else
- ChatHandler(GetSession()).PSendSysMessage(LANG_COOLDOWN_NOT_RESET_AFTER_DUEL);
+ RemoveArenaSpellCooldowns(true);
+ duel->opponent->RemoveArenaSpellCooldowns(true);
- if (!duel->opponent->HasCoolDownBeforeDuel())
- duel->opponent->RemoveArenaSpellCooldowns(true);
- else
- ChatHandler(duel->opponent->GetSession()).PSendSysMessage(LANG_COOLDOWN_NOT_RESET_AFTER_DUEL);
+ GetSpellHistory()->RestoreCooldownStateAfterDuel();
+ duel->opponent->GetSpellHistory()->RestoreCooldownStateAfterDuel();
}
delete duel->opponent->duel;
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 0c1fdd8f03d..e62673855b9 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -285,7 +285,7 @@ struct PvPInfo
struct DuelInfo
{
- DuelInfo() : initiator(NULL), opponent(NULL), startTimer(0), startTime(0), outOfBound(0), isMounted(false), hasCoolDownBeforeDuel(false) { }
+ DuelInfo() : initiator(NULL), opponent(NULL), startTimer(0), startTime(0), outOfBound(0), isMounted(false) { }
Player* initiator;
Player* opponent;
@@ -293,7 +293,6 @@ struct DuelInfo
time_t startTime;
time_t outOfBound;
bool isMounted;
- bool hasCoolDownBeforeDuel;
};
struct Areas
@@ -1948,9 +1947,6 @@ class Player : public Unit, public GridObject<Player>
void SetHonorPoints(uint32 value);
void SetArenaPoints(uint32 value);
- bool HasCoolDownBeforeDuel() const { return duel->hasCoolDownBeforeDuel; }
- void UpdateHasCoolDownBeforeDuel() { duel->hasCoolDownBeforeDuel = GetSpellHistory()->GetArenaCooldownsSize() > 0; }
-
//End of PvP System
void SetDrunkValue(uint8 newDrunkValue, uint32 itemId = 0);
diff --git a/src/server/game/Handlers/DuelHandler.cpp b/src/server/game/Handlers/DuelHandler.cpp
index 6e8ff5547d7..79539258bd5 100644
--- a/src/server/game/Handlers/DuelHandler.cpp
+++ b/src/server/game/Handlers/DuelHandler.cpp
@@ -43,8 +43,14 @@ void WorldSession::HandleDuelAcceptedOpcode(WorldPacket& recvPacket)
TC_LOG_DEBUG("network", "Player 1 is: %u (%s)", player->GetGUID().GetCounter(), player->GetName().c_str());
TC_LOG_DEBUG("network", "Player 2 is: %u (%s)", plTarget->GetGUID().GetCounter(), plTarget->GetName().c_str());
- player->UpdateHasCoolDownBeforeDuel();
- plTarget->UpdateHasCoolDownBeforeDuel();
+ if (sWorld->getBoolConfig(CONFIG_RESET_DUEL_COOLDOWNS))
+ {
+ player->GetSpellHistory()->SaveCooldownStateBeforeDuel();
+ plTarget->GetSpellHistory()->SaveCooldownStateBeforeDuel();
+
+ player->RemoveArenaSpellCooldowns(true);
+ plTarget->RemoveArenaSpellCooldowns(true);
+ }
time_t now = time(NULL);
player->duel->startTimer = now;
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index d374c8c509a..de117905b3d 100644
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -1202,8 +1202,7 @@ enum TrinityStrings
LANG_BAN_ACCOUNT_YOUPERMBANNEDMESSAGE_WORLD = 11007,
LANG_NPCINFO_INHABIT_TYPE = 11008,
- LANG_NPCINFO_FLAGS_EXTRA = 11009,
+ LANG_NPCINFO_FLAGS_EXTRA = 11009
- LANG_COOLDOWN_NOT_RESET_AFTER_DUEL = 11010
};
#endif
diff --git a/src/server/game/Spells/SpellHistory.cpp b/src/server/game/Spells/SpellHistory.cpp
index 208b4cf7ed9..0ae5fe97b13 100644
--- a/src/server/game/Spells/SpellHistory.cpp
+++ b/src/server/game/Spells/SpellHistory.cpp
@@ -637,21 +637,53 @@ void SpellHistory::BuildCooldownPacket(WorldPacket& data, uint8 flags, PacketCoo
}
}
-uint16 SpellHistory::GetArenaCooldownsSize()
+void SpellHistory::SaveCooldownStateBeforeDuel()
{
- uint16 count = 0;
+ _spellCooldownsBeforeDuel = _spellCooldowns;
+}
- for (auto itr = _spellCooldowns.begin(); itr != _spellCooldowns.end();)
+void SpellHistory::RestoreCooldownStateAfterDuel()
+{
+ if (Player* player = _owner->ToPlayer())
{
- SpellInfo const* spellInfo = sSpellMgr->EnsureSpellInfo(itr->first);
+ // add all profession CDs created while in duel (if any)
+ for (auto itr = _spellCooldowns.begin(); itr != _spellCooldowns.end(); ++itr)
+ {
+ SpellInfo const* spellInfo = sSpellMgr->EnsureSpellInfo(itr->first);
- if (spellInfo->RecoveryTime < 10 * MINUTE * IN_MILLISECONDS &&
- spellInfo->CategoryRecoveryTime < 10 * MINUTE * IN_MILLISECONDS)
- ++count;
- ++itr;
- }
+ if (spellInfo->RecoveryTime > 10 * MINUTE * IN_MILLISECONDS ||
+ spellInfo->CategoryRecoveryTime > 10 * MINUTE * IN_MILLISECONDS)
+ _spellCooldownsBeforeDuel[itr->first] = _spellCooldowns[itr->first];
+ }
+
+ _spellCooldowns = _spellCooldownsBeforeDuel;
+
+ // update the client: clear all cooldowns
+ std::vector<int32> resetCooldowns;
+ resetCooldowns.reserve(_spellCooldowns.size());
+
+ for (auto itr = _spellCooldowns.begin(); itr != _spellCooldowns.end(); ++itr)
+ resetCooldowns.push_back(itr->first);
- return count;
+ if (resetCooldowns.empty())
+ return;
+
+ SendClearCooldowns(resetCooldowns);
+
+ // update the client: restore old cooldowns
+ PacketCooldowns cooldowns;
+
+ for (auto itr = _spellCooldowns.begin(); itr != _spellCooldowns.end(); ++itr)
+ {
+ Clock::time_point now = Clock::now();
+ uint32 cooldownDuration = itr->second.CooldownEnd > now ? std::chrono::duration_cast<std::chrono::milliseconds>(itr->second.CooldownEnd - now).count() : 0;
+ cooldowns[itr->first] = cooldownDuration;
+ }
+
+ WorldPacket data;
+ BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, cooldowns);
+ player->SendDirectMessage(&data);
+ }
}
template void SpellHistory::LoadFromDB<Player>(PreparedQueryResult cooldownsResult);
diff --git a/src/server/game/Spells/SpellHistory.h b/src/server/game/Spells/SpellHistory.h
index 4d0642d644e..86737ec7da9 100644
--- a/src/server/game/Spells/SpellHistory.h
+++ b/src/server/game/Spells/SpellHistory.h
@@ -117,7 +117,8 @@ public:
void BuildCooldownPacket(WorldPacket& data, uint8 flags, uint32 spellId, uint32 cooldown) const;
CooldownStorageType::size_type GetCooldownsSizeForPacket() const { return _spellCooldowns.size(); }
- uint16 GetArenaCooldownsSize();
+ void SaveCooldownStateBeforeDuel();
+ void RestoreCooldownStateAfterDuel();
private:
Player* GetPlayerOwner() const;
@@ -128,6 +129,7 @@ private:
Unit* _owner;
CooldownStorageType _spellCooldowns;
+ CooldownStorageType _spellCooldownsBeforeDuel;
Clock::time_point _schoolLockouts[MAX_SPELL_SCHOOL];
GlobalCooldownStorageType _globalCooldowns;
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 85e79168b71..56c4cdf0acf 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1190,7 +1190,7 @@ void World::LoadConfigSettings(bool reload)
m_int_configs[CONFIG_MAX_WHO] = sConfigMgr->GetIntDefault("MaxWhoListReturns", 49);
m_bool_configs[CONFIG_START_ALL_SPELLS] = sConfigMgr->GetBoolDefault("PlayerStart.AllSpells", false);
m_int_configs[CONFIG_HONOR_AFTER_DUEL] = sConfigMgr->GetIntDefault("HonorPointsAfterDuel", 0);
- m_bool_configs[CONFIG_RESET_COOLDOWN_AFTER_DUEL] = sConfigMgr->GetBoolDefault("ResetCoolDownAfterDuel", 0);
+ m_bool_configs[CONFIG_RESET_DUEL_COOLDOWNS] = sConfigMgr->GetBoolDefault("ResetDuelCooldowns", 0);
m_bool_configs[CONFIG_START_ALL_EXPLORED] = sConfigMgr->GetBoolDefault("PlayerStart.MapsExplored", false);
m_bool_configs[CONFIG_START_ALL_REP] = sConfigMgr->GetBoolDefault("PlayerStart.AllReputation", false);
m_bool_configs[CONFIG_ALWAYS_MAXSKILL] = sConfigMgr->GetBoolDefault("AlwaysMaxWeaponSkill", false);
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 1f71975cde2..5efa3ce3f46 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -161,7 +161,7 @@ enum WorldBoolConfigs
CONFIG_ALLOW_TRACK_BOTH_RESOURCES,
CONFIG_CALCULATE_CREATURE_ZONE_AREA_DATA,
CONFIG_CALCULATE_GAMEOBJECT_ZONE_AREA_DATA,
- CONFIG_RESET_COOLDOWN_AFTER_DUEL,
+ CONFIG_RESET_DUEL_COOLDOWNS,
BOOL_CONFIG_VALUE_COUNT
};
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index 1689f05966a..a885c23ab82 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -2605,12 +2605,12 @@ PlayerStart.MapsExplored = 0
HonorPointsAfterDuel = 0
#
-# ResetCoolDownAfterDuel
-# Description: Reset all cooldowns after duel, but only if player has no cooldowns before the duel.
+# ResetDuelCooldowns
+# Description: Reset all cooldowns before duel starts and restore them when duel ends.
# Default: 0 - (Disabled)
# 1 - (Enabled)
-ResetCoolDownAfterDuel = 0
+ResetDuelCooldowns = 0
#
# AlwaysMaxWeaponSkill