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); } }
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}\""); } }); }
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 { } }); }
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(); }
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(); } }
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"); } }); }