コード例 #1
0
 internal void SendPayloadToUser(string username, NetworkPayload p)
 {
     foreach (ConnectionThread c in Connections) {
         if (c.LoggedInUser.Username.Equals(username)) {
             c.SendPayload(p);
             return;
         }
     }
 }
コード例 #2
0
 public void SendPayloadToAll(NetworkPayload payload)
 {
     foreach (ConnectionThread c in Connections) {
         if (c.IsLoggedIn)
             c.SendPayload(payload);
     }
 }
コード例 #3
0
 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);
             }
         }
     }
 }
コード例 #4
0
        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;
        }
コード例 #5
0
        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();
        }
コード例 #6
0
 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);
     }
 }
コード例 #7
0
        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;
        }
コード例 #8
0
 public void SendPayload(NetworkPayload msg)
 {
     Serializer.SerializeWithLengthPrefix(_client.GetStream(), msg, PrefixStyle.Base128);
     _client.GetStream().Flush();
     Log("Sending: " + msg);
 }