diff --git a/src/game_character.h b/src/game_character.h index c4de79507..4e9559cf1 100644 --- a/src/game_character.h +++ b/src/game_character.h @@ -1151,6 +1151,8 @@ inline bool Game_Character::IsAnimPaused() const { } inline void Game_Character::SetAnimPaused(bool value) { + if (GetType() == Player && data()->anim_paused != value) + GMI().MainPlayerChangedAnimState(value); data()->anim_paused = value; } diff --git a/src/multiplayer/game_multiplayer.cpp b/src/multiplayer/game_multiplayer.cpp index ccd8688e9..381daf420 100644 --- a/src/multiplayer/game_multiplayer.cpp +++ b/src/multiplayer/game_multiplayer.cpp @@ -345,6 +345,18 @@ void Game_Multiplayer::InitConnection() { } Web_API::OnPlayerSystemUpdated(p.name, p.id); }); + connection.RegisterHandler("anc", [this] (AnimCtrlPacket& p) { + if (players.find(p.id) == players.end()) return; + auto& player = players[p.id]; + switch (p.cmd) { + case Messages::AnimStart: + player.ch->SetAnimPaused(false); + break; + case Messages::AnimStop: + player.ch->SetAnimPaused(true); + break; + } + }); connection.RegisterHandler("se", [this] (SEPacket& p) { if (players.find(p.id) == players.end()) return; if (settings.enable_sounds) { @@ -634,6 +646,11 @@ void Game_Multiplayer::MainPlayerTriggeredEvent(int event_id, bool action) { } } +void Game_Multiplayer::MainPlayerChangedAnimState(bool stopping) { + auto msg = stopping ? Messages::AnimStop : Messages::AnimStart; + connection.SendPacketAsync(msg); +} + void Game_Multiplayer::SystemGraphicChanged(std::string_view sys) { connection.SendPacketAsync(ToString(sys)); Web_API::OnUpdateSystemGraphic(ToString(sys)); diff --git a/src/multiplayer/game_multiplayer.h b/src/multiplayer/game_multiplayer.h index c3435c3a3..4c0d75075 100644 --- a/src/multiplayer/game_multiplayer.h +++ b/src/multiplayer/game_multiplayer.h @@ -33,6 +33,7 @@ class Game_Multiplayer { void MainPlayerChangedSpriteHidden(bool hidden); void MainPlayerTeleported(int map_id, int x, int y); void MainPlayerTriggeredEvent(int event_id, bool action); + void MainPlayerChangedAnimState(bool stopping); void SystemGraphicChanged(std::string_view sys); void SePlayed(const lcf::rpg::Sound& sound); bool IsPictureSynced(int pic_id, std::string_view pic_name); diff --git a/src/multiplayer/messages.h b/src/multiplayer/messages.h index 9a4ebbccc..e943848cb 100644 --- a/src/multiplayer/messages.h +++ b/src/multiplayer/messages.h @@ -8,6 +8,12 @@ #include "../game_pictures.h" namespace Messages { + +enum AnimCommands { + AnimStop, + AnimStart, +}; + namespace S2C { using S2CPacket = Multiplayer::S2CPacket; using PL = Multiplayer::Connection::ParameterList; @@ -186,6 +192,14 @@ namespace S2C { const std::string name; }; + class AnimCtrlPacket : public PlayerPacket { + public: + AnimCtrlPacket(const PL& v) + : PlayerPacket(v.at(0)), + cmd((AnimCommands) Decode(v.at(1))) {} + const AnimCommands cmd; + }; + class SEPacket : public PlayerPacket { public: static lcf::rpg::Sound BuildSound(const PL& v) { @@ -439,6 +453,14 @@ namespace C2S { int spd; }; + class AnimCtrlPacket : public C2SPacket { + public: + AnimCtrlPacket(AnimCommands _cmd) : C2SPacket("anc"), cmd(_cmd) {} + std::string ToBytes() const override { return Build((int) cmd); } + protected: + AnimCommands cmd; + }; + class SpritePacket : public C2SPacket { public: SpritePacket(std::string _n, int _i) : C2SPacket("spr"),