コード例 #1
0
ファイル: BlockStoneButton.cs プロジェクト: seaboy1234/c-raft
        public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            StructBlock  block  = (StructBlock)iBlock;
            LivingEntity living = (entity as LivingEntity);

            if (living == null)
            {
                return;
            }

            switch (face)
            {
            case BlockFace.Down:
            case BlockFace.Up:
                return;

            case BlockFace.West: block.MetaData = (byte)MetaData.Button.WestWall;
                break;

            case BlockFace.East: block.MetaData = (byte)MetaData.Button.EastWall;
                break;

            case BlockFace.North: block.MetaData = (byte)MetaData.Button.NorthWall;
                break;

            case BlockFace.South: block.MetaData = (byte)MetaData.Button.SouthWall;
                break;
            }

            base.Place(entity, block, targetIBlock, face);
        }
コード例 #2
0
        public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            var block  = (StructBlock)iBlock;
            var living = (entity as LivingEntity);

            if (living == null)
            {
                return;
            }

            switch (face)
            {
            case BlockFace.Down: return;

            case BlockFace.Up: block.MetaData = (byte)MetaData.Torch.Standing;
                break;

            case BlockFace.West: block.MetaData = (byte)MetaData.Torch.West;
                break;

            case BlockFace.East: block.MetaData = (byte)MetaData.Torch.East;
                break;

            case BlockFace.North: block.MetaData = (byte)MetaData.Torch.North;
                break;

            case BlockFace.South: block.MetaData = (byte)MetaData.Torch.South;
                break;
            }

            base.Place(entity, block, targetIBlock, face);
        }
コード例 #3
0
ファイル: ItemInventory.cs プロジェクト: TheaP/c-raft
 public void DestroyBlock(IStructBlock blockHit)
 {
     var player = Owner.GetPlayer() as Player;
     BlockHelper.Instance.CreateBlockInstance(blockHit.Type).Destroy(player, blockHit);
     if (player != null && player.GameMode == GameMode.Normal)
         DamageItem(blockHit);
 }
コード例 #4
0
ファイル: BlockWoodenStairs.cs プロジェクト: TheaP/c-raft
        public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            var block = (StructBlock)iBlock;
            var living = entity as LivingEntity;
            if (living == null)
                return;

            // TODO: Bugged - should depend on the player's Yaw/Pitch
            switch (living.FacingDirection(4))
            {
                case "N":
                    block.MetaData = (byte)MetaData.Stairs.South;
                    break;
                case "E":
                    block.MetaData = (byte)MetaData.Stairs.West;
                    break;
                case "S":
                    block.MetaData = (byte)MetaData.Stairs.North;
                    break;
                case "W":
                    block.MetaData = (byte)MetaData.Stairs.East;
                    break;
                default:
                    return;
            }
            base.Place(entity, block, targetIBlock, face);
        }
コード例 #5
0
ファイル: BlockBase.cs プロジェクト: withlin/c-raft
        /// <summary>
        /// Destroy the block
        /// </summary>
        /// <param name="entity">entity who destroyed the block</param>
        /// <param name="block">block that has been destroyed</param>
        public virtual void Destroy(IEntityBase entity, IStructBlock iBlock)
        {
            StructBlock           block     = (StructBlock)iBlock;
            BlockDestroyEventArgs eventArgs = RaiseDestroyEvent(entity, block);

            if (eventArgs.EventCanceled)
            {
                return;
            }

            PlaySoundOnDestroy(entity, block);

            UpdateWorld(block, true);

            // Check if the entity is a player
            if ((entity != null) && (entity is Player))
            {
                // Check if the player is not in creative mode
                // Don't drop any items if the player is in creative mode
                if (((Player)entity).GameMode == GameMode.Normal)
                {
                    DropItems(entity as EntityBase, block);
                }
            }

            NotifyNearbyBlocks((EntityBase)entity, block);
        }
コード例 #6
0
ファイル: BlockBaseDoor.cs プロジェクト: TheaP/c-raft
 public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
 {
     StructBlock block = (StructBlock)iBlock;
     LivingEntity living = entity as LivingEntity;
     if (living == null)
         return;
     switch (living.FacingDirection(4))
     {
         case "N":
             block.MetaData = (byte)MetaData.Door.Northwest;
             break;
         case "W":
             block.MetaData = (byte)MetaData.Door.Southwest;
             break;
         case "S":
             block.MetaData = (byte)MetaData.Door.Southeast;
             break;
         case "E":
             block.MetaData = (byte)MetaData.Door.Northeast;
             break;
         default:
             return;
     }
     base.Place(entity, block, targetIBlock, face);
 }
コード例 #7
0
ファイル: BlockBaseDoor.cs プロジェクト: withlin/c-raft
        public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            StructBlock  block  = (StructBlock)iBlock;
            LivingEntity living = entity as LivingEntity;

            if (living == null)
            {
                return;
            }
            switch (living.FacingDirection(4))
            {
            case "N":
                block.MetaData = (byte)MetaData.Door.Northwest;
                break;

            case "W":
                block.MetaData = (byte)MetaData.Door.Southwest;
                break;

            case "S":
                block.MetaData = (byte)MetaData.Door.Southeast;
                break;

            case "E":
                block.MetaData = (byte)MetaData.Door.Northeast;
                break;

            default:
                return;
            }
            base.Place(entity, block, targetIBlock, face);
        }
コード例 #8
0
        public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            StructBlock block = (StructBlock)iBlock;

            switch (face)
            {
            case BlockFace.East:
                block.MetaData = (byte)MetaData.Ladders.East;
                break;

            case BlockFace.West:
                block.MetaData = (byte)MetaData.Ladders.West;
                break;

            case BlockFace.North:
                block.MetaData = (byte)MetaData.Ladders.North;
                break;

            case BlockFace.South:
                block.MetaData = (byte)MetaData.Ladders.South;
                break;

            default:
                return;
            }
            base.Place(entity, block, targetIBlock, face);
        }
