All pastes #753510 Raw Edit

Stuff

public text v1 · immutable
#753510 ·published 2007-10-29 09:29 UTC
rendered paste body
Index: configure.ac
===================================================================
--- configure.ac	(revision 4609)
+++ configure.ac	(working copy)
@@ -223,7 +223,9 @@
    src/mangosd/Makefile
    src/mangosd/mangosd.conf
    src/bindings/Makefile
-   src/bindings/universal/Makefile
+   src/bindings/ScriptDev2/Makefile
+   src/bindings/ScriptDev2/sql/Makefile
+   src/bindings/ScriptDev2/sql/Updates/Makefile
 ])
 
 ## Disabled Makefiles, until they are ready for a successful make and
Index: src/bindings/Makefile.am
===================================================================
--- src/bindings/Makefile.am	(revision 4609)
+++ src/bindings/Makefile.am	(working copy)
@@ -14,4 +14,4 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
-SUBDIRS = universal
+SUBDIRS = ScriptDev2
Index: src/game/BattleGroundWS.cpp
===================================================================
--- src/game/BattleGroundWS.cpp	(revision 4609)
+++ src/game/BattleGroundWS.cpp	(working copy)
@@ -120,6 +120,34 @@
             if(m_FlagsTimer[1] == 0)
                 RespawnFlag(HORDE, true);
         }
+		if(m_FlagState[0] == BG_WS_FLAG_STATE_ON_GROUND)
+        {
+            m_FlagsDropTimer[0] -= diff;
+
+			if(m_FlagsDropTimer[0] <= 0)
+                m_FlagsDropTimer[0] = 0;
+
+            if(m_FlagsDropTimer[0] == 0)
+                               EventDropTimerReturnedFlag(ALLIANCE);
+		}
+		else
+		{
+            m_FlagsDropTimer[0] = BG_WS_FLAG_DROPTIMER_DEFAULT;
+		}
+        if(m_FlagState[1] == BG_WS_FLAG_STATE_ON_GROUND)
+        {
+            m_FlagsDropTimer[1] -= diff;
+
+			if(m_FlagsDropTimer[1] <= 0)
+                m_FlagsDropTimer[1] = 0;
+
+            if(m_FlagsDropTimer[1] == 0)
+                               EventDropTimerReturnedFlag(HORDE);
+        }
+		else
+		{
+            m_FlagsDropTimer[1] = BG_WS_FLAG_DROPTIMER_DEFAULT;
+		}
     }
 }
 
@@ -169,6 +197,7 @@
     {
         SetHordeFlagPicker(0);                              // must be before aura remove to prevent 2 events (drop+capture) at the same time
         m_FlagState[1] = BG_WS_FLAG_STATE_WAIT_RESPAWN;           // horde flag in base (but not respawned yet)
+		m_FlagState[0] = BG_WS_FLAG_STATE_WAIT_RESPAWN;			  // alliance flag in base (but not respawned yet) 'cause we must respawn both flags
         Source->RemoveAurasDueToSpell(23333);               // Drop Horde Flag from Player
         message = LANG_BG_WS_CAPTURED_HF;
         type = CHAT_MSG_BG_SYSTEM_ALLIANCE;
@@ -176,11 +205,13 @@
             AddPoint(ALLIANCE, 1);
         PlaySoundToAll(8173);
         SpawnBGObject(BG_WS_OBJECT_H_FLAG, BG_WS_FLAG_RESPAWN_TIME/1000);
+		SpawnBGObject(BG_WS_OBJECT_A_FLAG, BG_WS_FLAG_RESPAWN_TIME/1000);
     }
     else
     {
         SetAllianceFlagPicker(0);                           // must be before aura remove to prevent 2 events (drop+capture) at the same time
         m_FlagState[0] = BG_WS_FLAG_STATE_WAIT_RESPAWN;           // alliance flag in base (but not respawned yet)
+		m_FlagState[1] = BG_WS_FLAG_STATE_WAIT_RESPAWN;			  // horde flag in base (but not respawned yet) 'cause we must respawn both flags (but not respawned yet)
         Source->RemoveAurasDueToSpell(23335);               // Drop Alliance Flag from Player
         message = LANG_BG_WS_CAPTURED_AF;
         type = CHAT_MSG_BG_SYSTEM_HORDE;
@@ -188,6 +219,7 @@
             AddPoint(HORDE, 1);
         PlaySoundToAll(8213);
         SpawnBGObject(BG_WS_OBJECT_A_FLAG, BG_WS_FLAG_RESPAWN_TIME/1000);
+		SpawnBGObject(BG_WS_OBJECT_H_FLAG, BG_WS_FLAG_RESPAWN_TIME/1000);
     }
 
     WorldPacket data;
