Skip to content

Commit 566e0f4

Browse files
committed
Allow syncing player animation state
Closes ynoproject#80 (pending server PR)
1 parent b998167 commit 566e0f4

File tree

4 files changed

+42
-0
lines changed

4 files changed

+42
-0
lines changed

src/game_character.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,8 @@ inline bool Game_Character::IsAnimPaused() const {
11511151
}
11521152

11531153
inline void Game_Character::SetAnimPaused(bool value) {
1154+
if (GetType() == Player && data()->anim_paused != value)
1155+
GMI().MainPlayerChangedAnimState(value);
11541156
data()->anim_paused = value;
11551157
}
11561158

src/multiplayer/game_multiplayer.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,18 @@ void Game_Multiplayer::InitConnection() {
345345
}
346346
Web_API::OnPlayerSystemUpdated(p.name, p.id);
347347
});
348+
connection.RegisterHandler<AnimCtrlPacket>("anc", [this] (AnimCtrlPacket& p) {
349+
if (players.find(p.id) == players.end()) return;
350+
auto& player = players[p.id];
351+
switch (p.cmd) {
352+
case Messages::AnimStart:
353+
player.ch->SetAnimPaused(false);
354+
break;
355+
case Messages::AnimStop:
356+
player.ch->SetAnimPaused(true);
357+
break;
358+
}
359+
});
348360
connection.RegisterHandler<SEPacket>("se", [this] (SEPacket& p) {
349361
if (players.find(p.id) == players.end()) return;
350362
if (settings.enable_sounds) {
@@ -634,6 +646,11 @@ void Game_Multiplayer::MainPlayerTriggeredEvent(int event_id, bool action) {
634646
}
635647
}
636648

649+
void Game_Multiplayer::MainPlayerChangedAnimState(bool stopping) {
650+
auto msg = stopping ? Messages::AnimStop : Messages::AnimStart;
651+
connection.SendPacketAsync<Messages::C2S::AnimCtrlPacket>(msg);
652+
}
653+
637654
void Game_Multiplayer::SystemGraphicChanged(std::string_view sys) {
638655
connection.SendPacketAsync<SysNamePacket>(ToString(sys));
639656
Web_API::OnUpdateSystemGraphic(ToString(sys));

src/multiplayer/game_multiplayer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class Game_Multiplayer {
3333
void MainPlayerChangedSpriteHidden(bool hidden);
3434
void MainPlayerTeleported(int map_id, int x, int y);
3535
void MainPlayerTriggeredEvent(int event_id, bool action);
36+
void MainPlayerChangedAnimState(bool stopping);
3637
void SystemGraphicChanged(std::string_view sys);
3738
void SePlayed(const lcf::rpg::Sound& sound);
3839
bool IsPictureSynced(int pic_id, std::string_view pic_name);

src/multiplayer/messages.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88
#include "../game_pictures.h"
99

1010
namespace Messages {
11+
12+
enum AnimCommands {
13+
AnimStop,
14+
AnimStart,
15+
};
16+
1117
namespace S2C {
1218
using S2CPacket = Multiplayer::S2CPacket;
1319
using PL = Multiplayer::Connection::ParameterList;
@@ -186,6 +192,14 @@ namespace S2C {
186192
const std::string name;
187193
};
188194

195+
class AnimCtrlPacket : public PlayerPacket {
196+
public:
197+
AnimCtrlPacket(const PL& v)
198+
: PlayerPacket(v.at(0)),
199+
cmd((AnimCommands) Decode<int>(v.at(1))) {}
200+
const AnimCommands cmd;
201+
};
202+
189203
class SEPacket : public PlayerPacket {
190204
public:
191205
static lcf::rpg::Sound BuildSound(const PL& v) {
@@ -439,6 +453,14 @@ namespace C2S {
439453
int spd;
440454
};
441455

456+
class AnimCtrlPacket : public C2SPacket {
457+
public:
458+
AnimCtrlPacket(AnimCommands _cmd) : C2SPacket("anc"), cmd(_cmd) {}
459+
std::string ToBytes() const override { return Build((int) cmd); }
460+
protected:
461+
AnimCommands cmd;
462+
};
463+
442464
class SpritePacket : public C2SPacket {
443465
public:
444466
SpritePacket(std::string _n, int _i) : C2SPacket("spr"),

0 commit comments

Comments
 (0)