コード例 #9
0
        /// <summary>
        /// Destroy the block
        /// </summary>
        /// <param name="entity">entity who destroyed the block</param>
        /// <param name="block">block that has been destroyed</param>
        public virtual void Destroy(IEntityBase entity, IStructBlock iBlock)
        {
            StructBlock block = (StructBlock)iBlock;
            BlockDestroyEventArgs eventArgs = RaiseDestroyEvent(entity, block);
            if (eventArgs.EventCanceled)
                return;
            
            PlaySoundOnDestroy(entity, block);

            UpdateWorld(block, true);

            // Check if the entity is a player
            if ((entity != null) && (entity.GetType() == typeof(Player)))
            {
                // Check if the player is in creative mode
                if (((Player)entity).GameMode == System.Convert.ToByte(1))
                {
                    // Don't drop any items as the player is in creative mode
                    goto skipDrop;
                }
            }

            DropItems(entity as EntityBase, block);

            skipDrop:
            DamageItem(entity);

            NotifyNearbyBlocks((EntityBase)entity, block);
        }
コード例 #10
0
        public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            var block  = (StructBlock)iBlock;
            var living = entity as LivingEntity;

            if (living == null)
            {
                return;
            }

            // TODO: Bugged - should depend on the player's Yaw/Pitch
            switch (living.FacingDirection(4))
            {
            case "N":
                block.MetaData = (byte)MetaData.Stairs.South;
                break;

            case "E":
                block.MetaData = (byte)MetaData.Stairs.West;
                break;

            case "S":
                block.MetaData = (byte)MetaData.Stairs.North;
                break;

            case "W":
                block.MetaData = (byte)MetaData.Stairs.East;
                break;

            default:
                return;
            }
            base.Place(entity, block, targetIBlock, face);
        }
コード例 #11
0
ファイル: BlockLever.cs プロジェクト: seaboy1234/c-raft
        public override void Place(IEntityBase iEntity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            StructBlock block  = (StructBlock)iBlock;
            EntityBase  entity = iEntity as EntityBase;

            if (entity == null)
            {
                return;
            }

            switch (face)
            {
            case BlockFace.North:
                block.MetaData = (byte)MetaData.Lever.NorthWall;
                break;

            case BlockFace.West:
                block.MetaData = (byte)MetaData.Lever.WestWall;
                break;

            case BlockFace.East:
                block.MetaData = (byte)MetaData.Lever.EastWall;
                break;

            case BlockFace.South:
                block.MetaData = (byte)MetaData.Lever.SouthWall;
                break;

            case BlockFace.Up:
                // Works weird. Even in the original game
                if (targetIBlock.Coords.WorldZ > entity.Position.Z)
                {
                    block.MetaData = (byte)MetaData.Lever.EWGround;
                }
                else if (targetIBlock.Coords.WorldZ < entity.Position.Z)
                {
                    block.MetaData = (byte)MetaData.Lever.EWGround;
                }
                else if (targetIBlock.Coords.WorldX > entity.Position.X)
                {
                    block.MetaData = (byte)MetaData.Lever.NSGround;
                }
                else if (targetIBlock.Coords.WorldX < entity.Position.X)
                {
                    block.MetaData = (byte)MetaData.Lever.NSGround;
                }
                else
                {
                    block.MetaData = (byte)MetaData.Lever.NSGround;
                }
                break;

            default:
                return;
            }

            base.Place(entity, block, targetIBlock, face);
        }
コード例 #12
0
ファイル: BlockWater.cs プロジェクト: Nirad/c-raft
 public override void Touch(IEntityBase entity, IStructBlock iBlock, BlockFace face)
 {
     LivingEntity living = entity as LivingEntity;
     if (living != null)
     {
         living.StopFireBurnTimer();
     }
     base.Touch(entity, iBlock, face);
 }
コード例 #13
0
ファイル: BlockStillLava.cs プロジェクト: TheaP/c-raft
 public override void Touch(IEntityBase entity, IStructBlock iBlock, BlockFace face)
 {
     var living = entity as LivingEntity;
     if (living != null)
     {
         living.TouchedLava();
     }
     base.Touch(entity, iBlock, face);
 }
コード例 #14
0
ファイル: ItemBaseHoe.cs プロジェクト: TheaP/c-raft
 public override void Use(IStructBlock baseBlock, BlockFace face)
 {
     if (baseBlock.Type == (byte)BlockData.Blocks.Dirt || baseBlock.Type == (byte)BlockData.Blocks.Grass)
     {
         var soilBlock = (StructBlock)baseBlock;
         soilBlock.Type = (byte)BlockData.Blocks.Soil;
         // Think the client has a Notch bug where hoe's durability is not updated properly.
         BlockHelper.Instance.CreateBlockInstance(soilBlock.Type).Spawn(soilBlock);
     }
 }
コード例 #15
0
ファイル: ItemInventory.cs プロジェクト: withlin/c-raft
        public void DestroyBlock(IStructBlock blockHit)
        {
            var player = Owner.GetPlayer() as Player;

            BlockHelper.Instance.CreateBlockInstance(blockHit.Type).Destroy(player, blockHit);
            if (player != null && player.GameMode == GameMode.Normal)
            {
                DamageItem(blockHit);
            }
        }
コード例 #16
0
ファイル: BlockStillWater.cs プロジェクト: withlin/c-raft
        public override void Touch(IEntityBase entity, IStructBlock iBlock, BlockFace face)
        {
            var living = entity as LivingEntity;

            if (living != null)
            {
                living.StopFireBurnTimer();
            }
            base.Touch(entity, iBlock, face);
        }