@@ -242,6 +274,7 @@
                 type = CHAT_MSG_BG_SYSTEM_HORDE;
                 Source->CastSpell(Source, 23334, true);
                 set = true;
+				m_FlagsDropTimer[1] = BG_WS_FLAG_DROPTIMER_TIME;
             }
         }
     }
@@ -258,6 +291,7 @@
                 type = CHAT_MSG_BG_SYSTEM_ALLIANCE;
                 Source->CastSpell(Source, 23336, true);
                 set = true;
+				m_FlagsDropTimer[0] = BG_WS_FLAG_DROPTIMER_TIME;
             }
         }
     }
@@ -310,6 +344,37 @@
     SendPacketToAll(&data);
 }
 
+void BattleGroundWS::EventDropTimerReturnedFlag(uint32 Team)
+{
+    if(GetStatus() != STATUS_IN_PROGRESS)
+        return;
+
+    const char *message;
+
+    if(Team == ALLIANCE)
+    {
+        message = "The Alliance Flag was returned to it's base!";
+        UpdateFlagState(HORDE, 1);
+        RespawnFlag(ALLIANCE, false);
+		SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_ONE_DAY);
+        SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_IMMEDIATELY);
+    }
+    else
+    {
+        message = "The Horde Flag was returned to it's base!";
+        UpdateFlagState(ALLIANCE, 1);
+        RespawnFlag(HORDE, false);
+		SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_ONE_DAY);
+        SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_IMMEDIATELY);
+    }
+
+    PlaySoundToAll(8192);
+
+    WorldPacket data;
+    sChatHandler.FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, message, NULL);
+    SendPacketToAll(&data);
+}
+
 void BattleGroundWS::EventPlayerPickedUpFlag(Player *Source)
 {
     if(GetStatus() != STATUS_IN_PROGRESS)
@@ -531,6 +596,8 @@
     m_FlagState[1]      = BG_WS_FLAG_STATE_ON_BASE;
     m_TeamScores[0]     = 0;
     m_TeamScores[1]     = 0;
+	m_FlagsDropTimer[0] = BG_WS_FLAG_DROPTIMER_DEFAULT;
+	m_FlagsDropTimer[1] = BG_WS_FLAG_DROPTIMER_DEFAULT;
 
     SetWinner(2);
     SetStatus(STATUS_WAIT_QUEUE);
Index: src/game/BattleGroundWS.h
===================================================================
--- src/game/BattleGroundWS.h	(revision 4609)
+++ src/game/BattleGroundWS.h	(working copy)
@@ -23,6 +23,8 @@
 
 #define BG_WS_MAX_TEAM_SCORE      3
 #define BG_WS_FLAG_RESPAWN_TIME   23000
+#define BG_WS_FLAG_DROPTIMER_TIME 20000
+#define BG_WS_FLAG_DROPTIMER_DEFAULT 0
 
 #define BG_WS_SOUND_FLAG_CAPTURED_ALLIANCE 8173
 #define BG_WS_SOUND_FLAG_CAPTURED_HORDE    8213
@@ -110,6 +112,7 @@
         void EventPlayerDroppedFlag(Player *Source);
         void EventPlayerReturnedFlag(Player *Source);
         void EventPlayerPickedUpFlag(Player *Source);
+		void EventDropTimerReturnedFlag(uint32 Team);
 
         void RemovePlayer(Player *plr, uint64 guid);
         void HandleAreaTrigger(Player *Source, uint32 Trigger);
@@ -132,5 +135,6 @@
         uint8 m_FlagState[2];                               // for checking flag state
         uint32 m_TeamScores[2];
         int32 m_FlagsTimer[2];
+		int32 m_FlagsDropTimer[2];
 };
 #endif
Index: src/game/MovementHandler.cpp
===================================================================
--- src/game/MovementHandler.cpp	(revision 4609)
+++ src/game/MovementHandler.cpp	(working copy)
@@ -27,6 +27,7 @@
 #include "MapManager.h"
 #include "Transports.h"
 #include "BattleGroundMgr.h"
