示例#1
0
 internal Entity GetBlockEntity(PositionBlock position)
 {
     PositionChunk positionChunk = PositionChunk.CreateFrom(position);
     Chunk chunk = GetChunk(positionChunk);
     positionChunk.ConvertToLocalPosition(ref position);
     Entity entity = chunk.GetBlockEntity(position);
     return entity;
 }
示例#2
0
        internal void RemoveMetaData(PositionBlock localPos)
        {
            int key = localPos.X * 16 * 16 + localPos.Y * 16 + localPos.Z;

            if (chunkMetaData.ContainsKey(key))
            {
                chunkMetaData.Remove(key);
            }
        }
示例#3
0
 internal Entity GetBlockEntityFromPosition(PositionBlock pos)
 {
     if (pos.Y < 0) return null;
     if (pos.Y >= Chunk.MaxSizeY) return null;
     PositionChunk positionChunk = PositionChunk.CreateFrom(pos);
     Chunk chunk = GetChunk(positionChunk);
     positionChunk.ConvertToLocalPosition(ref pos);
     return chunk.GetBlockEntityFromPosition(pos);
 }
示例#4
0
 public override bool OnUseOnBlock(PositionBlock pos)
 {
     int sourceBlockId = World.Instance.GetBlock(pos);
     if (sourceBlockId == BlockRepository.DirtWithGrass.Id || sourceBlockId == BlockRepository.Dirt.Id)
     {
         World.Instance.SetBlock(pos, BlockRepository.FarmlandDry.Id);
     }
     return true;
 }
示例#5
0
 internal int GetBlock(PositionBlock pos)
 {
     if (pos.Y < 0) return 0;
     if (pos.Y >= Chunk.MaxSizeY) return 0;
     PositionChunk positionChunk = PositionChunk.CreateFrom(pos);
     Chunk chunk = GetChunk(positionChunk);
     positionChunk.ConvertToLocalPosition(ref pos);
     int blockId = chunk.GetLocalBlock(pos.X, pos.Y, pos.Z);
     return blockId;
 }
示例#6
0
        private void RawSetBlockMetaData(PositionBlock positionBlock, string variable, object value)
        {
            int key = positionBlock.X * 16 * 16 + positionBlock.Y * 16 + positionBlock.Z;

            if (!chunkMetaData.ContainsKey(key))
            {
                chunkMetaData.Add(key, new Dictionary <string, object>());
            }
            chunkMetaData[key][variable] = value;
        }
示例#7
0
        private object RawGetBlockMetaData(PositionBlock positionBlock, string variable)
        {
            int key = positionBlock.X * 16 * 16 + positionBlock.Y * 16 + positionBlock.Z;

            if (chunkMetaData.ContainsKey(key))
            {
                return(chunkMetaData[key][variable]);
            }
            return(null);
        }
示例#8
0
        private void DestroyBlock(Vector4 pos)
        {
            PositionBlock posBlock = PositionBlock.FromVector(pos);
            Block         block    = Block.FromId(World.Instance.GetBlock(posBlock));

            block.OnDestroy(posBlock);
            World.Instance.SetBlock(posBlock, 0);
            PositionChunk posChunk = PositionChunk.CreateFrom(posBlock);
            Chunk         chunk    = World.Instance.GetChunk(posChunk);

            chunk.InvalidateMeAndNeighbors();
        }
示例#9
0
        private void UpdateBlockDestroyProgress()
        {
            Block blockToDestroy = Block.FromId(World.Instance.GetBlock(PositionBlock.FromVector(BlockAttackPosition)));
            float efficiency     = ToolMatrix.GetEfficiency(SelectedStack.Id, blockToDestroy.Id);

            DestroyProgress += (100f / (float)blockToDestroy.Density) * efficiency;
            if (SelectedStack.AsItem != null)
            {
                Item itemInHand = Item.FromId(SelectedStack.Id);
                itemInHand.OnAfterAttack();
            }
        }
示例#10
0
        private float GetWaterLevel(int dx, int dy, int dz)
        {
            PositionBlock destPos     = new PositionBlock(BlockPosition.X + dx, BlockPosition.Y + dy, BlockPosition.Z + dz);
            int           destBlockId = Parent.SafeGetLocalBlock(destPos.X, destPos.Y, destPos.Z);

            if (destBlockId != BlockRepository.Water.Id)
            {
                return(0f);
            }
            float waterLevel = (float)Parent.GetBlockMetaData(destPos, "waterlvl");

            return(waterLevel);
        }
