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); }
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); }
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); }
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); }
/// <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); }
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); }
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); }
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); }
/// <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); }
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); }
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); }
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); }
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); }
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); } }
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); } }
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); }
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); }
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); }
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); } }
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); }
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); }
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; }
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; }
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; }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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; }
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++); } }
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); }
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); }
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); }
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); }
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(); } }
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); }
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++); } }
/// <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); }
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); }
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); }
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); }
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); }
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); } }
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); }
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); }
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); }
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); }
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); }
/// <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) { }
protected virtual byte GetBlockToPlace(IStructBlock baseBlock, BlockFace face) { return (byte)Type; }
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); }