コード例 #1
0
 public void ForceLand(string target)
 {
     World?.RemovePlayer(this);
     Base = target;
     client.SendPacket(new BaseEnterPacket()
     {
         Base = Base,
         Ship = Character.EncodeLoadout()
     }, NetDeliveryMethod.ReliableOrdered);
 }
コード例 #2
0
ファイル: Player.cs プロジェクト: HaydnTrigg/Librelancer
 public void ForceLand(string target)
 {
     World?.RemovePlayer(this);
     World = null;
     Base  = target;
     Client.SendPacket(new BaseEnterPacket()
     {
         Base = Base,
         Ship = Character.EncodeLoadout(),
         RTCs = rtcs.ToArray()
     }, PacketDeliveryMethod.ReliableOrdered);
 }
コード例 #3
0
 Task <bool> IServerPlayer.SelectCharacter(int index)
 {
     if (index >= 0 && index < CharacterList.Count)
     {
         var sc = CharacterList[index];
         FLLog.Info("Server", $"opening id {sc.Id}");
         Character = NetCharacter.FromDb(sc.Id, Game);
         Name      = Character.Name;
         rpcClient.UpdateBaselinePrices(Game.BaselineGoodPrices);
         rpcClient.UpdateInventory(Character.Credits, GetShipWorth(), Character.EncodeLoadout());
         Base     = Character.Base;
         System   = Character.System;
         Position = Character.Position;
         if (Base != null)
         {
             PlayerEnterBase();
         }
         else
         {
             SpaceInitialSpawn(null);
         }
         return(Task.FromResult(false));
     }
     else
     {
         return(Task.FromResult(true));
     }
 }
コード例 #4
0
        Task <bool> IServerPlayer.Unmount(string hardpoint)
        {
            if (BaseData == null)
            {
                FLLog.Error("Player", $"{Name} tried to unmount good while in space");
                return(Task.FromResult(false));
            }
            var equip = Character.Items.FirstOrDefault(x =>
                                                       hardpoint.Equals(x.Hardpoint, StringComparison.OrdinalIgnoreCase));

            if (equip == null)
            {
                FLLog.Error("Player", $"{Name} tried to unmount empty hardpoint");
                return(Task.FromResult(false));
            }

            equip.Hardpoint = null;
            rpcClient.UpdateInventory(Character.Credits, GetShipWorth(), Character.EncodeLoadout());
            return(Task.FromResult(true));
        }
コード例 #5
0
ファイル: NetPlayer.cs プロジェクト: youndoldman/Librelancer
        void ListAction(CharacterListActionPacket pkt)
        {
            switch (pkt.Action)
            {
            case CharacterListAction.RequestCharacterDB:
            {
                var m = server.NetServer.CreateMessage();
                m.Write(new NewCharacterDBPacket()
                    {
                        Factions = server.GameData.Ini.NewCharDB.Factions,
                        Packages = server.GameData.Ini.NewCharDB.Packages,
                        Pilots   = server.GameData.Ini.NewCharDB.Pilots
                    });
                server.NetServer.SendMessage(m, connection, NetDeliveryMethod.ReliableOrdered);
                break;
            }

            case CharacterListAction.SelectCharacter:
            {
                var m  = server.NetServer.CreateMessage();
                var sc = Account.Characters[pkt.IntArg];
                Character = NetCharacter.FromDb(sc, server.GameData);
                Base      = Character.Base;
                m.Write(new BaseEnterPacket()
                    {
                        Base = Character.Base,
                        Ship = Character.EncodeLoadout()
                    });
                server.NetServer.SendMessage(m, connection, NetDeliveryMethod.ReliableOrdered);
                break;
            }

            case CharacterListAction.CreateNewCharacter:
            {
                var m  = server.NetServer.CreateMessage();
                var ac = new ServerCharacter()
                {
                    Name    = pkt.StringArg,
                    Base    = "li01_01_base",
                    Credits = 2000,
                    ID      = 0,
                    Ship    = "ge_fighter"
                };
                Account.Characters.Add(ac);
                m.Write(new AddCharacterPacket()
                    {
                        Character = NetCharacter.FromDb(ac, server.GameData).ToSelectable()
                    });
                server.NetServer.SendMessage(m, connection, NetDeliveryMethod.ReliableOrdered);
                break;
            }
            }
        }
