void player_RunnerUpdate(Player.Player sender)
        {
            // A game thread has sent a notification to say that the player has changed - either
            // name, rank or system. We might change the assigned thread as a result.
            // In any case, we notify all game threads of the current name, rank and system.
            //var serverEvent = nextEvent as DPGameRunnerPlayerUpdateEvent;

            // Find runner for this system and if it's changed tell the old and new runners
            // of the change in ownership.
            var currRunner = sender.Runner;

            if (sender.Ship.System == null)
            {
                return;
            }
            var newRunner = _runners[sender.Ship.System];

            if (newRunner == currRunner || newRunner == null)
            {
                return;
            }

            sender.Runner = newRunner;
            newRunner.LinkPlayer(sender);
            sender.Update();


            // Notify all game threads of the current player info so they can update their
            // player lists.
            //foreach (var runner in _runners.Values)
            //runner.AddEvent(serverEvent);
        }
        void _dplay_PlayerConnected(object sender, Session e)
        {
            _log.AddLog(LogType.GENERAL, "Player created name={0}", e.Client);

            var defaultRunner = _runners.ElementAt(_rand.Next(_runners.Count - 1)).Value;

            var player = new Player.Player(e, _log, NewPlayerID(), defaultRunner);

            player.RunnerUpdate += player_RunnerUpdate;
            Players[e]           = player;
            defaultRunner.LinkPlayer(player);
            player.Update();
        }
예제 #3
0
        public void RxMsgFromClient(Player.Player player, byte[] msg)
        {
            if (msg[0] == 0x01 && msg.Length == 1)
            {
                // Keepalive
                byte[] omsg = { 0xFF };
                player.SendMsgToClient(omsg);
            }
            else if (msg[0] == 0x05 && msg[1] == 0x03)
            {
                // FLPACKET_CLIENT_REQUESTCHARINFO
                player.Log.AddLog(LogType.FL_MSG, "FLPACKET_CLIENT_REQUESTCHARINFO");
                Packets.SendCharInfoRequestResponse(player);
            }
            else if (msg[0] == 0x06 && msg[1] == 0x03)
            {
                // FLPACKET_CLIENT_SELECTCHARACTER
                var nameBefore   = player.Name;
                var pos          = 2;
                var charfilename = FLMsgType.GetAsciiStringLen16(msg, ref pos);

                var acct = Old.CharacterDB.Database.GetOneAccount(player.AccountID, charfilename);

                var result = player.LoadCharFile(acct, player.Log);

                if (result != null)
                {
                    player.Log.AddLog(LogType.ERROR, "error: cannot load character accdir={0} charfile={1} reason={2}",
                                      acct.CharName, result);
                    return;
                }

                player.Log.AddLog(LogType.GENERAL,
                                  "FLPACKET_CLIENT_SELECTCHARACTER charfilename={0} name={1} system={2}", charfilename, player.Name,
                                  player.Ship.System.Nickname);
                if (player.Ship != null && player.Ship.Objid != 0)
                {
                    player.Runner.DelSimObject(player.Ship);
                }

                player.OnCharacterSelected(nameBefore == player.Name, nameBefore == null);
                player.Update();
            }
            else if (msg[0] == 0x39 && msg[1] == 0x03)
            {
                player.Log.AddLog(LogType.FL_MSG, "FLPACKET_CLIENT_CREATENEWCHAR");
                // New character
                int    pos      = 2;
                string charname = FLMsgType.GetUnicodeStringLen16(msg, ref pos);

                //TODO: do nothing when charname exists?
                if (Old.CharacterDB.Database.GetAccount(@"CharName", charname) != null)
                {
                    return;
                }

                Old.CharacterDB.Database.AddAccount(player.AccountID, charname);

                //string charfile = player.Runner.Server.AcctPath +
                //                  Path.DirectorySeparatorChar + FLMsgType.FLNameToFile(player.AccountID) +
                //                  Path.DirectorySeparatorChar + FLMsgType.FLNameToFile(charname) + ".fl";
                //if (!File.Exists(charfile))
                //{
                //    var file =
                //        new FLDataFile(player.Runner.Server.AcctPath + Path.DirectorySeparatorChar + "default.fl", true);
                //    file.AddSetting("Player", "name", new object[] {FLUtility.EncodeUnicodeHex(charname)});
                //    file.SaveSettings(charfile, false);
                //}

                Packets.SendCharInfoRequestResponse(player);
            }
            else if (msg[0] == 0x3a && msg[1] == 0x03)
            {
                player.Log.AddLog(LogType.FL_MSG, "FLPACKET_CLIENT_DESTROYCHAR");

                // Delete character
                var pos      = 2;
                var charfile = FLMsgType.GetAsciiStringLen16(msg, ref pos);

                Old.CharacterDB.Database.DelAccount(player.AccountID, charfile);

                Packets.SendCharInfoRequestResponse(player);
            }
            else
            {
                // Unexpected packet. Log and ignore it.
                player.Log.AddLog(LogType.ERROR, "Unexpected message: client rx", player.DPSess, msg);
            }
        }