diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/game/ChannelMgr.cpp | 25 | ||||
| -rw-r--r-- | src/game/ChannelMgr.h | 2 | ||||
| -rw-r--r-- | src/game/Creature.cpp | 27 | ||||
| -rw-r--r-- | src/game/Creature.h | 2 | ||||
| -rw-r--r-- | src/game/DBCEnums.h | 3 | ||||
| -rw-r--r-- | src/game/ItemHandler.cpp | 2 | ||||
| -rw-r--r-- | src/game/Level3.cpp | 16 | ||||
| -rw-r--r-- | src/game/Map.cpp | 30 | ||||
| -rw-r--r-- | src/game/MiscHandler.cpp | 16 | ||||
| -rw-r--r-- | src/game/Object.cpp | 13 | ||||
| -rw-r--r-- | src/game/ObjectMgr.cpp | 10 | ||||
| -rw-r--r-- | src/game/Pet.cpp | 4 | ||||
| -rw-r--r-- | src/game/Pet.h | 2 | ||||
| -rw-r--r-- | src/game/Player.cpp | 110 | ||||
| -rw-r--r-- | src/game/Player.h | 7 | ||||
| -rw-r--r-- | src/game/QuestHandler.cpp | 53 | ||||
| -rw-r--r-- | src/game/SharedDefines.h | 54 | ||||
| -rw-r--r-- | src/game/Spell.cpp | 2 | ||||
| -rw-r--r-- | src/game/SpellAuras.cpp | 14 | ||||
| -rw-r--r-- | src/game/SpellEffects.cpp | 8 | ||||
| -rw-r--r-- | src/game/TaxiHandler.cpp | 11 | ||||
| -rw-r--r-- | src/game/Unit.cpp | 89 | ||||
| -rw-r--r-- | src/game/Unit.h | 35 | ||||
| -rw-r--r-- | src/game/World.h | 1 | ||||
| -rw-r--r-- | src/shared/LockedQueue.h | 40 | ||||
| -rw-r--r-- | src/trinitycore/Main.cpp | 2 |
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? |
