61 lines
2.4 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|