Merge branch 'master' of github.com:Saltosion/Cyber
This commit is contained in:
		
						commit
						6e5c2e1f63
					
				@ -57,6 +57,9 @@ namespace Cyber.Controls {
 | 
				
			|||||||
                        Interactable LookingAt = LookedAtObject.GetComponent<Interactable>();
 | 
					                        Interactable LookingAt = LookedAtObject.GetComponent<Interactable>();
 | 
				
			||||||
                        if (LookingAt != null && (LookingAt.transform.position - Character.GetPosition()).magnitude < Character.InteractionDistance) {
 | 
					                        if (LookingAt != null && (LookingAt.transform.position - Character.GetPosition()).magnitude < Character.InteractionDistance) {
 | 
				
			||||||
                            LookingAt.Interact();
 | 
					                            LookingAt.Interact();
 | 
				
			||||||
 | 
					                            if (LookingAt.GetInteractableSyncdata().PublicInteractions) {
 | 
				
			||||||
 | 
					                                Client.Send(PktType.InteractPkt, new InteractionPkt(LookingAt.ID));
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										26
									
								
								Assets/Scripts/Entities/InteractableSyncdata.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								Assets/Scripts/Entities/InteractableSyncdata.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Cyber.Entities {
 | 
				
			||||||
 | 
					    public struct InteractableSyncdata {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Weather this interactable requires syncing or not.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        public bool RequiresSyncing;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Weather interacting with this should send a TCP-packet or not.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        public bool PublicInteractions;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Creates an InteractibleSyncdata struct.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="RequiresSyncing">Weather this interactible requires syncing (like a door) or not (like a bell).</param>
 | 
				
			||||||
 | 
					        /// <param name="PublicInteractions">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).</param>
 | 
				
			||||||
 | 
					        public InteractableSyncdata(bool requiresSyncing, bool publicInteractions) {
 | 
				
			||||||
 | 
					            RequiresSyncing = requiresSyncing;
 | 
				
			||||||
 | 
					            PublicInteractions = publicInteractions;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										12
									
								
								Assets/Scripts/Entities/InteractableSyncdata.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Assets/Scripts/Entities/InteractableSyncdata.cs.meta
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					fileFormatVersion: 2
 | 
				
			||||||
 | 
					guid: b02b5449859d14f4784a47e5663a1d3c
 | 
				
			||||||
 | 
					timeCreated: 1494455790
 | 
				
			||||||
 | 
					licenseType: Free
 | 
				
			||||||
 | 
					MonoImporter:
 | 
				
			||||||
 | 
					  serializedVersion: 2
 | 
				
			||||||
 | 
					  defaultReferences: []
 | 
				
			||||||
 | 
					  executionOrder: 0
 | 
				
			||||||
 | 
					  icon: {instanceID: 0}
 | 
				
			||||||
 | 
					  userData: 
 | 
				
			||||||
 | 
					  assetBundleName: 
 | 
				
			||||||
 | 
					  assetBundleVariant: 
 | 
				
			||||||
@ -4,6 +4,7 @@ using UnityEngine;
 | 
				
			|||||||
using UnityEngine.Networking;
 | 
					using UnityEngine.Networking;
 | 
				
			||||||
using Cyber.Networking;
 | 
					using Cyber.Networking;
 | 
				
			||||||
using Cyber.Console;
 | 
					using Cyber.Console;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Cyber.Entities.SyncBases {
 | 
					namespace Cyber.Entities.SyncBases {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -55,19 +56,22 @@ namespace Cyber.Entities.SyncBases {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Buttons only act as triggers, so only interact is sent to the server.
 | 
					        /// Does nothing, because it doesn't need to synced.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <param name="reader"></param>
 | 
					        /// <param name="reader"></param>
 | 
				
			||||||
        public override void Deserialize(NetworkReader reader) {
 | 
					        public override void Deserialize(NetworkReader reader) {}
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Buttons only act as triggers, so only interact is sent to the server.
 | 
					        /// Does nothing, because it doesn't need to synced.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <param name="writer"></param>
 | 
					        /// <param name="writer"></param>
 | 
				
			||||||
        public override void Serialize(NetworkWriter writer) {
 | 
					        public override void Serialize(NetworkWriter writer) {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override InteractableSyncdata GetInteractableSyncdata() {
 | 
				
			||||||
 | 
					            return new InteractableSyncdata(false, true);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Buttons only act as triggers, so only interact is sent to the server.
 | 
					        /// Buttons only act as triggers, so only interact is sent to the server.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
 | 
				
			|||||||
@ -51,6 +51,10 @@ namespace Cyber.Entities.SyncBases {
 | 
				
			|||||||
            return new SyncHandletype(false, 10);
 | 
					            return new SyncHandletype(false, 10);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override InteractableSyncdata GetInteractableSyncdata() {
 | 
				
			||||||
 | 
					            return new InteractableSyncdata(true, true);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private void Update() {
 | 
					        private void Update() {
 | 
				
			||||||
            float DoorScale = IsOpen ? 0.01f : 1;
 | 
					            float DoorScale = IsOpen ? 0.01f : 1;
 | 
				
			||||||
            if (DoorRoot.localScale.x != DoorScale) {
 | 
					            if (DoorRoot.localScale.x != DoorScale) {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,8 @@
 | 
				
			|||||||
using System.Collections;
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections;
 | 
				
			||||||
using System.Collections.Generic;
 | 
					using System.Collections.Generic;
 | 
				
			||||||
using UnityEngine;
 | 
					using UnityEngine;
 | 
				
			||||||
 | 
					using UnityEngine.Networking;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Cyber.Entities.SyncBases {
 | 
					namespace Cyber.Entities.SyncBases {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -14,5 +16,11 @@ namespace Cyber.Entities.SyncBases {
 | 
				
			|||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        public abstract void Interact();
 | 
					        public abstract void Interact();
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Get Interaction information about this interactible.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns>The Interaction information.</returns>
 | 
				
			||||||
 | 
					        public abstract InteractableSyncdata GetInteractableSyncdata();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -13,7 +13,8 @@ namespace Cyber.Entities {
 | 
				
			|||||||
    public class SyncDB : MonoBehaviour {
 | 
					    public class SyncDB : MonoBehaviour {
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        private static readonly Type[] SyncableClasses = new Type[] {
 | 
					        private static readonly Type[] SyncableClasses = new Type[] {
 | 
				
			||||||
            typeof(Character)
 | 
					            typeof(Character),
 | 
				
			||||||
 | 
					            typeof(Button)
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private int IDCounter = 0;
 | 
					        private int IDCounter = 0;
 | 
				
			||||||
@ -21,6 +22,8 @@ namespace Cyber.Entities {
 | 
				
			|||||||
        private Dictionary<Type, List<int>> CategorizedDatabase = new Dictionary<Type, List<int>>();
 | 
					        private Dictionary<Type, List<int>> CategorizedDatabase = new Dictionary<Type, List<int>>();
 | 
				
			||||||
        private Dictionary<Type, SyncHandletype> SyncHandletypes = new Dictionary<Type, SyncHandletype>();
 | 
					        private Dictionary<Type, SyncHandletype> SyncHandletypes = new Dictionary<Type, SyncHandletype>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private List<int> StaticSyncBaseIDList = new List<int>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Add an entity to the database with the given IDs.
 | 
					        /// Add an entity to the database with the given IDs.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
@ -32,16 +35,8 @@ namespace Cyber.Entities {
 | 
				
			|||||||
            for (int i = 0; i < SyncableClasses.Length; i++) {
 | 
					            for (int i = 0; i < SyncableClasses.Length; i++) {
 | 
				
			||||||
                SyncBase Syncable = (SyncBase)gameObject.GetComponent(SyncableClasses[i]);
 | 
					                SyncBase Syncable = (SyncBase)gameObject.GetComponent(SyncableClasses[i]);
 | 
				
			||||||
                if (Syncable != null) {
 | 
					                if (Syncable != null) {
 | 
				
			||||||
                    Syncable.ID = ids[Index];
 | 
					                    Syncable.ID = ids[Index++];
 | 
				
			||||||
                    Database[ids[Index++]] = Syncable;
 | 
					                    AddSyncBaseToDatabase(Syncable);
 | 
				
			||||||
                    if (Server.IsRunning()) {
 | 
					 | 
				
			||||||
                        Type Type = Syncable.GetType();
 | 
					 | 
				
			||||||
                        if (!CategorizedDatabase.ContainsKey(Type)) {
 | 
					 | 
				
			||||||
                            CategorizedDatabase.Add(Type, new List<int>());
 | 
					 | 
				
			||||||
                            SyncHandletypes.Add(Type, Syncable.GetSyncHandletype());
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                        CategorizedDatabase[Type].Add(Syncable.ID);
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -134,5 +129,49 @@ namespace Cyber.Entities {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            return ID;
 | 
					            return ID;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Sets static objects for all objects in the world. This method should be called once per game launch ever.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="idList">The list of id's to be set. If null, will create new ids.</param>
 | 
				
			||||||
 | 
					        public void SetStaticObjectsIDs(int[] idList = null) {
 | 
				
			||||||
 | 
					            SyncBase[] SyncBases = FindObjectsOfType<SyncBase>();
 | 
				
			||||||
 | 
					            Array.Sort(SyncBases, (a, b) => {
 | 
				
			||||||
 | 
					                Vector3 APos = a.gameObject.transform.position;
 | 
				
			||||||
 | 
					                float AComparison = APos.x + APos.y + APos.z + Array.IndexOf(SyncableClasses, a);
 | 
				
			||||||
 | 
					                Vector3 BPos = b.gameObject.transform.position;
 | 
				
			||||||
 | 
					                float BComparison = BPos.x + BPos.y + BPos.z + Array.IndexOf(SyncableClasses, b);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return AComparison.CompareTo(BComparison);
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            if (idList == null) {
 | 
				
			||||||
 | 
					                foreach (SyncBase SyncBase in SyncBases) {
 | 
				
			||||||
 | 
					                    SyncBase.ID = CreateID();
 | 
				
			||||||
 | 
					                    AddSyncBaseToDatabase(SyncBase);
 | 
				
			||||||
 | 
					                    StaticSyncBaseIDList.Add(SyncBase.ID);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                for (int i = 0; i < Math.Min(SyncBases.Length, idList.Length); i++) {
 | 
				
			||||||
 | 
					                    SyncBases[i].ID = idList[i];
 | 
				
			||||||
 | 
					                    AddSyncBaseToDatabase(SyncBases[i]);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public int[] GetStaticSyncBaseIDList() {
 | 
				
			||||||
 | 
					            return StaticSyncBaseIDList.ToArray();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private void AddSyncBaseToDatabase(SyncBase syncBase) {
 | 
				
			||||||
 | 
					            Database[syncBase.ID] = syncBase;
 | 
				
			||||||
 | 
					            if (Server.IsRunning()) {
 | 
				
			||||||
 | 
					                Type Type = syncBase.GetType();
 | 
				
			||||||
 | 
					                if (!CategorizedDatabase.ContainsKey(Type)) {
 | 
				
			||||||
 | 
					                    CategorizedDatabase.Add(Type, new List<int>());
 | 
				
			||||||
 | 
					                    SyncHandletypes.Add(Type, syncBase.GetSyncHandletype());
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                CategorizedDatabase[Type].Add(syncBase.ID);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -127,6 +127,8 @@ namespace Cyber.Networking.Clientside {
 | 
				
			|||||||
            NetClient.RegisterHandler(PktType.SpawnEntity, HandlePacket);
 | 
					            NetClient.RegisterHandler(PktType.SpawnEntity, HandlePacket);
 | 
				
			||||||
            NetClient.RegisterHandler(PktType.MoveCreature, HandlePacket);
 | 
					            NetClient.RegisterHandler(PktType.MoveCreature, HandlePacket);
 | 
				
			||||||
            NetClient.RegisterHandler(PktType.SyncPacket, HandlePacket);
 | 
					            NetClient.RegisterHandler(PktType.SyncPacket, HandlePacket);
 | 
				
			||||||
 | 
					            NetClient.RegisterHandler(PktType.InteractPkt, HandlePacket);
 | 
				
			||||||
 | 
					            NetClient.RegisterHandler(PktType.StaticObjectIdsPkt, HandlePacket);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            NetClient.RegisterHandler(MsgType.Connect, OnConnected);
 | 
					            NetClient.RegisterHandler(MsgType.Connect, OnConnected);
 | 
				
			||||||
            NetClient.RegisterHandler(MsgType.Disconnect, OnDisconnected);
 | 
					            NetClient.RegisterHandler(MsgType.Disconnect, OnDisconnected);
 | 
				
			||||||
@ -160,7 +162,7 @@ namespace Cyber.Networking.Clientside {
 | 
				
			|||||||
                Players.Add(Conn.ConnectionID, Conn);
 | 
					                Players.Add(Conn.ConnectionID, Conn);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            case (PktType.MassIdentity):
 | 
					            case (PktType.MassIdentity):
 | 
				
			||||||
                MassIdentityPkt Identities = new MassIdentityPkt();
 | 
					                IntListPkt Identities = new IntListPkt();
 | 
				
			||||||
                Identities.Deserialize(msg.reader);
 | 
					                Identities.Deserialize(msg.reader);
 | 
				
			||||||
                foreach (int currId in Identities.IdList) {
 | 
					                foreach (int currId in Identities.IdList) {
 | 
				
			||||||
                    Players.Add(currId, new CConnectedPlayer(currId));
 | 
					                    Players.Add(currId, new CConnectedPlayer(currId));
 | 
				
			||||||
@ -194,10 +196,29 @@ namespace Cyber.Networking.Clientside {
 | 
				
			|||||||
                    Term.Println("SyncBase " + MoveCreature.SyncBaseID + " is not a Creature");
 | 
					                    Term.Println("SyncBase " + MoveCreature.SyncBaseID + " is not a Creature");
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case (PktType.InteractPkt):
 | 
				
			||||||
 | 
					                InteractionPkt Interaction = new InteractionPkt();
 | 
				
			||||||
 | 
					                Interaction.Deserialize(msg.reader);
 | 
				
			||||||
 | 
					                if (Interaction.OwnerSyncBaseID == Player.Character.ID) {
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                SyncBase Target = Spawner.SyncDB.Get(Interaction.InteractSyncBaseID);
 | 
				
			||||||
 | 
					                if (Target != null && Target is Interactable) {
 | 
				
			||||||
 | 
					                    ((Interactable) Target).Interact();
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    Term.Println("Server has sent an erroneus SyncBase ID!");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            case (PktType.SyncPacket):
 | 
					            case (PktType.SyncPacket):
 | 
				
			||||||
                SyncHandler.HandleSyncPkt(msg);
 | 
					                SyncHandler.HandleSyncPkt(msg);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
 | 
					            case (PktType.StaticObjectIdsPkt):
 | 
				
			||||||
 | 
					                IntListPkt StaticIds = new IntListPkt();
 | 
				
			||||||
 | 
					                StaticIds.Deserialize(msg.reader);
 | 
				
			||||||
 | 
					                Spawner.SyncDB.SetStaticObjectsIDs(StaticIds.IdList);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
            default:
 | 
					            default:
 | 
				
			||||||
                Debug.LogError("Received an unknown packet, id: " + msg.msgType);
 | 
					                Debug.LogError("Received an unknown packet, id: " + msg.msgType);
 | 
				
			||||||
                Term.Println("Received an unknown packet, id: " + msg.msgType);
 | 
					                Term.Println("Received an unknown packet, id: " + msg.msgType);
 | 
				
			||||||
 | 
				
			|||||||
@ -4,27 +4,27 @@ using UnityEngine.Networking;
 | 
				
			|||||||
namespace Cyber.Networking.Messages {
 | 
					namespace Cyber.Networking.Messages {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// <summary>
 | 
					    /// <summary>
 | 
				
			||||||
    /// Packet containing a list of ID's of players currently connected.
 | 
					    /// Packet containing integers, used in many packet types, such as <see cref="PktType.MassIdentity"/> and <see cref="PktType.StaticObjectIdsPkt"/>.
 | 
				
			||||||
    /// </summary>
 | 
					    /// </summary>
 | 
				
			||||||
    public class MassIdentityPkt : MessageBase {
 | 
					    public class IntListPkt : MessageBase {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// List of Connection ID's to send
 | 
					        /// List of Integers.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        public int[] IdList;
 | 
					        public int[] IdList;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Create a Mass Identity packet used to send a list of currently online connections.
 | 
					        /// Create a packet containing integers.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <param name="idList"></param>
 | 
					        /// <param name="idList"></param>
 | 
				
			||||||
        public MassIdentityPkt(int[] idList) {
 | 
					        public IntListPkt(int[] idList) {
 | 
				
			||||||
            IdList = idList;
 | 
					            IdList = idList;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Parameter-less constructor using when deserializing the message.
 | 
					        /// Parameter-less constructor using when deserializing the message.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        public MassIdentityPkt() {
 | 
					        public IntListPkt() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										53
									
								
								Assets/Scripts/Networking/Messages/InteractionPkt.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								Assets/Scripts/Networking/Messages/InteractionPkt.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					using UnityEngine.Networking;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Cyber.Networking.Messages {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// <summary>
 | 
				
			||||||
 | 
					    /// Includes information about interacting an interactible. Applicable only for some interactibles.
 | 
				
			||||||
 | 
					    /// </summary>
 | 
				
			||||||
 | 
					    public class InteractionPkt : MessageBase {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// ID of the interactible.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        public int InteractSyncBaseID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Id of the interactor.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        public int OwnerSyncBaseID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Creates an InteraktionPkt, which contains the message "someone interacted".
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="SyncBaseID"></param>
 | 
				
			||||||
 | 
					        public InteractionPkt(int syncBaseID) {
 | 
				
			||||||
 | 
					            InteractSyncBaseID = syncBaseID;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Empty constructor for deserialization.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        public InteractionPkt() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Deserializes SyncBaseID for the recipent.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="reader"></param>
 | 
				
			||||||
 | 
					        public override void Deserialize(NetworkReader reader) {
 | 
				
			||||||
 | 
					            InteractSyncBaseID = reader.ReadInt32();
 | 
				
			||||||
 | 
					            OwnerSyncBaseID = reader.ReadInt32();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Serializes the SyncBaseID for sending.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="writer"></param>
 | 
				
			||||||
 | 
					        public override void Serialize(NetworkWriter writer) {
 | 
				
			||||||
 | 
					            writer.Write(InteractSyncBaseID);
 | 
				
			||||||
 | 
					            writer.Write(OwnerSyncBaseID);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										12
									
								
								Assets/Scripts/Networking/Messages/InteractionPkt.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Assets/Scripts/Networking/Messages/InteractionPkt.cs.meta
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					fileFormatVersion: 2
 | 
				
			||||||
 | 
					guid: ee7d568a49719d248910f19e26d82051
 | 
				
			||||||
 | 
					timeCreated: 1494453893
 | 
				
			||||||
 | 
					licenseType: Free
 | 
				
			||||||
 | 
					MonoImporter:
 | 
				
			||||||
 | 
					  serializedVersion: 2
 | 
				
			||||||
 | 
					  defaultReferences: []
 | 
				
			||||||
 | 
					  executionOrder: 0
 | 
				
			||||||
 | 
					  icon: {instanceID: 0}
 | 
				
			||||||
 | 
					  userData: 
 | 
				
			||||||
 | 
					  assetBundleName: 
 | 
				
			||||||
 | 
					  assetBundleVariant: 
 | 
				
			||||||
@ -18,6 +18,7 @@ namespace Cyber.Networking {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Packet containing the identification details about everyone on the server before the client connected.
 | 
					        /// Packet containing the identification details about everyone on the server before the client connected.
 | 
				
			||||||
 | 
					        /// This packet contains an <see cref="IntListPkt"/>.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        public const short MassIdentity = 202;
 | 
					        public const short MassIdentity = 202;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -38,5 +39,16 @@ namespace Cyber.Networking {
 | 
				
			|||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        public const short SyncPacket = 205;
 | 
					        public const short SyncPacket = 205;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Packet telling that someone has made an interactive remark.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        public const short InteractPkt = 206;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Packet containing an id list of static objects existing in the ready game.
 | 
				
			||||||
 | 
					        /// This packet contains an <see cref="IntListPkt"/>.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        public const short StaticObjectIdsPkt = 207;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -20,6 +20,11 @@ namespace Cyber.Networking.Serverside {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        private Spawner Spawner;
 | 
					        private Spawner Spawner;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// The Syncer which syncs. <see cref="Syncer"/>
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        public Syncer Syncer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Creates the server-component, and sets the singleton as itself.
 | 
					        /// Creates the server-component, and sets the singleton as itself.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
@ -108,6 +113,8 @@ namespace Cyber.Networking.Serverside {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            Spawner = GetComponent<Spawner>();
 | 
					            Spawner = GetComponent<Spawner>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Spawner.SyncDB.SetStaticObjectsIDs();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            ConnectionConfig Config = new ConnectionConfig();
 | 
					            ConnectionConfig Config = new ConnectionConfig();
 | 
				
			||||||
            NetworkChannelID.ReliableSequenced = Config.AddChannel(QosType.ReliableSequenced);
 | 
					            NetworkChannelID.ReliableSequenced = Config.AddChannel(QosType.ReliableSequenced);
 | 
				
			||||||
            NetworkChannelID.UnreliableSequenced = Config.AddChannel(QosType.UnreliableSequenced);
 | 
					            NetworkChannelID.UnreliableSequenced = Config.AddChannel(QosType.UnreliableSequenced);
 | 
				
			||||||
@ -118,6 +125,7 @@ namespace Cyber.Networking.Serverside {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            NetworkServer.RegisterHandler(PktType.TextMessage, HandlePacket);
 | 
					            NetworkServer.RegisterHandler(PktType.TextMessage, HandlePacket);
 | 
				
			||||||
            NetworkServer.RegisterHandler(PktType.MoveCreature, HandlePacket);
 | 
					            NetworkServer.RegisterHandler(PktType.MoveCreature, HandlePacket);
 | 
				
			||||||
 | 
					            NetworkServer.RegisterHandler(PktType.InteractPkt, HandlePacket);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            NetworkServer.RegisterHandler(MsgType.Connect, OnConnected);
 | 
					            NetworkServer.RegisterHandler(MsgType.Connect, OnConnected);
 | 
				
			||||||
            NetworkServer.RegisterHandler(MsgType.Disconnect, OnDisconnected);
 | 
					            NetworkServer.RegisterHandler(MsgType.Disconnect, OnDisconnected);
 | 
				
			||||||
@ -139,35 +147,60 @@ namespace Cyber.Networking.Serverside {
 | 
				
			|||||||
        private void HandlePacket(NetworkMessage msg) {
 | 
					        private void HandlePacket(NetworkMessage msg) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            switch (msg.msgType) {
 | 
					            switch (msg.msgType) {
 | 
				
			||||||
                case PktType.TextMessage:
 | 
					            case PktType.TextMessage:
 | 
				
			||||||
                    TextMessagePkt TextMsg = new TextMessagePkt();
 | 
					                TextMessagePkt TextMsg = new TextMessagePkt();
 | 
				
			||||||
                    TextMsg.Deserialize(msg.reader);
 | 
					                TextMsg.Deserialize(msg.reader);
 | 
				
			||||||
                    Term.Println(TextMsg.Message);
 | 
					                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<Character>();
 | 
				
			||||||
 | 
					                if (Controlled.ID != MoveCreature.SyncBaseID) {
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                case PktType.MoveCreature:
 | 
					                }
 | 
				
			||||||
                    MoveCreaturePkt MoveCreature = new MoveCreaturePkt();
 | 
					 | 
				
			||||||
                    MoveCreature.Deserialize(msg.reader);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    // Check if the player is allowed to move this character
 | 
					                Controlled.Move(MoveCreature.Direction);
 | 
				
			||||||
                    Character Controlled = Players[msg.conn.connectionId].Character.GetComponent<Character>();
 | 
					
 | 
				
			||||||
                    if (Controlled.ID != MoveCreature.SyncBaseID) {
 | 
					                foreach (var Player in Players) {
 | 
				
			||||||
                        break;
 | 
					                    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.InteractSyncBaseID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    foreach (var Player in Players) {
 | 
					                Interaction.OwnerSyncBaseID = Sender.ID;
 | 
				
			||||||
                        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;
 | 
					                } else {
 | 
				
			||||||
                default:
 | 
					                    Term.Println("Client has reported an erronous SyncBase ID!");
 | 
				
			||||||
                    Debug.LogError("Received an unknown packet, id: " + msg.msgType);
 | 
					                }
 | 
				
			||||||
                    Term.Println("Received an unknown packet, id: " + msg.msgType);
 | 
					
 | 
				
			||||||
                    break;
 | 
					                break;
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                Debug.LogError("Received an unknown packet, id: " + msg.msgType);
 | 
				
			||||||
 | 
					                Term.Println("Received an unknown packet, id: " + msg.msgType);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -189,7 +222,7 @@ namespace Cyber.Networking.Serverside {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Then send the client a list of all other clients
 | 
					            // Then send the client a list of all other clients
 | 
				
			||||||
            NetworkServer.SendToClient(Id, PktType.MassIdentity, new MassIdentityPkt(IdList));
 | 
					            NetworkServer.SendToClient(Id, PktType.MassIdentity, new IntListPkt(IdList));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Add the player to the list
 | 
					            // Add the player to the list
 | 
				
			||||||
            SConnectedPlayer Player = new SConnectedPlayer(msg.conn.connectionId);
 | 
					            SConnectedPlayer Player = new SConnectedPlayer(msg.conn.connectionId);
 | 
				
			||||||
@ -199,7 +232,7 @@ namespace Cyber.Networking.Serverside {
 | 
				
			|||||||
            NetworkServer.SendToClient(msg.conn.connectionId, 
 | 
					            NetworkServer.SendToClient(msg.conn.connectionId, 
 | 
				
			||||||
                PktType.Identity, new IdentityPkt(msg.conn.connectionId, true));
 | 
					                PktType.Identity, new IdentityPkt(msg.conn.connectionId, true));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Spawn the player and collet it's IDs
 | 
					            // Spawn the player and collect it's IDs
 | 
				
			||||||
            Vector3 Position = new Vector3(0, 0, 0);
 | 
					            Vector3 Position = new Vector3(0, 0, 0);
 | 
				
			||||||
            GameObject Obj = Spawner.Spawn(EntityType.NPC, Position);
 | 
					            GameObject Obj = Spawner.Spawn(EntityType.NPC, Position);
 | 
				
			||||||
            int[] EntityIdList = Spawner.SyncDB.GetEntityIDs(Obj);
 | 
					            int[] EntityIdList = Spawner.SyncDB.GetEntityIDs(Obj);
 | 
				
			||||||
@ -207,6 +240,9 @@ namespace Cyber.Networking.Serverside {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            NetworkServer.SendToAll(PktType.SpawnEntity, new SpawnEntityPkt(EntityType.NPC, Position, EntityIdList, Id));
 | 
					            NetworkServer.SendToAll(PktType.SpawnEntity, new SpawnEntityPkt(EntityType.NPC, Position, EntityIdList, Id));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Send ID's of every existing static SyncBase object in the world.
 | 
				
			||||||
 | 
					            NetworkServer.SendToClient(Id, PktType.StaticObjectIdsPkt, new IntListPkt(Spawner.SyncDB.GetStaticSyncBaseIDList()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Send every entity to the player who just connected.
 | 
					            // Send every entity to the player who just connected.
 | 
				
			||||||
            foreach (var Entry in Players) {
 | 
					            foreach (var Entry in Players) {
 | 
				
			||||||
                if (Entry.Key == Id) {
 | 
					                if (Entry.Key == Id) {
 | 
				
			||||||
 | 
				
			|||||||
@ -36,7 +36,6 @@ namespace Cyber.Util {
 | 
				
			|||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        public float Brightness = 1f;
 | 
					        public float Brightness = 1f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private TextTextureProperties LastText = new TextTextureProperties("");
 | 
					 | 
				
			||||||
        private Material Material;
 | 
					        private Material Material;
 | 
				
			||||||
        private bool Dirty = true;
 | 
					        private bool Dirty = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user