internal void SendPayloadToUser(string username, NetworkPayload p) { foreach (ConnectionThread c in Connections) { if (c.LoggedInUser.Username.Equals(username)) { c.SendPayload(p); return; } } }
public void SendPayloadToAll(NetworkPayload payload) { foreach (ConnectionThread c in Connections) { if (c.IsLoggedIn) c.SendPayload(payload); } }
internal void SendPayloadToAllButUser(string username, NetworkPayload p) { foreach (ConnectionThread c in Connections) { if (c != null && c.LoggedInUser != null) { if (!c.LoggedInUser.Username.Equals(username)) { c.SendPayload(p); } } } }
private bool HandlePayload(NetworkPayload payload) { if ((_state != ConnectionState.LoggedIn || !IsLoggedIn) && payload.Type != PayloadType.Auth) { ConsoleWrite("ERROR: AUTH not competed. Closing connection"); return false; } _lastActivity = DateTime.Now; switch (payload.Type) { case PayloadType.Move: if (payload.Params.Count() == 3) { string who = payload.Params[0]; // should be "self". TODO: fix security int col = int.Parse(payload.Params[1]); int row = int.Parse(payload.Params[2]); LoggedInUser.MoveTo(new Position2D(col, row)); } else { ConsoleWrite("Error on command mv. Unknown parameter count: " + payload.Params.Count()); } break; case PayloadType.Message: // Message _lastActivity = DateTime.Now; if (payload.Params.Any()) { if (payload.Params[0].Trim().Length > 0) { FadingWorldsServer.Instance.TCPPool.SendPayloadToAll(new NetworkPayload { Type = PayloadType.Message, Params = {LoggedInUser.ToString(), payload.Params[0]} }); //FadingWorldsServer.Instance.TCPPool.SendMessageToAll("ms|" + LoggedInUser + "|" + payload.Params[0].Trim()); } else { // Empty message } } else { // no parameters?? } break; case PayloadType.Auth: if (!payload.Params.Any()) { ConsoleWrite("Missing parametres to auth command"); return false; } switch (payload.Command) { case PayloadCommand.Helo: if (payload.Params.Count == 1) { string version = payload.Params[0]; _clientVersion = version; //check for outdated version //if (version == "1.0.0.0") //{ // SendCommand("au|oldversion"); // return false; //} ConsoleWrite("Client connecting with version " + _clientVersion); SendPayload(new NetworkPayload() { Type = PayloadType.Auth, Command = PayloadCommand.AuthPlease, Params = { _server.Version } }); // SendCommand("au|authplease"); return true; } else { ConsoleWrite("Missing version to auth helo command"); return false; } case PayloadCommand.Login: if (payload.Params.Count == 2) { string username = payload.Params[0]; string password = payload.Params[1]; //string ip = _client.Client.RemoteEndPoint.ToString().Split(':')[0]; // Check if user exists var users = FadingWorldsServer.Instance.UserDB.Users.Where( e => e.Username.ToLower().Equals(username.ToLower())); if (!users.Any()) { ConsoleWrite("Unknown user: "******"sy|logged-in-on-another-location"); FadingWorldsServer.Instance.TCPPool.DisconnectUser(username); } if (login.Health <= 0) { login.Reset(); } LoggedInUser = login; _state = ConnectionState.LoggedIn; ConsoleWrite("Username: "******"au|ok|" + ConnectionID); if (LoggedInUser.Position.IsInvalid) { LoggedInUser.Position = FadingWorldsServer.Instance.TheGrid.FindRandomEmptyGrassBlock(); } return true; } else { ConsoleWrite("Invalid password!"); SendPayload(new NetworkPayload() { Type = PayloadType.Auth, Command = PayloadCommand.Fail, }); //SendCommand("au|failed"); return false; } } else { ConsoleWrite("wrong number of args"); SendPayload(new NetworkPayload() { Type = PayloadType.Auth, Command = PayloadCommand.Fail, }); return false; // wrong number of args } //case "version": // if (parms.Length == 2) { // string version = parms[1]; // _clientVersion = version; // ConsoleWrite(" - Version: " + _clientVersion); // SendCommand("au|ok"); // return true; // //_parentProcess.PreDB.ResetObject(lgn); // } // else { // ConsoleWrite("wrong number of args"); // SendCommand("au|failed"); // return false; // } default: ConsoleWrite("unknown format on auth command "); SendPayload(new NetworkPayload() { Type = PayloadType.Auth, Command = PayloadCommand.Fail, }); return false; } case PayloadType.Data: switch (payload.Command) { case PayloadCommand.GetMap: SendPayload(new NetworkPayload() { Type = PayloadType.Data, Command = PayloadCommand.Map, Params = { FadingWorldsServer.Instance.TheGrid.Width+"", FadingWorldsServer.Instance.TheGrid.Height+"", FadingWorldsServer.Instance.TheGrid.DumpMapBlocks() } }); break; case PayloadCommand.MapLoaded: SendPayload(new NetworkPayload() { Type = PayloadType.Data, Command = PayloadCommand.PleaseLoadGame, }); // SendCommand("da|pleaseloadgame"); break; case PayloadCommand.GameLoaded: //FadingWorldsServer.Instance.TCPPool.SendMessageToAllButUser(LoggedInUser.Username, // "us|login|" + LoggedInUser.MakeDump()); FadingWorldsServer.Instance.TCPPool.SendPayloadToAllButUser(LoggedInUser.Username, new NetworkPayload() { Type = PayloadType.User, Command = PayloadCommand.Login, Params = { LoggedInUser.MakeDump() } }); // SendCommand("da|initplayer|" + LoggedInUser.MakeDump()); SendPayload(new NetworkPayload() { Type = PayloadType.Data, Command = PayloadCommand.InitPlayer, Params = { LoggedInUser.MakeDump() } }); foreach (Entity entity in FadingWorldsServer.Instance.GameObjects) { SendPayload(new NetworkPayload() { Type = PayloadType.Data, Command = PayloadCommand.InitEntity, Params = { entity.MakeDump()} }); // SendCommand("da|initentity|" + entity.MakeDump()); } SendUserList(); FadingWorldsServer.Instance.TheGrid.GetBlockAt(LoggedInUser.Position) .Entities.Add(LoggedInUser); break; } break; case PayloadType.Quit: // Pure quit message ConsoleWrite("Got quit command, so returning false on request."); return false; case PayloadType.System: if (payload.Command == PayloadCommand.Pong) { ConsoleWrite("Replied to ping"); } break; case PayloadType.Attack: if (payload.Params.Count == 3) { string mobId = payload.Params[0]; int mobX = int.Parse(payload.Params[1]); int mobY = int.Parse(payload.Params[2]); ConsoleWrite("Player " + LoggedInUser.Id + " doing an attack move on " + mobId); LoggedInUser.TryAttack(mobId); //MoveResult x = LoggedInUser.MoveTo(new Position2D(mobX, mobY)); //if (subCode == "po") //{ // ConsoleWrite("Replied to ping"); //} } break; case PayloadType.PrivateMessage: if (payload.Params.Count() == 2) { string target = payload.Params[0]; string message = payload.Params[1]; SendPayload(new NetworkPayload() { Type = PayloadType.Message, Params = { "system", "<<pm to " + LoggedInUser + ":" + message } }); // SendCommand("ms|system|<<pm to " + LoggedInUser + ":" + message); FadingWorldsServer.Instance.TCPPool.SendPayloadToUser(target, new NetworkPayload() { Type = PayloadType.Message, Params = { "system", ">>pm from " + LoggedInUser + ":" + message } }); //FadingWorldsServer.Instance.TCPPool.SendMessageToUser(target, // "system|>>pm from " + LoggedInUser + ":" + message); } else { SendPayload(new NetworkPayload() { Type = PayloadType.Message, Params = { "system", "i'm afraid you need more than that" } }); //SendCommand("ms|system|i'm afraid you need more than that"); } break; default: ConsoleWrite("ParseGuiCommand(): Sent unknown opCode: " + payload.Type); SendPayload(new NetworkPayload() { Type = PayloadType.Message, Params = { "system", "Unknown Command" } }); //SendCommand("ms|system|unknown-cmd"); break; } // Default to success return true; }
public void StartListen() { ConsoleWrite(" Starting listening, waiting for command"); _lastActivity = DateTime.Now; _state = ConnectionState.Connected; var payload = new NetworkPayload(); while (_client.Client.Connected && _client.GetStream().CanRead) { // Wait for command try { payload = Serializer.DeserializeWithLengthPrefix<NetworkPayload>(_client.GetStream(), PrefixStyle.Base128); } catch (IOException) {} catch (ObjectDisposedException) { break; } catch (Exception ex) { Console.WriteLine(ex.ToString()); break; } if (payload == null || payload.Type == PayloadType.Unset) { ConsoleWrite("Empty or unset payload, skipping."); // continue; break; } ConsoleWrite(" [in ] <- [" + payload + "]"); _lastPacketRecieved = DateTime.Now; if (!_client.Client.Connected || !_client.GetStream().CanRead) continue; try { if (HandlePayload(payload)) continue; ConsoleWrite("HandlePayload() returned false :("); break; } catch (Exception ex) { ConsoleWrite("Exception!!" + ex); SendPayload(new NetworkPayload { Type = PayloadType.Message, Params = { "system,","Your command caused the server to throw an exception (" + ex.Message + ")" } }); if (!IsLoggedIn) { break; } } } //while Close(); }
public void SendPayload(NetworkPayload payload) { try { if (!_lineOccupied && !_isClosed && _client.Connected) { while (_lineOccupied) { Thread.Sleep(50); } _lineOccupied = true; Serializer.SerializeWithLengthPrefix(_client.GetStream(), payload, PrefixStyle.Base128); _client.GetStream().Flush(); ConsoleWrite(" [out] -> [" + payload + "]"); _lineOccupied = false; } } catch (Exception ex) { ConsoleWrite("[-]: SendPayload() exception: " + ex); } }
private bool HandlePayload(NetworkPayload payload) { switch (payload.Type) { case PayloadType.Auth: switch (payload.Command) { case PayloadCommand.AuthPlease: Log("Starting auth against server with version " + payload.Params[0]); TheLoader.ThreadSafeSet(payload.Params[0], TheLoader.txtServerVersion); if (_loggedInUser == null) { SendPayload(new NetworkPayload { Type = PayloadType.Auth, Command = PayloadCommand.Login, Params = {_username, _password} }); } else { Log("OOOPS - server wants us to authenticate, but we already are??? :("); } break; case PayloadCommand.OldVersion: Log("OOOPS - server says we are outdated"); return false; case PayloadCommand.Fail: Log("Login failed!"); return false; case PayloadCommand.Success: if (payload.Params.Count == 1) { var connectionId = payload.Params[0]; Log("Our connectionid is " + connectionId); _loggedInUser = _username; TheLoader.State = GameState.WaitingForMap; TheLoader.SetLoggedIn(true); TheLoader.SpawnGame(0, 0, ""); //TheLoader.SetVisible(false); while (TheLoader.TheGame == null || !TheLoader.TheGame.IsLoaded) { Thread.Sleep(100); } SendPayload(new NetworkPayload { Type = PayloadType.Data, Command = PayloadCommand.GetMap }); return true; } Log("OOOPS - server did not send connectionid"); return false; default: throw new Exception("Unknown auth (subCode): '" + payload.Command + "'"); } break; case PayloadType.Data: switch (payload.Command) { case PayloadCommand.Map: var blockWidth = int.Parse(payload.Params[0]); var blockHeight = int.Parse(payload.Params[1]); var mapData = payload.Params[2]; //TheLoader.SetLoggedIn(true); //TheLoader.SetVisible(false); //while (TheLoader.TheGame == null || !TheLoader.TheGame.IsLoaded) { // Thread.Sleep(100); //} TheLoader.SetMap(blockWidth, blockHeight, mapData); SendPayload(new NetworkPayload { Type = PayloadType.Data, Command = PayloadCommand.MapLoaded }); return true; case PayloadCommand.PleaseLoadGame: while (TheLoader.TheGame == null || !TheLoader.TheGame.IsLoaded) { Thread.Sleep(100); } SendPayload(new NetworkPayload { Type = PayloadType.Data, Command = PayloadCommand.GameLoaded }); return true; case PayloadCommand.InitPlayer: var confSet = Helper.ConvertDataStringToDictionary(payload.Params[0]); foreach (var keyValuePair in confSet) { var attr = keyValuePair.Key; var val = keyValuePair.Value; switch (attr) { case "type": //TheLoader.TheGame.ThePlayer.Health = int.Parse(val); break; case "id": //TheLoader.TheGame.ThePlayer.Health = int.Parse(val); break; case "dmg": TheLoader.TheGame.ThePlayer.Weapon = val; break; case "hp": TheLoader.TheGame.ThePlayer.Health = int.Parse(val); break; case "maxhp": TheLoader.TheGame.ThePlayer.MaxHealth = int.Parse(val); break; case "ap": TheLoader.TheGame.ThePlayer.AttackPower = int.Parse(val); break; case "ac": TheLoader.TheGame.ThePlayer.ArmorClass = int.Parse(val); break; case "maxmana": TheLoader.TheGame.ThePlayer.MaxMana = int.Parse(val); break; case "mana": TheLoader.TheGame.ThePlayer.Mana = int.Parse(val); break; case "xp": TheLoader.TheGame.ThePlayer.ExperiencePoints = int.Parse(val); break; case "level": TheLoader.TheGame.ThePlayer.Level = int.Parse(val); break; case "nextlevel": TheLoader.TheGame.ThePlayer.NextLevelAt = int.Parse(val); break; default: Log("Unknown attr for player: " + attr + " -> " + val + ""); break; } } if (confSet["x"] != null) { var pos = new Position2D(int.Parse(confSet["x"]), int.Parse(confSet["y"])); TheLoader.TheGame.ThePlayer.Position = pos; TheLoader.TheGame.TheGrid.GetBlockAt(pos).Entities.Add(TheLoader.TheGame.ThePlayer); lock (TheLoader.TheGame.GameObjects) { TheLoader.TheGame.GameObjects.Add(TheLoader.TheGame.ThePlayer); } } else { Log("Did not get user coords for player!!"); } return true; case PayloadCommand.InitEntity: var confSet2 = Helper.ConvertDataStringToDictionary(payload.Params[0]); LivingEntity mob2; if (confSet2["type"].Contains("Skeleton")) { mob2 = new Skeleton(confSet2["id"]); } else if (confSet2["type"].Contains("Ghost")) { mob2 = new Ghost(confSet2["id"]); } else { return true; } mob2.Position = new Position2D(int.Parse(confSet2["x"]), int.Parse(confSet2["y"])); mob2.Health = int.Parse(confSet2["hp"]); TheLoader.TheGame.TheGrid.GetBlockAt(new Position2D(int.Parse(confSet2["x"]), int.Parse(confSet2["y"]))). Entities.Add(mob2); lock (TheLoader.TheGame.GameObjects) { TheLoader.TheGame.GameObjects.Add(mob2); } return true; default: throw new Exception("Unknown auth (subCode): '" + payload.Command + "'"); } //} break; case PayloadType.Message: if (payload.Params.Count > 1) { var from = payload.Params[0]; var message = payload.Params[1]; if (from.ToUpper().Equals("SYSTEM")) Log("" + from + " " + message + ""); if (from.Equals(_loggedInUser)) Log("" + from + " " + message + ""); else Log("" + from + " " + message + ""); } else { // error from server, to few command throw new Exception("unknown ms syntax "); } break; case PayloadType.User: //if (parm.Length > 1) { // string subCode = parm[0]; switch (payload.Command) { case PayloadCommand.Login: var confSet = Helper.ConvertDataStringToDictionary(payload.Params[0]); if (confSet["id"] == _username) { return true; } var op = TheLoader.TheGame.GameObjects.GetById(confSet["id"]) as OtherPlayer; if (op == null) { var otherplayer = new OtherPlayer(Textures.Hero, confSet["id"]); var playerPos = new Position2D(int.Parse(confSet["x"]), int.Parse(confSet["y"])); otherplayer.Desc = confSet["id"]; otherplayer.Position = playerPos; // otherplayer.Disconnected = true; otherplayer.Health = int.Parse(confSet["hp"]); otherplayer.MaxHealth = int.Parse(confSet["maxhp"]); otherplayer.Level = int.Parse(confSet["level"]); otherplayer.ExperiencePoints = int.Parse(confSet["xp"]); otherplayer.Mana = int.Parse(confSet["mana"]); TheLoader.TheGame.TheGrid.GetBlockAt(playerPos).Entities.Add(otherplayer); lock (TheLoader.TheGame.GameObjects) { TheLoader.TheGame.GameObjects.Add(otherplayer); } } break; case PayloadCommand.Logout: var username = payload.Params[0]; var otherplayer2 = TheLoader.TheGame.GameObjects.GetById(username) as OtherPlayer; if (otherplayer2 != null) { otherplayer2.OnDeath(); TheLoader.TheGame.TheGrid.GetBlockAt(otherplayer2.Position) .Entities.Remove(otherplayer2); lock (TheLoader.TheGame.GameObjects) { TheLoader.TheGame.GameObjects.Remove(username); } } break; default: throw new Exception("unknown us subCode " + payload.Command); } //} //else { // // error from server, to few command // throw new Exception("unknown us syntax "); //} break; case PayloadType.UserList: while (TheLoader.TheGame == null || TheLoader.TheGame.GameObjects == null) { Thread.Sleep(100); } foreach (string t in payload.Params) { string[] configBlocks = t.Split('#'); foreach (string configBlock in configBlocks) { if (configBlock.Trim().Length > 0) { Dictionary<string, string> confSet = Helper.ConvertDataStringToDictionary(configBlock); if (confSet["id"] == _username) { continue; } var op = TheLoader.TheGame.GameObjects.GetById(confSet["id"]) as OtherPlayer; if (op == null) { op = new OtherPlayer(Textures.Hero, confSet["id"]); op.Desc = confSet["id"]; var playerPos = new Position2D(int.Parse(confSet["x"]), int.Parse(confSet["y"])); op.Position = playerPos; TheLoader.TheGame.TheGrid.GetBlockAt(playerPos).Entities.Add(op); op.Health = int.Parse(confSet["hp"]); op.MaxHealth = int.Parse(confSet["maxhp"]); op.Level = int.Parse(confSet["level"]); op.ExperiencePoints = int.Parse(confSet["xp"]); op.Mana = int.Parse(confSet["mana"]); lock (TheLoader.TheGame.GameObjects) { TheLoader.TheGame.GameObjects.Add(op); } } else { op.Health = int.Parse(confSet["hp"]); op.MaxHealth = int.Parse(confSet["maxhp"]); op.Level = int.Parse(confSet["level"]); op.ExperiencePoints = int.Parse(confSet["xp"]); op.Mana = int.Parse(confSet["mana"]); op.MoveTo(new Position2D(int.Parse(confSet["x"]), int.Parse(confSet["y"]))); } } } //string username = userdata[0]; //int column = int.Parse(userdata[1]); //int row = int.Parse(userdata[2]); //OtherPlayer op = TheLoader.TheGame.GameObjects.GetById(username) as OtherPlayer; //if (op == null) { // OtherPlayer o = new OtherPlayer(Textures.Hero, username); // o.Desc = username; // Position2D playerPos = new Position2D(column, row); // o.Position = playerPos; // TheLoader.TheGame.TheGrid.GetBlockAt(playerPos).Entities.Add(o); // lock (TheLoader.TheGame.GameObjects) { // TheLoader.TheGame.GameObjects.Add(o); // } //} //else { // op.MoveTo(new Position2D(column, row)); //} } break; case PayloadType.System: //try //{ switch (payload.Command) { //case "start-reconnect": // Log(DateTime.Now.ToLongTimeString() + ": Starting reconnect sequence"); // TheLoader.StartReconnectSequence(); // return true; //case "whois": // if (parm.Length >= 3) // Log("(whois " + parm[1] + ")? " + parm[2]); // return true; case PayloadCommand.LoggedInDifferentLocation: TheLoader.TheGame.Exit(); return true; case PayloadCommand.Ping: SendPayload(new NetworkPayload { Type = PayloadType.System, Command = PayloadCommand.Pong }); return true; default: if (payload.Params.Count > 0) { Log("SYSTEM: " + payload.Params[0]); } return true; } //} return true; //} //catch (ThreadAbortException) //{ // throw; //} //catch (Exception ex) //{ // Log(ex.ToString()); // return true; //} case PayloadType.Move: string mobId = payload.Params[0]; int mobCol = int.Parse(payload.Params[1]); int mobRow = int.Parse(payload.Params[2]); LivingEntity mob = TheLoader.TheGame.GameObjects.GetById(mobId) as LivingEntity; if (mob != null) { mob.MoveTo(new Position2D(mobCol, mobRow)); //Log(DateTime.Now.ToLongTimeString() + "MOVEMENT: " + mobId + " moved to " + mobCol + "x" + // mobRow); } else { Log(DateTime.Now.ToLongTimeString() + "MOVEMENT: " + mobId + " NOT FOUND!!"); } return true; case PayloadType.EntityChange: string entityId = payload.Params[0]; string attribute = payload.Params[1]; string deltaValue = payload.Params[2]; string newValue = payload.Params[3]; var entity = TheLoader.TheGame.GameObjects.GetById(entityId) as LivingEntity; if (entity != null) { switch (attribute) { case "die": Log(DateTime.Now.ToLongTimeString() + " DIED CHANGE"); lock (TheLoader.TheGame.GameObjects) { TheLoader.TheGame.GameObjects.RemoveById(entity.Id); } TheLoader.TheGame.TheGrid.GetBlockAt(entity.Position).Entities.RemoveById(entity.Id); return true; case "hp": Log(DateTime.Now.ToLongTimeString() + " HP CHANGE: " + entityId + " changed to " + newValue + " -- delta " + deltaValue); entity.Health += int.Parse(deltaValue); if (entity.Health != int.Parse(newValue)) { //throw new Exception("server and client hp out of sync: server=" + newValue + "/client=" + entity.Health); Log(DateTime.Now.ToLongTimeString() + "Health server and client hp out of sync: server=" + newValue + "/client=" + entity.Health); } if (int.Parse(deltaValue) < 0) { FadingWorldsGameWindow.Instance.TemporaryObjects.Add(new LimitedEntity(Textures.Explosion, entity.Position, 0.12f)); } break; case "maxhp": Log(DateTime.Now.ToLongTimeString() + " MaxHealth CHANGE: " + entityId + " changed to " + newValue + " -- delta " + deltaValue); entity.MaxHealth += int.Parse(deltaValue); if (entity.MaxHealth != int.Parse(newValue)) { Log(DateTime.Now.ToLongTimeString() + " MaxHealth server and client hp out of sync: server=" + newValue + "/client=" + entity.MaxHealth); } break; case "mana": Log(DateTime.Now.ToLongTimeString() + " Mana CHANGE: " + entityId + " changed to " + newValue + " -- delta " + deltaValue); entity.Mana += int.Parse(deltaValue); if (entity.Mana != int.Parse(newValue)) { Log(DateTime.Now.ToLongTimeString() + " Mana server and client hp out of sync: server=" + newValue + "/client=" + entity.Mana); } break; case "maxmana": Log(DateTime.Now.ToLongTimeString() + " MaxMana CHANGE: " + entityId + " changed to " + newValue + " -- delta " + deltaValue); entity.MaxMana += int.Parse(deltaValue); if (entity.MaxMana != int.Parse(newValue)) { Log(DateTime.Now.ToLongTimeString() + " MaxMana server and client hp out of sync: server=" + newValue + "/client=" + entity.MaxMana); } break; case "xp": Log(DateTime.Now.ToLongTimeString() + " ExperiencePoints CHANGE: " + entityId + " changed to " + newValue + " -- delta " + deltaValue); entity.ExperiencePoints += int.Parse(deltaValue); if (entity.ExperiencePoints != int.Parse(newValue)) { Log(DateTime.Now.ToLongTimeString() + " ExperiencePoints server and client hp out of sync: server=" + newValue + "/client=" + entity.ExperiencePoints); } break; case "ac": Log(DateTime.Now.ToLongTimeString() + " ArmorClass CHANGE: " + entityId + " changed to " + newValue + " -- delta " + deltaValue); entity.ArmorClass += int.Parse(deltaValue); if (entity.ArmorClass != int.Parse(newValue)) { Log(DateTime.Now.ToLongTimeString() + " ArmorClass server and client hp out of sync: server=" + newValue + "/client=" + entity.ArmorClass); } break; case "ap": Log(DateTime.Now.ToLongTimeString() + " AttackPower CHANGE: " + entityId + " changed to " + newValue + " -- delta " + deltaValue); entity.AttackPower += int.Parse(deltaValue); if (entity.AttackPower != int.Parse(newValue)) { Log(DateTime.Now.ToLongTimeString() + " AttackPower server and client hp out of sync: server=" + newValue + "/client=" + entity.AttackPower); } break; case "level": Log(DateTime.Now.ToLongTimeString() + " Level CHANGE: " + entityId + " changed to " + newValue + " -- delta " + deltaValue); entity.Level += int.Parse(deltaValue); if (entity.Level != int.Parse(newValue)) { Log(DateTime.Now.ToLongTimeString() + " Level server and client hp out of sync: server=" + newValue + "/client=" + entity.Level); } break; case "nextlevel": Log(DateTime.Now.ToLongTimeString() + "NextLevelAt CHANGE: " + entityId + " changed to " + newValue + " -- delta " + deltaValue); entity.NextLevelAt += int.Parse(deltaValue); if (entity.NextLevelAt != int.Parse(newValue)) { Log(DateTime.Now.ToLongTimeString() + " NextLevelAt server and client hp out of sync: server=" + newValue + "/client=" + entity.NextLevelAt); } break; default: Log(DateTime.Now.ToLongTimeString() + "UNKNOWN CHANGE: " + entityId + " changed " + attribute + " to " + newValue + " -- delta " + deltaValue); break; } } else { Log(DateTime.Now.ToLongTimeString() + "ENTITYCHANGE: " + entityId + " NOT FOUND!!"); } //} return true; default: throw new Exception("Unknown (opCode): '" + payload.Type + "'"); } // Default to true return true; }
public void SendPayload(NetworkPayload msg) { Serializer.SerializeWithLengthPrefix(_client.GetStream(), msg, PrefixStyle.Base128); _client.GetStream().Flush(); Log("Sending: " + msg); }