+#include "NameTables.h"
 
 void WorldSession::HandleMoveWorldportAckOpcode( WorldPacket & recv_data )
 {
@@ -124,6 +125,8 @@
     float  s_angle;
     float  j_unk1, j_sinAngle, j_cosAngle, j_xyspeed;
     float  u_unk1;
+    uint32 m_flags = GetPlayer()->GetMovementFlags();  
+    uint16 opcode = recv_data.GetOpcode(); 
 
     recv_data >> flags >> time;
     recv_data >> x >> y >> z >> orientation;
@@ -174,52 +177,63 @@
     if (flags & MOVEMENTFLAG_ONTRANSPORT)
     {
         // if we boarded a transport, add us to it
-        if (!GetPlayer()->m_transport)
+        if ((GetPlayer()->m_transportGUID == 0) && (t_GUID !=0))  
         {
-            // unmount before boarding
-            _player->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED);
+            if (!GetPlayer()->m_transport)
+            {
+                // unmount before boarding
+                _player->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED);
 
-            for (MapManager::TransportSet::iterator iter = MapManager::Instance().m_Transports.begin(); iter != MapManager::Instance().m_Transports.end(); ++iter)
-            {
-                if ((*iter)->GetGUID() == t_GUID)
+                for (MapManager::TransportSet::iterator iter = MapManager::Instance().m_Transports.begin(); iter != MapManager::Instance().m_Transports.end(); ++iter)
                 {
-                    GetPlayer()->m_transport = (*iter);
-                    (*iter)->AddPassenger(GetPlayer());
-                    break;
+                    if ((*iter)->GetGUID() == t_GUID)
+                    {
+                        GetPlayer()->m_transport = (*iter);
+                        (*iter)->AddPassenger(GetPlayer());
+                        break;
+                    }
                 }
             }
+            GetPlayer()->m_transportGUID = t_GUID;
         }
-        GetPlayer()->m_transX = t_x;
-        GetPlayer()->m_transY = t_y;
-        GetPlayer()->m_transZ = t_z;
-        GetPlayer()->m_transO = t_o;
-        GetPlayer()->m_transTime = t_time;
+        if (t_GUID !=0)
+        {
+            GetPlayer()->m_transX = t_x;
+            GetPlayer()->m_transY = t_y;
+            GetPlayer()->m_transZ = t_z;
+            GetPlayer()->m_transO = t_o;
+            GetPlayer()->m_transTime = t_time;
+        }
     }
-    else if (GetPlayer()->m_transport)                      // if we were on a transport, leave
+    else if (GetPlayer()->m_transportGUID != 0)
     {
-        GetPlayer()->m_transport->RemovePassenger(GetPlayer());
-        GetPlayer()->m_transport = NULL;
+        if (GetPlayer()->m_transport)                      // if we were on a transport, leave
+        {
+            GetPlayer()->m_transport->RemovePassenger(GetPlayer());
+            GetPlayer()->m_transport = NULL;
+        }
         GetPlayer()->m_transX = 0.0f;
         GetPlayer()->m_transY = 0.0f;
         GetPlayer()->m_transZ = 0.0f;
         GetPlayer()->m_transO = 0.0f;
         GetPlayer()->m_transTime = 0;
+        GetPlayer()->m_transportGUID = 0;
     }
 