コード例 #17
0
 public override void Use(IStructBlock baseBlock, BlockFace face)
 {
     if (baseBlock.Type == (byte)BlockData.Blocks.Dirt || baseBlock.Type == (byte)BlockData.Blocks.Grass)
     {
         var soilBlock = (StructBlock)baseBlock;
         soilBlock.Type = (byte)BlockData.Blocks.Soil;
         // Think the client has a Notch bug where hoe's durability is not updated properly.
         BlockHelper.Instance.CreateBlockInstance(soilBlock.Type).Spawn(soilBlock);
     }
 }
コード例 #18
0
        public override void Touch(IEntityBase entity, IStructBlock iBlock, BlockFace face)
        {
            LivingEntity living = entity as LivingEntity;

            if (living != null)
            {
                living.TouchedLava();
            }
            base.Touch(entity, iBlock, face);
        }
コード例 #19
0
ファイル: BlockBaseContainer.cs プロジェクト: TheaP/c-raft
 public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
 {
     StructBlock block = (StructBlock) iBlock;
     StructBlock targetBlock = (StructBlock) targetIBlock;
     LivingEntity living = (entity as LivingEntity);
     if (living == null)
         return;
     block.MetaData = GetDirection(living, block, targetBlock, face);
     base.Place(entity, block, targetBlock, face);
 }
コード例 #20
0
ファイル: BlockSapling.cs プロジェクト: TheaP/c-raft
        public void Grow(IStructBlock iBlock, IChunk ichunk)
        {
            var chunk = ichunk as Chunk;

            var block = (StructBlock) iBlock;

            if (!CanGrow(block, chunk))
                return;

            var blockUp = UniversalCoords.FromWorld(block.Coords.WorldX, block.Coords.WorldY + 1, block.Coords.WorldZ);
            if (block.World.GetEffectiveLight(blockUp) < 9)
                return;

            if (block.World.Server.Rand.Next(29) != 0)
                return;

            if ((block.MetaData & 8) == 0)
            {
                chunk.SetData(block.Coords, (byte)(block.MetaData | 8));
                return;
            }

            for (int i = block.Coords.WorldY; i < block.Coords.WorldY + 4; i++)
            {
                chunk.SetBlockAndData(block.Coords.BlockX, i, block.Coords.BlockZ, (byte)BlockData.Blocks.Wood, block.MetaData);
                if(chunk.GetType(block.Coords.BlockX, i + 1, block.Coords.BlockZ) != BlockData.Blocks.Air)
                    break;
            }

            // Grow leaves
            for (int i = block.Coords.WorldY + 2; i < block.Coords.WorldY + 5; i++)
                for (int j = block.Coords.WorldX - 2; j <= block.Coords.WorldX + 2; j++)
                    for (int k = block.Coords.WorldZ - 2; k <= block.Coords.WorldZ + 2; k++)
                    {
                        var nearbyChunk = block.World.GetChunkFromWorld(i, k) as Chunk;
                        if (nearbyChunk == null || (nearbyChunk.GetType(j & 0xF, i, k & 0xF) != BlockData.Blocks.Air))
                            continue;


                        nearbyChunk.SetBlockAndData(j & 0xF, i, k & 0xF, (byte)BlockData.Blocks.Leaves,
                                                        block.MetaData);
                    }

            for (int i = block.Coords.WorldX - 1; i <= block.Coords.WorldX + 1; i++)
                for (int j = block.Coords.WorldZ - 1; j <= block.Coords.WorldZ + 1; j++)
                {
                    var nearbyChunk = block.World.GetChunkFromWorld(i, j) as Chunk;
                    if (nearbyChunk == null || nearbyChunk.GetType(i & 0xF, block.Coords.WorldY + 5, j & 0xF) != BlockData.Blocks.Air)
                        continue;


                    nearbyChunk.SetBlockAndData(i & 0xF, block.Coords.WorldY + 5, j & 0xF, (byte)BlockData.Blocks.Leaves,
                                                    block.MetaData);
                }
        }
コード例 #21
0
ファイル: BlockWorkbench.cs プロジェクト: seaboy1234/c-raft
        public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetBlock, BlockFace face)
        {
            StructBlock  block  = (StructBlock)iBlock;
            LivingEntity living = (entity as LivingEntity);

            if (living == null)
            {
                return;
            }

            switch (face) //Bugged, as the client has a mind of its own for facing
            {
            case BlockFace.East:
                block.MetaData = (byte)MetaData.Container.East;
                break;

            case BlockFace.West:
                block.MetaData = (byte)MetaData.Container.West;
                break;

            case BlockFace.North:
                block.MetaData = (byte)MetaData.Container.North;
                break;

            case BlockFace.South:
                block.MetaData = (byte)MetaData.Container.South;
                break;

            default:
                switch (living.FacingDirection(4))     // Built on floor, set by facing dir
                {
                case "N":
                    block.MetaData = (byte)MetaData.Container.North;
                    break;

                case "W":
                    block.MetaData = (byte)MetaData.Container.West;
                    break;

                case "S":
                    block.MetaData = (byte)MetaData.Container.South;
                    break;

                case "E":
                    block.MetaData = (byte)MetaData.Container.East;
                    break;

                default:
                    return;
                }
                break;
            }
            base.Place(entity, block, targetBlock, face);
        }
コード例 #22
0
ファイル: BlockWorkbench.cs プロジェクト: TheaP/c-raft
 public void Interact(IEntityBase entity, IStructBlock block)
 {
     var player = entity as Player;
     if (player == null)
         return;
     if (player.CurrentInterface != null)
         return;
     player.CurrentInterface = new WorkbenchInterface();
     player.CurrentInterface.Associate(player);
     ((WorkbenchInterface)player.CurrentInterface).Open(block.Coords);
 }
