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); }
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); }
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); }
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); } } } } }