سلام ، آیا این بازدید اول شماست ؟ یا
logo_forum_header

تبلیغات
×
+
سفارش تبلیغات

صفحه 1 از 2 12 آخرینآخرین
نمایش نتایج: از 1 به 10 از 13

موضوع: درخواست آنتی چیت

  1. #1

    شماره عضویت
    266
    تاریخ عضویت
    Apr 2015
    نوشته ها
    75
    نسل
    نسل مورد علاقه
    نژاد
    نژاد  مورد علاقه
    کلاس
     کلاس  مورد علاقه
    سورس
     سورس مورد علاقه
    پچ
    پچ مورد علاقه
    پسندیده : 91
    مورد پسند : 24 بار در 14 پست
    سیستم عامل و مرورگر:

    Question درخواست آنتی چیت

    سلام دوستان ! یه آنتی چیت میخوام برای TDB 58 که فقط هک رو back بده ! نه میخوام کیک کنه نه بن !
    با تسکر 3>

  2. # ADS
    سیستم تبلیغات
    تاریخ عضویت
    01/01/2014
    نوشته ها
    پستی ندارد.
     

  3. #2
    دستاورد ها:
    1 سال ثبت نام شده است۱۰۰۰ امتیازبرچسب زن کلاس اول

    شماره عضویت
    141
    تاریخ عضویت
    Jan 2015
    نوشته ها
    20
    نسل
    نسل مورد علاقه
    نژاد
    نژاد  مورد علاقه
    کلاس
     کلاس  مورد علاقه
    سورس
     سورس مورد علاقه
    پسندیده : 2
    مورد پسند : 24 بار در 11 پست
    سیستم عامل و مرورگر:
    سلام

    در صورت نیاز میتونم با امکانات مورد نیاز شما آنتی هک اختصاصی بنویسم

    در صورت تمایل در ارتباط باشید : 09307203004 ( هزینه بصورت توافقی )

  4. #3
    جایزه ها:
    پایان دهنده بحث ها

    شماره عضویت
    8
    تاریخ عضویت
    Oct 2014
    نوشته ها
    256
    نسل
    نسل مورد علاقه
    نژاد
    نژاد  مورد علاقه
    کلاس
     کلاس  مورد علاقه
    سورس
     سورس مورد علاقه
    پسندیده : 110
    مورد پسند : 311 بار در 153 پست
    سیستم عامل و مرورگر:
    نقل قول نوشته اصلی توسط iceboy نمایش پست ها
    سلام دوستان ! یه آنتی چیت میخوام برای TDB 58 که فقط هک رو back بده ! نه میخوام کیک کنه نه بن !
    با تسکر 3>
    خدمت شما اینم انتی چیت رایگان AC2

    کد PHP:

    diff 
    --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
    index 40dbe6c
    ..3ee86e8 100644
    --- a/src/server/game/Entities/Player/Player.cpp
    +++ b/src/server/game/Entities/Player/Player.cpp
    @@ -775,+775,26 @@ Player::Player(WorldSessionsession): Unit(true)
         
    rest_type=REST_TYPE_NO;
         
    ////////////////////Rest System/////////////////////
     
    +    // movement anticheat
    +    m_anti_LastClientTime  0;          // last movement client time
    +    m_anti_LastServerTime  0;          // last movement server time
    +    m_anti_DeltaClientTime 0;          // client side session time
    +    m_anti_DeltaServerTime 0;          // server side session time
    +    m_anti_MistimingCount  0;          // mistiming count
    +
    +    
    m_anti_LastSpeedChangeTime 0;      // last speed change time
    +
    +    
    m_anti_Last_HSpeed =  7.0f;          // horizontal speed, default RUN speed
    +    m_anti_Last_VSpeed = -2.3f;          // vertical speed, default max jump height
    +
    +    
    m_anti_TeleToPlane_Count 0;        // Teleport To Plane alarm counter
    +
    +    
    m_anti_AlarmCount 0;               // alarm counter
    +
    +    
    m_anti_JumpCount 0;                // Jump already began, anti air jump check
    +    m_anti_JumpBaseZ 0;                // Z coord before jump (AntiGrav)
    +    // end movement anticheat
    +
         
    m_mailsLoaded false;
         
    m_mailsUpdated false;
         
    unReadMails 0;
    @@ -
    2156,+2176,@@ bool Player::TeleportTo(uint32 mapidfloat xfloat yfloat zfloat orientati
     
         
    if (GetMapId() == mapid)
         {
    +        
    m_anti_JumpBaseZ 0;
             
    //lets reset far teleport flag if it wasn't reset during chained teleports
             
    SetSemaphoreTeleportFar(false);
             
    //setup delayed teleport flag
    @@ -2305,+2326,@@ bool Player::TeleportTo(uint32 mapidfloat xfloat yfloat zfloat orientati
     
                 m_teleport_dest 
    WorldLocation(mapidxyzorientation);
                 
    SetFallInformation(0z);
    +            
    m_anti_JumpBaseZ 0;
                 
    // if the player is saved before worldportack (at logout for example)
                 // this will be used instead of the current location in SaveToDB
     
    diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
    index fee542a
    ..19287d1 100644
    --- a/src/server/game/Entities/Player/Player.h
    +++ b/src/server/game/Entities/Player/Player.h
    @@ -2520,+2520,26 @@ class Player : public Unit, public GridObject<Player>
             
    float m_rest_bonus;
             
    RestType rest_type;
             
    ////////////////////Rest System/////////////////////
    +        // movement anticheat
    +        time_t m_anti_LastClientTime;           // last movement client time
    +        time_t m_anti_LastServerTime;           // last movement server time
    +        time_t m_anti_DeltaClientTime;          // client side session time
    +        time_t m_anti_DeltaServerTime;          // server side session time
    +        uint32 m_anti_MistimingCount;           // mistiming count
    +
    +        
    time_t m_anti_LastSpeedChangeTime;      // last speed change time
    +
    +        
    float m_anti_Last_HSpeed;               // horizontal speed, default RUN speed
    +        float m_anti_Last_VSpeed;               // vertical speed, default max jump height
    +
    +        
    uint32 m_anti_TeleToPlane_Count;        // Teleport To Plane alarm counter
    +
    +        
    uint64 m_anti_AlarmCount;               // alarm counter
    +
    +        
    uint16 m_anti_JumpCount;                // Jump already began, anti air jump check
    +        float m_anti_JumpBaseZ;                 // Z coord before jump
    +        // end movement anticheat
    +
             
    uint32 m_resetTalentsCost;
             
    time_t m_resetTalentsTime;
             
    uint32 m_usedTalentCount;
    diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
    index 25352a9
    ..64d6e80 100644
    --- a/src/server/game/Entities/Unit/Unit.h
    +++ b/src/server/game/Entities/Unit/Unit.h
    @@ -2131,+2131,@@ class Unit : public WorldObject
         
    protected:
             
    explicit Unit (bool isWorldObject);
     
    +        
    GameObjectm_temp_transport;
             
    void BuildValuesUpdate(uint8 updatetypeByteBufferdataPlayertarget) const;
     
             
    UnitAIi_AI, *i_disabledAI;
    diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
    index 2f309c0
    ..81324e7 100644
    --- a/src/server/game/Globals/ObjectMgr.cpp
    +++ b/src/server/game/Globals/ObjectMgr.cpp
    @@ -5489,+5489,@@ void ObjectMgr::LoadAreaTriggerScripts()
         
    TC_LOG_INFO("server.loading"">> Loaded %u areatrigger scripts in %u ms"countGetMSTimeDiffToNow(oldMSTime));
     }
     
    -
    uint32 ObjectMgr::GetNearestTaxiNode(float xfloat yfloat zuint32 mapiduint32 team)
    +
    // use searched_node for search some known node
    +uint32 ObjectMgr::GetNearestTaxiNode(float xfloat yfloat zuint32 mapiduint32 teamuint32 searched_node)
     {
         
    bool found false;
         
    float dist 10000;
    @@ -
    5499,+5500,18 @@ uint32 ObjectMgr::GetNearestTaxiNode(float xfloat yfloat zuint32 mapidui
         
    {
             
    TaxiNodesEntry const* node sTaxiNodesStore.LookupEntry(i);
     
    -        if (!
    node || node->map_id != mapid || (!node->MountCreatureID[team == ALLIANCE 0] && node->MountCreatureID[0] != 32981)) // dk flight
    +        if (!node || node->map_id != mapid) continue;
    +
    +        const 
    float dist2 pow(node->x2) + pow(node->y2) + pow(node->z2);
    +
    +        if (
    searched_node != && == searched_node)
    +        {
    +            
    id i;
    +            
    dist dist2;
    +            break;
    +        }
    +
    +        if (!
    node->MountCreatureID[team == ALLIANCE 0] && node->MountCreatureID[0] != 32981// dk flight
                 
    continue;
     
             
    uint8  field   = (uint8)((1) / 32);
    @@ -
    5509,+5521,@@ uint32 ObjectMgr::GetNearestTaxiNode(float xfloat yfloat zuint32 mapidui
             
    if ((sTaxiNodesMask[field] & submask) == 0)
                 continue;
     
    -        
    float dist2 = (node->x)*(node->x)+(node->y)*(node->y)+(node->z)*(node->z);
    +        
    //float dist2 = (node->x - x)*(node->x - x)+(node->y - y)*(node->y - y)+(node->z - z)*(node->z - z);
             
    if (found)
             {
                 if (
    dist2 dist)
    @@ -
    5525,+5537,@@ uint32 ObjectMgr::GetNearestTaxiNode(float xfloat yfloat zuint32 mapidui
                 id 
    i;
             }
         }
    -
    +    
    // movement anticheat fix
    +    if (dist 3600id 0;
    +    
    // movement anticheat fix
         
    return id;
     }
     
    diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
    index 752cc3b
    ..6d2aaac 100644
    --- a/src/server/game/Globals/ObjectMgr.h
    +++ b/src/server/game/Globals/ObjectMgr.h
    @@ -736,+736,@@ class ObjectMgr
             uint32 GetPlayerAccountIdByGUID
    (uint64 guid) const;
             
    uint32 GetPlayerAccountIdByPlayerName(std::string const& name) const;
     
    -        
    uint32 GetNearestTaxiNode(float xfloat yfloat zuint32 mapiduint32 team);
    +        
    uint32 GetNearestTaxiNode(float xfloat yfloat zuint32 mapiduint32 teamuint32 searched_node);
             
    void GetTaxiPath(uint32 sourceuint32 destinationuint32 &pathuint32 &cost);
             
    uint32 GetTaxiMountDisplayId(uint32 iduint32 teambool allowed_alt_team false);
     
    diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
    index 36d1e1c
    ..1916897 100644
    --- a/src/server/game/Handlers/MovementHandler.cpp
    +++ b/src/server/game/Handlers/MovementHandler.cpp
    @@ -30,+30,14 @@
     
    #include "WaypointMovementGenerator.h"
     #include "InstanceSaveMgr.h"
     #include "ObjectMgr.h"
    +#include "World.h"
    +#include "WardenWin.h"
    +#include "Appender.h"
    +
    +
    // Movement anticheat defines
    +//#define ANTICHEAT_DEBUG
    +#define ANTICHEAT_EXCEPTION_INFO
    +// End Movement anticheat defines
     
     #define MOVEMENT_PACKET_TIME_DELAY 0
     
    @@ -203,36 +211,36 @@ void WorldSession::HandleMoveTeleportAck(WorldPacketrecvData)
         
    TC_LOG_DEBUG("network""Guid " UI64FMTDguid);
         
    TC_LOG_DEBUG("network""Flags %u, time %u"flagstime/IN_MILLISECONDS);
     
    -    
    PlayerplMover _player->m_mover->ToPlayer();
    +    
    PlayerplrMover _player->m_mover->ToPlayer();
     
    -    if (!
    plMover || !plMover->IsBeingTeleportedNear())
    +    if (!
    plrMover || !plrMover->IsBeingTeleportedNear())
             return;
     
    -    if (
    guid != plMover->GetGUID())
    +    if (
    guid != plrMover->GetGUID())
             return;
     
    -    
    plMover->SetSemaphoreTeleportNear(false);
    +    
    plrMover->SetSemaphoreTeleportNear(false);
     
    -    
    uint32 old_zone plMover->GetZoneId();
    +    
    uint32 old_zone plrMover->GetZoneId();
     
    -    
    WorldLocation const& dest plMover->GetTeleportDest();
    +    
    WorldLocation const& dest plrMover->GetTeleportDest();
     
    -    
    plMover->UpdatePosition(desttrue);
    +    
    plrMover->UpdatePosition(desttrue);
     
         
    uint32 newzonenewarea;
    -    
    plMover->GetZoneAndAreaId(newzonenewarea);
    -    
    plMover->UpdateZone(newzonenewarea);
    +    
    plrMover->GetZoneAndAreaId(newzonenewarea);
    +    
    plrMover->UpdateZone(newzonenewarea);
     
         
    // new zone
         
    if (old_zone != newzone)
         {
             
    // honorless target
    -        if (plMover->pvpInfo.IsHostile)
    -            
    plMover->CastSpell(plMover2479true);
    +        if (
    plrMover->pvpInfo.IsHostile)
    +            
    plrMover->CastSpell(plrMover2479true);
     
             
    // in friendly area
    -        else if (plMover->IsPvP() && !plMover->HasFlag(PLAYER_FLAGSPLAYER_FLAGS_IN_PVP))
    -            
    plMover->UpdatePvP(falsefalse);
    +        else if (
    plrMover->IsPvP() && !plrMover->HasFlag(PLAYER_FLAGSPLAYER_FLAGS_IN_PVP))
    +            
    plrMover->UpdatePvP(falsefalse);
         }
     
         
    // resummon pet
    @@ -242,+250,@@ void WorldSession::HandleMoveTeleportAck(WorldPacketrecvData)
         
    GetPlayer()->ProcessDelayedOperations();
     }
     
    -
    void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
    +
    void WorldSession::HandleMovementOpcodes(WorldPacket recvData)
     {
         
    uint16 opcode recvData.GetOpcode();
     
    @@ -
    250,+258,13 @@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
     
         
    ASSERT(mover != NULL);                      // there must always be a mover
     
    -    PlayerplrMover mover->ToPlayer();
    +    
    PlayerplrMover mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover NULL;
    +    
    VehiclevehMover mover->GetVehicleKit();
    +    if (
    vehMover)
    +        if (
    mover->HasFlag(UNIT_FIELD_FLAGSUNIT_FLAG_PLAYER_CONTROLLED))
    +            if (
    Unitcharmer mover->GetCharmer())
    +                if (
    charmer->GetTypeId() == TYPEID_PLAYER)
    +                    
    plrMover = (Player*)charmer;
     
         
    // ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck
         
    if (plrMover && plrMover->IsBeingTeleported())
    @@ -
    299,+313,@@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
             }
     
             
    // if we boarded a transport, add us to it
    -        if (plrMover)
    +        if (
    plrMover && !plrMover->m_transport && !plrMover->m_temp_transport)
             {
                 if (!
    plrMover->GetTransport())
                 {
    @@ -
    326,25 +340,40 @@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
                         
    movementInfo.transport.Reset();
                     }
                 }
    +            if (!
    plrMover->m_transport)
    +                if (
    Map *tempMap mover->GetMap())
    +                    if (
    GameObject *tempTransport tempMap->GetGameObject(movementInfo.transport.guid))
    +                        if (
    tempTransport->IsTransport())
    +                            
    plrMover->m_temp_transport tempTransport;
             }
     
    -        if (!
    mover->GetTransport() && !mover->GetVehicle())
    +        if ((!
    plrMover && !mover->GetTransport() && !mover->GetVehicle()) || (plrMover && !plrMover->m_vehicle && !plrMover->m_transport && !plrMover->m_temp_transport)) // Not sure if the first part is needed. Just added it for verbosity.
             
    {
                 
    GameObjectgo mover->GetMap()->GetGameObject(movementInfo.transport.guid);
                 if (!
    go || go->GetGoType() != GAMEOBJECT_TYPE_TRANSPORT)
                     
    movementInfo.flags &= ~MOVEMENTFLAG_ONTRANSPORT;
             }
         }
    -    else if (
    plrMover && plrMover->GetTransport())                // if we were on a transport, leave
    +    else if (plrMover && (plrMover->m_transport || plrMover->m_temp_transport)) // if we were on a transport, leave
         
    {
    -        
    plrMover->m_transport->RemovePassenger(plrMover);
    -        
    plrMover->m_transport NULL;
    -        
    movementInfo.transport.Reset();
    +        if (
    plrMover->m_transport)
    +        {
    +            
    plrMover->m_transport->RemovePassenger(plrMover);
    +            
    plrMover->m_transport NULL;
    +        }
    +        
    plrMover->m_temp_transport NULL;
    +        
    movementInfo.transport.Reset();
         }
     
         
    // fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map).
         
    if (opcode == MSG_MOVE_FALL_LAND && plrMover && !plrMover->IsInFlight())
    -        
    plrMover->HandleFall(movementInfo);
    +    {
    +        
    // movement anticheat
    +        plrMover->m_anti_JumpCount 0;
    +        
    plrMover->m_anti_JumpBaseZ 0;
    +        if (!
    vehMover)
    +            
    plrMover->HandleFall(movementInfo);
    +    }
     
         if (
    plrMover && ((movementInfo.flags MOVEMENTFLAG_SWIMMING) != 0) != plrMover->IsInWater())
         {
    @@ -
    356,+388,348 @@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
         
    /*----------------------*/
         
    if (m_clientTimeDelay == 0)
             
    m_clientTimeDelay mstime movementInfo.time;
    +    
    // begin anti cheat
    +    bool check_passed true;
    +    
    #ifdef ANTICHEAT_DEBUG
    +   TC_LOG_WARN("cheat""AC2-%s > time: %d fall-time: %d | xyzo: %f, %f, %fo(%f) flags[%X] opcode[%s] | transport (xyzo): %f, %f, %fo(%f)",
    +       
    plrMover->GetName(), movementInfo.timemovementInfo.fallTimemovementInfo.pos.m_positionXmovementInfo.pos.m_positionYmovementInfo.pos.m_positionZmovementInfo.pos.m_orientation,
    +    
    movementInfo.flagsLookupOpcodeName(opcode), movementInfo.transport.pos.m_positionXmovementInfo.transport.pos.m_positionYmovementInfo.transport.pos.m_positionZmovementInfo.transport.pos.m_orientation);
    +    
    TC_LOG_WARN("cheat""AC2-%s Transport > GUID: (low)%d - (high)%d",
    +        
    plrMover->GetName(), GUID_LOPART(movementInfo.transport.guid), GUID_HIPART(movementInfo.transport.guid));
    +    
    #endif
    +
    +    if (
    plrMover)
    +    {
    +        if (
    World::GetEnableMvAnticheat() && !plrMover->IsGameMaster() && !plrMover->GetCharmerOrOwnerPlayerOrPlayerItself()->IsGameMaster() && !plrMover->GetCharmerOrOwnerPlayerOrPlayerItself()->GetVehicle())
    +        {
    +            
    // calc time deltas
    +            int32 cClientTimeDelta 1500;
    +            if (
    plrMover->m_anti_LastClientTime != 0)
    +            {
    +                
    cClientTimeDelta movementInfo.time plrMover->m_anti_LastClientTime;
    +                
    plrMover->m_anti_DeltaClientTime += cClientTimeDelta;
    +                
    plrMover->m_anti_LastClientTime movementInfo.time;
    +            }
    +            else
    +                
    plrMover->m_anti_LastClientTime movementInfo.time;
    +
    +            const 
    uint64 cServerTime getMSTime();
    +            
    uint32 cServerTimeDelta 1500;
    +            if (
    plrMover->m_anti_LastServerTime != 0)
    +            {
    +                
    cServerTimeDelta cServerTime plrMover->m_anti_LastServerTime;
    +                
    plrMover->m_anti_DeltaServerTime += cServerTimeDelta;
    +                
    plrMover->m_anti_LastServerTime cServerTime;
    +            }
    +            else
    +                
    plrMover->m_anti_LastServerTime cServerTime;
    +
    +            
    // resync times on client login (first 15 sec for heavy areas)
    +            if (plrMover->m_anti_DeltaServerTime 15000 && plrMover->m_anti_DeltaClientTime 15000)
    +                
    plrMover->m_anti_DeltaClientTime plrMover->m_anti_DeltaServerTime;
    +
    +            const 
    int32 sync_time plrMover->m_anti_DeltaClientTime plrMover->m_anti_DeltaServerTime;
    +
    +            
    #ifdef ANTICHEAT_DEBUG
    +            TC_LOG_WARN("cheat""AC2-%s Time > cClientTimeDelta: %d, cServerTime: %d | deltaC: %d - deltaS: %d | SyncTime: %d"plrMover->GetName(), cClientTimeDeltacServerTimeplrMover->m_anti_DeltaClientTimeplrMover->m_anti_DeltaServerTimesync_time);
    +            
    #endif
    +
    +            
    // mistiming checks
    +            const int32 GetMistimingDelta abs(int32(World::GetMistimingDelta()));
    +            if (
    sync_time GetMistimingDelta)
    +            {
    +                
    cClientTimeDelta cServerTimeDelta;
    +                ++(
    plrMover->m_anti_MistimingCount);
    +
    +                const 
    bool bMistimingModulo plrMover->m_anti_MistimingCount 50 == 0;
    +
    +                if (
    bMistimingModulo)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                    TC_LOG_WARN("cheat""AC2-%s, mistiming exception #%d, mistiming: %dms Action: %s"plrMover->GetName().c_str(),  plrMover->m_anti_MistimingCountsync_time, &Warden::Penalty);
    +                    
    #endif
    +                    check_passed false;
    +                }
    +                
    //if (vehMover)
    +                //    vehMover->Die();
    +                // Tell the player "Sure, you can fly!"
    +                {
    +                    
    WorldPacket data(SMSG_MOVE_SET_CAN_FLY12);
    +                    
    data.append(plrMover->GetPackGUID());
    +                    
    data << uint32(0);
    +                    
    SendPacket(&data);
    +                }
    +                
    // Then tell the player "Wait, no, you can't."
    +                {
    +                    
    WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY12);
    +                    
    data.append(plrMover->GetPackGUID());
    +                    
    data << uint32(0);
    +                    
    SendPacket(&data);
    +                }
    +                
    //plrMover->FallGround(2);
    +
    +                
    /* Disabled, not passive at all, and apparently causing crashes:
    +                if (plrMover->m_anti_MistimingCount > World::GetMistimingAlarms())
    +                {
    +                    sWorld.SendWorldText(3, strcat("Kicking cheater: ", plrMover->GetName()));
    +                    KickPlayer();
    +                    return;
    +                } */
    +            }
    +            
    // end mistiming checks
    +
    +            const 
    uint32 curDest plrMover->m_taxi.GetTaxiDestination(); // check taxi flight
    +            if (!curDest)
    +            {
    +                
    UnitMoveType move_type;
    +
    +                
    // calculating section
    +                // current speed
    +                if (movementInfo.flags MOVEMENTFLAG_FLYING)
    +                    
    move_type movementInfo.flags MOVEMENTFLAG_BACKWARD MOVE_FLIGHT_BACK MOVE_FLIGHT;
    +                else if (
    movementInfo.flags MOVEMENTFLAG_SWIMMING)
    +                    
    move_type movementInfo.flags MOVEMENTFLAG_BACKWARD MOVE_SWIM_BACK MOVE_SWIM;
    +                else if (
    movementInfo.flags MOVEMENTFLAG_WALKING)
    +                    
    move_type MOVE_WALK;
    +                
    // hmm... in first time after login player has MOVE_SWIMBACK instead MOVE_WALKBACK
    +                else
    +                    
    move_type movementInfo.flags MOVEMENTFLAG_BACKWARD MOVE_SWIM_BACK MOVE_RUN;
    +
    +                const 
    float current_speed mover->GetSpeed(move_type);
    +                
    // end current speed
    +
    +                
    // movement distance
    +                const float delta_x plrMover->m_transport || plrMover->m_temp_transport plrMover->GetPositionX() - movementInfo.pos.GetPositionX();
    +                const 
    float delta_y plrMover->m_transport || plrMover->m_temp_transport plrMover->GetPositionY() - movementInfo.pos.GetPositionY();
    +                const 
    float delta_z plrMover->m_transport || plrMover->m_temp_transport plrMover->GetPositionZ() - movementInfo.pos.GetPositionZ();
    +                const 
    float real_delta plrMover->m_transport || plrMover->m_temp_transport pow(delta_x2) + pow(delta_y2);
    +                
    // end movement distance
    +
    +                const 
    bool no_fly_auras = !(plrMover->HasAuraType(SPELL_AURA_FLY) || plrMover->HasAuraType(SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED)
    +                    || 
    plrMover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) || plrMover->HasAuraType(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED)
    +                    || 
    plrMover->HasAuraType(SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS) || plrMover->HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK));
    +                const 
    bool no_fly_flags = (movementInfo.flags & (MOVEMENTFLAG_CAN_FLY MOVEMENTFLAG_FLYING)) == 0;
    +
    +                const 
    bool no_swim_flags = (movementInfo.flags MOVEMENTFLAG_SWIMMING) == 0;
    +                const 
    bool no_swim_in_water = !mover->IsInWater();
    +                const 
    bool no_swim_above_water movementInfo.pos.GetPositionZ()-7.0f >= mover->GetBaseMap()->GetWaterLevel(movementInfo.pos.GetPositionX(),movementInfo.pos.GetPositionY());
    +                const 
    bool no_swim_water no_swim_in_water && no_swim_above_water;
    +
    +                const 
    bool no_waterwalk_flags = (movementInfo.flags MOVEMENTFLAG_WATERWALKING) == 0;
    +                const 
    bool no_waterwalk_auras = !(plrMover->HasAuraType(SPELL_AURA_WATER_WALK) || plrMover->HasAuraType(SPELL_AURA_GHOST));
    +
    +                if (
    cClientTimeDelta 0)
    +                    
    cClientTimeDelta 0;
    +                const 
    float time_delta cClientTimeDelta 1500 float(cClientTimeDelta)/1000.0f 1.5f// normalize time - 1.5 second allowed for heavy loaded server
    +
    +                const 
    float tg_z = (real_delta != && no_fly_auras && no_swim_flags) ? (pow(delta_z2) / real_delta) : -99999// movement distance tangents
    +
    +                if (
    current_speed plrMover->m_anti_Last_HSpeed && plrMover->m_anti_LastSpeedChangeTime == 0)
    +                    
    plrMover->m_anti_LastSpeedChangeTime movementInfo.time uint32(floor(((plrMover->m_anti_Last_HSpeed current_speed) * 1500)) + 100); // 100ms above for random fluctuation
    +
    +                const 
    float allowed_delta plrMover->m_transport || plrMover->m_temp_transport // movement distance allowed delta
    +                    pow(std::max(current_speedplrMover->m_anti_Last_HSpeed) * time_delta2)
    +                    + 
    2                                                                             // minimum allowed delta
    +                    + (tg_z 2.2 pow(delta_z2)/2.37f 0);                                     // mountain fall allowed delta
    +
    +                if (
    movementInfo.time plrMover->m_anti_LastSpeedChangeTime)
    +                {
    +                    
    plrMover->m_anti_Last_HSpeed current_speed;                                    // store current speed
    +                    plrMover->m_anti_Last_VSpeed = -2.3f;
    +                    
    plrMover->m_anti_LastSpeedChangeTime 0;
    +                }
    +                
    // end calculating section
    +
    +                
    // AntiGravity (thanks to Meekro)
    +                const float JumpHeight plrMover->m_anti_JumpBaseZ movementInfo.pos.GetPositionZ();
    +                if (
    no_fly_auras && no_swim_in_water && plrMover->m_anti_JumpBaseZ != && JumpHeight plrMover->m_anti_Last_VSpeed)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                    TC_LOG_WARN("cheat""AC2-%s, AntiGravity exception. JumpHeight = %f, Allowed Vertical Speed = %f",
    +                        
    plrMover->GetName().c_str(), JumpHeightplrMover->m_anti_Last_VSpeed);
    +                    
    #endif
    +                    check_passed false;
    +                    
    //if (vehMover)
    +                    //    vehMover->Die();
    +                    // Tell the player "Sure, you can fly!"
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_SET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    // Then tell the player "Wait, no, you can't."
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    //plrMover->FallGround(2);
    +                }
    +
    +                
    // multi jump checks
    +                if (opcode == MSG_MOVE_JUMP)
    +                {
    +                    if (
    no_fly_auras && no_swim_water)
    +                    {
    +                        if (
    plrMover->m_anti_JumpCount >= 1)
    +                        {
    +                            
    // don't process new jump packet
    +                            check_passed false;
    +                            
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                            TC_LOG_WARN("cheat""AC2-%s, Multijump exception."plrMover->GetName().c_str(), JumpHeightplrMover->m_anti_Last_VSpeed);
    +                            
    #endif
    +                            //if (vehMover)
    +                            //    vehMover->Die();
    +                            // Tell the player "Sure, you can fly!"
    +                            {
    +                                
    WorldPacket data(SMSG_MOVE_SET_CAN_FLY12);
    +                                
    data.append(plrMover->GetPackGUID());
    +                                
    data << uint32(0);
    +                                
    SendPacket(&data);
    +                            }
    +                            
    // Then tell the player "Wait, no, you can't."
    +                            {
    +                                
    WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY12);
    +                                
    data.append(plrMover->GetPackGUID());
    +                                
    data << uint32(0);
    +                                
    SendPacket(&data);
    +                            }
    +                            
    //plrMover->FallGround(2);
    +                            plrMover->m_anti_JumpCount 0;
    +                        }
    +                        else
    +                        {
    +                            
    plrMover->m_anti_JumpCount += 1;
    +                            
    plrMover->m_anti_JumpBaseZ movementInfo.pos.GetPositionZ();
    +                        }
    +                    } else
    +                        
    plrMover->m_anti_JumpCount 0;
    +                }
    +
    +                
    // speed and teleport hack checks
    +                if (real_delta allowed_delta)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                    if (real_delta 4900.0f)
    +                    {
    +                        
    TC_LOG_WARN("cheat""AC2-%s, speed exception | cDelta=%f aDelta=%f | cSpeed=%f lSpeed=%f deltaTime=%f"plrMover->GetName().c_str(), real_deltaallowed_deltacurrent_speedplrMover->m_anti_Last_HSpeedtime_delta);
    +                    } else {
    +                        
    TC_LOG_WARN("cheat""AC2-%s, teleport exception | cDelta=%f aDelta=%f | cSpeed=%f lSpeed=%f deltaTime=%f"plrMover->GetName().c_str(), real_deltaallowed_deltacurrent_speedplrMover->m_anti_Last_HSpeedtime_delta);
    +                    }
    +                    
    #endif
    +                    check_passed false;
    +                    
    //if (vehMover)
    +                    //    vehMover->Die();
    +                    //plrMover->FallGround(2);
    +                }
    +
    +                
    // mountain hack checks // 1.56f (delta_z < GetPlayer()->m_anti_Last_VSpeed))
    +                if (delta_z plrMover->m_anti_Last_VSpeed && plrMover->m_anti_JumpCount == && tg_z 2.37f)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                    TC_LOG_WARN("cheat""AC2-%s, mountain exception | tg_z=%f"plrMover->GetName().c_str(), tg_z);
    +                    
    #endif
    +                    check_passed false;
    +                
    //    if (vehMover)
    +                //        vehMover->Die();
    +                }
     
    -    
    /* process position-change */
    +                // Fly hack checks
    +                if (no_fly_auras && !no_fly_flags)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO // Aura numbers: 201, 206, 207, 208, 209, 211
    +                    TC_LOG_WARN("cheat""AC2-%s, flight exception. {SPELL_AURA_FLY=[%X]} {SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED=[%X]} {SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED=[%X]} {SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS=[%X]} {SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK=[%X]} {plrMover->GetVehicle()=[%X]}",
    +                        
    plrMover->GetName().c_str(),
    +                        
    plrMover->HasAuraType(SPELL_AURA_FLY), plrMover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED),
    +                        
    plrMover->HasAuraType(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED), plrMover->HasAuraType(SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS),
    +                        
    plrMover->HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK), plrMover->GetVehicle());
    +                    
    #endif
    +                    check_passed false;
    +                    
    //if (vehMover)
    +                    //    vehMover->Die();
    +                    // Tell the player "Sure, you can fly!"
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_SET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    // Then tell the player "Wait, no, you can't."
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    //plrMover->FallGround(2);
    +                }
    +
    +                
    // Waterwalk checks
    +                if (no_waterwalk_auras && !no_waterwalk_flags)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                    TC_LOG_WARN("cheat""AC2-%s, waterwalk exception. [%X]{SPELL_AURA_WATER_WALK=[%X]}",
    +                        
    plrMover->GetName().c_str(), movementInfo.flagsplrMover->HasAuraType(SPELL_AURA_WATER_WALK));
    +                    
    #endif
    +                    check_passed false;
    +                    
    //if (vehMover)
    +                    //    vehMover->Die();
    +                    // Tell the player "Sure, you can fly!"
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_SET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    // Then tell the player "Wait, no, you can't."
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    //plrMover->FallGround(2);
    +                }
    +
    +                
    // Teleport To Plane checks
    +                if (no_swim_in_water && movementInfo.pos.GetPositionZ() < 0.0001f && movementInfo.pos.GetPositionZ() > -0.0001f)
    +                {
    +                    if (const 
    Map *map plrMover->GetMap())
    +                    {
    +                        
    float plane_z map->GetHeight(movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), MAX_HEIGHT) - movementInfo.pos.GetPositionZ();
    +                        
    plane_z = (plane_z < -500.0f) ? 0.0f plane_z// check holes in height map
    +                        if (plane_z 0.1f || plane_z < -0.1f)
    +                        {
    +                            
    #ifdef ANTICHEAT_DEBUG
    +                            TC_LOG_WARN("cheat""AC2-%s, teleport to plane exception. plane_z: %f"plrMover->GetName(), plane_z);
    +                            
    #endif
    +                            #ifdef ANTICHEAT_EXCEPTION_INFO
    +                            if (plrMover->m_anti_TeleToPlane_Count World::GetTeleportToPlaneAlarms())
    +                            {
    +                                
    TC_LOG_WARN("cheat""AC2-%s, teleport to plane exception. Exception count: %d"plrMover->GetName().c_str(), plrMover->m_anti_TeleToPlane_Count);
    +                                
    /* Disabled, not passive at all, and apparently causing crashes:
    +                                sWorld.SendWorldText(3, strcat("Kicking cheater: ", plrMover->GetName()));
    +                                KickPlayer();
    +                                return; */
    +                            }
    +                            
    #endif
    +                            ++(plrMover->m_anti_TeleToPlane_Count);
    +                            
    check_passed false;
    +                            
    //if (vehMover)
    +                            //    vehMover->Die();
    +                        }
    +                    }
    +                }
    +                else
    +                    
    plrMover->m_anti_TeleToPlane_Count 0;
    +            }
    +        }
    +    }
    +     
    /* process position-change */
    +    if (check_passed)
    +    {
         
    WorldPacket data(opcoderecvData.size());
         
    movementInfo.time movementInfo.time m_clientTimeDelay MOVEMENT_PACKET_TIME_DELAY;
     
    @@ -
    376,11 +766,20 @@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
     
         
    mover->UpdatePosition(movementInfo.pos);
     
    -    if (
    plrMover)                                            // nothing is charmed, or player charmed
    +    if (plrMover && !vehMover)                               // nothing is charmed, or player charmed
         
    {
             
    plrMover->UpdateFallInformationIfNeed(movementInfoopcode);
     
    -        if (
    movementInfo.pos.GetPositionZ() < -500.0f)
    +        
    float underMapValueZ;
    +
    +        switch (
    plrMover->GetMapId())
    +        {
    +            case 
    617underMapValueZ 3.0f; break; // Dalaran Sewers
    +            case 618underMapValueZ 28.0f; break; // Ring of Valor
    +            default: underMapValueZ = -500.0f; break;
    +        }
    +
    +        if (
    movementInfo.pos.GetPositionZ() < underMapValueZ)
             {
                 if (!(
    plrMover->GetBattleground() && plrMover->GetBattleground()->HandlePlayerUnderMap(_player)))
                 {
    @@ -
    398,+797,31 @@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
                     }
                 }
             }
    +        
    // movement anticheat
    +        if (plrMover->m_anti_AlarmCount 0)
    +        {
    +            
    TC_LOG_WARN("cheat""AC2-%s produce %d anticheat alarms."plrMover->GetName().c_str(), plrMover->m_anti_AlarmCount);
    +            
    plrMover->m_anti_AlarmCount 0;
    +        }
    +        
    // end movement anticheat
    +     }
    +    }
    +    else if (
    plrMover)
    +    {
    +        if (
    plrMover->m_transport)
    +        {
    +            
    plrMover->m_transport->RemovePassenger(plrMover);
    +            
    plrMover->m_transport NULL;
    +        }
    +        
    plrMover->m_temp_transport NULL;
    +        ++(
    plrMover->m_anti_AlarmCount);
    +        
    WorldPacket data;
    +        
    plrMover->SetUnitMovementFlags(0);
    +        
    plrMover->SendTeleportAckPacket();
    +        
    plrMover->BuildHeartBeatMsg(&data);
    +        
    plrMover->SendMessageToSet(&datatrue);
         }
    +
     }
     
     
    void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recvData)
    @@ -
    517,+941,@@ void WorldSession::HandleMountSpecialAnimOpcode(WorldPacket/*recvData*/)
         
    GetPlayer()->SendMessageToSet(&datafalse);
     }
     
    -
    void WorldSession::HandleMoveKnockBackAck(WorldPacketrecvData)
    +
    void WorldSession::HandleMoveKnockBackAck(WorldPacket recvData)
     {
         
    TC_LOG_DEBUG("network""CMSG_MOVE_KNOCK_BACK_ACK");
     
    @@ -
    532,+956,18 @@ void WorldSession::HandleMoveKnockBackAck(WorldPacketrecvData)
         
    MovementInfo movementInfo;
         
    ReadMovementInfo(recvData, &movementInfo);
     
    +    
    // Save movement flags
    +    _player->SetUnitMovementFlags(movementInfo.flags);
    +    
    #ifdef ANTICHEAT_DEBUG
    +    TC_LOG_WARN("cheat""%s CMSG_MOVE_KNOCK_BACK_ACK: time: %d, fall time: %d | xyzo: %f,%f,%fo(%f) flags[%X] Vspeed: %f, Hspeed: %f"GetPlayer()->GetName(), movementInfo.timemovementInfo.fallTimemovementInfo.pos.m_positionXmovementInfo.pos.m_positionYmovementInfo.pos.m_positionZmovementInfo.pos.m_orientationmovementInfo.flagsmovementInfo.jump.zspeedmovementInfo.jump.xyspeed);
    +    
    #endif
    +
         
    _player->m_movementInfo movementInfo;
    +    
    _player->m_anti_Last_HSpeed movementInfo.jump.xyspeed;
    +    
    _player->m_anti_Last_VSpeed movementInfo.jump.zspeed 3.2f movementInfo.jump.zspeed 1.0f 3.2f;
    +
    +    const 
    uint32 dt = (_player->m_anti_Last_VSpeed 0) ? int(ceil(_player->m_anti_Last_VSpeed/-25)*1000) : int(ceil(_player->m_anti_Last_VSpeed/25)*1000);
    +    
    _player->m_anti_LastSpeedChangeTime movementInfo.time dt 1000;
     
         
    WorldPacket data(MSG_MOVE_KNOCK_BACK66);
         
    data.appendPackGUID(guid);
    diff --git a/src/server/game/Handlers/TaxiHandler.cpp b/src/server/game/Handlers/TaxiHandler.cpp
    index ae25d9f
    ..1460962 100644
    --- a/src/server/game/Handlers/TaxiHandler.cpp
    +++ b/src/server/game/Handlers/TaxiHandler.cpp
    @@ -48,+48,@@ void WorldSession::SendTaxiStatus(uint64 guid)
             return;
         }
     
    -    
    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam());
    +    
    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam(),0);
     
         
    // not found nearest
         
    if (curloc == 0)
    @@ -
    93,+93,@@ void WorldSession::HandleTaxiQueryAvailableNodes(WorldPacketrecvData)
     
    void WorldSession::SendTaxiMenu(Creatureunit)
     {
         
    // find current node
    -    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam());
    +    
    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam(),0);
     
         if (
    curloc == 0)
             return;
    @@ -
    133,+133,@@ void WorldSession::SendDoFlight(uint32 mountDisplayIduint32 pathuint32 pathN
     bool WorldSession
    ::SendLearnNewTaxiNode(Creatureunit)
     {
         
    // find current node
    -    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam());
    +    
    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam(),0);
     
         if (
    curloc == 0)
             return 
    true;                                        // `true` send to avoid WorldSession::SendTaxiMenu call with one more curlock seartch with same false result.
    @@ -202,+202,13 @@ void WorldSession::HandleMoveSplineDoneOpcode(WorldPacketrecvData)
         
    uint64 guid// used only for proper packet read
         
    recvData.readPackGUID(guid);
     
    +    
    // movement anticheat code
    +    const Unit *mover _player->m_mover;
    +    const 
    Player *plMover mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover NULL;
    +    if (!
    plMover)
    +        return;
    +    
    // end movement anticheat
    +
         
    MovementInfo movementInfo;                              // used only for proper packet read
         
    ReadMovementInfo(recvData, &movementInfo);
     
    @@ -
    214,10 +221,75 @@ void WorldSession::HandleMoveSplineDoneOpcode(WorldPacketrecvData)
     
         
    uint32 curDest GetPlayer()->m_taxi.GetTaxiDestination();
         if (!
    curDest)
    -        return;
    +    {
    +        
    // movement anticheat code
    +        GetPlayer()->UpdatePosition(movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), movementInfo.pos.GetPositionZ(), movementInfo.pos.GetOrientation());
    +        
    GetPlayer()->m_movementInfo movementInfo;
    +        
    GetPlayer()->SetUnitMovementFlags(movementInfo.flags);
    +
    +        
    // calc time deltas
    +        int32 cClientTimeDelta 0;
    +        if (
    GetPlayer()->m_anti_LastClientTime != 0)
    +        {
    +            
    cClientTimeDelta movementInfo.time GetPlayer()->m_anti_LastClientTime;
    +            
    GetPlayer()->m_anti_DeltaClientTime += cClientTimeDelta;
    +            
    GetPlayer()->m_anti_LastClientTime movementInfo.time;
    +        }
    +        else
    +            
    GetPlayer()->m_anti_LastClientTime movementInfo.time;
     
    -    
    TaxiNodesEntry const* curDestNode sTaxiNodesStore.LookupEntry(curDest);
    +        const 
    uint64 cServerTime getMSTime();
    +        
    uint32 cServerTimeDelta 0;
    +        if (
    GetPlayer()->m_anti_LastServerTime != 0)
    +        {
    +            
    cServerTimeDelta cServerTime GetPlayer()->m_anti_LastServerTime;
    +            
    GetPlayer()->m_anti_DeltaServerTime += cServerTimeDelta;
    +            
    GetPlayer()->m_anti_LastServerTime cServerTime;
    +        }
    +        else
    +            
    GetPlayer()->m_anti_LastServerTime cServerTime;
    +        
    // end movement anticheat
    +        return;
    +       }
    +    
    // movment anticheat
    +    const uint32 curloc =
    +    
    sObjectMgr->GetNearestTaxiNode(movementInfo.pos.GetPositionX(),movementInfo.pos.GetPositionY(),movementInfo.pos.GetPositionZ(),GetPlayer()->GetMapId(),GetPlayer()->GetTeam(), curDest);
    +    
    // end movement anticheat
    +
    +    
    // sLog.outBasic("AC2-%s > | xyzo: %f,%f,%fo(%f) flags[%X] | curloc: %d | destloc: %d ",
    +    // GetPlayer()->GetName(), movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o,
    +    // movementInfo.flags, curloc, curDest);
    +     TaxiNodesEntry const* curDestNode sTaxiNodesStore.LookupEntry(curDest);
    +    if (
    curDestNode && curDestNode->map_id == GetPlayer()->GetMapId())
    +        while (
    GetPlayer()->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE)
    +            
    GetPlayer()->GetMotionMaster()->MovementExpired(false);
    +
    +    
    // movement anticheat code
    +    GetPlayer()->UpdatePosition(movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), movementInfo.pos.GetPositionZ(), movementInfo.pos.GetOrientation());
    +    
    GetPlayer()->m_movementInfo movementInfo;
    +    
    GetPlayer()->SetUnitMovementFlags(movementInfo.flags);
    +    
    // calc time deltas
    +    int32 cClientTimeDelta 0;
    +    if (
    GetPlayer()->m_anti_LastClientTime != 0)
    +    {
    +        
    cClientTimeDelta movementInfo.time GetPlayer()->m_anti_LastClientTime;
    +        
    GetPlayer()->m_anti_DeltaClientTime += cClientTimeDelta;
    +        
    GetPlayer()->m_anti_LastClientTime movementInfo.time;
    +    }
    +    else
    +        
    GetPlayer()->m_anti_LastClientTime movementInfo.time;
     
    +    const 
    uint64 cServerTime getMSTime();
    +    
    uint32 cServerTimeDelta 0;
    +    if (
    GetPlayer()->m_anti_LastServerTime != 0)
    +    {
    +        
    cServerTimeDelta cServerTime GetPlayer()->m_anti_LastServerTime;
    +        
    GetPlayer()->m_anti_DeltaServerTime += cServerTimeDelta;
    +        
    GetPlayer()->m_anti_LastServerTime cServerTime;
    +    }
    +    else
    +        
    GetPlayer()->m_anti_LastServerTime cServerTime;
    +    
    // end movement anticheat
         // far teleport case
         
    if (curDestNode && curDestNode->map_id != GetPlayer()->GetMapId())
         {
    @@ -
    234,+306,23 @@ void WorldSession::HandleMoveSplineDoneOpcode(WorldPacketrecvData)
             }
             return;
         }
    +    
    // movement anticheat fix - disallow unmount from taxi
    +    if (curloc != curDest)
    +    {
    +         
    // current source node for next destination
    +        uint32 sourcenode GetPlayer()->m_taxi.GetTaxiSource();
    +        
    uint16 MountId sObjectMgr->GetTaxiMountDisplayId(sourcenodeGetPlayer()->GetTeam());
    +
    +        
    uint32 pathcost;
    +        
    sObjectMgr->GetTaxiPath(sourcenodecurDestpathcost);
    +
    +        if (
    path && MountId)
    +            
    SendDoFlight(MountIdpath1);                 // skip start fly node
    +        else
    +            
    GetPlayer()->m_taxi.ClearTaxiDestinations();    // clear problematic path and next
    +        return;
    +    }
    +    
    // end movement anticheat
     
         
    uint32 destinationnode GetPlayer()->m_taxi.NextTaxiDestination();
         if (
    destinationnode 0)                              // if more destinations to go
    diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
    index 7ad7b68
    ..542f726 100644
    --- a/src/server/game/World/World.cpp
    +++ b/src/server/game/World/World.cpp
    @@ -93,+93,11 @@ float World::m_MaxVisibleDistanceInBGArenas   DEFAULT_VISIBILITY_BGARENAS;
     
    int32 World::m_visibility_notify_periodOnContinents DEFAULT_VISIBILITY_NOTIFY_PERIOD;
     
    int32 World::m_visibility_notify_periodInInstances  DEFAULT_VISIBILITY_NOTIFY_PERIOD;
     
    int32 World::m_visibility_notify_periodInBGArenas   DEFAULT_VISIBILITY_NOTIFY_PERIOD;
    -
    +
    // movement anticheat
    +bool World::m_EnableMvAnticheat true;
    +
    uint32 World::m_TeleportToPlaneAlarms 50;
    +
    uint32 World::m_MistimingAlarms 200;
    +
    uint32 World::m_MistimingDelta 15000;
     
    /// World constructor
     
    World::World()
     {
    @@ -
    564,+568,41 @@ void World::LoadConfigSettings(bool reload)
             
    TC_LOG_ERROR("server.loading""DurabilityLossChance.Block (%f) must be >=0. Using 0.0 instead."rate_values[RATE_DURABILITY_LOSS_BLOCK]);
             
    rate_values[RATE_DURABILITY_LOSS_BLOCK] = 0.0f;
         }
    +    
    // movement anticheat
    +    m_EnableMvAnticheat sConfigMgr->GetBoolDefault("Anticheat.Movement.Enable"true);
    +    
    m_TeleportToPlaneAlarms sConfigMgr->GetIntDefault("Anticheat.Movement.TeleportToPlaneAlarms"50);
    +    if (
    m_TeleportToPlaneAlarms 20)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.TeleportToPlaneAlarms (%d) must be >= 20. Using 20 instead."m_TeleportToPlaneAlarms);
    +        
    m_TeleportToPlaneAlarms 20;
    +    }
    +    if (
    m_TeleportToPlaneAlarms 100)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.TeleportToPlaneAlarms (%d) must be <= 100. Using 100 instead."m_TeleportToPlaneAlarms);
    +        
    m_TeleportToPlaneAlarms 100;
    +    }
    +    
    m_MistimingDelta sConfigMgr->GetIntDefault("Anticheat.Movement.MistimingDelta"15000);
    +    if (
    m_MistimingDelta 5000)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.m_MistimingDelta (%d) must be >= 5000ms. Using 5000ms instead."m_MistimingDelta);
    +        
    m_MistimingDelta 5000;
    +    }
    +    if (
    m_MistimingDelta 50000)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.m_MistimingDelta (%d) must be <= 50000ms. Using 50000ms instead."m_MistimingDelta);
    +        
    m_MistimingDelta 50000;
    +    }
    +    
    m_MistimingAlarms sConfigMgr->GetIntDefault("Anticheat.Movement.MistimingAlarms"200);
    +    if (
    m_MistimingAlarms 100)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.MistimingAlarms (%d) must be >= 100. Using 100 instead."m_MistimingAlarms);
    +        
    m_MistimingAlarms 100;
    +    }
    +    if (
    m_MistimingAlarms 500)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.m_MistimingAlarms (%d) must be <= 500. Using 500 instead."m_MistimingAlarms);
    +        
    m_MistimingAlarms 500;
    +    }
         
    ///- Read other configuration items from the config file
     
         
    m_bool_configs[CONFIG_DURABILITY_LOSS_IN_PVP] = sConfigMgr->GetBoolDefault("DurabilityLoss.InPvP"false);
    diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
    index 9435fa8
    ..0466011 100644
    --- a/src/server/game/World/World.h
    +++ b/src/server/game/World/World.h
    @@ -711,+711,14 @@ class World
             
    static int32 GetVisibilityNotifyPeriodOnContinents(){ return m_visibility_notify_periodOnContinents; }
             static 
    int32 GetVisibilityNotifyPeriodInInstances() { return m_visibility_notify_periodInInstances;  }
             static 
    int32 GetVisibilityNotifyPeriodInBGArenas()  { return m_visibility_notify_periodInBGArenas;   }
    +        
    // movement anticheat
    +        static bool GetEnableMvAnticheat()       { return m_EnableMvAnticheat;     }
    +        static 
    uint32 GetTeleportToPlaneAlarms() { return m_TeleportToPlaneAlarms; }
    +        static 
    uint32 GetMistimingDelta()        { return m_MistimingDelta;        }
    +        static 
    uint32 GetMistimingAlarms()       { return m_MistimingAlarms;       }
    +        static 
    uint32 GetTeleportToPlanePenalty() { return m_TeleportToPlanePenalty;}
    +        static 
    uint32 GetMovementPenalty()        { return m_MovementPenalty;       }
    +        
    // end movement anticheat
     
             
    void ProcessCliCommands();
             
    void QueueCliCommand(CliCommandHoldercommandHolder) { cliCmdQueue.add(commandHolder); }
    @@ -
    817,+825,13 @@ class World
             
    static int32 m_visibility_notify_periodOnContinents;
             static 
    int32 m_visibility_notify_periodInInstances;
             static 
    int32 m_visibility_notify_periodInBGArenas;
    -
    +        
    // movement anticheat enable flag
    +        static bool m_EnableMvAnticheat;
    +        static 
    uint32 m_TeleportToPlaneAlarms;
    +        static 
    uint32 m_TeleportToPlanePenalty;
    +        static 
    uint32 m_MovementPenalty;
    +        static 
    uint32 m_MistimingDelta;
    +        static 
    uint32 m_MistimingAlarms;
             
    // CLI command holder to be thread safe
             
    ACE_Based::LockedQueue<CliCommandHolder*, ACE_Thread_MutexcliCmdQueue;
     
    diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
    index 23db333
    ..79bd72f 100644
    --- a/src/server/worldserver/worldserver.conf.dist
    +++ b/src/server/worldserver/worldserver.conf.dist
    @@ -1124,+1124,47 @@ DungeonFinder.OptionsMask 1
     DBC
    .EnforceItemAttributes 1
     
     
    #
    +#    Anticheat.Movement.Enable
    +#        Enable Movement Anticheat
    +#        Default: 1 - on
    +#                 0 - off
    +#
    +
    +
    Anticheat.Movement.Enable 1
    +
    +
    #        Default:     0 - (Disabled, Logging only)
    +#                     1 - (Kick)
    +#                     2 - (Ban)
    +
    +
    Anticheat.Movement.Action 0
    +
    +
    #
    +#    Anticheat.Movement.TeleportToPlaneAlarms
    +#        maximum alarms before logging mode will be switched from debug to error (default 50, allowed 20 - 100)
    +#
    +
    +
    Anticheat.Movement.TeleportToPlaneAlarms 50
    +
    +
    #        Default:     0 - (Disabled, Logging only)
    +#                     1 - (Kick)
    +#                     2 - (Ban)
    +
    +
    Anticheat.Movement.TeleportToPlaneAlarms 0
    +
    +
    #
    +#    Anticheat.Movement.MistimingDelta
    +#        mistiming intelval between client and serverside (default 15000 ms, allowed 5000 - 50000 ms)
    +#
    +
    +
    Anticheat.Movement.MistimingDelta 15000
    +
    +
    #
    +#    Anticheat.Movement.MistimingAlarms
    +#        mistiming alarms before logging mode will be switched from debug to error (default 200, allowed 100 - 500)
    +#
    +
    +
    Anticheat.Movement.MistimingAlarms 200
    +
     
    #   AccountInstancesPerHour
     #        Description: Controls the max amount of different instances player can enter within hour
     #        Default:     5
    @@ -2708,+2749,@@ Appender.DBErrors=2,2,0,DBErrors.log
     Appender
    .Server=2,2,0,Server.log,w
     Appender
    .GM=2,2,15,gm/gm_%s.log
     Appender
    .DBErrors=2,2,0,DBErrors.log
    +Appender.Cheat=2,4,1,Cheat.log
     
     
    #  Logger config values: Given a logger "name"
     #    Logger.name
    @@ -2796,+2838,@@ Logger.DBErrors=26,5,Console Server DBErrors
     
    #Logger.chat.log=3,Console Server
     #Logger.calendar=3,Console Server
     #Logger.chat.system=3,Console Server
    -#Logger.cheat=3,Console Server
    +Logger.cheat=3,Console Cheat
     
    #Logger.commands.ra=3,Console Server
     #Logger.condition=3,Console Server
     #Logger.entities.pet=3,Console Server 

    کاربر مقابل پست Ezio عزیز را پسندیده است:

    iceboy (04-25-2015)

    مردم دنیا زمان رو 3 حالت می بینن

    اما ما ایرانیا 4 حالت:

    زمان گذشته ، زمان حال ، زمان آینده ، زمـــان شـــــــاہ.....!!!!

    Hamed.Wower@yahoo.com

  5. #4
    دستاورد ها:
    1 سال ثبت نام شده استبرچسب زن کلاس اول۱۰۰۰ امتیازاوردرایو

    شماره عضویت
    170
    تاریخ عضویت
    Feb 2015
    محل سکونت
    Iran-Tabriz
    نوشته ها
    202
    نسل
    نسل مورد علاقه
    نژاد
    نژاد  مورد علاقه
    کلاس
     کلاس  مورد علاقه
    سورس
     سورس مورد علاقه
    پچ
    پچ مورد علاقه
    پسندیده : 124
    مورد پسند : 60 بار در 43 پست
    سیستم عامل و مرورگر:
    نقل قول نوشته اصلی توسط Hamed_Ezio نمایش پست ها
    خدمت شما اینم انتی چیت رایگان AC2

    کد PHP:

    diff 
    --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
    index 40dbe6c
    ..3ee86e8 100644
    --- a/src/server/game/Entities/Player/Player.cpp
    +++ b/src/server/game/Entities/Player/Player.cpp
    @@ -775,+775,26 @@ Player::Player(WorldSessionsession): Unit(true)
         
    rest_type=REST_TYPE_NO;
         
    ////////////////////Rest System/////////////////////
     
    +    // movement anticheat
    +    m_anti_LastClientTime  0;          // last movement client time
    +    m_anti_LastServerTime  0;          // last movement server time
    +    m_anti_DeltaClientTime 0;          // client side session time
    +    m_anti_DeltaServerTime 0;          // server side session time
    +    m_anti_MistimingCount  0;          // mistiming count
    +
    +    
    m_anti_LastSpeedChangeTime 0;      // last speed change time
    +
    +    
    m_anti_Last_HSpeed =  7.0f;          // horizontal speed, default RUN speed
    +    m_anti_Last_VSpeed = -2.3f;          // vertical speed, default max jump height
    +
    +    
    m_anti_TeleToPlane_Count 0;        // Teleport To Plane alarm counter
    +
    +    
    m_anti_AlarmCount 0;               // alarm counter
    +
    +    
    m_anti_JumpCount 0;                // Jump already began, anti air jump check
    +    m_anti_JumpBaseZ 0;                // Z coord before jump (AntiGrav)
    +    // end movement anticheat
    +
         
    m_mailsLoaded false;
         
    m_mailsUpdated false;
         
    unReadMails 0;
    @@ -
    2156,+2176,@@ bool Player::TeleportTo(uint32 mapidfloat xfloat yfloat zfloat orientati
     
         
    if (GetMapId() == mapid)
         {
    +        
    m_anti_JumpBaseZ 0;
             
    //lets reset far teleport flag if it wasn't reset during chained teleports
             
    SetSemaphoreTeleportFar(false);
             
    //setup delayed teleport flag
    @@ -2305,+2326,@@ bool Player::TeleportTo(uint32 mapidfloat xfloat yfloat zfloat orientati
     
                 m_teleport_dest 
    WorldLocation(mapidxyzorientation);
                 
    SetFallInformation(0z);
    +            
    m_anti_JumpBaseZ 0;
                 
    // if the player is saved before worldportack (at logout for example)
                 // this will be used instead of the current location in SaveToDB
     
    diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
    index fee542a
    ..19287d1 100644
    --- a/src/server/game/Entities/Player/Player.h
    +++ b/src/server/game/Entities/Player/Player.h
    @@ -2520,+2520,26 @@ class Player : public Unit, public GridObject<Player>
             
    float m_rest_bonus;
             
    RestType rest_type;
             
    ////////////////////Rest System/////////////////////
    +        // movement anticheat
    +        time_t m_anti_LastClientTime;           // last movement client time
    +        time_t m_anti_LastServerTime;           // last movement server time
    +        time_t m_anti_DeltaClientTime;          // client side session time
    +        time_t m_anti_DeltaServerTime;          // server side session time
    +        uint32 m_anti_MistimingCount;           // mistiming count
    +
    +        
    time_t m_anti_LastSpeedChangeTime;      // last speed change time
    +
    +        
    float m_anti_Last_HSpeed;               // horizontal speed, default RUN speed
    +        float m_anti_Last_VSpeed;               // vertical speed, default max jump height
    +
    +        
    uint32 m_anti_TeleToPlane_Count;        // Teleport To Plane alarm counter
    +
    +        
    uint64 m_anti_AlarmCount;               // alarm counter
    +
    +        
    uint16 m_anti_JumpCount;                // Jump already began, anti air jump check
    +        float m_anti_JumpBaseZ;                 // Z coord before jump
    +        // end movement anticheat
    +
             
    uint32 m_resetTalentsCost;
             
    time_t m_resetTalentsTime;
             
    uint32 m_usedTalentCount;
    diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
    index 25352a9
    ..64d6e80 100644
    --- a/src/server/game/Entities/Unit/Unit.h
    +++ b/src/server/game/Entities/Unit/Unit.h
    @@ -2131,+2131,@@ class Unit : public WorldObject
         
    protected:
             
    explicit Unit (bool isWorldObject);
     
    +        
    GameObjectm_temp_transport;
             
    void BuildValuesUpdate(uint8 updatetypeByteBufferdataPlayertarget) const;
     
             
    UnitAIi_AI, *i_disabledAI;
    diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
    index 2f309c0
    ..81324e7 100644
    --- a/src/server/game/Globals/ObjectMgr.cpp
    +++ b/src/server/game/Globals/ObjectMgr.cpp
    @@ -5489,+5489,@@ void ObjectMgr::LoadAreaTriggerScripts()
         
    TC_LOG_INFO("server.loading"">> Loaded %u areatrigger scripts in %u ms"countGetMSTimeDiffToNow(oldMSTime));
     }
     
    -
    uint32 ObjectMgr::GetNearestTaxiNode(float xfloat yfloat zuint32 mapiduint32 team)
    +
    // use searched_node for search some known node
    +uint32 ObjectMgr::GetNearestTaxiNode(float xfloat yfloat zuint32 mapiduint32 teamuint32 searched_node)
     {
         
    bool found false;
         
    float dist 10000;
    @@ -
    5499,+5500,18 @@ uint32 ObjectMgr::GetNearestTaxiNode(float xfloat yfloat zuint32 mapidui
         
    {
             
    TaxiNodesEntry const* node sTaxiNodesStore.LookupEntry(i);
     
    -        if (!
    node || node->map_id != mapid || (!node->MountCreatureID[team == ALLIANCE 0] && node->MountCreatureID[0] != 32981)) // dk flight
    +        if (!node || node->map_id != mapid) continue;
    +
    +        const 
    float dist2 pow(node->x2) + pow(node->y2) + pow(node->z2);
    +
    +        if (
    searched_node != && == searched_node)
    +        {
    +            
    id i;
    +            
    dist dist2;
    +            break;
    +        }
    +
    +        if (!
    node->MountCreatureID[team == ALLIANCE 0] && node->MountCreatureID[0] != 32981// dk flight
                 
    continue;
     
             
    uint8  field   = (uint8)((1) / 32);
    @@ -
    5509,+5521,@@ uint32 ObjectMgr::GetNearestTaxiNode(float xfloat yfloat zuint32 mapidui
             
    if ((sTaxiNodesMask[field] & submask) == 0)
                 continue;
     
    -        
    float dist2 = (node->x)*(node->x)+(node->y)*(node->y)+(node->z)*(node->z);
    +        
    //float dist2 = (node->x - x)*(node->x - x)+(node->y - y)*(node->y - y)+(node->z - z)*(node->z - z);
             
    if (found)
             {
                 if (
    dist2 dist)
    @@ -
    5525,+5537,@@ uint32 ObjectMgr::GetNearestTaxiNode(float xfloat yfloat zuint32 mapidui
                 id 
    i;
             }
         }
    -
    +    
    // movement anticheat fix
    +    if (dist 3600id 0;
    +    
    // movement anticheat fix
         
    return id;
     }
     
    diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
    index 752cc3b
    ..6d2aaac 100644
    --- a/src/server/game/Globals/ObjectMgr.h
    +++ b/src/server/game/Globals/ObjectMgr.h
    @@ -736,+736,@@ class ObjectMgr
             uint32 GetPlayerAccountIdByGUID
    (uint64 guid) const;
             
    uint32 GetPlayerAccountIdByPlayerName(std::string const& name) const;
     
    -        
    uint32 GetNearestTaxiNode(float xfloat yfloat zuint32 mapiduint32 team);
    +        
    uint32 GetNearestTaxiNode(float xfloat yfloat zuint32 mapiduint32 teamuint32 searched_node);
             
    void GetTaxiPath(uint32 sourceuint32 destinationuint32 &pathuint32 &cost);
             
    uint32 GetTaxiMountDisplayId(uint32 iduint32 teambool allowed_alt_team false);
     
    diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
    index 36d1e1c
    ..1916897 100644
    --- a/src/server/game/Handlers/MovementHandler.cpp
    +++ b/src/server/game/Handlers/MovementHandler.cpp
    @@ -30,+30,14 @@
     
    #include "WaypointMovementGenerator.h"
     #include "InstanceSaveMgr.h"
     #include "ObjectMgr.h"
    +#include "World.h"
    +#include "WardenWin.h"
    +#include "Appender.h"
    +
    +
    // Movement anticheat defines
    +//#define ANTICHEAT_DEBUG
    +#define ANTICHEAT_EXCEPTION_INFO
    +// End Movement anticheat defines
     
     #define MOVEMENT_PACKET_TIME_DELAY 0
     
    @@ -203,36 +211,36 @@ void WorldSession::HandleMoveTeleportAck(WorldPacketrecvData)
         
    TC_LOG_DEBUG("network""Guid " UI64FMTDguid);
         
    TC_LOG_DEBUG("network""Flags %u, time %u"flagstime/IN_MILLISECONDS);
     
    -    
    PlayerplMover _player->m_mover->ToPlayer();
    +    
    PlayerplrMover _player->m_mover->ToPlayer();
     
    -    if (!
    plMover || !plMover->IsBeingTeleportedNear())
    +    if (!
    plrMover || !plrMover->IsBeingTeleportedNear())
             return;
     
    -    if (
    guid != plMover->GetGUID())
    +    if (
    guid != plrMover->GetGUID())
             return;
     
    -    
    plMover->SetSemaphoreTeleportNear(false);
    +    
    plrMover->SetSemaphoreTeleportNear(false);
     
    -    
    uint32 old_zone plMover->GetZoneId();
    +    
    uint32 old_zone plrMover->GetZoneId();
     
    -    
    WorldLocation const& dest plMover->GetTeleportDest();
    +    
    WorldLocation const& dest plrMover->GetTeleportDest();
     
    -    
    plMover->UpdatePosition(desttrue);
    +    
    plrMover->UpdatePosition(desttrue);
     
         
    uint32 newzonenewarea;
    -    
    plMover->GetZoneAndAreaId(newzonenewarea);
    -    
    plMover->UpdateZone(newzonenewarea);
    +    
    plrMover->GetZoneAndAreaId(newzonenewarea);
    +    
    plrMover->UpdateZone(newzonenewarea);
     
         
    // new zone
         
    if (old_zone != newzone)
         {
             
    // honorless target
    -        if (plMover->pvpInfo.IsHostile)
    -            
    plMover->CastSpell(plMover2479true);
    +        if (
    plrMover->pvpInfo.IsHostile)
    +            
    plrMover->CastSpell(plrMover2479true);
     
             
    // in friendly area
    -        else if (plMover->IsPvP() && !plMover->HasFlag(PLAYER_FLAGSPLAYER_FLAGS_IN_PVP))
    -            
    plMover->UpdatePvP(falsefalse);
    +        else if (
    plrMover->IsPvP() && !plrMover->HasFlag(PLAYER_FLAGSPLAYER_FLAGS_IN_PVP))
    +            
    plrMover->UpdatePvP(falsefalse);
         }
     
         
    // resummon pet
    @@ -242,+250,@@ void WorldSession::HandleMoveTeleportAck(WorldPacketrecvData)
         
    GetPlayer()->ProcessDelayedOperations();
     }
     
    -
    void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
    +
    void WorldSession::HandleMovementOpcodes(WorldPacket recvData)
     {
         
    uint16 opcode recvData.GetOpcode();
     
    @@ -
    250,+258,13 @@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
     
         
    ASSERT(mover != NULL);                      // there must always be a mover
     
    -    PlayerplrMover mover->ToPlayer();
    +    
    PlayerplrMover mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover NULL;
    +    
    VehiclevehMover mover->GetVehicleKit();
    +    if (
    vehMover)
    +        if (
    mover->HasFlag(UNIT_FIELD_FLAGSUNIT_FLAG_PLAYER_CONTROLLED))
    +            if (
    Unitcharmer mover->GetCharmer())
    +                if (
    charmer->GetTypeId() == TYPEID_PLAYER)
    +                    
    plrMover = (Player*)charmer;
     
         
    // ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck
         
    if (plrMover && plrMover->IsBeingTeleported())
    @@ -
    299,+313,@@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
             }
     
             
    // if we boarded a transport, add us to it
    -        if (plrMover)
    +        if (
    plrMover && !plrMover->m_transport && !plrMover->m_temp_transport)
             {
                 if (!
    plrMover->GetTransport())
                 {
    @@ -
    326,25 +340,40 @@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
                         
    movementInfo.transport.Reset();
                     }
                 }
    +            if (!
    plrMover->m_transport)
    +                if (
    Map *tempMap mover->GetMap())
    +                    if (
    GameObject *tempTransport tempMap->GetGameObject(movementInfo.transport.guid))
    +                        if (
    tempTransport->IsTransport())
    +                            
    plrMover->m_temp_transport tempTransport;
             }
     
    -        if (!
    mover->GetTransport() && !mover->GetVehicle())
    +        if ((!
    plrMover && !mover->GetTransport() && !mover->GetVehicle()) || (plrMover && !plrMover->m_vehicle && !plrMover->m_transport && !plrMover->m_temp_transport)) // Not sure if the first part is needed. Just added it for verbosity.
             
    {
                 
    GameObjectgo mover->GetMap()->GetGameObject(movementInfo.transport.guid);
                 if (!
    go || go->GetGoType() != GAMEOBJECT_TYPE_TRANSPORT)
                     
    movementInfo.flags &= ~MOVEMENTFLAG_ONTRANSPORT;
             }
         }
    -    else if (
    plrMover && plrMover->GetTransport())                // if we were on a transport, leave
    +    else if (plrMover && (plrMover->m_transport || plrMover->m_temp_transport)) // if we were on a transport, leave
         
    {
    -        
    plrMover->m_transport->RemovePassenger(plrMover);
    -        
    plrMover->m_transport NULL;
    -        
    movementInfo.transport.Reset();
    +        if (
    plrMover->m_transport)
    +        {
    +            
    plrMover->m_transport->RemovePassenger(plrMover);
    +            
    plrMover->m_transport NULL;
    +        }
    +        
    plrMover->m_temp_transport NULL;
    +        
    movementInfo.transport.Reset();
         }
     
         
    // fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map).
         
    if (opcode == MSG_MOVE_FALL_LAND && plrMover && !plrMover->IsInFlight())
    -        
    plrMover->HandleFall(movementInfo);
    +    {
    +        
    // movement anticheat
    +        plrMover->m_anti_JumpCount 0;
    +        
    plrMover->m_anti_JumpBaseZ 0;
    +        if (!
    vehMover)
    +            
    plrMover->HandleFall(movementInfo);
    +    }
     
         if (
    plrMover && ((movementInfo.flags MOVEMENTFLAG_SWIMMING) != 0) != plrMover->IsInWater())
         {
    @@ -
    356,+388,348 @@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
         
    /*----------------------*/
         
    if (m_clientTimeDelay == 0)
             
    m_clientTimeDelay mstime movementInfo.time;
    +    
    // begin anti cheat
    +    bool check_passed true;
    +    
    #ifdef ANTICHEAT_DEBUG
    +   TC_LOG_WARN("cheat""AC2-%s > time: %d fall-time: %d | xyzo: %f, %f, %fo(%f) flags[%X] opcode[%s] | transport (xyzo): %f, %f, %fo(%f)",
    +       
    plrMover->GetName(), movementInfo.timemovementInfo.fallTimemovementInfo.pos.m_positionXmovementInfo.pos.m_positionYmovementInfo.pos.m_positionZmovementInfo.pos.m_orientation,
    +    
    movementInfo.flagsLookupOpcodeName(opcode), movementInfo.transport.pos.m_positionXmovementInfo.transport.pos.m_positionYmovementInfo.transport.pos.m_positionZmovementInfo.transport.pos.m_orientation);
    +    
    TC_LOG_WARN("cheat""AC2-%s Transport > GUID: (low)%d - (high)%d",
    +        
    plrMover->GetName(), GUID_LOPART(movementInfo.transport.guid), GUID_HIPART(movementInfo.transport.guid));
    +    
    #endif
    +
    +    if (
    plrMover)
    +    {
    +        if (
    World::GetEnableMvAnticheat() && !plrMover->IsGameMaster() && !plrMover->GetCharmerOrOwnerPlayerOrPlayerItself()->IsGameMaster() && !plrMover->GetCharmerOrOwnerPlayerOrPlayerItself()->GetVehicle())
    +        {
    +            
    // calc time deltas
    +            int32 cClientTimeDelta 1500;
    +            if (
    plrMover->m_anti_LastClientTime != 0)
    +            {
    +                
    cClientTimeDelta movementInfo.time plrMover->m_anti_LastClientTime;
    +                
    plrMover->m_anti_DeltaClientTime += cClientTimeDelta;
    +                
    plrMover->m_anti_LastClientTime movementInfo.time;
    +            }
    +            else
    +                
    plrMover->m_anti_LastClientTime movementInfo.time;
    +
    +            const 
    uint64 cServerTime getMSTime();
    +            
    uint32 cServerTimeDelta 1500;
    +            if (
    plrMover->m_anti_LastServerTime != 0)
    +            {
    +                
    cServerTimeDelta cServerTime plrMover->m_anti_LastServerTime;
    +                
    plrMover->m_anti_DeltaServerTime += cServerTimeDelta;
    +                
    plrMover->m_anti_LastServerTime cServerTime;
    +            }
    +            else
    +                
    plrMover->m_anti_LastServerTime cServerTime;
    +
    +            
    // resync times on client login (first 15 sec for heavy areas)
    +            if (plrMover->m_anti_DeltaServerTime 15000 && plrMover->m_anti_DeltaClientTime 15000)
    +                
    plrMover->m_anti_DeltaClientTime plrMover->m_anti_DeltaServerTime;
    +
    +            const 
    int32 sync_time plrMover->m_anti_DeltaClientTime plrMover->m_anti_DeltaServerTime;
    +
    +            
    #ifdef ANTICHEAT_DEBUG
    +            TC_LOG_WARN("cheat""AC2-%s Time > cClientTimeDelta: %d, cServerTime: %d | deltaC: %d - deltaS: %d | SyncTime: %d"plrMover->GetName(), cClientTimeDeltacServerTimeplrMover->m_anti_DeltaClientTimeplrMover->m_anti_DeltaServerTimesync_time);
    +            
    #endif
    +
    +            
    // mistiming checks
    +            const int32 GetMistimingDelta abs(int32(World::GetMistimingDelta()));
    +            if (
    sync_time GetMistimingDelta)
    +            {
    +                
    cClientTimeDelta cServerTimeDelta;
    +                ++(
    plrMover->m_anti_MistimingCount);
    +
    +                const 
    bool bMistimingModulo plrMover->m_anti_MistimingCount 50 == 0;
    +
    +                if (
    bMistimingModulo)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                    TC_LOG_WARN("cheat""AC2-%s, mistiming exception #%d, mistiming: %dms Action: %s"plrMover->GetName().c_str(),  plrMover->m_anti_MistimingCountsync_time, &Warden::Penalty);
    +                    
    #endif
    +                    check_passed false;
    +                }
    +                
    //if (vehMover)
    +                //    vehMover->Die();
    +                // Tell the player "Sure, you can fly!"
    +                {
    +                    
    WorldPacket data(SMSG_MOVE_SET_CAN_FLY12);
    +                    
    data.append(plrMover->GetPackGUID());
    +                    
    data << uint32(0);
    +                    
    SendPacket(&data);
    +                }
    +                
    // Then tell the player "Wait, no, you can't."
    +                {
    +                    
    WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY12);
    +                    
    data.append(plrMover->GetPackGUID());
    +                    
    data << uint32(0);
    +                    
    SendPacket(&data);
    +                }
    +                
    //plrMover->FallGround(2);
    +
    +                
    /* Disabled, not passive at all, and apparently causing crashes:
    +                if (plrMover->m_anti_MistimingCount > World::GetMistimingAlarms())
    +                {
    +                    sWorld.SendWorldText(3, strcat("Kicking cheater: ", plrMover->GetName()));
    +                    KickPlayer();
    +                    return;
    +                } */
    +            }
    +            
    // end mistiming checks
    +
    +            const 
    uint32 curDest plrMover->m_taxi.GetTaxiDestination(); // check taxi flight
    +            if (!curDest)
    +            {
    +                
    UnitMoveType move_type;
    +
    +                
    // calculating section
    +                // current speed
    +                if (movementInfo.flags MOVEMENTFLAG_FLYING)
    +                    
    move_type movementInfo.flags MOVEMENTFLAG_BACKWARD MOVE_FLIGHT_BACK MOVE_FLIGHT;
    +                else if (
    movementInfo.flags MOVEMENTFLAG_SWIMMING)
    +                    
    move_type movementInfo.flags MOVEMENTFLAG_BACKWARD MOVE_SWIM_BACK MOVE_SWIM;
    +                else if (
    movementInfo.flags MOVEMENTFLAG_WALKING)
    +                    
    move_type MOVE_WALK;
    +                
    // hmm... in first time after login player has MOVE_SWIMBACK instead MOVE_WALKBACK
    +                else
    +                    
    move_type movementInfo.flags MOVEMENTFLAG_BACKWARD MOVE_SWIM_BACK MOVE_RUN;
    +
    +                const 
    float current_speed mover->GetSpeed(move_type);
    +                
    // end current speed
    +
    +                
    // movement distance
    +                const float delta_x plrMover->m_transport || plrMover->m_temp_transport plrMover->GetPositionX() - movementInfo.pos.GetPositionX();
    +                const 
    float delta_y plrMover->m_transport || plrMover->m_temp_transport plrMover->GetPositionY() - movementInfo.pos.GetPositionY();
    +                const 
    float delta_z plrMover->m_transport || plrMover->m_temp_transport plrMover->GetPositionZ() - movementInfo.pos.GetPositionZ();
    +                const 
    float real_delta plrMover->m_transport || plrMover->m_temp_transport pow(delta_x2) + pow(delta_y2);
    +                
    // end movement distance
    +
    +                const 
    bool no_fly_auras = !(plrMover->HasAuraType(SPELL_AURA_FLY) || plrMover->HasAuraType(SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED)
    +                    || 
    plrMover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) || plrMover->HasAuraType(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED)
    +                    || 
    plrMover->HasAuraType(SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS) || plrMover->HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK));
    +                const 
    bool no_fly_flags = (movementInfo.flags & (MOVEMENTFLAG_CAN_FLY MOVEMENTFLAG_FLYING)) == 0;
    +
    +                const 
    bool no_swim_flags = (movementInfo.flags MOVEMENTFLAG_SWIMMING) == 0;
    +                const 
    bool no_swim_in_water = !mover->IsInWater();
    +                const 
    bool no_swim_above_water movementInfo.pos.GetPositionZ()-7.0f >= mover->GetBaseMap()->GetWaterLevel(movementInfo.pos.GetPositionX(),movementInfo.pos.GetPositionY());
    +                const 
    bool no_swim_water no_swim_in_water && no_swim_above_water;
    +
    +                const 
    bool no_waterwalk_flags = (movementInfo.flags MOVEMENTFLAG_WATERWALKING) == 0;
    +                const 
    bool no_waterwalk_auras = !(plrMover->HasAuraType(SPELL_AURA_WATER_WALK) || plrMover->HasAuraType(SPELL_AURA_GHOST));
    +
    +                if (
    cClientTimeDelta 0)
    +                    
    cClientTimeDelta 0;
    +                const 
    float time_delta cClientTimeDelta 1500 float(cClientTimeDelta)/1000.0f 1.5f// normalize time - 1.5 second allowed for heavy loaded server
    +
    +                const 
    float tg_z = (real_delta != && no_fly_auras && no_swim_flags) ? (pow(delta_z2) / real_delta) : -99999// movement distance tangents
    +
    +                if (
    current_speed plrMover->m_anti_Last_HSpeed && plrMover->m_anti_LastSpeedChangeTime == 0)
    +                    
    plrMover->m_anti_LastSpeedChangeTime movementInfo.time uint32(floor(((plrMover->m_anti_Last_HSpeed current_speed) * 1500)) + 100); // 100ms above for random fluctuation
    +
    +                const 
    float allowed_delta plrMover->m_transport || plrMover->m_temp_transport // movement distance allowed delta
    +                    pow(std::max(current_speedplrMover->m_anti_Last_HSpeed) * time_delta2)
    +                    + 
    2                                                                             // minimum allowed delta
    +                    + (tg_z 2.2 pow(delta_z2)/2.37f 0);                                     // mountain fall allowed delta
    +
    +                if (
    movementInfo.time plrMover->m_anti_LastSpeedChangeTime)
    +                {
    +                    
    plrMover->m_anti_Last_HSpeed current_speed;                                    // store current speed
    +                    plrMover->m_anti_Last_VSpeed = -2.3f;
    +                    
    plrMover->m_anti_LastSpeedChangeTime 0;
    +                }
    +                
    // end calculating section
    +
    +                
    // AntiGravity (thanks to Meekro)
    +                const float JumpHeight plrMover->m_anti_JumpBaseZ movementInfo.pos.GetPositionZ();
    +                if (
    no_fly_auras && no_swim_in_water && plrMover->m_anti_JumpBaseZ != && JumpHeight plrMover->m_anti_Last_VSpeed)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                    TC_LOG_WARN("cheat""AC2-%s, AntiGravity exception. JumpHeight = %f, Allowed Vertical Speed = %f",
    +                        
    plrMover->GetName().c_str(), JumpHeightplrMover->m_anti_Last_VSpeed);
    +                    
    #endif
    +                    check_passed false;
    +                    
    //if (vehMover)
    +                    //    vehMover->Die();
    +                    // Tell the player "Sure, you can fly!"
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_SET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    // Then tell the player "Wait, no, you can't."
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    //plrMover->FallGround(2);
    +                }
    +
    +                
    // multi jump checks
    +                if (opcode == MSG_MOVE_JUMP)
    +                {
    +                    if (
    no_fly_auras && no_swim_water)
    +                    {
    +                        if (
    plrMover->m_anti_JumpCount >= 1)
    +                        {
    +                            
    // don't process new jump packet
    +                            check_passed false;
    +                            
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                            TC_LOG_WARN("cheat""AC2-%s, Multijump exception."plrMover->GetName().c_str(), JumpHeightplrMover->m_anti_Last_VSpeed);
    +                            
    #endif
    +                            //if (vehMover)
    +                            //    vehMover->Die();
    +                            // Tell the player "Sure, you can fly!"
    +                            {
    +                                
    WorldPacket data(SMSG_MOVE_SET_CAN_FLY12);
    +                                
    data.append(plrMover->GetPackGUID());
    +                                
    data << uint32(0);
    +                                
    SendPacket(&data);
    +                            }
    +                            
    // Then tell the player "Wait, no, you can't."
    +                            {
    +                                
    WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY12);
    +                                
    data.append(plrMover->GetPackGUID());
    +                                
    data << uint32(0);
    +                                
    SendPacket(&data);
    +                            }
    +                            
    //plrMover->FallGround(2);
    +                            plrMover->m_anti_JumpCount 0;
    +                        }
    +                        else
    +                        {
    +                            
    plrMover->m_anti_JumpCount += 1;
    +                            
    plrMover->m_anti_JumpBaseZ movementInfo.pos.GetPositionZ();
    +                        }
    +                    } else
    +                        
    plrMover->m_anti_JumpCount 0;
    +                }
    +
    +                
    // speed and teleport hack checks
    +                if (real_delta allowed_delta)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                    if (real_delta 4900.0f)
    +                    {
    +                        
    TC_LOG_WARN("cheat""AC2-%s, speed exception | cDelta=%f aDelta=%f | cSpeed=%f lSpeed=%f deltaTime=%f"plrMover->GetName().c_str(), real_deltaallowed_deltacurrent_speedplrMover->m_anti_Last_HSpeedtime_delta);
    +                    } else {
    +                        
    TC_LOG_WARN("cheat""AC2-%s, teleport exception | cDelta=%f aDelta=%f | cSpeed=%f lSpeed=%f deltaTime=%f"plrMover->GetName().c_str(), real_deltaallowed_deltacurrent_speedplrMover->m_anti_Last_HSpeedtime_delta);
    +                    }
    +                    
    #endif
    +                    check_passed false;
    +                    
    //if (vehMover)
    +                    //    vehMover->Die();
    +                    //plrMover->FallGround(2);
    +                }
    +
    +                
    // mountain hack checks // 1.56f (delta_z < GetPlayer()->m_anti_Last_VSpeed))
    +                if (delta_z plrMover->m_anti_Last_VSpeed && plrMover->m_anti_JumpCount == && tg_z 2.37f)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                    TC_LOG_WARN("cheat""AC2-%s, mountain exception | tg_z=%f"plrMover->GetName().c_str(), tg_z);
    +                    
    #endif
    +                    check_passed false;
    +                
    //    if (vehMover)
    +                //        vehMover->Die();
    +                }
     
    -    
    /* process position-change */
    +                // Fly hack checks
    +                if (no_fly_auras && !no_fly_flags)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO // Aura numbers: 201, 206, 207, 208, 209, 211
    +                    TC_LOG_WARN("cheat""AC2-%s, flight exception. {SPELL_AURA_FLY=[%X]} {SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED=[%X]} {SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED=[%X]} {SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS=[%X]} {SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK=[%X]} {plrMover->GetVehicle()=[%X]}",
    +                        
    plrMover->GetName().c_str(),
    +                        
    plrMover->HasAuraType(SPELL_AURA_FLY), plrMover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED),
    +                        
    plrMover->HasAuraType(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED), plrMover->HasAuraType(SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS),
    +                        
    plrMover->HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK), plrMover->GetVehicle());
    +                    
    #endif
    +                    check_passed false;
    +                    
    //if (vehMover)
    +                    //    vehMover->Die();
    +                    // Tell the player "Sure, you can fly!"
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_SET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    // Then tell the player "Wait, no, you can't."
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    //plrMover->FallGround(2);
    +                }
    +
    +                
    // Waterwalk checks
    +                if (no_waterwalk_auras && !no_waterwalk_flags)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                    TC_LOG_WARN("cheat""AC2-%s, waterwalk exception. [%X]{SPELL_AURA_WATER_WALK=[%X]}",
    +                        
    plrMover->GetName().c_str(), movementInfo.flagsplrMover->HasAuraType(SPELL_AURA_WATER_WALK));
    +                    
    #endif
    +                    check_passed false;
    +                    
    //if (vehMover)
    +                    //    vehMover->Die();
    +                    // Tell the player "Sure, you can fly!"
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_SET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    // Then tell the player "Wait, no, you can't."
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    //plrMover->FallGround(2);
    +                }
    +
    +                
    // Teleport To Plane checks
    +                if (no_swim_in_water && movementInfo.pos.GetPositionZ() < 0.0001f && movementInfo.pos.GetPositionZ() > -0.0001f)
    +                {
    +                    if (const 
    Map *map plrMover->GetMap())
    +                    {
    +                        
    float plane_z map->GetHeight(movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), MAX_HEIGHT) - movementInfo.pos.GetPositionZ();
    +                        
    plane_z = (plane_z < -500.0f) ? 0.0f plane_z// check holes in height map
    +                        if (plane_z 0.1f || plane_z < -0.1f)
    +                        {
    +                            
    #ifdef ANTICHEAT_DEBUG
    +                            TC_LOG_WARN("cheat""AC2-%s, teleport to plane exception. plane_z: %f"plrMover->GetName(), plane_z);
    +                            
    #endif
    +                            #ifdef ANTICHEAT_EXCEPTION_INFO
    +                            if (plrMover->m_anti_TeleToPlane_Count World::GetTeleportToPlaneAlarms())
    +                            {
    +                                
    TC_LOG_WARN("cheat""AC2-%s, teleport to plane exception. Exception count: %d"plrMover->GetName().c_str(), plrMover->m_anti_TeleToPlane_Count);
    +                                
    /* Disabled, not passive at all, and apparently causing crashes:
    +                                sWorld.SendWorldText(3, strcat("Kicking cheater: ", plrMover->GetName()));
    +                                KickPlayer();
    +                                return; */
    +                            }
    +                            
    #endif
    +                            ++(plrMover->m_anti_TeleToPlane_Count);
    +                            
    check_passed false;
    +                            
    //if (vehMover)
    +                            //    vehMover->Die();
    +                        }
    +                    }
    +                }
    +                else
    +                    
    plrMover->m_anti_TeleToPlane_Count 0;
    +            }
    +        }
    +    }
    +     
    /* process position-change */
    +    if (check_passed)
    +    {
         
    WorldPacket data(opcoderecvData.size());
         
    movementInfo.time movementInfo.time m_clientTimeDelay MOVEMENT_PACKET_TIME_DELAY;
     
    @@ -
    376,11 +766,20 @@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
     
         
    mover->UpdatePosition(movementInfo.pos);
     
    -    if (
    plrMover)                                            // nothing is charmed, or player charmed
    +    if (plrMover && !vehMover)                               // nothing is charmed, or player charmed
         
    {
             
    plrMover->UpdateFallInformationIfNeed(movementInfoopcode);
     
    -        if (
    movementInfo.pos.GetPositionZ() < -500.0f)
    +        
    float underMapValueZ;
    +
    +        switch (
    plrMover->GetMapId())
    +        {
    +            case 
    617underMapValueZ 3.0f; break; // Dalaran Sewers
    +            case 618underMapValueZ 28.0f; break; // Ring of Valor
    +            default: underMapValueZ = -500.0f; break;
    +        }
    +
    +        if (
    movementInfo.pos.GetPositionZ() < underMapValueZ)
             {
                 if (!(
    plrMover->GetBattleground() && plrMover->GetBattleground()->HandlePlayerUnderMap(_player)))
                 {
    @@ -
    398,+797,31 @@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
                     }
                 }
             }
    +        
    // movement anticheat
    +        if (plrMover->m_anti_AlarmCount 0)
    +        {
    +            
    TC_LOG_WARN("cheat""AC2-%s produce %d anticheat alarms."plrMover->GetName().c_str(), plrMover->m_anti_AlarmCount);
    +            
    plrMover->m_anti_AlarmCount 0;
    +        }
    +        
    // end movement anticheat
    +     }
    +    }
    +    else if (
    plrMover)
    +    {
    +        if (
    plrMover->m_transport)
    +        {
    +            
    plrMover->m_transport->RemovePassenger(plrMover);
    +            
    plrMover->m_transport NULL;
    +        }
    +        
    plrMover->m_temp_transport NULL;
    +        ++(
    plrMover->m_anti_AlarmCount);
    +        
    WorldPacket data;
    +        
    plrMover->SetUnitMovementFlags(0);
    +        
    plrMover->SendTeleportAckPacket();
    +        
    plrMover->BuildHeartBeatMsg(&data);
    +        
    plrMover->SendMessageToSet(&datatrue);
         }
    +
     }
     
     
    void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recvData)
    @@ -
    517,+941,@@ void WorldSession::HandleMountSpecialAnimOpcode(WorldPacket/*recvData*/)
         
    GetPlayer()->SendMessageToSet(&datafalse);
     }
     
    -
    void WorldSession::HandleMoveKnockBackAck(WorldPacketrecvData)
    +
    void WorldSession::HandleMoveKnockBackAck(WorldPacket recvData)
     {
         
    TC_LOG_DEBUG("network""CMSG_MOVE_KNOCK_BACK_ACK");
     
    @@ -
    532,+956,18 @@ void WorldSession::HandleMoveKnockBackAck(WorldPacketrecvData)
         
    MovementInfo movementInfo;
         
    ReadMovementInfo(recvData, &movementInfo);
     
    +    
    // Save movement flags
    +    _player->SetUnitMovementFlags(movementInfo.flags);
    +    
    #ifdef ANTICHEAT_DEBUG
    +    TC_LOG_WARN("cheat""%s CMSG_MOVE_KNOCK_BACK_ACK: time: %d, fall time: %d | xyzo: %f,%f,%fo(%f) flags[%X] Vspeed: %f, Hspeed: %f"GetPlayer()->GetName(), movementInfo.timemovementInfo.fallTimemovementInfo.pos.m_positionXmovementInfo.pos.m_positionYmovementInfo.pos.m_positionZmovementInfo.pos.m_orientationmovementInfo.flagsmovementInfo.jump.zspeedmovementInfo.jump.xyspeed);
    +    
    #endif
    +
         
    _player->m_movementInfo movementInfo;
    +    
    _player->m_anti_Last_HSpeed movementInfo.jump.xyspeed;
    +    
    _player->m_anti_Last_VSpeed movementInfo.jump.zspeed 3.2f movementInfo.jump.zspeed 1.0f 3.2f;
    +
    +    const 
    uint32 dt = (_player->m_anti_Last_VSpeed 0) ? int(ceil(_player->m_anti_Last_VSpeed/-25)*1000) : int(ceil(_player->m_anti_Last_VSpeed/25)*1000);
    +    
    _player->m_anti_LastSpeedChangeTime movementInfo.time dt 1000;
     
         
    WorldPacket data(MSG_MOVE_KNOCK_BACK66);
         
    data.appendPackGUID(guid);
    diff --git a/src/server/game/Handlers/TaxiHandler.cpp b/src/server/game/Handlers/TaxiHandler.cpp
    index ae25d9f
    ..1460962 100644
    --- a/src/server/game/Handlers/TaxiHandler.cpp
    +++ b/src/server/game/Handlers/TaxiHandler.cpp
    @@ -48,+48,@@ void WorldSession::SendTaxiStatus(uint64 guid)
             return;
         }
     
    -    
    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam());
    +    
    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam(),0);
     
         
    // not found nearest
         
    if (curloc == 0)
    @@ -
    93,+93,@@ void WorldSession::HandleTaxiQueryAvailableNodes(WorldPacketrecvData)
     
    void WorldSession::SendTaxiMenu(Creatureunit)
     {
         
    // find current node
    -    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam());
    +    
    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam(),0);
     
         if (
    curloc == 0)
             return;
    @@ -
    133,+133,@@ void WorldSession::SendDoFlight(uint32 mountDisplayIduint32 pathuint32 pathN
     bool WorldSession
    ::SendLearnNewTaxiNode(Creatureunit)
     {
         
    // find current node
    -    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam());
    +    
    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam(),0);
     
         if (
    curloc == 0)
             return 
    true;                                        // `true` send to avoid WorldSession::SendTaxiMenu call with one more curlock seartch with same false result.
    @@ -202,+202,13 @@ void WorldSession::HandleMoveSplineDoneOpcode(WorldPacketrecvData)
         
    uint64 guid// used only for proper packet read
         
    recvData.readPackGUID(guid);
     
    +    
    // movement anticheat code
    +    const Unit *mover _player->m_mover;
    +    const 
    Player *plMover mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover NULL;
    +    if (!
    plMover)
    +        return;
    +    
    // end movement anticheat
    +
         
    MovementInfo movementInfo;                              // used only for proper packet read
         
    ReadMovementInfo(recvData, &movementInfo);
     
    @@ -
    214,10 +221,75 @@ void WorldSession::HandleMoveSplineDoneOpcode(WorldPacketrecvData)
     
         
    uint32 curDest GetPlayer()->m_taxi.GetTaxiDestination();
         if (!
    curDest)
    -        return;
    +    {
    +        
    // movement anticheat code
    +        GetPlayer()->UpdatePosition(movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), movementInfo.pos.GetPositionZ(), movementInfo.pos.GetOrientation());
    +        
    GetPlayer()->m_movementInfo movementInfo;
    +        
    GetPlayer()->SetUnitMovementFlags(movementInfo.flags);
    +
    +        
    // calc time deltas
    +        int32 cClientTimeDelta 0;
    +        if (
    GetPlayer()->m_anti_LastClientTime != 0)
    +        {
    +            
    cClientTimeDelta movementInfo.time GetPlayer()->m_anti_LastClientTime;
    +            
    GetPlayer()->m_anti_DeltaClientTime += cClientTimeDelta;
    +            
    GetPlayer()->m_anti_LastClientTime movementInfo.time;
    +        }
    +        else
    +            
    GetPlayer()->m_anti_LastClientTime movementInfo.time;
     
    -    
    TaxiNodesEntry const* curDestNode sTaxiNodesStore.LookupEntry(curDest);
    +        const 
    uint64 cServerTime getMSTime();
    +        
    uint32 cServerTimeDelta 0;
    +        if (
    GetPlayer()->m_anti_LastServerTime != 0)
    +        {
    +            
    cServerTimeDelta cServerTime GetPlayer()->m_anti_LastServerTime;
    +            
    GetPlayer()->m_anti_DeltaServerTime += cServerTimeDelta;
    +            
    GetPlayer()->m_anti_LastServerTime cServerTime;
    +        }
    +        else
    +            
    GetPlayer()->m_anti_LastServerTime cServerTime;
    +        
    // end movement anticheat
    +        return;
    +       }
    +    
    // movment anticheat
    +    const uint32 curloc =
    +    
    sObjectMgr->GetNearestTaxiNode(movementInfo.pos.GetPositionX(),movementInfo.pos.GetPositionY(),movementInfo.pos.GetPositionZ(),GetPlayer()->GetMapId(),GetPlayer()->GetTeam(), curDest);
    +    
    // end movement anticheat
    +
    +    
    // sLog.outBasic("AC2-%s > | xyzo: %f,%f,%fo(%f) flags[%X] | curloc: %d | destloc: %d ",
    +    // GetPlayer()->GetName(), movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o,
    +    // movementInfo.flags, curloc, curDest);
    +     TaxiNodesEntry const* curDestNode sTaxiNodesStore.LookupEntry(curDest);
    +    if (
    curDestNode && curDestNode->map_id == GetPlayer()->GetMapId())
    +        while (
    GetPlayer()->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE)
    +            
    GetPlayer()->GetMotionMaster()->MovementExpired(false);
    +
    +    
    // movement anticheat code
    +    GetPlayer()->UpdatePosition(movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), movementInfo.pos.GetPositionZ(), movementInfo.pos.GetOrientation());
    +    
    GetPlayer()->m_movementInfo movementInfo;
    +    
    GetPlayer()->SetUnitMovementFlags(movementInfo.flags);
    +    
    // calc time deltas
    +    int32 cClientTimeDelta 0;
    +    if (
    GetPlayer()->m_anti_LastClientTime != 0)
    +    {
    +        
    cClientTimeDelta movementInfo.time GetPlayer()->m_anti_LastClientTime;
    +        
    GetPlayer()->m_anti_DeltaClientTime += cClientTimeDelta;
    +        
    GetPlayer()->m_anti_LastClientTime movementInfo.time;
    +    }
    +    else
    +        
    GetPlayer()->m_anti_LastClientTime movementInfo.time;
     
    +    const 
    uint64 cServerTime getMSTime();
    +    
    uint32 cServerTimeDelta 0;
    +    if (
    GetPlayer()->m_anti_LastServerTime != 0)
    +    {
    +        
    cServerTimeDelta cServerTime GetPlayer()->m_anti_LastServerTime;
    +        
    GetPlayer()->m_anti_DeltaServerTime += cServerTimeDelta;
    +        
    GetPlayer()->m_anti_LastServerTime cServerTime;
    +    }
    +    else
    +        
    GetPlayer()->m_anti_LastServerTime cServerTime;
    +    
    // end movement anticheat
         // far teleport case
         
    if (curDestNode && curDestNode->map_id != GetPlayer()->GetMapId())
         {
    @@ -
    234,+306,23 @@ void WorldSession::HandleMoveSplineDoneOpcode(WorldPacketrecvData)
             }
             return;
         }
    +    
    // movement anticheat fix - disallow unmount from taxi
    +    if (curloc != curDest)
    +    {
    +         
    // current source node for next destination
    +        uint32 sourcenode GetPlayer()->m_taxi.GetTaxiSource();
    +        
    uint16 MountId sObjectMgr->GetTaxiMountDisplayId(sourcenodeGetPlayer()->GetTeam());
    +
    +        
    uint32 pathcost;
    +        
    sObjectMgr->GetTaxiPath(sourcenodecurDestpathcost);
    +
    +        if (
    path && MountId)
    +            
    SendDoFlight(MountIdpath1);                 // skip start fly node
    +        else
    +            
    GetPlayer()->m_taxi.ClearTaxiDestinations();    // clear problematic path and next
    +        return;
    +    }
    +    
    // end movement anticheat
     
         
    uint32 destinationnode GetPlayer()->m_taxi.NextTaxiDestination();
         if (
    destinationnode 0)                              // if more destinations to go
    diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
    index 7ad7b68
    ..542f726 100644
    --- a/src/server/game/World/World.cpp
    +++ b/src/server/game/World/World.cpp
    @@ -93,+93,11 @@ float World::m_MaxVisibleDistanceInBGArenas   DEFAULT_VISIBILITY_BGARENAS;
     
    int32 World::m_visibility_notify_periodOnContinents DEFAULT_VISIBILITY_NOTIFY_PERIOD;
     
    int32 World::m_visibility_notify_periodInInstances  DEFAULT_VISIBILITY_NOTIFY_PERIOD;
     
    int32 World::m_visibility_notify_periodInBGArenas   DEFAULT_VISIBILITY_NOTIFY_PERIOD;
    -
    +
    // movement anticheat
    +bool World::m_EnableMvAnticheat true;
    +
    uint32 World::m_TeleportToPlaneAlarms 50;
    +
    uint32 World::m_MistimingAlarms 200;
    +
    uint32 World::m_MistimingDelta 15000;
     
    /// World constructor
     
    World::World()
     {
    @@ -
    564,+568,41 @@ void World::LoadConfigSettings(bool reload)
             
    TC_LOG_ERROR("server.loading""DurabilityLossChance.Block (%f) must be >=0. Using 0.0 instead."rate_values[RATE_DURABILITY_LOSS_BLOCK]);
             
    rate_values[RATE_DURABILITY_LOSS_BLOCK] = 0.0f;
         }
    +    
    // movement anticheat
    +    m_EnableMvAnticheat sConfigMgr->GetBoolDefault("Anticheat.Movement.Enable"true);
    +    
    m_TeleportToPlaneAlarms sConfigMgr->GetIntDefault("Anticheat.Movement.TeleportToPlaneAlarms"50);
    +    if (
    m_TeleportToPlaneAlarms 20)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.TeleportToPlaneAlarms (%d) must be >= 20. Using 20 instead."m_TeleportToPlaneAlarms);
    +        
    m_TeleportToPlaneAlarms 20;
    +    }
    +    if (
    m_TeleportToPlaneAlarms 100)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.TeleportToPlaneAlarms (%d) must be <= 100. Using 100 instead."m_TeleportToPlaneAlarms);
    +        
    m_TeleportToPlaneAlarms 100;
    +    }
    +    
    m_MistimingDelta sConfigMgr->GetIntDefault("Anticheat.Movement.MistimingDelta"15000);
    +    if (
    m_MistimingDelta 5000)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.m_MistimingDelta (%d) must be >= 5000ms. Using 5000ms instead."m_MistimingDelta);
    +        
    m_MistimingDelta 5000;
    +    }
    +    if (
    m_MistimingDelta 50000)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.m_MistimingDelta (%d) must be <= 50000ms. Using 50000ms instead."m_MistimingDelta);
    +        
    m_MistimingDelta 50000;
    +    }
    +    
    m_MistimingAlarms sConfigMgr->GetIntDefault("Anticheat.Movement.MistimingAlarms"200);
    +    if (
    m_MistimingAlarms 100)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.MistimingAlarms (%d) must be >= 100. Using 100 instead."m_MistimingAlarms);
    +        
    m_MistimingAlarms 100;
    +    }
    +    if (
    m_MistimingAlarms 500)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.m_MistimingAlarms (%d) must be <= 500. Using 500 instead."m_MistimingAlarms);
    +        
    m_MistimingAlarms 500;
    +    }
         
    ///- Read other configuration items from the config file
     
         
    m_bool_configs[CONFIG_DURABILITY_LOSS_IN_PVP] = sConfigMgr->GetBoolDefault("DurabilityLoss.InPvP"false);
    diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
    index 9435fa8
    ..0466011 100644
    --- a/src/server/game/World/World.h
    +++ b/src/server/game/World/World.h
    @@ -711,+711,14 @@ class World
             
    static int32 GetVisibilityNotifyPeriodOnContinents(){ return m_visibility_notify_periodOnContinents; }
             static 
    int32 GetVisibilityNotifyPeriodInInstances() { return m_visibility_notify_periodInInstances;  }
             static 
    int32 GetVisibilityNotifyPeriodInBGArenas()  { return m_visibility_notify_periodInBGArenas;   }
    +        
    // movement anticheat
    +        static bool GetEnableMvAnticheat()       { return m_EnableMvAnticheat;     }
    +        static 
    uint32 GetTeleportToPlaneAlarms() { return m_TeleportToPlaneAlarms; }
    +        static 
    uint32 GetMistimingDelta()        { return m_MistimingDelta;        }
    +        static 
    uint32 GetMistimingAlarms()       { return m_MistimingAlarms;       }
    +        static 
    uint32 GetTeleportToPlanePenalty() { return m_TeleportToPlanePenalty;}
    +        static 
    uint32 GetMovementPenalty()        { return m_MovementPenalty;       }
    +        
    // end movement anticheat
     
             
    void ProcessCliCommands();
             
    void QueueCliCommand(CliCommandHoldercommandHolder) { cliCmdQueue.add(commandHolder); }
    @@ -
    817,+825,13 @@ class World
             
    static int32 m_visibility_notify_periodOnContinents;
             static 
    int32 m_visibility_notify_periodInInstances;
             static 
    int32 m_visibility_notify_periodInBGArenas;
    -
    +        
    // movement anticheat enable flag
    +        static bool m_EnableMvAnticheat;
    +        static 
    uint32 m_TeleportToPlaneAlarms;
    +        static 
    uint32 m_TeleportToPlanePenalty;
    +        static 
    uint32 m_MovementPenalty;
    +        static 
    uint32 m_MistimingDelta;
    +        static 
    uint32 m_MistimingAlarms;
             
    // CLI command holder to be thread safe
             
    ACE_Based::LockedQueue<CliCommandHolder*, ACE_Thread_MutexcliCmdQueue;
     
    diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
    index 23db333
    ..79bd72f 100644
    --- a/src/server/worldserver/worldserver.conf.dist
    +++ b/src/server/worldserver/worldserver.conf.dist
    @@ -1124,+1124,47 @@ DungeonFinder.OptionsMask 1
     DBC
    .EnforceItemAttributes 1
     
     
    #
    +#    Anticheat.Movement.Enable
    +#        Enable Movement Anticheat
    +#        Default: 1 - on
    +#                 0 - off
    +#
    +
    +
    Anticheat.Movement.Enable 1
    +
    +
    #        Default:     0 - (Disabled, Logging only)
    +#                     1 - (Kick)
    +#                     2 - (Ban)
    +
    +
    Anticheat.Movement.Action 0
    +
    +
    #
    +#    Anticheat.Movement.TeleportToPlaneAlarms
    +#        maximum alarms before logging mode will be switched from debug to error (default 50, allowed 20 - 100)
    +#
    +
    +
    Anticheat.Movement.TeleportToPlaneAlarms 50
    +
    +
    #        Default:     0 - (Disabled, Logging only)
    +#                     1 - (Kick)
    +#                     2 - (Ban)
    +
    +
    Anticheat.Movement.TeleportToPlaneAlarms 0
    +
    +
    #
    +#    Anticheat.Movement.MistimingDelta
    +#        mistiming intelval between client and serverside (default 15000 ms, allowed 5000 - 50000 ms)
    +#
    +
    +
    Anticheat.Movement.MistimingDelta 15000
    +
    +
    #
    +#    Anticheat.Movement.MistimingAlarms
    +#        mistiming alarms before logging mode will be switched from debug to error (default 200, allowed 100 - 500)
    +#
    +
    +
    Anticheat.Movement.MistimingAlarms 200
    +
     
    #   AccountInstancesPerHour
     #        Description: Controls the max amount of different instances player can enter within hour
     #        Default:     5
    @@ -2708,+2749,@@ Appender.DBErrors=2,2,0,DBErrors.log
     Appender
    .Server=2,2,0,Server.log,w
     Appender
    .GM=2,2,15,gm/gm_%s.log
     Appender
    .DBErrors=2,2,0,DBErrors.log
    +Appender.Cheat=2,4,1,Cheat.log
     
     
    #  Logger config values: Given a logger "name"
     #    Logger.name
    @@ -2796,+2838,@@ Logger.DBErrors=26,5,Console Server DBErrors
     
    #Logger.chat.log=3,Console Server
     #Logger.calendar=3,Console Server
     #Logger.chat.system=3,Console Server
    -#Logger.cheat=3,Console Server
    +Logger.cheat=3,Console Cheat
     
    #Logger.commands.ra=3,Console Server
     #Logger.condition=3,Console Server
     #Logger.entities.pet=3,Console Server 
    خیلی خوبه ولی پچ هست »

    کاربر مقابل پست uther عزیز را پسندیده است:

    iceboy (04-25-2015)

    ویرایش توسط uther : 04-25-2015 در ساعت 06:24 PM


  6. #5
    دستاورد ها:
    اجتماعیRecommendation First Class1 سال ثبت نام شده استبرچسب زن کلاس اولاوردرایو

    شماره عضویت
    1
    تاریخ عضویت
    Oct 2014
    محل سکونت
    بوشهر
    نوشته ها
    1,771
    نسل
    نسل مورد علاقه
    نژاد
    نژاد  مورد علاقه
    کلاس
     کلاس  مورد علاقه
    سورس
     سورس مورد علاقه
    پچ
    پچ مورد علاقه
    پسندیده : 724
    مورد پسند : 1,162 بار در 581 پست
    سیستم عامل و مرورگر:
    نقل قول نوشته اصلی توسط uther نمایش پست ها
    خیلی خوبه ولی پچ هست »
    خوب آنتی چیت پچ هست دیگه

    کاربر مقابل پست Nightprince عزیز را پسندیده است:

    iceboy (04-25-2015)


  7. #6

    شماره عضویت
    266
    تاریخ عضویت
    Apr 2015
    نوشته ها
    75
    نسل
    نسل مورد علاقه
    نژاد
    نژاد  مورد علاقه
    کلاس
     کلاس  مورد علاقه
    سورس
     سورس مورد علاقه
    پچ
    پچ مورد علاقه
    پسندیده : 91
    مورد پسند : 24 بار در 14 پست
    سیستم عامل و مرورگر:
    نقل قول نوشته اصلی توسط Hamed_Ezio نمایش پست ها
    خدمت شما اینم انتی چیت رایگان AC2

    کد PHP:

    diff 
    --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
    index 40dbe6c
    ..3ee86e8 100644
    --- a/src/server/game/Entities/Player/Player.cpp
    +++ b/src/server/game/Entities/Player/Player.cpp
    @@ -775,+775,26 @@ Player::Player(WorldSessionsession): Unit(true)
         
    rest_type=REST_TYPE_NO;
         
    ////////////////////Rest System/////////////////////
     
    +    // movement anticheat
    +    m_anti_LastClientTime  0;          // last movement client time
    +    m_anti_LastServerTime  0;          // last movement server time
    +    m_anti_DeltaClientTime 0;          // client side session time
    +    m_anti_DeltaServerTime 0;          // server side session time
    +    m_anti_MistimingCount  0;          // mistiming count
    +
    +    
    m_anti_LastSpeedChangeTime 0;      // last speed change time
    +
    +    
    m_anti_Last_HSpeed =  7.0f;          // horizontal speed, default RUN speed
    +    m_anti_Last_VSpeed = -2.3f;          // vertical speed, default max jump height
    +
    +    
    m_anti_TeleToPlane_Count 0;        // Teleport To Plane alarm counter
    +
    +    
    m_anti_AlarmCount 0;               // alarm counter
    +
    +    
    m_anti_JumpCount 0;                // Jump already began, anti air jump check
    +    m_anti_JumpBaseZ 0;                // Z coord before jump (AntiGrav)
    +    // end movement anticheat
    +
         
    m_mailsLoaded false;
         
    m_mailsUpdated false;
         
    unReadMails 0;
    @@ -
    2156,+2176,@@ bool Player::TeleportTo(uint32 mapidfloat xfloat yfloat zfloat orientati
     
         
    if (GetMapId() == mapid)
         {
    +        
    m_anti_JumpBaseZ 0;
             
    //lets reset far teleport flag if it wasn't reset during chained teleports
             
    SetSemaphoreTeleportFar(false);
             
    //setup delayed teleport flag
    @@ -2305,+2326,@@ bool Player::TeleportTo(uint32 mapidfloat xfloat yfloat zfloat orientati
     
                 m_teleport_dest 
    WorldLocation(mapidxyzorientation);
                 
    SetFallInformation(0z);
    +            
    m_anti_JumpBaseZ 0;
                 
    // if the player is saved before worldportack (at logout for example)
                 // this will be used instead of the current location in SaveToDB
     
    diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
    index fee542a
    ..19287d1 100644
    --- a/src/server/game/Entities/Player/Player.h
    +++ b/src/server/game/Entities/Player/Player.h
    @@ -2520,+2520,26 @@ class Player : public Unit, public GridObject<Player>
             
    float m_rest_bonus;
             
    RestType rest_type;
             
    ////////////////////Rest System/////////////////////
    +        // movement anticheat
    +        time_t m_anti_LastClientTime;           // last movement client time
    +        time_t m_anti_LastServerTime;           // last movement server time
    +        time_t m_anti_DeltaClientTime;          // client side session time
    +        time_t m_anti_DeltaServerTime;          // server side session time
    +        uint32 m_anti_MistimingCount;           // mistiming count
    +
    +        
    time_t m_anti_LastSpeedChangeTime;      // last speed change time
    +
    +        
    float m_anti_Last_HSpeed;               // horizontal speed, default RUN speed
    +        float m_anti_Last_VSpeed;               // vertical speed, default max jump height
    +
    +        
    uint32 m_anti_TeleToPlane_Count;        // Teleport To Plane alarm counter
    +
    +        
    uint64 m_anti_AlarmCount;               // alarm counter
    +
    +        
    uint16 m_anti_JumpCount;                // Jump already began, anti air jump check
    +        float m_anti_JumpBaseZ;                 // Z coord before jump
    +        // end movement anticheat
    +
             
    uint32 m_resetTalentsCost;
             
    time_t m_resetTalentsTime;
             
    uint32 m_usedTalentCount;
    diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
    index 25352a9
    ..64d6e80 100644
    --- a/src/server/game/Entities/Unit/Unit.h
    +++ b/src/server/game/Entities/Unit/Unit.h
    @@ -2131,+2131,@@ class Unit : public WorldObject
         
    protected:
             
    explicit Unit (bool isWorldObject);
     
    +        
    GameObjectm_temp_transport;
             
    void BuildValuesUpdate(uint8 updatetypeByteBufferdataPlayertarget) const;
     
             
    UnitAIi_AI, *i_disabledAI;
    diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
    index 2f309c0
    ..81324e7 100644
    --- a/src/server/game/Globals/ObjectMgr.cpp
    +++ b/src/server/game/Globals/ObjectMgr.cpp
    @@ -5489,+5489,@@ void ObjectMgr::LoadAreaTriggerScripts()
         
    TC_LOG_INFO("server.loading"">> Loaded %u areatrigger scripts in %u ms"countGetMSTimeDiffToNow(oldMSTime));
     }
     
    -
    uint32 ObjectMgr::GetNearestTaxiNode(float xfloat yfloat zuint32 mapiduint32 team)
    +
    // use searched_node for search some known node
    +uint32 ObjectMgr::GetNearestTaxiNode(float xfloat yfloat zuint32 mapiduint32 teamuint32 searched_node)
     {
         
    bool found false;
         
    float dist 10000;
    @@ -
    5499,+5500,18 @@ uint32 ObjectMgr::GetNearestTaxiNode(float xfloat yfloat zuint32 mapidui
         
    {
             
    TaxiNodesEntry const* node sTaxiNodesStore.LookupEntry(i);
     
    -        if (!
    node || node->map_id != mapid || (!node->MountCreatureID[team == ALLIANCE 0] && node->MountCreatureID[0] != 32981)) // dk flight
    +        if (!node || node->map_id != mapid) continue;
    +
    +        const 
    float dist2 pow(node->x2) + pow(node->y2) + pow(node->z2);
    +
    +        if (
    searched_node != && == searched_node)
    +        {
    +            
    id i;
    +            
    dist dist2;
    +            break;
    +        }
    +
    +        if (!
    node->MountCreatureID[team == ALLIANCE 0] && node->MountCreatureID[0] != 32981// dk flight
                 
    continue;
     
             
    uint8  field   = (uint8)((1) / 32);
    @@ -
    5509,+5521,@@ uint32 ObjectMgr::GetNearestTaxiNode(float xfloat yfloat zuint32 mapidui
             
    if ((sTaxiNodesMask[field] & submask) == 0)
                 continue;
     
    -        
    float dist2 = (node->x)*(node->x)+(node->y)*(node->y)+(node->z)*(node->z);
    +        
    //float dist2 = (node->x - x)*(node->x - x)+(node->y - y)*(node->y - y)+(node->z - z)*(node->z - z);
             
    if (found)
             {
                 if (
    dist2 dist)
    @@ -
    5525,+5537,@@ uint32 ObjectMgr::GetNearestTaxiNode(float xfloat yfloat zuint32 mapidui
                 id 
    i;
             }
         }
    -
    +    
    // movement anticheat fix
    +    if (dist 3600id 0;
    +    
    // movement anticheat fix
         
    return id;
     }
     
    diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
    index 752cc3b
    ..6d2aaac 100644
    --- a/src/server/game/Globals/ObjectMgr.h
    +++ b/src/server/game/Globals/ObjectMgr.h
    @@ -736,+736,@@ class ObjectMgr
             uint32 GetPlayerAccountIdByGUID
    (uint64 guid) const;
             
    uint32 GetPlayerAccountIdByPlayerName(std::string const& name) const;
     
    -        
    uint32 GetNearestTaxiNode(float xfloat yfloat zuint32 mapiduint32 team);
    +        
    uint32 GetNearestTaxiNode(float xfloat yfloat zuint32 mapiduint32 teamuint32 searched_node);
             
    void GetTaxiPath(uint32 sourceuint32 destinationuint32 &pathuint32 &cost);
             
    uint32 GetTaxiMountDisplayId(uint32 iduint32 teambool allowed_alt_team false);
     
    diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
    index 36d1e1c
    ..1916897 100644
    --- a/src/server/game/Handlers/MovementHandler.cpp
    +++ b/src/server/game/Handlers/MovementHandler.cpp
    @@ -30,+30,14 @@
     
    #include "WaypointMovementGenerator.h"
     #include "InstanceSaveMgr.h"
     #include "ObjectMgr.h"
    +#include "World.h"
    +#include "WardenWin.h"
    +#include "Appender.h"
    +
    +
    // Movement anticheat defines
    +//#define ANTICHEAT_DEBUG
    +#define ANTICHEAT_EXCEPTION_INFO
    +// End Movement anticheat defines
     
     #define MOVEMENT_PACKET_TIME_DELAY 0
     
    @@ -203,36 +211,36 @@ void WorldSession::HandleMoveTeleportAck(WorldPacketrecvData)
         
    TC_LOG_DEBUG("network""Guid " UI64FMTDguid);
         
    TC_LOG_DEBUG("network""Flags %u, time %u"flagstime/IN_MILLISECONDS);
     
    -    
    PlayerplMover _player->m_mover->ToPlayer();
    +    
    PlayerplrMover _player->m_mover->ToPlayer();
     
    -    if (!
    plMover || !plMover->IsBeingTeleportedNear())
    +    if (!
    plrMover || !plrMover->IsBeingTeleportedNear())
             return;
     
    -    if (
    guid != plMover->GetGUID())
    +    if (
    guid != plrMover->GetGUID())
             return;
     
    -    
    plMover->SetSemaphoreTeleportNear(false);
    +    
    plrMover->SetSemaphoreTeleportNear(false);
     
    -    
    uint32 old_zone plMover->GetZoneId();
    +    
    uint32 old_zone plrMover->GetZoneId();
     
    -    
    WorldLocation const& dest plMover->GetTeleportDest();
    +    
    WorldLocation const& dest plrMover->GetTeleportDest();
     
    -    
    plMover->UpdatePosition(desttrue);
    +    
    plrMover->UpdatePosition(desttrue);
     
         
    uint32 newzonenewarea;
    -    
    plMover->GetZoneAndAreaId(newzonenewarea);
    -    
    plMover->UpdateZone(newzonenewarea);
    +    
    plrMover->GetZoneAndAreaId(newzonenewarea);
    +    
    plrMover->UpdateZone(newzonenewarea);
     
         
    // new zone
         
    if (old_zone != newzone)
         {
             
    // honorless target
    -        if (plMover->pvpInfo.IsHostile)
    -            
    plMover->CastSpell(plMover2479true);
    +        if (
    plrMover->pvpInfo.IsHostile)
    +            
    plrMover->CastSpell(plrMover2479true);
     
             
    // in friendly area
    -        else if (plMover->IsPvP() && !plMover->HasFlag(PLAYER_FLAGSPLAYER_FLAGS_IN_PVP))
    -            
    plMover->UpdatePvP(falsefalse);
    +        else if (
    plrMover->IsPvP() && !plrMover->HasFlag(PLAYER_FLAGSPLAYER_FLAGS_IN_PVP))
    +            
    plrMover->UpdatePvP(falsefalse);
         }
     
         
    // resummon pet
    @@ -242,+250,@@ void WorldSession::HandleMoveTeleportAck(WorldPacketrecvData)
         
    GetPlayer()->ProcessDelayedOperations();
     }
     
    -
    void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
    +
    void WorldSession::HandleMovementOpcodes(WorldPacket recvData)
     {
         
    uint16 opcode recvData.GetOpcode();
     
    @@ -
    250,+258,13 @@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
     
         
    ASSERT(mover != NULL);                      // there must always be a mover
     
    -    PlayerplrMover mover->ToPlayer();
    +    
    PlayerplrMover mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover NULL;
    +    
    VehiclevehMover mover->GetVehicleKit();
    +    if (
    vehMover)
    +        if (
    mover->HasFlag(UNIT_FIELD_FLAGSUNIT_FLAG_PLAYER_CONTROLLED))
    +            if (
    Unitcharmer mover->GetCharmer())
    +                if (
    charmer->GetTypeId() == TYPEID_PLAYER)
    +                    
    plrMover = (Player*)charmer;
     
         
    // ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck
         
    if (plrMover && plrMover->IsBeingTeleported())
    @@ -
    299,+313,@@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
             }
     
             
    // if we boarded a transport, add us to it
    -        if (plrMover)
    +        if (
    plrMover && !plrMover->m_transport && !plrMover->m_temp_transport)
             {
                 if (!
    plrMover->GetTransport())
                 {
    @@ -
    326,25 +340,40 @@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
                         
    movementInfo.transport.Reset();
                     }
                 }
    +            if (!
    plrMover->m_transport)
    +                if (
    Map *tempMap mover->GetMap())
    +                    if (
    GameObject *tempTransport tempMap->GetGameObject(movementInfo.transport.guid))
    +                        if (
    tempTransport->IsTransport())
    +                            
    plrMover->m_temp_transport tempTransport;
             }
     
    -        if (!
    mover->GetTransport() && !mover->GetVehicle())
    +        if ((!
    plrMover && !mover->GetTransport() && !mover->GetVehicle()) || (plrMover && !plrMover->m_vehicle && !plrMover->m_transport && !plrMover->m_temp_transport)) // Not sure if the first part is needed. Just added it for verbosity.
             
    {
                 
    GameObjectgo mover->GetMap()->GetGameObject(movementInfo.transport.guid);
                 if (!
    go || go->GetGoType() != GAMEOBJECT_TYPE_TRANSPORT)
                     
    movementInfo.flags &= ~MOVEMENTFLAG_ONTRANSPORT;
             }
         }
    -    else if (
    plrMover && plrMover->GetTransport())                // if we were on a transport, leave
    +    else if (plrMover && (plrMover->m_transport || plrMover->m_temp_transport)) // if we were on a transport, leave
         
    {
    -        
    plrMover->m_transport->RemovePassenger(plrMover);
    -        
    plrMover->m_transport NULL;
    -        
    movementInfo.transport.Reset();
    +        if (
    plrMover->m_transport)
    +        {
    +            
    plrMover->m_transport->RemovePassenger(plrMover);
    +            
    plrMover->m_transport NULL;
    +        }
    +        
    plrMover->m_temp_transport NULL;
    +        
    movementInfo.transport.Reset();
         }
     
         
    // fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map).
         
    if (opcode == MSG_MOVE_FALL_LAND && plrMover && !plrMover->IsInFlight())
    -        
    plrMover->HandleFall(movementInfo);
    +    {
    +        
    // movement anticheat
    +        plrMover->m_anti_JumpCount 0;
    +        
    plrMover->m_anti_JumpBaseZ 0;
    +        if (!
    vehMover)
    +            
    plrMover->HandleFall(movementInfo);
    +    }
     
         if (
    plrMover && ((movementInfo.flags MOVEMENTFLAG_SWIMMING) != 0) != plrMover->IsInWater())
         {
    @@ -
    356,+388,348 @@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
         
    /*----------------------*/
         
    if (m_clientTimeDelay == 0)
             
    m_clientTimeDelay mstime movementInfo.time;
    +    
    // begin anti cheat
    +    bool check_passed true;
    +    
    #ifdef ANTICHEAT_DEBUG
    +   TC_LOG_WARN("cheat""AC2-%s > time: %d fall-time: %d | xyzo: %f, %f, %fo(%f) flags[%X] opcode[%s] | transport (xyzo): %f, %f, %fo(%f)",
    +       
    plrMover->GetName(), movementInfo.timemovementInfo.fallTimemovementInfo.pos.m_positionXmovementInfo.pos.m_positionYmovementInfo.pos.m_positionZmovementInfo.pos.m_orientation,
    +    
    movementInfo.flagsLookupOpcodeName(opcode), movementInfo.transport.pos.m_positionXmovementInfo.transport.pos.m_positionYmovementInfo.transport.pos.m_positionZmovementInfo.transport.pos.m_orientation);
    +    
    TC_LOG_WARN("cheat""AC2-%s Transport > GUID: (low)%d - (high)%d",
    +        
    plrMover->GetName(), GUID_LOPART(movementInfo.transport.guid), GUID_HIPART(movementInfo.transport.guid));
    +    
    #endif
    +
    +    if (
    plrMover)
    +    {
    +        if (
    World::GetEnableMvAnticheat() && !plrMover->IsGameMaster() && !plrMover->GetCharmerOrOwnerPlayerOrPlayerItself()->IsGameMaster() && !plrMover->GetCharmerOrOwnerPlayerOrPlayerItself()->GetVehicle())
    +        {
    +            
    // calc time deltas
    +            int32 cClientTimeDelta 1500;
    +            if (
    plrMover->m_anti_LastClientTime != 0)
    +            {
    +                
    cClientTimeDelta movementInfo.time plrMover->m_anti_LastClientTime;
    +                
    plrMover->m_anti_DeltaClientTime += cClientTimeDelta;
    +                
    plrMover->m_anti_LastClientTime movementInfo.time;
    +            }
    +            else
    +                
    plrMover->m_anti_LastClientTime movementInfo.time;
    +
    +            const 
    uint64 cServerTime getMSTime();
    +            
    uint32 cServerTimeDelta 1500;
    +            if (
    plrMover->m_anti_LastServerTime != 0)
    +            {
    +                
    cServerTimeDelta cServerTime plrMover->m_anti_LastServerTime;
    +                
    plrMover->m_anti_DeltaServerTime += cServerTimeDelta;
    +                
    plrMover->m_anti_LastServerTime cServerTime;
    +            }
    +            else
    +                
    plrMover->m_anti_LastServerTime cServerTime;
    +
    +            
    // resync times on client login (first 15 sec for heavy areas)
    +            if (plrMover->m_anti_DeltaServerTime 15000 && plrMover->m_anti_DeltaClientTime 15000)
    +                
    plrMover->m_anti_DeltaClientTime plrMover->m_anti_DeltaServerTime;
    +
    +            const 
    int32 sync_time plrMover->m_anti_DeltaClientTime plrMover->m_anti_DeltaServerTime;
    +
    +            
    #ifdef ANTICHEAT_DEBUG
    +            TC_LOG_WARN("cheat""AC2-%s Time > cClientTimeDelta: %d, cServerTime: %d | deltaC: %d - deltaS: %d | SyncTime: %d"plrMover->GetName(), cClientTimeDeltacServerTimeplrMover->m_anti_DeltaClientTimeplrMover->m_anti_DeltaServerTimesync_time);
    +            
    #endif
    +
    +            
    // mistiming checks
    +            const int32 GetMistimingDelta abs(int32(World::GetMistimingDelta()));
    +            if (
    sync_time GetMistimingDelta)
    +            {
    +                
    cClientTimeDelta cServerTimeDelta;
    +                ++(
    plrMover->m_anti_MistimingCount);
    +
    +                const 
    bool bMistimingModulo plrMover->m_anti_MistimingCount 50 == 0;
    +
    +                if (
    bMistimingModulo)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                    TC_LOG_WARN("cheat""AC2-%s, mistiming exception #%d, mistiming: %dms Action: %s"plrMover->GetName().c_str(),  plrMover->m_anti_MistimingCountsync_time, &Warden::Penalty);
    +                    
    #endif
    +                    check_passed false;
    +                }
    +                
    //if (vehMover)
    +                //    vehMover->Die();
    +                // Tell the player "Sure, you can fly!"
    +                {
    +                    
    WorldPacket data(SMSG_MOVE_SET_CAN_FLY12);
    +                    
    data.append(plrMover->GetPackGUID());
    +                    
    data << uint32(0);
    +                    
    SendPacket(&data);
    +                }
    +                
    // Then tell the player "Wait, no, you can't."
    +                {
    +                    
    WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY12);
    +                    
    data.append(plrMover->GetPackGUID());
    +                    
    data << uint32(0);
    +                    
    SendPacket(&data);
    +                }
    +                
    //plrMover->FallGround(2);
    +
    +                
    /* Disabled, not passive at all, and apparently causing crashes:
    +                if (plrMover->m_anti_MistimingCount > World::GetMistimingAlarms())
    +                {
    +                    sWorld.SendWorldText(3, strcat("Kicking cheater: ", plrMover->GetName()));
    +                    KickPlayer();
    +                    return;
    +                } */
    +            }
    +            
    // end mistiming checks
    +
    +            const 
    uint32 curDest plrMover->m_taxi.GetTaxiDestination(); // check taxi flight
    +            if (!curDest)
    +            {
    +                
    UnitMoveType move_type;
    +
    +                
    // calculating section
    +                // current speed
    +                if (movementInfo.flags MOVEMENTFLAG_FLYING)
    +                    
    move_type movementInfo.flags MOVEMENTFLAG_BACKWARD MOVE_FLIGHT_BACK MOVE_FLIGHT;
    +                else if (
    movementInfo.flags MOVEMENTFLAG_SWIMMING)
    +                    
    move_type movementInfo.flags MOVEMENTFLAG_BACKWARD MOVE_SWIM_BACK MOVE_SWIM;
    +                else if (
    movementInfo.flags MOVEMENTFLAG_WALKING)
    +                    
    move_type MOVE_WALK;
    +                
    // hmm... in first time after login player has MOVE_SWIMBACK instead MOVE_WALKBACK
    +                else
    +                    
    move_type movementInfo.flags MOVEMENTFLAG_BACKWARD MOVE_SWIM_BACK MOVE_RUN;
    +
    +                const 
    float current_speed mover->GetSpeed(move_type);
    +                
    // end current speed
    +
    +                
    // movement distance
    +                const float delta_x plrMover->m_transport || plrMover->m_temp_transport plrMover->GetPositionX() - movementInfo.pos.GetPositionX();
    +                const 
    float delta_y plrMover->m_transport || plrMover->m_temp_transport plrMover->GetPositionY() - movementInfo.pos.GetPositionY();
    +                const 
    float delta_z plrMover->m_transport || plrMover->m_temp_transport plrMover->GetPositionZ() - movementInfo.pos.GetPositionZ();
    +                const 
    float real_delta plrMover->m_transport || plrMover->m_temp_transport pow(delta_x2) + pow(delta_y2);
    +                
    // end movement distance
    +
    +                const 
    bool no_fly_auras = !(plrMover->HasAuraType(SPELL_AURA_FLY) || plrMover->HasAuraType(SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED)
    +                    || 
    plrMover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) || plrMover->HasAuraType(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED)
    +                    || 
    plrMover->HasAuraType(SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS) || plrMover->HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK));
    +                const 
    bool no_fly_flags = (movementInfo.flags & (MOVEMENTFLAG_CAN_FLY MOVEMENTFLAG_FLYING)) == 0;
    +
    +                const 
    bool no_swim_flags = (movementInfo.flags MOVEMENTFLAG_SWIMMING) == 0;
    +                const 
    bool no_swim_in_water = !mover->IsInWater();
    +                const 
    bool no_swim_above_water movementInfo.pos.GetPositionZ()-7.0f >= mover->GetBaseMap()->GetWaterLevel(movementInfo.pos.GetPositionX(),movementInfo.pos.GetPositionY());
    +                const 
    bool no_swim_water no_swim_in_water && no_swim_above_water;
    +
    +                const 
    bool no_waterwalk_flags = (movementInfo.flags MOVEMENTFLAG_WATERWALKING) == 0;
    +                const 
    bool no_waterwalk_auras = !(plrMover->HasAuraType(SPELL_AURA_WATER_WALK) || plrMover->HasAuraType(SPELL_AURA_GHOST));
    +
    +                if (
    cClientTimeDelta 0)
    +                    
    cClientTimeDelta 0;
    +                const 
    float time_delta cClientTimeDelta 1500 float(cClientTimeDelta)/1000.0f 1.5f// normalize time - 1.5 second allowed for heavy loaded server
    +
    +                const 
    float tg_z = (real_delta != && no_fly_auras && no_swim_flags) ? (pow(delta_z2) / real_delta) : -99999// movement distance tangents
    +
    +                if (
    current_speed plrMover->m_anti_Last_HSpeed && plrMover->m_anti_LastSpeedChangeTime == 0)
    +                    
    plrMover->m_anti_LastSpeedChangeTime movementInfo.time uint32(floor(((plrMover->m_anti_Last_HSpeed current_speed) * 1500)) + 100); // 100ms above for random fluctuation
    +
    +                const 
    float allowed_delta plrMover->m_transport || plrMover->m_temp_transport // movement distance allowed delta
    +                    pow(std::max(current_speedplrMover->m_anti_Last_HSpeed) * time_delta2)
    +                    + 
    2                                                                             // minimum allowed delta
    +                    + (tg_z 2.2 pow(delta_z2)/2.37f 0);                                     // mountain fall allowed delta
    +
    +                if (
    movementInfo.time plrMover->m_anti_LastSpeedChangeTime)
    +                {
    +                    
    plrMover->m_anti_Last_HSpeed current_speed;                                    // store current speed
    +                    plrMover->m_anti_Last_VSpeed = -2.3f;
    +                    
    plrMover->m_anti_LastSpeedChangeTime 0;
    +                }
    +                
    // end calculating section
    +
    +                
    // AntiGravity (thanks to Meekro)
    +                const float JumpHeight plrMover->m_anti_JumpBaseZ movementInfo.pos.GetPositionZ();
    +                if (
    no_fly_auras && no_swim_in_water && plrMover->m_anti_JumpBaseZ != && JumpHeight plrMover->m_anti_Last_VSpeed)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                    TC_LOG_WARN("cheat""AC2-%s, AntiGravity exception. JumpHeight = %f, Allowed Vertical Speed = %f",
    +                        
    plrMover->GetName().c_str(), JumpHeightplrMover->m_anti_Last_VSpeed);
    +                    
    #endif
    +                    check_passed false;
    +                    
    //if (vehMover)
    +                    //    vehMover->Die();
    +                    // Tell the player "Sure, you can fly!"
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_SET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    // Then tell the player "Wait, no, you can't."
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    //plrMover->FallGround(2);
    +                }
    +
    +                
    // multi jump checks
    +                if (opcode == MSG_MOVE_JUMP)
    +                {
    +                    if (
    no_fly_auras && no_swim_water)
    +                    {
    +                        if (
    plrMover->m_anti_JumpCount >= 1)
    +                        {
    +                            
    // don't process new jump packet
    +                            check_passed false;
    +                            
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                            TC_LOG_WARN("cheat""AC2-%s, Multijump exception."plrMover->GetName().c_str(), JumpHeightplrMover->m_anti_Last_VSpeed);
    +                            
    #endif
    +                            //if (vehMover)
    +                            //    vehMover->Die();
    +                            // Tell the player "Sure, you can fly!"
    +                            {
    +                                
    WorldPacket data(SMSG_MOVE_SET_CAN_FLY12);
    +                                
    data.append(plrMover->GetPackGUID());
    +                                
    data << uint32(0);
    +                                
    SendPacket(&data);
    +                            }
    +                            
    // Then tell the player "Wait, no, you can't."
    +                            {
    +                                
    WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY12);
    +                                
    data.append(plrMover->GetPackGUID());
    +                                
    data << uint32(0);
    +                                
    SendPacket(&data);
    +                            }
    +                            
    //plrMover->FallGround(2);
    +                            plrMover->m_anti_JumpCount 0;
    +                        }
    +                        else
    +                        {
    +                            
    plrMover->m_anti_JumpCount += 1;
    +                            
    plrMover->m_anti_JumpBaseZ movementInfo.pos.GetPositionZ();
    +                        }
    +                    } else
    +                        
    plrMover->m_anti_JumpCount 0;
    +                }
    +
    +                
    // speed and teleport hack checks
    +                if (real_delta allowed_delta)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                    if (real_delta 4900.0f)
    +                    {
    +                        
    TC_LOG_WARN("cheat""AC2-%s, speed exception | cDelta=%f aDelta=%f | cSpeed=%f lSpeed=%f deltaTime=%f"plrMover->GetName().c_str(), real_deltaallowed_deltacurrent_speedplrMover->m_anti_Last_HSpeedtime_delta);
    +                    } else {
    +                        
    TC_LOG_WARN("cheat""AC2-%s, teleport exception | cDelta=%f aDelta=%f | cSpeed=%f lSpeed=%f deltaTime=%f"plrMover->GetName().c_str(), real_deltaallowed_deltacurrent_speedplrMover->m_anti_Last_HSpeedtime_delta);
    +                    }
    +                    
    #endif
    +                    check_passed false;
    +                    
    //if (vehMover)
    +                    //    vehMover->Die();
    +                    //plrMover->FallGround(2);
    +                }
    +
    +                
    // mountain hack checks // 1.56f (delta_z < GetPlayer()->m_anti_Last_VSpeed))
    +                if (delta_z plrMover->m_anti_Last_VSpeed && plrMover->m_anti_JumpCount == && tg_z 2.37f)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                    TC_LOG_WARN("cheat""AC2-%s, mountain exception | tg_z=%f"plrMover->GetName().c_str(), tg_z);
    +                    
    #endif
    +                    check_passed false;
    +                
    //    if (vehMover)
    +                //        vehMover->Die();
    +                }
     
    -    
    /* process position-change */
    +                // Fly hack checks
    +                if (no_fly_auras && !no_fly_flags)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO // Aura numbers: 201, 206, 207, 208, 209, 211
    +                    TC_LOG_WARN("cheat""AC2-%s, flight exception. {SPELL_AURA_FLY=[%X]} {SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED=[%X]} {SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED=[%X]} {SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS=[%X]} {SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK=[%X]} {plrMover->GetVehicle()=[%X]}",
    +                        
    plrMover->GetName().c_str(),
    +                        
    plrMover->HasAuraType(SPELL_AURA_FLY), plrMover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED),
    +                        
    plrMover->HasAuraType(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED), plrMover->HasAuraType(SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS),
    +                        
    plrMover->HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK), plrMover->GetVehicle());
    +                    
    #endif
    +                    check_passed false;
    +                    
    //if (vehMover)
    +                    //    vehMover->Die();
    +                    // Tell the player "Sure, you can fly!"
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_SET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    // Then tell the player "Wait, no, you can't."
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    //plrMover->FallGround(2);
    +                }
    +
    +                
    // Waterwalk checks
    +                if (no_waterwalk_auras && !no_waterwalk_flags)
    +                {
    +                    
    #ifdef ANTICHEAT_EXCEPTION_INFO
    +                    TC_LOG_WARN("cheat""AC2-%s, waterwalk exception. [%X]{SPELL_AURA_WATER_WALK=[%X]}",
    +                        
    plrMover->GetName().c_str(), movementInfo.flagsplrMover->HasAuraType(SPELL_AURA_WATER_WALK));
    +                    
    #endif
    +                    check_passed false;
    +                    
    //if (vehMover)
    +                    //    vehMover->Die();
    +                    // Tell the player "Sure, you can fly!"
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_SET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    // Then tell the player "Wait, no, you can't."
    +                    {
    +                        
    WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY12);
    +                        
    data.append(plrMover->GetPackGUID());
    +                        
    data << uint32(0);
    +                        
    SendPacket(&data);
    +                    }
    +                    
    //plrMover->FallGround(2);
    +                }
    +
    +                
    // Teleport To Plane checks
    +                if (no_swim_in_water && movementInfo.pos.GetPositionZ() < 0.0001f && movementInfo.pos.GetPositionZ() > -0.0001f)
    +                {
    +                    if (const 
    Map *map plrMover->GetMap())
    +                    {
    +                        
    float plane_z map->GetHeight(movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), MAX_HEIGHT) - movementInfo.pos.GetPositionZ();
    +                        
    plane_z = (plane_z < -500.0f) ? 0.0f plane_z// check holes in height map
    +                        if (plane_z 0.1f || plane_z < -0.1f)
    +                        {
    +                            
    #ifdef ANTICHEAT_DEBUG
    +                            TC_LOG_WARN("cheat""AC2-%s, teleport to plane exception. plane_z: %f"plrMover->GetName(), plane_z);
    +                            
    #endif
    +                            #ifdef ANTICHEAT_EXCEPTION_INFO
    +                            if (plrMover->m_anti_TeleToPlane_Count World::GetTeleportToPlaneAlarms())
    +                            {
    +                                
    TC_LOG_WARN("cheat""AC2-%s, teleport to plane exception. Exception count: %d"plrMover->GetName().c_str(), plrMover->m_anti_TeleToPlane_Count);
    +                                
    /* Disabled, not passive at all, and apparently causing crashes:
    +                                sWorld.SendWorldText(3, strcat("Kicking cheater: ", plrMover->GetName()));
    +                                KickPlayer();
    +                                return; */
    +                            }
    +                            
    #endif
    +                            ++(plrMover->m_anti_TeleToPlane_Count);
    +                            
    check_passed false;
    +                            
    //if (vehMover)
    +                            //    vehMover->Die();
    +                        }
    +                    }
    +                }
    +                else
    +                    
    plrMover->m_anti_TeleToPlane_Count 0;
    +            }
    +        }
    +    }
    +     
    /* process position-change */
    +    if (check_passed)
    +    {
         
    WorldPacket data(opcoderecvData.size());
         
    movementInfo.time movementInfo.time m_clientTimeDelay MOVEMENT_PACKET_TIME_DELAY;
     
    @@ -
    376,11 +766,20 @@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
     
         
    mover->UpdatePosition(movementInfo.pos);
     
    -    if (
    plrMover)                                            // nothing is charmed, or player charmed
    +    if (plrMover && !vehMover)                               // nothing is charmed, or player charmed
         
    {
             
    plrMover->UpdateFallInformationIfNeed(movementInfoopcode);
     
    -        if (
    movementInfo.pos.GetPositionZ() < -500.0f)
    +        
    float underMapValueZ;
    +
    +        switch (
    plrMover->GetMapId())
    +        {
    +            case 
    617underMapValueZ 3.0f; break; // Dalaran Sewers
    +            case 618underMapValueZ 28.0f; break; // Ring of Valor
    +            default: underMapValueZ = -500.0f; break;
    +        }
    +
    +        if (
    movementInfo.pos.GetPositionZ() < underMapValueZ)
             {
                 if (!(
    plrMover->GetBattleground() && plrMover->GetBattleground()->HandlePlayerUnderMap(_player)))
                 {
    @@ -
    398,+797,31 @@ void WorldSession::HandleMovementOpcodes(WorldPacketrecvData)
                     }
                 }
             }
    +        
    // movement anticheat
    +        if (plrMover->m_anti_AlarmCount 0)
    +        {
    +            
    TC_LOG_WARN("cheat""AC2-%s produce %d anticheat alarms."plrMover->GetName().c_str(), plrMover->m_anti_AlarmCount);
    +            
    plrMover->m_anti_AlarmCount 0;
    +        }
    +        
    // end movement anticheat
    +     }
    +    }
    +    else if (
    plrMover)
    +    {
    +        if (
    plrMover->m_transport)
    +        {
    +            
    plrMover->m_transport->RemovePassenger(plrMover);
    +            
    plrMover->m_transport NULL;
    +        }
    +        
    plrMover->m_temp_transport NULL;
    +        ++(
    plrMover->m_anti_AlarmCount);
    +        
    WorldPacket data;
    +        
    plrMover->SetUnitMovementFlags(0);
    +        
    plrMover->SendTeleportAckPacket();
    +        
    plrMover->BuildHeartBeatMsg(&data);
    +        
    plrMover->SendMessageToSet(&datatrue);
         }
    +
     }
     
     
    void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recvData)
    @@ -
    517,+941,@@ void WorldSession::HandleMountSpecialAnimOpcode(WorldPacket/*recvData*/)
         
    GetPlayer()->SendMessageToSet(&datafalse);
     }
     
    -
    void WorldSession::HandleMoveKnockBackAck(WorldPacketrecvData)
    +
    void WorldSession::HandleMoveKnockBackAck(WorldPacket recvData)
     {
         
    TC_LOG_DEBUG("network""CMSG_MOVE_KNOCK_BACK_ACK");
     
    @@ -
    532,+956,18 @@ void WorldSession::HandleMoveKnockBackAck(WorldPacketrecvData)
         
    MovementInfo movementInfo;
         
    ReadMovementInfo(recvData, &movementInfo);
     
    +    
    // Save movement flags
    +    _player->SetUnitMovementFlags(movementInfo.flags);
    +    
    #ifdef ANTICHEAT_DEBUG
    +    TC_LOG_WARN("cheat""%s CMSG_MOVE_KNOCK_BACK_ACK: time: %d, fall time: %d | xyzo: %f,%f,%fo(%f) flags[%X] Vspeed: %f, Hspeed: %f"GetPlayer()->GetName(), movementInfo.timemovementInfo.fallTimemovementInfo.pos.m_positionXmovementInfo.pos.m_positionYmovementInfo.pos.m_positionZmovementInfo.pos.m_orientationmovementInfo.flagsmovementInfo.jump.zspeedmovementInfo.jump.xyspeed);
    +    
    #endif
    +
         
    _player->m_movementInfo movementInfo;
    +    
    _player->m_anti_Last_HSpeed movementInfo.jump.xyspeed;
    +    
    _player->m_anti_Last_VSpeed movementInfo.jump.zspeed 3.2f movementInfo.jump.zspeed 1.0f 3.2f;
    +
    +    const 
    uint32 dt = (_player->m_anti_Last_VSpeed 0) ? int(ceil(_player->m_anti_Last_VSpeed/-25)*1000) : int(ceil(_player->m_anti_Last_VSpeed/25)*1000);
    +    
    _player->m_anti_LastSpeedChangeTime movementInfo.time dt 1000;
     
         
    WorldPacket data(MSG_MOVE_KNOCK_BACK66);
         
    data.appendPackGUID(guid);
    diff --git a/src/server/game/Handlers/TaxiHandler.cpp b/src/server/game/Handlers/TaxiHandler.cpp
    index ae25d9f
    ..1460962 100644
    --- a/src/server/game/Handlers/TaxiHandler.cpp
    +++ b/src/server/game/Handlers/TaxiHandler.cpp
    @@ -48,+48,@@ void WorldSession::SendTaxiStatus(uint64 guid)
             return;
         }
     
    -    
    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam());
    +    
    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam(),0);
     
         
    // not found nearest
         
    if (curloc == 0)
    @@ -
    93,+93,@@ void WorldSession::HandleTaxiQueryAvailableNodes(WorldPacketrecvData)
     
    void WorldSession::SendTaxiMenu(Creatureunit)
     {
         
    // find current node
    -    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam());
    +    
    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam(),0);
     
         if (
    curloc == 0)
             return;
    @@ -
    133,+133,@@ void WorldSession::SendDoFlight(uint32 mountDisplayIduint32 pathuint32 pathN
     bool WorldSession
    ::SendLearnNewTaxiNode(Creatureunit)
     {
         
    // find current node
    -    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam());
    +    
    uint32 curloc sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam(),0);
     
         if (
    curloc == 0)
             return 
    true;                                        // `true` send to avoid WorldSession::SendTaxiMenu call with one more curlock seartch with same false result.
    @@ -202,+202,13 @@ void WorldSession::HandleMoveSplineDoneOpcode(WorldPacketrecvData)
         
    uint64 guid// used only for proper packet read
         
    recvData.readPackGUID(guid);
     
    +    
    // movement anticheat code
    +    const Unit *mover _player->m_mover;
    +    const 
    Player *plMover mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover NULL;
    +    if (!
    plMover)
    +        return;
    +    
    // end movement anticheat
    +
         
    MovementInfo movementInfo;                              // used only for proper packet read
         
    ReadMovementInfo(recvData, &movementInfo);
     
    @@ -
    214,10 +221,75 @@ void WorldSession::HandleMoveSplineDoneOpcode(WorldPacketrecvData)
     
         
    uint32 curDest GetPlayer()->m_taxi.GetTaxiDestination();
         if (!
    curDest)
    -        return;
    +    {
    +        
    // movement anticheat code
    +        GetPlayer()->UpdatePosition(movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), movementInfo.pos.GetPositionZ(), movementInfo.pos.GetOrientation());
    +        
    GetPlayer()->m_movementInfo movementInfo;
    +        
    GetPlayer()->SetUnitMovementFlags(movementInfo.flags);
    +
    +        
    // calc time deltas
    +        int32 cClientTimeDelta 0;
    +        if (
    GetPlayer()->m_anti_LastClientTime != 0)
    +        {
    +            
    cClientTimeDelta movementInfo.time GetPlayer()->m_anti_LastClientTime;
    +            
    GetPlayer()->m_anti_DeltaClientTime += cClientTimeDelta;
    +            
    GetPlayer()->m_anti_LastClientTime movementInfo.time;
    +        }
    +        else
    +            
    GetPlayer()->m_anti_LastClientTime movementInfo.time;
     
    -    
    TaxiNodesEntry const* curDestNode sTaxiNodesStore.LookupEntry(curDest);
    +        const 
    uint64 cServerTime getMSTime();
    +        
    uint32 cServerTimeDelta 0;
    +        if (
    GetPlayer()->m_anti_LastServerTime != 0)
    +        {
    +            
    cServerTimeDelta cServerTime GetPlayer()->m_anti_LastServerTime;
    +            
    GetPlayer()->m_anti_DeltaServerTime += cServerTimeDelta;
    +            
    GetPlayer()->m_anti_LastServerTime cServerTime;
    +        }
    +        else
    +            
    GetPlayer()->m_anti_LastServerTime cServerTime;
    +        
    // end movement anticheat
    +        return;
    +       }
    +    
    // movment anticheat
    +    const uint32 curloc =
    +    
    sObjectMgr->GetNearestTaxiNode(movementInfo.pos.GetPositionX(),movementInfo.pos.GetPositionY(),movementInfo.pos.GetPositionZ(),GetPlayer()->GetMapId(),GetPlayer()->GetTeam(), curDest);
    +    
    // end movement anticheat
    +
    +    
    // sLog.outBasic("AC2-%s > | xyzo: %f,%f,%fo(%f) flags[%X] | curloc: %d | destloc: %d ",
    +    // GetPlayer()->GetName(), movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o,
    +    // movementInfo.flags, curloc, curDest);
    +     TaxiNodesEntry const* curDestNode sTaxiNodesStore.LookupEntry(curDest);
    +    if (
    curDestNode && curDestNode->map_id == GetPlayer()->GetMapId())
    +        while (
    GetPlayer()->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE)
    +            
    GetPlayer()->GetMotionMaster()->MovementExpired(false);
    +
    +    
    // movement anticheat code
    +    GetPlayer()->UpdatePosition(movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), movementInfo.pos.GetPositionZ(), movementInfo.pos.GetOrientation());
    +    
    GetPlayer()->m_movementInfo movementInfo;
    +    
    GetPlayer()->SetUnitMovementFlags(movementInfo.flags);
    +    
    // calc time deltas
    +    int32 cClientTimeDelta 0;
    +    if (
    GetPlayer()->m_anti_LastClientTime != 0)
    +    {
    +        
    cClientTimeDelta movementInfo.time GetPlayer()->m_anti_LastClientTime;
    +        
    GetPlayer()->m_anti_DeltaClientTime += cClientTimeDelta;
    +        
    GetPlayer()->m_anti_LastClientTime movementInfo.time;
    +    }
    +    else
    +        
    GetPlayer()->m_anti_LastClientTime movementInfo.time;
     
    +    const 
    uint64 cServerTime getMSTime();
    +    
    uint32 cServerTimeDelta 0;
    +    if (
    GetPlayer()->m_anti_LastServerTime != 0)
    +    {
    +        
    cServerTimeDelta cServerTime GetPlayer()->m_anti_LastServerTime;
    +        
    GetPlayer()->m_anti_DeltaServerTime += cServerTimeDelta;
    +        
    GetPlayer()->m_anti_LastServerTime cServerTime;
    +    }
    +    else
    +        
    GetPlayer()->m_anti_LastServerTime cServerTime;
    +    
    // end movement anticheat
         // far teleport case
         
    if (curDestNode && curDestNode->map_id != GetPlayer()->GetMapId())
         {
    @@ -
    234,+306,23 @@ void WorldSession::HandleMoveSplineDoneOpcode(WorldPacketrecvData)
             }
             return;
         }
    +    
    // movement anticheat fix - disallow unmount from taxi
    +    if (curloc != curDest)
    +    {
    +         
    // current source node for next destination
    +        uint32 sourcenode GetPlayer()->m_taxi.GetTaxiSource();
    +        
    uint16 MountId sObjectMgr->GetTaxiMountDisplayId(sourcenodeGetPlayer()->GetTeam());
    +
    +        
    uint32 pathcost;
    +        
    sObjectMgr->GetTaxiPath(sourcenodecurDestpathcost);
    +
    +        if (
    path && MountId)
    +            
    SendDoFlight(MountIdpath1);                 // skip start fly node
    +        else
    +            
    GetPlayer()->m_taxi.ClearTaxiDestinations();    // clear problematic path and next
    +        return;
    +    }
    +    
    // end movement anticheat
     
         
    uint32 destinationnode GetPlayer()->m_taxi.NextTaxiDestination();
         if (
    destinationnode 0)                              // if more destinations to go
    diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
    index 7ad7b68
    ..542f726 100644
    --- a/src/server/game/World/World.cpp
    +++ b/src/server/game/World/World.cpp
    @@ -93,+93,11 @@ float World::m_MaxVisibleDistanceInBGArenas   DEFAULT_VISIBILITY_BGARENAS;
     
    int32 World::m_visibility_notify_periodOnContinents DEFAULT_VISIBILITY_NOTIFY_PERIOD;
     
    int32 World::m_visibility_notify_periodInInstances  DEFAULT_VISIBILITY_NOTIFY_PERIOD;
     
    int32 World::m_visibility_notify_periodInBGArenas   DEFAULT_VISIBILITY_NOTIFY_PERIOD;
    -
    +
    // movement anticheat
    +bool World::m_EnableMvAnticheat true;
    +
    uint32 World::m_TeleportToPlaneAlarms 50;
    +
    uint32 World::m_MistimingAlarms 200;
    +
    uint32 World::m_MistimingDelta 15000;
     
    /// World constructor
     
    World::World()
     {
    @@ -
    564,+568,41 @@ void World::LoadConfigSettings(bool reload)
             
    TC_LOG_ERROR("server.loading""DurabilityLossChance.Block (%f) must be >=0. Using 0.0 instead."rate_values[RATE_DURABILITY_LOSS_BLOCK]);
             
    rate_values[RATE_DURABILITY_LOSS_BLOCK] = 0.0f;
         }
    +    
    // movement anticheat
    +    m_EnableMvAnticheat sConfigMgr->GetBoolDefault("Anticheat.Movement.Enable"true);
    +    
    m_TeleportToPlaneAlarms sConfigMgr->GetIntDefault("Anticheat.Movement.TeleportToPlaneAlarms"50);
    +    if (
    m_TeleportToPlaneAlarms 20)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.TeleportToPlaneAlarms (%d) must be >= 20. Using 20 instead."m_TeleportToPlaneAlarms);
    +        
    m_TeleportToPlaneAlarms 20;
    +    }
    +    if (
    m_TeleportToPlaneAlarms 100)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.TeleportToPlaneAlarms (%d) must be <= 100. Using 100 instead."m_TeleportToPlaneAlarms);
    +        
    m_TeleportToPlaneAlarms 100;
    +    }
    +    
    m_MistimingDelta sConfigMgr->GetIntDefault("Anticheat.Movement.MistimingDelta"15000);
    +    if (
    m_MistimingDelta 5000)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.m_MistimingDelta (%d) must be >= 5000ms. Using 5000ms instead."m_MistimingDelta);
    +        
    m_MistimingDelta 5000;
    +    }
    +    if (
    m_MistimingDelta 50000)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.m_MistimingDelta (%d) must be <= 50000ms. Using 50000ms instead."m_MistimingDelta);
    +        
    m_MistimingDelta 50000;
    +    }
    +    
    m_MistimingAlarms sConfigMgr->GetIntDefault("Anticheat.Movement.MistimingAlarms"200);
    +    if (
    m_MistimingAlarms 100)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.MistimingAlarms (%d) must be >= 100. Using 100 instead."m_MistimingAlarms);
    +        
    m_MistimingAlarms 100;
    +    }
    +    if (
    m_MistimingAlarms 500)
    +    {
    +        
    TC_LOG_INFO("server.loading""Anticheat.Movement.m_MistimingAlarms (%d) must be <= 500. Using 500 instead."m_MistimingAlarms);
    +        
    m_MistimingAlarms 500;
    +    }
         
    ///- Read other configuration items from the config file
     
         
    m_bool_configs[CONFIG_DURABILITY_LOSS_IN_PVP] = sConfigMgr->GetBoolDefault("DurabilityLoss.InPvP"false);
    diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
    index 9435fa8
    ..0466011 100644
    --- a/src/server/game/World/World.h
    +++ b/src/server/game/World/World.h
    @@ -711,+711,14 @@ class World
             
    static int32 GetVisibilityNotifyPeriodOnContinents(){ return m_visibility_notify_periodOnContinents; }
             static 
    int32 GetVisibilityNotifyPeriodInInstances() { return m_visibility_notify_periodInInstances;  }
             static 
    int32 GetVisibilityNotifyPeriodInBGArenas()  { return m_visibility_notify_periodInBGArenas;   }
    +        
    // movement anticheat
    +        static bool GetEnableMvAnticheat()       { return m_EnableMvAnticheat;     }
    +        static 
    uint32 GetTeleportToPlaneAlarms() { return m_TeleportToPlaneAlarms; }
    +        static 
    uint32 GetMistimingDelta()        { return m_MistimingDelta;        }
    +        static 
    uint32 GetMistimingAlarms()       { return m_MistimingAlarms;       }
    +        static 
    uint32 GetTeleportToPlanePenalty() { return m_TeleportToPlanePenalty;}
    +        static 
    uint32 GetMovementPenalty()        { return m_MovementPenalty;       }
    +        
    // end movement anticheat
     
             
    void ProcessCliCommands();
             
    void QueueCliCommand(CliCommandHoldercommandHolder) { cliCmdQueue.add(commandHolder); }
    @@ -
    817,+825,13 @@ class World
             
    static int32 m_visibility_notify_periodOnContinents;
             static 
    int32 m_visibility_notify_periodInInstances;
             static 
    int32 m_visibility_notify_periodInBGArenas;
    -
    +        
    // movement anticheat enable flag
    +        static bool m_EnableMvAnticheat;
    +        static 
    uint32 m_TeleportToPlaneAlarms;
    +        static 
    uint32 m_TeleportToPlanePenalty;
    +        static 
    uint32 m_MovementPenalty;
    +        static 
    uint32 m_MistimingDelta;
    +        static 
    uint32 m_MistimingAlarms;
             
    // CLI command holder to be thread safe
             
    ACE_Based::LockedQueue<CliCommandHolder*, ACE_Thread_MutexcliCmdQueue;
     
    diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
    index 23db333
    ..79bd72f 100644
    --- a/src/server/worldserver/worldserver.conf.dist
    +++ b/src/server/worldserver/worldserver.conf.dist
    @@ -1124,+1124,47 @@ DungeonFinder.OptionsMask 1
     DBC
    .EnforceItemAttributes 1
     
     
    #
    +#    Anticheat.Movement.Enable
    +#        Enable Movement Anticheat
    +#        Default: 1 - on
    +#                 0 - off
    +#
    +
    +
    Anticheat.Movement.Enable 1
    +
    +
    #        Default:     0 - (Disabled, Logging only)
    +#                     1 - (Kick)
    +#                     2 - (Ban)
    +
    +
    Anticheat.Movement.Action 0
    +
    +
    #
    +#    Anticheat.Movement.TeleportToPlaneAlarms
    +#        maximum alarms before logging mode will be switched from debug to error (default 50, allowed 20 - 100)
    +#
    +
    +
    Anticheat.Movement.TeleportToPlaneAlarms 50
    +
    +
    #        Default:     0 - (Disabled, Logging only)
    +#                     1 - (Kick)
    +#                     2 - (Ban)
    +
    +
    Anticheat.Movement.TeleportToPlaneAlarms 0
    +
    +
    #
    +#    Anticheat.Movement.MistimingDelta
    +#        mistiming intelval between client and serverside (default 15000 ms, allowed 5000 - 50000 ms)
    +#
    +
    +
    Anticheat.Movement.MistimingDelta 15000
    +
    +
    #
    +#    Anticheat.Movement.MistimingAlarms
    +#        mistiming alarms before logging mode will be switched from debug to error (default 200, allowed 100 - 500)
    +#
    +
    +
    Anticheat.Movement.MistimingAlarms 200
    +
     
    #   AccountInstancesPerHour
     #        Description: Controls the max amount of different instances player can enter within hour
     #        Default:     5
    @@ -2708,+2749,@@ Appender.DBErrors=2,2,0,DBErrors.log
     Appender
    .Server=2,2,0,Server.log,w
     Appender
    .GM=2,2,15,gm/gm_%s.log
     Appender
    .DBErrors=2,2,0,DBErrors.log
    +Appender.Cheat=2,4,1,Cheat.log
     
     
    #  Logger config values: Given a logger "name"
     #    Logger.name
    @@ -2796,+2838,@@ Logger.DBErrors=26,5,Console Server DBErrors
     
    #Logger.chat.log=3,Console Server
     #Logger.calendar=3,Console Server
     #Logger.chat.system=3,Console Server
    -#Logger.cheat=3,Console Server
    +Logger.cheat=3,Console Cheat
     
    #Logger.commands.ra=3,Console Server
     #Logger.condition=3,Console Server
     #Logger.entities.pet=3,Console Server 
    فدای داداش گلم :) یه آموزش نصب هم میزاشتین عالی میشد :| ما تازه کاریم در هر حال

  8. #7
    دستاورد ها:
    اجتماعیRecommendation First Class1 سال ثبت نام شده استبرچسب زن کلاس اولاوردرایو

    شماره عضویت
    1
    تاریخ عضویت
    Oct 2014
    محل سکونت
    بوشهر
    نوشته ها
    1,771
    نسل
    نسل مورد علاقه
    نژاد
    نژاد  مورد علاقه
    کلاس
     کلاس  مورد علاقه
    سورس
     سورس مورد علاقه
    پچ
    پچ مورد علاقه
    پسندیده : 724
    مورد پسند : 1,162 بار در 581 پست
    سیستم عامل و مرورگر:
    از قبل بوده :

    تنها كاربران عضو مي توانند لينك ها را مشاهده كنند.

    2 کاربر پست Nightprince عزیز را پسندیده اند .

    iceboy (04-25-2015),Promise (04-26-2015)


  9. #8

    شماره عضویت
    92
    تاریخ عضویت
    Dec 2014
    محل سکونت
    گلستان
    نوشته ها
    97
    نسل
    نسل مورد علاقه
    نژاد
    نژاد  مورد علاقه
    کلاس
     کلاس  مورد علاقه
    سورس
     سورس مورد علاقه
    پچ
    پچ مورد علاقه
    پسندیده : 53
    مورد پسند : 56 بار در 29 پست
    سیستم عامل و مرورگر:
    فایل config هم بزارید
    هیچ چیز انی نیست که در نگاه اول به نظر میرسد (اهورا)

  10. #9

    شماره عضویت
    266
    تاریخ عضویت
    Apr 2015
    نوشته ها
    75
    نسل
    نسل مورد علاقه
    نژاد
    نژاد  مورد علاقه
    کلاس
     کلاس  مورد علاقه
    سورس
     سورس مورد علاقه
    پچ
    پچ مورد علاقه
    پسندیده : 91
    مورد پسند : 24 بار در 14 پست
    سیستم عامل و مرورگر:
    بابا این رو TDB 58 خیلی ارور میده موقع کامپایل

  11. #10
    جایزه ها:
    پایان دهنده بحث ها

    شماره عضویت
    8
    تاریخ عضویت
    Oct 2014
    نوشته ها
    256
    نسل
    نسل مورد علاقه