示例#11
0
        private void UseBlockOnBlock()
        {
            Vector4       pos      = World.Instance.PlayerVoxelTrace.BuildPosition;
            PositionBlock posBlock = new PositionBlock((int)pos.X, (int)pos.Y, (int)pos.Z);

            World.Instance.SetBlock(posBlock, SelectedStack.Id);
            PositionChunk posChunk = PositionChunk.CreateFrom(posBlock);
            Chunk         chunk    = World.Instance.GetChunk(posChunk);

            chunk.InvalidateMeAndNeighbors();
            SelectedStack.Remove(1);
            NeedsRest();
        }
示例#12
0
        internal Entity GetBlockEntityFromPosition(PositionBlock pos)
        {
            int x = pos.X;
            int y = pos.Y;
            int z = pos.Z;

            if (x < 0 || x >= 16 ||
                y < 0 || y >= 16 ||
                z < 0 || z >= 16)
            {
                PositionBlock globalPosition;
                Position.GetGlobalPositionBlock(out globalPosition, x, y, z);
                return(World.Instance.GetBlockEntityFromPosition(globalPosition));
            }
            return(RawGetBlockEntityFromPosition(x, y, z));
        }
示例#13
0
        internal object GetBlockMetaData(PositionBlock pos, string variable)
        {
            int x = pos.X;
            int y = pos.Y;
            int z = pos.Z;

            if (x < 0 || x >= 16 ||
                y < 0 || y >= 16 ||
                z < 0 || z >= 16)
            {
                PositionBlock globalPosition;
                Position.GetGlobalPositionBlock(out globalPosition, x, y, z);
                return(World.Instance.GetBlockMetaData(globalPosition, variable));
            }
            return(RawGetBlockMetaData(pos, variable));
        }
示例#14
0
        internal void SetBlockMetaData(PositionBlock pos, string variable, object value)
        {
            int x = pos.X;
            int y = pos.Y;
            int z = pos.Z;

            if (x < 0 || x >= 16 ||
                y < 0 || y >= 16 ||
                z < 0 || z >= 16)
            {
                PositionBlock globalPosition;
                Position.GetGlobalPositionBlock(out globalPosition, x, y, z);
                World.Instance.SetBlockMetaData(globalPosition, variable, value);
                return;
            }
            RawSetBlockMetaData(pos, variable, value);
        }
示例#15
0
        private void UseItemOnBlock()
        {
            // used on a block!
            Vector4       pos      = World.Instance.PlayerVoxelTrace.ImpactPosition;
            PositionBlock posBlock = new PositionBlock((int)pos.X, (int)pos.Y, (int)pos.Z);
            Item          item     = Item.FromId(SelectedStack.Id);

            if (item.OnUseOnBlock(posBlock))
            {
                // here if world is changed
                PositionChunk posChunk = PositionChunk.CreateFrom(posBlock);
                Chunk         chunk    = World.Instance.GetChunk(posChunk);
                chunk.InvalidateMeAndNeighbors();
                if (item.Consumable)
                {
                    SelectedStack.Remove(1);
                }
            }
        }
示例#16
0
        private void HandleMouseRight()
        {
            // activate block?
            PositionBlock positionBlock = PositionBlock.FromVector(World.Instance.PlayerVoxelTrace.ImpactPosition);
            Block         impactBlock   = Block.FromId(World.Instance.GetBlock(positionBlock));

            if (impactBlock.OnActivate(positionBlock))
            {
                return;
            }

            // are we using a block?
            if (SelectedStack.AsBlock != null)
            {
                UseBlockInHand();
            }
            // are we using an item?
            else if (SelectedStack.AsItem != null)
            {
                UseItemInHand();
                NeedsRest();
            }
        }
示例#17
0
 internal void SetBlock(PositionBlock pos, int blockId)
 {
     PositionChunk positionChunk = PositionChunk.CreateFrom(pos);
     Chunk chunk = GetChunk(positionChunk);
     positionChunk.ConvertToLocalPosition(ref pos);
     chunk.SetLocalBlock(pos.X, pos.Y, pos.Z, blockId);
 }
