예제 #1
0
        private void ResolveReceiveWorldStatus(NwWorldStatus status)
        {
            for (var i = 0; i < status.Players.Length; i++)
            {
                var          p = status.Players[i];
                WalkerPlayer player;
                if ((player = worldData.Players.Find(pl => pl.SessionID == p.SessionID)) != null)
                {
                    player.Update(p);
                }
                else
                {
                    JoinPlayer(p);
                }
            }
            foreach (var p in worldData.Players)
            {
                WalkerPlayer player;
                if ((player = Array.Find(status.Players, pl => pl.SessionID == p.SessionID)) == null)
                {
                    LeavePlayer(player);
                }
            }

            foreach (var o in status.WorldObjects)
            {
                if (SyncWorldObjects.Exists(obj => obj.Hash == o.Hash))
                {
                    continue;
                }

                try
                {
                    var wo = Resources.Objects[o.ObjectHash];

                    if (wo.ItemType == "Put")
                    {
                        PutGameObject(o, true);
                    }
                    else if (wo.ItemType == "Use")
                    {
                        ItemUse(o, Array.Find(status.Players, pl => pl.UserID == o.UserID), true);
                    }
                }
                catch { }
            }

            foreach (var obj in SyncWorldObjects)
            {
                NwWalkerGameObject wo;
                if ((wo = Array.Find(status.WorldObjects, o => o.Hash == obj.Hash)) != null)
                {
                    continue;
                }

                RemoveGameObject(obj);
            }
        }
예제 #2
0
        public void ItemUse(NwWalkerGameObject go, WalkerPlayer player, bool sync)
        {
            MMW.Invoke(() =>
            {
                try
                {
                    if (!Players.Exists(p => (string)p.Properties["userID"] == player.UserID))
                    {
                        return;
                    }

                    var wo = Resources.Objects[go.ObjectHash];
                    if (!wo.Loaded)
                    {
                        wo.Load();
                    }

                    var g = GameObjectFactory.CreateItem(go, wo, player, "item", wo.Bones != null ? "Deferred Physical Skin" : "Deferred Physical");

                    g.Properties["user"]      = player;
                    g.Properties["userID"]    = player.UserID;
                    g.Properties["sessionID"] = player.SessionID;
                    g.Hash             = go.Hash;
                    g.Transform.Parent = Players.Find(p => (string)p.Properties["userID"] == player.UserID).Transform;
                    g.Transform.UpdatePhysicalTransform();

                    MMW.RegistGameObject(g);
                    if (sync)
                    {
                        SyncWorldObjects.Add(g);
                    }
                    else
                    {
                        WorldObjects.Add(g);
                    }
                }
                catch
                {
                    MMW.BroadcastMessage("log", $"[ERROR] failed to use item \"{go.Name}\"");
                }
            });
        }
예제 #3
0
        public void RemoveGameObject(GameObject go)
        {
            MMW.Invoke(() =>
            {
                try
                {
                    SyncWorldObjects.Remove(go);
                    WorldObjects.Remove(go);
                    if (go != null)
                    {
                        MMW.DestroyGameObject(go);
                    }

                    MMW.BroadcastMessage("log", $"object \"{go.Name}\" removed");
                }
                catch
                {
                }
            });
        }
예제 #4
0
        protected override void OnUnload()
        {
            base.OnUnload();

            foreach (var o in SyncWorldObjects.ToArray())
            {
                MMW.DestroyGameObject(o);
            }
            SyncWorldObjects.Clear();

            foreach (var o in WorldObjects.ToArray())
            {
                MMW.DestroyGameObject(o);
            }
            WorldObjects.Clear();

            foreach (var p in Players.ToArray())
            {
                MMW.DestroyGameObject(p);
            }
            Players.Clear();

            MMW.DestroyGameObject(worldGO);
            MMW.DestroyGameObject(hudGO);
            MMW.DestroyGameObject(cameraTarget);

            MMW.DestroyAsset(worldData);
            MMW.DestroyAsset(Resources);
            MMW.DestroyAsset(server);

            MMW.MainCamera.GameObject.RemoveComponent(blur);

            var effs = MMW.MainCamera.GameObject.GetComponents <ImageEffect>();

            foreach (var eff in effs)
            {
                eff.Enabled = false;
            }

            GC.Collect();
        }
예제 #5
0
        public override void OnTcpReceived(int dataType, byte[] data)
        {
            if (dataType == Walker.DataType.ResponseObjectDestroy)
            {
                string hash = null;
                Buffer.Read(data, br => hash = br.ReadString());
                RemoveGameObject(SyncWorldObjects.Find(go => go.Hash == hash));
            }
            else if (dataType == Walker.DataType.ResponseItemUsed)
            {
                var obj = Util.DeserializeJsonBinary <NwWalkerGameObject>(data);
                ItemUse(obj, worldData.Players.Find(p => p.UserID == obj.UserID), true);
            }
            else if (dataType == Walker.DataType.ResponseObjectPut)
            {
                var obj = Util.DeserializeJsonBinary <NwWalkerGameObject>(data);
                PutGameObject(obj, true);
            }
            else if (dataType == Walker.DataType.ResponsePlayerJoin)
            {
                var player = Util.DeserializeJsonBinary <WalkerPlayer>(data);

                if (worldData.Players.Exists(p => p.SessionID == player.SessionID))
                {
                    return;
                }
                JoinPlayer(player);
            }
            else if (dataType == Walker.DataType.ResponseWorldStatus)
            {
                var status = Util.DeserializeJsonBinary <NwWorldStatus>(data);
                ResolveReceiveWorldStatus(status);
            }
            else if (dataType == Walker.DataType.ResponseLeaveWorld)
            {
                server.Disconnected -= Server_Disconnected;
                OnUnload();
            }
        }
예제 #6
0
        public void PutGameObject(NwWalkerGameObject go, bool sync)
        {
            MMW.Invoke(() =>
            {
                try
                {
                    var wo = Resources.Objects[go.ObjectHash];
                    if (!wo.Loaded)
                    {
                        wo.Load();
                    }

                    var g  = GameObjectFactory.CreateGameObject(go, wo, wo.Name, wo.Bones != null ? "Deferred Physical Skin" : "Deferred Physical");
                    g.Hash = go.Hash;
                    g.Transform.Position = go.Position.FromVec3f();
                    g.Transform.Rotate   = go.Rotation.FromVec3f();
                    if (go.Scale != null)
                    {
                        g.Transform.Scale = go.Scale.FromVec3f();
                    }
                    g.Transform.UpdatePhysicalTransform();

                    MMW.RegistGameObject(g);
                    if (sync)
                    {
                        SyncWorldObjects.Add(g);
                    }
                    else
                    {
                        WorldObjects.Add(g);
                    }
                }
                catch
                {
                    MMW.BroadcastMessage("log", $"[ERROR] object \"{go.Name}\" entry failed");
                }
            });
        }