Compare commits
5 Commits
2b6e2f12fb
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 65f3535382 | |||
| 7657dd4731 | |||
| 25d255ddad | |||
| 0c87f040f6 | |||
| 08426fa6d4 |
@@ -54,6 +54,10 @@ services:
|
||||
DB_PORT: 3306
|
||||
DB_USER: ${DB_USER:-sylvania}
|
||||
DB_PASSWORD: ${DB_PASSWORD:-sylvania}
|
||||
REALM_NAME: ${REALM_NAME:-Sylvania Solo}
|
||||
REALM_ADDRESS: ${REALM_ADDRESS:-127.0.0.1}
|
||||
REALM_PORT: ${REALM_PORT:-8086}
|
||||
DBC_LOCALE: ${DBC_LOCALE:-8}
|
||||
EXTERNAL_ADDRESS: ${EXTERNAL_ADDRESS:-127.0.0.1}
|
||||
ports:
|
||||
- "1119:1119"
|
||||
|
||||
@@ -993,6 +993,68 @@ void WorldSession::HandleSetRaidDifficultyOpcode(WorldPackets::Misc::SetRaidDiff
|
||||
}
|
||||
}
|
||||
|
||||
// Les raids d'avant Warlords ne passent pas par CMSG_SET_RAID_DIFFICULTY pour le mode
|
||||
// heroique : le client envoie CMSG_TOGGLE_DIFFICULTY, sans rien preciser, et attend que
|
||||
// le serveur bascule entre normal et heroique en conservant la taille du raid. Cet
|
||||
// opcode n'etait pas traite du tout, si bien que le client repondait « vous ne remplissez
|
||||
// pas les conditions requises » -- impossible de monter les Terres de feu en heroique.
|
||||
void WorldSession::HandleToggleDifficultyOpcode(WorldPackets::Misc::ToggleDifficulty& /*toggleDifficulty*/)
|
||||
{
|
||||
Difficulty difficultyID;
|
||||
switch (_player->GetLegacyRaidDifficultyID())
|
||||
{
|
||||
case DIFFICULTY_10_N: difficultyID = DIFFICULTY_10_HC; break;
|
||||
case DIFFICULTY_25_N: difficultyID = DIFFICULTY_25_HC; break;
|
||||
case DIFFICULTY_10_HC: difficultyID = DIFFICULTY_10_N; break;
|
||||
case DIFFICULTY_25_HC: difficultyID = DIFFICULTY_25_N; break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
// Memes garde-fous que le changement de difficulte ordinaire : on ne bascule pas
|
||||
// depuis l'interieur d'une instance, et seul le chef decide pour le groupe.
|
||||
Map* map = _player->FindMap();
|
||||
if (map && map->IsDungeon())
|
||||
{
|
||||
TC_LOG_DEBUG("network", "WorldSession::HandleToggleDifficultyOpcode: player (Name: %s, %s) tried to toggle the difficulty while inside an instance!",
|
||||
_player->GetName().c_str(), _player->GetGUID().ToString().c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
Group* group = _player->GetGroup();
|
||||
if (group)
|
||||
{
|
||||
if (!group->IsLeader(_player->GetGUID()))
|
||||
return;
|
||||
|
||||
for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
|
||||
{
|
||||
Player* groupGuy = itr->GetSource();
|
||||
if (!groupGuy)
|
||||
continue;
|
||||
|
||||
if (!groupGuy->IsInMap(groupGuy))
|
||||
return;
|
||||
|
||||
if (groupGuy->GetMap()->IsRaid())
|
||||
{
|
||||
TC_LOG_DEBUG("network", "WorldSession::HandleToggleDifficultyOpcode: %s tried to toggle the difficulty while group member (Name: %s, %s) is inside!",
|
||||
_player->GetGUID().ToString().c_str(), groupGuy->GetName().c_str(), groupGuy->GetGUID().ToString().c_str());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
group->ResetInstances(INSTANCE_RESET_CHANGE_DIFFICULTY, true, true, _player);
|
||||
group->SetLegacyRaidDifficultyID(difficultyID);
|
||||
}
|
||||
else
|
||||
{
|
||||
_player->ResetInstances(INSTANCE_RESET_CHANGE_DIFFICULTY, true, true);
|
||||
_player->SetLegacyRaidDifficultyID(difficultyID);
|
||||
_player->SendRaidDifficulty(true);
|
||||
}
|
||||
}
|
||||
|
||||
void WorldSession::HandleSetTaxiBenchmark(WorldPackets::Misc::SetTaxiBenchmarkMode& packet)
|
||||
{
|
||||
_player->ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_TAXI_BENCHMARK, packet.Enable);
|
||||
|
||||
@@ -300,6 +300,16 @@ namespace WorldPackets
|
||||
uint8 Legacy = 0;
|
||||
};
|
||||
|
||||
// Le bouton « heroique » des raids d'avant Warlords : aucune difficulte n'est
|
||||
// transmise, le client demande simplement la bascule normal <-> heroique.
|
||||
class ToggleDifficulty final : public ClientPacket
|
||||
{
|
||||
public:
|
||||
ToggleDifficulty(WorldPacket&& packet) : ClientPacket(CMSG_TOGGLE_DIFFICULTY, std::move(packet)) { }
|
||||
|
||||
void Read() override { }
|
||||
};
|
||||
|
||||
class DungeonDifficultySet final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -830,7 +830,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_HANDLER(CMSG_TIME_SYNC_RESPONSE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleTimeSyncResponse);
|
||||
DEFINE_HANDLER(CMSG_TIME_SYNC_RESPONSE_DROPPED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_TIME_SYNC_RESPONSE_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_TOGGLE_DIFFICULTY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_TOGGLE_DIFFICULTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleToggleDifficultyOpcode);
|
||||
DEFINE_HANDLER(CMSG_TOGGLE_PVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTogglePvP);
|
||||
DEFINE_HANDLER(CMSG_TOTEM_DESTROYED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTotemDestroyed);
|
||||
DEFINE_HANDLER(CMSG_TRADE_SKILL_SET_FAVORITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
|
||||
|
||||
@@ -569,6 +569,7 @@ namespace WorldPackets
|
||||
class TutorialSetFlag;
|
||||
class SetDungeonDifficulty;
|
||||
class SetRaidDifficulty;
|
||||
class ToggleDifficulty;
|
||||
class PortGraveyard;
|
||||
class ReclaimCorpse;
|
||||
class RepopRequest;
|
||||
@@ -1727,6 +1728,7 @@ class TC_GAME_API WorldSession
|
||||
void HandleFarSightOpcode(WorldPackets::Misc::FarSight& packet);
|
||||
void HandleSetDungeonDifficultyOpcode(WorldPackets::Misc::SetDungeonDifficulty& setDungeonDifficulty);
|
||||
void HandleSetRaidDifficultyOpcode(WorldPackets::Misc::SetRaidDifficulty& setRaidDifficulty);
|
||||
void HandleToggleDifficultyOpcode(WorldPackets::Misc::ToggleDifficulty& toggleDifficulty);
|
||||
void HandleSetTitleOpcode(WorldPackets::Character::SetTitle& packet);
|
||||
void HandleTimeSyncResponse(WorldPackets::Misc::TimeSyncResponse& packet);
|
||||
void HandleDiscardedTimeSyncAcks(WorldPackets::Misc::DiscardedTimeSyncAcks& packet);
|
||||
|
||||
@@ -115,7 +115,7 @@ class boss_nalorakk : public CreatureScript
|
||||
{
|
||||
boss_nalorakkAI(Creature* creature) : BossAI(creature, DATA_NALORAKK),
|
||||
_bearForm(false), _waveEvent(true), _waveInProgress(false), _inMove(false),
|
||||
_wave(0), _currentPoint(0), _targetPoint(0), _checkTimer(0) { }
|
||||
_wave(0), _currentPoint(0), _targetPoint(0), _checkTimer(0), _moveTimeout(0) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
@@ -134,6 +134,7 @@ class boss_nalorakk : public CreatureScript
|
||||
_currentPoint = 0;
|
||||
_targetPoint = 0;
|
||||
_checkTimer = 0;
|
||||
_moveTimeout = 0;
|
||||
_waveGuids.clear();
|
||||
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
|
||||
@@ -284,13 +285,15 @@ class boss_nalorakk : public CreatureScript
|
||||
: (_targetPoint == 8 ? 8 : _targetPoint);
|
||||
|
||||
_currentPoint = next;
|
||||
_moveTimeout = 20000;
|
||||
me->GetMotionMaster()->MovePoint(_currentPoint, NalorakkWay[_currentPoint][0], NalorakkWay[_currentPoint][1], NalorakkWay[_currentPoint][2]);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id) override
|
||||
// Arrivee a une etape -- soit annoncee par le moteur de deplacement, soit
|
||||
// forcee par le chrono ci-dessous quand la montee se bloque.
|
||||
void OnReachedPoint()
|
||||
{
|
||||
if (!_waveEvent || type != POINT_MOTION_TYPE || !_inMove || _currentPoint != id)
|
||||
return;
|
||||
_moveTimeout = 0;
|
||||
|
||||
if (_currentPoint == _targetPoint)
|
||||
{
|
||||
@@ -302,6 +305,14 @@ class boss_nalorakk : public CreatureScript
|
||||
AdvanceOnePoint();
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id) override
|
||||
{
|
||||
if (!_waveEvent || type != POINT_MOTION_TYPE || !_inMove || _currentPoint != id)
|
||||
return;
|
||||
|
||||
OnReachedPoint();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
@@ -350,6 +361,21 @@ class boss_nalorakk : public CreatureScript
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
// Le trajet entre deux paliers passe par un escalier bati en VMAP : si le
|
||||
// calcul de chemin cale, le boss reste plante en route et l'evenement ne
|
||||
// repart jamais. Au-dela de vingt secondes on le pose d'office sur l'etape.
|
||||
if (_inMove && _moveTimeout)
|
||||
{
|
||||
if (_moveTimeout <= diff)
|
||||
{
|
||||
me->GetMotionMaster()->Clear(false);
|
||||
me->NearTeleportTo(NalorakkWay[_currentPoint][0], NalorakkWay[_currentPoint][1], NalorakkWay[_currentPoint][2], me->GetOrientation());
|
||||
OnReachedPoint();
|
||||
}
|
||||
else
|
||||
_moveTimeout -= diff;
|
||||
}
|
||||
|
||||
// Deroulement des vagues : il ne recule qu'une fois la vague abattue.
|
||||
if (_waveInProgress)
|
||||
{
|
||||
@@ -447,6 +473,7 @@ class boss_nalorakk : public CreatureScript
|
||||
uint32 _currentPoint;
|
||||
uint32 _targetPoint;
|
||||
uint32 _checkTimer;
|
||||
uint32 _moveTimeout;
|
||||
std::vector<ObjectGuid> _waveGuids;
|
||||
};
|
||||
|
||||
|
||||
@@ -532,6 +532,20 @@ class boss_alysrazor : public CreatureScript
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
|
||||
}
|
||||
|
||||
// Elle meurt en vol. La ramener dans JustDied ne suffisait pas : la chute est
|
||||
// deja engagee et MoveFall vise le terrain (la lave, vers z=48) en traversant
|
||||
// la plateforme, qui n'est qu'une structure VMAP a 55,5. On la pose donc au
|
||||
// centre de l'arene AVANT le coup fatal, et sans declencher de chute.
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
|
||||
{
|
||||
if (damage >= me->GetHealth())
|
||||
{
|
||||
me->SetCanFly(false);
|
||||
me->SetDisableGravity(false);
|
||||
me->NearTeleportTo(centerPos.GetPositionX(), centerPos.GetPositionY(), centerPos.GetPositionZ(), centerPos.GetOrientation());
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
@@ -539,11 +553,7 @@ class boss_alysrazor : public CreatureScript
|
||||
RemoveEncounterAuras();
|
||||
me->SetCanFly(false);
|
||||
me->SetDisableGravity(false);
|
||||
// Elle meurt en vol : laissee a elle-meme, la depouille traverse le vide
|
||||
// entre les plateformes et finit dans la lave, butin compris. On la ramene
|
||||
// au centre de l'arene avant la chute, comme en jeu officiel.
|
||||
me->NearTeleportTo(centerPos.GetPositionX(), centerPos.GetPositionY(), centerPos.GetPositionZ(), centerPos.GetOrientation());
|
||||
me->GetMotionMaster()->MoveFall();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
|
||||
@@ -300,9 +300,11 @@ class boss_lord_rhyolith : public CreatureScript
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
// Les joueurs frappent les pieds, jamais le colosse lui-meme : il lui
|
||||
// arrive de n'avoir aucune cible, et on sortait alors d'UpdateAI avant
|
||||
// meme d'avoir teste la bascule en phase 2. Le boss restait plante en
|
||||
// premiere forme a un point de vie. Le passage de phase passe donc en
|
||||
// premier, avant toute verification de cible.
|
||||
if ((instance->GetData(DATA_RHYOLITH_HEALTH_SHARED) != 0))
|
||||
me->SetHealth(instance->GetData(DATA_RHYOLITH_HEALTH_SHARED) * 2);
|
||||
|
||||
@@ -350,6 +352,9 @@ class boss_lord_rhyolith : public CreatureScript
|
||||
return;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
|
||||
@@ -680,7 +680,7 @@ StrictPetNames = 0
|
||||
# 10 - (ptBR)
|
||||
# 11 - (itIT)
|
||||
|
||||
DBC.Locale = 0
|
||||
DBC.Locale = 8
|
||||
|
||||
#
|
||||
# DeclinedNames
|
||||
|
||||
Reference in New Issue
Block a user