Conflicts: Subsurface/Properties/AssemblyInfo.cs Subsurface/Source/Characters/Character.cs Subsurface/Source/GUI/GUI.cs Subsurface/Source/GameMain.cs Subsurface/Source/GameSettings.cs Subsurface/Source/Items/CharacterInventory.cs Subsurface/Source/Items/Components/ItemComponent.cs Subsurface/Source/Items/Components/Machines/Pump.cs Subsurface/Source/Items/Components/Machines/Radar.cs Subsurface/Source/Items/Components/Machines/Steering.cs Subsurface/Source/Items/Components/Power/PowerContainer.cs Subsurface/Source/Items/Inventory.cs Subsurface/Source/Items/Item.cs Subsurface/Source/Items/ItemSpawner.cs Subsurface/Source/Map/Levels/WaterRenderer.cs Subsurface/Source/Map/LinkedSubmarine.cs Subsurface/Source/Map/Map/Map.cs Subsurface/Source/Map/Structure.cs Subsurface/Source/Map/Submarine.cs Subsurface/Source/Map/WayPoint.cs Subsurface/Source/Networking/GameClient.cs Subsurface/Source/Networking/GameServer.cs Subsurface/Source/Physics/PhysicsBody.cs Subsurface/Source/Screens/GameScreen.cs
160 lines
4.4 KiB
C#
160 lines
4.4 KiB
C#
using Microsoft.Xna.Framework;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace Barotrauma
|
|
{
|
|
class ItemSpawner
|
|
{
|
|
class ItemSpawnInfo
|
|
{
|
|
public readonly ItemPrefab Prefab;
|
|
|
|
public readonly Vector2 Position;
|
|
public readonly Inventory Inventory;
|
|
public readonly Submarine Submarine;
|
|
|
|
public ItemSpawnInfo(ItemPrefab prefab, Vector2 worldPosition)
|
|
{
|
|
Prefab = prefab;
|
|
Position = worldPosition;
|
|
}
|
|
|
|
public ItemSpawnInfo(ItemPrefab prefab, Vector2 position, Submarine sub)
|
|
{
|
|
Prefab = prefab;
|
|
Position = position;
|
|
Submarine = sub;
|
|
}
|
|
|
|
public ItemSpawnInfo(ItemPrefab prefab, Inventory inventory)
|
|
{
|
|
Prefab = prefab;
|
|
Inventory = inventory;
|
|
}
|
|
}
|
|
|
|
private readonly Queue<ItemSpawnInfo> spawnQueue;
|
|
|
|
|
|
public List<Item> spawnItems = new List<Item>();
|
|
|
|
|
|
public ItemSpawner()
|
|
{
|
|
spawnQueue = new Queue<ItemSpawnInfo>();
|
|
}
|
|
|
|
public void QueueItem(ItemPrefab itemPrefab, Vector2 worldPosition, bool isNetworkMessage = false)
|
|
{
|
|
//clients aren't allowed to spawn new items unless the server says so
|
|
if (!isNetworkMessage && GameMain.Client != null) return;
|
|
|
|
spawnQueue.Enqueue(new ItemSpawnInfo(itemPrefab, worldPosition));
|
|
}
|
|
|
|
public void QueueItem(ItemPrefab itemPrefab, Vector2 position, Submarine sub, bool isNetworkMessage = false)
|
|
{
|
|
//clients aren't allowed to spawn new items unless the server says so
|
|
if (!isNetworkMessage && GameMain.Client != null) return;
|
|
|
|
spawnQueue.Enqueue(new ItemSpawnInfo(itemPrefab, position, sub));
|
|
}
|
|
|
|
public void QueueItem(ItemPrefab itemPrefab, Inventory inventory, bool isNetworkMessage = false)
|
|
{
|
|
//clients aren't allowed to spawn new items unless the server says so
|
|
if (!isNetworkMessage && GameMain.Client != null) return;
|
|
|
|
spawnQueue.Enqueue(new ItemSpawnInfo(itemPrefab, inventory));
|
|
}
|
|
|
|
public void Update()
|
|
{
|
|
if (!spawnQueue.Any()) return;
|
|
|
|
List<Item> items = new List<Item>();
|
|
//List<Inventory> inventories = new List<Inventory>();
|
|
|
|
while (spawnQueue.Count>0)
|
|
{
|
|
var itemInfo = spawnQueue.Dequeue();
|
|
|
|
Item spawnedItem = null;
|
|
|
|
if (itemInfo.Inventory != null)
|
|
{
|
|
spawnedItem = new Item(itemInfo.Prefab, Vector2.Zero, null);
|
|
itemInfo.Inventory.TryPutItem(spawnedItem, spawnedItem.AllowedSlots, false);
|
|
}
|
|
else
|
|
{
|
|
spawnedItem = new Item(itemInfo.Prefab, itemInfo.Position, itemInfo.Submarine);
|
|
}
|
|
|
|
AddToSpawnedList(spawnedItem);
|
|
items.Add(spawnedItem);
|
|
}
|
|
|
|
}
|
|
|
|
public void AddToSpawnedList(Item item)
|
|
{
|
|
spawnItems.Add(item);
|
|
}
|
|
|
|
public void Clear()
|
|
{
|
|
spawnQueue.Clear();
|
|
spawnItems.Clear();
|
|
}
|
|
}
|
|
|
|
class ItemRemover
|
|
{
|
|
private readonly Queue<Item> removeQueue;
|
|
|
|
public List<Item> removedItems = new List<Item>();
|
|
|
|
public ItemRemover()
|
|
{
|
|
removeQueue = new Queue<Item>();
|
|
}
|
|
|
|
public void QueueItem(Item item, bool isNetworkMessage = false)
|
|
{
|
|
if (!isNetworkMessage && GameMain.Client != null)
|
|
{
|
|
//clients aren't allowed to remove items unless the server says so
|
|
return;
|
|
}
|
|
|
|
removeQueue.Enqueue(item);
|
|
}
|
|
|
|
public void Update()
|
|
{
|
|
if (!removeQueue.Any()) return;
|
|
|
|
List<Item> items = new List<Item>();
|
|
|
|
while (removeQueue.Count > 0)
|
|
{
|
|
var item = removeQueue.Dequeue();
|
|
removedItems.Add(item);
|
|
|
|
item.Remove();
|
|
|
|
items.Add(item);
|
|
}
|
|
|
|
}
|
|
|
|
public void Clear()
|
|
{
|
|
removeQueue.Clear();
|
|
removedItems.Clear();
|
|
}
|
|
}
|
|
}
|