public override bool OnDataReceived(MainForm form, bool isTcp, Peer peer, int dataType, byte[] data) { if (dataType != DataType.RequestWorldStatus) { return(false); } List <WalkerPlayer> players = new List <WalkerPlayer>(); foreach (Peer p in form.listBox_player.Items) { if (p.Player != null) { players.Add(p.Player); } } var objs = new List <NwWalkerGameObject>(); foreach (var o in form.GameObjectHashmap.Values) { objs.Add(o); } var status = new NwWorldStatus() { Players = players.ToArray(), WorldObjects = objs.ToArray(), }; var buf = Util.SerializeJsonBinary(status, false); peer.SendTcp(DataType.ResponseWorldStatus, buf); return(true); }
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); } }