コード例 #23
0
ファイル: BlockSapling.cs プロジェクト: TheaP/c-raft
 public bool CanGrow(IStructBlock block, IChunk chunk)
 {
     if (chunk == null || block.Coords.WorldY > 120)
         return false;
     /*UniversalCoords oneUp = UniversalCoords.FromWorld(block.Coords.WorldX, block.Coords.WorldY + 1,
                                                       block.Coords.WorldZ);
     byte lightUp = block.World.GetBlockData(oneUp);
     if (lightUp < 9)
         return false;*/
     return true;
 }
コード例 #24
0
ファイル: ItemPlaceable.cs プロジェクト: TheaP/c-raft
 protected virtual bool CanBePlacedOn(IStructBlock baseBlock, BlockFace face)
 {
     switch (baseBlock.Type)
     {
         case (byte)BlockData.Blocks.Air:
         case (byte)BlockData.Blocks.Water:
         case (byte)BlockData.Blocks.Lava:
         case (byte)BlockData.Blocks.Still_Water:
         case (byte)BlockData.Blocks.Still_Lava:
             return false;
     }
     return true;
 }
コード例 #25
0
ファイル: BlockCrops.cs プロジェクト: Nirad/c-raft
 public bool CanGrow(IStructBlock block, IChunk chunk)
 {
     // Crops grow from 0x0 to 0x7
     if (chunk == null || block.MetaData == 0x07)
         return false;
     if (block.Coords.WorldY == 127)
         return false;
     /*byte blockAboveLight = block.World.GetBlockLight(block.Coords.WorldX, block.Coords.WorldY + 1,
                                                      block.Coords.WorldZ);
     if (blockAboveLight < 9)
         return false;*/
     return true;
 }
コード例 #26
0
ファイル: BlockBaseContainer.cs プロジェクト: withlin/c-raft
        public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            StructBlock  block       = (StructBlock)iBlock;
            StructBlock  targetBlock = (StructBlock)targetIBlock;
            LivingEntity living      = (entity as LivingEntity);

            if (living == null)
            {
                return;
            }
            block.MetaData = GetDirection(living, block, targetBlock, face);
            base.Place(entity, block, targetBlock, face);
        }
コード例 #27
0
ファイル: ItemPlaceable.cs プロジェクト: withlin/c-raft
 protected virtual bool CanBePlacedOn(IStructBlock baseBlock, BlockFace face)
 {
     switch (baseBlock.Type)
     {
     case (byte)BlockData.Blocks.Air:
     case (byte)BlockData.Blocks.Water:
     case (byte)BlockData.Blocks.Lava:
     case (byte)BlockData.Blocks.Still_Water:
     case (byte)BlockData.Blocks.Still_Lava:
         return(false);
     }
     return(true);
 }
コード例 #28
0
ファイル: BlockTallGrass.cs プロジェクト: keneo/c-raft
        public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            StructBlock block = (StructBlock)iBlock;
            StructBlock targetBlock = (StructBlock) targetIBlock;

            if (face == BlockFace.Down)
                return;
            byte? blockId = targetBlock.World.GetBlockId(UniversalCoords.FromWorld(block.Coords.WorldX, block.Coords.WorldY - 1, block.Coords.WorldZ));
            // We can place the tall grass only on the fertile blocks - dirt, soil, grass)
            if (blockId == null || !BlockHelper.Instance.IsFertile((byte)blockId))
                return;
            base.Place(entity, block, targetBlock, face);
        }
コード例 #29
0
ファイル: BlockDeadBush.cs プロジェクト: TheaP/c-raft
 public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
 {
     var block = (StructBlock)iBlock;
     if (face == BlockFace.Down)
         return;
     byte? blockId = targetIBlock.WorldInterface.GetBlockId(UniversalCoords.FromWorld(block.Coords.WorldX, block.Coords.WorldY - 1, block.Coords.WorldZ));
     // We can place the dead bush only on the sand
     if (blockId == null || blockId != (byte)BlockData.Blocks.Sand)
         return;
     // We can place the dead bush only on top of the sand block
     if (targetIBlock.Type != (byte)BlockData.Blocks.Sand || face != BlockFace.Up)
         return;
     base.Place(entity, block, targetIBlock, face);
 }
コード例 #30
0
ファイル: BlockBaseContainer.cs プロジェクト: withlin/c-raft
        public void Interact(IEntityBase entity, IStructBlock block)
        {
            Player player = entity as Player;

            if (player == null)
            {
                return;
            }
            if (player.CurrentInterface != null)
            {
                return;
            }
            ContainerFactory.Open(player, block.Coords);
        }
コード例 #31
0
ファイル: BlockSapling.cs プロジェクト: withlin/c-raft
        public bool CanGrow(IStructBlock block, IChunk chunk)
        {
            if (chunk == null || block.Coords.WorldY > 120)
            {
                return(false);
            }

            /*UniversalCoords oneUp = UniversalCoords.FromWorld(block.Coords.WorldX, block.Coords.WorldY + 1,
             *                                                block.Coords.WorldZ);
             * byte lightUp = block.World.GetBlockData(oneUp);
             * if (lightUp < 9)
             *  return false;*/
            return(true);
        }
コード例 #32
0
ファイル: ItemPlaceable.cs プロジェクト: TheaP/c-raft
        public virtual void Place(IStructBlock baseBlock, BlockFace face)
        {
            if (!CanBePlacedOn(baseBlock, face))
                return;

            var player = Owner.GetPlayer() as Player;
            byte bType = GetBlockToPlace(baseBlock, face);
            byte bMetaData = (byte)Durability;

            var coordsFromFace = UniversalCoords.FromFace(baseBlock.Coords, face);
            var bBlock = new StructBlock(coordsFromFace, bType, bMetaData, player.World);

            BlockHelper.Instance.CreateBlockInstance(bType).Place(player, bBlock, baseBlock, face);
            //Owner.GetPlayer().GetInventory().RemoveItem(Slot);
        }
