diff options
| author | DDuarte <dnpd.dd@gmail.com> | 2014-07-24 17:10:21 +0100 |
|---|---|---|
| committer | DDuarte <dnpd.dd@gmail.com> | 2014-07-24 17:10:21 +0100 |
| commit | cdb33ab174a43fb3cc19dcd672bbfd3191fd84aa (patch) | |
| tree | 7e191c76630db4190c89434fcd13db77478428db /src/server/game | |
| parent | 1ab65432a62176e57e19eb08e260382354caffdf (diff) | |
| parent | 3de1714350f1f83ff880ee927523aabfb5731475 (diff) | |
Merge branch 'master' into 4.3.4
Conflicts:
src/server/game/Server/WorldSocket.cpp
src/server/game/Spells/SpellEffects.cpp
src/server/scripts/Kalimdor/zone_darkshore.cpp
src/server/scripts/Kalimdor/zone_feralas.cpp
src/server/scripts/Spells/spell_dk.cpp
src/server/scripts/Spells/spell_generic.cpp
Diffstat (limited to 'src/server/game')
| -rw-r--r-- | src/server/game/Battlegrounds/Battleground.cpp | 19 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 17 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/ServerPktHeader.h | 4 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSocket.cpp | 38 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSocket.h | 12 | ||||
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 7 |
6 files changed, 60 insertions, 37 deletions
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index f03f1474517..584117e7666 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -710,10 +710,21 @@ void Battleground::RewardHonorToTeam(uint32 Honor, uint32 TeamID) void Battleground::RewardReputationToTeam(uint32 faction_id, uint32 Reputation, uint32 TeamID) { - if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction_id)) - for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) - if (Player* player = _GetPlayerForTeam(TeamID, itr, "RewardReputationToTeam")) - player->GetReputationMgr().ModifyReputation(factionEntry, Reputation); + FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction_id); + if (!factionEntry) + return; + + for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) + { + Player* player = _GetPlayerForTeam(TeamID, itr, "RewardReputationToTeam"); + if (!player) + continue; + + uint32 repGain = Reputation; + AddPct(repGain, player->GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN)); + AddPct(repGain, player->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_FACTION_REPUTATION_GAIN, faction_id)); + player->GetReputationMgr().ModifyReputation(factionEntry, repGain); + } } void Battleground::UpdateWorldState(uint32 Field, uint32 Value) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 8a32f629513..2a3b903513e 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -2852,27 +2852,26 @@ bool Unit::IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled, bool skipAu // We don't do loop here to explicitly show that melee spell is excluded. // Maybe later some special spells will be excluded too. - // if skipInstant then instant spells shouldn't count as being cast - if (skipInstant && m_currentSpells[CURRENT_GENERIC_SPELL] && !m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime()) - return false; - // generic spells are cast when they are not finished and not delayed if (m_currentSpells[CURRENT_GENERIC_SPELL] && (m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_FINISHED) && (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED)) { - if (!isAutoshoot || !(m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS)) - return true; + if (!skipInstant || m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime()) + { + if (!isAutoshoot || !(m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS)) + return true; + } } // channeled spells may be delayed, but they are still considered cast - else if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] && + if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] && (m_currentSpells[CURRENT_CHANNELED_SPELL]->getState() != SPELL_STATE_FINISHED)) { if (!isAutoshoot || !(m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS)) return true; } // autorepeat spells may be finished or delayed, but they are still considered cast - else if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL]) + if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL]) return true; return false; @@ -3286,7 +3285,7 @@ void Unit::_RemoveNoStackAurasDueToAura(Aura* aura) Spell::SendCastResult(caster->ToPlayer(), aura->GetSpellInfo(), 1, SPELL_FAILED_AURA_BOUNCED); } - RemoveAura(aura); + aura->Remove(); return; } diff --git a/src/server/game/Server/Protocol/ServerPktHeader.h b/src/server/game/Server/Protocol/ServerPktHeader.h index 4b0dae9f0f3..fcb24cfa80d 100644 --- a/src/server/game/Server/Protocol/ServerPktHeader.h +++ b/src/server/game/Server/Protocol/ServerPktHeader.h @@ -21,6 +21,8 @@ #include "Log.h" +#pragma pack(push, 1) + struct ServerPktHeader { /** @@ -56,4 +58,6 @@ struct ServerPktHeader uint8 header[5]; }; +#pragma pack(pop) + #endif diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 1d2885c73f4..9790eae69ec 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -212,28 +212,40 @@ void WorldSocket::AsyncWrite(WorldPacket const& packet) TC_LOG_TRACE("network.opcode", "S->C: %s %s", (_worldSession ? _worldSession->GetPlayerInfo() : GetRemoteIpAddress()).c_str(), GetOpcodeNameForLogging(pkt->GetOpcode()).c_str()); ServerPktHeader header(pkt->size() + 2, pkt->GetOpcode()); - _authCrypt.EncryptSend((uint8*)header.header, header.getHeaderLength()); - auto data = new char[header.getHeaderLength() + pkt->size()]; - std::memcpy(data, (char*)header.header, header.getHeaderLength()); + std::vector<uint8> data(header.getHeaderLength() + pkt->size()); + std::memcpy(data.data(), header.header, header.getHeaderLength()); if (!pkt->empty()) - std::memcpy(data + header.getHeaderLength(), (char const*)pkt->contents(), pkt->size()); + std::memcpy(&data[header.getHeaderLength()], pkt->contents(), pkt->size()); - // Use a shared_ptr here to prevent leaking memory after the async operation has completed - std::shared_ptr<char> buffer(data, [=](char* _b) - { - delete[] _b; // Ensure that the data is deleted as an array - }); + std::lock_guard<std::mutex> guard(_writeLock); - auto self(shared_from_this()); + bool needsWriteStart = _writeQueue.empty(); + _authCrypt.EncryptSend(data.data(), header.getHeaderLength()); + + _writeQueue.push(std::move(data)); - boost::asio::async_write(_socket, boost::asio::buffer(buffer.get(), header.getHeaderLength() + pkt->size()), [this, self, buffer](boost::system::error_code error, std::size_t /*length*/) + if (needsWriteStart) + AsyncWrite(_writeQueue.front()); +} + +void WorldSocket::AsyncWrite(std::vector<uint8> const& data) +{ + auto self(shared_from_this()); + boost::asio::async_write(_socket, boost::asio::buffer(data), [this, self](boost::system::error_code error, std::size_t /*length*/) { - if (error) + if (!error) { - _socket.close(); + std::lock_guard<std::mutex> deleteGuard(_writeLock); + + _writeQueue.pop(); + + if (!_writeQueue.empty()) + AsyncWrite(_writeQueue.front()); } + else + _socket.close(); }); } diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index ce7a3eae48f..c0986f88779 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -19,15 +19,16 @@ #ifndef __WORLDSOCKET_H__ #define __WORLDSOCKET_H__ -#include <memory> -#include <chrono> -#include <boost/asio/ip/tcp.hpp> -#include <boost/asio/streambuf.hpp> #include "Common.h" #include "WorldPacketCrypt.h" #include "Util.h" #include "WorldPacket.h" #include "WorldSession.h" +#include <memory> +#include <chrono> +#include <mutex> +#include <boost/asio/ip/tcp.hpp> +#include <boost/asio/streambuf.hpp> using boost::asio::ip::tcp; @@ -68,10 +69,13 @@ private: void AsyncReadHeader(); void AsyncReadData(size_t dataSize); + void AsyncWrite(std::vector<uint8> const& data); tcp::socket _socket; char _readBuffer[4096]; + std::mutex _writeLock; + std::queue<std::vector<uint8> > _writeQueue; uint32 _authSeed; WorldPacketCrypt _authCrypt; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index b7ea713bcae..da12ed3da77 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5465,13 +5465,6 @@ void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const target->DealDamage(target, damage, NULL, NODAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); break; } - // Death and Decay - if (GetSpellInfo()->SpellFamilyFlags[0] & 0x20) - { - if (caster) - target->CastCustomSpell(target, 52212, &m_amount, NULL, NULL, true, 0, this, caster->GetGUID()); - break; - } // Blood of the North // Reaping // Death Rune Mastery |
