// Override to drop the barrel empty and drop its contents instead public override void OnBlockBroken(IWorldAccessor world, BlockPos pos, IPlayer byPlayer, float dropQuantityMultiplier = 1) { if (world.Side == EnumAppSide.Server && (byPlayer == null || byPlayer.WorldData.CurrentGameMode != EnumGameMode.Creative)) { ItemStack[] drops = new ItemStack[] { new ItemStack(this) }; for (int i = 0; i < drops.Length; i++) { world.SpawnItemEntity(drops[i], new Vec3d(pos.X + 0.5, pos.Y + 0.5, pos.Z + 0.5), null); } world.PlaySoundAt(Sounds.GetBreakSound(byPlayer), pos.X, pos.Y, pos.Z, byPlayer); } if (EntityClass != null) { BlockEntity entity = world.BlockAccessor.GetBlockEntity(pos); if (entity != null) { entity.OnBlockBroken(); } } world.BlockAccessor.SetBlock(0, pos); }
public override void OnBlockExploded(IWorldAccessor world, BlockPos pos, BlockPos explosionCenter, EnumBlastType blastType) { EnumHandling handled = EnumHandling.PassThrough; foreach (BlockBehavior behavior in BlockBehaviors) { behavior.OnBlockExploded(world, pos, explosionCenter, blastType, ref handled); if (handled == EnumHandling.PreventSubsequent) { break; } } if (handled == EnumHandling.PreventDefault) { return; } double dropChancce = ExplosionDropChance(world, pos, blastType); if (world.Rand.NextDouble() < dropChancce) { ItemStack[] drops = GetDrops(world, pos, null); if (drops == null) { return; } for (int i = 0; i < drops.Length; i++) { if (SplitDropStacks) { for (int k = 0; k < drops[i].StackSize; k++) { ItemStack stack = drops[i].Clone(); if (stack.Collectible.Code.Path.Contains("crystal")) { continue; // Do not drop crystalized ores when the ore is being blown up } stack.StackSize = 1; world.SpawnItemEntity(stack, new Vec3d(pos.X + 0.5, pos.Y + 0.5, pos.Z + 0.5), null); } } } } if (EntityClass != null) { BlockEntity entity = world.BlockAccessor.GetBlockEntity(pos); if (entity != null) { entity.OnBlockBroken(); } } }
public override void OnBlockBroken(IWorldAccessor world, BlockPos pos, IPlayer byPlayer, float dropQuantityMultiplier = 1) { bool preventDefault = false; foreach (BlockBehavior behavior in BlockBehaviors) { EnumHandling handled = EnumHandling.PassThrough; behavior.OnBlockBroken(world, pos, byPlayer, ref handled); if (handled == EnumHandling.PreventDefault) { preventDefault = true; } if (handled == EnumHandling.PreventSubsequent) { return; } } if (preventDefault) { return; } if (world.Side == EnumAppSide.Server && (byPlayer == null || byPlayer.WorldData.CurrentGameMode != EnumGameMode.Creative)) { ItemStack[] drops = new ItemStack[] { OnPickBlock(world, pos) }; if (this.Attributes["drop"]?[GetType(world.BlockAccessor, pos)]?.AsBool() == true && drops != null) { for (int i = 0; i < drops.Length; i++) { world.SpawnItemEntity(drops[i], new Vec3d(pos.X + 0.5, pos.Y + 0.5, pos.Z + 0.5), null); } } world.PlaySoundAt(Sounds.GetBreakSound(byPlayer), pos.X, pos.Y, pos.Z, byPlayer); } if (EntityClass != null) { BlockEntity entity = world.BlockAccessor.GetBlockEntity(pos); if (entity != null) { entity.OnBlockBroken(); } } world.BlockAccessor.SetBlock(0, pos); }