コード例 #33
0
ファイル: BlockCrops.cs プロジェクト: Nirad/c-raft
        public void Grow(IStructBlock iBlock, IChunk chunk)
        {
            StructBlock block = (StructBlock) iBlock;

            if (!CanGrow(block, chunk))
                return;

            UniversalCoords blockUp = UniversalCoords.FromWorld(block.Coords.WorldX, block.Coords.WorldY + 1, block.Coords.WorldZ);
            if (block.World.GetEffectiveLight(blockUp) < 9)
                return;

            // TODO: Check if the blocks nearby are hydrated and grow faster
            if (block.World.Server.Rand.Next(10) == 0)
                (chunk as Chunk).SetData(block.Coords, ++block.MetaData);
        }
コード例 #34
0
        public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            var block  = (StructBlock)iBlock;
            var living = (entity as LivingEntity);

            if (living == null)
            {
                return;
            }
            switch (living.FacingDirection(8))
            {
            case "N":
                block.MetaData = (byte)MetaData.SignPost.North;
                break;

            case "NE":
                block.MetaData = (byte)MetaData.SignPost.Northeast;
                break;

            case "E":
                block.MetaData = (byte)MetaData.SignPost.East;
                break;

            case "SE":
                block.MetaData = (byte)MetaData.SignPost.Southeast;
                break;

            case "S":
                block.MetaData = (byte)MetaData.SignPost.South;
                break;

            case "SW":
                block.MetaData = (byte)MetaData.SignPost.Southwest;
                break;

            case "W":
                block.MetaData = (byte)MetaData.SignPost.West;
                break;

            case "NW":
                block.MetaData = (byte)MetaData.SignPost.Northwest;
                break;

            default:
                return;
            }
            base.Place(entity, block, targetIBlock, face);
        }
コード例 #35
0
ファイル: BlockWorkbench.cs プロジェクト: seaboy1234/c-raft
        public void Interact(IEntityBase entity, IStructBlock block)
        {
            Player player = entity as Player;

            if (player == null)
            {
                return;
            }
            if (player.CurrentInterface != null)
            {
                return;
            }
            player.CurrentInterface = new WorkbenchInterface();
            player.CurrentInterface.Associate(player);
            ((WorkbenchInterface)player.CurrentInterface).Open(block.Coords);
        }
コード例 #36
0
ファイル: ItemInkSack.cs プロジェクト: TheaP/c-raft
        public override void Use(IStructBlock baseBlock, BlockFace face)
        {
            var player = Owner.GetPlayer() as Player;
            var newBlockCoords = UniversalCoords.FromFace(baseBlock.Coords, face);

            if (Durability != 15)
                return;

            if (baseBlock.Type == (byte)BlockData.Blocks.Red_Mushroom || baseBlock.Type == (byte)BlockData.Blocks.Brown_Mushroom)
            {
                var baseMushroom = (BlockBaseMushroom)BlockHelper.Instance.CreateBlockInstance(baseBlock.Type);
                baseMushroom.Fertilize(player, (StructBlock)baseBlock);
            }

            base.Use(baseBlock, face);
        }
コード例 #37
0
ファイル: BlockCactus.cs プロジェクト: Nirad/c-raft
        public bool CanGrow(IStructBlock block, IChunk iChunk)
        {
            Chunk chunk = iChunk as Chunk;
            if (chunk == null)
                return false;

            // BlockMeta = 0x0 is a freshly planted cactus.
            // The data value is incremented at random intervals.
            // When it becomes 15, a new cactus block is created on top as long as the total height does not exceed 3.
            int maxHeight = 3;

            if (block.Coords.WorldY == 127)
                return false;

            UniversalCoords oneUp = UniversalCoords.FromWorld(block.Coords.WorldX, block.Coords.WorldY + 1, block.Coords.WorldZ);
            BlockData.Blocks blockId = chunk.GetType(oneUp);
            if (blockId != BlockData.Blocks.Air)
                return false;

            // Calculating the cactus length below this block
            int cactusHeightBelow = 0;
            for (int i = block.Coords.WorldY - 1; i >= 0; i--)
            {
                blockId = chunk.GetType(UniversalCoords.FromWorld(block.Coords.WorldX, i, block.Coords.WorldZ));
                if (blockId != BlockData.Blocks.Cactus)
                    break;
                cactusHeightBelow++;
            }

            if ((cactusHeightBelow + 1) >= maxHeight)
                return false;

            bool isAir = true;

            chunk.ForNSEW(oneUp,
                delegate(UniversalCoords uc)
                {
                    byte? nearbyBlockId = block.WorldInterface.GetBlockId(uc);
                    if (nearbyBlockId == null || nearbyBlockId != (byte)BlockData.Blocks.Air)
                        isAir = false;
                });

            if (!isAir)
                return false;

            return true;
        }
コード例 #38
0
ファイル: BlockCake.cs プロジェクト: Nirad/c-raft
        public void Interact(IEntityBase entity, IStructBlock iBlock)
        {
            StructBlock block = (StructBlock) iBlock;
            // Eat the cake. No food restoration at the moment.

            // Restore hp/food

            if (block.MetaData == (byte)MetaData.Cake.OneLeft)
            {
                // Cake is dead.
                Destroy(entity, block);
            } else
            {
                // Eat one piece
                block.World.SetBlockData(block.Coords, block.MetaData++);
            }
        }
