Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaServer/ServerSource/Networking/EntitySpawner.cs
Juan Pablo Arce 3f2c843247 Unstable v0.19.3.0
2022-09-02 15:10:56 -03:00

61 lines
2.4 KiB
C#

using System;
using Barotrauma.Networking;
namespace Barotrauma
{
partial class EntitySpawner : Entity, IServerSerializable
{
public void CreateNetworkEvent(SpawnOrRemove spawnOrRemove)
{
CreateNetworkEventProjSpecific(spawnOrRemove);
}
partial void CreateNetworkEventProjSpecific(SpawnOrRemove spawnOrRemove)
{
if (GameMain.Server == null || spawnOrRemove?.Entity == null) { return; }
GameMain.Server.CreateEntityEvent(this, spawnOrRemove);
if (spawnOrRemove is SpawnEntity)
{
if (spawnOrRemove.Entity is Character { Info: { } } character && !character.Removed)
{
foreach (var statKey in character.Info.SavedStatValues.Keys)
{
GameMain.NetworkMember.CreateEntityEvent(character, new Character.UpdatePermanentStatsEventData(statKey));
}
}
}
}
public void ServerEventWrite(IWriteMessage message, Client client, NetEntityEvent.IData extraData = null)
{
if (GameMain.Server is null) { return; }
if (!(extraData is SpawnOrRemove entities)) { throw new Exception($"Malformed {nameof(EntitySpawner)} event: expected {nameof(SpawnOrRemove)}"); }
message.WriteBoolean(entities is RemoveEntity);
if (entities is RemoveEntity)
{
message.WriteUInt16(entities.ID);
}
else
{
switch (entities.Entity)
{
case Item item:
message.WriteByte((byte)SpawnableType.Item);
DebugConsole.Log(
$"Writing item spawn data {item} (ID: {entities.ID})");
item.WriteSpawnData(message, entities.ID, entities.InventoryID, entities.ItemContainerIndex, entities.SlotIndex);
break;
case Character character:
message.WriteByte((byte)SpawnableType.Character);
DebugConsole.Log(
$"Writing character spawn data: {character} (ID: {entities.ID})");
character.WriteSpawnData(message, entities.ID, restrictMessageSize: true);
break;
}
}
}
}
}