コード例 #6
0
ファイル: NetPlayer.cs プロジェクト: youndoldman/Librelancer
        void Launch()
        {
            var b   = server.GameData.GetBase(Base);
            var sys = server.GameData.GetSystem(b.System);

            server.RequestWorld(sys, (world) =>
            {
                this.World = world;
                var obj    = sys.Objects.FirstOrDefault((o) =>
                {
                    return(o.Dock != null &&
                           o.Dock.Kind == DockKinds.Base &&
                           o.Dock.Target.Equals(Base, StringComparison.OrdinalIgnoreCase));
                });
                System      = b.System;
                Orientation = Quaternion.Identity;
                Position    = Vector3.Zero;
                if (obj == null)
                {
                    FLLog.Error("Base", "Can't find object in " + sys + " docking to " + b);
                }
                else
                {
                    Position    = obj.Position;
                    Orientation = (obj.Rotation == null ? Matrix3.Identity : new Matrix3(obj.Rotation.Value)).ExtractRotation();
                    Position    = Vector3.Transform(new Vector3(0, 0, 500), Orientation) + obj.Position; //TODO: This is bad
                }
                var msg = server.NetServer.CreateMessage();
                msg.Write(new SpawnPlayerPacket()
                {
                    System      = System,
                    Position    = Position,
                    Orientation = Orientation,
                    Ship        = Character.EncodeLoadout()
                });
                server.NetServer.SendMessage(msg, connection, NetDeliveryMethod.ReliableOrdered);
                world.SpawnPlayer(this, Position, Orientation);
            });
        }
コード例 #7
0
ファイル: Player.cs プロジェクト: HaydnTrigg/Librelancer
        public void OpenSaveGame(Data.Save.SaveGame sg)
        {
            Orientation       = Quaternion.Identity;
            Position          = sg.Player.Position;
            Base              = sg.Player.Base;
            System            = sg.Player.System;
            Character         = new NetCharacter();
            Character.Credits = sg.Player.Money;
            string ps;

            if (sg.Player.ShipArchetype != null)
            {
                ps = sg.Player.ShipArchetype;
            }
            else
            {
                ps = game.GameData.GetShip(sg.Player.ShipArchetypeCrc).Nickname;
            }
            Character.Ship      = game.GameData.GetShip(ps);
            Character.Equipment = new List <NetEquipment>();
            foreach (var eq in sg.Player.Equip)
            {
                var       hp = eq.Hardpoint;
                Equipment equip;
                if (eq.EquipName != null)
                {
                    equip = game.GameData.GetEquipment(eq.EquipName);
                }
                else
                {
                    equip = game.GameData.GetEquipment(eq.EquipHash);
                }
                if (equip != null)
                {
                    Character.Equipment.Add(new NetEquipment()
                    {
                        Equipment = equip, Hardpoint = hp, Health = 1
                    });
                }
            }
            if (Base != null)
            {
                lock (rtcs)
                {
                    Client.SendPacket(new BaseEnterPacket()
                    {
                        Base = Base,
                        Ship = Character.EncodeLoadout(),
                        RTCs = rtcs.ToArray()
                    }, PacketDeliveryMethod.ReliableOrdered);
                }
                InitStory(sg);
            }
            else
            {
                var sys = game.GameData.GetSystem(System);
                game.RequestWorld(sys, (world) =>
                {
                    World = world;
                    Client.SendPacket(new SpawnPlayerPacket()
                    {
                        System      = System,
                        Position    = Position,
                        Orientation = Orientation,
                        Ship        = Character.EncodeLoadout()
                    }, PacketDeliveryMethod.ReliableOrdered);
                    world.SpawnPlayer(this, Position, Orientation);
                    //work around race condition where world spawns after player has been sent to a base
                    InitStory(sg);
                });
            }
        }
