diff --git a/core/src/mindustry/content/Weathers.java b/core/src/mindustry/content/Weathers.java index b120b7ef2b..52dcdeec76 100644 --- a/core/src/mindustry/content/Weathers.java +++ b/core/src/mindustry/content/Weathers.java @@ -39,7 +39,7 @@ public class Weathers implements ContentList{ minAlpha = 0f; maxAlpha = 0.2f; density = 1500f; - baseSpeed = 6.1f; + baseSpeed = 5.4f; attrs.set(Attribute.light, -0.1f); attrs.set(Attribute.water, -0.1f); opacityMultiplier = 0.8f; diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index 84b6160d25..df932a8310 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -1319,7 +1319,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, @Override public void control(LAccess type, Object p1, double p2, double p3, double p4){ - + if(type == LAccess.configure && block.logicConfigurable){ + //change config only if it's new + Object prev = senseObject(LAccess.config); + if(prev != p1){ + configureAny(p1); + } + } } @Override diff --git a/core/src/mindustry/logic/LAccess.java b/core/src/mindustry/logic/LAccess.java index 0d678554d1..669e447a57 100644 --- a/core/src/mindustry/logic/LAccess.java +++ b/core/src/mindustry/logic/LAccess.java @@ -38,12 +38,15 @@ public enum LAccess{ //values with parameters are considered controllable enabled("to"), //"to" is standard for single parameter access shoot("x", "y", "shoot"), - shootp(true, "unit", "shoot") + shootp(true, "unit", "shoot"), + configure(true, 30, "to") ; public final String[] params; public final boolean isObj; + /** Tick cooldown between invocations. */ + public float cooldown = -1; public static final LAccess[] all = values(), @@ -59,4 +62,10 @@ public enum LAccess{ this.params = params; isObj = obj; } + + LAccess(boolean obj, float cooldown, String... params){ + this.params = params; + this.cooldown = cooldown; + isObj = obj; + } } diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 9db29d314d..a4eed29198 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -292,14 +292,15 @@ public class LExecutor{ /** Controls the unit based on some parameters. */ public static class UnitControlI implements LInstruction{ public LUnitControl type = LUnitControl.move; - public int p1, p2, p3, p4; + public int p1, p2, p3, p4, p5; - public UnitControlI(LUnitControl type, int p1, int p2, int p3, int p4){ + public UnitControlI(LUnitControl type, int p1, int p2, int p3, int p4, int p5){ this.type = type; this.p1 = p1; this.p2 = p2; this.p3 = p3; this.p4 = p4; + this.p5 = p5; } public UnitControlI(){ @@ -437,7 +438,7 @@ public class LExecutor{ } ai.plan.set(x, y, rot, block); - ai.plan.config = null; + ai.plan.config = exec.obj(p5) instanceof Content c ? c : null; builder.clearBuilding(); @@ -500,6 +501,7 @@ public class LExecutor{ public int target; public LAccess type = LAccess.enabled; public int p1, p2, p3, p4; + public Interval timer = new Interval(1); public ControlI(LAccess type, int target, int p1, int p2, int p3, int p4){ this.type = type; @@ -515,7 +517,7 @@ public class LExecutor{ @Override public void run(LExecutor exec){ Object obj = exec.obj(target); - if(obj instanceof Building b && b.team == exec.team && exec.linkIds.contains(b.id)){ + if(obj instanceof Building b && b.team == exec.team && exec.linkIds.contains(b.id) && (type.cooldown <= 0 || timer.get(type.cooldown))){ if(type.isObj){ b.control(type, exec.obj(p1), exec.num(p2), exec.num(p3), exec.num(p4)); }else{ diff --git a/core/src/mindustry/logic/LStatements.java b/core/src/mindustry/logic/LStatements.java index 517d53bcc6..ae1c346373 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -748,7 +748,7 @@ public class LStatements{ @RegisterStatement("ucontrol") public static class UnitControlStatement extends LStatement{ public LUnitControl type = LUnitControl.move; - public String p1 = "0", p2 = "0", p3 = "0", p4 = "0"; + public String p1 = "0", p2 = "0", p3 = "0", p4 = "0", p5 = ""; @Override public void build(Table table){ @@ -777,7 +777,7 @@ public class LStatements{ int c = 0; for(int i = 0; i < type.params.length; i++){ - fields(table, type.params[i], i == 0 ? p1 : i == 1 ? p2 : i == 2 ? p3 : p4, i == 0 ? v -> p1 = v : i == 1 ? v -> p2 = v : i == 2 ? v -> p3 = v : v -> p4 = v).width(110f); + fields(table, type.params[i], i == 0 ? p1 : i == 1 ? p2 : i == 2 ? p3 : p4, i == 0 ? v -> p1 = v : i == 1 ? v -> p2 = v : i == 2 ? v -> p3 = v : i == 3 ? v -> p4 = v : v -> p5 = v).width(110f); if(++c % 2 == 0) row(table); } @@ -790,7 +790,7 @@ public class LStatements{ @Override public LInstruction build(LAssembler builder){ - return new UnitControlI(type, builder.var(p1), builder.var(p2), builder.var(p3), builder.var(p4)); + return new UnitControlI(type, builder.var(p1), builder.var(p2), builder.var(p3), builder.var(p4), builder.var(p5)); } } @@ -861,7 +861,7 @@ public class LStatements{ table.table(ts -> { ts.color.set(table.color); - field(ts, ore, str -> ore = str); + fields(ts, ore, str -> ore = str); ts.button(b -> { b.image(Icon.pencilSmall); @@ -905,8 +905,10 @@ public class LStatements{ table.add(" found ").left(); fields(table, outFound, str -> outFound = str); - table.add(" building ").left(); - fields(table, outBuild, str -> outBuild = str); + if(locate != LLocate.ore){ + table.add(" building ").left(); + fields(table, outBuild, str -> outBuild = str); + } } diff --git a/core/src/mindustry/logic/LUnitControl.java b/core/src/mindustry/logic/LUnitControl.java index b4c7f8254c..41f00da025 100644 --- a/core/src/mindustry/logic/LUnitControl.java +++ b/core/src/mindustry/logic/LUnitControl.java @@ -14,7 +14,7 @@ public enum LUnitControl{ payTake("takeUnits"), mine("x", "y"), flag("value"), - build("x", "y", "block", "rotation"), + build("x", "y", "block", "rotation", "config"), getBlock("x", "y", "type", "building"), within("x", "y", "radius", "result"); diff --git a/core/src/mindustry/maps/filters/GenerateFilter.java b/core/src/mindustry/maps/filters/GenerateFilter.java index 47d8420936..6d7a00f3a9 100644 --- a/core/src/mindustry/maps/filters/GenerateFilter.java +++ b/core/src/mindustry/maps/filters/GenerateFilter.java @@ -37,7 +37,7 @@ public abstract class GenerateFilter{ apply(); tile.setFloor(in.floor.asFloor()); - tile.setOverlay(!in.floor.asFloor().hasSurface() ? Blocks.air : in.overlay); + tile.setOverlay(!in.floor.asFloor().hasSurface() && in.overlay.asFloor().needsSurface ? Blocks.air : in.overlay); if(!tile.block().synthetic() && !in.block.synthetic()){ tile.setBlock(in.block); @@ -49,7 +49,7 @@ public abstract class GenerateFilter{ apply(); tile.setFloor(in.floor.asFloor()); - tile.setOverlay(!in.floor.asFloor().hasSurface() ? Blocks.air : in.overlay); + tile.setOverlay(!in.floor.asFloor().hasSurface() && in.overlay.asFloor().needsSurface ? Blocks.air : in.overlay); if(!tile.block().synthetic() && !in.block.synthetic()){ tile.setBlock(in.block); diff --git a/core/src/mindustry/type/weather/ParticleWeather.java b/core/src/mindustry/type/weather/ParticleWeather.java index 060e9cbe62..463145085f 100644 --- a/core/src/mindustry/type/weather/ParticleWeather.java +++ b/core/src/mindustry/type/weather/ParticleWeather.java @@ -74,7 +74,7 @@ public class ParticleWeather extends Weather{ float sspeed = 1f, sscl = 1f, salpha = 1f, offset = 0f; Color col = Tmp.c1.set(noiseColor); for(int i = 0; i < noiseLayers; i++){ - drawNoise(noise, noiseColor, noiseScale * sscl, state.opacity * salpha * opacityMultiplier, baseSpeed * sspeed, state.intensity, windx, windy, offset); + drawNoise(noise, noiseColor, noiseScale * sscl, state.opacity * salpha * opacityMultiplier, sspeed * (useWindVector ? 1f : baseSpeed), state.intensity, windx, windy, offset); sspeed *= noiseLayerSpeedM; salpha *= noiseLayerAlphaM; sscl *= noiseLayerSclM; diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index f74e9bb099..c1c544a05e 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -133,6 +133,8 @@ public class Block extends UnlockableContent{ public int unitCapModifier = 0; /** Whether the block can be tapped and selected to configure. */ public boolean configurable; + /** If true, this block can be configured by logic. */ + public boolean logicConfigurable = false; /** Whether this block consumes touchDown events when tapped. */ public boolean consumesTap; /** Whether to draw the glow of the liquid for this block, if it has one. */ @@ -674,6 +676,14 @@ public class Block extends UnlockableContent{ consumes.init(); + if(!logicConfigurable){ + configurations.each((key, val) -> { + if(UnlockableContent.class.isAssignableFrom(key)){ + logicConfigurable = true; + } + }); + } + if(!outputsPower && consumes.hasPower() && consumes.getPower().buffered){ throw new IllegalArgumentException("Consumer using buffered power: " + name); } diff --git a/core/src/mindustry/world/blocks/units/UnitFactory.java b/core/src/mindustry/world/blocks/units/UnitFactory.java index 500385966e..a38a94fa37 100644 --- a/core/src/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/mindustry/world/blocks/units/UnitFactory.java @@ -33,8 +33,6 @@ public class UnitFactory extends UnitBlock{ hasPower = true; hasItems = true; solid = true; - //flags = EnumSet.of(BlockFlag.producer, BlockFlag.unitModifier); - //unitCapModifier = 2; configurable = true; outputsPayload = true; rotate = true; @@ -44,6 +42,11 @@ public class UnitFactory extends UnitBlock{ tile.progress = 0; }); + config(UnitType.class, (UnitFactoryBuild tile, UnitType val) -> { + tile.currentPlan = plans.indexOf(p -> p.unit == val); + tile.progress = 0; + }); + consumes.add(new ConsumeItemDynamic((UnitFactoryBuild e) -> e.currentPlan != -1 ? plans.get(e.currentPlan).requirements : ItemStack.empty)); }