From 3cc44a8599ad7469ee418b303a0d8c10b91300f4 Mon Sep 17 00:00:00 2001 From: Sh1p*nfire Date: Wed, 15 Apr 2026 23:26:07 +1000 Subject: [PATCH] Core external incinerator, misc fixes -Core: Raft now overflows items into nearby Aspect Incinerators -Bruisekit fuel consumption actually properly fixed this time -phasing out WorldUtil#relativeTo for Tile#relativeTo -how many times have I tried fixing AspectPipe by now god -Elemental blaster mines reso and clay mallows half as quick -"Fixed" carbonic barrier health (existing maps havn't been fixed yet) -Fixed RecipeCrafter processing invalid recipies -Pipelines should have pipeline overpasses as their bridge properly -Bulbhead can't boost over buildings anymore --- assets/bundles/bundle.properties | 6 +- .../effect/aspect-incinerator-liquid.png | Bin 0 -> 117 bytes .../blocks/effect/aspect-incinerator-top.png | Bin 0 -> 764 bytes .../blocks/effect/aspect-incinerator.png | Bin 0 -> 226 bytes mod.hjson | 2 +- src/meld/Meld.java | 1 + src/meld/content/MeldBlocks.java | 47 +++++++++-- src/meld/entities/unit/BulbheadEntity.java | 6 +- .../unit/abilities/BezerkAbility.java | 1 - src/meld/world/WorldUtil.java | 6 ++ src/meld/world/blocks/Bruisekit.java | 4 +- src/meld/world/blocks/CoreRaft.java | 77 +++++++++++++++++- src/meld/world/blocks/FieldPulsar.java | 1 - src/meld/world/blocks/LiquidUtil.java | 2 +- src/meld/world/blocks/SonarSpire.java | 4 +- .../blocks/crafting/StorageIncinerator.java | 65 +++++++++++++++ src/meld/world/blocks/fluid/AspectPipe.java | 3 +- .../world/blocks/fluid/ChannelDirector.java | 3 +- .../blocks/fluid/FlexibleSizeJunction.java | 3 +- .../world/blocks/fluid/VisualAspectPipe.java | 1 + src/meld/world/blocks/producer/Produce.java | 4 + 21 files changed, 209 insertions(+), 27 deletions(-) create mode 100644 assets/sprites/blocks/effect/aspect-incinerator-liquid.png create mode 100644 assets/sprites/blocks/effect/aspect-incinerator-top.png create mode 100644 assets/sprites/blocks/effect/aspect-incinerator.png create mode 100644 src/meld/world/blocks/crafting/StorageIncinerator.java create mode 100644 src/meld/world/blocks/producer/Produce.java diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 65671d6..70a7b99 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -304,12 +304,16 @@ block.meld-pad-phi.name = Pad: Phi block.meld-pad-phi.description = Outpost of the base. Only one can be active at a time.\n[red]Cannot support a base alone.[] block.meld-pad-phi.details = Golden ratio? What's that? +block.meld-aspect-incinerator.name = Aspect Incinerator +block.meld-aspect-incinerator.description = Incinerates items when fed [meld-aspect]Aspect[].\n\nBuffers items otherwise. +block.meld-aspect-incinerator.details = Shoulda been named output terminal or smthing + block.meld-core-raft-dormant.name = Core: Raft[lightgray](Dormant)[] block.meld-core-raft-dormant.description = Core of the base. Allows units to pass through freely. [accent]Activates when inside a powered facility.[] block.meld-core-raft-dormant.details = Cheap bunker with intra-sector item transport and radar built in. block.meld-core-raft.name = Core: Raft -block.meld-core-raft.description = Core of the base. Allows units to pass through freely. Once all are destroyed, the sector is lost. +block.meld-core-raft.description = Core of the base. Allows units to pass through freely. Once all are destroyed, the sector is lost.\n\n[accent]Requires an adjacent incinerator to void excess items.[] block.meld-core-raft.details = A great logistics hub. Equipped with single-use launch thrusters. block.meld-core-bunker.name = Core: Bunker diff --git a/assets/sprites/blocks/effect/aspect-incinerator-liquid.png b/assets/sprites/blocks/effect/aspect-incinerator-liquid.png new file mode 100644 index 0000000000000000000000000000000000000000..7e085ef1f6fc5248a63b609d826d7918b0b334ff GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}`kpS1ArY-_ z&lxf@FmN2+&{%)onaw|I!OU%ElYd*X163dak4enF9V|BM&ZsnjL_J;oT-G@yGywo9 C#vL30 literal 0 HcmV?d00001 diff --git a/assets/sprites/blocks/effect/aspect-incinerator-top.png b/assets/sprites/blocks/effect/aspect-incinerator-top.png new file mode 100644 index 0000000000000000000000000000000000000000..dbcf478f0e7690a9ef36df14d6edd893a12b342e GIT binary patch literal 764 zcmVPx%wn;=mR9J<*mrZNaK@i4&iQ0mRk*W|Z^dv|MUPL?yMM}YY3NaF)Um=iQaww$+ z@sNu`zJg$AE$F=<5_%9q=tVHpW1$iV6w{YO)zm|0<7TtF**~HW3?%z9&y(4i*-flg zt(-l&eFYmb*^+fUD%$T~Ip;1UuHAh0Ycj>H>ysms-S#JLWFGu8a)4MaUpNDJcrQap zBpyF`>UH>b{Y^0WkN_n@!4#9pmd29nB24nF-9xMIxXX#Yfq-A`TWk8#ana{UZEUpK z!Q=|7_2y7ST^Kq7jAPKDi`d+#&jClksSHg3$y~m$Jb|T5vlaP8LYkFcQnxDu5{tJ8pCd7j3T*1;O zl%L1~lE4&@2GXk3e7!-<$=bBol=zA!;LE$0+rYG~&TS&hF|AKb>z9;?p-yP)1!KD5 zJb%J&h3#_FyWvm-j_wqrkgGZ$=@UB4%gNh{t1C;a)|;W^9o<4iJTKfId8!QrR9BV; zg8^aJ>pZAW=#kJx#7%M^q|?QLOF#m+DwdG3xUW;{P$Gh#WV&OyCq|xRQaRv>qAAe% zEca~+MTiLRt5}s#qjjD@QJ|6;&kw`bh|KymOVkH*t?yYsk^?sA??qd)a*?}|TmKt4 uRzT>B*@bZ;yw~yHlKXr#T5Yy=5BUwln@m7o8mOB90000 { Tile tile = Vars.world.tile(x, y); - if(tile == null) return true; - - if(tile.synthetic() || !tile.solid()) return false; - - return !(tile.floor().isLiquid); + return tile == null || tile.solid(); }; } diff --git a/src/meld/entities/unit/abilities/BezerkAbility.java b/src/meld/entities/unit/abilities/BezerkAbility.java index ca6448a..368b933 100644 --- a/src/meld/entities/unit/abilities/BezerkAbility.java +++ b/src/meld/entities/unit/abilities/BezerkAbility.java @@ -109,7 +109,6 @@ public void update(Unit unit) { public void death(Unit unit) { if(bezerk && deathBomb != null) { deathBomb.create(null, unit.team, unit.x, unit.y, unit.vel.angle()); - Log.info("boomies!"); } super.death(unit); } diff --git a/src/meld/world/WorldUtil.java b/src/meld/world/WorldUtil.java index 6eabd8d..e4f2daf 100644 --- a/src/meld/world/WorldUtil.java +++ b/src/meld/world/WorldUtil.java @@ -1,10 +1,12 @@ package meld.world; +import arc.func.Cons; import arc.math.Mathf; import arc.math.geom.Point2; import arc.struct.Seq; import arc.util.Nullable; import arc.util.Tmp; +import mindustry.world.Block; import mindustry.world.Tile; import mindustry.world.meta.Attribute; @@ -23,6 +25,10 @@ public static float sumAttribute(@Nullable Attribute attr, int x, int y){ return tempTiles.sumf(other -> other.floor().attributes.get(attr)); } + public static void nearbyTiles(float x, float y, int size, Cons cons){ + Tmp.v1.set(size, (size - 1)/2f); + } + //Just to note //Rotation 0/0: (1, 0) //Rotation 90/1: (0, 1) diff --git a/src/meld/world/blocks/Bruisekit.java b/src/meld/world/blocks/Bruisekit.java index ce14483..c07fa71 100644 --- a/src/meld/world/blocks/Bruisekit.java +++ b/src/meld/world/blocks/Bruisekit.java @@ -29,7 +29,7 @@ public class BruisekitBuild extends PulsarBuild{ @Override public boolean shouldConsume() { - return super.shouldConsume() && target != null && lastRadius < range; + return super.shouldConsume() && (target != null || Math.abs(smoothRadius - range) > 1); } @Override @@ -42,8 +42,6 @@ public void updateTile() { if(target.wasRecentlyDamaged()) healAmount *= recentDamageMultiplier; if(target.block.size == 0) healAmount *= smallMultiplier; - Log.info(healAmount); - target.heal(healAmount); } } diff --git a/src/meld/world/blocks/CoreRaft.java b/src/meld/world/blocks/CoreRaft.java index a1218f1..1903f71 100644 --- a/src/meld/world/blocks/CoreRaft.java +++ b/src/meld/world/blocks/CoreRaft.java @@ -8,6 +8,7 @@ import arc.util.Nullable; import arc.util.Time; import meld.content.MeldStatusEffects; +import meld.world.blocks.crafting.StorageIncinerator; import mindustry.Vars; import mindustry.content.Fx; import mindustry.entities.Units; @@ -16,14 +17,20 @@ import mindustry.game.Team; import mindustry.gen.Building; import mindustry.gen.Player; +import mindustry.gen.Teamc; import mindustry.gen.Unit; import mindustry.graphics.Layer; import mindustry.graphics.Pal; +import mindustry.type.Item; import mindustry.type.UnitType; import mindustry.world.Tile; +import mindustry.world.blocks.production.Incinerator; +import mindustry.world.blocks.production.ItemIncinerator; +import mindustry.world.blocks.production.WallCrafter; import mindustry.world.blocks.storage.CoreBlock; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; +import static mindustry.Vars.net; //Rallies units nearby, provides an extended build radius for core units @@ -103,6 +110,23 @@ public class CoreRaftBuild extends CoreBuild { public @Nullable Tile targetTile; public boolean building = false, lastBuilding = false; + public Building incinerator; + + public boolean canIncinerate = false; + + @Override + public void onProximityUpdate() { + super.onProximityUpdate(); + incinerator= null; + proximity.each(b -> { + if(b instanceof Incinerator.IncineratorBuild || + b instanceof ItemIncinerator.ItemIncineratorBuild || + b.block instanceof StorageIncinerator + ) incinerator = b; + }); + canIncinerate = incinerator != null; + } + @Override public void onRemoved() { super.onRemoved(); @@ -115,6 +139,57 @@ public Building init(Tile tile, Team team, boolean shouldAdd, int rotation) { return super.init(tile, team, shouldAdd, rotation); } + @Override + public boolean acceptItem(Building source, Item item){ + return items.get(item) < getMaximumAccepted(item) || canIncinerate && incinerator.acceptItem(source, item); + } + + @Override + public int getMaximumAccepted(Item item){ + return canIncinerate ? incinerator.getMaximumAccepted(item) : storageCapacity; + } + + @Override + public void handleStack(Item item, int amount, Teamc source){ + boolean incinerate = canIncinerate && incinerateNonBuildable && !item.buildable; + int realAmount = incinerate ? 0 : Math.min(amount, storageCapacity - items.get(item)); + super.handleStack(item, realAmount, source); + + if(team == state.rules.defaultTeam && state.isCampaign()){ + if(!incinerate){ + state.rules.sector.info.handleCoreItem(item, amount); + } + + if(realAmount == 0 && wasVisible && canIncinerate){ + incinerator.handleStack(item, amount, source); + } + } + } + + @Override + public void handleItem(Building source, Item item){ + boolean incinerate = incinerateNonBuildable && !item.buildable; + + if(team == state.rules.defaultTeam){ + state.stats.coreItemCount.increment(item); + } + + if(net.server() || !net.active()){ + if(team == state.rules.defaultTeam && state.isCampaign() && !incinerate){ + state.rules.sector.info.handleCoreItem(item, 1); + } + + if(items.get(item) >= storageCapacity || incinerate){ + //create item incineration effect at random intervals + incinerator.handleItem(source, item); + }else{ + super.handleItem(source, item); + } + }else if(((state.rules.coreIncinerates && canIncinerate && items.get(item) >= storageCapacity) || incinerate) && !noEffect){ + incinerator.handleItem(source, item); + } + } + @Override public void updateTile() { super.updateTile(); diff --git a/src/meld/world/blocks/FieldPulsar.java b/src/meld/world/blocks/FieldPulsar.java index aa2da94..aefbccd 100644 --- a/src/meld/world/blocks/FieldPulsar.java +++ b/src/meld/world/blocks/FieldPulsar.java @@ -75,7 +75,6 @@ public class PulsarBuild extends Building{ public float smoothRadius; public float duration, uptime, grace; - public float lastRadius = 0f; @Override public void update() { diff --git a/src/meld/world/blocks/LiquidUtil.java b/src/meld/world/blocks/LiquidUtil.java index 2312a46..0a8a98e 100644 --- a/src/meld/world/blocks/LiquidUtil.java +++ b/src/meld/world/blocks/LiquidUtil.java @@ -16,7 +16,7 @@ public static boolean hasAll(LiquidStack[] liquids, Building build){ public static boolean has(LiquidStack[] liquids, Building build){ for(LiquidStack stack: liquids){ - if(build.liquids.get(stack.liquid) <= 0) { + if(build.liquids.get(stack.liquid) < stack.amount) { return false; } } diff --git a/src/meld/world/blocks/SonarSpire.java b/src/meld/world/blocks/SonarSpire.java index d50a7c0..43e9cee 100644 --- a/src/meld/world/blocks/SonarSpire.java +++ b/src/meld/world/blocks/SonarSpire.java @@ -24,6 +24,8 @@ public SonarSpire(String name) { } public class SonarSpireBuild extends PulsarBuild { + public float lastRadius = 0f; + @Override public void updateTile() { super.updateTile(); @@ -41,7 +43,7 @@ public void updateTile() { } @Override public float fogRadius() { - return smoothRadius/ tilesize; + return smoothRadius/tilesize; } @Override diff --git a/src/meld/world/blocks/crafting/StorageIncinerator.java b/src/meld/world/blocks/crafting/StorageIncinerator.java new file mode 100644 index 0000000..9bf13e4 --- /dev/null +++ b/src/meld/world/blocks/crafting/StorageIncinerator.java @@ -0,0 +1,65 @@ +package meld.world.blocks.crafting; + +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.TextureRegion; +import arc.math.Mathf; +import mindustry.gen.Building; +import mindustry.graphics.Drawf; +import mindustry.type.Item; +import mindustry.world.blocks.production.ItemIncinerator; +import mindustry.world.meta.BlockStatus; + +public class StorageIncinerator extends ItemIncinerator { + public StorageIncinerator(String name) { + super(name); + hasItems = true; + hasLiquids = true; + } + + @Override + public TextureRegion[] icons(){ + return new TextureRegion[]{region, topRegion}; + } + + public class ItemIncineratorBuild extends Building { + + @Override + public void updateTile(){ + } + + @Override + public BlockStatus status(){ + return !enabled ? BlockStatus.logicDisable : efficiency > 0 ? BlockStatus.active : BlockStatus.noInput; + } + + @Override + public void draw(){ + super.draw(); + + if(liquidRegion.found()){ + Drawf.liquid(liquidRegion, x, y, liquids.currentAmount() / liquidCapacity, liquids.current().color); + } + if(topRegion.found()){ + Draw.rect(topRegion, x, y); + } + } + + @Override + public void handleItem(Building source, Item item){ + if(efficiency > 0){ + if(Mathf.chance(effectChance)) effect.at(x, y); + } + else super.handleItem(source, item); + } + + @Override + public boolean acceptItem(Building source, Item item){ + return items.get(item) < itemCapacity || efficiency > 0; + } + + @Override + public int getMaximumAccepted(Item item) { + return efficiency > 0 ? Integer.MAX_VALUE/2 : Mathf.clamp(itemCapacity - items.get(item), 0, itemCapacity); + } + } +} diff --git a/src/meld/world/blocks/fluid/AspectPipe.java b/src/meld/world/blocks/fluid/AspectPipe.java index 95d2502..b54c801 100644 --- a/src/meld/world/blocks/fluid/AspectPipe.java +++ b/src/meld/world/blocks/fluid/AspectPipe.java @@ -5,6 +5,7 @@ import arc.struct.Seq; import arc.util.Log; import meld.content.MeldLiquids; +import meld.world.blocks.crafting.ModularCrafter; import meld.world.blocks.crafting.RecipeCrafter; import mindustry.Vars; import mindustry.game.Team; @@ -50,7 +51,7 @@ public void updateTile() { //get the tile above and below the current pipe, accounting for rotation Tile t = Vars.world.tile(tile.x + Geometry.d4(1 + i * 2 + rotation).x, tile.y + Geometry.d4(1 + i * 2 + rotation).y); - if(t == null || t.build == null || !t.build.block.hasLiquids || t.build.liquids == null || (!(t.build.block instanceof RecipeCrafter) && t.build.block.consumers.length == 0)) continue; + if(t == null || t.build == null || !t.build.block.hasLiquids || t.build.liquids == null || (!(t.build.block instanceof RecipeCrafter || t.build.block instanceof ModularCrafter) && t.build.block.consumers.length == 0)) continue; moveLiquid(t.build, liquids.current()); } diff --git a/src/meld/world/blocks/fluid/ChannelDirector.java b/src/meld/world/blocks/fluid/ChannelDirector.java index 9367148..9ab1f48 100644 --- a/src/meld/world/blocks/fluid/ChannelDirector.java +++ b/src/meld/world/blocks/fluid/ChannelDirector.java @@ -20,13 +20,14 @@ public ChannelDirector(String name) { super(name); rotate = true; quickRotate = true; + solid = false; } public class DirectorBuild extends FlexibleBuild{ @Override public Building getLiquidDestination(Building source, Liquid liquid, Position otherOffset) { - int dir = WorldUtil.relativeTo(source.tile.x, source.tile.y, tile.x, tile.y); + int dir = source.tile.relativeTo(tile); if(!acceptDirection(source, this, dir)) return this; return super.getLiquidDestination(source, liquid, otherOffset); diff --git a/src/meld/world/blocks/fluid/FlexibleSizeJunction.java b/src/meld/world/blocks/fluid/FlexibleSizeJunction.java index d66b1f0..fa20f0f 100644 --- a/src/meld/world/blocks/fluid/FlexibleSizeJunction.java +++ b/src/meld/world/blocks/fluid/FlexibleSizeJunction.java @@ -47,7 +47,8 @@ public Building getLiquidDestination(Building source, Liquid liquid, Position ot if(!enabled && enabledToggles) return this; //Find which direction the offset should go - int dir = WorldUtil.relativeTo(source.tile.x, source.tile.y, tile.x, tile.y); + int dir = source.relativeTo(tile); + Point2 direction = Geometry.d4(dir); //Direction offset vector diff --git a/src/meld/world/blocks/fluid/VisualAspectPipe.java b/src/meld/world/blocks/fluid/VisualAspectPipe.java index 03096d9..8319871 100644 --- a/src/meld/world/blocks/fluid/VisualAspectPipe.java +++ b/src/meld/world/blocks/fluid/VisualAspectPipe.java @@ -15,6 +15,7 @@ import arc.util.Tmp; import meld.content.MeldFx; import mindustry.Vars; +import mindustry.game.EventType; import mindustry.gen.Building; import mindustry.graphics.Drawf; import mindustry.graphics.Layer; diff --git a/src/meld/world/blocks/producer/Produce.java b/src/meld/world/blocks/producer/Produce.java new file mode 100644 index 0000000..15476b0 --- /dev/null +++ b/src/meld/world/blocks/producer/Produce.java @@ -0,0 +1,4 @@ +package meld.world.blocks.producer; + +public class Produce { +}