SRMP-Public/SRMP/Packets/Gadgets/PacketGadgets.cs
2023-05-29 22:23:11 +02:00

195 lines
8.4 KiB
C#

using Lidgren.Network;
using MonomiPark.SlimeRancher.DataModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SRMultiplayer.Packets
{
[Packet(PacketType.Gadgets)]
public class PacketGadgets : Packet
{
public struct GadgetSiteData
{
public string ID;
public Gadget.Id gadgetId;
public double waitForChargeupTime;
public float yRotation;
public GadgetModel Model;
}
public List<GadgetSiteData> Gadgets { get; set; }
public PacketGadgets() { }
public PacketGadgets(NetIncomingMessage im) { Deserialize(im); }
public override void Serialize(NetOutgoingMessage om)
{
base.Serialize(om);
om.Write(Gadgets.Count);
foreach(var gadgetData in Gadgets)
{
om.Write(gadgetData.ID);
om.Write((ushort)gadgetData.gadgetId);
om.Write(gadgetData.waitForChargeupTime);
om.Write(gadgetData.yRotation);
om.Write(gadgetData.Model is ExtractorModel);
if(gadgetData.Model is ExtractorModel)
{
om.Write(((ExtractorModel)gadgetData.Model).cyclesRemaining);
om.Write(((ExtractorModel)gadgetData.Model).queuedToProduce);
om.Write(((ExtractorModel)gadgetData.Model).cycleEndTime);
om.Write(((ExtractorModel)gadgetData.Model).nextProduceTime);
}
om.Write(gadgetData.Model is WarpDepotModel);
if (gadgetData.Model is WarpDepotModel)
{
om.Write(((WarpDepotModel)gadgetData.Model).isPrimary);
om.Write(((WarpDepotModel)gadgetData.Model).ammo.slots.Length);
foreach(var slot in ((WarpDepotModel)gadgetData.Model).ammo.slots)
{
om.WriteAmmoSlot(slot);
}
}
om.Write(gadgetData.Model is SnareModel);
if (gadgetData.Model is SnareModel)
{
om.Write((ushort)((SnareModel)gadgetData.Model).baitTypeId);
om.Write((ushort)((SnareModel)gadgetData.Model).gordoTypeId);
om.Write(((SnareModel)gadgetData.Model).gordoEatenCount);
om.Write(((SnareModel)gadgetData.Model).fashions.Count);
foreach(var fashion in ((SnareModel)gadgetData.Model).fashions)
{
om.Write((ushort)fashion);
}
}
om.Write(gadgetData.Model is EchoNetModel);
if (gadgetData.Model is EchoNetModel)
{
om.Write(((EchoNetModel)gadgetData.Model).lastSpawnTime);
}
om.Write(gadgetData.Model is DroneModel);
if (gadgetData.Model is DroneModel)
{
om.Write(((DroneModel)gadgetData.Model).position);
om.Write(((DroneModel)gadgetData.Model).rotation);
om.Write(((DroneModel)gadgetData.Model).ammo.slots.Length);
foreach(var slot in ((DroneModel)gadgetData.Model).ammo.slots)
{
om.WriteAmmoSlot(slot);
}
om.Write(((DroneModel)gadgetData.Model).fashions.Count);
foreach (var fashion in ((DroneModel)gadgetData.Model).fashions)
{
om.Write((ushort)fashion);
}
om.Write(((DroneModel)gadgetData.Model).noClip);
om.Write(((DroneModel)gadgetData.Model).batteryDepleteTime);
om.Write(((DroneModel)gadgetData.Model).programs.Length);
foreach(var program in ((DroneModel)gadgetData.Model).programs)
{
om.Write(program.target);
om.Write(program.source);
om.Write(program.destination);
}
}
}
}
public override void Deserialize(NetIncomingMessage im)
{
base.Deserialize(im);
Gadgets = new List<GadgetSiteData>();
int gadgetCount = im.ReadInt32();
for(int i = 0; i < gadgetCount; i++)
{
var gadgetData = new GadgetSiteData()
{
ID = im.ReadString(),
gadgetId = (Gadget.Id)im.ReadUInt16(),
waitForChargeupTime = im.ReadDouble(),
yRotation = im.ReadFloat()
};
if (im.ReadBoolean())
{
var model = new ExtractorModel(gadgetData.gadgetId, gadgetData.ID, null);
model.cyclesRemaining = im.ReadInt32();
model.queuedToProduce = im.ReadInt32();
model.cycleEndTime = im.ReadDouble();
model.nextProduceTime = im.ReadDouble();
gadgetData.Model = model;
}
if (im.ReadBoolean())
{
var model = new WarpDepotModel(gadgetData.gadgetId, gadgetData.ID, null);
model.isPrimary = im.ReadBoolean();
int slotCount = im.ReadInt32();
model.ammo = new AmmoModel();
model.ammo.slots = new Ammo.Slot[slotCount];
for(int j = 0; j < slotCount; j++)
{
model.ammo.slots[j] = im.ReadAmmoSlot();
}
gadgetData.Model = model;
}
if (im.ReadBoolean())
{
var model = new SnareModel(gadgetData.gadgetId, gadgetData.ID, null);
model.baitTypeId = (Identifiable.Id)im.ReadUInt16();
model.gordoTypeId = (Identifiable.Id)im.ReadUInt16();
model.gordoEatenCount = im.ReadInt32();
model.fashions = new List<Identifiable.Id>();
int fashionCount = im.ReadInt32();
for(int j = 0; j < fashionCount; j++)
{
model.fashions.Add((Identifiable.Id)im.ReadInt16());
}
gadgetData.Model = model;
}
if (im.ReadBoolean())
{
var model = new EchoNetModel(gadgetData.gadgetId, gadgetData.ID, null);
model.lastSpawnTime = im.ReadDouble();
gadgetData.Model = model;
}
if (im.ReadBoolean())
{
var model = new DroneModel(gadgetData.gadgetId, gadgetData.ID, null);
model.position = im.ReadVector3();
model.rotation = im.ReadQuaternion();
int slotCount = im.ReadInt32();
model.ammo = new AmmoModel();
model.ammo.slots = new Ammo.Slot[slotCount];
for (int j = 0; j < slotCount; j++)
{
model.ammo.slots[j] = im.ReadAmmoSlot();
}
model.fashions = new List<Identifiable.Id>();
int fashionCount = im.ReadInt32();
for (int j = 0; j < fashionCount; j++)
{
model.fashions.Add((Identifiable.Id)im.ReadInt16());
}
model.noClip = im.ReadBoolean();
model.batteryDepleteTime = im.ReadDouble();
int programCount = im.ReadInt32();
model.programs = new DroneModel.ProgramData[programCount];
for(int j = 0; j < programCount; j++)
{
model.programs[j] = new DroneModel.ProgramData()
{
target = im.ReadString(),
source = im.ReadString(),
destination = im.ReadString()
};
}
gadgetData.Model = model;
}
Gadgets.Add(gadgetData);
}
}
}
}