-    if (GetPlayer()->HasMovementFlags(MOVEMENTFLAG_FALLING) && !(flags & MOVEMENTFLAG_FALLING))
+    if (opcode == MSG_MOVE_FALL_LAND)
     {
         Player *target = GetPlayer();
+        uint32 safefallTime = (GetPlayer()->HasAuraType(SPELL_AURA_SAFE_FALL)) ? 17000 : 0; // -17 modifier to fall damage at safe fall aura (from wowwiki.com)
+        //sLog.outBasic("Fall time: %d; SafeTime: %d",fallTime, safefallTime);
+        fallTime = (fallTime > safefallTime) ? (fallTime - safefallTime) : 0; 
         if (fallTime > 1100 && !target->isDead() && !target->isGameMaster() &&
             !target->HasAuraType(SPELL_AURA_HOVER) && !target->HasAuraType(SPELL_AURA_FEATHER_FALL))
         {
-            Map *map = MapManager::Instance().GetMap(target->GetMapId(), target);
-            float posz = map->GetWaterLevel(x,y);
             float fallperc = float(fallTime)*10/11000;
             uint32 damage = (uint32)(((fallperc*fallperc -1) / 9 * target->GetMaxHealth())*sWorld.getRate(RATE_DAMAGE_FALL));
 
             if (damage > 0 && damage < 2* target->GetMaxHealth())
                 target->EnvironmentalDamage(target->GetGUID(),DAMAGE_FALL, damage);
-            DEBUG_LOG("!! z=%f, pz=%f FallTime=%d posz=%f damage=%d" , z, target->GetPositionZ(),fallTime, posz, damage);
         }
 
         //handle fall and logout at the sametime
@@ -238,16 +252,117 @@
     if(((flags & MOVEMENTFLAG_SWIMMING) != 0) != GetPlayer()->IsInWater())
         GetPlayer()->SetInWater( !GetPlayer()->IsInWater() );
     /*----------------------*/
+    // ---- anti-cheat features -->>>
+    bool kicked = true; 
+    if ((GetPlayer()->m_transportGUID == 0) && !GetPlayer()->isTaxi() && sWorld.GetEnableMovementAnticheat())
+    {
+        UnitMoveType move_type; 
+ 
+        if (flags & MOVEMENTFLAG_FLYING) move_type = flags & MOVEMENTFLAG_BACKWARD ? MOVE_FLYBACK : MOVE_FLY;
+        else if (flags & MOVEMENTFLAG_SWIMMING) move_type = flags & MOVEMENTFLAG_BACKWARD ? MOVE_SWIMBACK : MOVE_SWIM; 
+        else if (flags & MOVEMENTFLAG_WALK) move_type = MOVE_WALK;
+        else move_type = flags & MOVEMENTFLAG_BACKWARD ? MOVE_SWIMBACK : MOVE_RUN;
+        //hmm... in first time after login player has MOVE_SWIMBACK instead MOVE_WALKBACK
 
+        float c_speed = 0;
+        float cur_speed = GetPlayer()->GetSpeed(move_type);
+        float delta_x = GetPlayer()->GetPositionX() - x;
+        float delta_y = GetPlayer()->GetPositionY() - y;
+        float delta_z = GetPlayer()->GetPositionZ() - z;
+        float delta = delta_x * delta_x + delta_y * delta_y;
+        float tg_z = -99999; //tangens
+        float delta_t = time - GetPlayer()->m_lastmovetime;
+        if (delta_t > 0) {
+            GetPlayer()->m_lastmovetime = time;
+        } else {delta_t = 0;}
+        delta_t = (delta_t < 1500) ? delta_t/1000 : 1.5; 
+        if (!(flags & (MOVEMENTFLAG_FLYING | MOVEMENTFLAG_SWIMMING)))
+          tg_z = (delta !=0) ? delta_z*delta_z / delta : -99999;
+        
+        if (cur_speed < GetPlayer()->m_lastspeed)
+        {
+            c_speed = GetPlayer()->m_lastspeed;
+            if (GetPlayer()->m_lastspeed_changetime == 0 ) 
+                GetPlayer()->m_lastspeed_changetime = time + (uint32)floor(((GetPlayer()->m_lastspeed / cur_speed) * 1000));
+        } else c_speed = cur_speed;
+
+        c_speed = c_speed * delta_t;
+        c_speed = c_speed * c_speed + 1.5;
+    
+        //static char const* move_type_name[MAX_MOVE_TYPE] = {  "Walk", "Run", "Walkback", "Swim", "Swimback", "Turn", "Fly", "Flyback" };
+        //sLog.outBasic("%s newcoord: tm:%d ftm:%d | %f,%f,%fo(%f) [%X][%s]$%s",GetPlayer()->GetName(),time,fallTime,x,y,z,orientation,flags, LookupName(opcode,g_worldOpcodeNames),move_type_name[move_type]);
+        //sLog.outBasic("%f",tg_z);
+
+        if ((delta > c_speed) && (delta_z < 1))
+        {
+            //sLog.outError("Ahhaaa.... %s is speed cheater!!! delta=%f c_speed=%f | cur_speed=%f last_speed=%f time=%f (%f %f %f %d)[%s]",GetPlayer()->GetName(),delta, c_speed, cur_speed, GetPlayer()->m_lastspeed,delta_t,GetPlayer()->GetPositionX(),GetPlayer()->GetPositionY(),GetPlayer()->GetPositionZ(), GetPlayer()->GetMapId(),LookupName(opcode,g_worldOpcodeNames));
+            kicked = false;
+        }
+        if ((delta>4900.0f) && !(delta < c_speed)) 
+        {
+            //sLog.outError("Ahhaaa.... %s is teleport cheater!!! delta=%f c_speed=%f | cur_speed=%f last_speed=%f time=%f (%f %f %f %d)",GetPlayer()->GetName(),delta, c_speed, cur_speed, GetPlayer()->m_lastspeed,delta_t,GetPlayer()->GetPositionX(),GetPlayer()->GetPositionY(),GetPlayer()->GetPositionZ(), GetPlayer()->GetMapId());
+            kicked = false;
+        }
+
+        if (time>GetPlayer()->m_lastspeed_changetime) 
+        {
+            GetPlayer()->m_lastspeed = cur_speed; // store current speed
+            if (GetPlayer()->m_lastspeed_changetime != 0) GetPlayer()->m_lastspeed_changetime = 0;
+        }
+
+        if ((tg_z > 1.55f) && (delta_z < -2.6f))
+        {
+           // sLog.outError("Ahhaaa.... %s is mountain cheater!!! tg_z=%f (%f %f %f %d)",GetPlayer()->GetName(),tg_z, GetPlayer()->GetPositionX(),GetPlayer()->GetPositionY(),GetPlayer()->GetPositionZ(), GetPlayer()->GetMapId());
+            kicked = false;
+        }   
+        if (((flags & (MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_FLYING)) != 0) && !GetPlayer()->isGameMaster() && !(GetPlayer()->HasAuraType(SPELL_AURA_MOD_SPEED_MOUNTED_FLIGHT) | GetPlayer()->HasAuraType(SPELL_AURA_FLY)))
+        {
+          // sLog.outError("Ahhaaa.... %s is fly cheater!!! SPELL_AURA_FLY=[%X]| SPELL_AURA_MOD_SPEED_MOUNTED_FLIGHT=[%X]", GetPlayer()->GetName(), GetPlayer()->HasAuraType(SPELL_AURA_FLY), GetPlayer()->HasAuraType(SPELL_AURA_MOD_SPEED_MOUNTED_FLIGHT));
+           kicked = false;
+        } 
+        if (((flags & MOVEMENTFLAG_WATERWALKING) != 0) && !GetPlayer()->isGameMaster() && !(GetPlayer()->HasAuraType(SPELL_AURA_WATER_WALK) | GetPlayer()->HasAuraType(SPELL_AURA_GHOST)))
+        {
+          // sLog.outError("Ahhaaa.... %s is water-walk cheater!!! SPELL_AURA_WATER_WALK=[%X]", GetPlayer()->GetName(), GetPlayer()->HasAuraType(SPELL_AURA_WATER_WALK));
+           kicked = false;
+        } 
+    } else if (flags & MOVEMENTFLAG_ONTRANSPORT)
+        {
+            float trans_rad = t_x*t_x + t_y*t_y + t_z*t_z;
+            if (trans_rad > 3600.0f) // transport radius = 60 yards //cheater with on_transport_flag
+            {
+                if (GetPlayer()->m_transport)
+                {
+                    GetPlayer()->m_transport->RemovePassenger(GetPlayer());
+                    GetPlayer()->m_transport = NULL;
+                }
+                GetPlayer()->m_transX = 0.0f;
+                GetPlayer()->m_transY = 0.0f;
+                GetPlayer()->m_transZ = 0.0f;
+                GetPlayer()->m_transO = 0.0f;
+                GetPlayer()->m_transTime = 0;
+                GetPlayer()->m_transportGUID = 0;
+            }
+        }
+    // <<---- anti-cheat features  
+
     /* process position-change */
-    recv_data.put<uint32>(4, getMSTime());
-    WorldPacket data(recv_data.GetOpcode(), (GetPlayer()->GetPackGUID().size()+recv_data.size()));
-    data.append(GetPlayer()->GetPackGUID());
-    data.append(recv_data.contents(), recv_data.size());
-    GetPlayer()->SendMessageToSet(&data, false);
+    if (kicked) 
+    {
+        recv_data.put<uint32>(4, getMSTime());
+        WorldPacket data(recv_data.GetOpcode(), (GetPlayer()->GetPackGUID().size()+recv_data.size()));
+        data.append(GetPlayer()->GetPackGUID());
+        data.append(recv_data.contents(), recv_data.size());
+        GetPlayer()->SendMessageToSet(&data, false);
 
-    GetPlayer()->SetPosition(x, y, z, orientation);
-    GetPlayer()->SetMovementFlags(flags);
+        GetPlayer()->SetPosition(x, y, z, orientation);
+        GetPlayer()->SetMovementFlags(flags);
+    } else {
+        WorldPacket data;
+        GetPlayer()->BuildTeleportAckMsg(&data, GetPlayer()->GetPositionX(), GetPlayer()->GetPositionY(), GetPlayer()->GetPositionZ(), GetPlayer()->GetOrientation());
+        GetPlayer()->GetSession()->SendPacket(&data);
+        GetPlayer()->BuildHeartBeatMsg(&data);
+        GetPlayer()->SendMessageToSet(&data, true); 
+    }
 }
 
 void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data)
