aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/ChannelMgr.cpp25
-rw-r--r--src/game/ChannelMgr.h2
-rw-r--r--src/game/Creature.cpp27
-rw-r--r--src/game/Creature.h2
-rw-r--r--src/game/DBCEnums.h3
-rw-r--r--src/game/ItemHandler.cpp2
-rw-r--r--src/game/Level3.cpp16
-rw-r--r--src/game/Map.cpp30
-rw-r--r--src/game/MiscHandler.cpp16
-rw-r--r--src/game/Object.cpp13
-rw-r--r--src/game/ObjectMgr.cpp10
-rw-r--r--src/game/Pet.cpp4
-rw-r--r--src/game/Pet.h2
-rw-r--r--src/game/Player.cpp110
-rw-r--r--src/game/Player.h7
-rw-r--r--src/game/QuestHandler.cpp53
-rw-r--r--src/game/SharedDefines.h54
-rw-r--r--src/game/Spell.cpp2
-rw-r--r--src/game/SpellAuras.cpp14
-rw-r--r--src/game/SpellEffects.cpp8
-rw-r--r--src/game/TaxiHandler.cpp11
-rw-r--r--src/game/Unit.cpp89
-rw-r--r--src/game/Unit.h35
-rw-r--r--src/game/World.h1
-rw-r--r--src/shared/LockedQueue.h40
-rw-r--r--src/trinitycore/Main.cpp2
26 files changed, 397 insertions, 181 deletions
diff --git a/src/game/ChannelMgr.cpp b/src/game/ChannelMgr.cpp
index 09483c7fbe0..16a236a1f95 100644
--- a/src/game/ChannelMgr.cpp
+++ b/src/game/ChannelMgr.cpp
@@ -46,18 +46,27 @@ ChannelMgr::~ChannelMgr()
Channel *ChannelMgr::GetJoinChannel(std::string name, uint32 channel_id)
{
- if (channels.find(name) == channels.end())
+ std::wstring wname;
+ Utf8toWStr(name,wname);
+ wstrToLower(wname);
+
+ if (channels.find(wname) == channels.end())
{
Channel *nchan = new Channel(name,channel_id, team);
- channels[name] = nchan;
+ channels[wname] = nchan;
+ return nchan;
}
- return channels[name];
+ return channels[wname];
}
Channel *ChannelMgr::GetChannel(std::string name, Player *p, bool pkt)
{
- ChannelMap::const_iterator i = channels.find(name);
+ std::wstring wname;
+ Utf8toWStr(name,wname);
+ wstrToLower(wname);
+
+ ChannelMap::const_iterator i = channels.find(wname);
if(i == channels.end())
{
@@ -76,7 +85,11 @@ Channel *ChannelMgr::GetChannel(std::string name, Player *p, bool pkt)
void ChannelMgr::LeftChannel(std::string name)
{
- ChannelMap::const_iterator i = channels.find(name);
+ std::wstring wname;
+ Utf8toWStr(name,wname);
+ wstrToLower(wname);
+
+ ChannelMap::const_iterator i = channels.find(wname);
if(i == channels.end())
return;
@@ -85,7 +98,7 @@ void ChannelMgr::LeftChannel(std::string name)
if(channel->GetNumPlayers() == 0 && !channel->IsConstant())
{
- channels.erase(name);
+ channels.erase(wname);
delete channel;
}
}
diff --git a/src/game/ChannelMgr.h b/src/game/ChannelMgr.h
index f65a8520648..a6d7c5fed69 100644
--- a/src/game/ChannelMgr.h
+++ b/src/game/ChannelMgr.h
@@ -36,7 +36,7 @@ class ChannelMgr
{
public:
uint32 team;
- typedef std::map<std::string,Channel *> ChannelMap;
+ typedef std::map<std::wstring,Channel*> ChannelMap;
ChannelMgr() {team = 0;}
~ChannelMgr();
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp
index 9dcfce82601..32a47334a9d 100644
--- a/src/game/Creature.cpp
+++ b/src/game/Creature.cpp
@@ -389,14 +389,13 @@ bool Creature::UpdateEntry(uint32 Entry, uint32 team, const CreatureData *data )
SetCanModifyStats(true);
UpdateAllStats();
- FactionTemplateEntry const* factionTemplate = sFactionTemplateStore.LookupEntry(GetCreatureInfo()->faction_A);
- if (factionTemplate) // check and error show at loading templates
+ // checked and error show at loading templates
+ if (FactionTemplateEntry const* factionTemplate = sFactionTemplateStore.LookupEntry(GetCreatureInfo()->faction_A))
{
- FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplate->faction);
- if (factionEntry)
- if( !(GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_CIVILIAN) &&
- (factionEntry->team == ALLIANCE || factionEntry->team == HORDE) )
- SetPvP(true);
+ if (factionTemplate->factionFlags & FACTION_TEMPLATE_FLAG_PVP)
+ SetPvP(true);
+ else
+ SetPvP(false);
}
// HACK: trigger creature is always not selectable
@@ -2094,6 +2093,18 @@ Unit* Creature::SelectNearestTarget(float dist) const
return target;
}
+void Creature::SendAIReaction(AiReaction reactionType)
+{
+ WorldPacket data(SMSG_AI_REACTION, 12);
+
+ data << uint64(GetGUID());
+ data << uint32(reactionType);
+
+ ((WorldObject*)this)->SendMessageToSet(&data, true);
+
+ sLog.outDebug("WORLD: Sent SMSG_AI_REACTION, type %u.", reactionType);
+}
+
void Creature::CallAssistance()
{
if( !m_AlreadyCallAssistance && getVictim() && !isPet() && !isCharmed())
@@ -2306,7 +2317,7 @@ bool Creature::LoadCreaturesAddon(bool reload)
// 3 ShapeshiftForm Must be determined/set by shapeshift spell/aura
SetByteValue(UNIT_FIELD_BYTES_2, 0, uint8(cainfo->bytes2 & 0xFF));
- SetByteValue(UNIT_FIELD_BYTES_2, 1, uint8((cainfo->bytes2 >> 8) & 0xFF));
+ //SetByteValue(UNIT_FIELD_BYTES_2, 1, uint8((cainfo->bytes2 >> 8) & 0xFF));
//SetByteValue(UNIT_FIELD_BYTES_2, 2, uint8((cainfo->bytes2 >> 16) & 0xFF));
SetByteValue(UNIT_FIELD_BYTES_2, 2, 0);
//SetByteValue(UNIT_FIELD_BYTES_2, 3, uint8((cainfo->bytes2 >> 24) & 0xFF));
diff --git a/src/game/Creature.h b/src/game/Creature.h
index d1c08bb13e2..3a8338c1c67 100644
--- a/src/game/Creature.h
+++ b/src/game/Creature.h
@@ -640,6 +640,8 @@ class TRINITY_DLL_SPEC Creature : public Unit
bool canStartAttack(Unit const* u, bool force) const;
float GetAttackDistance(Unit const* pl) const;
+ void SendAIReaction(AiReaction reactionType);
+
Unit* SelectNearestTarget(float dist = 0) const;
void DoFleeToGetAssistance();
void CallForHelp(float fRadius);
diff --git a/src/game/DBCEnums.h b/src/game/DBCEnums.h
index 97cc6f4798c..090369d091e 100644
--- a/src/game/DBCEnums.h
+++ b/src/game/DBCEnums.h
@@ -270,7 +270,8 @@ enum SpawnMask
enum FactionTemplateFlags
{
- FACTION_TEMPLATE_FLAG_CONTESTED_GUARD = 0x00001000, // faction will attack players that were involved in PvP combats
+ FACTION_TEMPLATE_FLAG_PVP = 0x00000800, // flagged for PvP
+ FACTION_TEMPLATE_FLAG_CONTESTED_GUARD = 0x00001000, // faction will attack players that were involved in PvP combats
};
enum FactionMasks
diff --git a/src/game/ItemHandler.cpp b/src/game/ItemHandler.cpp
index b31edcf2b42..35fdadfb029 100644
--- a/src/game/ItemHandler.cpp
+++ b/src/game/ItemHandler.cpp
@@ -428,7 +428,7 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data )
data << pProto->GemProperties;
data << pProto->RequiredDisenchantSkill;
data << pProto->ArmorDamageModifier;
- data << pProto->Duration; // added in 2.4.2.8209, duration (seconds)
+ data << abs(pProto->Duration); // added in 2.4.2.8209, duration (seconds)
data << pProto->ItemLimitCategory; // WotLK, ItemLimitCategory
data << pProto->HolidayId; // Holiday.dbc?
SendPacket( &data );
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp
index 0fec45ec35a..dada1862338 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -6623,13 +6623,7 @@ bool ChatHandler::HandleCastBackCommand(const char *args)
bool triggered = (trig_str != NULL);
- // update orientation at server
- caster->SetOrientation(caster->GetAngle(m_session->GetPlayer()));
-
- // and client
- WorldPacket data;
- caster->BuildHeartBeatMsg(&data);
- caster->SendMessageToSet(&data,true);
+ caster->SetFacingToObject(m_session->GetPlayer());
caster->CastSpell(m_session->GetPlayer(),spell,triggered);
@@ -6714,13 +6708,7 @@ bool ChatHandler::HandleCastTargetCommand(const char *args)
bool triggered = (trig_str != NULL);
- // update orientation at server
- caster->SetOrientation(caster->GetAngle(m_session->GetPlayer()));
-
- // and client
- WorldPacket data;
- caster->BuildHeartBeatMsg(&data);
- caster->SendMessageToSet(&data,true);
+ caster->SetFacingToObject(m_session->GetPlayer());
caster->CastSpell(caster->getVictim(),spell,triggered);
diff --git a/src/game/Map.cpp b/src/game/Map.cpp
index 0ddbf359f40..c0556ecc5ee 100644
--- a/src/game/Map.cpp
+++ b/src/game/Map.cpp
@@ -3423,6 +3423,36 @@ void Map::ScriptsProcess()
break;
}
+ case SCRIPT_COMMAND_KILL_CREDIT:
+ {
+ // accept player in any one from target/source arg
+ if (!target && !source)
+ {
+ sLog.outError("SCRIPT_COMMAND_KILL_CREDIT call for NULL object.");
+ break;
+ }
+
+ // must be only Player
+ if((!target || target->GetTypeId() != TYPEID_PLAYER) && (!source || source->GetTypeId() != TYPEID_PLAYER))
+ {
+ sLog.outError("SCRIPT_COMMAND_KILL_CREDIT call for non-player (TypeIdSource: %u)(TypeIdTarget: %u), skipping.", source ? source->GetTypeId() : 0, target ? target->GetTypeId() : 0);
+ break;
+ }
+
+ Player* pSource = target && target->GetTypeId() == TYPEID_PLAYER ? (Player*)target : (Player*)source;
+
+ if (step.script->datalong2)
+ {
+ pSource->RewardPlayerAndGroupAtEvent(step.script->datalong, pSource);
+ }
+ else
+ {
+ pSource->KilledMonsterCredit(step.script->datalong, 0);
+ }
+
+ break;
+ }
+
case SCRIPT_COMMAND_TEMP_SUMMON_CREATURE:
{
if(!step.script->datalong) // creature not specified
diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp
index 85e1a497a25..1e1c44e3d97 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -1227,14 +1227,6 @@ void WorldSession::HandleWorldTeleportOpcode(WorldPacket& recv_data)
// Received opcode CMSG_WORLD_TELEPORT
// Time is ***, map=469, x=452.000000, y=6454.000000, z=2536.000000, orient=3.141593
- //sLog.outDebug("Received opcode CMSG_WORLD_TELEPORT");
-
- if(GetPlayer()->isInFlight())
- {
- sLog.outDebug("Player '%s' (GUID: %u) in flight, ignore worldport command.",GetPlayer()->GetName(),GetPlayer()->GetGUIDLow());
- return;
- }
-
uint32 time;
uint32 mapid;
float PositionX;
@@ -1248,6 +1240,14 @@ void WorldSession::HandleWorldTeleportOpcode(WorldPacket& recv_data)
recv_data >> PositionY;
recv_data >> PositionZ;
recv_data >> Orientation; // o (3.141593 = 180 degrees)
+
+ //sLog.outDebug("Received opcode CMSG_WORLD_TELEPORT");
+ if(GetPlayer()->isInFlight())
+ {
+ sLog.outDebug("Player '%s' (GUID: %u) in flight, ignore worldport command.",GetPlayer()->GetName(),GetPlayer()->GetGUIDLow());
+ return;
+ }
+
DEBUG_LOG("Time %u sec, map=%u, x=%f, y=%f, z=%f, orient=%f", time/1000, mapid, PositionX, PositionY, PositionZ, Orientation);
if (GetSecurity() >= SEC_ADMINISTRATOR)
diff --git a/src/game/Object.cpp b/src/game/Object.cpp
index 0c8c215d09a..3b976eb1d22 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -533,8 +533,17 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
// remove custom flag before sending
uint32 appendValue = m_uint32Values[ index ] & ~(UNIT_NPC_FLAG_GUARD + UNIT_NPC_FLAG_OUTDOORPVP);
- if (GetTypeId() == TYPEID_UNIT && !target->canSeeSpellClickOn((Creature*)this))
- appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK;
+ if (GetTypeId() == TYPEID_UNIT)
+ {
+ if (!target->canSeeSpellClickOn((Creature*)this))
+ appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK;
+
+ if (appendValue & UNIT_NPC_FLAG_TRAINER)
+ {
+ if (!((Creature*)this)->isCanTrainingOf(target, false))
+ appendValue &= ~(UNIT_NPC_FLAG_TRAINER | UNIT_NPC_FLAG_TRAINER_CLASS | UNIT_NPC_FLAG_TRAINER_PROFESSION);
+ }
+ }
*data << uint32(appendValue);
}
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index aeb0fade34f..cc911b63b0c 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -4386,6 +4386,16 @@ void ObjectMgr::LoadScripts(ScriptMapMap& scripts, char const* tablename)
break;
}
+ case SCRIPT_COMMAND_KILL_CREDIT:
+ {
+ if (!GetCreatureTemplate(tmp.datalong))
+ {
+ sLog.outErrorDb("Table `%s` has invalid creature (Entry: %u) in SCRIPT_COMMAND_KILL_CREDIT for script id %u",tablename,tmp.datalong,tmp.id);
+ continue;
+ }
+ break;
+ }
+
case SCRIPT_COMMAND_TEMP_SUMMON_CREATURE:
{
if(!Trinity::IsValidMapCoord(tmp.x,tmp.y,tmp.z,tmp.o))
diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp
index 373f611094b..58a561c3a6f 100644
--- a/src/game/Pet.cpp
+++ b/src/game/Pet.cpp
@@ -514,8 +514,8 @@ void Pet::Update(uint32 diff)
{
// unsummon pet that lost owner
Player* owner = GetOwner();
- if(!owner || (!IsWithinDistInMap(owner, OWNER_MAX_DISTANCE) && !isPossessed()) || isControlled() && !owner->GetPetGUID())
- //if(!owner || (!IsWithinDistInMap(owner, OWNER_MAX_DISTANCE) && (owner->GetCharmGUID() && (owner->GetCharmGUID() != GetGUID()))) || (isControlled() && !owner->GetPetGUID()))
+ if(!owner || (!IsWithinDistInMap(owner, GetMap()->GetVisibilityDistance()) && !isPossessed()) || isControlled() && !owner->GetPetGUID())
+ //if(!owner || (!IsWithinDistInMap(owner, GetMap()->GetVisibilityDistance()) && (owner->GetCharmGUID() && (owner->GetCharmGUID() != GetGUID()))) || (isControlled() && !owner->GetPetGUID()))
{
Remove(PET_SAVE_NOT_IN_SLOT, true);
return;
diff --git a/src/game/Pet.h b/src/game/Pet.h
index 0028b5038f9..17df70b0a65 100644
--- a/src/game/Pet.h
+++ b/src/game/Pet.h
@@ -116,8 +116,6 @@ typedef std::vector<uint32> AutoSpellList;
#define ACTIVE_SPELLS_MAX 4
-#define OWNER_MAX_DISTANCE 100.0f
-
#define PET_FOLLOW_DIST 1
#define PET_FOLLOW_ANGLE (M_PI/2)
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 51fbc3413c0..a9b0b95307c 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -1394,8 +1394,8 @@ void Player::Update( uint32 p_time )
SendUpdateToOutOfRangeGroupMembers();
Pet* pet = GetPet();
- if (pet && !IsWithinDistInMap(pet, OWNER_MAX_DISTANCE) && !pet->isPossessed())
- //if(pet && !IsWithinDistInMap(pet, OWNER_MAX_DISTANCE) && (GetCharmGUID() && (pet->GetGUID() != GetCharmGUID())))
+ if (pet && !pet->IsWithinDistInMap(this, GetMap()->GetVisibilityDistance()) && !pet->isPossessed())
+ //if(pet && !pet->IsWithinDistInMap(this, GetMap()->GetVisibilityDistance()) && (GetCharmGUID() && (pet->GetGUID() != GetCharmGUID())))
RemovePet(pet, PET_SAVE_NOT_IN_SLOT, true);
//we should execute delayed teleports only for alive(!) players
@@ -1748,7 +1748,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
if (!(options & TELE_TO_NOT_UNSUMMON_PET))
{
//same map, only remove pet if out of range for new position
- if(pet && !pet->IsWithinDist3d(x,y,z, OWNER_MAX_DISTANCE))
+ if(pet && !pet->IsWithinDist3d(x,y,z, GetMap()->GetVisibilityDistance()))
UnsummonPetTemporaryIfAny();
}
@@ -5124,56 +5124,6 @@ float Player::GetRatingBonusValue(CombatRating cr) const
return float(GetUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + cr)) / GetRatingCoefficient(cr);
}
-uint32 Player::GetMeleeCritDamageReduction(uint32 damage) const
-{
- float melee = GetRatingBonusValue(CR_CRIT_TAKEN_MELEE)*2.2f;
- if (melee>33.0f) melee = 33.0f;
- return uint32 (melee * damage /100.0f);
-}
-
-uint32 Player::GetMeleeDamageReduction(uint32 damage) const
-{
- float rate = GetRatingBonusValue(CR_CRIT_TAKEN_MELEE);
- // Resilience not limited (limit it by 100%)
- if (rate > 100.0f)
- rate = 100.0f;
- return uint32 (rate * damage / 100.0f);
-}
-
-uint32 Player::GetRangedCritDamageReduction(uint32 damage) const
-{
- float ranged = GetRatingBonusValue(CR_CRIT_TAKEN_RANGED)*2.2f;
- if (ranged>33.0f) ranged=33.0f;
- return uint32 (ranged * damage /100.0f);
-}
-
-uint32 Player::GetRangedDamageReduction(uint32 damage) const
-{
- float rate = GetRatingBonusValue(CR_CRIT_TAKEN_RANGED);
- // Resilience not limited (limit it by 100%)
- if (rate > 100.0f)
- rate = 100.0f;
- return uint32 (rate * damage / 100.0f);
-}
-
-uint32 Player::GetSpellCritDamageReduction(uint32 damage) const
-{
- float spell = GetRatingBonusValue(CR_CRIT_TAKEN_SPELL)*2.2f;
- // In wow script resilience limited to 33%
- if (spell>33.0f)
- spell = 33.0f;
- return uint32 (spell * damage / 100.0f);
-}
-
-uint32 Player::GetSpellDamageReduction(uint32 damage) const
-{
- float rate = GetRatingBonusValue(CR_CRIT_TAKEN_SPELL);
- // Resilience not limited (limit it by 100%)
- if (rate > 100.0f)
- rate = 100.0f;
- return uint32 (rate * damage / 100.0f);
-}
-
float Player::GetExpertiseDodgeOrParryReduction(WeaponAttackType attType) const
{
switch (attType)
@@ -14507,6 +14457,33 @@ void Player::SendCanTakeQuestResponse( uint32 msg )
sLog.outDebug("WORLD: Sent SMSG_QUESTGIVER_QUEST_INVALID");
}
+void Player::SendQuestConfirmAccept(const Quest* pQuest, Player* pReceiver)
+{
+ if (pReceiver)
+ {
+ std::string strTitle = pQuest->GetTitle();
+
+ int loc_idx = pReceiver->GetSession()->GetSessionDbLocaleIndex();
+
+ if (loc_idx >= 0)
+ {
+ if (const QuestLocale* pLocale = objmgr.GetQuestLocale(pQuest->GetQuestId()))
+ {
+ if (pLocale->Title.size() > loc_idx && !pLocale->Title[loc_idx].empty())
+ strTitle = pLocale->Title[loc_idx];
+ }
+ }
+
+ WorldPacket data(SMSG_QUEST_CONFIRM_ACCEPT, (4 + strTitle.size() + 8));
+ data << uint32(pQuest->GetQuestId());
+ data << strTitle;
+ data << uint64(GetGUID());
+ pReceiver->GetSession()->SendPacket(&data);
+
+ sLog.outDebug("WORLD: Sent SMSG_QUEST_CONFIRM_ACCEPT");
+ }
+}
+
void Player::SendPushToPartyResponse( Player *pPlayer, uint32 msg )
{
if( pPlayer )
@@ -17398,9 +17375,13 @@ void Player::Whisper(const std::string& text, uint32 language,uint64 receiver)
BuildPlayerChat(&data, CHAT_MSG_WHISPER, text, language);
rPlayer->GetSession()->SendPacket(&data);
- data.Initialize(SMSG_MESSAGECHAT, 200);
- rPlayer->BuildPlayerChat(&data, CHAT_MSG_REPLY, text, language);
- GetSession()->SendPacket(&data);
+ // not send confirmation for addon messages
+ if (language != LANG_ADDON)
+ {
+ data.Initialize(SMSG_MESSAGECHAT, 200);
+ rPlayer->BuildPlayerChat(&data, CHAT_MSG_REPLY, text, language);
+ GetSession()->SendPacket(&data);
+ }
}
else
{
@@ -19321,12 +19302,27 @@ inline void UpdateVisibilityOf_helper(std::set<uint64>& s64, Player* target, std
v.insert(target);
}
+template<class T>
+inline void BeforeVisibilityDestroy(T* /*t*/, Player* /*p*/)
+{
+}
+
+template<>
+inline void BeforeVisibilityDestroy<Creature>(Creature* t, Player* p)
+{
+ if (p->GetPetGUID()==t->GetGUID() && ((Creature*)t)->isPet())
+ ((Pet*)t)->Remove(PET_SAVE_NOT_IN_SLOT, true);
+}
+
void Player::UpdateVisibilityOf(WorldObject* target)
{
if(HaveAtClient(target))
{
if(!target->isVisibleForInState(this, true))
{
+ if (target->GetTypeId()==TYPEID_UNIT)
+ BeforeVisibilityDestroy<Creature>((Creature*)target,this);
+
target->DestroyForPlayer(this);
m_clientGUIDs.erase(target->GetGUID());
@@ -19378,6 +19374,8 @@ void Player::UpdateVisibilityOf(T* target, UpdateData& data, std::set<Unit*>& vi
{
if(!target->isVisibleForInState(this,true))
{
+ BeforeVisibilityDestroy<T>(target,this);
+
target->BuildOutOfRangeUpdateBlock(&data);
m_clientGUIDs.erase(target->GetGUID());
diff --git a/src/game/Player.h b/src/game/Player.h
index f216f4e548b..54cea12b52b 100644
--- a/src/game/Player.h
+++ b/src/game/Player.h
@@ -1338,6 +1338,7 @@ class MANGOS_DLL_SPEC Player : public Unit
void SendQuestFailed( uint32 quest_id );
void SendQuestTimerFailed( uint32 quest_id );
void SendCanTakeQuestResponse( uint32 msg );
+ void SendQuestConfirmAccept(Quest const* pQuest, Player* pReceiver);
void SendPushToPartyResponse( Player *pPlayer, uint32 msg );
void SendQuestUpdateAddItem( Quest const* pQuest, uint32 item_idx, uint32 count );
void SendQuestUpdateAddCreatureOrGo( Quest const* pQuest, uint64 guid, uint32 creatureOrGO_idx, uint32 old_count, uint32 add_count );
@@ -1721,12 +1722,6 @@ class MANGOS_DLL_SPEC Player : public Unit
float OCTRegenMPPerSpirit();
float GetRatingCoefficient(CombatRating cr) const;
float GetRatingBonusValue(CombatRating cr) const;
- uint32 GetMeleeCritDamageReduction(uint32 damage) const;
- uint32 GetMeleeDamageReduction(uint32 damage) const;
- uint32 GetRangedCritDamageReduction(uint32 damage) const;
- uint32 GetRangedDamageReduction(uint32 damage) const;
- uint32 GetSpellCritDamageReduction(uint32 damage) const;
- uint32 GetSpellDamageReduction(uint32 damage) const;
uint32 GetBaseSpellPowerBonus() { return m_baseSpellPower; }
float GetExpertiseDodgeOrParryReduction(WeaponAttackType attType) const;
diff --git a/src/game/QuestHandler.cpp b/src/game/QuestHandler.cpp
index cc8d3e4a87c..48ec382b6e8 100644
--- a/src/game/QuestHandler.cpp
+++ b/src/game/QuestHandler.cpp
@@ -158,6 +158,30 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode( WorldPacket & recv_data )
{
_player->AddQuest( qInfo, pObject );
+ if (qInfo->HasFlag(QUEST_FLAGS_PARTY_ACCEPT))
+ {
+ if (Group* pGroup = _player->GetGroup())
+ {
+ for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
+ {
+ Player* pPlayer = itr->getSource();
+
+ if (!pPlayer || pPlayer == _player) // not self
+ continue;
+
+ if (pPlayer->CanTakeQuest(qInfo, true))
+ {
+ pPlayer->SetDivider(_player->GetGUID());
+
+ //need confirmation that any gossip window will close
+ pPlayer->PlayerTalkClass->CloseGossip();
+
+ _player->SendQuestConfirmAccept(qInfo, pPlayer);
+ }
+ }
+ }
+ }
+
if ( _player->CanCompleteQuest( quest ) )
_player->CompleteQuest( quest );
@@ -375,7 +399,34 @@ void WorldSession::HandleQuestConfirmAccept(WorldPacket& recv_data)
uint32 quest;
recv_data >> quest;
- sLog.outDebug( "WORLD: Received CMSG_QUEST_CONFIRM_ACCEPT quest = %u",quest );
+ sLog.outDebug("WORLD: Received CMSG_QUEST_CONFIRM_ACCEPT quest = %u", quest);
+
+ if (const Quest* pQuest = objmgr.GetQuestTemplate(quest))
+ {
+ if (!pQuest->HasFlag(QUEST_FLAGS_PARTY_ACCEPT))
+ return;
+
+ Player* pOriginalPlayer = ObjectAccessor::FindPlayer(_player->GetDivider());
+
+ if (!pOriginalPlayer)
+ return;
+
+ if (pQuest->GetType() == QUEST_TYPE_RAID)
+ {
+ if (!_player->IsInSameRaidWith(pOriginalPlayer))
+ return;
+ }
+ else
+ {
+ if (!_player->IsInSameGroupWith(pOriginalPlayer))
+ return;
+ }
+
+ if (_player->CanAddQuest(pQuest, true))
+ _player->AddQuest(pQuest, NULL); // NULL, this prevent DB script from duplicate running
+
+ _player->SetDivider(0);
+ }
}
void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recv_data)
diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h
index 476fed4c345..6d1b51b5545 100644
--- a/src/game/SharedDefines.h
+++ b/src/game/SharedDefines.h
@@ -1932,26 +1932,30 @@ enum CreatureFamily
enum CreatureTypeFlags
{
- CREATURE_TYPEFLAGS_TAMEABLE = 0x00001, //tameable by any hunter
- CREATURE_TYPEFLAGS_UNK2 = 0x00002, //? Related to spirits/ghosts in any form? Allow gossip interaction if player is also ghost? Visibility?
- CREATURE_TYPEFLAGS_UNK3 = 0x00004,
- CREATURE_TYPEFLAGS_UNK4 = 0x00008,
- CREATURE_TYPEFLAGS_UNK5 = 0x00010,
- CREATURE_TYPEFLAGS_UNK6 = 0x00020,
- CREATURE_TYPEFLAGS_UNK7 = 0x00040,
- CREATURE_TYPEFLAGS_UNK8 = 0x00080,
- CREATURE_TYPEFLAGS_HERBLOOT = 0x00100, //can be looted by herbalist
- CREATURE_TYPEFLAGS_MININGLOOT = 0x00200, //can be looted by miner
- CREATURE_TYPEFLAGS_UNK11 = 0x00400,
- CREATURE_TYPEFLAGS_UNK12 = 0x00800, //? Related to mounts in some way. If mounted, fight mounted, mount appear as independant when rider dies?
- CREATURE_TYPEFLAGS_UNK13 = 0x01000, //? Can aid any player in combat if in range?
- CREATURE_TYPEFLAGS_UNK14 = 0x02000,
- CREATURE_TYPEFLAGS_UNK15 = 0x04000, //? Possibly not in use
- CREATURE_TYPEFLAGS_ENGINEERLOOT = 0x08000, //can be looted by engineer
- CREATURE_TYPEFLAGS_EXOTIC = 0x10000, //can be tamed by hunter as exotic pet
- CREATURE_TYPEFLAGS_UNK18 = 0x20000, //? Related to vehicles/pvp?
- CREATURE_TYPEFLAGS_UNK19 = 0x40000, //? Related to vehicles/siege weapons?
- CREATURE_TYPEFLAGS_UNK20 = 0x80000
+ CREATURE_TYPEFLAGS_TAMEABLE = 0x000001, // Tameable by any hunter
+ CREATURE_TYPEFLAGS_GHOST = 0x000002, // Creature are also visible for not alive player. Allow gossip interaction if npcflag allow?
+ CREATURE_TYPEFLAGS_UNK3 = 0x000004,
+ CREATURE_TYPEFLAGS_UNK4 = 0x000008,
+ CREATURE_TYPEFLAGS_UNK5 = 0x000010,
+ CREATURE_TYPEFLAGS_UNK6 = 0x000020,
+ CREATURE_TYPEFLAGS_UNK7 = 0x000040,
+ CREATURE_TYPEFLAGS_UNK8 = 0x000080,
+ CREATURE_TYPEFLAGS_HERBLOOT = 0x000100, // Can be looted by herbalist
+ CREATURE_TYPEFLAGS_MININGLOOT = 0x000200, // Can be looted by miner
+ CREATURE_TYPEFLAGS_UNK11 = 0x000400,
+ CREATURE_TYPEFLAGS_UNK12 = 0x000800, // ? Related to mounts in some way. If mounted, fight mounted, mount appear as independant when rider dies?
+ CREATURE_TYPEFLAGS_UNK13 = 0x001000, // ? Can aid any player in combat if in range?
+ CREATURE_TYPEFLAGS_UNK14 = 0x002000,
+ CREATURE_TYPEFLAGS_UNK15 = 0x004000, // ? Possibly not in use
+ CREATURE_TYPEFLAGS_ENGINEERLOOT = 0x008000, // Can be looted by engineer
+ CREATURE_TYPEFLAGS_EXOTIC = 0x010000, // Can be tamed by hunter as exotic pet
+ CREATURE_TYPEFLAGS_UNK18 = 0x020000, // ? Related to vehicles/pvp?
+ CREATURE_TYPEFLAGS_UNK19 = 0x040000, // ? Related to vehicle/siege weapons?
+ CREATURE_TYPEFLAGS_UNK20 = 0x080000,
+ CREATURE_TYPEFLAGS_UNK21 = 0x100000,
+ CREATURE_TYPEFLAGS_UNK22 = 0x200000,
+ CREATURE_TYPEFLAGS_UNK23 = 0x400000,
+ CREATURE_TYPEFLAGS_UNK24 = 0x800000 // ? First seen in 3.2.2. Related to banner/backpack of creature/companion?
};
enum CreatureEliteType
@@ -1985,8 +1989,12 @@ enum HolidayIds
HOLIDAY_DARKMOON_FAIRE_ELWYNN = 374,
HOLIDAY_DARKMOON_FAIRE_THUNDER = 375,
HOLIDAY_DARKMOON_FAIRE_SHATTRATH = 376,
+ HOLIDAY_PIRATES_DAY = 398,
HOLIDAY_CALL_TO_ARMS_SA = 400,
- HOLIDAY_WOTLK_LAUNCH = 406
+ HOLIDAY_PILGRIMS_BOUNTY = 404,
+ HOLIDAY_WOTLK_LAUNCH = 406,
+ HOLIDAY_DAY_OF_DEAD = 409,
+ HOLIDAY_CALL_TO_ARMS_ISLE_OF_C = 420
};
// values based at QuestInfo.dbc
@@ -2449,8 +2457,8 @@ enum PetDiet
enum AiReaction
{
AI_REACTION_UNK1 = 1,
- AI_REACTION_AGGRO = 2,
- AI_REACTION_UNK3 = 3,
+ AI_REACTION_AGGRO = 2, // trigger aggro sound to play, if defined in dbc
+ AI_REACTION_UNK3 = 3, // seen happen at polymorph, possible when AI not in control of self?
AI_REACTION_UNK4 = 4
};
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index c601eb1bcb9..4d610fb41ec 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -4596,7 +4596,7 @@ SpellCastResult Spell::CheckCast(bool strict)
!IsPassiveSpell(m_spellInfo->Id) && !(m_spellInfo->Attributes & SPELL_ATTR_CASTABLE_WHILE_MOUNTED))
{
if (m_caster->isInFlight())
- return SPELL_FAILED_NOT_FLYING;
+ return SPELL_FAILED_NOT_ON_TAXI;
else
return SPELL_FAILED_NOT_MOUNTED;
}
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 99b8876b6e8..0b2089da7e3 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -6056,9 +6056,9 @@ void AuraEffect::PeriodicTick()
if (crit)
pdamage = pCaster->SpellCriticalDamageBonus(m_spellProto, pdamage, m_target);
- // Reduce dot damage from resilience for players.
- if (m_target->GetTypeId() == TYPEID_PLAYER)
- pdamage-=((Player*)m_target)->GetSpellDamageReduction(pdamage);
+ // only from players
+ if (IS_PLAYER_GUID(GetCasterGUID()))
+ pdamage -= m_target->GetSpellDamageReduction(pdamage);
pCaster->CalcAbsorbResist(m_target, GetSpellSchoolMask(GetSpellProto()), DOT, pdamage, &absorb, &resist, m_spellProto);
@@ -6330,8 +6330,8 @@ void AuraEffect::PeriodicTick()
int32 drain_amount = m_target->GetPower(power) > pdamage ? pdamage : m_target->GetPower(power);
// resilience reduce mana draining effect at spell crit damage reduction (added in 2.4)
- if (power == POWER_MANA && m_target->GetTypeId() == TYPEID_PLAYER)
- drain_amount -= ((Player*)m_target)->GetSpellCritDamageReduction(drain_amount);
+ if (power == POWER_MANA)
+ drain_amount -= m_target->GetSpellCritDamageReduction(drain_amount);
m_target->ModifyPower(power, -drain_amount);
@@ -6469,8 +6469,8 @@ void AuraEffect::PeriodicTick()
return;
// resilience reduce mana draining effect at spell crit damage reduction (added in 2.4)
- if (powerType == POWER_MANA && m_target->GetTypeId() == TYPEID_PLAYER)
- pdamage -= ((Player*)m_target)->GetSpellCritDamageReduction(pdamage);
+ if (powerType == POWER_MANA)
+ pdamage -= m_target->GetSpellCritDamageReduction(pdamage);
uint32 gain = uint32(-m_target->ModifyPower(powerType, -pdamage));
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index adf82f3289f..26fd94a3ef6 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -2653,8 +2653,8 @@ void Spell::EffectPowerDrain(uint32 i)
// resilience reduce mana draining effect at spell crit damage reduction (added in 2.4)
uint32 power = damage;
- if ( drain_power == POWER_MANA && unitTarget->GetTypeId() == TYPEID_PLAYER )
- power -= ((Player*)unitTarget)->GetSpellCritDamageReduction(power);
+ if (drain_power == POWER_MANA)
+ power -= unitTarget->GetSpellCritDamageReduction(power);
int32 new_damage;
if(curPower < power)
@@ -2719,8 +2719,8 @@ void Spell::EffectPowerBurn(uint32 i)
uint32 power = damage;
// resilience reduce mana draining effect at spell crit damage reduction (added in 2.4)
- if ( powertype == POWER_MANA && unitTarget->GetTypeId() == TYPEID_PLAYER )
- power -= ((Player*)unitTarget)->GetSpellCritDamageReduction(power);
+ if (powertype == POWER_MANA)
+ power -= unitTarget->GetSpellCritDamageReduction(power);
int32 new_damage = (curPower < power) ? curPower : power;
diff --git a/src/game/TaxiHandler.cpp b/src/game/TaxiHandler.cpp
index e0a1c2512a8..ca62ac4a6e2 100644
--- a/src/game/TaxiHandler.cpp
+++ b/src/game/TaxiHandler.cpp
@@ -189,10 +189,19 @@ void WorldSession::HandleActivateTaxiExpressOpcode ( WorldPacket & recv_data )
GetPlayer()->ActivateTaxiPathTo(nodes, npc);
}
-void WorldSession::HandleMoveSplineDoneOpcode(WorldPacket& /*recv_data*/)
+void WorldSession::HandleMoveSplineDoneOpcode(WorldPacket& recv_data)
{
sLog.outDebug( "WORLD: Received CMSG_MOVE_SPLINE_DONE" );
+ uint64 guid; // used only for proper packet read
+ if(!recv_data.readPackGUID(guid))
+ return;
+
+ MovementInfo movementInfo; // used only for proper packet read
+ ReadMovementInfo(recv_data, &movementInfo);
+
+ recv_data.read_skip<uint32>(); // unk
+
// in taxi flight packet received in 2 case:
// 1) end taxi path in far (multi-node) flight
// 2) switch from one map to other in case multim-map taxi path
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 36c7cf23e22..bc36ca8aaf4 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -1205,8 +1205,10 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage *damageInfo, int32 dama
damage = int32(damage * float((100.0f + critPctDamageMod)/100.0f));
// Resilience - reduce crit damage
- if (pVictim->GetTypeId() == TYPEID_PLAYER)
- damage -= ((Player*)pVictim)->GetMeleeCritDamageReduction(damage);
+ if (attackType != RANGED_ATTACK)
+ damage -= pVictim->GetMeleeCritDamageReduction(damage);
+ else
+ damage -= pVictim->GetRangedCritDamageReduction(damage);
}
// Spell weapon based damage CAN BE crit & blocked at same time
if (blocked)
@@ -1231,8 +1233,7 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage *damageInfo, int32 dama
damageInfo->HitInfo|= SPELL_HIT_TYPE_CRIT;
damage = SpellCriticalDamageBonus(spellInfo, damage, pVictim);
// Resilience - reduce crit damage
- if (pVictim->GetTypeId() == TYPEID_PLAYER)
- damage -= ((Player*)pVictim)->GetSpellCritDamageReduction(damage);
+ damage -= pVictim->GetSpellCritDamageReduction(damage);
}
}
break;
@@ -1241,8 +1242,9 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage *damageInfo, int32 dama
if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)
damage = CalcArmorReducedDamage(pVictim, damage, spellInfo, attackType);
- if (GetTypeId() == TYPEID_PLAYER && pVictim->GetTypeId() == TYPEID_PLAYER)
- damage -= ((Player*)pVictim)->GetSpellDamageReduction(damage);
+ // only from players
+ if (GetTypeId() == TYPEID_PLAYER)
+ damage -= pVictim->GetSpellDamageReduction(damage);
// Calculate absorb resist
if (damage > 0)
@@ -1425,12 +1427,14 @@ void Unit::CalculateMeleeDamage(Unit *pVictim, uint32 damage, CalcDamageInfo *da
damageInfo->damage = int32((damageInfo->damage) * float((100.0f + mod)/100.0f));
// Resilience - reduce crit damage
- if (pVictim->GetTypeId() == TYPEID_PLAYER)
- {
- uint32 resilienceReduction = ((Player*)pVictim)->GetMeleeCritDamageReduction(damageInfo->damage);
- damageInfo->damage -= resilienceReduction;
- damageInfo->cleanDamage += resilienceReduction;
- }
+ uint32 resilienceReduction;
+ if (attackType != RANGED_ATTACK)
+ resilienceReduction = pVictim->GetMeleeCritDamageReduction(damageInfo->damage);
+ else
+ resilienceReduction = pVictim->GetRangedCritDamageReduction(damageInfo->damage);
+
+ damageInfo->damage -= resilienceReduction;
+ damageInfo->cleanDamage += resilienceReduction;
break;
}
case MELEE_HIT_PARRY:
@@ -1491,12 +1495,13 @@ void Unit::CalculateMeleeDamage(Unit *pVictim, uint32 damage, CalcDamageInfo *da
break;
}
- if (GetTypeId() == TYPEID_PLAYER && pVictim->GetTypeId() == TYPEID_PLAYER)
+ // only from players
+ if (GetTypeId() == TYPEID_PLAYER)
{
if (attackType != RANGED_ATTACK)
- damage-=((Player*)pVictim)->GetMeleeDamageReduction(damage);
+ damage -= pVictim->GetMeleeDamageReduction(damage);
else
- damage-=((Player*)pVictim)->GetRangedDamageReduction(damage);
+ damage -= pVictim->GetRangedDamageReduction(damage);
}
// Calculate absorb resist
@@ -3186,13 +3191,10 @@ float Unit::GetUnitCriticalChance(WeaponAttackType attackType, const Unit *pVict
crit += pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
// reduce crit chance from Rating for players
- if (pVictim->GetTypeId() == TYPEID_PLAYER)
- {
- if (attackType==RANGED_ATTACK)
- crit -= ((Player*)pVictim)->GetRatingBonusValue(CR_CRIT_TAKEN_RANGED);
- else
- crit -= ((Player*)pVictim)->GetRatingBonusValue(CR_CRIT_TAKEN_MELEE);
- }
+ if (attackType != RANGED_ATTACK)
+ crit -= pVictim->GetMeleeCritChanceReduction();
+ else
+ crit -= pVictim->GetRangedCritChanceReduction();
// Apply crit chance from defence skill
crit += (int32(GetMaxSkillValueForLevel(pVictim)) - int32(pVictim->GetDefenseSkillValue(this))) * 0.04f;
@@ -3517,6 +3519,17 @@ bool Unit::isInBackInMap(Unit const* target, float distance, float arc) const
return IsWithinDistInMap(target, distance) && !HasInArc( 2 * M_PI - arc, target );
}
+void Unit::SetFacingToObject(WorldObject* pObject)
+{
+ // update orientation at server
+ SetOrientation(GetAngle(pObject));
+
+ // and client
+ WorldPacket data;
+ BuildHeartBeatMsg(&data);
+ SendMessageToSet(&data, false);
+}
+
bool Unit::isInAccessiblePlaceFor(Creature const* c) const
{
if(IsInWater())
@@ -8616,11 +8629,7 @@ bool Unit::Attack(Unit *victim, bool meleeAttack)
victim->SetInCombatWith(this);
AddThreat(victim, 0.0f);
- WorldPacket data(SMSG_AI_REACTION, 12);
- data << uint64(GetGUID());
- data << uint32(AI_REACTION_AGGRO); // Aggro sound
- ((WorldObject*)this)->SendMessageToSet(&data, true);
-
+ ((Creature*)this)->SendAIReaction(AI_REACTION_AGGRO);
((Creature*)this)->CallAssistance();
}
@@ -9843,8 +9852,7 @@ bool Unit::isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolM
// Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
crit_chance += pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
// Modify by player victim resilience
- if (pVictim->GetTypeId() == TYPEID_PLAYER)
- crit_chance -= ((Player*)pVictim)->GetRatingBonusValue(CR_CRIT_TAKEN_SPELL);
+ crit_chance -= pVictim->GetSpellCritChanceReduction();
}
// scripted (increase crit chance ... against ... target by x%
AuraEffectList const& mOverrideClassScript = GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
@@ -15086,6 +15094,29 @@ void Unit::KnockbackFrom(float x, float y, float speedXY, float speedZ)
}
}
+float Unit::GetCombatRatingReduction(CombatRating cr) const
+{
+ if (GetTypeId() == TYPEID_PLAYER)
+ return ((Player const*)this)->GetRatingBonusValue(cr);
+ else if (((Creature const*)this)->isPet())
+ {
+ // Player's pet have 0.4 resilience from owner
+ if (Unit* owner = GetOwner())
+ if(owner->GetTypeId() == TYPEID_PLAYER)
+ return ((Player*)owner)->GetRatingBonusValue(cr) * 0.4f;
+ }
+
+ return 0.0f;
+}
+
+uint32 Unit::GetCombatRatingDamageReduction(CombatRating cr, float rate, float cap, uint32 damage) const
+{
+ float percent = GetCombatRatingReduction(cr) * rate;
+ if (percent > cap)
+ percent = cap;
+ return uint32 (percent * damage / 100.0f);
+}
+
uint32 Unit::GetModelForForm(ShapeshiftForm form)
{
switch(form)
diff --git a/src/game/Unit.h b/src/game/Unit.h
index b439cf35dc6..cef043be902 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -165,13 +165,18 @@ enum UnitStandStateType
UNIT_STAND_STATE_SIT_MEDIUM_CHAIR = 5,
UNIT_STAND_STATE_SIT_HIGH_CHAIR = 6,
UNIT_STAND_STATE_DEAD = 7,
- UNIT_STAND_STATE_KNEEL = 8
+ UNIT_STAND_STATE_KNEEL = 8,
+ UNIT_STAND_STATE_SUBMERGED = 9
};
// byte flag value (UNIT_FIELD_BYTES_1,2)
enum UnitStandFlags
{
+ UNIT_STAND_FLAGS_UNK1 = 0x01,
UNIT_STAND_FLAGS_CREEP = 0x02,
+ UNIT_STAND_FLAGS_UNK3 = 0x04,
+ UNIT_STAND_FLAGS_UNK4 = 0x08,
+ UNIT_STAND_FLAGS_UNK5 = 0x10,
UNIT_STAND_FLAGS_ALL = 0xFF
};
@@ -179,6 +184,7 @@ enum UnitStandFlags
enum UnitBytes1_Flags
{
UNIT_BYTE1_FLAG_ALWAYS_STAND = 0x01,
+ UNIT_BYTE1_FLAG_UNK_2 = 0x02,
UNIT_BYTE1_FLAG_UNTRACKABLE = 0x04,
UNIT_BYTE1_FLAG_ALL = 0xFF
};
@@ -226,7 +232,7 @@ enum SheathState
#define MAX_SHEATH_STATE 3
// byte (1 from 0..3) of UNIT_FIELD_BYTES_2
-enum UnitBytes2_Flags
+enum UnitPVPStateFlags
{
UNIT_BYTE2_FLAG_PVP = 0x01,
UNIT_BYTE2_FLAG_UNK1 = 0x02,
@@ -1284,6 +1290,22 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void CalculateSpellDamageTaken(SpellNonMeleeDamage *damageInfo, int32 damage, SpellEntry const *spellInfo, WeaponAttackType attackType = BASE_ATTACK, bool crit = false);
void DealSpellDamage(SpellNonMeleeDamage *damageInfo, bool durabilityLoss);
+
+ // player or player's pet resilience (-1%)
+ float GetMeleeCritChanceReduction() const { return GetCombatRatingReduction(CR_CRIT_TAKEN_MELEE); }
+ float GetRangedCritChanceReduction() const { return GetCombatRatingReduction(CR_CRIT_TAKEN_RANGED); }
+ float GetSpellCritChanceReduction() const { return GetCombatRatingReduction(CR_CRIT_TAKEN_SPELL); }
+
+ // player or player's pet resilience (-1%)
+ uint32 GetMeleeCritDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_MELEE, 2.2f, 33.0f, damage); }
+ uint32 GetRangedCritDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_RANGED, 2.2f, 33.0f, damage); }
+ uint32 GetSpellCritDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_SPELL, 2.2f, 33.0f, damage); }
+
+ // player or player's pet resilience (-1%), cap 100%
+ uint32 GetMeleeDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_MELEE, 1.0f, 100.0f, damage); }
+ uint32 GetRangedDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_MELEE, 1.0f, 100.0f, damage); }
+ uint32 GetSpellDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_MELEE, 1.0f, 100.0f, damage); }
+
float MeleeSpellMissChance(const Unit *pVictim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const;
SpellMissInfo MeleeSpellHitResult(Unit *pVictim, SpellEntry const *spell);
SpellMissInfo MagicSpellHitResult(Unit *pVictim, SpellEntry const *spell);
@@ -1624,6 +1646,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
SetOrientation(GetAngle(target));
}
bool isInBackInMap(Unit const* target, float distance, float arc = M_PI) const;
+ void SetFacingToObject(WorldObject* pObject);
// Visibility system
UnitVisibility GetVisibility() const { return m_Visibility; }
@@ -1759,8 +1782,8 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask);
bool IsImmunedToDamage(SpellEntry const* spellInfo);
virtual bool IsImmunedToSpellEffect(SpellEntry const* spellInfo, uint32 index) const;
- // redefined in Creature
-
+ // redefined in Creature
+ uint32 CalcNotIgnoreDamageRedunction( uint32 damage, SpellSchoolMask damageSchoolMask);
uint32 CalcArmorReducedDamage(Unit* pVictim, const uint32 damage, SpellEntry const *spellInfo, WeaponAttackType attackType=MAX_ATTACK);
void CalcAbsorbResist(Unit *pVictim, SpellSchoolMask schoolMask, DamageEffectType damagetype, const uint32 damage, uint32 *absorb, uint32 *resist, SpellEntry const *spellInfo = NULL);
@@ -1979,6 +2002,10 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
bool HandleAuraRaidProcFromChargeWithValue(AuraEffect* triggeredByAura);
bool HandleAuraRaidProcFromCharge(AuraEffect* triggeredByAura);
+ // player or player's pet
+ float GetCombatRatingReduction(CombatRating cr) const;
+ uint32 GetCombatRatingDamageReduction(CombatRating cr, float rate, float cap, uint32 damage) const;
+
void SetFeared(bool apply);
void SetConfused(bool apply);
void SetStunned(bool apply);
diff --git a/src/game/World.h b/src/game/World.h
index 9777e97a046..ed16d03307a 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -405,6 +405,7 @@ enum RealmZone
#define SCRIPT_COMMAND_FLAG_REMOVE 5 // source = any, datalong = field_id, datalog2 = bitmask
#define SCRIPT_COMMAND_TELEPORT_TO 6 // source or target with Player, datalong = map_id, x/y/z
#define SCRIPT_COMMAND_QUEST_EXPLORED 7 // one from source or target must be Player, another GO/Creature, datalong=quest_id, datalong2=distance or 0
+#define SCRIPT_COMMAND_KILL_CREDIT 8 // source or target with Player, datalong = creature entry, datalong2 = bool (0=personal credit, 1=group credit)
#define SCRIPT_COMMAND_RESPAWN_GAMEOBJECT 9 // source = any (summoner), datalong=db_guid, datalong2=despawn_delay
#define SCRIPT_COMMAND_TEMP_SUMMON_CREATURE 10 // source = any (summoner), datalong=creature entry, datalong2=despawn_delay
#define SCRIPT_COMMAND_OPEN_DOOR 11 // source = unit, datalong=db_guid, datalong2=reset_delay
diff --git a/src/shared/LockedQueue.h b/src/shared/LockedQueue.h
index 6543487da81..c07ffcacb02 100644
--- a/src/shared/LockedQueue.h
+++ b/src/shared/LockedQueue.h
@@ -42,20 +42,27 @@ namespace ACE_Based
public:
//! Create a LockedQueue.
- LockedQueue() : _canceled(false) {}
+ LockedQueue()
+ : _canceled(false)
+ {
+ }
//! Destroy a LockedQueue.
- virtual ~LockedQueue() { }
+ virtual ~LockedQueue()
+ {
+ }
//! Adds an item to the queue.
void add(const T& item)
{
- ACE_Guard<LockType> g(this->_lock);
+ lock();
//ASSERT(!this->_canceled);
// throw Cancellation_Exception();
_queue.push_back(item);
+
+ unlock();
}
//! Gets the next result in the queue, if any.
@@ -74,12 +81,25 @@ namespace ACE_Based
return true;
}
+ //! Peeks at the top of the queue. Remember to unlock after use.
+ T& peek()
+ {
+ lock();
+
+
+ T& result = _queue.front();
+
+ return result;
+ }
+
//! Cancels the queue.
void cancel()
{
- ACE_Guard<LockType> g(this->_lock);
+ lock();
_canceled = true;
+
+ unlock();
}
//! Checks if the queue is cancelled.
@@ -88,6 +108,18 @@ namespace ACE_Based
ACE_Guard<LockType> g(this->_lock);
return _canceled;
}
+
+ //! Locks the queue for access.
+ void lock()
+ {
+ this->_lock.acquire();
+ }
+
+ //! Unlocks the queue.
+ void unlock()
+ {
+ this->_lock.release();
+ }
};
}
#endif
diff --git a/src/trinitycore/Main.cpp b/src/trinitycore/Main.cpp
index 23e977bc69f..a4905e20275 100644
--- a/src/trinitycore/Main.cpp
+++ b/src/trinitycore/Main.cpp
@@ -24,6 +24,7 @@
#include <openssl/opensslv.h>
#include <openssl/crypto.h>
+#include <ace/Version.h>
#include "Common.h"
#include "Database/DatabaseEnv.h"
@@ -164,6 +165,7 @@ extern int main(int argc, char **argv)
while (pause > clock()) {}
return 1;
}
+ sLog.outDetail("Using ACE: %s", ACE_VERSION);
///- and run the 'Master'
/// \todo Why do we need this 'Master'? Can't all of this be in the Main as for Realmd?