mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
[8465] Fixed exploit of z-axis described in http://getmangos.com/community/showthread.php?t=9652
Little code style clean up. Signed-off-by: ApoC <apoc@nymfe.net>
This commit is contained in:
parent
bb30afb6f3
commit
bba20b92a5
4 changed files with 25 additions and 24 deletions
|
|
@ -54,7 +54,7 @@ class MANGOS_DLL_DECL DestinationHolder
|
||||||
uint32 StartTravel(TRAVELLER &traveller, bool sendMove = true);
|
uint32 StartTravel(TRAVELLER &traveller, bool sendMove = true);
|
||||||
void GetLocationNow(const Map * map, float &x, float &y, float &z, bool is3D = false) const;
|
void GetLocationNow(const Map * map, float &x, float &y, float &z, bool is3D = false) const;
|
||||||
void GetLocationNowNoMicroMovement(float &x, float &y, float &z) const; // For use without micro movement
|
void GetLocationNowNoMicroMovement(float &x, float &y, float &z) const; // For use without micro movement
|
||||||
float GetDistance2dFromDestSq(const WorldObject &obj) const;
|
float GetDistance3dFromDestSq(const WorldObject &obj) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void _findOffSetPoint(float x1, float y1, float x2, float y2, float offset, float &x, float &y);
|
void _findOffSetPoint(float x1, float y1, float x2, float y2, float offset, float &x, float &y);
|
||||||
|
|
|
||||||
|
|
@ -93,19 +93,20 @@ template<typename TRAVELLER>
|
||||||
bool
|
bool
|
||||||
DestinationHolder<TRAVELLER>::UpdateTraveller(TRAVELLER &traveller, uint32 diff, bool force_update, bool micro_movement)
|
DestinationHolder<TRAVELLER>::UpdateTraveller(TRAVELLER &traveller, uint32 diff, bool force_update, bool micro_movement)
|
||||||
{
|
{
|
||||||
if(!micro_movement)
|
if (!micro_movement)
|
||||||
{
|
{
|
||||||
i_tracker.Update(diff);
|
i_tracker.Update(diff);
|
||||||
i_timeElapsed += diff;
|
i_timeElapsed += diff;
|
||||||
if( i_tracker.Passed() || force_update )
|
if (i_tracker.Passed() || force_update)
|
||||||
{
|
{
|
||||||
ResetUpdate();
|
ResetUpdate();
|
||||||
if(!i_destSet) return true;
|
if (!i_destSet) return true;
|
||||||
|
|
||||||
float x,y,z;
|
float x,y,z;
|
||||||
GetLocationNowNoMicroMovement(x, y, z);
|
GetLocationNowNoMicroMovement(x, y, z);
|
||||||
if( x == -431602080 )
|
if( x == -431602080 )
|
||||||
return false;
|
return false;
|
||||||
if( traveller.GetTraveller().GetPositionX() != x || traveller.GetTraveller().GetPositionY() != y )
|
if (traveller.GetTraveller().GetPositionX() != x || traveller.GetTraveller().GetPositionY() != y || traveller.GetTraveller().GetPositionZ() != z)
|
||||||
{
|
{
|
||||||
float ori = traveller.GetTraveller().GetAngle(x, y);
|
float ori = traveller.GetTraveller().GetAngle(x, y);
|
||||||
traveller.Relocation(x, y, z, ori);
|
traveller.Relocation(x, y, z, ori);
|
||||||
|
|
@ -116,16 +117,16 @@ DestinationHolder<TRAVELLER>::UpdateTraveller(TRAVELLER &traveller, uint32 diff,
|
||||||
}
|
}
|
||||||
i_tracker.Update(diff);
|
i_tracker.Update(diff);
|
||||||
i_timeElapsed += diff;
|
i_timeElapsed += diff;
|
||||||
if( i_tracker.Passed() || force_update )
|
if (i_tracker.Passed() || force_update)
|
||||||
{
|
{
|
||||||
ResetUpdate();
|
ResetUpdate();
|
||||||
if(!i_destSet) return true;
|
if (!i_destSet) return true;
|
||||||
float x,y,z;
|
|
||||||
|
|
||||||
if(!traveller.GetTraveller().hasUnitState(UNIT_STAT_MOVING | UNIT_STAT_IN_FLIGHT))
|
if (!traveller.GetTraveller().hasUnitState(UNIT_STAT_MOVING | UNIT_STAT_IN_FLIGHT))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if(traveller.GetTraveller().hasUnitState(UNIT_STAT_IN_FLIGHT))
|
float x,y,z;
|
||||||
|
if (traveller.GetTraveller().hasUnitState(UNIT_STAT_IN_FLIGHT))
|
||||||
GetLocationNow(traveller.GetTraveller().GetBaseMap() ,x, y, z, true); // Should reposition Object with right Coord, so I can bypass some Grid Relocation
|
GetLocationNow(traveller.GetTraveller().GetBaseMap() ,x, y, z, true); // Should reposition Object with right Coord, so I can bypass some Grid Relocation
|
||||||
else
|
else
|
||||||
GetLocationNow(traveller.GetTraveller().GetBaseMap(), x, y, z, false);
|
GetLocationNow(traveller.GetTraveller().GetBaseMap(), x, y, z, false);
|
||||||
|
|
@ -133,7 +134,7 @@ DestinationHolder<TRAVELLER>::UpdateTraveller(TRAVELLER &traveller, uint32 diff,
|
||||||
if( x == -431602080 )
|
if( x == -431602080 )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if( traveller.GetTraveller().GetPositionX() != x || traveller.GetTraveller().GetPositionY() != y )
|
if (traveller.GetTraveller().GetPositionX() != x || traveller.GetTraveller().GetPositionY() != y || traveller.GetTraveller().GetPositionZ() != z)
|
||||||
{
|
{
|
||||||
float ori = traveller.GetTraveller().GetAngle(x, y);
|
float ori = traveller.GetTraveller().GetAngle(x, y);
|
||||||
traveller.Relocation(x, y, z, ori);
|
traveller.Relocation(x, y, z, ori);
|
||||||
|
|
@ -160,13 +161,13 @@ template<typename TRAVELLER>
|
||||||
void
|
void
|
||||||
DestinationHolder<TRAVELLER>::GetLocationNow(const Map * map, float &x, float &y, float &z, bool is3D) const
|
DestinationHolder<TRAVELLER>::GetLocationNow(const Map * map, float &x, float &y, float &z, bool is3D) const
|
||||||
{
|
{
|
||||||
if( HasArrived() )
|
if (HasArrived())
|
||||||
{
|
{
|
||||||
x = i_destX;
|
x = i_destX;
|
||||||
y = i_destY;
|
y = i_destY;
|
||||||
z = i_destZ;
|
z = i_destZ;
|
||||||
}
|
}
|
||||||
else if(HasDestination())
|
else if (HasDestination())
|
||||||
{
|
{
|
||||||
double percent_passed = (double)i_timeElapsed / (double)i_totalTravelTime;
|
double percent_passed = (double)i_timeElapsed / (double)i_totalTravelTime;
|
||||||
const float distanceX = ((i_destX - i_fromX) * percent_passed);
|
const float distanceX = ((i_destX - i_fromX) * percent_passed);
|
||||||
|
|
@ -176,7 +177,7 @@ DestinationHolder<TRAVELLER>::GetLocationNow(const Map * map, float &x, float &y
|
||||||
y = i_fromY + distanceY;
|
y = i_fromY + distanceY;
|
||||||
float z2 = i_fromZ + distanceZ;
|
float z2 = i_fromZ + distanceZ;
|
||||||
// All that is not finished but previous code neither... Traveller need be able to swim.
|
// All that is not finished but previous code neither... Traveller need be able to swim.
|
||||||
if(is3D)
|
if (is3D)
|
||||||
z = z2;
|
z = z2;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -193,11 +194,11 @@ DestinationHolder<TRAVELLER>::GetLocationNow(const Map * map, float &x, float &y
|
||||||
|
|
||||||
template<typename TRAVELLER>
|
template<typename TRAVELLER>
|
||||||
float
|
float
|
||||||
DestinationHolder<TRAVELLER>::GetDistance2dFromDestSq(const WorldObject &obj) const
|
DestinationHolder<TRAVELLER>::GetDistance3dFromDestSq(const WorldObject &obj) const
|
||||||
{
|
{
|
||||||
float x,y,z;
|
float x,y,z;
|
||||||
obj.GetPosition(x,y,z);
|
obj.GetPosition(x,y,z);
|
||||||
return (i_destX-x)*(i_destX-x)+(i_destY-y)*(i_destY-y);
|
return (i_destX-x)*(i_destX-x)+(i_destY-y)*(i_destY-y)+(i_destZ-z)*(i_destZ-z);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename TRAVELLER>
|
template<typename TRAVELLER>
|
||||||
|
|
@ -211,7 +212,7 @@ template<typename TRAVELLER>
|
||||||
void
|
void
|
||||||
DestinationHolder<TRAVELLER>::GetLocationNowNoMicroMovement(float &x, float &y, float &z) const
|
DestinationHolder<TRAVELLER>::GetLocationNowNoMicroMovement(float &x, float &y, float &z) const
|
||||||
{
|
{
|
||||||
if( HasArrived() )
|
if (HasArrived())
|
||||||
{
|
{
|
||||||
x = i_destX;
|
x = i_destX;
|
||||||
y = i_destY;
|
y = i_destY;
|
||||||
|
|
|
||||||
|
|
@ -136,7 +136,7 @@ TargetedMovementGenerator<T>::Update(T &owner, const uint32 & time_diff)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// prevent movement while casting spells with cast time or channel time
|
// prevent movement while casting spells with cast time or channel time
|
||||||
if ( owner.IsNonMeleeSpellCasted(false, false, true))
|
if (owner.IsNonMeleeSpellCasted(false, false, true))
|
||||||
{
|
{
|
||||||
if (!owner.IsStopped())
|
if (!owner.IsStopped())
|
||||||
owner.StopMoving();
|
owner.StopMoving();
|
||||||
|
|
@ -149,9 +149,9 @@ TargetedMovementGenerator<T>::Update(T &owner, const uint32 & time_diff)
|
||||||
|
|
||||||
Traveller<T> traveller(owner);
|
Traveller<T> traveller(owner);
|
||||||
|
|
||||||
if( !i_destinationHolder.HasDestination() )
|
if (!i_destinationHolder.HasDestination())
|
||||||
_setTargetLocation(owner);
|
_setTargetLocation(owner);
|
||||||
if( owner.IsStopped() && !i_destinationHolder.HasArrived() )
|
if (owner.IsStopped() && !i_destinationHolder.HasArrived())
|
||||||
{
|
{
|
||||||
owner.addUnitState(UNIT_STAT_CHASE);
|
owner.addUnitState(UNIT_STAT_CHASE);
|
||||||
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly())
|
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly())
|
||||||
|
|
@ -172,16 +172,16 @@ TargetedMovementGenerator<T>::Update(T &owner, const uint32 & time_diff)
|
||||||
//More distance let have better performance, less distance let have more sensitive reaction at target move.
|
//More distance let have better performance, less distance let have more sensitive reaction at target move.
|
||||||
|
|
||||||
// try to counter precision differences
|
// try to counter precision differences
|
||||||
if( i_destinationHolder.GetDistance2dFromDestSq(*i_target.getTarget()) >= dist * dist)
|
if (i_destinationHolder.GetDistance3dFromDestSq(*i_target.getTarget()) >= dist * dist)
|
||||||
{
|
{
|
||||||
owner.SetInFront(i_target.getTarget()); // Set new Angle For Map::
|
owner.SetInFront(i_target.getTarget()); // Set new Angle For Map::
|
||||||
_setTargetLocation(owner); //Calculate New Dest and Send data To Player
|
_setTargetLocation(owner); //Calculate New Dest and Send data To Player
|
||||||
}
|
}
|
||||||
// Update the Angle of the target only for Map::, no need to send packet for player
|
// Update the Angle of the target only for Map::, no need to send packet for player
|
||||||
else if ( !i_angle && !owner.HasInArc( 0.01f, i_target.getTarget() ) )
|
else if (!i_angle && !owner.HasInArc(0.01f, i_target.getTarget()))
|
||||||
owner.SetInFront(i_target.getTarget());
|
owner.SetInFront(i_target.getTarget());
|
||||||
|
|
||||||
if(( owner.IsStopped() && !i_destinationHolder.HasArrived() ) || i_recalculateTravel )
|
if ((owner.IsStopped() && !i_destinationHolder.HasArrived()) || i_recalculateTravel)
|
||||||
{
|
{
|
||||||
i_recalculateTravel = false;
|
i_recalculateTravel = false;
|
||||||
//Angle update will take place into owner.StopMoving()
|
//Angle update will take place into owner.StopMoving()
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "8464"
|
#define REVISION_NR "8465"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue