diff --git a/Assets/Scripts/Controls/InventoryInterface.cs b/Assets/Scripts/Controls/InventoryInterface.cs
index 42f5548..73b0e8d 100644
--- a/Assets/Scripts/Controls/InventoryInterface.cs
+++ b/Assets/Scripts/Controls/InventoryInterface.cs
@@ -149,10 +149,10 @@ namespace Cyber.Controls {
Item Equipped = Inventory.Equipped.GetItem(SelectedItem.Slot);
if (Equipped != null && Equipped.ID == SelectedItem.ID) {
Inventory.Equipped.ClearSlot(SelectedItem.Slot);
- Client.Send(PktType.InventoryAction, new InventoryActionPkt(InventoryAction.Unequip, (int) SelectedItem.Slot));
+ Client.Send(PktType.InventoryAction, Inventory.ActionHandler.BuildClearSlot(SelectedItem.Slot));
} else {
Inventory.Equipped.SetSlot(SelectedItem.Slot, SelectedItem);
- Client.Send(PktType.InventoryAction, new InventoryActionPkt(InventoryAction.Equip, SelectedItem.ID));
+ Client.Send(PktType.InventoryAction, Inventory.ActionHandler.BuildEquipItem(SelectedItem.ID));
}
}
}
diff --git a/Assets/Scripts/Controls/PlayerController.cs b/Assets/Scripts/Controls/PlayerController.cs
index 7e13868..ac6e6f0 100644
--- a/Assets/Scripts/Controls/PlayerController.cs
+++ b/Assets/Scripts/Controls/PlayerController.cs
@@ -81,12 +81,12 @@ namespace Cyber.Controls {
// Don't use equipment if you're interacting with something
// (ie. don't shoot at the buttons)
if (Input.GetButtonDown("Use Item (R)")) {
- Character.UseItemInSlot(EquipSlot.RightHand);
- Client.Send(PktType.InventoryAction, new InventoryActionPkt(InventoryAction.Use, (int) EquipSlot.RightHand));
+ Character.Inventory.UseItemInSlot(EquipSlot.RightHand);
+ Client.Send(PktType.InventoryAction, Character.Inventory.ActionHandler.BuildUseItem(EquipSlot.RightHand));
}
if (Input.GetButtonDown("Use Item (L)")) {
- Character.UseItemInSlot(EquipSlot.LeftHand);
- Client.Send(PktType.InventoryAction, new InventoryActionPkt(InventoryAction.Use, (int) EquipSlot.LeftHand));
+ Character.Inventory.UseItemInSlot(EquipSlot.LeftHand);
+ Client.Send(PktType.InventoryAction, Character.Inventory.ActionHandler.BuildUseItem(EquipSlot.LeftHand));
}
}
} else if (Character.Moving()) {
diff --git a/Assets/Scripts/Entities/SyncBases/Character.cs b/Assets/Scripts/Entities/SyncBases/Character.cs
index e988eb3..da7c899 100644
--- a/Assets/Scripts/Entities/SyncBases/Character.cs
+++ b/Assets/Scripts/Entities/SyncBases/Character.cs
@@ -61,16 +61,6 @@ namespace Cyber.Entities.SyncBases {
}
}
- ///
- /// Uses the item in the left hand if something is equipped.
- ///
- public void UseItemInSlot(EquipSlot slot) {
- Item Equipped = Inventory.Equipped.GetItem(slot);
- if (Equipped != null && Equipped.Action != null) {
- Equipped.Action(this);
- }
- }
-
///
/// Sets the character's rotation.
///
diff --git a/Assets/Scripts/Entities/SyncBases/Inventory.cs b/Assets/Scripts/Entities/SyncBases/Inventory.cs
index 458e207..38a61fd 100644
--- a/Assets/Scripts/Entities/SyncBases/Inventory.cs
+++ b/Assets/Scripts/Entities/SyncBases/Inventory.cs
@@ -4,7 +4,6 @@ using Cyber.Items;
using Cyber.Networking;
using Cyber.Networking.Serverside;
using System.Collections.Generic;
-using UnityEngine;
using UnityEngine.Networking;
namespace Cyber.Entities.SyncBases {
@@ -24,6 +23,13 @@ namespace Cyber.Entities.SyncBases {
///
public Equipped Equipped;
+ ///
+ /// The possible component associated with this Inventory. Used in .
+ ///
+ public Character Character;
+
+ public InventoryActionHandler ActionHandler;
+
///
/// Creates the Inventory-component for a game object.
///
@@ -63,6 +69,16 @@ namespace Cyber.Entities.SyncBases {
return new SyncHandletype(true, 10);
}
+ ///
+ /// Uses the item in the left hand if something is equipped.
+ ///
+ public void UseItemInSlot(EquipSlot slot) {
+ Item Item = Equipped.GetItem(slot);
+ if (Item != null && Item.Action != null && Character != null) {
+ Item.Action(Character);
+ }
+ }
+
///
/// Deserializes the ID's and creates them in the .
///
@@ -144,5 +160,10 @@ namespace Cyber.Entities.SyncBases {
writer.WriteBytesFull(EquippedByteArray[2]);
writer.WriteBytesFull(EquippedByteArray[3]);
}
+
+ private void Start() {
+ Character = GetComponent();
+ ActionHandler = new InventoryActionHandler(this, Character);
+ }
}
}
diff --git a/Assets/Scripts/Items/InventoryAction.cs b/Assets/Scripts/Items/InventoryAction.cs
index 8a66bf9..97374af 100644
--- a/Assets/Scripts/Items/InventoryAction.cs
+++ b/Assets/Scripts/Items/InventoryAction.cs
@@ -20,5 +20,6 @@ namespace Cyber.Items {
/// Use the item in the given slot.
///
Use
+
}
}
diff --git a/Assets/Scripts/Items/InventoryActionHandler.cs b/Assets/Scripts/Items/InventoryActionHandler.cs
new file mode 100644
index 0000000..6dc005f
--- /dev/null
+++ b/Assets/Scripts/Items/InventoryActionHandler.cs
@@ -0,0 +1,57 @@
+
+using Cyber.Entities.SyncBases;
+using Cyber.Networking.Clientside;
+using Cyber.Networking.Messages;
+using UnityEngine;
+
+namespace Cyber.Items {
+
+ public class InventoryActionHandler {
+
+ private Inventory Inventory;
+ private Character Character;
+
+ public InventoryActionHandler(Inventory inventory, Character character) {
+ Inventory = inventory;
+ Character = character;
+ }
+
+ public InventoryActionPkt BuildUseItem(EquipSlot slot) {
+ return new InventoryActionPkt(InventoryAction.Use, (int) slot);
+ }
+
+ public InventoryActionPkt BuildClearSlot(EquipSlot slot) {
+ return new InventoryActionPkt(InventoryAction.Unequip, (int) slot);
+ }
+
+ public InventoryActionPkt BuildEquipItem(int itemID) {
+ return new InventoryActionPkt(InventoryAction.Equip, itemID);
+ }
+
+ public bool HandleAction(InventoryAction action, int relatedInt) {
+ switch (action) {
+ case InventoryAction.Equip:
+ Item Item = ItemDB.Singleton.Get(relatedInt);
+ Inventory.Equipped.SetSlot(Item.Slot, Item);
+ return true;
+ case InventoryAction.Unequip:
+ EquipSlot Slot = (EquipSlot) relatedInt;
+ Inventory.Equipped.ClearSlot(Slot);
+ return true;
+ case InventoryAction.Use:
+ EquipSlot UseSlot = (EquipSlot) relatedInt;
+ Item UseItem = Inventory.Equipped.GetItem(UseSlot);
+ if (UseItem != null && UseItem.Action != null && Character != null &&
+ (!Client.IsRunning() || Client.GetConnectedPlayer().Character != Character)) {
+ // Item exists, it has an action, and the character
+ // isn't controlled by the client (no double-actions).
+ UseItem.Action(Character);
+ return true;
+ }
+ return false;
+ }
+ return false;
+ }
+
+ }
+}
diff --git a/Assets/Scripts/Items/InventoryActionHandler.cs.meta b/Assets/Scripts/Items/InventoryActionHandler.cs.meta
new file mode 100644
index 0000000..cd92c37
--- /dev/null
+++ b/Assets/Scripts/Items/InventoryActionHandler.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 8a53f786f46ad6746a5367819aa32187
+timeCreated: 1494922673
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Networking/Clientside/Client.cs b/Assets/Scripts/Networking/Clientside/Client.cs
index f444c64..e4a5441 100644
--- a/Assets/Scripts/Networking/Clientside/Client.cs
+++ b/Assets/Scripts/Networking/Clientside/Client.cs
@@ -111,11 +111,14 @@ namespace Cyber.Networking.Clientside {
}
///
- /// Returns the connected player.
+ /// Returns the connected player, or null if no client is active.
///
/// The connected player.
public static CConnectedPlayer GetConnectedPlayer() {
- return Singleton.Player;
+ if (IsRunning()) {
+ return Singleton.Player;
+ }
+ return null;
}
///
@@ -279,27 +282,8 @@ namespace Cyber.Networking.Clientside {
break;
}
- switch (InventoryActionPkt.Action) {
- case InventoryAction.Equip:
- Item Item = ItemDB.Singleton.Get(InventoryActionPkt.RelatedInt);
- Inventory.Equipped.SetSlot(Item.Slot, Item);
- break;
- case InventoryAction.Unequip:
- EquipSlot Slot = (EquipSlot) InventoryActionPkt.RelatedInt;
- Inventory.Equipped.ClearSlot(Slot);
- break;
- case InventoryAction.Use:
- EquipSlot UseSlot = (EquipSlot) InventoryActionPkt.RelatedInt;
- Item UseItem = Inventory.Equipped.GetItem(UseSlot);
- Character Character = CurrSyncBase.GetComponent();
- if (UseItem != null && UseItem.Action != null && Character != null &&
- Player.Character != Character) {
- // Item exists, it has an action, and the character
- // isn't controlled by the client (no double-actions).
- UseItem.Action(Character);
- }
- break;
- }
+ Inventory.ActionHandler.HandleAction(InventoryActionPkt.Action, InventoryActionPkt.RelatedInt);
+
break;
default:
Debug.LogError("Received an unknown packet, id: " + msg.msgType);
diff --git a/Assets/Scripts/Networking/Serverside/Server.cs b/Assets/Scripts/Networking/Serverside/Server.cs
index 6d7ec6f..844ddea 100644
--- a/Assets/Scripts/Networking/Serverside/Server.cs
+++ b/Assets/Scripts/Networking/Serverside/Server.cs
@@ -250,27 +250,10 @@ namespace Cyber.Networking.Serverside {
Inventory CurrInventory = Character.GetComponent();
InventoryActionPkt.SyncBaseID = CurrInventory.ID;
- switch (InventoryActionPkt.Action) {
- case InventoryAction.Equip:
- Item Item = ItemDB.Singleton.Get(InventoryActionPkt.RelatedInt);
- CurrInventory.Equipped.SetSlot(Item.Slot, Item);
- break;
- case InventoryAction.Unequip:
- EquipSlot Slot = (EquipSlot) InventoryActionPkt.RelatedInt;
- CurrInventory.Equipped.ClearSlot(Slot);
- break;
- case InventoryAction.Use:
- EquipSlot UseSlot = (EquipSlot) InventoryActionPkt.RelatedInt;
- Item UseItem = CurrInventory.Equipped.GetItem(UseSlot);
- if (UseItem != null && UseItem.Action != null && Character != null) {
- // Item exists, it has an action, and the character
- // isn't controlled by the client (no double-actions).
- UseItem.Action(Character);
- }
- break;
+ if (CurrInventory.ActionHandler.HandleAction(InventoryActionPkt.Action, InventoryActionPkt.RelatedInt)) {
+ SendToAll(PktType.InventoryAction, InventoryActionPkt);
}
- SendToAll(PktType.InventoryAction, InventoryActionPkt);
break;
default:
Debug.LogError("Received an unknown packet, id: " + msg.msgType);