diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityBlackHole.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityBlackHole.java index 09d20c48b..64b6cf742 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityBlackHole.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityBlackHole.java @@ -18,6 +18,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; +import ru.dbotthepony.mc.otm.OverdriveThatMatters; import ru.dbotthepony.mc.otm.Registry; import ru.dbotthepony.mc.otm.capability.MatteryCapability; import ru.dbotthepony.mc.otm.matter.MatterRegistry; @@ -58,6 +59,10 @@ public class BlockEntityBlackHole extends BlockEntity { setChanged(); gravitation_strength = mass.divide(NORMAL_MASS, MatteryCapability.ROUND_RULES).doubleValue(); + if (gravitation_strength > 1) { + gravitation_strength = Math.min(20, Math.log(gravitation_strength)); + } + if (level != null && !level.isClientSide && !suppress_updates) level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_CLIENTS); @@ -179,7 +184,7 @@ public class BlockEntityBlackHole extends BlockEntity { tile.setDeltaMovement(living, center, distance); } - if (distance < tile.gravitation_strength * 2) { + if (distance < tile.gravitation_strength + 1) { living.hurt(Registry.DAMAGE_EVENT_HORIZON, (float) (tile.gravitation_strength / distance)); } } @@ -188,7 +193,7 @@ public class BlockEntityBlackHole extends BlockEntity { final double distance = item.position().distanceTo(center); tile.setDeltaMovement(item, center, distance); - if (distance < tile.gravitation_strength * 2) { + if (distance < tile.gravitation_strength + 1) { if (item.hurt(Registry.DAMAGE_EVENT_HORIZON, (float) (tile.gravitation_strength / distance)) && item.isRemoved()) { var mass = MatterRegistry.getMatterValue(item.getItem()); diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterDecomposer.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterDecomposer.java index 2859b5c6d..d5bd11c64 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterDecomposer.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterDecomposer.java @@ -132,11 +132,14 @@ public class BlockEntityMatterDecomposer extends BlockEntityMatteryWorker implem if (!stack.isEmpty()) { ItemStack copy = stack.copy(); copy.setCount(1); - BigDecimal matter_value = MatterRegistry.getMatterValue(copy); - if (!matter_value.equals(BigDecimal.ZERO) && matter.canReceiveAll(matter_value)) { - stack.shrink(1); - return new MachineJob(copy, matter_value.doubleValue() * 12_500d); + if (MatterRegistry.canDecompose(copy)) { + BigDecimal matter_value = MatterRegistry.getMatterValue(copy); + + if (!matter_value.equals(BigDecimal.ZERO) && matter.canReceiveAll(matter_value)) { + stack.shrink(1); + return new MachineJob(copy, matter_value.doubleValue() * 12_500d); + } } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/client/render/BlackHoleRenderer.java b/src/main/java/ru/dbotthepony/mc/otm/client/render/BlackHoleRenderer.java index a0cd9a763..562d287d9 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/client/render/BlackHoleRenderer.java +++ b/src/main/java/ru/dbotthepony/mc/otm/client/render/BlackHoleRenderer.java @@ -2,9 +2,11 @@ package ru.dbotthepony.mc.otm.client.render; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.world.phys.Vec3; import ru.dbotthepony.mc.otm.block.entity.BlockEntityBlackHole; import static org.lwjgl.opengl.GL33.*; @@ -14,6 +16,7 @@ public class BlackHoleRenderer implements BlockEntityRenderer 0) + return false; - public static BigDecimal getMatterValue(ItemStack stack) { - Item item = stack.getItem(); + if (stack.getCapability(MatteryCapability.MATTER).isPresent() && stack.getCapability(MatteryCapability.MATTER).resolve().get().getStoredMatter().compareTo(BigDecimal.ZERO) > 0) + return false; - if (item.isDamageable(stack)) { - return getMatterValue(item).multiply(BigDecimal.ONE.subtract(new BigDecimal(item.getDamage(stack)).divide(new BigDecimal(item.getMaxDamage(stack)), ROUND_RULES))); + return hasMatterValue(stack.getItem()); + } + + private static BigDecimal getMatterValue(ItemStack stack, int level) { + if (level >= 100) { + return BigDecimal.ZERO; } - return getMatterValue(item); + Item item = stack.getItem(); + var matter = getMatterValue(item); + + if (item.isDamageable(stack)) { + matter = matter.multiply(BigDecimal.ONE.subtract(new BigDecimal(item.getDamage(stack)).divide(new BigDecimal(item.getMaxDamage(stack)), ROUND_RULES))); + } + + var cap1 = stack.getCapability(MatteryCapability.DRIVE).resolve(); + var cap2 = stack.getCapability(MatteryCapability.MATTER).resolve(); + + if (cap1.isPresent()) { + for (var stored : cap1.get().getItems()) { + matter = matter.add(getMatterValue(stored.stack(), level + 1)); + } + } + + if (cap2.isPresent()) { + matter = matter.add(cap2.get().getStoredMatter()); + } + + return matter; + } + + public static BigDecimal getMatterValue(ItemStack stack) { + return getMatterValue(stack, 0); } public static void registerInitialItems() {