diff --git a/core/assets/maps/four.msav b/core/assets/maps/four.msav index e33f7e2c33..3a149be4bc 100644 Binary files a/core/assets/maps/four.msav and b/core/assets/maps/four.msav differ diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 5b0df10d41..0ee8638afc 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -107,6 +107,8 @@ public class Logic implements ApplicationListener{ weather.cooldown = sum + Mathf.random(weather.maxFrequency); sum += weather.cooldown; } + //tick resets on new save play + state.tick = 0f; }); Events.on(WorldLoadEvent.class, e -> { diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index 6b03cc4e30..c8325fa438 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -1369,7 +1369,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public void displayConsumption(Table table){ table.left(); - for(Consume cons : block.consumes.all()){ + for(Consume cons : block.consumes.all){ if(cons.isOptional() && cons.isBoost()) continue; cons.build(self(), table); } @@ -1708,11 +1708,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public void update(){ if(state.isEditor()) return; + //TODO refactor to timestamp-based system timeScaleDuration -= Time.delta; if(timeScaleDuration <= 0f || !block.canOverdrive){ timeScale = 1f; } + //TODO unacceptable overhead? if(!enabled && block.autoResetEnabled){ noSleep(); enabledControlTime -= Time.delta; @@ -1722,10 +1724,12 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } } + //TODO this check should not be here, just remove unsupported buildings instead if(team == Team.derelict || !block.supportsEnv(state.rules.environment)){ enabled = false; } + //TODO separate system for sound? if(!headless){ if(sound != null){ sound.update(x, y, shouldActiveSound()); @@ -1736,6 +1740,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } } + //TODO consume module is not necessary for every building, e.g. conveyors should not have it - perhaps it should be nullable? if(cons != null){ cons.update(); } @@ -1744,6 +1749,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, updateTile(); } + //TODO unnecessary updates? if(items != null){ items.update(updateFlow); } @@ -1752,6 +1758,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, liquids.update(updateFlow); } + //TODO power graph should be separate entity if(power != null){ power.graph.update(); } diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index c01f993f83..a4f60fca92 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -7,6 +7,7 @@ import arc.struct.*; import arc.util.*; import mindustry.*; import mindustry.ai.types.*; +import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.core.*; import mindustry.ctype.*; @@ -1326,5 +1327,43 @@ public class LExecutor{ } } + public static class ExplosionI implements LInstruction{ + public int team, x, y, radius, damage, air, ground, pierce; + + public ExplosionI(int team, int x, int y, int radius, int damage, int air, int ground, int pierce){ + this.team = team; + this.x = x; + this.y = y; + this.radius = radius; + this.damage = damage; + this.air = air; + this.ground = ground; + this.pierce = pierce; + } + + public ExplosionI(){ + } + + @Override + public void run(LExecutor exec){ + if(net.client()) return; + + Team t = exec.obj(team) instanceof Team te ? te : null; + //note that there is a radius cap + Call.logicExplosion(t, World.unconv(exec.numf(x)), World.unconv(exec.numf(y)), World.unconv(Math.min(exec.numf(radius), 100)), exec.numf(damage), exec.bool(air), exec.bool(ground), exec.bool(pierce)); + } + } + + @Remote(called = Loc.server, unreliable = true) + public static void logicExplosion(Team team, float x, float y, float radius, float damage, boolean air, boolean ground, boolean pierce){ + + Damage.damage(team, x, y, radius, damage, pierce, air, ground); + if(pierce){ + Fx.spawnShockwave.at(x, y, World.conv(radius)); + }else{ + Fx.dynamicExplosion.at(x, y, World.conv(radius) / 8f); + } + } + //endregion } diff --git a/core/src/mindustry/world/blocks/power/PowerGraph.java b/core/src/mindustry/world/blocks/power/PowerGraph.java index 2f16ce50a0..f046ffbf39 100644 --- a/core/src/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/mindustry/world/blocks/power/PowerGraph.java @@ -348,7 +348,7 @@ public class PowerGraph{ } private boolean otherConsumersAreValid(Building build, Consume consumePower){ - for(Consume cons : build.block.consumes.all()){ + for(Consume cons : build.block.consumes.all){ if(cons != consumePower && !cons.isOptional() && !cons.valid(build)){ return false; } diff --git a/core/src/mindustry/world/consumers/ConsumeType.java b/core/src/mindustry/world/consumers/ConsumeType.java index d6cd64a735..fecd9f74de 100644 --- a/core/src/mindustry/world/consumers/ConsumeType.java +++ b/core/src/mindustry/world/consumers/ConsumeType.java @@ -4,5 +4,7 @@ public enum ConsumeType{ item, power, liquid, - payload + payload; + + public static final ConsumeType[] all = values(); } diff --git a/core/src/mindustry/world/consumers/Consumers.java b/core/src/mindustry/world/consumers/Consumers.java index 3633e9bb8a..335655463d 100644 --- a/core/src/mindustry/world/consumers/Consumers.java +++ b/core/src/mindustry/world/consumers/Consumers.java @@ -10,8 +10,9 @@ import mindustry.world.blocks.power.*; import mindustry.world.meta.*; public class Consumers{ - private Consume[] map = new Consume[ConsumeType.values().length]; - private Consume[] results, optionalResults; + private Consume[] map = new Consume[ConsumeType.all.length]; + + public Consume[] all = {}, optionals = {}; public final Bits itemFilters = new Bits(Vars.content.items().size); public final Bits liquidfilters = new Bits(Vars.content.liquids().size); @@ -25,7 +26,7 @@ public class Consumers{ } public boolean any(){ - return results != null && results.length > 0; + return all.length > 0; } public void each(Cons c){ @@ -37,10 +38,10 @@ public class Consumers{ } public void init(){ - results = Structs.filter(Consume.class, map, m -> m != null); - optionalResults = Structs.filter(Consume.class, map, m -> m != null && m.isOptional()); + all = Structs.filter(Consume.class, map, m -> m != null); + optionals = Structs.filter(Consume.class, map, m -> m != null && m.isOptional()); - for(Consume cons : results){ + for(Consume cons : all){ cons.applyItemFilter(itemFilters); cons.applyLiquidFilter(liquidfilters); } @@ -126,18 +127,20 @@ public class Consumers{ return (T)map[type.ordinal()]; } - @Nullable - public T getOrNull(ConsumeType type){ + public @Nullable T getOrNull(ConsumeType type){ return (T)map[type.ordinal()]; } - @Nullable + /** @deprecated unnecessary getter */ + @Deprecated public Consume[] all(){ - return results; + return all; } + /** @deprecated unnecessary getter */ + @Deprecated public Consume[] optionals(){ - return optionalResults; + return optionals; } public void display(Stats stats){ diff --git a/core/src/mindustry/world/modules/ConsumeModule.java b/core/src/mindustry/world/modules/ConsumeModule.java index 4973f4151f..7b79a57792 100644 --- a/core/src/mindustry/world/modules/ConsumeModule.java +++ b/core/src/mindustry/world/modules/ConsumeModule.java @@ -41,7 +41,7 @@ public class ConsumeModule extends BlockModule{ optionalValid = true; boolean docons = entity.shouldConsume() && entity.productionValid(); - for(Consume cons : entity.block.consumes.all()){ + for(Consume cons : entity.block.consumes.all){ if(cons.isOptional()) continue; if(docons && cons.isUpdate() && prevValid && cons.valid(entity)){ @@ -51,7 +51,7 @@ public class ConsumeModule extends BlockModule{ valid &= cons.valid(entity); } - for(Consume cons : entity.block.consumes.optionals()){ + for(Consume cons : entity.block.consumes.optionals){ if(docons && cons.isUpdate() && prevValid && cons.valid(entity)){ cons.update(entity); } @@ -61,7 +61,7 @@ public class ConsumeModule extends BlockModule{ } public void trigger(){ - for(Consume cons : entity.block.consumes.all()){ + for(Consume cons : entity.block.consumes.all){ cons.trigger(entity); } } diff --git a/tests/src/test/java/power/PowerTestFixture.java b/tests/src/test/java/power/PowerTestFixture.java index 5c50a70d1c..ff52d714e5 100644 --- a/tests/src/test/java/power/PowerTestFixture.java +++ b/tests/src/test/java/power/PowerTestFixture.java @@ -81,7 +81,7 @@ public class PowerTestFixture{ Tile tile = new Tile(x, y); //workaround since init() is not called for custom blocks - if(block.consumes.all() == null){ + if(block.consumes.all == null || block.consumes.all.length == 0){ block.consumes.init(); }