示例#18
0
 private float GetWaterLevel(int dx, int dy, int dz)
 {
     PositionBlock destPos = new PositionBlock(BlockPosition.X + dx, BlockPosition.Y + dy, BlockPosition.Z + dz);
     int destBlockId = Parent.SafeGetLocalBlock(destPos.X, destPos.Y, destPos.Z);
     if (destBlockId != BlockRepository.Water.Id)
         return 0f;
     float waterLevel = (float)Parent.GetBlockMetaData(destPos, "waterlvl");
     return waterLevel;
 }
示例#19
0
 private void UseItemOnBlock()
 {
     // used on a block!
     Vector4 pos = World.Instance.PlayerVoxelTrace.ImpactPosition;
     PositionBlock posBlock = new PositionBlock((int)pos.X, (int)pos.Y, (int)pos.Z);
     Item item = Item.FromId(SelectedStack.Id);
     if (item.OnUseOnBlock(posBlock))
     {
         // here if world is changed
         PositionChunk posChunk = PositionChunk.CreateFrom(posBlock);
         Chunk chunk = World.Instance.GetChunk(posChunk);
         chunk.InvalidateMeAndNeighbors();
         if (item.Consumable)
         {
             SelectedStack.Remove(1);
         }
     }
 }
示例#20
0
 internal bool SameAs(PositionBlock otherPos)
 {
     return X == otherPos.X && Z == otherPos.Z && Y == otherPos.Y;
 }
示例#21
0
 internal bool SameAs(PositionBlock otherPos)
 {
     return(X == otherPos.X && Z == otherPos.Z && Y == otherPos.Y);
 }
示例#22
0
 private void UseBlockOnBlock()
 {
     Vector4 pos = World.Instance.PlayerVoxelTrace.BuildPosition;
     PositionBlock posBlock = new PositionBlock((int)pos.X, (int)pos.Y, (int)pos.Z);
     World.Instance.SetBlock(posBlock, SelectedStack.Id);
     PositionChunk posChunk = PositionChunk.CreateFrom(posBlock);
     Chunk chunk = World.Instance.GetChunk(posChunk);
     chunk.InvalidateMeAndNeighbors();
     SelectedStack.Remove(1);
     NeedsRest();
 }
示例#23
0
 internal void GetGlobalPositionBlock(out PositionBlock positionBlock, int x, int y, int z)
 {
     positionBlock.X = X * 16 + x;
     positionBlock.Y = Y * 16 + y;
     positionBlock.Z = Z * 16 + z;
 }
示例#24
0
        private float[] GetScaledNoise(PositionBlock pos, float scale, int offset = 0)
        {
            pos.X += offset;
            pos.Z += offset;
            float x = pos.X * scale;
            float y = pos.Y * scale;
            float z = pos.Z * scale;

            float x2 = (pos.X + 16f) * scale;
            float y2 = (pos.Y + 16f) * scale;
            float z2 = (pos.Z + 16f) * scale;
            float[] noise = new float[] {
                 Noise.Generate(x, y, z2),
                 Noise.Generate(x, y, z),
                 Noise.Generate(x2, y, z),
                 Noise.Generate(x2, y, z2),

                 Noise.Generate(x, y2, z2),
                 Noise.Generate(x, y2, z),
                 Noise.Generate(x2, y2, z),
                 Noise.Generate(x2, y2, z2),
            };
            return noise;
        }
示例#25
0
 internal Entity GetBlockEntity(PositionBlock localPos)
 {
     return(blockEntityFullUpdate.Where(e => e.BlockPosition.SameAs(localPos)).FirstOrDefault());
 }
示例#26
0
 internal Entity GetBlockEntityFromPosition(PositionBlock pos)
 {
     int x = pos.X;
     int y = pos.Y;
     int z = pos.Z;
     if (x < 0 || x >= 16 ||
        y < 0 || y >= 16 ||
        z < 0 || z >= 16)
     {
         PositionBlock globalPosition;
         Position.GetGlobalPositionBlock(out globalPosition, x, y, z);
         return World.Instance.GetBlockEntityFromPosition(globalPosition);
     }
     return RawGetBlockEntityFromPosition(x, y, z);
 }
