コード例 #1
0
 public Item(string itemConfigKey)
 {
     ItemConfigKey = itemConfigKey;
     Configuration = ConfigurationRegistry.GetInstance().GetItemConfiguration(itemConfigKey);
     TileTarget    = new TileTarget();
     _stackSize    = 1;
 }
コード例 #2
0
        public void UseItemRightClick(Simulation.Simulation simulation, SimulationEntity entity)
        {
            if (Configuration.RightClickComponents.Count == 0)
            {
                return;
            }

            foreach (string componentKey in Configuration.RightClickComponents)
            {
                ConfigurationRegistry.GetInstance().GetItemComponent(componentKey).Use(simulation, entity, this);
            }
        }
コード例 #3
0
        public void UseItemLeftClick(Simulation.Simulation simulation, SimulationEntity entity)
        {
            if (Configuration.LeftClickComponents.Count == 0)
            {//Do default actions if no specified item components
                ConfigurationRegistry.GetInstance().GetItemComponent("Hit").Use(simulation, entity, this);
                ConfigurationRegistry.GetInstance().GetItemComponent("BreakBlock").Use(simulation, entity, this);
                return;
            }

            foreach (string componentKey in Configuration.LeftClickComponents)
            {
                ConfigurationRegistry.GetInstance().GetItemComponent(componentKey).Use(simulation, entity, this);
            }
        }
コード例 #4
0
        public void UseItemRightHold(Simulation.Simulation simulation, SimulationEntity entity, int holdTicks)
        {
            if (holdTicks % Configuration.CoolDown != 0)
            {
                return;
            }

            if (Configuration.RightHoldComponents.Count == 0)
            {
                return;
            }

            foreach (string componentKey in Configuration.RightHoldComponents)
            {
                ConfigurationRegistry.GetInstance().GetItemComponent(componentKey).Use(simulation, entity, this);
            }
        }
コード例 #5
0
        public void Use(Simulation simulation, SimulationEntity entity, IItem item)
        {
            if (entity.ControlState == null)
            {
                return;
            }

            int mouseX = (int)entity.ControlState.Mouse.X;
            int mouseY = (int)entity.ControlState.Mouse.Y;

            Tuple <int, int, int, int> chunkInformation = simulation.World.TranslatePixelPosition(mouseX, mouseY);

            //If we are inside map
            if (chunkInformation == null)
            {
                return;
            }

            Chunk targetChunk = simulation.World.ChunkFromChunkLocation(chunkInformation.Item1, chunkInformation.Item2);

            //If the chunk exist
            if (targetChunk == null)
            {
                return;
            }

            int xSelection = chunkInformation.Item3;
            int ySelection = chunkInformation.Item4;

            if (item.TileTarget.X != xSelection || item.TileTarget.Y != ySelection)
            {
                item.TileTarget.X             = xSelection;
                item.TileTarget.Y             = ySelection;
                item.TileTarget.Progress      = 0;
                item.TileTarget.ProgressTotal = ConfigurationRegistry.GetInstance()?
                                                .GetWallConfiguration((WorldTile)targetChunk.Wall[xSelection, ySelection])?.BreakSpeed ?? 0;
                return;
            }
            item.TileTarget.Progress++;

            WorldTile             tileType;
            ConfigurationRegistry config = ConfigurationRegistry.GetInstance();

            if (targetChunk.Block[xSelection, ySelection] == 0 && (tileType = (WorldTile)targetChunk.Wall[xSelection, ySelection]) != 0)
            {//Is block
                if (item.TileTarget.Progress < config.GetBlockConfiguration(tileType).BreakSpeed)
                {
                    return;//Not ready yet
                }
            }
            else
            {//is wall or air
                item.TileTarget.Progress = 0;
                return;
            }

            //If we made it here then we are ready to break a block
            targetChunk.ApplyBlockUpdate(new TileUpdate
            {
                X         = (byte)xSelection,
                Y         = (byte)ySelection,
                Mode      = false,
                TileValue = (ushort)WorldTile.Air
            });

            item.TileTarget.Progress = 0;

            int blockX = (simulation.World.WorldOptions.ChunkSize * chunkInformation.Item1 + xSelection) * simulation.World.WorldOptions.WorldScale;
            int blockY = (simulation.World.WorldOptions.ChunkSize * chunkInformation.Item2 + ySelection) * simulation.World.WorldOptions.WorldScale;

            InventoryManager inventory = new InventoryManager();
            Item             newItem   = new Item(config.GetWallConfiguration(tileType).ItemKey);

            inventory.Insert(newItem);

            SimulationEntity itemEntity = SimulationEntity.SimulationEntityFactory("Item");

            itemEntity.TextureKey = config.GetWallConfiguration(tileType).TextureKey;
            itemEntity.Position   = new BfbVector(blockX, blockY);
            itemEntity.Inventory  = inventory;
            simulation.AddEntity(itemEntity);
        }
