예제 #1
0
        public override void Execute(Server server, Context context)
        {
            //Arrange

            //Act

            byte index = Tile.AddContent(Item);

            //Notify

            foreach (var observer in server.Map.GetPlayers())
            {
                if (observer.Tile.Position.CanSee(Tile.Position))
                {
                    context.Write(observer.Client.Connection, new ThingAddOutgoingPacket(Tile.Position, index, Item));
                }
            }

            //Event

            if (server.Events.TileAddItem != null)
            {
                server.Events.TileAddItem(this, new TileAddItemEventArgs(Item, Tile, index, server, context));
            }

            base.Execute(server, context);
        }
예제 #2
0
        public static IList <(Location, ITile)> ReadSector(ILogger logger, IItemFactory itemFactory, string fileName, string sectorFileContents, ushort xOffset, ushort yOffset, sbyte z)
        {
            itemFactory.ThrowIfNull(nameof(itemFactory));

            var loadedTilesList = new List <(Location, ITile)>();

            var lines = sectorFileContents.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

            foreach (var readLine in lines)
            {
                var inLine = readLine?.Split(new[] { CommentSymbol }, 2).FirstOrDefault();

                // ignore comments and empty lines.
                if (string.IsNullOrWhiteSpace(inLine))
                {
                    continue;
                }

                var data = inLine.Split(new[] { SectorSeparator }, 2);

                if (data.Length != 2)
                {
                    throw new InvalidDataException($"Malformed line [{inLine}] in sector file: [{fileName}]");
                }

                var tileInfo = data[0].Split(new[] { PositionSeparator }, 2);
                var tileData = data[1];

                var location = new Location
                {
                    X = (ushort)(xOffset + Convert.ToUInt16(tileInfo[0])),
                    Y = (ushort)(yOffset + Convert.ToUInt16(tileInfo[1])),
                    Z = z,
                };

                // start off with a tile that has no ground in it.
                ITile newTile = new Tile(location, null);

                newTile.AddContent(logger, itemFactory, CipFileParser.Parse(tileData));

                loadedTilesList.Add((location, newTile));
            }

            // TODO: proper logging.
            // Console.WriteLine($"Sector file {sectorFileContents.Name}: {loadedTilesList.Count} tiles loaded.");
            return(loadedTilesList);
        }
예제 #3
0
        public override void Execute(Server server, Context context)
        {
            //Arrange

            //Act

            byte index = Tile.AddContent(Creature);

            //Notify

            foreach (var observer in server.Map.GetPlayers())
            {
                if (observer.Tile.Position.CanSee(Tile.Position))
                {
                    uint removeId;

                    if (observer.Client.CreatureCollection.IsKnownCreature(Creature.Id, out removeId))
                    {
                        context.Write(observer.Client.Connection, new ThingAddOutgoingPacket(Tile.Position, index, Creature));
                    }
                    else
                    {
                        context.Write(observer.Client.Connection, new ThingAddOutgoingPacket(Tile.Position, index, removeId, Creature));
                    }
                }
            }

            //Event

            if (server.Events.TileAddCreature != null)
            {
                server.Events.TileAddCreature(this, new TileAddCreatureEventArgs(Creature, Tile, index, server, context));
            }

            base.Execute(server, context);
        }
예제 #4
0
        public override void Execute(Server server, Context context)
        {
            //Arrange

            if (Connection.Keys == null)
            {
                Connection.Keys = Packet.Keys;

                if (Packet.Version != 860)
                {
                    context.Write(Connection, new OpenSorryDialogOutgoingPacket(true, Constants.OnlyProtocol86Allowed));

                    context.Disconnect(Connection);
                }
                else
                {
                    var account = new PlayerRepository().GetPlayer(Packet.Account, Packet.Password, Packet.Character);

                    if (account == null)
                    {
                        context.Write(Connection, new OpenSorryDialogOutgoingPacket(true, Constants.AccountNameOrPasswordIsNotCorrect));

                        context.Disconnect(Connection);
                    }
                    else
                    {
                        Position toPosition = new Position(account.CoordinateX, account.CoordinateY, account.CoordinateZ);

                        Tile toTile = server.Map.GetTile(toPosition);

                        if (toTile != null)
                        {
                            Player player = new Player()
                            {
                                Name = account.Name
                            };

                            Connection.Client = new Client(server)
                            {
                                Player = player
                            };

                            //Act

                            server.Map.AddCreature(player);

                            byte toIndex = toTile.AddContent(player);

                            //Notify

                            foreach (var observer in server.Map.GetPlayers())
                            {
                                if (observer == player)
                                {
                                    context.Write(observer.Client.Connection, new SendInfoOutgoingPacket(player.Id, player.CanReportBugs),

                                                  new SetSpecialConditionOutgoingPacket(SpecialCondition.None),

                                                  new SendStatusOutgoingPacket(player.Health, player.MaxHealth,

                                                                               player.Capacity,

                                                                               player.Experience, player.Level, player.LevelPercent,

                                                                               player.Mana, player.MaxMana, 0, 0, player.Soul,

                                                                               player.Stamina),

                                                  new SendSkillsOutgoingPacket(10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0),

                                                  new SetEnvironmentLightOutgoingPacket(server.Clock.Light),

                                                  new SendTilesOutgoingPacket(server.Map, player.Client, toPosition),

                                                  new ShowMagicEffectOutgoingPacket(toPosition, MagicEffectType.Teleport));
                                }
                                else
                                {
                                    if (observer.Tile.Position.CanSee(toPosition))
                                    {
                                        uint removeId;

                                        if (observer.Client.CreatureCollection.IsKnownCreature(player.Id, out removeId))
                                        {
                                            context.Write(observer.Client.Connection, new ThingAddOutgoingPacket(toPosition, toIndex, player),

                                                          new ShowMagicEffectOutgoingPacket(toPosition, MagicEffectType.Teleport));
                                        }
                                        else
                                        {
                                            context.Write(observer.Client.Connection, new ThingAddOutgoingPacket(toPosition, toIndex, removeId, player),

                                                          new ShowMagicEffectOutgoingPacket(toPosition, MagicEffectType.Teleport));
                                        }
                                    }
                                }
                            }

                            foreach (var component in player.GetComponents <Behaviour>())
                            {
                                component.Start(server);
                            }

                            //Event

                            if (server.Events.Login != null)
                            {
                                server.Events.Login(this, new LoginEventArgs(player, toTile, toIndex, server, context));
                            }

                            if (server.Events.TileAddCreature != null)
                            {
                                server.Events.TileAddCreature(this, new TileAddCreatureEventArgs(player, toTile, toIndex, server, context));
                            }

                            base.Execute(server, context);
                        }
                    }
                }
            }
        }