示例#27
0
 internal Entity GetBlockEntity(PositionBlock localPos)
 {
     return blockEntityFullUpdate.Where(e => e.BlockPosition.SameAs(localPos)).FirstOrDefault();
 }
示例#28
0
 internal int GetBlock(int x, int y, int z)
 {
     PositionBlock pos = new PositionBlock(x, y, z);
     return GetBlock(pos);
 }
示例#29
0
 internal void SetBlockMetaData(PositionBlock pos, string variable, object value)
 {
     if (pos.Y < 0) return;
     if (pos.Y >= Chunk.MaxSizeY) return;
     PositionChunk positionChunk = PositionChunk.CreateFrom(pos);
     Chunk chunk = GetChunk(positionChunk);
     positionChunk.ConvertToLocalPosition(ref pos);
     chunk.SetBlockMetaData(pos, variable, value);
 }
示例#30
0
 internal bool ReplaceBlock(PositionBlock pos, int oldId, int newId)
 {
     if (GetBlock(pos) == oldId)
     {
         SetBlock(pos, newId);
         return true;
     }
     return false;
 }
示例#31
0
 internal void GetMinCornerBlock(out PositionBlock positionBlock)
 {
     positionBlock.X = X * 16;
     positionBlock.Y = Y * 16;
     positionBlock.Z = Z * 16;
 }
示例#32
0
 internal void SetBlock(int x, int y, int z, int blockId)
 {
     PositionBlock pos = new PositionBlock(x, y, z);
     SetBlock(pos, blockId);
 }
示例#33
0
 internal void ConvertToLocalPosition(ref PositionBlock positionBlock)
 {
     positionBlock.X = positionBlock.X - X * 16;
     positionBlock.Y = positionBlock.Y - Y * 16;
     positionBlock.Z = positionBlock.Z - Z * 16;
 }
示例#34
0
 internal void RemoveMetaData(PositionBlock localPos)
 {
     int key = localPos.X * 16 * 16 + localPos.Y * 16 + localPos.Z;
     if (chunkMetaData.ContainsKey(key))
         chunkMetaData.Remove(key);
 }
示例#35
0
 private void RawSetBlockMetaData(PositionBlock positionBlock, string variable, object value)
 {
     int key = positionBlock.X * 16 * 16 + positionBlock.Y * 16 + positionBlock.Z;
     if (!chunkMetaData.ContainsKey(key))
     {
         chunkMetaData.Add(key, new Dictionary<string, object>());
     }
     chunkMetaData[key][variable] = value;
 }
示例#36
0
 internal void SetBlockMetaData(PositionBlock pos, string variable, object value)
 {
     int x = pos.X;
     int y = pos.Y;
     int z = pos.Z;
     if (x < 0 || x >= 16 ||
         y < 0 || y >= 16 ||
         z < 0 || z >= 16)
     {
         PositionBlock globalPosition;
         Position.GetGlobalPositionBlock(out globalPosition, x, y, z);
         World.Instance.SetBlockMetaData(globalPosition, variable, value);
         return;
     }
     RawSetBlockMetaData(pos, variable, value);
 }
示例#37
0
 private object RawGetBlockMetaData(PositionBlock positionBlock, string variable)
 {
     int key = positionBlock.X * 16 * 16 + positionBlock.Y * 16 + positionBlock.Z;
     if (chunkMetaData.ContainsKey(key))
         return chunkMetaData[key][variable];
     return null;
 }
示例#38
0
 internal object GetBlockMetaData(PositionBlock pos, string variable)
 {
     if (pos.Y < 0) return null;
     if (pos.Y >= Chunk.MaxSizeY) return null;
     PositionChunk positionChunk = PositionChunk.CreateFrom(pos);
     Chunk chunk = GetChunk(positionChunk);
     positionChunk.ConvertToLocalPosition(ref pos);
     return chunk.GetBlockMetaData(pos, variable);
 }
示例#39
0
 internal static PositionChunk CreateFrom(PositionBlock positionBlock)
 {
     return(CreateFrom(new Vector3(positionBlock.X, positionBlock.Y, positionBlock.Z)));
 }