コード例 #39
0
ファイル: ItemPlaceable.cs プロジェクト: withlin/c-raft
        public virtual void Place(IStructBlock baseBlock, BlockFace face)
        {
            if (!CanBePlacedOn(baseBlock, face))
            {
                return;
            }

            var  player    = Owner.GetPlayer() as Player;
            byte bType     = GetBlockToPlace(baseBlock, face);
            byte bMetaData = (byte)Durability;

            var coordsFromFace = UniversalCoords.FromFace(baseBlock.Coords, face);
            var bBlock         = new StructBlock(coordsFromFace, bType, bMetaData, player.World);

            BlockHelper.Instance.CreateBlockInstance(bType).Place(player, bBlock, baseBlock, face);
            //Owner.GetPlayer().GetInventory().RemoveItem(Slot);
        }
コード例 #40
0
        public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            StructBlock block       = (StructBlock)iBlock;
            StructBlock targetBlock = (StructBlock)targetIBlock;

            if (face == BlockFace.Down)
            {
                return;
            }
            byte?blockId = targetBlock.World.GetBlockId(UniversalCoords.FromWorld(block.Coords.WorldX, block.Coords.WorldY - 1, block.Coords.WorldZ));

            // We can place the tall grass only on the fertile blocks - dirt, soil, grass)
            if (blockId == null || !BlockHelper.Instance.IsFertile((byte)blockId))
            {
                return;
            }
            base.Place(entity, block, targetBlock, face);
        }
コード例 #41
0
        public override void Use(IStructBlock baseBlock, BlockFace face)
        {
            var player         = Owner.GetPlayer() as Player;
            var newBlockCoords = UniversalCoords.FromFace(baseBlock.Coords, face);

            if (Durability != 15)
            {
                return;
            }

            if (baseBlock.Type == (byte)BlockData.Blocks.Red_Mushroom || baseBlock.Type == (byte)BlockData.Blocks.Brown_Mushroom)
            {
                var baseMushroom = (BlockBaseMushroom)BlockHelper.Instance.CreateBlockInstance(baseBlock.Type);
                baseMushroom.Fertilize(player, (StructBlock)baseBlock);
            }

            base.Use(baseBlock, face);
        }
コード例 #42
0
        public bool CanGrow(IStructBlock block, IChunk chunk)
        {
            // Crops grow from 0x0 to 0x7
            if (chunk == null || block.MetaData == 0x07)
            {
                return(false);
            }
            if (block.Coords.WorldY == 127)
            {
                return(false);
            }

            /*byte blockAboveLight = block.World.GetBlockLight(block.Coords.WorldX, block.Coords.WorldY + 1,
             *                                               block.Coords.WorldZ);
             * if (blockAboveLight < 9)
             *  return false;*/
            return(true);
        }
コード例 #43
0
        public override void Touch(IEntityBase ientity, IStructBlock iBlock, BlockFace face)
        {
            EntityBase entity = (EntityBase)ientity;

            if (!entity.Server.GetEntities().Contains(entity))
            {
                return;
            }
            if (entity is ItemEntity)
            {
                entity.Server.RemoveEntity(entity);
            }
            else if (entity is LivingEntity)
            {
                LivingEntity living = entity as LivingEntity;
                living.TouchedCactus();
            }
        }
コード例 #44
0
ファイル: BlockWorkbench.cs プロジェクト: TheaP/c-raft
        public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetBlock, BlockFace face)
        {
            var block = (StructBlock) iBlock;
            var living = (entity as LivingEntity);
            if (living == null)
                return;

            switch (face) //Bugged, as the client has a mind of its own for facing
            {
                case BlockFace.East:
                    block.MetaData = (byte)MetaData.Container.East;
                    break;
                case BlockFace.West:
                    block.MetaData = (byte)MetaData.Container.West;
                    break;
                case BlockFace.North:
                    block.MetaData = (byte)MetaData.Container.North;
                    break;
                case BlockFace.South:
                    block.MetaData = (byte)MetaData.Container.South;
                    break;
                default:
                    switch (living.FacingDirection(4)) // Built on floor, set by facing dir
                    {
                        case "N":
                            block.MetaData = (byte)MetaData.Container.North;
                            break;
                        case "W":
                            block.MetaData = (byte)MetaData.Container.West;
                            break;
                        case "S":
                            block.MetaData = (byte)MetaData.Container.South;
                            break;
                        case "E":
                            block.MetaData = (byte)MetaData.Container.East;
                            break;
                        default:
                            return;

                    }
                    break;
            }
            base.Place(entity, block, targetBlock, face);
        }
コード例 #45
0
        public void Interact(IEntityBase entity, IStructBlock iBlock)
        {
            StructBlock block = (StructBlock)iBlock;

            // Eat the cake. No food restoration at the moment.

            // Restore hp/food

            if (block.MetaData == (byte)MetaData.Cake.OneLeft)
            {
                // Cake is dead.
                Destroy(entity, block);
            }
            else
            {
                // Eat one piece
                block.World.SetBlockData(block.Coords, block.MetaData++);
            }
        }
コード例 #46
0
        /// <summary>
        /// Places the block
        /// </summary>
        /// <param name="entity">entity who placed the block</param>
        /// <param name="block">block that is being placed</param>
        /// <param name="targetBlock">block that is being targeted (aimed)</param>
        /// <param name="face">side of the target block</param>
        public virtual void Place(IEntityBase ientity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            StructBlock block = (StructBlock) iBlock;
            StructBlock targetBlock = (StructBlock) targetIBlock;
            EntityBase entity = (EntityBase) ientity;
            if (!CanBePlacedOn(entity, block, targetBlock, face) || !RaisePlaceEvent(entity, block))
            {
                // Revert the change since the client has already graphically placed the block
                if(entity is Player)
                {
                    Player player = entity as Player;
                    player.Server.SendPacketToNearbyPlayers(player.World, player.Position, new BlockChangePacket{Data = targetBlock.MetaData, Type = targetBlock.Type, X = targetBlock.Coords.WorldX, Y = (sbyte)targetBlock.Coords.WorldY, Z = targetBlock.Coords.WorldZ});
                }
                return;
            }

            UpdateWorld(block);
            RemoveItem(entity);
            NotifyNearbyBlocks(entity, block, false);
        }
