From bcaf1e3e124b03d2e50369d101422704c3897a4a Mon Sep 17 00:00:00 2001 From: teascade Date: Thu, 11 May 2017 01:52:05 +0300 Subject: [PATCH] Add a subsystem for interaction syncing. Possibly borkd --- Assets/Scripts/Controls/PlayerController.cs | 3 + .../Scripts/Entities/InteractableSyncdata.cs | 26 +++++++ .../Entities/InteractableSyncdata.cs.meta | 12 +++ .../Scripts/Entities/SyncBases/BlinkyBox.cs | 17 ++--- .../Entities/SyncBases/Interactable.cs | 10 ++- .../Scripts/Networking/Clientside/Client.cs | 12 +++ .../Networking/Messages/InteractionPkt.cs | 46 ++++++++++++ .../Messages/InteractionPkt.cs.meta | 12 +++ Assets/Scripts/Networking/PktType.cs | 5 ++ .../Scripts/Networking/Serverside/Server.cs | 73 +++++++++++++------ 10 files changed, 184 insertions(+), 32 deletions(-) create mode 100644 Assets/Scripts/Entities/InteractableSyncdata.cs create mode 100644 Assets/Scripts/Entities/InteractableSyncdata.cs.meta create mode 100644 Assets/Scripts/Networking/Messages/InteractionPkt.cs create mode 100644 Assets/Scripts/Networking/Messages/InteractionPkt.cs.meta diff --git a/Assets/Scripts/Controls/PlayerController.cs b/Assets/Scripts/Controls/PlayerController.cs index e7f35e6..300a8b5 100644 --- a/Assets/Scripts/Controls/PlayerController.cs +++ b/Assets/Scripts/Controls/PlayerController.cs @@ -57,6 +57,9 @@ namespace Cyber.Controls { Interactable LookingAt = LookedAtObject.GetComponent(); if (LookingAt != null && (LookingAt.transform.position - Character.GetPosition()).magnitude < Character.InteractionDistance) { LookingAt.Interact(); + if (LookingAt.GetInteractableSyncdata().PublicInteractions) { + Client.Send(PktType.InteractPkt, new InteractionPkt(LookingAt.ID)); + } } } } diff --git a/Assets/Scripts/Entities/InteractableSyncdata.cs b/Assets/Scripts/Entities/InteractableSyncdata.cs new file mode 100644 index 0000000..3928cb7 --- /dev/null +++ b/Assets/Scripts/Entities/InteractableSyncdata.cs @@ -0,0 +1,26 @@ + +namespace Cyber.Entities { + public struct InteractableSyncdata { + + /// + /// Weather this interactable requires syncing or not. + /// + public bool RequiresSyncing; + + /// + /// Weather interacting with this should send a TCP-packet or not. + /// + public bool PublicInteractions; + + /// + /// Creates an InteractibleSyncdata struct. + /// + /// Weather this interactible requires syncing (like a door) or not (like a bell). + /// Weather interacting with this interactible should send a TCP-packet (like a bell or a door) or not (like opening a screen where you can type). + public InteractableSyncdata(bool requiresSyncing, bool publicInteractions) { + RequiresSyncing = requiresSyncing; + PublicInteractions = publicInteractions; + } + + } +} diff --git a/Assets/Scripts/Entities/InteractableSyncdata.cs.meta b/Assets/Scripts/Entities/InteractableSyncdata.cs.meta new file mode 100644 index 0000000..83bd2b7 --- /dev/null +++ b/Assets/Scripts/Entities/InteractableSyncdata.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b02b5449859d14f4784a47e5663a1d3c +timeCreated: 1494455790 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Entities/SyncBases/BlinkyBox.cs b/Assets/Scripts/Entities/SyncBases/BlinkyBox.cs index 1de4a1b..10080ab 100644 --- a/Assets/Scripts/Entities/SyncBases/BlinkyBox.cs +++ b/Assets/Scripts/Entities/SyncBases/BlinkyBox.cs @@ -4,6 +4,7 @@ using UnityEngine; using UnityEngine.Networking; using Cyber.Networking; using Cyber.Console; +using System; namespace Cyber.Entities.SyncBases { @@ -44,22 +45,20 @@ namespace Cyber.Entities.SyncBases { } /// - /// Update the blink time if the server has a newer blinktime + /// Does nothing, because it doesn't need to synced. /// /// - public override void Deserialize(NetworkReader reader) { - double ServerBlinkTime = reader.ReadDouble(); - if (ServerBlinkTime > BlinkTime) { - BlinkTime = ServerBlinkTime; - } - } + public override void Deserialize(NetworkReader reader) {} /// - /// Write the blink time so others will sync if they have older blinks. + /// Does nothing, because it doesn't need to synced. /// /// public override void Serialize(NetworkWriter writer) { - writer.Write(BlinkTime); + } + + public override InteractableSyncdata GetInteractableSyncdata() { + return new InteractableSyncdata(false, true); } /// diff --git a/Assets/Scripts/Entities/SyncBases/Interactable.cs b/Assets/Scripts/Entities/SyncBases/Interactable.cs index 4819eb1..4269b9e 100644 --- a/Assets/Scripts/Entities/SyncBases/Interactable.cs +++ b/Assets/Scripts/Entities/SyncBases/Interactable.cs @@ -1,6 +1,8 @@ -using System.Collections; +using System; +using System.Collections; using System.Collections.Generic; using UnityEngine; +using UnityEngine.Networking; namespace Cyber.Entities.SyncBases { @@ -13,6 +15,12 @@ namespace Cyber.Entities.SyncBases { /// All interactables should implement their interactions by overriding this. /// public abstract void Interact(); + + /// + /// Get Interaction information about this interactible. + /// + /// The Interaction information. + public abstract InteractableSyncdata GetInteractableSyncdata(); } } \ No newline at end of file diff --git a/Assets/Scripts/Networking/Clientside/Client.cs b/Assets/Scripts/Networking/Clientside/Client.cs index 1c48e32..2e9cb65 100644 --- a/Assets/Scripts/Networking/Clientside/Client.cs +++ b/Assets/Scripts/Networking/Clientside/Client.cs @@ -127,6 +127,7 @@ namespace Cyber.Networking.Clientside { NetClient.RegisterHandler(PktType.SpawnEntity, HandlePacket); NetClient.RegisterHandler(PktType.MoveCreature, HandlePacket); NetClient.RegisterHandler(PktType.SyncPacket, HandlePacket); + NetClient.RegisterHandler(PktType.InteractPkt, HandlePacket); NetClient.RegisterHandler(MsgType.Connect, OnConnected); NetClient.RegisterHandler(MsgType.Disconnect, OnDisconnected); @@ -194,6 +195,17 @@ namespace Cyber.Networking.Clientside { Term.Println("SyncBase " + MoveCreature.SyncBaseID + " is not a Creature"); } + break; + case (PktType.InteractPkt): + InteractionPkt Interaction = new InteractionPkt(); + Interaction.Deserialize(msg.reader); + + SyncBase Target = Spawner.SyncDB.Get(Interaction.SyncBaseID); + if (Target != null && Target is Interactable) { + ((Interactable) Target).Interact(); + } else { + Term.Println("Server has sent an erroneus SyncBase ID!"); + } break; case (PktType.SyncPacket): SyncHandler.HandleSyncPkt(msg); diff --git a/Assets/Scripts/Networking/Messages/InteractionPkt.cs b/Assets/Scripts/Networking/Messages/InteractionPkt.cs new file mode 100644 index 0000000..86f304e --- /dev/null +++ b/Assets/Scripts/Networking/Messages/InteractionPkt.cs @@ -0,0 +1,46 @@ + +using UnityEngine.Networking; + +namespace Cyber.Networking.Messages { + + /// + /// Includes information about interacting an interactible. Applicable only for some interactibles. + /// + public class InteractionPkt : MessageBase { + + /// + /// ID of the interactible. + /// + public int SyncBaseID; + + /// + /// Creates an InteraktionPkt, which contains the message "someone interacted". + /// + /// + public InteractionPkt(int syncBaseID) { + SyncBaseID = syncBaseID; + } + + /// + /// Empty constructor for deserialization. + /// + public InteractionPkt() {} + + /// + /// Deserializes SyncBaseID for the recipent. + /// + /// + public override void Deserialize(NetworkReader reader) { + SyncBaseID = reader.ReadInt32(); + } + + /// + /// Serializes the SyncBaseID for sending. + /// + /// + public override void Serialize(NetworkWriter writer) { + writer.Write(SyncBaseID); + } + + } +} diff --git a/Assets/Scripts/Networking/Messages/InteractionPkt.cs.meta b/Assets/Scripts/Networking/Messages/InteractionPkt.cs.meta new file mode 100644 index 0000000..61e9463 --- /dev/null +++ b/Assets/Scripts/Networking/Messages/InteractionPkt.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ee7d568a49719d248910f19e26d82051 +timeCreated: 1494453893 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Networking/PktType.cs b/Assets/Scripts/Networking/PktType.cs index 9909872..4d1fff2 100644 --- a/Assets/Scripts/Networking/PktType.cs +++ b/Assets/Scripts/Networking/PktType.cs @@ -38,5 +38,10 @@ namespace Cyber.Networking { /// public const short SyncPacket = 205; + /// + /// Packet telling that someone has made an interactive remark. + /// + public const short InteractPkt = 206; + } } \ No newline at end of file diff --git a/Assets/Scripts/Networking/Serverside/Server.cs b/Assets/Scripts/Networking/Serverside/Server.cs index 69a7d0d..23fddb4 100644 --- a/Assets/Scripts/Networking/Serverside/Server.cs +++ b/Assets/Scripts/Networking/Serverside/Server.cs @@ -20,6 +20,11 @@ namespace Cyber.Networking.Serverside { private Spawner Spawner; + /// + /// The Syncer which syncs. + /// + public Syncer Syncer; + /// /// Creates the server-component, and sets the singleton as itself. /// @@ -118,6 +123,7 @@ namespace Cyber.Networking.Serverside { NetworkServer.RegisterHandler(PktType.TextMessage, HandlePacket); NetworkServer.RegisterHandler(PktType.MoveCreature, HandlePacket); + NetworkServer.RegisterHandler(PktType.InteractPkt, HandlePacket); NetworkServer.RegisterHandler(MsgType.Connect, OnConnected); NetworkServer.RegisterHandler(MsgType.Disconnect, OnDisconnected); @@ -139,35 +145,58 @@ namespace Cyber.Networking.Serverside { private void HandlePacket(NetworkMessage msg) { switch (msg.msgType) { - case PktType.TextMessage: - TextMessagePkt TextMsg = new TextMessagePkt(); - TextMsg.Deserialize(msg.reader); - Term.Println(TextMsg.Message); + case PktType.TextMessage: + TextMessagePkt TextMsg = new TextMessagePkt(); + TextMsg.Deserialize(msg.reader); + Term.Println(TextMsg.Message); + break; + case PktType.MoveCreature: + MoveCreaturePkt MoveCreature = new MoveCreaturePkt(); + MoveCreature.Deserialize(msg.reader); + + // Check if the player is allowed to move this character + Character Controlled = Players[msg.conn.connectionId].Character.GetComponent(); + if (Controlled.ID != MoveCreature.SyncBaseID) { break; - case PktType.MoveCreature: - MoveCreaturePkt MoveCreature = new MoveCreaturePkt(); - MoveCreature.Deserialize(msg.reader); + } - // Check if the player is allowed to move this character - Character Controlled = Players[msg.conn.connectionId].Character.GetComponent(); - if (Controlled.ID != MoveCreature.SyncBaseID) { - break; + Controlled.Move(MoveCreature.Direction); + + foreach (var Player in Players) { + if (Player.Value.ConnectionID == msg.conn.connectionId) { + continue; } + MoveCreature.Timestamp = NetworkHelper.GetCurrentSystemTime(); + NetworkServer.SendToClient(Player.Value.ConnectionID, PktType.MoveCreature, MoveCreature); + } + break; + case PktType.InteractPkt: + InteractionPkt Interaction = new InteractionPkt(); + Interaction.Deserialize(msg.reader); - Controlled.Move(MoveCreature.Direction); + Character Sender = Players[msg.conn.connectionId].Character; + SyncBase Target = Spawner.SyncDB.Get(Interaction.SyncBaseID); - foreach (var Player in Players) { - if (Player.Value.ConnectionID == msg.conn.connectionId) { - continue; + if (Target != null && Target is Interactable) { + Interactable Interacted = (Interactable) Target; + Vector3 Delta = Interacted.gameObject.transform.position - Sender.gameObject.transform.position; + float ServerInteractionDistance = Sender.InteractionDistance + Sender.MovementSpeed * 0.5f; + if (Delta.magnitude <= ServerInteractionDistance) { + Interacted.Interact(); + NetworkServer.SendToAll(PktType.InteractPkt, Interaction); + if (Interacted.GetInteractableSyncdata().RequiresSyncing) { + Syncer.DirtSyncBase(Interacted.ID); } - MoveCreature.Timestamp = NetworkHelper.GetCurrentSystemTime(); - NetworkServer.SendToClient(Player.Value.ConnectionID, PktType.MoveCreature, MoveCreature); } - break; - default: - Debug.LogError("Received an unknown packet, id: " + msg.msgType); - Term.Println("Received an unknown packet, id: " + msg.msgType); - break; + } else { + Term.Println("Client has reported an erronous SyncBase ID!"); + } + + break; + default: + Debug.LogError("Received an unknown packet, id: " + msg.msgType); + Term.Println("Received an unknown packet, id: " + msg.msgType); + break; } }