コード例 #8
0
ファイル: Player.cs プロジェクト: HaydnTrigg/Librelancer
        void ListAction(CharacterListActionPacket pkt)
        {
            switch (pkt.Action)
            {
            case CharacterListAction.RequestCharacterDB:
            {
                Client.SendPacket(new NewCharacterDBPacket()
                    {
                        Factions = game.GameData.Ini.NewCharDB.Factions,
                        Packages = game.GameData.Ini.NewCharDB.Packages,
                        Pilots   = game.GameData.Ini.NewCharDB.Pilots
                    }, PacketDeliveryMethod.ReliableOrdered);
                break;
            }

            case CharacterListAction.SelectCharacter:
            {
                if (pkt.IntArg > 0 && pkt.IntArg < CharacterList.Count)
                {
                    var sc = CharacterList[pkt.IntArg];
                    FLLog.Info("Server", $"opening id {sc.Id}");
                    Character = NetCharacter.FromDb(sc.Id, game);
                    FLLog.Info("Server", $"sending packet");
                    Base = Character.Base;
                    Client.SendPacket(new BaseEnterPacket()
                        {
                            Base = Character.Base,
                            Ship = Character.EncodeLoadout()
                        }, PacketDeliveryMethod.ReliableOrdered);
                }
                else
                {
                    Client.SendPacket(new CharacterListActionResponsePacket()
                        {
                            Action = CharacterListAction.SelectCharacter,
                            Status = CharacterListStatus.ErrBadIndex
                        }, PacketDeliveryMethod.ReliableOrdered);
                }
                break;
            }

            case CharacterListAction.DeleteCharacter:
            {
                var sc = CharacterList[pkt.IntArg];
                game.Database.DeleteCharacter(sc.Id);
                CharacterList.Remove(sc);
                Client.SendPacket(new CharacterListActionResponsePacket()
                    {
                        Action = CharacterListAction.DeleteCharacter,
                        Status = CharacterListStatus.OK
                    }, PacketDeliveryMethod.ReliableOrdered);
                break;
            }

            case CharacterListAction.CreateNewCharacter:
            {
                if (!game.Database.NameInUse(pkt.StringArg))
                {
                    Character ch = null;
                    game.Database.AddCharacter(playerGuid, (db) =>
                        {
                            ch            = db;
                            var sg        = game.NewCharacter(pkt.StringArg, pkt.IntArg);
                            db.Name       = sg.Player.Name;
                            db.Base       = sg.Player.Base;
                            db.System     = sg.Player.System;
                            db.Rank       = 1;
                            db.Costume    = sg.Player.Costume;
                            db.ComCostume = sg.Player.ComCostume;
                            db.Money      = sg.Player.Money;
                            db.Ship       = sg.Player.ShipArchetype;
                            db.Equipment  = new HashSet <EquipmentEntity>();
                            db.Cargo      = new HashSet <CargoItem>();
                            foreach (var eq in sg.Player.Equip)
                            {
                                db.Equipment.Add(new EquipmentEntity()
                                {
                                    EquipmentNickname  = eq.EquipName,
                                    EquipmentHardpoint = eq.Hardpoint
                                });
                            }
                            foreach (var cg in sg.Player.Cargo)
                            {
                                db.Cargo.Add(new CargoItem()
                                {
                                    ItemName  = cg.CargoName,
                                    ItemCount = cg.Count
                                });
                            }
                        });
                    var sel = NetCharacter.FromDb(ch.Id, game).ToSelectable();
                    CharacterList.Add(sel);
                    Client.SendPacket(new AddCharacterPacket()
                        {
                            Character = sel
                        }, PacketDeliveryMethod.ReliableOrdered);
                }
                else
                {
                    Client.SendPacket(new CharacterListActionResponsePacket()
                        {
                            Action = CharacterListAction.CreateNewCharacter,
                            Status = CharacterListStatus.ErrUnknown
                        }, PacketDeliveryMethod.ReliableOrdered);
                }
                break;
            }
            }
        }