コード例 #6
0
        public void Use(Simulation simulation, SimulationEntity entity, IItem item)
        {
            if (entity.ControlState == null)
            {
                return;
            }

            int mouseX = (int)entity.ControlState.Mouse.X;
            int mouseY = (int)entity.ControlState.Mouse.Y;

            Tuple <int, int, int, int> chunkInformation = simulation.World.TranslatePixelPosition(mouseX, mouseY);

            //If we are inside map
            if (chunkInformation == null)
            {
                return;
            }

            Chunk targetChunk = simulation.World.ChunkFromChunkLocation(chunkInformation.Item1, chunkInformation.Item2);

            //If the chunk exist
            if (targetChunk == null)
            {
                return;
            }

            int xSelection = chunkInformation.Item3;
            int ySelection = chunkInformation.Item4;

            if (item.TileTarget.X != xSelection || item.TileTarget.Y != ySelection)
            {
                item.TileTarget.X             = xSelection;
                item.TileTarget.Y             = ySelection;
                item.TileTarget.Progress      = 0;
                item.TileTarget.ProgressTotal = ConfigurationRegistry.GetInstance()?
                                                .GetBlockConfiguration((WorldTile)targetChunk.Block[xSelection, ySelection])?.BreakSpeed ?? 0;
                return;
            }
            item.TileTarget.Progress++;

            WorldTile             tileType;
            ConfigurationRegistry config = ConfigurationRegistry.GetInstance();

            if ((tileType = (WorldTile)targetChunk.Block[xSelection, ySelection]) != 0)
            {//Is block
                if (item.TileTarget.Progress < config.GetBlockConfiguration(tileType).BreakSpeed)
                {
                    return;//Not ready yet
                }
            }
            else
            {//is wall or air
                return;
            }

            //If we made it here then we are ready to break a block
            targetChunk.ApplyBlockUpdate(new TileUpdate
            {
                X         = (byte)xSelection,
                Y         = (byte)ySelection,
                Mode      = true,
                TileValue = (ushort)WorldTile.Air
            });

            item.TileTarget.Progress = 0;

            int blockX = (simulation.World.WorldOptions.ChunkSize * chunkInformation.Item1 + xSelection) * simulation.World.WorldOptions.WorldScale;
            int blockY = (simulation.World.WorldOptions.ChunkSize * chunkInformation.Item2 + ySelection) * simulation.World.WorldOptions.WorldScale;

            InventoryManager inventory = new InventoryManager();
            Item             newItem   = new Item(config.GetBlockConfiguration(tileType).ItemKey);

            inventory.Insert(newItem);

            SimulationEntity itemEntity = SimulationEntity.SimulationEntityFactory("Item");

            itemEntity.TextureKey = config.GetBlockConfiguration(tileType).TextureKey;
            itemEntity.Position   = new BfbVector(blockX, blockY);
            itemEntity.Inventory  = inventory;
            simulation.AddEntity(itemEntity);

//            simulation.AddEntity(new SimulationEntity(
//                Guid.NewGuid().ToString(),
//                new EntityOptions
//                {
//                    TextureKey = config.GetBlockConfiguration(tileType).TextureKey,
//                    Position = new BfbVector(blockX, blockY),
//                    Dimensions = new BfbVector(1 * simulation.World.WorldOptions.WorldScale,
//                        1 * simulation.World.WorldOptions.WorldScale),
//                    Rotation = 0,
//                    Origin = new BfbVector(0, 0),
//                    EntityType = EntityType.Item
//                }, new List<EntityComponent>
//                {
//                    new LifetimeComponent(2000),
//                    new TilePhysics()
//                })
//            {
//                CollideFilter = "item",
//                CollideWithFilters = new List<string>{ "tile" },
//                Inventory = inventory
//            });
        }
コード例 #7
0
        public static SimulationEntity SimulationEntityFactory(string entityKey, ClientSocket socket = null)
        {
            Random rand = new Random();

            ConfigurationRegistry registry = ConfigurationRegistry.GetInstance();
            EntityConfiguration   config   = registry.GetEntityConfiguration(entityKey);

            config.EntityKey = entityKey;

            //create new entity
            SimulationEntity newEntity = new SimulationEntity(socket?.ClientId ?? Guid.NewGuid().ToString(),
                                                              new EntityOptions
            {
                TextureKey = config.TextureKey,
                Dimensions = config.DimensionRange == null  ? config.Dimensions  : new BfbVector(
                    rand.Next((int)config.DimensionRange.X, (int)config.DimensionRange.Y),
                    rand.Next((int)config.DimensionRange.X, (int)config.DimensionRange.Y)),
                Origin     = config.Origin,
                EntityType = config.EntityType
            }, socket)
            {
                CollideFilter      = config.CollideFilter,
                CollideWithFilters = config.CollideWithFilters,
                Meta = new EntityMeta
                {
                    Health    = config.Health,
                    Mana      = config.Mana,
                    MaxHealth = config.Health,
                    MaxMana   = config.Mana
                },
                EntityConfiguration = config
            };

            //Required components
            newEntity.EntityComponents.Add(new EntityFacing());

            //Add a lifetime component if needed
            if (config.Lifetime > 0)
            {
                newEntity.EntityComponents.Add(new LifetimeComponent(config.Lifetime));
            }

            //Add components
            foreach (string configComponent in config.Components)
            {
                newEntity.EntityComponents.Add(registry.GetEntityComponent(configComponent));
            }

            if (newEntity.EntityType == EntityType.Mob || newEntity.EntityType == EntityType.Player)
            {
                newEntity.EntityComponents.Add(new ManaRegen());
            }


            if (socket == null)//We can assume if a socket is supplied then its a player
            {
                return(newEntity);
            }

            newEntity.EntityType = EntityType.Player;
            newEntity.EntityComponents.Add(new InputRemote());
            newEntity.EntityComponents.Add(new InventoryComponent());
            newEntity.EntityComponents.Add(new InventoryConnection());
            newEntity.EntityComponents.Add(new AnimatedHolding());

            return(newEntity);
        }