Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaServer/ServerSource/Events/Missions/SalvageMission.cs
T
2024-04-24 18:09:05 +03:00

74 lines
2.8 KiB
C#

using Barotrauma.Networking;
using System;
using System.Collections.Generic;
namespace Barotrauma
{
partial class SalvageMission : Mission
{
struct SpawnInfo
{
public readonly bool UsedExistingItem;
public readonly UInt16 OriginalInventoryID;
public readonly byte OriginalItemContainerIndex;
public readonly int OriginalSlotIndex;
public readonly List<(int listIndex, int effectIndex)> ExecutedEffectIndices;
public SpawnInfo(bool usedExistingItem, UInt16 originalInventoryID, byte originalItemContainerIndex, int originalSlotIndex, List<(int listIndex, int effectIndex)> executedEffectIndices)
{
UsedExistingItem = usedExistingItem;
OriginalInventoryID = originalInventoryID;
OriginalItemContainerIndex = originalItemContainerIndex;
OriginalSlotIndex = originalSlotIndex;
ExecutedEffectIndices = executedEffectIndices;
}
}
private readonly Dictionary<Target, SpawnInfo> spawnInfo = new Dictionary<Target, SpawnInfo>();
public override void ServerWriteInitial(IWriteMessage msg, Client c)
{
base.ServerWriteInitial(msg, c);
foreach (var target in targets)
{
bool targetFound = spawnInfo.ContainsKey(target) && target.Item != null;
msg.WriteBoolean(targetFound);
if (!targetFound) { continue; }
msg.WriteBoolean(spawnInfo[target].UsedExistingItem);
if (spawnInfo[target].UsedExistingItem)
{
msg.WriteUInt16(target.Item.ID);
}
else
{
target.Item.WriteSpawnData(msg,
target.Item.ID,
spawnInfo[target].OriginalInventoryID,
spawnInfo[target].OriginalItemContainerIndex,
spawnInfo[target].OriginalSlotIndex);
msg.WriteUInt16(target.ParentTarget?.Item?.ID ?? Entity.NullEntityID);
}
msg.WriteByte((byte)spawnInfo[target].ExecutedEffectIndices.Count);
foreach ((int listIndex, int effectIndex) in spawnInfo[target].ExecutedEffectIndices)
{
msg.WriteByte((byte)listIndex);
msg.WriteByte((byte)effectIndex);
}
}
}
public override void ServerWrite(IWriteMessage msg)
{
base.ServerWrite(msg);
msg.WriteByte((byte)targets.Count);
for (int i = 0; i < targets.Count; i++)
{
msg.WriteByte((byte)targets[i].State);
}
}
}
}