195 lines
8.4 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|