aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent_Michael <Vincent_Michael@gmx.de>2013-02-27 21:12:00 +0100
committerVincent_Michael <Vincent_Michael@gmx.de>2013-02-27 21:12:00 +0100
commit9daf06f36a48492e7ff284d0cd6b8182af8b39ce (patch)
tree53b1d46bcc050ccfdae60d7ce7148247f9845e78
parent052e47780ef9852665287fe76edd51a5911674b0 (diff)
parentd3ad8a4941124aae2b2ced6cc75c18ec8498664a (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.cmake21
-rw-r--r--cmake/showoptions.cmake3
-rw-r--r--revision.h.in.cmake3
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.cpp22
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.h6
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp39
-rw-r--r--src/server/game/Spells/Spell.cpp34
-rw-r--r--src/server/game/Spells/SpellInfo.cpp51
-rw-r--r--src/server/game/Spells/SpellInfo.h1
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;