--- MiscHandler.cpp 2007-03-07 20:24:37.000000000 +0700 +++ ../MiscHandler.cpp 2007-03-07 20:28:15.000000000 +0700 @@ -344,6 +344,10 @@ GetPlayer()->pvpInfo.endTimer = time(NULL); // start toggle-off } } +#define ZONE_GURUBASHI 33 +#define ZONE_DIREMAUL 2557 +#define AREA_GURUBASHI 2177 +#define AREA_DIREMAUL 3217 void WorldSession::HandleZoneUpdateOpcode( WorldPacket & recv_data ) { @@ -353,6 +357,14 @@ recv_data >> newZone; sLog.outDetail("WORLD: Recvd ZONE_UPDATE: %u", newZone); + const AreaTableEntry* const area = GetAreaEntryByAreaID(newZone); +if(area && newZone == ZONE_GURUBASHI && GetPlayer()->GetAreaId() == AREA_GURUBASHI && GetPlayer()->GetInArena() != 1){ + GetPlayer()->SetPvPFFA(true, 1); +}else if(area && newZone == ZONE_DIREMAUL && GetPlayer()->GetAreaId() == AREA_DIREMAUL){ + GetPlayer()->SetPvPFFA(true, 2); +}else if(area && GetPlayer()->GetInArena() != 0){ + GetPlayer()->SetPvPFFACounter(time(NULL)); +} GetPlayer()->UpdateZone(); } --- MovementHandler.cpp 2007-03-07 20:30:20.000000000 +0700 +++ ../MovementHandler.cpp 2007-03-07 20:33:22.000000000 +0700 @@ -48,7 +48,7 @@ return; /* extract packet */ - uint32 flags, time, fallTime; + uint32 flags, time2, fallTime; float x, y, z, orientation; uint32 t_GUIDl, t_GUIDh; @@ -56,8 +56,9 @@ float s_angle; float j_unk1, j_sinAngle, j_cosAngle, j_xyspeed; - recv_data >> flags >> time; - recv_data >> x >> y >> z >> orientation; + +recv_data >> flags >> time2; +recv_data >> x >> y >> z >> orientation; if (flags & MOVEMENTFLAG_ONTRANSPORT) { // recheck @@ -161,6 +162,9 @@ GetPlayer()->SetPosition(x, y, z, orientation); GetPlayer()->SetMovementFlags(flags); + if(GetPlayer()->GetInArena() == 2 && GetPlayer()->GetPositionY() > float(1135.5)) + GetPlayer()->SetPvPFFACounter(time(NULL)); + } void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data) --- Player.cpp 2007-03-07 20:33:35.000000000 +0700 +++ ../Player.cpp 2007-03-07 20:38:07.000000000 +0700 @@ -135,6 +135,8 @@ m_lastManaUse = 0; m_deathTimer = 0; m_resurrectingSicknessExpire = 0; + m_pvpffa_count = 0; +m_inArena = false; m_DetectInvTimer = 1000; m_DiscoveredPj = 0; @@ -647,7 +649,7 @@ time_t now = time (NULL); UpdatePvPFlag(time(NULL)); - + UpdatePVPFFAFlag(time(NULL)); UpdateDuelFlag(time(NULL)); CheckDuelDistance(time(NULL)); @@ -11059,6 +11061,16 @@ UpdatePvP(false); } +void Player::UpdatePVPFFAFlag(time_t currTime) +{ + if(m_pvpffa_count == 0) return; + if( isInCombatWithPlayer() ) + SetPvPFFACounter(time(NULL)); + if((m_pvpffa_count+30) > currTime) return; + + SetPvPFFA(false); +} + void Player::UpdateDuelFlag(time_t currTime) { --- Player.h 2007-03-07 20:38:20.000000000 +0700 +++ ../Player.h 2007-03-07 20:40:43.000000000 +0700 @@ -278,6 +278,7 @@ PLAYER_FLAGS_GM = 0x00000008, PLAYER_FLAGS_GHOST = 0x00000010, PLAYER_FLAGS_RESTING = 0x00000020, + PLAYER_FLAGS_IN_PVP_FFA = 0x00000080, PLAYER_FLAGS_IN_PVP = 0x00000200, PLAYER_FLAGS_HIDE_HELM = 0x00000400, PLAYER_FLAGS_HIDE_CLOAK = 0x00000800, @@ -914,6 +915,22 @@ } void UpdateZone(); void UpdatePvPFlag(time_t currTime); + void UpdatePVPFFAFlag(time_t currTime); +void SetPvPFFA(bool b, uint8 arena=0) +{ + if( b ){ + SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP_FFA); + SetInArena(arena); + }else{ + RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP_FFA); + SetInArena(0); + } + SetPvPFFACounter(0); +} +void SetPvPFFACounter(time_t count) { m_pvpffa_count = count; } +uint8 GetInArena() { return m_inArena; } +void SetInArena(uint8 arena) { m_inArena = arena; } + /** todo: -maybe move UpdateDuelFlag+DuelComplete to independent DuelHandler.. **/ DuelInfo *duel; @@ -1330,6 +1347,9 @@ time_t m_resurrectingSicknessExpire; uint32 m_restTime; + time_t m_pvpffa_count; + uint8 m_inArena; + uint32 m_BlockValue; uint32 m_soulStoneSpell;