mirror of
https://github.com/mangosfour/server.git
synced 2025-12-17 07:37:03 +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.
|
// Server side limitation. Base at used code requirements.
|
||||||
// also see MAX_LEVEL and GT_MAX_LEVEL define
|
// also see MAX_LEVEL and GT_MAX_LEVEL define
|
||||||
#define STRONG_MAX_LEVEL 255
|
#define STRONG_MAX_LEVEL 255
|
||||||
|
enum MountFlags
|
||||||
|
{
|
||||||
|
MOUNT_FLAG_CAN_PITCH = 0x4,
|
||||||
|
MOUNT_FLAG_CAN_SWIM = 0x8
|
||||||
|
};
|
||||||
|
|
||||||
enum BattleGroundBracketId // bracketId for level ranges
|
enum BattleGroundBracketId // bracketId for level ranges
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -145,6 +145,8 @@ DBCStorage <MapDifficultyEntry> sMapDifficultyStore(MapDifficultyEntryfmt); // o
|
||||||
MapDifficultyMap sMapDifficultyMap;
|
MapDifficultyMap sMapDifficultyMap;
|
||||||
|
|
||||||
DBCStorage <MovieEntry> sMovieStore(MovieEntryfmt);
|
DBCStorage <MovieEntry> sMovieStore(MovieEntryfmt);
|
||||||
|
DBCStorage <MountCapabilityEntry> sMountCapabilityStore(MountCapabilityfmt);
|
||||||
|
DBCStorage <MountTypeEntry> sMountTypeStore(MountTypefmt);
|
||||||
|
|
||||||
DBCStorage <NumTalentsAtLevelEntry> sNumTalentsAtLevelStore(NumTalentsAtLevelfmt);
|
DBCStorage <NumTalentsAtLevelEntry> sNumTalentsAtLevelStore(NumTalentsAtLevelfmt);
|
||||||
|
|
||||||
|
|
@ -561,6 +563,8 @@ void LoadDBCStores(const std::string& dataPath)
|
||||||
sMapDifficultyMap[MAKE_PAIR32(entry->MapId, entry->Difficulty)] = entry;
|
sMapDifficultyMap[MAKE_PAIR32(entry->MapId, entry->Difficulty)] = entry;
|
||||||
|
|
||||||
LoadDBC(availableDbcLocales, bar, bad_dbc_files, sMovieStore, dbcPath, "Movie.dbc");
|
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,sNumTalentsAtLevelStore, dbcPath,"NumTalentsAtLevel.dbc");
|
||||||
LoadDBC(availableDbcLocales, bar, bad_dbc_files, sOverrideSpellDataStore, dbcPath, "OverrideSpellData.dbc");
|
LoadDBC(availableDbcLocales, bar, bad_dbc_files, sOverrideSpellDataStore, dbcPath, "OverrideSpellData.dbc");
|
||||||
LoadDBC(availableDbcLocales, bar, bad_dbc_files, sQuestFactionRewardStore, dbcPath, "QuestFactionReward.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 DBCStorage <MapDifficultyEntry> sMapDifficultyStore; -- use GetMapDifficultyData insteed
|
||||||
extern MapDifficultyMap sMapDifficultyMap;
|
extern MapDifficultyMap sMapDifficultyMap;
|
||||||
extern DBCStorage <MovieEntry> sMovieStore;
|
extern DBCStorage <MovieEntry> sMovieStore;
|
||||||
|
extern DBCStorage <MountCapabilityEntry> sMountCapabilityStore;
|
||||||
|
extern DBCStorage <MountTypeEntry> sMountTypeStore;
|
||||||
extern DBCStorage <NumTalentsAtLevelEntry> sNumTalentsAtLevelStore;
|
extern DBCStorage <NumTalentsAtLevelEntry> sNumTalentsAtLevelStore;
|
||||||
extern DBCStorage <OverrideSpellDataEntry> sOverrideSpellDataStore;
|
extern DBCStorage <OverrideSpellDataEntry> sOverrideSpellDataStore;
|
||||||
extern DBCStorage <QuestFactionRewardEntry> sQuestFactionRewardStore;
|
extern DBCStorage <QuestFactionRewardEntry> sQuestFactionRewardStore;
|
||||||
|
|
|
||||||
|
|
@ -1385,6 +1385,26 @@ struct MovieEntry
|
||||||
//uint32 unk2; // 3 4.0.0
|
//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
|
struct NumTalentsAtLevelEntry
|
||||||
{
|
{
|
||||||
//uint32 Level; // 0 index
|
//uint32 Level; // 0 index
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,8 @@ const char MailTemplateEntryfmt[]="nxs";
|
||||||
const char MapEntryfmt[]="nsiiiisissififfiiiii";
|
const char MapEntryfmt[]="nsiiiisissififfiiiii";
|
||||||
const char MapDifficultyEntryfmt[]="niisiis";
|
const char MapDifficultyEntryfmt[]="niisiis";
|
||||||
const char MovieEntryfmt[]="nxxx";
|
const char MovieEntryfmt[]="nxxx";
|
||||||
|
const char MountCapabilityfmt[]="niiiiiii";
|
||||||
|
const char MountTypefmt[]="niiiiiiiiiiiiiiiiiiiiiiii";
|
||||||
const char NumTalentsAtLevelfmt[]="df";
|
const char NumTalentsAtLevelfmt[]="df";
|
||||||
const char OverrideSpellDatafmt[]="niiiiiiiiiixx";
|
const char OverrideSpellDatafmt[]="niiiiiiiiiixx";
|
||||||
const char QuestFactionRewardfmt[] = "niiiiiiiiii";
|
const char QuestFactionRewardfmt[] = "niiiiiiiiii";
|
||||||
|
|
|
||||||
|
|
@ -3419,8 +3419,6 @@ void Aura::HandleAuraMounted(bool apply, bool Real)
|
||||||
if (minfo)
|
if (minfo)
|
||||||
display_id = minfo->modelid;
|
display_id = minfo->modelid;
|
||||||
|
|
||||||
target->Mount(display_id, GetId());
|
|
||||||
|
|
||||||
if (ci->vehicleId)
|
if (ci->vehicleId)
|
||||||
{
|
{
|
||||||
target->SetVehicleId(ci->vehicleId, ci->Entry);
|
target->SetVehicleId(ci->vehicleId, ci->Entry);
|
||||||
|
|
@ -3428,11 +3426,19 @@ void Aura::HandleAuraMounted(bool apply, bool Real)
|
||||||
if (target->GetTypeId() == TYPEID_PLAYER)
|
if (target->GetTypeId() == TYPEID_PLAYER)
|
||||||
target->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE);
|
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
|
else
|
||||||
{
|
{
|
||||||
target->Unmount(true);
|
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);
|
CreatureInfo const* ci = ObjectMgr::GetCreatureTemplate(m_modifier.m_miscvalue);
|
||||||
if (ci && target->IsVehicle() && ci->vehicleId == target->GetVehicleInfo()->GetVehicleEntry()->m_ID)
|
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)
|
void Unit::SetInCombatWith(Unit* enemy)
|
||||||
{
|
{
|
||||||
Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf();
|
Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf();
|
||||||
|
|
|
||||||
|
|
@ -1932,6 +1932,8 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
|
||||||
*/
|
*/
|
||||||
void Unmount(bool from_aura = false);
|
void Unmount(bool from_aura = false);
|
||||||
|
|
||||||
|
MountCapabilityEntry const* GetMountCapability(uint32 mountType) const;
|
||||||
|
|
||||||
VehicleInfo* GetVehicleInfo() { return m_vehicleInfo; }
|
VehicleInfo* GetVehicleInfo() { return m_vehicleInfo; }
|
||||||
bool IsVehicle() const { return m_vehicleInfo != NULL; }
|
bool IsVehicle() const { return m_vehicleInfo != NULL; }
|
||||||
void SetVehicleId(uint32 entry, uint32 overwriteNpcEntry);
|
void SetVehicleId(uint32 entry, uint32 overwriteNpcEntry);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "12658"
|
#define REVISION_NR "12659"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue