Files
Explosion-Overhaul/src/main/java/com/vinlanx/explosionoverhaul/ServerExplosionHandler.java

51 lines
2.1 KiB
Java
Raw Normal View History

2026-05-04 12:09:37 +02:00
package com.vinlanx.explosionoverhaul;
import com.vinlanx.explosionoverhaul.api.IExplosionPower;
import com.vinlanx.explosionoverhaul.mixinhelper.ExplosionAccessor;
import java.util.HashSet;
2026-05-04 12:09:37 +02:00
import java.util.List;
import java.util.Set;
2026-05-04 12:09:37 +02:00
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.Explosion;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
2026-05-04 12:09:37 +02:00
public class ServerExplosionHandler {
public static void handleExplosion(ServerLevel level, Explosion explosion, List<BlockPos> affectedBlocks) {
2026-05-04 13:33:41 +02:00
if (!((Boolean)Config.COMMON.enableCraterDestruction.get()).booleanValue()) {
2026-05-04 12:09:37 +02:00
affectedBlocks.clear();
return;
}
float power = 4.0f;
if (explosion instanceof IExplosionPower explosionPower) {
power = Math.max(1.0f, explosionPower.getPower());
}
Vec3 center = explosion instanceof ExplosionAccessor accessor ? accessor.explosionoverhaul$getCenter() : Vec3.ZERO;
int radius = Math.max(5, Math.min(18, Math.round(power * 2.0f * ((Double)Config.COMMON.craterSizeMultiplier.get()).floatValue())));
Set<BlockPos> existing = new HashSet<>(affectedBlocks);
BlockPos origin = BlockPos.containing(center);
double radiusSq = radius * radius;
for (BlockPos pos : BlockPos.betweenClosed(origin.offset(-radius, -radius, -radius), origin.offset(radius, radius, radius))) {
double distanceSq = pos.distToCenterSqr(center);
if (distanceSq > radiusSq) {
continue;
}
BlockState state = level.getBlockState(pos);
if (state.isAir() || state.getDestroySpeed(level, pos) < 0.0f) {
continue;
}
BlockPos immutable = pos.immutable();
if (existing.add(immutable)) {
affectedBlocks.add(immutable);
}
2026-05-04 12:09:37 +02:00
}
}
2026-05-04 13:33:41 +02:00
public static void register() {
2026-05-04 12:09:37 +02:00
}
2026-05-04 13:46:36 +02:00
public record CameraShakeProfile(float intensity, int durationTicks, float pushIntensity) {
}
2026-05-04 12:09:37 +02:00
}