Merge branch 'MEEPofFaith-improved-reactor-explosion'

This commit is contained in:
Anuken
2026-08-31 21:08:11 -04:00
2 changed files with 78 additions and 13 deletions
+13
View File
@@ -2527,6 +2527,10 @@ public class Blocks{
ambientSoundVolume = 0.03f;
generateEffect = Fx.generatespark;
explosionShake = 1f;
explosionScorchSize = 1;
explosionFireballs = 3;
consume(new ConsumeItemFlammable());
consume(new ConsumeItemExplode());
itemDurationMultipliers.put(Items.pyratite, 3f);
@@ -2557,6 +2561,10 @@ public class Blocks{
ambientSound = Sounds.loopSmelter;
ambientSoundVolume = 0.06f;
explosionShake = 1f;
explosionScorchSize = 2;
explosionFireballs = 6;
consume(new ConsumeItemFlammable());
consume(new ConsumeItemExplode());
itemDurationMultipliers.put(Items.pyratite, 3f);
@@ -2628,6 +2636,11 @@ public class Blocks{
heating = 0.005f;
coolantPower = 0.125f;
explosionShake = 4f;
explosionScorchSize = 8;
explosionIgnitionChance = 0.5f;
explosionFireballs = 11;
consumeItem(Items.thorium);
consumeLiquid(Liquids.cryofluid, heating / coolantPower).update(false);
}};
@@ -4,17 +4,21 @@ import arc.*;
import arc.audio.*;
import arc.graphics.g2d.*;
import arc.math.*;
import arc.math.geom.*;
import arc.struct.*;
import arc.util.*;
import arc.util.io.*;
import mindustry.*;
import mindustry.content.*;
import mindustry.entities.*;
import mindustry.entities.units.*;
import mindustry.game.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.type.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.blocks.*;
import mindustry.world.draw.*;
import mindustry.world.meta.*;
@@ -38,6 +42,17 @@ public class PowerGenerator extends PowerDistributor{
public float explosionMinWarmup = 0f;
public float explosionShake = 0f, explosionShakeDuration = 6f;
public boolean explosionBreaksProps = true;
/** Size of scorch effect on the ground after explosion. Value from 1-9. < 1 to disable. */
public int explosionScorchSize = 0;
/** Chance for each tile in the explosion radius to catch on fire. */
public float explosionIgnitionChance = 0f;
/** If true, the ignition chance decreases with distance. */
public boolean explosionScaleIgnitionChance = true;
/** The speed at which ignition spreads. */
public float explosionSpeed = 0.4f;
/** Extra number of fireballs spawned from explosions. */
public int explosionFireballs = 0;
public PowerGenerator(String name){
super(name);
@@ -120,25 +135,62 @@ public class PowerGenerator extends PowerDistributor{
public void createExplosion(){
if(shouldExplode()){
if(explosionDamage > 0){
Damage.damage(x, y, explosionRadius * tilesize, explosionDamage);
}
onExplosion();
}
}
explodeEffect.at(this);
explodeSound.at(this);
public void onExplosion(){
if(explosionDamage > 0){
Damage.damage(x, y, explosionRadius * tilesize, explosionDamage);
}
if(explosionPuddleLiquid != null){
for(int i = 0; i < explosionPuddles; i++){
Tmp.v1.trns(Mathf.random(360f), Mathf.random(explosionPuddleRange));
Tile tile = world.tileWorld(x + Tmp.v1.x, y + Tmp.v1.y);
Puddles.deposit(tile, explosionPuddleLiquid, explosionPuddleAmount);
if(explosionIgnitionChance > 0 || explosionBreaksProps){
Geometry.circle(tileX(), tileY(), explosionRadius, (tx, ty) -> {
Tile t = Vars.world.tile(tx, ty);
float dst = Mathf.dst(tileX(), tileY(), tx, ty);
//Create fires
if(explosionIgnitionChance > 0 &&
Mathf.chance(explosionIgnitionChance *
(explosionScaleIgnitionChance ? 1 - Mathf.sqrt(dst / explosionRadius) : 1))
){
Time.run(dst / explosionSpeed, () -> {
Fires.create(t);
});
}
}
if(explosionShake > 0){
Effect.shake(explosionShake, explosionShakeDuration, this);
//Break boulders
if(explosionBreaksProps && t != null && t.block().unitMoveBreakable){ //Probably a good enough indicator
ConstructBlock.deconstructFinish(t, t.block(), null);
}
});
}
if(explosionFireballs > 0){
int amount = Mathf.random(1, explosionFireballs);
for(int i = 0; i < amount; i++){
Bullets.fireball.createNet(Team.derelict, x, y, Mathf.random(360f), -1f, Mathf.random(0.5f, 1f), 1);
}
}
explodeEffect.at(this);
explodeSound.at(this);
if(explosionPuddleLiquid != null){
for(int i = 0; i < explosionPuddles; i++){
Tmp.v1.trns(Mathf.random(360f), Mathf.random(explosionPuddleRange));
Tile tile = world.tileWorld(x + Tmp.v1.x, y + Tmp.v1.y);
Puddles.deposit(tile, explosionPuddleLiquid, explosionPuddleAmount);
}
}
if(explosionShake > 0){
Effect.shake(explosionShake, explosionShakeDuration, this);
}
if(explosionScorchSize > 0){
Effect.scorch(x, y, explosionScorchSize);
}
}
@Override