public override bool OnBlockBrokenWith(IWorldAccessor world, IEntity byEntity, IItemSlot itemslot, BlockSelection blockSel) { ProbeGround(world, byEntity, itemslot, blockSel); if (DamagedBy != null && DamagedBy.Contains(EnumItemDamageSource.BlockBreaking)) { DamageItem(world, byEntity, itemslot); } return(true); }
public override bool OnBlockBrokenWith(IWorldAccessor world, Entity byEntity, ItemSlot itemslot, BlockSelection blockSel) { IPlayer byPlayer = null; if (byEntity is EntityPlayer) byPlayer = byEntity.World.PlayerByUid(((EntityPlayer)byEntity).PlayerUID); ITreeAttribute tempAttr = itemslot.Itemstack.TempAttributes; //tempAttr.SetInt("breakCounter", 0); string treeType; Stack<BlockPos> foundPositions = FindTree(world, blockSel.Position, out treeType); Block leavesBranchyBlock = world.GetBlock(new AssetLocation("leavesbranchy-grown-" + treeType)); Block leavesBlock = world.GetBlock(new AssetLocation("leaves-grown-" + treeType)); if (foundPositions.Count == 0) { return base.OnBlockBrokenWith(world, byEntity, itemslot, blockSel); } bool damageable = DamagedBy != null && DamagedBy.Contains(EnumItemDamageSource.BlockBreaking); float leavesMul = 1; float leavesBranchyMul = 0.8f; while (foundPositions.Count > 0) { BlockPos pos = foundPositions.Pop(); Block block = world.BlockAccessor.GetBlock(pos); bool isLog = block.Code.Path.StartsWith("beehive-inlog-" + treeType) || block.Code.Path.StartsWith("log-grown-"+treeType) || block.Code.Path.StartsWith("bamboo-grown-brown-segment") || block.Code.Path.StartsWith("bamboo-grown-green-segment"); bool isBranchy = block == leavesBranchyBlock; bool isLeaves = block == leavesBlock || block.Code.Path == "bambooleaves-grown"; world.BlockAccessor.BreakBlock(pos, byPlayer, isLeaves ? leavesMul : (isBranchy ? leavesBranchyMul : 1)); if (damageable && isLog) { DamageItem(world, byEntity, itemslot); } if (itemslot.Itemstack == null) return true; if (isLeaves && leavesMul > 0.03f) leavesMul *= 0.85f; if (isBranchy && leavesBranchyMul > 0.015f) leavesBranchyMul *= 0.6f; } //`byPlayer.Entity.GetBehavior<EntityBehaviorHunger>()?.ConsumeSaturation(GameMath.Sqrt(foundPositions.Count)); return true; }
public override bool OnBlockBrokenWith(IWorldAccessor world, Entity byEntity, ItemSlot itemslot, BlockSelection blockSel, float dropQuantityMultiplier = 1) { int toolMode = GetToolMode(itemslot, (byEntity as EntityPlayer).Player, blockSel); int radius = api.World.Config.GetString("propickNodeSearchRadius").ToInt(); int damage = 1; if (toolMode == 1 && radius > 0) { ProbeBlockNodeMode(world, byEntity, itemslot, blockSel, radius); damage = 2; } else { ProbeBlockDensityMode(world, byEntity, itemslot, blockSel); } if (DamagedBy != null && DamagedBy.Contains(EnumItemDamageSource.BlockBreaking)) { DamageItem(world, byEntity, itemslot, damage); } return(true); }
public override bool OnBlockBrokenWith(IWorldAccessor world, Entity byEntity, ItemSlot itemslot, BlockSelection blockSel, float dropQuantityMultiplier = 1) { IPlayer byPlayer = null; if (byEntity is EntityPlayer) { byPlayer = byEntity.World.PlayerByUid(((EntityPlayer)byEntity).PlayerUID); } ITreeAttribute tempAttr = itemslot.Itemstack.TempAttributes; //tempAttr.SetInt("breakCounter", 0); double windspeed = api.ModLoader.GetModSystem <WeatherSystemBase>()?.WeatherDataSlowAccess.GetWindSpeed(byEntity.SidedPos.XYZ) ?? 0; string treeType; Stack <BlockPos> foundPositions = FindTree(world, blockSel.Position, out treeType); Block leavesBranchyBlock = world.GetBlock(new AssetLocation("leavesbranchy-grown-" + treeType)); Block leavesBlock = world.GetBlock(new AssetLocation("leaves-grown-" + treeType)); if (foundPositions.Count == 0) { return(base.OnBlockBrokenWith(world, byEntity, itemslot, blockSel, dropQuantityMultiplier)); } bool damageable = DamagedBy != null && DamagedBy.Contains(EnumItemDamageSource.BlockBreaking); float leavesMul = 1; float leavesBranchyMul = 0.8f; int blocksbroken = 0; while (foundPositions.Count > 0) { BlockPos pos = foundPositions.Pop(); blocksbroken++; Block block = world.BlockAccessor.GetBlock(pos); bool isLog = block.Code.Path.StartsWith("beehive-inlog-" + treeType) || block.Code.Path.StartsWith("log-resinharvested-" + treeType) || block.Code.Path.StartsWith("log-resin-" + treeType) || block.Code.Path.StartsWith("log-grown-" + treeType) || block.Code.Path.StartsWith("bamboo-grown-brown-segment") || block.Code.Path.StartsWith("bamboo-grown-green-segment"); bool isBranchy = block == leavesBranchyBlock; bool isLeaves = block == leavesBlock || block.Code.Path == "bambooleaves-grown"; world.BlockAccessor.BreakBlock(pos, byPlayer, isLeaves ? leavesMul : (isBranchy ? leavesBranchyMul : 1)); if (world.Side == EnumAppSide.Client) { dustParticles.Color = block.GetRandomColor(world.Api as ICoreClientAPI, pos, BlockFacing.UP); dustParticles.Color |= 255 << 24; dustParticles.MinPos.Set(pos.X, pos.Y, pos.Z); if (block.BlockMaterial == EnumBlockMaterial.Leaves) { dustParticles.GravityEffect = (float)world.Rand.NextDouble() * 0.1f + 0.01f; dustParticles.ParticleModel = EnumParticleModel.Quad; dustParticles.MinVelocity.Set(-0.4f + 4 * (float)windspeed, -0.4f, -0.4f); dustParticles.AddVelocity.Set(0.8f + 4 * (float)windspeed, 1.2f, 0.8f); } else { dustParticles.GravityEffect = 0.8f; dustParticles.ParticleModel = EnumParticleModel.Cube; dustParticles.MinVelocity.Set(-0.4f + (float)windspeed, -0.4f, -0.4f); dustParticles.AddVelocity.Set(0.8f + (float)windspeed, 1.2f, 0.8f); } world.SpawnParticles(dustParticles); } if (damageable && isLog) { DamageItem(world, byEntity, itemslot); } if (itemslot.Itemstack == null) { return(true); } if (isLeaves && leavesMul > 0.03f) { leavesMul *= 0.85f; } if (isBranchy && leavesBranchyMul > 0.015f) { leavesBranchyMul *= 0.6f; } } if (blocksbroken > 35) { Vec3d pos = blockSel.Position.ToVec3d().Add(0.5, 0.5, 0.5); api.World.PlaySoundAt(new AssetLocation("sounds/effect/treefell"), pos.X, pos.Y, pos.Z, byPlayer, false, 32, GameMath.Clamp(blocksbroken / 100f, 0.25f, 1)); } return(true); }