@@ -394,12 +509,6 @@
 
 void WorldSession::HandleMoveKnockBackAck( WorldPacket & recv_data )
 {
-    // CHECK_PACKET_SIZE(recv_data,?);
-    sLog.outDebug("CMSG_MOVE_KNOCK_BACK_ACK");
-    // Currently not used but maybe use later for recheck final player position
-    // (must be at call same as into "recv_data >> x >> y >> z >> orientation;"
-
-    /* 
     uint32 flags, time;
     float x, y, z, orientation;
     uint64 guid;
@@ -418,8 +527,10 @@
     if(GetPlayer()->GetGUID()!=guid)
         return;
 
-    // check code
-    */
+    GetPlayer()->SetPosition(x, y, z, orientation);
+    GetPlayer()->SetMovementFlags(flags);
+    GetPlayer()->m_lastspeed = hspeed;
+    GetPlayer()->m_lastspeed_changetime = time+1500; 
 }
 
 void WorldSession::HandleMoveHoverAck( WorldPacket & recv_data )
Index: src/game/Player.cpp
===================================================================
--- src/game/Player.cpp	(revision 4609)
+++ src/game/Player.cpp	(working copy)
@@ -198,6 +198,10 @@
     m_rest_bonus=0;
     rest_type=REST_TYPE_NO;
     ////////////////////Rest System/////////////////////
