celeste-avali-skin/SourceCode/CelesteNetAvaliComponent.cs

90 lines
3.3 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 ColorChoice = Celeste.Mod.AvaliSkin.AvaliSkinSettings.ColorChoice;
using ColorMode = Celeste.Mod.AvaliSkin.AvaliSkinSettings.ColorMode;
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(),
ColorMode = ColorMode.ExternalDash
};
}
protected override void Write(CelesteNetBinaryWriter writer) {
writer.Write(Config.Enabled);
if (Config.Enabled) {
// byte lengthRGB = Math.Min(ManualRGB.Count, 5);
// writer.Write((byte) ManualRGB.Count);
// foreach (var color in ManualRGB) {
// write.WriteNoA(color);
// }
// byte lengthPreset = Math.Min(ManualPreset.Count, 5);
// writer.Write((byte) ManualPreset.Count);
// foreach (var color in ManualPreset) {
// write.Write((byte) color);
// }
}
}
}
}