mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 19:37:02 +00:00
[12659] Fixed mounts
This commit is contained in:
parent
1997c1e903
commit
a253344a02
9 changed files with 105 additions and 3 deletions
|
|
@ -31,6 +31,11 @@
|
|||
// Server side limitation. Base at used code requirements.
|
||||
// also see MAX_LEVEL and GT_MAX_LEVEL define
|
||||
#define STRONG_MAX_LEVEL 255
|
||||
enum MountFlags
|
||||
{
|
||||
MOUNT_FLAG_CAN_PITCH = 0x4,
|
||||
MOUNT_FLAG_CAN_SWIM = 0x8
|
||||
};
|
||||
|
||||
enum BattleGroundBracketId // bracketId for level ranges
|
||||
{
|
||||
|
|
|
|||
|
|
@ -145,6 +145,8 @@ DBCStorage <MapDifficultyEntry> sMapDifficultyStore(MapDifficultyEntryfmt); // o
|
|||
MapDifficultyMap sMapDifficultyMap;
|
||||
|
||||
DBCStorage <MovieEntry> sMovieStore(MovieEntryfmt);
|
||||
DBCStorage <MountCapabilityEntry> sMountCapabilityStore(MountCapabilityfmt);
|
||||
DBCStorage <MountTypeEntry> sMountTypeStore(MountTypefmt);
|
||||
|
||||
DBCStorage <NumTalentsAtLevelEntry> sNumTalentsAtLevelStore(NumTalentsAtLevelfmt);
|
||||
|
||||
|
|
@ -561,6 +563,8 @@ void LoadDBCStores(const std::string& dataPath)
|
|||
sMapDifficultyMap[MAKE_PAIR32(entry->MapId, entry->Difficulty)] = entry;
|
||||
|
||||
LoadDBC(availableDbcLocales, bar, bad_dbc_files, sMovieStore, dbcPath, "Movie.dbc");
|
||||
LoadDBC(availableDbcLocales,bar,bad_dbc_files, sMountCapabilityStore, dbcPath,"MountCapability.dbc");
|
||||
LoadDBC(availableDbcLocales,bar,bad_dbc_files, sMountTypeStore, dbcPath,"MountType.dbc");
|
||||
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sNumTalentsAtLevelStore, dbcPath,"NumTalentsAtLevel.dbc");
|
||||
LoadDBC(availableDbcLocales, bar, bad_dbc_files, sOverrideSpellDataStore, dbcPath, "OverrideSpellData.dbc");
|
||||
LoadDBC(availableDbcLocales, bar, bad_dbc_files, sQuestFactionRewardStore, dbcPath, "QuestFactionReward.dbc");
|
||||
|
|
|
|||
|
|
@ -179,6 +179,8 @@ extern DBCStorage <MapEntry> sMapStore;
|
|||
// extern DBCStorage <MapDifficultyEntry> sMapDifficultyStore; -- use GetMapDifficultyData insteed
|
||||
extern MapDifficultyMap sMapDifficultyMap;
|
||||
extern DBCStorage <MovieEntry> sMovieStore;
|
||||
extern DBCStorage <MountCapabilityEntry> sMountCapabilityStore;
|
||||
extern DBCStorage <MountTypeEntry> sMountTypeStore;
|
||||
extern DBCStorage <NumTalentsAtLevelEntry> sNumTalentsAtLevelStore;
|
||||
extern DBCStorage <OverrideSpellDataEntry> sOverrideSpellDataStore;
|
||||
extern DBCStorage <QuestFactionRewardEntry> sQuestFactionRewardStore;
|
||||
|
|
|
|||
|
|
@ -1385,6 +1385,26 @@ struct MovieEntry
|
|||
//uint32 unk2; // 3 4.0.0
|
||||
};
|
||||
|
||||
struct MountCapabilityEntry
|
||||
{
|
||||
uint32 Id;
|
||||
uint32 Flags;
|
||||
uint32 RequiredRidingSkill;
|
||||
uint32 RequiredArea;
|
||||
uint32 RequiredAura;
|
||||
uint32 RequiredSpell;
|
||||
uint32 SpeedModSpell;
|
||||
int32 RequiredMap;
|
||||
};
|
||||
|
||||
#define MAX_MOUNT_CAPABILITIES 24
|
||||
|
||||
struct MountTypeEntry
|
||||
{
|
||||
uint32 Id;
|
||||
uint32 MountCapability[MAX_MOUNT_CAPABILITIES];
|
||||
};
|
||||
|
||||
struct NumTalentsAtLevelEntry
|
||||
{
|
||||
//uint32 Level; // 0 index
|
||||
|
|
|
|||
|
|
@ -89,6 +89,8 @@ const char MailTemplateEntryfmt[]="nxs";
|
|||
const char MapEntryfmt[]="nsiiiisissififfiiiii";
|
||||
const char MapDifficultyEntryfmt[]="niisiis";
|
||||
const char MovieEntryfmt[]="nxxx";
|
||||
const char MountCapabilityfmt[]="niiiiiii";
|
||||
const char MountTypefmt[]="niiiiiiiiiiiiiiiiiiiiiiii";
|
||||
const char NumTalentsAtLevelfmt[]="df";
|
||||
const char OverrideSpellDatafmt[]="niiiiiiiiiixx";
|
||||
const char QuestFactionRewardfmt[] = "niiiiiiiiii";
|
||||
|
|
|
|||
|
|
@ -3419,8 +3419,6 @@ void Aura::HandleAuraMounted(bool apply, bool Real)
|
|||
if (minfo)
|
||||
display_id = minfo->modelid;
|
||||
|
||||
target->Mount(display_id, GetId());
|
||||
|
||||
if (ci->vehicleId)
|
||||
{
|
||||
target->SetVehicleId(ci->vehicleId, ci->Entry);
|
||||
|
|
@ -3428,11 +3426,19 @@ void Aura::HandleAuraMounted(bool apply, bool Real)
|
|||
if (target->GetTypeId() == TYPEID_PLAYER)
|
||||
target->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE);
|
||||
}
|
||||
|
||||
target->Mount(display_id, GetId());
|
||||
if (MountCapabilityEntry const* mountCapability = target->GetMountCapability(uint32(GetMiscBValue())))
|
||||
target->CastSpell(target, mountCapability->SpeedModSpell, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
target->Unmount(true);
|
||||
|
||||
// remove speed aura
|
||||
if (MountCapabilityEntry const* mountCapability = target->GetMountCapability(uint32(GetMiscBValue())))
|
||||
target->RemoveAurasDueToSpell(mountCapability->SpeedModSpell);
|
||||
|
||||
CreatureInfo const* ci = ObjectMgr::GetCreatureTemplate(m_modifier.m_miscvalue);
|
||||
if (ci && target->IsVehicle() && ci->vehicleId == target->GetVehicleInfo()->GetVehicleEntry()->m_ID)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -8186,6 +8186,67 @@ void Unit::Unmount(bool from_aura)
|
|||
}
|
||||
}
|
||||
|
||||
MountCapabilityEntry const* Unit::GetMountCapability(uint32 mountType) const
|
||||
{
|
||||
if (!mountType)
|
||||
return NULL;
|
||||
|
||||
MountTypeEntry const* mountTypeEntry = sMountTypeStore.LookupEntry(mountType);
|
||||
if (!mountTypeEntry)
|
||||
return NULL;
|
||||
|
||||
uint32 zoneId, areaId;
|
||||
GetZoneAndAreaId(zoneId, areaId);
|
||||
uint32 ridingSkill = 5000;
|
||||
if (GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
Player* plr = (Player*)(this);
|
||||
ridingSkill = plr->GetSkillValue(SKILL_RIDING);
|
||||
}
|
||||
|
||||
for (uint32 i = MAX_MOUNT_CAPABILITIES; i > 0; --i)
|
||||
{
|
||||
MountCapabilityEntry const* mountCapability = sMountCapabilityStore.LookupEntry(mountTypeEntry->MountCapability[i - 1]);
|
||||
if (!mountCapability)
|
||||
continue;
|
||||
|
||||
if (ridingSkill < mountCapability->RequiredRidingSkill)
|
||||
continue;
|
||||
|
||||
if (m_movementInfo.HasMovementFlag2(MOVEFLAG2_FULLSPEEDPITCHING))
|
||||
{
|
||||
if (!(mountCapability->Flags & MOUNT_FLAG_CAN_PITCH))
|
||||
continue;
|
||||
}
|
||||
else if (m_movementInfo.HasMovementFlag(MOVEFLAG_SWIMMING))
|
||||
{
|
||||
if (!(mountCapability->Flags & MOUNT_FLAG_CAN_SWIM))
|
||||
continue;
|
||||
}
|
||||
else if (!(mountCapability->Flags & 0x1)) // unknown flags, checked in 4.2.2 14545 client
|
||||
{
|
||||
if (!(mountCapability->Flags & 0x2))
|
||||
continue;
|
||||
}
|
||||
|
||||
if (mountCapability->RequiredMap != -1 && int32(GetMapId()) != mountCapability->RequiredMap)
|
||||
continue;
|
||||
|
||||
if (mountCapability->RequiredArea && (mountCapability->RequiredArea != zoneId && mountCapability->RequiredArea != areaId))
|
||||
continue;
|
||||
|
||||
if (mountCapability->RequiredAura && !HasAura(mountCapability->RequiredAura))
|
||||
continue;
|
||||
|
||||
if (mountCapability->RequiredSpell && (GetTypeId() != TYPEID_PLAYER || !(Player*)(this)->HasSpell(mountCapability->RequiredSpell)))
|
||||
continue;
|
||||
|
||||
return mountCapability;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void Unit::SetInCombatWith(Unit* enemy)
|
||||
{
|
||||
Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf();
|
||||
|
|
|
|||
|
|
@ -1932,6 +1932,8 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
|
|||
*/
|
||||
void Unmount(bool from_aura = false);
|
||||
|
||||
MountCapabilityEntry const* GetMountCapability(uint32 mountType) const;
|
||||
|
||||
VehicleInfo* GetVehicleInfo() { return m_vehicleInfo; }
|
||||
bool IsVehicle() const { return m_vehicleInfo != NULL; }
|
||||
void SetVehicleId(uint32 entry, uint32 overwriteNpcEntry);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "12658"
|
||||
#define REVISION_NR "12659"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue