Using ItemSpawner to spawn extra cargo (-> clients will be notified of the spawned items)

This commit is contained in:
Regalis
2016-10-05 18:30:48 +03:00
parent 8cac5b2ad2
commit 41c38575b9
2 changed files with 57 additions and 38 deletions
+53 -34
View File
@@ -6,7 +6,35 @@ namespace Barotrauma
{ {
class ItemSpawner class ItemSpawner
{ {
private readonly Queue<Pair<ItemPrefab, object>> spawnQueue; 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 List<Item> spawnItems = new List<Item>();
@@ -14,37 +42,31 @@ namespace Barotrauma
public ItemSpawner() public ItemSpawner()
{ {
spawnQueue = new Queue<Pair<ItemPrefab, object>>(); spawnQueue = new Queue<ItemSpawnInfo>();
} }
public void QueueItem(ItemPrefab itemPrefab, Vector2 worldPosition, bool isNetworkMessage = false) public void QueueItem(ItemPrefab itemPrefab, Vector2 worldPosition, bool isNetworkMessage = false)
{ {
if (!isNetworkMessage && GameMain.Client != null) //clients aren't allowed to spawn new items unless the server says so
{ if (!isNetworkMessage && GameMain.Client != null) return;
//clients aren't allowed to spawn new items unless the server says so
return;
}
var itemInfo = new Pair<ItemPrefab, object>(); spawnQueue.Enqueue(new ItemSpawnInfo(itemPrefab, worldPosition));
itemInfo.First = itemPrefab; }
itemInfo.Second = worldPosition;
spawnQueue.Enqueue(itemInfo); 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) public void QueueItem(ItemPrefab itemPrefab, Inventory inventory, bool isNetworkMessage = false)
{ {
if (!isNetworkMessage && GameMain.Client != null) //clients aren't allowed to spawn new items unless the server says so
{ if (!isNetworkMessage && GameMain.Client != null) return;
//clients aren't allowed to spawn new items unless the server says so
return;
}
var itemInfo = new Pair<ItemPrefab, object>(); spawnQueue.Enqueue(new ItemSpawnInfo(itemPrefab, inventory));
itemInfo.First = itemPrefab;
itemInfo.Second = inventory;
spawnQueue.Enqueue(itemInfo);
} }
public void Update() public void Update()
@@ -58,23 +80,20 @@ namespace Barotrauma
{ {
var itemInfo = spawnQueue.Dequeue(); var itemInfo = spawnQueue.Dequeue();
if (itemInfo.Second is Vector2) Item spawnedItem = null;
if (itemInfo.Inventory != null)
{ {
var item = new Item(itemInfo.First, (Vector2)itemInfo.Second, null); spawnedItem = new Item(itemInfo.Prefab, Vector2.Zero, null);
AddToSpawnedList(item); itemInfo.Inventory.TryPutItem(spawnedItem, spawnedItem.AllowedSlots, false);
items.Add(item);
} }
else if (itemInfo.Second is Inventory) else
{ {
var item = new Item(itemInfo.First, Vector2.Zero, null); spawnedItem = new Item(itemInfo.Prefab, itemInfo.Position, itemInfo.Submarine);
AddToSpawnedList(item);
var inventory = (Inventory)itemInfo.Second;
inventory.TryPutItem(item, item.AllowedSlots, false);
items.Add(item);
} }
AddToSpawnedList(spawnedItem);
items.Add(spawnedItem);
} }
if (GameMain.Server != null) GameMain.Server.SendItemSpawnMessage(items); if (GameMain.Server != null) GameMain.Server.SendItemSpawnMessage(items);
+4 -4
View File
@@ -967,15 +967,15 @@ namespace Barotrauma.Networking
Vector2 position = new Vector2( Vector2 position = new Vector2(
cargoSpawnPos.Position.X + Rand.Range(-20.0f, 20.0f, false), cargoSpawnPos.Position.X + Rand.Range(-20.0f, 20.0f, false),
cargoRoom.Rect.Y - cargoRoom.Rect.Height); cargoRoom.Rect.Y - cargoRoom.Rect.Height);
foreach (string s in extraCargo.Keys) foreach (string s in extraCargo.Keys)
{ {
ItemPrefab itemPrefab = ItemPrefab.list.Find(ip => ip.Name == s) as ItemPrefab; ItemPrefab itemPrefab = ItemPrefab.list.Find(ip => ip.Name == s) as ItemPrefab;
if (itemPrefab == null) continue;
for (int i = 0; i < extraCargo[s]; i++) for (int i = 0; i < extraCargo[s]; i++)
{ {
var item = new Item(itemPrefab, position, cargoRoom.Submarine); Item.Spawner.QueueItem(itemPrefab, position, sub, false);
item.FindHull();
Item.ItemList.Add(item);
} }
} }
} }