celeste-avali-skin/SourceCode/CelesteNetAvaliComponent.cs

82 lines
2.9 KiB
C#

using Microsoft.Xna.Framework;
using Celeste.Mod.CelesteNet;
using Celeste.Mod.CelesteNet.Client;
using Celeste.Mod.CelesteNet.Client.Entities;
using Celeste.Mod.CelesteNet.DataTypes;
using DashColorMode = Celeste.Mod.AvaliSkin.AvaliSkinSettings.DashColorMode;
using SendReceive = Celeste.Mod.AvaliSkin.AvaliSkinSettings.SendReceive;
namespace Celeste.Mod.AvaliSkin {
public class CelesteNetAvaliComponent : CelesteNetGameComponent {
private static AvaliSkinSettings ModuleSettings => AvaliSkinModule.Settings;
public static CelesteNetAvaliComponent Instance;
private CelesteNetClientContext Ctx;
public CelesteNetAvaliComponent(CelesteNetClientContext context, Game game) : base(context, game) {
Instance = this;
Ctx = context;
}
public void Handle(CelesteNetConnection con, DataReady ready) {
SendAvaliSkin();
}
public void SendAvaliSkin() {
if (Ctx.Client != null && Ctx.Client.PlayerInfo != null) {
if (
ModuleSettings.CelesteNetSync == SendReceive.SendReceive
|| ModuleSettings.CelesteNetSync == SendReceive.Send
) {
Logger.Log(LogLevel.Info, "AvaliSkin", $"Sending updated DataPlayerAvaliSkin!");
AvaliConfig config = AvaliSkinModule.PlayerConfig;
Ctx.Client.Send(new DataPlayerAvaliSkin(Ctx.Client.PlayerInfo, config));
}
}
}
}
public class DataPlayerAvaliSkin : DataType<DataPlayerAvaliSkin> {
public AvaliConfig Config;
public DataPlayerInfo Player;
static DataPlayerAvaliSkin() { DataID = "avaliskin_skinconfig"; }
public DataPlayerAvaliSkin() {}
public DataPlayerAvaliSkin(DataPlayerInfo player, AvaliConfig config) {
this.Player = player;
this.Config = config;
}
public override MetaType[] GenerateMeta(DataContext ctx) => new MetaType[] {
new MetaPlayerPrivateState(Player),
new MetaBoundRef(DataType<DataPlayerInfo>.DataID, Player?.ID ?? uint.MaxValue, true)
};
public override void FixupMeta(DataContext ctx) {
Player = Get<MetaPlayerPrivateState>(ctx);
Get<MetaBoundRef>(ctx).ID = Player?.ID ?? uint.MaxValue;
}
protected override void Read(CelesteNetBinaryReader reader) {
Config = new AvaliConfig {
Enabled = reader.ReadBoolean(),
DashColorMode = DashColorMode.ExternalDash,
LightBody = reader.ReadColorNoA(),
DarkBody = reader.ReadColorNoA(),
};
}
protected override void Write(CelesteNetBinaryWriter writer) {
writer.Write(Config.Enabled);
if (Config.Enabled) {
writer.WriteNoA(Config.LightBody);
writer.WriteNoA(Config.DarkBody);
}
}
}
}