コード例 #47
0
ファイル: BlockLever.cs プロジェクト: TheaP/c-raft
        public override void Place(IEntityBase iEntity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            var block = (StructBlock)iBlock;
            var entity = iEntity as EntityBase;

            if (entity == null)
                return;

            switch (face)
            {
                case BlockFace.North:
                    block.MetaData = (byte) MetaData.Lever.NorthWall;
                    break;
                case BlockFace.West:
                    block.MetaData = (byte) MetaData.Lever.WestWall;
                    break;
                case BlockFace.East:
                    block.MetaData = (byte) MetaData.Lever.EastWall;
                    break;
                case BlockFace.South:
                    block.MetaData = (byte) MetaData.Lever.SouthWall;
                    break;
                case BlockFace.Up:
                    // Works weird. Even in the original game
                    if (targetIBlock.Coords.WorldZ > entity.Position.Z)
                        block.MetaData = (byte)MetaData.Lever.EWGround;
                    else if (targetIBlock.Coords.WorldZ < entity.Position.Z)
                        block.MetaData = (byte)MetaData.Lever.EWGround;
                    else if (targetIBlock.Coords.WorldX > entity.Position.X)
                        block.MetaData = (byte)MetaData.Lever.NSGround;
                    else if (targetIBlock.Coords.WorldX < entity.Position.X)
                        block.MetaData = (byte) MetaData.Lever.NSGround;
                    else
                        block.MetaData = (byte)MetaData.Lever.NSGround;
                    break;
                default:
                    return;
            }

            base.Place(entity, block, targetIBlock, face);
        }
コード例 #48
0
ファイル: BlockSignBase.cs プロジェクト: Nirad/c-raft
        public override void Destroy(IEntityBase iEntity, IStructBlock iBlock)
        {
            EntityBase entity = iEntity as EntityBase;
            StructBlock block = (StructBlock)iBlock;

            string folderPath = Path.Combine(entity.World.SignsFolder, "x" + block.Coords.ChunkX + "_z" + block.Coords.ChunkZ);

            if (Directory.Exists(folderPath))
            {
                string unused;
                File.Delete(String.Format("{0}{1}sign_{2}_{3}_{4}.txt", folderPath, Path.DirectorySeparatorChar, block.Coords.BlockX,
                                          block.Coords.BlockY, block.Coords.BlockZ));

                Chunk chunk = GetBlockChunk(block);
                if(chunk == null)
                    return;

                chunk.SignsText.TryRemove(block.Coords.BlockPackedCoords, out unused);
            }
            base.Destroy(entity, block);
        }
コード例 #49
0
ファイル: BlockDeadBush.cs プロジェクト: seaboy1234/c-raft
        public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            StructBlock block = (StructBlock)iBlock;

            if (face == BlockFace.Down)
            {
                return;
            }
            byte?blockId = targetIBlock.WorldInterface.GetBlockId(UniversalCoords.FromWorld(block.Coords.WorldX, block.Coords.WorldY - 1, block.Coords.WorldZ));

            // We can place the dead bush only on the sand
            if (blockId == null || blockId != (byte)BlockData.Blocks.Sand)
            {
                return;
            }
            // We can place the dead bush only on top of the sand block
            if (targetIBlock.Type != (byte)BlockData.Blocks.Sand || face != BlockFace.Up)
            {
                return;
            }
            base.Place(entity, block, targetIBlock, face);
        }
コード例 #50
0
ファイル: BlockLadder.cs プロジェクト: TheaP/c-raft
 public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
 {
     var block = (StructBlock)iBlock;
     switch (face)
     {
         case BlockFace.East:
             block.MetaData = (byte)MetaData.Ladders.East;
             break;
         case BlockFace.West:
             block.MetaData = (byte)MetaData.Ladders.West;
             break;
         case BlockFace.North:
             block.MetaData = (byte)MetaData.Ladders.North;
             break;
         case BlockFace.South:
             block.MetaData = (byte)MetaData.Ladders.South;
             break;
         default:
             return;
     }
     base.Place(entity, block, targetIBlock, face);
 }
コード例 #51
0
        public void Grow(IStructBlock iBlock, IChunk chunk)
        {
            StructBlock block = (StructBlock)iBlock;

            if (!CanGrow(block, chunk))
            {
                return;
            }

            UniversalCoords blockUp = UniversalCoords.FromWorld(block.Coords.WorldX, block.Coords.WorldY + 1, block.Coords.WorldZ);

            if (block.World.GetEffectiveLight(blockUp) < 9)
            {
                return;
            }

            // TODO: Check if the blocks nearby are hydrated and grow faster
            if (block.World.Server.Rand.Next(10) == 0)
            {
                (chunk as Chunk).SetData(block.Coords, ++block.MetaData);
            }
        }
コード例 #52
0
        public void Grow(IStructBlock iBlock, IChunk ichunk)
        {
            Chunk       chunk = (Chunk)ichunk;
            StructBlock block = (StructBlock)iBlock;

            if (!CanGrow(block, ichunk))
            {
                return;
            }

            UniversalCoords oneUp = UniversalCoords.FromWorld(block.Coords.WorldX, block.Coords.WorldY + 1, block.Coords.WorldZ);

            if (block.MetaData < 0xe) // 14
            {
                chunk.SetData(block.Coords, ++block.MetaData, false);
                return;
            }

            chunk.SetData(block.Coords, 0);
            StructBlock newCactus = new StructBlock(oneUp, (byte)Type, 0, block.World);

            Spawn(newCactus);
        }