+    m_lastmovetime = 0;
+    m_transportGUID = 0; 
+    m_lastspeed = 7; //RUN
+    m_lastspeed_changetime = 0;  
 
     m_mailsLoaded = false;
     m_mailsUpdated = false;
Index: src/game/Player.h
===================================================================
--- src/game/Player.h	(revision 4609)
+++ src/game/Player.h	(working copy)
@@ -1885,7 +1885,10 @@
         float m_rest_bonus;
         RestType rest_type;
         ////////////////////Rest System/////////////////////
-
+        uint32 m_lastmovetime;
+        uint64 m_transportGUID;
+        float  m_lastspeed; 
+        uint32  m_lastspeed_changetime; 
         // Transports
         float m_transX;
         float m_transY;
Index: src/game/TaxiHandler.cpp
===================================================================
--- src/game/TaxiHandler.cpp	(revision 4609)
+++ src/game/TaxiHandler.cpp	(working copy)
@@ -140,6 +140,7 @@
     GetPlayer()->Mount( MountId, true );
     
     FlightPathMovementGenerator *flight = new FlightPathMovementGenerator(path);
+    GetPlayer()->GetMotionMaster()->Clear(true);
     GetPlayer()->GetMotionMaster()->Mutate(flight);
 
     Path &pathnodes = flight->GetPath();
@@ -232,6 +233,13 @@
     uint32 path, cost;
 
     sLog.outDebug( "WORLD: Received CMSG_MOVE_SPLINE_DONE" );
+    uint32 flags, time;
+    float x, y, z, orientation;
+    recvPacket >> flags >> time;
+    recvPacket >> x >> y >> z >> orientation;
+    GetPlayer()->SetPosition(x, y, z, orientation);
+    GetPlayer()->SetMovementFlags(flags);
+    GetPlayer()->m_lastmovetime = time;  
 
     sourcenode      = GetPlayer()->GetTaxiSource();
     if ( sourcenode > 0 )                                   // if more destinations to go
