[12659] Fixed mounts

This commit is contained in:
sanctum32 2013-08-05 18:37:27 +03:00 committed by Antz
parent 1997c1e903
commit a253344a02
9 changed files with 105 additions and 3 deletions

View file

@ -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
{

View file

@ -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");

View file

@ -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;

View file

@ -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

View file

@ -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";

View file

@ -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)
{

View file

@ -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();

View file

@ -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);

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "12658"
#define REVISION_NR "12659"
#endif // __REVISION_NR_H__