コード例 #53
0
ファイル: BlockTorch.cs プロジェクト: TheaP/c-raft
        public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            var block = (StructBlock)iBlock;
            var living = (entity as LivingEntity);
            if (living == null)
                return;

            switch (face)
            {
                case BlockFace.Down: return;
                case BlockFace.Up: block.MetaData = (byte)MetaData.Torch.Standing;
                    break;
                case BlockFace.West: block.MetaData = (byte)MetaData.Torch.West;
                    break;
                case BlockFace.East: block.MetaData = (byte)MetaData.Torch.East;
                    break;
                case BlockFace.North: block.MetaData = (byte)MetaData.Torch.North;
                    break;
                case BlockFace.South: block.MetaData = (byte)MetaData.Torch.South;
                    break;
            }
            base.Place(entity, block, targetIBlock, face);
        }
コード例 #54
0
        public void Grow(IStructBlock iBlock, IChunk iChunk)
        {
            Chunk       chunk = iChunk as Chunk;
            StructBlock block = (StructBlock)iBlock;

            if (!CanGrow(block, iChunk))
            {
                return;
            }

            if (block.MetaData < 0xe) // 14
            {
                chunk.SetData(block.Coords, ++block.MetaData);
                return;
            }

            chunk.SetData(block.Coords, 0);
            UniversalCoords blockAbove = UniversalCoords.FromWorld(block.Coords.WorldX, block.Coords.WorldY + 1,
                                                                   block.Coords.WorldZ);
            StructBlock newReed = new StructBlock(blockAbove, (byte)Type, 0, block.World);

            BlockHelper.Instance.CreateBlockInstance((byte)Type).Spawn(newReed);
        }
コード例 #55
0
ファイル: BlockSignPost.cs プロジェクト: TheaP/c-raft
 public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
 {
     var block = (StructBlock)iBlock;
     var living = (entity as LivingEntity);
     if (living == null)
         return;
     switch (living.FacingDirection(8))
     {
         case "N":
             block.MetaData = (byte)MetaData.SignPost.North;
             break;
         case "NE":
             block.MetaData = (byte)MetaData.SignPost.Northeast;
             break;
         case "E":
             block.MetaData = (byte)MetaData.SignPost.East;
             break;
         case "SE":
             block.MetaData = (byte)MetaData.SignPost.Southeast;
             break;
         case "S":
             block.MetaData = (byte)MetaData.SignPost.South;
             break;
         case "SW":
             block.MetaData = (byte)MetaData.SignPost.Southwest;
             break;
         case "W":
             block.MetaData = (byte)MetaData.SignPost.West;
             break;
         case "NW":
             block.MetaData = (byte)MetaData.SignPost.Northwest;
             break;
         default:
             return;
     }
     base.Place(entity, block, targetIBlock, face);
 }
コード例 #56
0
ファイル: BlockStoneButton.cs プロジェクト: Nirad/c-raft
        public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            StructBlock block = (StructBlock)iBlock;
            LivingEntity living = (entity as LivingEntity);
            if (living == null)
                return;

            switch (face)
            {
                case BlockFace.Down:
                case BlockFace.Up:
                    return;
                case BlockFace.West: block.MetaData = (byte)MetaData.Button.WestWall;
                    break;
                case BlockFace.East: block.MetaData = (byte)MetaData.Button.EastWall;
                    break;
                case BlockFace.North: block.MetaData = (byte)MetaData.Button.NorthWall;
                    break;
                case BlockFace.South: block.MetaData = (byte)MetaData.Button.SouthWall;
                    break;
            }

            base.Place(entity, block, targetIBlock, face);
        }
コード例 #57
0
ファイル: BlockBase.cs プロジェクト: keneo/c-raft
 /// <summary>
 /// Called when the entity touches the block - pressure plates, proximity sensors etc
 /// </summary>
 /// <param name="entity">entity who touched the block</param>
 /// <param name="block">block that has been touched</param>
 public virtual void Touch(IEntityBase entity, IStructBlock iBlock, BlockFace face)
 {
 }
コード例 #58
0
ファイル: ItemPlaceable.cs プロジェクト: TheaP/c-raft
 protected virtual byte GetBlockToPlace(IStructBlock baseBlock, BlockFace face)
 {
     return (byte)Type;
 }
コード例 #59
0
ファイル: BlockSlab.cs プロジェクト: TheaP/c-raft
 public override void Place(IEntityBase entity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
 {
     // TODO : If (Block  Y - 1 = Stair && Block Y = Air) Then DoubleStair
     // Else if (Buildblock = Stair) Then DoubleStair
     base.Place(entity, iBlock, targetIBlock, face);
 }
コード例 #60
0
ファイル: BlockBase.cs プロジェクト: keneo/c-raft
        /// <summary>
        /// Places the block
        /// </summary>
        /// <param name="entity">entity who placed the block</param>
        /// <param name="block">block that is being placed</param>
        /// <param name="targetBlock">block that is being targeted (aimed)</param>
        /// <param name="face">side of the target block</param>
        public virtual void Place(IEntityBase ientity, IStructBlock iBlock, IStructBlock targetIBlock, BlockFace face)
        {
            StructBlock block = (StructBlock) iBlock;
            StructBlock targetBlock = (StructBlock) targetIBlock;
            EntityBase entity = (EntityBase) ientity;
            if (!CanBePlacedOn(entity, block, targetBlock, face) || !RaisePlaceEvent(entity, block))
            {
                // Revert the change since the client has already graphically placed the block
                if(entity is Player)
                {
                    Player player = entity as Player;
                    player.Server.SendPacketToNearbyPlayers(player.World, player.Position, new BlockChangePacket{Data = targetBlock.MetaData, Type = targetBlock.Type, X = targetBlock.Coords.WorldX, Y = (sbyte)targetBlock.Coords.WorldY, Z = targetBlock.Coords.WorldZ});
                }
                return;
            }

            UpdateWorld(block);
            RemoveItem(entity);
            NotifyNearbyBlocks(entity, block, false);
        }