aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
authorDDuarte <dnpd.dd@gmail.com>2014-07-24 17:10:21 +0100
committerDDuarte <dnpd.dd@gmail.com>2014-07-24 17:10:21 +0100
commitcdb33ab174a43fb3cc19dcd672bbfd3191fd84aa (patch)
tree7e191c76630db4190c89434fcd13db77478428db /src/server/game
parent1ab65432a62176e57e19eb08e260382354caffdf (diff)
parent3de1714350f1f83ff880ee927523aabfb5731475 (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.cpp19
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp17
-rw-r--r--src/server/game/Server/Protocol/ServerPktHeader.h4
-rw-r--r--src/server/game/Server/WorldSocket.cpp38
-rw-r--r--src/server/game/Server/WorldSocket.h12
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp7
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