diff --git a/src/game_character.h b/src/game_character.h index 33c27fd7c..cfdadd02f 100644 --- a/src/game_character.h +++ b/src/game_character.h @@ -1242,6 +1242,9 @@ inline int Game_Character::GetTransparency() const { } inline void Game_Character::SetTransparency(int value) { + if (GetType() == Player && data()->transparency != value) { + GMI().MainPlayerChangedTransparency(Utils::Clamp(value, 0, 7)); + } data()->transparency = Utils::Clamp(value, 0, 7); } diff --git a/src/multiplayer/game_multiplayer.cpp b/src/multiplayer/game_multiplayer.cpp index 45b98a765..63aafffa4 100644 --- a/src/multiplayer/game_multiplayer.cpp +++ b/src/multiplayer/game_multiplayer.cpp @@ -311,6 +311,12 @@ void Game_Multiplayer::InitConnection() { if (players.find(p.id) == players.end()) return; repeating_flashes.erase(p.id); }); + connection.RegisterHandler("tr", [this] (TransparencyPacket& p) { + if (players.find(p.id) == players.end()) return; + auto& player = players[p.id]; + int transparency = Utils::Clamp(p.transparency, 0, 7); + player.ch->SetTransparency(transparency); + }); connection.RegisterHandler("h", [this] (HiddenPacket& p) { if (players.find(p.id) == players.end()) return; auto& player = players[p.id]; @@ -586,6 +592,10 @@ void Game_Multiplayer::MainPlayerFlashed(int r, int g, int b, int p, int f) { last_flash_frame_index = frame_index; } +void Game_Multiplayer::MainPlayerChangedTransparency(int tranparency) { + connection.SendPacketAsync(transparency); +} + void Game_Multiplayer::MainPlayerChangedSpriteHidden(bool hidden) { int hidden_bin = hidden ? 1 : 0; connection.SendPacketAsync(hidden_bin); diff --git a/src/multiplayer/game_multiplayer.h b/src/multiplayer/game_multiplayer.h index 880c03bc6..ea40a0fac 100644 --- a/src/multiplayer/game_multiplayer.h +++ b/src/multiplayer/game_multiplayer.h @@ -28,6 +28,7 @@ class Game_Multiplayer { void MainPlayerChangedSpriteGraphic(std::string name, int index); void MainPlayerJumped(int x, int y); void MainPlayerFlashed(int r, int g, int b, int p, int f); + void MainPlayerChangedTransparency(int tranparency); void MainPlayerChangedSpriteHidden(bool hidden); void MainPlayerTeleported(int map_id, int x, int y); void MainPlayerTriggeredEvent(int event_id, bool action); diff --git a/src/multiplayer/messages.h b/src/multiplayer/messages.h index bccb25507..a99a8ce80 100644 --- a/src/multiplayer/messages.h +++ b/src/multiplayer/messages.h @@ -162,6 +162,14 @@ namespace S2C { : PlayerPacket(v.at(0)) {} }; + class TransparencyPacket : public PlayerPacket { + public: + TransparencyPacket(const PL& v) + : PlayerPacket(v.at(0)), + transparency(Decode(v.at(1))) {} + const int transparency; + }; + class HiddenPacket : public PlayerPacket { public: HiddenPacket(const PL& v) @@ -431,6 +439,15 @@ namespace C2S { std::string ToBytes() const override { return Build(); } }; + class TransparencyPacket : public C2SPacket { + public: + TransparencyPacket(int _transparency) : C2SPacket("tr"), + transparency(_transparency) {} + std::string ToBytes() const override { return Build(transparency); } + protected: + int transparency; + }; + class HiddenPacket : public C2SPacket { public: HiddenPacket(int _hidden_bin) : C2SPacket("h"),