Index: src/game/Unit.cpp
===================================================================
--- src/game/Unit.cpp	(revision 4609)
+++ src/game/Unit.cpp	(working copy)
@@ -3188,6 +3188,13 @@
                         case 33891: if(i_spellId==5420 || i_spellId==34123) is_triggered_by_spell = true; break;
                     }
                     break;
+           
+                case SPELL_AURA_MOD_ATTACK_POWER:
+                    switch(spellId)
+                    {
+                        case 32910: if(i_spellId==33757) is_triggered_by_spell = true; break;
+                    }
+                    break;
             }
         }
 
@@ -3845,7 +3852,48 @@
             CastCustomSpell(pVictim, 12654, &igniteDotBasePoints0, NULL, NULL, true, NULL, triggredByAura);
             return;
         }
+        // Windfury Weapon (Passive)
+        case 33757:
+        {
+           Item * item=((Player*)this)->GetItemByGuid(triggredByAura->GetCastItemGUID());
+           if (item && item->IsEquipped())
+           {
+            uint32 Windfury_Weapon;
+            switch (item->GetEnchantmentId(EnchantmentSlot(TEMP_ENCHANTMENT_SLOT)))
+            {
+               case 283: Windfury_Weapon = 33757;break;//1 Rank
+               case 284: Windfury_Weapon = 33756;break;//2 Rank
+               case 525: Windfury_Weapon = 33755;break;//3 Rank
+               case 1669:Windfury_Weapon = 33754;break;//4 Rank
+               case 2636:Windfury_Weapon = 33727;break;//5 Rank
+               default:
+                   triggredByAura->m_procCharges = 0;    // Remove aura after if no or wrong enchant
+                   sLog.outError("Unit::HandleDummyAuraProc: non handled spell id: %u (Windfury??)",dummySpell->Id);
+                return;
+            }
+            if (((Player*)this)->HasSpellCooldown(32910))
+               return;
+            SpellEntry const *Windfury = sSpellStore.LookupEntry(Windfury_Weapon);
+            
+            SpellEntry const *windfurySpell = sSpellStore.LookupEntry(32910);
 
+            int32 level = getLevel() - windfurySpell->spellLevel;
+            if (level > windfurySpell->maxLevel)
+                level = windfurySpell->maxLevel;
+
+            float basePointsPerLevel = windfurySpell->EffectRealPointsPerLevel[0];
+
+            int32 addvalue= - int32(level * basePointsPerLevel);
+
+            addvalue += Windfury->EffectBasePoints[0];
+            CastCustomSpell(this, 32910, &addvalue, NULL, NULL, true, item, triggredByAura);
+            ((Player*)this)->AddSpellCooldown(32910,0,time(NULL) + 3);
+           }
+           else
+             triggredByAura->m_procCharges = 0;    // Remove aura after if no or weapon not in hand (not need but...)
+           return;
+        }
+
         // Combustion
         case 11129:
         {
Index: src/game/World.cpp
===================================================================
--- src/game/World.cpp	(revision 4609)
+++ src/game/World.cpp	(working copy)
@@ -441,7 +441,10 @@
         sLog.outError("Visibility.Distance.InFlight can't be greater %f",MAX_VISIBILITY_DISTANCE-m_VisibleObjectGreyDistance);
         m_MaxVisibleDistanceInFlight = MAX_VISIBILITY_DISTANCE - m_VisibleObjectGreyDistance;
     }
-
+    // movement anticheat
+    m_EnableMovementAnticheat = sConfig.GetIntDefault("Anticheat.Movement",1);
+    if (m_EnableMovementAnticheat !=0) 
+        m_EnableMovementAnticheat = 1;  
     ///- Read the "Data" directory from the config file
     m_dataPath = sConfig.GetStringDefault("DataDir","./");
     if((m_dataPath.at(m_dataPath.length()-1)!='/') && (m_dataPath.at(m_dataPath.length()-1)!='\\'))