コード例 #9
0
        public void OpenSaveGame(Data.Save.SaveGame sg)
        {
            Orientation       = Quaternion.Identity;
            Position          = sg.Player.Position;
            Base              = sg.Player.Base;
            System            = sg.Player.System;
            Character         = new NetCharacter();
            Character.Credits = sg.Player.Money;
            string ps;

            if (sg.Player.ShipArchetype != null)
            {
                ps = sg.Player.ShipArchetype;
            }
            else
            {
                ps = game.GameData.GetShip(sg.Player.ShipArchetypeCrc).Nickname;
            }
            Character.Ship      = game.GameData.GetShip(ps);
            Character.Equipment = new List <NetEquipment>();
            foreach (var eq in sg.Player.Equip)
            {
                var       hp = eq.Hardpoint;
                Equipment equip;
                if (eq.EquipName != null)
                {
                    equip = game.GameData.GetEquipment(eq.EquipName);
                }
                else
                {
                    equip = game.GameData.GetEquipment(eq.EquipHash);
                }
                if (equip != null)
                {
                    Character.Equipment.Add(new NetEquipment()
                    {
                        Equipment = equip, Hardpoint = hp, Health = 1
                    });
                }
            }
            if (Base != null)
            {
                lock (rtcs)
                {
                    client.SendPacket(new BaseEnterPacket()
                    {
                        Base = Base,
                        Ship = Character.EncodeLoadout(),
                        RTCs = rtcs.ToArray()
                    }, NetDeliveryMethod.ReliableOrdered);
                }
            }
            else
            {
                var sys = game.GameData.GetSystem(System);
                game.RequestWorld(sys, (world) =>
                {
                    World = world;
                    client.SendPacket(new SpawnPlayerPacket()
                    {
                        System      = System,
                        Position    = Position,
                        Orientation = Orientation,
                        Ship        = Character.EncodeLoadout()
                    }, NetDeliveryMethod.ReliableOrdered);
                    world.SpawnPlayer(this, Position, Orientation);
                });
            }
            var missionNum = sg.StoryInfo?.MissionNum ?? 0;

            if (game.GameData.Ini.ContentDll.AlwaysMission13)
            {
                missionNum = 14;
            }
            if (missionNum != 0 && (missionNum - 1) < game.GameData.Ini.Missions.Count)
            {
                msnRuntime = new MissionRuntime(game.GameData.Ini.Missions[missionNum - 1], this);
                msnRuntime.Update(TimeSpan.Zero);
            }
        }
コード例 #10
0
        public void OpenSaveGame(SaveGame sg)
        {
            Orientation = Quaternion.Identity;
            Position    = sg.Player.Position;
            Base        = sg.Player.Base;
            System      = sg.Player.System;
            Character   = new NetCharacter();
            Character.UpdateCredits(sg.Player.Money);
            string ps;

            if (sg.Player.ShipArchetype != null)
            {
                ps = sg.Player.ShipArchetype;
            }
            else
            {
                ps = Game.GameData.GetShip(sg.Player.ShipArchetypeCrc).Nickname;
            }
            Character.Ship  = Game.GameData.GetShip(ps);
            Character.Items = new List <NetCargo>();
            foreach (var eq in sg.Player.Equip)
            {
                var hp = eq.Hardpoint;
                if (string.IsNullOrEmpty(hp))
                {
                    hp = "internal";
                }
                Equipment equip;
                if (eq.EquipName != null)
                {
                    equip = Game.GameData.GetEquipment(eq.EquipName);
                }
                else
                {
                    equip = Game.GameData.GetEquipment(eq.EquipHash);
                }
                if (equip != null)
                {
                    Character.Items.Add(new NetCargo()
                    {
                        Equipment = equip, Hardpoint = hp, Health = 1, Count = 1
                    });
                }
            }
            foreach (var cg in sg.Player.Cargo)
            {
                Equipment equip;
                if (cg.CargoName != null)
                {
                    equip = Game.GameData.GetEquipment(cg.CargoName);
                }
                else
                {
                    equip = Game.GameData.GetEquipment(cg.CargoHash);
                }
                if (equip != null)
                {
                    Character.Items.Add(new NetCargo()
                    {
                        Equipment = equip, Count = cg.Count
                    });
                }
            }
            rpcClient.UpdateInventory(Character.Credits, GetShipWorth(), Character.EncodeLoadout());
            if (Base != null)
            {
                InitStory(sg);
                PlayerEnterBase();
            }
            else
            {
                InitStory(sg);
                SpaceInitialSpawn(sg);
            }
        }