Ejemplo n.º 1
0
 public World(string name, BoundingBox boundingBox, Vector tileDimensions)
     : base(boundingBox, tileDimensions)
 {
     this.Name = name;
     this.ItemCache = new ItemCache();
     log.InfoFormat("created world {0}", name);
 }
Ejemplo n.º 2
0
 public Vector(Vector v)
     : this()
 {
     X = v.X;
     Y = v.Y;
     Z = v.Z;
 }
Ejemplo n.º 3
0
 public static OperationRequest CreateWorld(string worldName, BoundingBox boundingBox, Vector tileDimensions)
 {
     var request = new OperationRequest { OperationCode = (byte)OperationCode.CreateWorld, Parameters = new Dictionary<byte, object>() };
     request.Parameters.Add((byte)ParameterCode.WorldName, worldName);
     request.Parameters.Add((byte)ParameterCode.BoundingBox, boundingBox);
     request.Parameters.Add((byte)ParameterCode.TileDimensions, tileDimensions);
     return request;
 }
Ejemplo n.º 4
0
        public void RegionIndexesAndBorders5()
        {
            var min = new Vector { X = 0, Y = 0 };
            var max = new Vector { X = 100, Y = 100 };
            var tileDimensions = new Vector { X = 1, Y = 1 };
            var world = new GridWorld(new BoundingBox(min, max), tileDimensions);

            RegionIndexesAndBorders(world);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Initializes a new instance of the <see cref="MmoWorld"/> class. 
        /// </summary>
        /// <param name="name">
        /// The world name.
        /// </param>
        /// <param name="topLeftCorner">
        /// The top left corner.
        /// </param>
        /// <param name="bottomRightCorner">
        /// The bottom right corner.
        /// </param>
        /// <param name="tileDimensions">
        /// The tile dimensions.
        /// </param>
        public MmoWorld(string name, Vector topLeftCorner, Vector bottomRightCorner, Vector tileDimensions)
            : base(topLeftCorner, bottomRightCorner, tileDimensions, new MmoItemCache())
        {
            this.name = name;

            log.InfoFormat("created world {0}", name);

            const string PropertyKeyColor = "color";
            const string PropertyKeyInterestAreaAttached = "attached";
            const string PropertyKeyText = "text";
            const string PropertyKeyViewDistanceEnter = "enter";
            const string PropertyKeyViewDistanceExit = "exit";

            var viewDistanceEnter = new Vector { X = (this.TileDimensions.X / 2) + 1, Y = (this.TileDimensions.Y / 2) + 1 };
            var viewDistanceExit = new Vector
                {
                    X = Math.Max(viewDistanceEnter.X + this.TileDimensions.X, (int)(1.5f * viewDistanceEnter.X)), 
                    Y = Math.Max(viewDistanceEnter.Y + this.TileDimensions.Y, (int)(1.5f * viewDistanceEnter.Y))
                };
            int color;
            unchecked
            {
                color = (int)0xFFFFFFFF;
            }

            var properties = new Hashtable
                {
                    { PropertyKeyInterestAreaAttached, true }, 
                    { PropertyKeyViewDistanceEnter, viewDistanceEnter.ToFloatArray() }, 
                    { PropertyKeyViewDistanceExit, viewDistanceExit.ToFloatArray() }, 
                    { PropertyKeyColor, color }, 
                    { PropertyKeyText, "NPC" }
                };

            // left and right are swapped in island demo
            this.npc1 = new Npc(topLeftCorner, properties, "top right npc", (byte)ItemType.Avatar, this, viewDistanceEnter, viewDistanceExit);
            this.npc2 = new Npc(bottomRightCorner, properties, "bottom left npc", (byte)ItemType.Avatar, this, viewDistanceEnter, viewDistanceExit);
            var bottomLeftCorner = new Vector { X = topLeftCorner.X, Y = bottomRightCorner.Y };
            this.npc3 = new Npc(
                bottomLeftCorner, 
                properties, 
                "bottom right npc", 
                (byte)ItemType.Avatar, 
                this, 
                viewDistanceEnter, 
                viewDistanceExit);
            var topRightCorner = new Vector { X = bottomRightCorner.X, Y = topLeftCorner.Y };
            this.npc4 = new Npc(
                topRightCorner, 
                properties, 
                "top left npc", 
                (byte)ItemType.Avatar, 
                this, 
                viewDistanceEnter, 
                viewDistanceExit);
        }
Ejemplo n.º 6
0
 public static void CreateWorld(Game game, string worldName, BoundingBox boundingBox, Vector tileDimensions)
 {
     var data = new Dictionary<byte, object>
         {
             { (byte)ParameterCode.WorldName, worldName },
             { (byte)ParameterCode.BoundingBox, boundingBox },
             { (byte)ParameterCode.TileDimensions, tileDimensions }
         };
     game.SendOperation(OperationCode.CreateWorld, data, true, Settings.OperationChannel);
 }
Ejemplo n.º 7
0
 public bool MoveAbsolute(Vector newPosition, Vector rotation)
 {
     if (!this.Game.WorldData.BoundingBox.Contains2d(newPosition))
     {
         return false;
     }
     this.SetPositions(newPosition, this.Position, rotation, this.Rotation);
     Operations.Move(this.Game, this.Id, newPosition, rotation, this.Game.Settings.SendReliable);
     return true;
 }
Ejemplo n.º 8
0
        public static void Move(Client client, string itemId, Vector position)
        {
            var data = new Dictionary<byte, object> { { (byte)ParameterCode.Position, position } };
            if (itemId != null)
            {
                data.Add((byte)ParameterCode.ItemId, itemId);
            }

            client.SendOperation((byte)OperationCode.Move, data, true);
        }
Ejemplo n.º 9
0
 public static void CreateWorld(Client client, string worldName, BoundingBox boundingBox, Vector tileDimensions)
 {
     var data = new Dictionary<byte, object>
         {
             { (byte)ParameterCode.WorldName, worldName },
             { (byte)ParameterCode.BoundingBox, boundingBox },
             { (byte)ParameterCode.TileDimensions, tileDimensions }
         };
     client.SendOperation((byte)OperationCode.CreateWorld, data, true);
 }
Ejemplo n.º 10
0
        public static OperationRequest Move(string itemId, Vector position)
        {
            var request = new OperationRequest { OperationCode = (byte)OperationCode.Move, Parameters = new Dictionary<byte, object>() };
            request.Parameters.Add((byte)ParameterCode.Position, position);
            if (itemId != null)
            {
                request.Parameters.Add((byte)ParameterCode.ItemId, itemId);
            }

            return request;
        }
Ejemplo n.º 11
0
        public static void AddInterestArea(Game game, byte cameraId, Vector position, Vector viewDistanceEnter, Vector viewDistanceExit)
        {
            var data = new Dictionary<byte, object>
                {
                    { (byte)ParameterCode.InterestAreaId, cameraId },
                    { (byte)ParameterCode.ViewDistanceEnter, viewDistanceEnter },
                    { (byte)ParameterCode.ViewDistanceExit, viewDistanceExit },
                    { (byte)ParameterCode.Position, position }
                };

            game.SendOperation(OperationCode.AddInterestArea, data, true, Settings.ItemChannel);
        }
Ejemplo n.º 12
0
        private static void RegionIndexesAndBorders(GridWorld world)
        {
            Region region;
            var current = new Vector();
            for (current.X = world.Area.Min.X; current.X < world.Area.Max.X; current.X++)
            {
                for (current.Y = world.Area.Min.Y; current.Y < world.Area.Max.Y; current.Y++)
                {
                    Assert.IsNotNull(world.GetRegion(current), current.ToString());
                }
            }

            try
            {
                for (current.Y = world.Area.Min.Y; current.Y < world.Area.Max.Y; current.Y += world.TileDimensions.Y)
                {
                    // current.Y = (float)Math.Round(current.Y, 2);
                    for (current.X = world.Area.Min.X; current.X < world.Area.Max.X; current.X += world.TileDimensions.X)
                    {
                        // current.X = (float)Math.Round(current.X, 2);
                        Assert.IsNotNull(region = world.GetRegion(current), "null at {0}", current);
                    }
                }
            }
            catch (IndexOutOfRangeException)
            {
                Console.WriteLine(current);
                throw;
            }

            current.X = world.Area.Min.X - 1;
            Assert.IsNull(world.GetRegion(current));
            current.Y = world.Area.Min.Y - 1;
            Assert.IsNull(world.GetRegion(current));
            current.X = world.Area.Min.X;
            Assert.IsNull(world.GetRegion(current));

            current.Y = world.Area.Max.Y + 1;
            Assert.IsNull(world.GetRegion(current));
            current.X = world.Area.Max.X + 1;
            Assert.IsNull(world.GetRegion(current));
            current.Y = world.Area.Max.Y;
            Assert.IsNull(world.GetRegion(current));

            Assert.NotNull(world.GetRegion(world.Area.Min));
            Assert.IsNull(world.GetRegion(world.Area.Max));

            world.GetRegions(world.Area);
        }
Ejemplo n.º 13
0
        public static OperationRequest EnterWorld(
            string worldName, string username, Hashtable properties, Vector position, Vector viewDistanceEnter, Vector viewDistanceExit)
        {
            var request = new OperationRequest { OperationCode = (byte)OperationCode.EnterWorld, Parameters = new Dictionary<byte, object>() };
            request.Parameters.Add((byte)ParameterCode.WorldName, worldName);
            request.Parameters.Add((byte)ParameterCode.Username, username);
            request.Parameters.Add((byte)ParameterCode.Position, position);
            request.Parameters.Add((byte)ParameterCode.ViewDistanceEnter, viewDistanceEnter);
            request.Parameters.Add((byte)ParameterCode.ViewDistanceExit, viewDistanceExit);
            if (properties != null)
            {
                request.Parameters.Add((byte)ParameterCode.Properties, properties);
            }

            return request;
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Registers an Item with the radar.
        /// </summary>
        /// <remarks>
        /// The radar will receive position changes from the item and publish them with his Channel.
        /// The publish interval can be configured with Settings.RadarUpdateInterval.
        /// </remarks>
        public void AddItem(Item item, Vector position)
        {
            this.actionQueue.EnqueueAction(
                () =>
                {
                    this.itemPositions.Add(item, position);

                    // update radar every 10 seconds
                    IDisposable positionUpdates = item.PositionUpdateChannel.SubscribeToLast(
                        this.fiber, this.UpdatePosition, Settings.RadarUpdateInterval);
                    IDisposable disposeMessage = item.DisposeChannel.Subscribe(this.fiber, this.RemoveItem);
                    var unsubscriber = new UnsubscriberCollection(positionUpdates, disposeMessage);
                    this.itemSubscriptions.Add(item, unsubscriber);

                    this.PublishUpdate(item, position, false, true);
                });
        }
Ejemplo n.º 15
0
        public void OnRadarUpdate(string itemId, ItemType itemType, Vector position, bool remove)
        {
            itemId += itemType;
            if (remove)
            {
                this.itemPositions.Remove(itemId);
                return;
            }

            if (!this.itemPositions.ContainsKey(itemId))
            {
                this.itemPositions.Add(itemId, position);
                return;
            }

            this.itemPositions[itemId] = position;
        }
Ejemplo n.º 16
0
        public Item(Vector position, Vector rotation, Hashtable properties, MmoActorOperationHandler owner, string id, byte type, World world)
        {
            this.Position = position;
            this.Rotation = rotation;
            this.Owner = owner;
            this.eventChannel = new MessageChannel<ItemEventMessage>(ItemEventMessage.CounterEventSend);
            this.disposeChannel = new MessageChannel<ItemDisposedMessage>(MessageCounters.CounterSend);
            this.positionUpdateChannel = new MessageChannel<ItemPositionMessage>(MessageCounters.CounterSend);
            this.properties = properties ?? new Hashtable();
            if (properties != null)
            {
                this.PropertiesRevision++;
            }

            this.id = id;
            this.world = world;
            this.type = type;
        }
Ejemplo n.º 17
0
        public static void EnterWorld(
            Client client, string worldName, string username, Hashtable properties, Vector position, Vector viewDistanceEnter, Vector viewDistanceExit)
        {
            var data = new Dictionary<byte, object>
                {
                    { (byte)ParameterCode.WorldName, worldName },
                    { (byte)ParameterCode.Username, username },
                    { (byte)ParameterCode.Position, position },
                    { (byte)ParameterCode.ViewDistanceEnter, viewDistanceEnter },
                    { (byte)ParameterCode.ViewDistanceExit, viewDistanceExit }
                };
            if (properties != null)
            {
                data.Add((byte)ParameterCode.Properties, properties);
            }

            client.SendOperation((byte)OperationCode.EnterWorld, data, true);
        }
Ejemplo n.º 18
0
        public GridWorld(BoundingBox area, Vector tileDimensions)
        {
            // 2D grid: extend Z to max possible
            this.Area = area;
            this.TileDimensions = tileDimensions;
            this.TileX = (int)Math.Ceiling(Area.Size.X / (double)tileDimensions.X);
            this.TileY = (int)Math.Ceiling(Area.Size.Y / (double)tileDimensions.Y);

            this.worldRegions = new Region[TileX][];
            for (int x = 0; x < TileX; x++)
            {
                this.worldRegions[x] = new Region[TileY];
                for (int y = 0; y < TileY; y++)
                {
                    this.worldRegions[x][y] = new Region(x, y);
                }
            }
        }
Ejemplo n.º 19
0
        public static void EnterWorld(
            Game game, string worldName, string username, Hashtable properties, Vector position, Vector rotation, Vector viewDistanceEnter, Vector viewDistanceExit)
        {
            var data = new Dictionary<byte, object>
                {
                    { (byte)ParameterCode.WorldName, worldName },
                    { (byte)ParameterCode.Username, username },
                    { (byte)ParameterCode.Position, position },
                    { (byte)ParameterCode.ViewDistanceEnter, viewDistanceEnter },
                    { (byte)ParameterCode.ViewDistanceExit, viewDistanceExit }
                };
            if (properties != null)
            {
                data.Add((byte)ParameterCode.Properties, properties);
            }

            if (!rotation.IsZero)
            {
                data.Add((byte)ParameterCode.Rotation, rotation);
            }

            game.SendOperation(OperationCode.EnterWorld, data, true, Settings.OperationChannel);
        }
Ejemplo n.º 20
0
        private void OnKeyDown(object sender, KeyEventArgs e)
        {
            // ignore keyboard when entering text
            if (this.textBoxPlayerText.Focused)
            {
                return;
            }

            switch (e.KeyCode)
            {
                case Keys.Space:
                    {
                        this.tabControlTabs.SuspendLayout();
                        if (this.tabControlTabs.SelectedTab == this.tabPageSettings)
                        {
                            var t = this.tabPageSettings.Tag as TabPage;
                            this.tabControlTabs.SelectedTab = t;
                        }
                        else
                        {
                            this.tabControlTabs.SelectedTab = this.tabPageSettings;
                        }

                        this.tabControlTabs.ResumeLayout(true);

                        return;
                    }

                case Keys.Oemplus:
                case Keys.Add:
                    {
                        var newPage = new GameTabPage { Padding = new Padding(3), UseVisualStyleBackColor = true };
                        this.tabControlTabs.TabPages.Add(newPage);
                        this.StartGame(newPage, Program.GetDefaultSettings());
                        newPage.Run();
                        return;
                    }
            }

            var page = this.tabControlTabs.SelectedTab as GameTabPage;
            if (page == null)
            {
                return;
            }

            Game game = page.Game;
            var settings = (Settings)game.Settings;

            switch (e.KeyCode)
            {
                case Keys.M:
                    {
                        if (settings.AutoMove)
                        {
                            settings.AutoMove = false;
                        }
                        else
                        {
                            settings.AutoMove = true;
                            page.AutoMove();
                        }

                        break;
                    }

                case Keys.W:
                case Keys.NumPad8:
                    {
                        game.Avatar.MoveRelative(AddVelocity(Game.MoveUp, settings.AutoMoveVelocity), Vector.Zero);
                        break;
                    }

                case Keys.A:
                case Keys.NumPad4:
                    {
                        game.Avatar.MoveRelative(AddVelocity(Game.MoveLeft, settings.AutoMoveVelocity), Vector.Zero);
                        break;
                    }

                case Keys.S:
                case Keys.NumPad2:
                    {
                        game.Avatar.MoveRelative(AddVelocity(Game.MoveDown, settings.AutoMoveVelocity), Vector.Zero);
                        break;
                    }

                case Keys.D:
                case Keys.NumPad6:
                    {
                        game.Avatar.MoveRelative(AddVelocity(Game.MoveRight, settings.AutoMoveVelocity), Vector.Zero);
                        break;
                    }

                case Keys.NumPad5:
                    {
                        game.Avatar.MoveAbsolute(game.WorldData.BoundingBox.Max / 2, Vector.Zero);
                        break;
                    }

                case Keys.NumPad7:
                    {
                        game.Avatar.MoveRelative(AddVelocity(Game.MoveUpLeft, settings.AutoMoveVelocity), Vector.Zero);
                        break;
                    }

                case Keys.NumPad9:
                    {
                        game.Avatar.MoveRelative(AddVelocity(Game.MoveUpRight, settings.AutoMoveVelocity), Vector.Zero);
                        break;
                    }

                case Keys.NumPad1:
                    {
                        game.Avatar.MoveRelative(AddVelocity(Game.MoveDownLeft, settings.AutoMoveVelocity), Vector.Zero);
                        break;
                    }

                case Keys.NumPad3:
                    {
                        game.Avatar.MoveRelative(AddVelocity(Game.MoveDownRight, settings.AutoMoveVelocity), Vector.Zero);
                        break;
                    }

                case Keys.OemMinus:
                case Keys.Subtract:
                    {
                        this.StopGame(page);
                        break;
                    }

                case Keys.Insert:
                    {
                        page.SpawnBot();
                        break;
                    }

                case Keys.Delete:
                    {
                        page.DestroyBot();
                        break;
                    }
                case Keys.OemOpenBrackets:
                    {
                        Vector viewDistance = new Vector(page.MainCamera.ViewDistanceEnter);
                        viewDistance.X = Math.Min(page.Game.WorldData.Width, viewDistance.X - (page.Game.WorldData.TileDimensions.X / 2));
                        viewDistance.Y = Math.Min(page.Game.WorldData.Height, viewDistance.Y - (page.Game.WorldData.TileDimensions.Y / 2));
                        page.MainCamera.SetViewDistance(viewDistance);
                        break;
                    }
                case Keys.OemCloseBrackets:
                    {
                        Vector viewDistance = new Vector(page.MainCamera.ViewDistanceEnter);
                        viewDistance.X = Math.Min(page.Game.WorldData.Width, viewDistance.X + (page.Game.WorldData.TileDimensions.X/2));
                        viewDistance.Y = Math.Min(page.Game.WorldData.Height, viewDistance.Y + (page.Game.WorldData.TileDimensions.Y/2));
                        page.MainCamera.SetViewDistance(viewDistance);
                        break;
                    }
            }
        }
Ejemplo n.º 21
0
 private static Vector AddVelocity(Vector input, int velocity)
 {
     return input*velocity;
 }
Ejemplo n.º 22
0
 /// <summary>
 ///   Override to include the <see cref = "Coordinate" /> for the <see cref = "MmoRadar" />.
 /// </summary>
 /// <param name = "position">
 ///   The position.
 /// </param>
 /// <param name = "region">
 ///   The region.
 /// </param>
 /// <returns>
 ///   An instance of <see cref = "MmoItemPositionUpdate" />.
 /// </returns>
 protected override ItemPositionMessage GetPositionUpdateMessage(Vector position, Region region)
 {
     return new MmoItemPositionUpdate(this, position, region, this.Coordinate);
 }
Ejemplo n.º 23
0
 public InterestArea(byte cameraId, Game game, Vector position)
 {
     this.game = game;
     this.cameraId = cameraId;
     this.Position = position;
 }
Ejemplo n.º 24
0
        public void SetViewDistance(Vector viewDistance)
        {
            if (viewDistance.X < 0)
            {
                viewDistance.X = 0;
            }

            if (viewDistance.Y < 0)
            {
                viewDistance.Y = 0;
            }

            this.ViewDistanceEnter = viewDistance;

            this.ViewDistanceExit = Vector.Max(
                this.ViewDistanceEnter + this.game.WorldData.TileDimensions, this.ViewDistanceEnter*1.5f
                );

            Operations.SetViewDistance(this.game, this.ViewDistanceEnter, this.ViewDistanceExit);
            this.game.Avatar.SetInterestAreaViewDistance(this);
        }
Ejemplo n.º 25
0
        public void Move(Vector newPosition)
        {
            if (this.AttachedItem == null)
            {
                this.Position = newPosition;
                Operations.MoveInterestArea(this.game, this.cameraId, newPosition);
                return;
            }

            throw new InvalidOperationException("cannot move attached interest area manually");
        }
Ejemplo n.º 26
0
 private static void EnterWorld(
     Client client, string worldName, Vector position, Vector viewDistanceEnter, Vector viewDistanceExit, Hashtable properties)
 {
     client.ResetEvent();
     client.SendOperation(Operations.EnterWorld(worldName, client.Username, properties, position, viewDistanceEnter, viewDistanceExit));
     ReceiveOperationResponse(client, ReturnCode.Ok); // blocking
 }
Ejemplo n.º 27
0
 private void PublishUpdate(Item item, Vector position, bool remove, bool unreliable)
 {
     var updateEvent = GetUpdateEvent(item, position, remove);
     IEventData eventData = new EventData((byte)EventCode.RadarUpdate, updateEvent);
     var message = new ItemEventMessage(item, eventData, new SendParameters { Unreliable = unreliable, ChannelId = Settings.RadarEventChannel });
     this.channel.Publish(message);
 }
Ejemplo n.º 28
0
 public ItemSnapshot(Item source, Vector position, Vector rotation, Region worldRegion, int propertiesRevision)
 {
     this.Source = source;
     this.Position = position;
     this.Rotation = rotation;
     this.PropertiesRevision = propertiesRevision;
 }
Ejemplo n.º 29
0
 public Client(string name, Vector position)
     : this(name)
 {
     this.Position = position;
 }
Ejemplo n.º 30
0
 private static object GetUpdateEvent(Item item, Vector position, bool remove)
 {
     return new RadarUpdate { ItemId = item.Id, ItemType = item.Type, Position = position, Remove = remove };
 }