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