Logic sensor accesses more infos of payload (#8766)

* Added Logic Sense Payload

* Update UnitComp.java

---------

Co-authored-by: Anuken <arnukren@gmail.com>
This commit is contained in:
BlackDeluxeCat
2025-02-05 19:36:26 -05:00
committed by GitHub
co-authored by Anuken
parent 8ed4f80043
commit 108b101669
6 changed files with 60 additions and 2 deletions
@@ -1988,6 +1988,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
public double sense(Content content){ public double sense(Content content){
if(content instanceof Item i && items != null) return items.get(i); if(content instanceof Item i && items != null) return items.get(i);
if(content instanceof Liquid l && liquids != null) return liquids.get(l); if(content instanceof Liquid l && liquids != null) return liquids.get(l);
if(getPayloads() != null){
if(content instanceof UnitType u) return getPayloads().get(u);
if(content instanceof Block b) return getPayloads().get(b);
}
return Float.NaN; //invalid sense return Float.NaN; //invalid sense
} }
@@ -241,6 +241,8 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
controller instanceof CommandAI command && command.hasCommand() ? ctrlCommand : controller instanceof CommandAI command && command.hasCommand() ? ctrlCommand :
0; 0;
case payloadCount -> ((Object)this) instanceof Payloadc pay ? pay.payloads().size : 0; case payloadCount -> ((Object)this) instanceof Payloadc pay ? pay.payloads().size : 0;
case totalPayload -> ((Object)this) instanceof Payloadc pay ? pay.payloadUsed() : 0;
case payloadCapacity -> type.payloadCapacity;
case size -> hitSize / tilesize; case size -> hitSize / tilesize;
case color -> Color.toDoubleBits(team.color.r, team.color.g, team.color.b, 1f); case color -> Color.toDoubleBits(team.color.r, team.color.g, team.color.b, 1f);
default -> Float.NaN; default -> Float.NaN;
@@ -265,6 +267,16 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
@Override @Override
public double sense(Content content){ public double sense(Content content){
if(content == stack().item) return stack().amount; if(content == stack().item) return stack().amount;
if(content instanceof UnitType u){
return ((Object)this) instanceof Payloadc pay ?
(pay.payloads().isEmpty() ? 0 :
pay.payloads().count(p -> p instanceof UnitPayload up && up.unit.type == u)) : 0;
}
if(content instanceof Block b){
return ((Object)this) instanceof Payloadc pay ?
(pay.payloads().isEmpty() ? 0 :
pay.payloads().count(p -> p instanceof BuildPayload bp && bp.build.block == b)) : 0;
}
return Float.NaN; return Float.NaN;
} }
+2
View File
@@ -55,6 +55,8 @@ public enum LAccess{
name, name,
payloadCount, payloadCount,
payloadType, payloadType,
totalPayload,
payloadCapacity,
id, id,
//values with parameters are considered controllable //values with parameters are considered controllable
+26 -2
View File
@@ -19,6 +19,7 @@ import mindustry.logic.LExecutor.*;
import mindustry.logic.LogicFx.*; import mindustry.logic.LogicFx.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.ui.*; import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@@ -614,6 +615,29 @@ public class LStatements{
if(++c % 6 == 0) i.row(); if(++c % 6 == 0) i.row();
} }
}), }),
new Table(i -> {
i.left();
int c = 0;
for(UnitType item : Vars.content.units()){
if(!item.unlockedNow() || item.hidden) continue;
i.button(new TextureRegionDrawable(item.uiIcon), Styles.flati, iconSmall, () -> {
stype("@" + item.name);
hide.run();
}).size(40f);
if(++c % 6 == 0) i.row();
}
for(Block item : Vars.content.blocks()){
if(!item.unlockedNow() || item.isHidden()) continue;
i.button(new TextureRegionDrawable(item.uiIcon), Styles.flati, iconSmall, () -> {
stype("@" + item.name);
hide.run();
}).size(40f);
if(++c % 6 == 0) i.row();
}
}),
//sensors //sensors
new Table(i -> { new Table(i -> {
for(LAccess sensor : LAccess.senseable){ for(LAccess sensor : LAccess.senseable){
@@ -625,7 +649,7 @@ public class LStatements{
}) })
}; };
Drawable[] icons = {Icon.box, Icon.liquid, Icon.tree}; Drawable[] icons = {Icon.box, Icon.liquid, Icon.units, Icon.tree};
Stack stack = new Stack(tables[selected]); Stack stack = new Stack(tables[selected]);
ButtonGroup<Button> group = new ButtonGroup<>(); ButtonGroup<Button> group = new ButtonGroup<>();
@@ -643,7 +667,7 @@ public class LStatements{
}).height(50f).growX().checked(selected == fi).group(group); }).height(50f).growX().checked(selected == fi).group(group);
} }
t.row(); t.row();
t.add(stack).colspan(3).width(240f).left(); t.add(stack).colspan(4).width(240f).left();
})); }));
}, Styles.logict, () -> {}).size(40f).padLeft(-1).color(table.color); }, Styles.logict, () -> {}).size(40f).padLeft(-1).color(table.color);
@@ -6,6 +6,7 @@ import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.util.*; import arc.util.*;
import arc.util.io.*; import arc.util.io.*;
import mindustry.ctype.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.world.*; import mindustry.world.*;
@@ -251,6 +252,13 @@ public class PayloadBlock extends Block{
} }
} }
@Override
public double sense(Content content){
if(payload instanceof UnitPayload up) return up.unit.type == content ? 1 : 0;
if(payload instanceof BuildPayload bp) return bp.build.block == content ? 1 : 0;
return super.sense(content);
}
@Override @Override
public void write(Writes write){ public void write(Writes write){
super.write(write); super.write(write);
@@ -5,6 +5,7 @@ import arc.math.*;
import arc.util.*; import arc.util.*;
import arc.util.io.*; import arc.util.io.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.ctype.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
@@ -201,6 +202,13 @@ public class PayloadDeconstructor extends PayloadBlock{
} }
} }
@Override
public double sense(Content content){
if(deconstructing instanceof UnitPayload up) return up.unit.type == content ? 1 : 0;
if(deconstructing instanceof BuildPayload bp) return bp.build.block == content ? 1 : 0;
return super.sense(content);
}
@Override @Override
public double sense(LAccess sensor){ public double sense(LAccess sensor){
if(sensor == LAccess.progress) return progress; if(sensor == LAccess.progress) return progress;