From d8c1ea17e13249ab20bee88fcc311e9e191806bd Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Fri, 29 Mar 2024 12:17:19 -0700 Subject: [PATCH] Make payload blocks run `onDestroyed()` of the block payload it carries when destroyed. (#8253) * Payloads go boom. * When a payload unit dies too * Keep the functionality, but limit it to a rule --- core/assets/bundles/bundle.properties | 1 + core/src/mindustry/entities/comp/PayloadComp.java | 5 +++++ core/src/mindustry/game/Rules.java | 2 ++ core/src/mindustry/ui/dialogs/CustomRulesDialog.java | 1 + core/src/mindustry/world/blocks/payloads/BuildPayload.java | 5 +++++ core/src/mindustry/world/blocks/payloads/Payload.java | 2 ++ core/src/mindustry/world/blocks/payloads/PayloadBlock.java | 6 ++++++ .../mindustry/world/blocks/payloads/PayloadConveyor.java | 6 ++++++ 8 files changed, 28 insertions(+) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 260c5af651..af18ff5f20 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1313,6 +1313,7 @@ rules.unitdamagemultiplier = Unit Damage Multiplier rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier rules.solarmultiplier = Solar Power Multiplier rules.unitcapvariable = Cores Contribute To Unit Cap +rules.unitpayloadsexplode = Carried Payloads Explode With The Unit rules.unitcap = Base Unit Cap rules.limitarea = Limit Map Area rules.enemycorebuildradius = Enemy Core No-Build Radius:[lightgray] (tiles) diff --git a/core/src/mindustry/entities/comp/PayloadComp.java b/core/src/mindustry/entities/comp/PayloadComp.java index d1f7518e65..9b9d6e6405 100644 --- a/core/src/mindustry/entities/comp/PayloadComp.java +++ b/core/src/mindustry/entities/comp/PayloadComp.java @@ -60,6 +60,11 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ } } + @Override + public void destroy(){ + if(Vars.state.rules.unitPayloadsExplode) payloads.each(Payload::destroyed); + } + float payloadUsed(){ return payloads.sumf(p -> p.size() * p.size()); } diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index 951426907d..9da173c2df 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -59,6 +59,8 @@ public class Rules{ public boolean unitAmmo = false; /** EXPERIMENTAL! If true, blocks will update in units and share power. */ public boolean unitPayloadUpdate = false; + /** If true, units' payloads are destroy()ed when the unit is destroyed. */ + public boolean unitPayloadsExplode = false; /** Whether cores add to unit limit */ public boolean unitCapVariable = true; /** If true, unit spawn points are shown. */ diff --git a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java index 4c54569b4d..1091c74c08 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -233,6 +233,7 @@ public class CustomRulesDialog extends BaseDialog{ title("@rules.title.unit"); check("@rules.unitcapvariable", b -> rules.unitCapVariable = b, () -> rules.unitCapVariable); + check("@rules.unitpayloadsexplode", b -> rules.unitPayloadsExplode = b, () -> rules.unitPayloadsExplode); numberi("@rules.unitcap", f -> rules.unitCap = f, () -> rules.unitCap, -999, 999); number("@rules.unitdamagemultiplier", f -> rules.unitDamageMultiplier = f, () -> rules.unitDamageMultiplier); number("@rules.unitcrashdamagemultiplier", f -> rules.unitCrashDamageMultiplier = f, () -> rules.unitCrashDamageMultiplier); diff --git a/core/src/mindustry/world/blocks/payloads/BuildPayload.java b/core/src/mindustry/world/blocks/payloads/BuildPayload.java index 42f79374ad..90e37e9e16 100644 --- a/core/src/mindustry/world/blocks/payloads/BuildPayload.java +++ b/core/src/mindustry/world/blocks/payloads/BuildPayload.java @@ -51,6 +51,11 @@ public class BuildPayload implements Payload{ build.updatePayload(unitHolder, buildingHolder); } + @Override + public void destroyed(){ + build.onDestroyed(); + } + @Override public ItemStack[] requirements(){ return build.block.requirements; diff --git a/core/src/mindustry/world/blocks/payloads/Payload.java b/core/src/mindustry/world/blocks/payloads/Payload.java index 218fab7192..b1e6f90ff5 100644 --- a/core/src/mindustry/world/blocks/payloads/Payload.java +++ b/core/src/mindustry/world/blocks/payloads/Payload.java @@ -54,6 +54,8 @@ public interface Payload extends Position{ return 0f; } + default void destroyed(){}; + /** writes the payload for saving. */ void write(Writes write); diff --git a/core/src/mindustry/world/blocks/payloads/PayloadBlock.java b/core/src/mindustry/world/blocks/payloads/PayloadBlock.java index 1ecd627dc3..b4b0de0f37 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadBlock.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadBlock.java @@ -151,6 +151,12 @@ public class PayloadBlock extends Block{ } } + @Override + public void onDestroyed(){ + if(payload != null) payload.destroyed(); + super.onDestroyed(); + } + public boolean blends(int direction){ return PayloadBlock.blends(this, direction); } diff --git a/core/src/mindustry/world/blocks/payloads/PayloadConveyor.java b/core/src/mindustry/world/blocks/payloads/PayloadConveyor.java index 6fedce44a3..e6c368d97e 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadConveyor.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadConveyor.java @@ -190,6 +190,12 @@ public class PayloadConveyor extends Block{ super.draw(); } + @Override + public void onDestroyed(){ + if(item != null) item.destroyed(); + super.onDestroyed(); + } + @Override public void draw(){ super.draw();