diff options
author | Vincent_Michael <Vincent_Michael@gmx.de> | 2013-02-27 21:12:00 +0100 |
---|---|---|
committer | Vincent_Michael <Vincent_Michael@gmx.de> | 2013-02-27 21:12:00 +0100 |
commit | 9daf06f36a48492e7ff284d0cd6b8182af8b39ce (patch) | |
tree | 53b1d46bcc050ccfdae60d7ce7148247f9845e78 | |
parent | 052e47780ef9852665287fe76edd51a5911674b0 (diff) | |
parent | d3ad8a4941124aae2b2ced6cc75c18ec8498664a (diff) |
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts:
src/server/game/Handlers/SpellHandler.cpp
src/server/game/Spells/Spell.cpp
-rw-r--r-- | cmake/genrev.cmake | 21 | ||||
-rw-r--r-- | cmake/showoptions.cmake | 3 | ||||
-rw-r--r-- | revision.h.in.cmake | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Vehicle/Vehicle.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Entities/Vehicle/Vehicle.h | 6 | ||||
-rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 39 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 34 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 51 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.h | 1 |
9 files changed, 123 insertions, 57 deletions
diff --git a/cmake/genrev.cmake b/cmake/genrev.cmake index 35f1a7a11ed..b39a0780b1c 100644 --- a/cmake/genrev.cmake +++ b/cmake/genrev.cmake @@ -20,7 +20,8 @@ endif() if(NO_GIT) set(rev_date "1970-01-01 00:00:00 +0000") - set(rev_hash "Archived") + set(rev_hash "unknown") + set(rev_branch "Archived") else() if(GIT_EXEC) # Create a revision-string that we can use @@ -40,18 +41,27 @@ else() OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET ) + + # Also retrieve branch name + execute_process( + COMMAND "${GIT_EXEC}" rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + OUTPUT_VARIABLE rev_branch + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) endif() # Last minute check - ensure that we have a proper revision # If everything above fails (means the user has erased the git revision control directory or removed the origin/HEAD tag) - if(NOT rev_info) # No valid ways available to find/set the revision/hash, so let's force some defaults message(STATUS " Could not find a proper repository signature (hash) - you may need to pull tags with git fetch -t - Continuing anyway - note that the versionstring will be set to 1970-01-01 00:00:00 (Archived)") + Continuing anyway - note that the versionstring will be set to \"unknown 1970-01-01 00:00:00 (Archived)"\") set(rev_date "1970-01-01 00:00:00 +0000") - set(rev_hash "Archived") + set(rev_hash "unknown") + set(rev_branch "Archived") else() # Extract information required to build a proper versionstring string(REGEX REPLACE init-|[0-9]+-g "" rev_hash ${rev_info}) @@ -59,11 +69,12 @@ else() endif() # Create the actual revision.h file from the above params -if(NOT "${rev_hash_cached}" MATCHES "${rev_hash}") +if(NOT "${rev_hash_cached}" MATCHES "${rev_hash}" OR NOT "${rev_branch_cached}" MATCHES "${rev_branch}") configure_file( "${CMAKE_SOURCE_DIR}/revision.h.in.cmake" "${BUILDDIR}/revision.h" @ONLY ) set(rev_hash_cached "${rev_hash}" CACHE INTERNAL "Cached commit-hash") + set(rev_branch_cached "${rev_branch}" CACHE INTERNAL "Cached branch name") endif() diff --git a/cmake/showoptions.cmake b/cmake/showoptions.cmake index 058cce78d09..08dc2a0cfcb 100644 --- a/cmake/showoptions.cmake +++ b/cmake/showoptions.cmake @@ -1,7 +1,6 @@ # output generic information about the core and buildtype chosen message("") -message("* TrinityCore rev. hash : ${rev_hash}") -message("* TrinityCore rev. date : ${rev_date}") +message("* TrinityCore revision : ${rev_hash} ${rev_date} (${rev_branch} branch)") if( UNIX ) message("* TrinityCore buildtype : ${CMAKE_BUILD_TYPE}") endif() diff --git a/revision.h.in.cmake b/revision.h.in.cmake index 12b1603e249..dbd2a8a878c 100644 --- a/revision.h.in.cmake +++ b/revision.h.in.cmake @@ -2,10 +2,11 @@ #define __REVISION_H__ #define _HASH "@rev_hash@" #define _DATE "@rev_date@" + #define _BRANCH "@rev_branch@" #define VER_COMPANYNAME_STR "TrinityCore Developers" #define VER_LEGALCOPYRIGHT_STR "(c)2008-2013 TrinityCore" #define VER_FILEVERSION 0,0,0 - #define VER_FILEVERSION_STR "@rev_date@ (@rev_hash@)" + #define VER_FILEVERSION_STR "@rev_hash@ @rev_date@ (@rev_branch@ branch)" #define VER_PRODUCTVERSION VER_FILEVERSION #define VER_PRODUCTVERSION_STR VER_FILEVERSION_STR #endif // __REVISION_H__ diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 592b9fd40a3..7d3e2372c23 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -576,6 +576,26 @@ void Vehicle::Dismiss() } /** + * @fn bool Vehicle::IsVehicleInUse() const + * + * @brief Returns information whether the vehicle is currently used by any unit + * + * @author Shauren + * @date 26-2-2013 + * + * @return true if any passenger is boarded on vehicle, false otherwise. + */ + +bool Vehicle::IsVehicleInUse() const +{ + for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr) + if (itr->second.Passenger) + return true; + + return false; +} + +/** * @fn void Vehicle::InitMovementInfoForBase() * * @brief Sets correct MovementFlags2 based on VehicleFlags from DBC. @@ -613,7 +633,7 @@ void Vehicle::InitMovementInfoForBase() * @return null if passenger not found on vehicle, else the DBC record for the seat. */ -VehicleSeatEntry const* Vehicle::GetSeatForPassenger(Unit* passenger) +VehicleSeatEntry const* Vehicle::GetSeatForPassenger(Unit const* passenger) { SeatMap::iterator itr; for (itr = Seats.begin(); itr != Seats.end(); ++itr) diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index 8b67b82cfa3..f9bf3c21ef4 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -63,14 +63,14 @@ class Vehicle : public TransportBase void RelocatePassengers(); void RemoveAllPassengers(); void Dismiss(); - bool IsVehicleInUse() { return Seats.begin() != Seats.end(); } + bool IsVehicleInUse() const; void SetLastShootPos(Position const& pos) { _lastShootPos.Relocate(pos); } - Position GetLastShootPos() { return _lastShootPos; } + Position const& GetLastShootPos() const { return _lastShootPos; } SeatMap Seats; ///< The collection of all seats on the vehicle. Including vacant ones. - VehicleSeatEntry const* GetSeatForPassenger(Unit* passenger); + VehicleSeatEntry const* GetSeatForPassenger(Unit const* passenger); protected: friend class VehicleJoinEvent; diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index d3468f38983..c98a9fbcb5c 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -345,7 +345,6 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) return; } - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); if (!spellInfo) { @@ -354,25 +353,31 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) return; } - if (mover->GetTypeId() == TYPEID_PLAYER) + if (spellInfo->IsPassive()) { - // not have spell in spellbook or spell passive and not casted by client - if (!mover->ToPlayer()->HasActiveSpell(spellId) || spellInfo->IsPassive()) - { - //cheater? kick? ban? - recvPacket.rfinish(); // prevent spam at ignore packet - return; - } + recvPacket.rfinish(); // prevent spam at ignore packet + return; } - else + + Unit* caster = mover; + if (caster->GetTypeId() == TYPEID_UNIT && !caster->ToCreature()->HasSpell(spellId)) { - // not have spell in spellbook or spell passive and not casted by client - if ((mover->GetTypeId() == TYPEID_UNIT && !mover->ToCreature()->HasSpell(spellId)) || spellInfo->IsPassive()) + // If the vehicle creature does not have the spell but it allows the passenger to cast own spells + // change caster to player and let him cast + if (!_player->IsOnVehicle(caster) || spellInfo->CheckVehicle(_player) != SPELL_CAST_OK) { - //cheater? kick? ban? recvPacket.rfinish(); // prevent spam at ignore packet return; } + + caster = _player; + } + + if (caster->GetTypeId() == TYPEID_PLAYER && !caster->ToPlayer()->HasActiveSpell(spellId)) + { + // not have spell in spellbook + recvPacket.rfinish(); // prevent spam at ignore packet + return; } Unit::AuraEffectList swaps = mover->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS); @@ -398,8 +403,8 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) // Client is resending autoshot cast opcode when other spell is casted during shoot rotation // Skip it to prevent "interrupt" message - if (spellInfo->IsAutoRepeatRangedSpell() && _player->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL) - && _player->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL)->m_spellInfo == spellInfo) + if (spellInfo->IsAutoRepeatRangedSpell() && caster->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL) + && caster->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL)->m_spellInfo == spellInfo) { recvPacket.rfinish(); return; @@ -414,7 +419,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) // client provided targets SpellCastTargets targets; - targets.Read(recvPacket, mover); + targets.Read(recvPacket, caster); HandleClientCastFlags(recvPacket, castFlags, targets); // auto-selection buff level base at target level (in spellInfo) @@ -427,7 +432,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) spellInfo = actualSpellInfo; } - Spell* spell = new Spell(mover, spellInfo, TRIGGERED_NONE, 0, false); + Spell* spell = new Spell(caster, spellInfo, TRIGGERED_NONE, 0, false); spell->m_cast_count = castCount; // set count of casts spell->m_glyphIndex = glyphIndex; spell->prepare(&targets); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index d8eb279a5bc..0dc463bedc9 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4862,34 +4862,12 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_MOVING; } - - Vehicle* vehicle = m_caster->GetVehicle(); - if (vehicle && !(_triggeredCastFlags & TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE)) + // Check vehicle flags + if (!(_triggeredCastFlags & TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE)) { - uint16 checkMask = 0; - for (uint8 effIndex = EFFECT_0; effIndex < MAX_SPELL_EFFECTS; ++effIndex) - { - SpellEffectInfo const* effInfo = &m_spellInfo->Effects[effIndex]; - if (effInfo->ApplyAuraName == SPELL_AURA_MOD_SHAPESHIFT) - { - SpellShapeshiftFormEntry const* shapeShiftEntry = sSpellShapeshiftFormStore.LookupEntry(effInfo->MiscValue); - if (shapeShiftEntry && (shapeShiftEntry->flags1 & 1) == 0) // unk flag - checkMask |= VEHICLE_SEAT_FLAG_UNCONTROLLED; - break; - } - } - - if (m_spellInfo->HasAura(SPELL_AURA_MOUNTED)) - checkMask |= VEHICLE_SEAT_FLAG_CAN_CAST_MOUNT_SPELL; - - if (!checkMask) - checkMask = VEHICLE_SEAT_FLAG_CAN_ATTACK; - - // All creatures should be able to cast as passengers freely, restriction and attribute are only for players - VehicleSeatEntry const* vehicleSeat = vehicle->GetSeatForPassenger(m_caster); - if (!(m_spellInfo->AttributesEx6 & SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE) && !(m_spellInfo->Attributes & SPELL_ATTR0_CASTABLE_WHILE_MOUNTED) - && (vehicleSeat->m_flags & checkMask) != checkMask && m_caster->GetTypeId() == TYPEID_PLAYER) - return SPELL_FAILED_DONT_REPORT; + SpellCastResult vehicleCheck = m_spellInfo->CheckVehicle(m_caster); + if (vehicleCheck != SPELL_CAST_OK) + return vehicleCheck; } // check spell cast conditions from database @@ -7176,7 +7154,7 @@ bool Spell::CheckScriptEffectImplicitTargets(uint32 effIndex, uint32 effIndexToC if (((*targetSelectHookItr).IsEffectAffected(m_spellInfo, effIndex) && !(*targetSelectHookItr).IsEffectAffected(m_spellInfo, effIndexToCheck)) || (!(*targetSelectHookItr).IsEffectAffected(m_spellInfo, effIndex) && (*targetSelectHookItr).IsEffectAffected(m_spellInfo, effIndexToCheck))) return false; - + std::list<SpellScript::ObjectAreaTargetSelectHandler>::iterator areaTargetSelectHookEnd = (*itr)->OnObjectAreaTargetSelect.end(), areaTargetSelectHookItr = (*itr)->OnObjectAreaTargetSelect.begin(); for (; areaTargetSelectHookItr != areaTargetSelectHookEnd; ++areaTargetSelectHookItr) if (((*areaTargetSelectHookItr).IsEffectAffected(m_spellInfo, effIndex) && !(*areaTargetSelectHookItr).IsEffectAffected(m_spellInfo, effIndexToCheck)) || diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 8a8b72c511a..a08ffb5734f 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -23,6 +23,7 @@ #include "ConditionMgr.h" #include "Player.h" #include "Battleground.h" +#include "Vehicle.h" uint32 GetTargetFlagMask(SpellTargetObjectTypes objType) { @@ -1783,6 +1784,56 @@ SpellCastResult SpellInfo::CheckExplicitTarget(Unit const* caster, WorldObject c return SPELL_CAST_OK; } +SpellCastResult SpellInfo::CheckVehicle(Unit const* caster) const +{ + // All creatures should be able to cast as passengers freely, restriction and attribute are only for players + if (caster->GetTypeId() != TYPEID_PLAYER) + return SPELL_CAST_OK; + + Vehicle* vehicle = caster->GetVehicle(); + if (vehicle) + { + uint16 checkMask = 0; + for (uint8 effIndex = EFFECT_0; effIndex < MAX_SPELL_EFFECTS; ++effIndex) + { + if (Effects[effIndex].ApplyAuraName == SPELL_AURA_MOD_SHAPESHIFT) + { + SpellShapeshiftFormEntry const* shapeShiftFromEntry = sSpellShapeshiftFormStore.LookupEntry(Effects[effIndex].MiscValue); + if (shapeShiftFromEntry && (shapeShiftFromEntry->flags1 & 1) == 0) // unk flag + checkMask |= VEHICLE_SEAT_FLAG_UNCONTROLLED; + break; + } + } + + if (HasAura(SPELL_AURA_MOUNTED)) + checkMask |= VEHICLE_SEAT_FLAG_CAN_CAST_MOUNT_SPELL; + + if (!checkMask) + checkMask = VEHICLE_SEAT_FLAG_CAN_ATTACK; + + VehicleSeatEntry const* vehicleSeat = vehicle->GetSeatForPassenger(caster); + if (!(AttributesEx6 & SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE) && !(Attributes & SPELL_ATTR0_CASTABLE_WHILE_MOUNTED) + && (vehicleSeat->m_flags & checkMask) != checkMask) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + + // Can only summon uncontrolled minions/guardians when on controlled vehicle + if (vehicleSeat->m_flags & (VEHICLE_SEAT_FLAG_CAN_CONTROL | VEHICLE_SEAT_FLAG_UNK2)) + { + for (uint32 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i) + { + if (Effects[i].Effect != SPELL_EFFECT_SUMMON) + continue; + + SummonPropertiesEntry const* props = sSummonPropertiesStore.LookupEntry(Effects[i].MiscValueB); + if (props && props->Category != SUMMON_CATEGORY_WILD) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + } + } + } + + return SPELL_CAST_OK; +} + bool SpellInfo::CheckTargetCreatureType(Unit const* target) const { // Curse of Doom & Exorcism: not find another way to fix spell target check :/ diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index ad344f0463d..18443421dfe 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -471,6 +471,7 @@ public: SpellCastResult CheckLocation(uint32 map_id, uint32 zone_id, uint32 area_id, Player const* player = NULL) const; SpellCastResult CheckTarget(Unit const* caster, WorldObject const* target, bool implicit = true) const; SpellCastResult CheckExplicitTarget(Unit const* caster, WorldObject const* target, Item const* itemTarget = NULL) const; + SpellCastResult CheckVehicle(Unit const* caster) const; bool CheckTargetCreatureType(Unit const* target) const; SpellSchoolMask GetSchoolMask() const; |