Index: src/game/World.h
===================================================================
--- src/game/World.h	(revision 4609)
+++ src/game/World.h	(working copy)
@@ -340,7 +340,8 @@
         static float GetMaxVisibleDistanceInFlight()    { return m_MaxVisibleDistanceInFlight;    }
         static float GetVisibleUnitGreyDistance()       { return m_VisibleUnitGreyDistance;       }
         static float GetVisibleObjectGreyDistance()     { return m_VisibleObjectGreyDistance;     }
-
+        //movement anticheat enable flag
+        uint32 GetEnableMovementAnticheat() {return m_EnableMovementAnticheat;} 
         void ProcessCliCommands();
         void QueueCliCommand(CliCommandHolder* command) { cliCmdQueue.add(command); }
 
@@ -397,7 +398,8 @@
         static float m_MaxVisibleDistanceInFlight;
         static float m_VisibleUnitGreyDistance;
         static float m_VisibleObjectGreyDistance;
-
+        //movement anticheat enable flag
+        uint32 m_EnableMovementAnticheat; 
         // CLI command holder to be thread safe
         ZThread::LockedQueue<CliCommandHolder*, ZThread::FastMutex> cliCmdQueue;
         SqlResultQueue *m_resultQueue;
Index: src/mangosd/Makefile.am
===================================================================
--- src/mangosd/Makefile.am	(revision 4609)
+++ src/mangosd/Makefile.am	(working copy)
@@ -33,8 +33,8 @@
 	WorldRunnable.h
 
 ## Link world daemon against the shared library
-mangos_worldd_LDADD = ../bindings/universal/libmangosscript.la ../game/libmangosgame.a ../shared/libmangosdatabase.a ../shared/libmangosconfig.a ../shared/libmangosauth.a ../shared/libmangosshared.a ../shared/libmangosvmaps.a ../shared/libmangosnetwork.a ../framework/libmangosframework.a ../../dep/src/zthread/libZThread.la ../../dep/src/g3dlite/libg3dlite.a
-mangos_worldd_LDFLAGS = -L../../dep/src/zthread  -L../../dep/src/g3dlite -L../bindings/universal/ $(MYSQL_LIBS) $(POSTGRE_LIBS) -L$(libdir) $(ZLIB) $(COMPATLIB) $(SSLLIB) -export-dynamic
+mangos_worldd_LDADD = ../bindings/ScriptDev2/libmangosscript.la ../game/libmangosgame.a ../shared/libmangosdatabase.a ../shared/libmangosconfig.a ../shared/libmangosauth.a ../shared/libmangosshared.a ../shared/libmangosvmaps.a ../shared/libmangosnetwork.a ../framework/libmangosframework.a ../../dep/src/zthread/libZThread.la ../../dep/src/g3dlite/libg3dlite.a
+mangos_worldd_LDFLAGS = -L../../dep/src/zthread  -L../../dep/src/g3dlite -L../bindings/ScriptDev2/ $(MYSQL_LIBS) $(POSTGRE_LIBS) -L$(libdir) $(ZLIB) $(COMPATLIB) $(SSLLIB) -export-dynamic
 
 ## Additional files to include when running 'make dist'
 #  Include world daemon configuration
Index: src/mangosd/mangosd.conf.in
===================================================================
--- src/mangosd/mangosd.conf.in	(revision 4609)
+++ src/mangosd/mangosd.conf.in	(working copy)
@@ -451,6 +451,11 @@
 # List of ids with delimiter ','
 vmap.ignoreSpellIds = "7720"
 
+#Enable movement anticheat features
+#Default: 1 (enable)
+#         0 (disable)
+Anticheat.Movement = 1
+
 # Subseqent kills of the same player decrease the amount of honor gained.
 # Maximum number of times a user may kill another player in one day and get honor for it.
 # Default: 10
Index: src/shared/Network/Socket.cpp
===================================================================
--- src/shared/Network/Socket.cpp	(revision 4609)
+++ src/shared/Network/Socket.cpp	(working copy)
@@ -345,6 +345,15 @@
 			SetCloseAndDelete();
 			return INVALID_SOCKET;
 		}
+
+        optval = 1;
+        if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *)&optval, sizeof(optval)) == -1)
+        {
+            Handler().LogError(this, "setsockopt(IPPROTO_TCP, TCP_NODELAY)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
+            closesocket(s);
+            SetCloseAndDelete();
+            return INVALID_SOCKET;
+        }
 	}
 	return s;
 }
@@ -1254,3 +1263,5 @@
 
 
 
+
+