From bdc3b85346c2784097908c3e4e8254e87b481974 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 13 Dec 2021 23:14:26 -0500 Subject: [PATCH] Unit assembler progress --- build.gradle | 2 +- .../sprites/blocks/units/tank-assembler.png | Bin 0 -> 1374 bytes .../blocks/walls/tungsten-wall-large.png | Bin 835 -> 791 bytes .../sprites/blocks/walls/tungsten-wall.png | Bin 289 -> 283 bytes core/assets/logicids.dat | Bin 3825 -> 3841 bytes core/src/mindustry/ai/types/CargoAI.java | 2 + core/src/mindustry/content/Blocks.java | 5 +- core/src/mindustry/content/UnitTypes.java | 1 + core/src/mindustry/type/BlockSeq.java | 65 ++++++++++ core/src/mindustry/type/UnitType.java | 1 + core/src/mindustry/ui/ItemImage.java | 4 + .../world/blocks/defense/BuildTurret.java | 1 + .../world/blocks/distribution/Duct.java | 5 + .../world/blocks/units/UnitAssembler.java | 121 +++++++++++++++++- .../world/consumers/ConsumeItems.java | 2 +- .../world/consumers/ConsumePayloads.java | 62 +++++++++ .../world/consumers/ConsumeType.java | 3 +- tools/src/mindustry/tools/Generators.java | 2 +- 18 files changed, 264 insertions(+), 12 deletions(-) create mode 100644 core/assets-raw/sprites/blocks/units/tank-assembler.png create mode 100644 core/src/mindustry/type/BlockSeq.java create mode 100644 core/src/mindustry/world/consumers/ConsumePayloads.java diff --git a/build.gradle b/build.gradle index 4964fa3cfd..f61001f29d 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ allprojects{ if(!project.hasProperty("versionType")) versionType = 'official' appName = 'Mindustry' steamworksVersion = '0b86023401880bb5e586bc404bedbaae9b1f1c94' - rhinoVersion = '3c6bbadf73a904eefcc28b6fd8aa742ac575e878' + rhinoVersion = '73a812444ac388ac2d94013b5cadc8f70b7ea027' loadVersionProps = { return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p } diff --git a/core/assets-raw/sprites/blocks/units/tank-assembler.png b/core/assets-raw/sprites/blocks/units/tank-assembler.png new file mode 100644 index 0000000000000000000000000000000000000000..5bf4b32783bb006eb49d78703985710200a4e83d GIT binary patch literal 1374 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4mJh`hDS5XEf^RW7>k44ofy`glX=O&z$)SC z;uumf=j~i;KN&}XHtv=u5+@lM8K+H4QPq2JLaD^zh4O@t7EBY1PtWXsaDjcp4(3a0 zYf_k)m{g9tSUB{i&#Jq&cy(1-9cN}@TJ`Gx`M>X;&6yh?XDeU-k0q?+Q;F`Zf9uQ3 zK5;Q@;AQwwP`+OF_^~W$hJ>wA=LM#0c^enes1WHIvAT|dje%hq@4-bs8RQrmGMzSL z**P#U9N3}|VJ5G@#BhMGWo5Q{Y2nr=W`+az4%U76b@=Yz*S1T4efsYI>DT$Y{EP43 zPk(p*<#)ZepNpgP!~^TSM06SbHco0VtnXTMO(c?GA^*&?^4&~|k*q)Eg{o{{yY75t zwQP~lf|a+dX1?Alk?7@Q$Z-9}8`(F9i*~Ny>r?8Pxb|%Ms@4FO1NkpC1%i$xtk0}* z^D-6K#E^7XCyzsQ=JY-7yN^t9I$?HbrQ6Y1Z_`t+Z_mDdz5DRu>(@8(@W1DOnf*zN z!DiY0_ema-a@{+_R$sNctua~pVTk96nKzr4d_HiAo6B)V(@(!im5Hz0_!NCk)~K(v z+1SVYjqlsZ#-LX*FSn>FY+(BF@vXJDm5{)WOHbMkuq`<9XVwEt#Vbofg_PA<#28HP z|G6fx;@eMfw(V%QeGE3=#LsZ#rFB>SNMy^Uwc94mTvXJzCgO za&J`2Ol8QL&gD>_p|9Du=V$D9^Uw=CiaMO18I^JyL|FU` zx(_eD$Ul9_qdwlK#l?<%hmJ4*ct2Yze&r+qqdjTwG}XPV{!PFB{d{<-zQ-?xQooh? zyUW-af{PdIS{NnZ#dEExVeK~8bZ5)ZSE|l>YbQnhHuK(MsGTHbJ>A>2v4Ls9 zR+*bs@9TOu2&`hvSkJng=i0i@h60OTGwN-0Z+iGoV@mP9IIUcUs5^En&*O9M=|nJD z`1Kwa^WCv!-(JbT1)f^(BF=tfYnbwLuQ%5rjsrP$Q9=S`Ma!O_WB0lFVM5Z+wU+V* zEf>yq%}DjFb3L7+0$7f-+Xeq+kM$=Ch`PZJ7Yc6?Fdr{?fF=t4VdIO`*NL;~HrzRgSti z3&oB;=4A|u)7bSmqMuI>Kfh9X#rcz6C*ys!=N6w@dnobp!E=>M=V^pKlKo|wB+}}m z6M1jS9`@aPq_jDg#>ZSKKBD23DpKwH*tqSJ;*~2>SI-MhUeQ-{NTT>t$=wq9)&D0f z4hl6rB*p(@$(ubd60f^`t!hZ~+@Q1HQ12`IRo=PsrPkB(?OqojNt&g&N8=i=?pJkd zz6)Zd&u3m!=ABz)tMqxfN_F@;l^JXYKCZuPacO}T>p>j`zsEYx2AmFu3|0%AVVq!c rN{OYI!OYQ__lt?e(XPuRq~pP>x_=U|{fc^>bP0l+XkK*5GwK literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/walls/tungsten-wall-large.png b/core/assets-raw/sprites/blocks/walls/tungsten-wall-large.png index 4c21bf939cb6e9001a018652b8a7b94bebd79279..d5a14f7432ad99ede4cb906bcb45d7f428d02944 100644 GIT binary patch delta 754 zcmX@iHl1yPVf{r<7srr_Id5mZ^<_5XX^ZF5xv(m!@lgNd2o@EAB>p2DIV}mIDlChH z8%m@_ew2n*KRH~Mv)rZj|H0U#`;al z*7*bz!>u+4CWbBCjXVq)!iNO6GqN{@i7mV}<;H9s`?wpuD=yVb7|yX%`KHFOVYPrt z?#|q6h6&ddDjIKdHSK0PSo}&RCg$Eh%~tW{&zBsV?RebUIUx5rQ?dbXklUdh$>&R% zkC(k`PrS-#*(@iZvMpHP21Aj2Cg;IJW~&7jNxj&0RID_!;BJp=&~3}kWeisZ7wBx} z$<=kAD#_rWzBX!E+JOSY`Y(UJoG5c!tY4_QBGcjXW6RpE>r63Ac_PJJG&zEHKavnI zzER3uq^cRn;lx?;t?s~$0u86-Mh<*@sxNHqZ6Ce*mG;)Tlh6PBuJ#Mf`~Dv(DVy~6 z!Ryt>YwZ4h{{OS4>*{yIU;m2#+MhZx>2t4Y{P z+s!i8UGaX}FLr?>hf^F&9VQ-Q;pGtd@8P&%iG=3N#i|FVMA=T-+`!W0<~7CP!IX1p zOE;w1Cd>@;z0UOCv6^A4?25Iv4Y&BNT$6LiWzRZY;~(HW?RHWM!!^-JpKGEToDJ^2 za+8irscv-XVK9@t0)0&TYFCG{_Ieqmj@69qU zr;GCzlw^3{<}pmX!7no}^rpzyeQvugb)C+~Y(JWPSMl6id#@#RHgUm=vWu>%-E?c) z(e!4q?89@kI^W)~J~(?(a;B_L!1V3Y*cBgJB-NQ|ygdB*+@_Z|6Fj5!Io9Yr_^T)< za3k|VwMMkF0_(y5DtQdK?_wIPlV&k9d{8jqWLV&wA;#d)e8Gf4f&Za+jCS*bf2aSv RWME)m@O1TaS?83{1OR0oSTO(q delta 799 zcmbQvc9?B~Vf|lE7srr_Id7wG`>GfU=zLRXbk!D`@ibXQ=%I?hE*rlV2RDu&N2m51 z91gR19=yvA+kLG6m0bDxq}bX%`Mc{fzaRc~@%`=H`#l!C-yITc9PvbI{(SSesxxgm zj1Iq5L^v64sWmDwWK3t7#jwCvsBbB=iprHPr8PdidyYQ)>Smp}Fita&pjxu?zXn9!k4 z+t+NJZ!Yx>^uWdb7dR;s-b^3x^Oly=5 zY&l`nw{?q_F;jz8;#DIP=K8jy7akwp8!=O=c%|{dSxi}aaYoB`iA_*aKVhVJYT|;a ztG_X7HrC$1ICBY`q0q7kdUpIAtjBFi^q8icNSt%;@nPF_>+-i*`5f&3T3IiiEzxGK zOdmr+b;Sl?i76Z<%YwA}N8ZY*LVw`s@(GEBe!Duk3O$*USsL4vGCW|A9Dh1CvO&ez`L?<+17^d z){eYq&eyYK+mvrsaTH;_@x>@)$28T9l<5I~tL}Wtk38WgG(p=XsL3Yl=dDdw%bUg0 z&N(StUseAVWa6^6n{(Tqt$R2)|8hKK-Xm{axi8Xeuk;+FYuzk?A|K*9*f}2=yvRLu zO(nqZgSF!;huOO&Cq?-bvoIJ5%~D}_;F&Rvp+R|JCR2li5$At~Mv3J){=0=N85kHC NJYD@<);T3K0RStQZleGI diff --git a/core/assets-raw/sprites/blocks/walls/tungsten-wall.png b/core/assets-raw/sprites/blocks/walls/tungsten-wall.png index e9c0c18e3327505e2dbec2a393f1b540ece2fc45..1e57bcea46bd1fa2f83fd4df5178e966421f42bf 100644 GIT binary patch delta 242 zcmZ3;G@EIHVf|H47srr@*0<9P`I-%QTxG8;zQDRtym4Z6h^^E6jw!8oRC89eKB!?X zn^xhn?dy-9o8I1=pTA`Oi(S)n7T>J>sAFn;{fJI3w@7$ooaRFcf+ws+aH{IIESB2o$W%7NAG%$!Uw0SrXAbBV42@s z!GC27+XV(G2JQ*UJ|X8n-W9kcQOIo~Aa&oqVT#%Wm1|+#SD6#8um)V zl37gPjli_Fg3Ehcj+x&M`Y)?C+aT0+bEuEwjD4&UN7(Q0j%!tSaNNegz`)??>gTe~ HDWM4f;`VIj diff --git a/core/assets/logicids.dat b/core/assets/logicids.dat index ee0c940a982a5d3ee1126bf196b369f30120676f..e5d28945ab60d183b36ced6f914f2e40041cdfa1 100644 GIT binary patch delta 32 ncmew;+bGAxaA_k`A`d@bNn&2MZenq9YHm_aYSHE-o_;0(vl|Nv delta 16 XcmZpa`zXuAaB(A3BG2Yxo<1f3Fpvdf diff --git a/core/src/mindustry/ai/types/CargoAI.java b/core/src/mindustry/ai/types/CargoAI.java index bc5aca07f6..f9572b9c3f 100644 --- a/core/src/mindustry/ai/types/CargoAI.java +++ b/core/src/mindustry/ai/types/CargoAI.java @@ -29,6 +29,8 @@ public class CargoAI extends AIController{ var build = tether.building(); + if(build.items == null) return; + //empty, approach the loader, even if there's nothing to pick up (units hanging around doing nothing looks bad) if(!unit.hasItem()){ moveTo(build, moveRange, moveSmoothing); diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 7e825d8968..3a9084657c 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -3312,10 +3312,13 @@ public class Blocks{ //endregion //region units - erekir + //TODO completely unfinished tankAssembler = new UnitAssembler("tank-assembler"){{ + requirements(Category.units, with(Items.graphite, 10)); size = 3; output = UnitTypes.vanquish; - requirements = BlockStack.list(Blocks.thoriumWallLarge, 4); + droneType = UnitTypes.manifold; + requirements = BlockStack.list(Blocks.thoriumWallLarge, 4, Blocks.duct, 2); }}; //endregion diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 929e6c6496..697e9830d8 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -2691,6 +2691,7 @@ public class UnitTypes{ itemCapacity = 0; commandLimit = 0; hidden = true; + internal = true; }}; manifold = new UnitType("manifold"){{ diff --git a/core/src/mindustry/type/BlockSeq.java b/core/src/mindustry/type/BlockSeq.java new file mode 100644 index 0000000000..e5fc203b6e --- /dev/null +++ b/core/src/mindustry/type/BlockSeq.java @@ -0,0 +1,65 @@ +package mindustry.type; + +import arc.struct.*; +import arc.util.io.*; +import mindustry.*; +import mindustry.world.*; + +public class BlockSeq{ + private ObjectIntMap blocks = new ObjectIntMap<>(); + + public void add(Block block){ + blocks.increment(block); + } + + public void add(Block block, int amount){ + blocks.increment(block, amount); + } + + public void remove(Block block){ + add(block, -1); + } + + public void remove(Block block, int amount){ + add(block, -amount); + } + + public void remove(Seq stacks){ + stacks.each(b -> remove(b.block, b.amount)); + } + + public void clear(){ + blocks.clear(); + } + + public int get(Block block){ + return blocks.get(block); + } + + public boolean contains(Seq stacks){ + return !stacks.contains(b -> get(b.block) < b.amount); + } + + public boolean contains(Block block, int amount){ + return get(block) >= amount; + } + + public boolean contains(BlockStack stack){ + return get(stack.block) >= stack.amount; + } + + public void write(Writes write){ + write.s(blocks.size); + for(var entry : blocks.entries()){ + write.s(entry.key.id); + write.i(entry.value); + } + } + + public void read(Reads read){ + short amount = read.s(); + for(int i = 0; i < amount; i++){ + blocks.put(Vars.content.block(read.s()), read.i()); + } + } +} diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index f344fadcec..1629be8746 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -156,6 +156,7 @@ public class UnitType extends UnlockableContent{ public boolean singleTarget = false; public boolean forceMultiTarget = false; public boolean hidden = false; + public boolean internal = false; //for crawlers public int segments = 0; diff --git a/core/src/mindustry/ui/ItemImage.java b/core/src/mindustry/ui/ItemImage.java index e0a4ce0b17..e80b8804a5 100644 --- a/core/src/mindustry/ui/ItemImage.java +++ b/core/src/mindustry/ui/ItemImage.java @@ -44,4 +44,8 @@ public class ItemImage extends Stack{ })); } } + + public ItemImage(BlockStack stack){ + this(stack.block.uiIcon, stack.amount); + } } diff --git a/core/src/mindustry/world/blocks/defense/BuildTurret.java b/core/src/mindustry/world/blocks/defense/BuildTurret.java index 53a208df74..aaa1425a97 100644 --- a/core/src/mindustry/world/blocks/defense/BuildTurret.java +++ b/core/src/mindustry/world/blocks/defense/BuildTurret.java @@ -47,6 +47,7 @@ public class BuildTurret extends BaseTurret{ //this is super hacky, but since blocks are initialized before units it does not run into init/concurrent modification issues unitType = new UnitType("turret-unit-" + name){{ hidden = true; + internal = true; speed = 0f; hitSize = 0f; health = 1; diff --git a/core/src/mindustry/world/blocks/distribution/Duct.java b/core/src/mindustry/world/blocks/distribution/Duct.java index cf023c2cc2..229a717fb6 100644 --- a/core/src/mindustry/world/blocks/distribution/Duct.java +++ b/core/src/mindustry/world/blocks/distribution/Duct.java @@ -124,6 +124,11 @@ public class Duct extends Block implements Autotiler{ Draw.reset(); } + @Override + public void payloadDraw(){ + Draw.rect(fullIcon, x, y); + } + protected void drawAt(float x, float y, int bits, float rotation, SliceMode slice){ Draw.z(Layer.blockUnder); Draw.rect(sliced(botRegions[bits], slice), x, y, rotation); diff --git a/core/src/mindustry/world/blocks/units/UnitAssembler.java b/core/src/mindustry/world/blocks/units/UnitAssembler.java index 5617930bda..4cc31aac30 100644 --- a/core/src/mindustry/world/blocks/units/UnitAssembler.java +++ b/core/src/mindustry/world/blocks/units/UnitAssembler.java @@ -1,14 +1,21 @@ package mindustry.world.blocks.units; +import arc.*; +import arc.graphics.g2d.*; +import arc.math.*; import arc.math.geom.*; import arc.struct.*; import arc.util.*; import arc.util.io.*; import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; +import mindustry.ui.*; import mindustry.world.blocks.payloads.*; +import mindustry.world.consumers.*; import static mindustry.Vars.*; @@ -20,13 +27,13 @@ import static mindustry.Vars.*; * 3. * */ public class UnitAssembler extends PayloadBlock{ - public int areaSize = 10; + public int areaSize = 11; public UnitType droneType; public int dronesCreated = 4; //TODO should be different for every tier. public Seq requirements = new Seq<>(); - public UnitType output = UnitTypes.vanquish; + public UnitType output; public UnitAssembler(String name){ super(name); @@ -48,21 +55,62 @@ public class UnitAssembler extends PayloadBlock{ Tmp.r1.x += Geometry.d4x(rotation) * len; Tmp.r1.y += Geometry.d4y(rotation) * len; - //TODO better visuals here? + //TODO better visuals here? dashLine looks bad Drawf.dashRect(valid ? Pal.accent : Pal.remove, Tmp.r1); } + @Override + public void setBars(){ + super.setBars(); + + //TODO progress bar + //bars.add("progress", (UnitAssemblerBuild e) -> new Bar("bar.progress", Pal.ammo, e::fraction)); + + bars.add("units", (UnitAssemblerBuild e) -> + new Bar(() -> + Core.bundle.format("bar.unitcap", + Fonts.getUnicodeStr(output.name), + e.team.data().countType(output), + Units.getStringCap(e.team) + ), + () -> Pal.power, + () -> (float)e.team.data().countType(output) / Units.getCap(e.team) + )); + } + + @Override + public void drawRequestRegion(BuildPlan plan, Eachable list){ + Draw.rect(region, plan.drawx(), plan.drawy()); + //Draw.rect(outRegion, plan.drawx(), plan.drawy(), plan.rotation * 90); + Draw.rect(topRegion, plan.drawx(), plan.drawy()); + } + + @Override + public void init(){ + consumes.add(new ConsumePayloads(requirements, (UnitAssemblerBuild build) -> build.blocks)); + + super.init(); + } + public class UnitAssemblerBuild extends PayloadBlockBuild{ public Seq units = new Seq<>(); + public BlockSeq blocks = new BlockSeq(); - //TODO how should payloads be stored? counts of blocks? intmap? references? - //public Seq payloads = new Seq<>(); + //TODO progress + //TODO how should payloads be stored exactly? counts of blocks? intmap? references? + + public Vec2 getUnitSpawn(){ + float len = tilesize * (areaSize + size)/2f; + float unitX = x + Geometry.d4x(rotation) * len, unitY = y + Geometry.d4y(rotation) * len; + return Tmp.v4.set(unitX, unitY); + } @Override public void updateTile(){ units.removeAll(u -> !u.isAdded() || u.dead); - if(consValid() && units.size < dronesCreated){ + //units annoying, disabled for now + if(false && efficiency() > 0 && units.size < dronesCreated){ //TODO build animation? distribute spawning? var unit = droneType.create(team); if(unit instanceof BuildingTetherc bt){ @@ -76,29 +124,88 @@ public class UnitAssembler extends PayloadBlock{ units.add(unit); } + //TODO units should move stuff into position + + //TODO check if area is occupied + + Vec2 spawn = getUnitSpawn(); + + //check if all requirements are met + if(consValid() & Units.canCreate(team, output)){ + + //TODO ???? should this even be part of a trigger + consume(); + + //TODO actually just goes poof + var unit = output.create(team); + unit.set(spawn.x + Mathf.range(0.001f), spawn.y + Mathf.range(0.001f)); + unit.rotation = 90f; + unit.add(); + + Fx.spawn.at(unit); + + blocks.clear(); + } + //TODO drones need to indicate that they are in position and actually play an animation } + @Override + public void draw(){ + Draw.rect(region, x, y); + //Draw.rect(outRegion, x, y, rotdeg()); + + Draw.z(Layer.blockOver); + + //payRotation = rotdeg(); + //drawPayload(); + + Draw.z(Layer.blockOver + 0.1f); + + Draw.rect(topRegion, x, y); + + Vec2 spawn = getUnitSpawn(); + + //TODO which layer? + Draw.z(Layer.power - 1f); + + Draw.mixcol(Pal.accent, 1f); + Draw.alpha(0.4f + Mathf.absin(10f, 0.2f)); + Draw.rect(output.fullIcon, spawn.x, spawn.y); + Draw.reset(); + } + @Override public void handlePayload(Building source, Payload payload){ //super.handlePayload(source, payload); + blocks.add(((BuildPayload)payload).block()); + //payloads.add((BuildPayload)payload); } @Override public boolean acceptPayload(Building source, Payload payload){ - return payload instanceof BuildPayload bp && requirements.contains(b -> b.block == bp.block()); + return payload instanceof BuildPayload bp && requirements.contains(b -> b.block == bp.block() && blocks.get(bp.block()) < b.amount); } @Override public void write(Writes write){ super.write(write); + + //blocks.write(write); + + //TODO save: + //- unit IDs + //- progress + //- payloads in position (should they have positions?) } @Override public void read(Reads read, byte revision){ super.read(read, revision); + + //blocks.read(read); } } } diff --git a/core/src/mindustry/world/consumers/ConsumeItems.java b/core/src/mindustry/world/consumers/ConsumeItems.java index 90f1c4fd85..fb1e6a7b45 100644 --- a/core/src/mindustry/world/consumers/ConsumeItems.java +++ b/core/src/mindustry/world/consumers/ConsumeItems.java @@ -37,7 +37,7 @@ public class ConsumeItems extends Consume{ int i = 0; for(var stack : items){ c.add(new ReqImage(new ItemImage(stack.item.uiIcon, stack.amount), - () -> build.items != null && build.items.has(stack.item, stack.amount))).padRight(8); + () -> build.items.has(stack.item, stack.amount))).padRight(8); if(++i % 4 == 0) c.row(); } }).left(); diff --git a/core/src/mindustry/world/consumers/ConsumePayloads.java b/core/src/mindustry/world/consumers/ConsumePayloads.java new file mode 100644 index 0000000000..b45cfae90a --- /dev/null +++ b/core/src/mindustry/world/consumers/ConsumePayloads.java @@ -0,0 +1,62 @@ +package mindustry.world.consumers; + +import arc.func.*; +import arc.scene.ui.layout.*; +import arc.struct.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.meta.*; + +public class ConsumePayloads extends Consume{ + //TODO bad, should be part of Building + dynamic + protected Func inventory; + + public Seq payloads; + + public ConsumePayloads(Seq payloads, Func inventory){ + this.payloads = payloads; + this.inventory = (Func)inventory; + } + + @Override + public boolean valid(Building build){ + return inventory.get(build).contains(payloads); + } + + @Override + public void trigger(Building build){ + inventory.get(build).remove(payloads); + } + + @Override + public void display(Stats stats){ + //TODO + + for(var stack : payloads){ + stats.add(Stat.input, t -> { + t.add(new ItemImage(stack)); + t.add(stack.block.localizedName).padLeft(4).padRight(4); + }); + } + } + + @Override + public void build(Building build, Table table){ + var inv = inventory.get(build); + + table.table(c -> { + int i = 0; + for(var stack : payloads){ + c.add(new ReqImage(new ItemImage(stack.block.uiIcon, stack.amount), + () -> inv.contains(stack.block, stack.amount))).padRight(8); + if(++i % 4 == 0) c.row(); + } + }).left(); + } + + @Override + public ConsumeType type(){ + return ConsumeType.payload; + } +} diff --git a/core/src/mindustry/world/consumers/ConsumeType.java b/core/src/mindustry/world/consumers/ConsumeType.java index 9a68a050cc..d6cd64a735 100644 --- a/core/src/mindustry/world/consumers/ConsumeType.java +++ b/core/src/mindustry/world/consumers/ConsumeType.java @@ -3,5 +3,6 @@ package mindustry.world.consumers; public enum ConsumeType{ item, power, - liquid + liquid, + payload } diff --git a/tools/src/mindustry/tools/Generators.java b/tools/src/mindustry/tools/Generators.java index 544b747f02..13acaba85f 100644 --- a/tools/src/mindustry/tools/Generators.java +++ b/tools/src/mindustry/tools/Generators.java @@ -486,7 +486,7 @@ public class Generators{ }); generate("unit-icons", () -> content.units().each(type -> { - if(type.isHidden()) return; //hidden units don't generate + if(type.internal) return; //internal hidden units don't generate ObjectSet outlined = new ObjectSet<>();