22
33import net .minecraft .client .renderer .GlStateManager ;
44import net .minecraft .item .ItemStack ;
5- import net .minecraftforge . items . IItemHandler ;
5+ import net .minecraft . network . PacketBuffer ;
66
77import com .cleanroommc .modularui .api .widget .Interactable ;
88import com .cleanroommc .modularui .integration .jei .JeiGhostIngredientSlot ;
99import com .cleanroommc .modularui .integration .jei .JeiIngredientProvider ;
10+ import com .cleanroommc .modularui .network .NetworkUtils ;
1011import com .cleanroommc .modularui .screen .GuiScreenWrapper ;
1112import com .cleanroommc .modularui .screen .viewport .GuiContext ;
1213import com .cleanroommc .modularui .theme .WidgetTheme ;
14+ import com .cleanroommc .modularui .value .DynamicValue ;
15+ import com .cleanroommc .modularui .value .sync .SyncHandler ;
1316import com .cleanroommc .modularui .widget .Widget ;
1417import org .jetbrains .annotations .NotNull ;
1518import org .jetbrains .annotations .Nullable ;
1619
20+ import java .io .IOException ;
21+ import java .util .function .Consumer ;
22+ import java .util .function .Supplier ;
23+
1724public class QuantumItemRendererWidget extends Widget <QuantumItemRendererWidget > implements Interactable ,
1825 JeiGhostIngredientSlot <ItemStack >,
1926 JeiIngredientProvider {
2027
21- private final IItemHandler itemHandler ;
28+ private final Supplier <ItemStack > virtualStack ;
29+ private DynamicValue <ItemStack > lockedStack ;
30+ private final SyncHandler syncHandler = new SyncHandler () {
31+
32+ @ Override
33+ public void readOnClient (int id , PacketBuffer buf ) throws IOException {}
34+
35+ @ Override
36+ public void readOnServer (int id , PacketBuffer buf ) throws IOException {
37+ if (id == 0 ) {
38+ lockedStack .setValue (NetworkUtils .readItemStack (buf ));
39+ }
40+ }
41+ };
2242
23- public QuantumItemRendererWidget (IItemHandler itemHandler ) {
24- this .itemHandler = itemHandler ;
43+ public QuantumItemRendererWidget (Supplier <ItemStack > virtualStack ) {
44+ this .virtualStack = virtualStack ;
45+ setSyncHandler (this .syncHandler );
46+ tooltip ().setAutoUpdate (true ).setHasTitleMargin (true );
47+ tooltipBuilder (tooltip -> {
48+ if (!isSynced ()) return ;
49+ ItemStack stack = virtualStack .get ();
50+ if (stack .isEmpty ()) stack = lockedStack .getValue ();
51+ if (stack .isEmpty ()) return ;
52+ tooltip .addStringLines (getScreen ().getScreenWrapper ().getItemToolTip (stack ));
53+ });
2554 }
2655
2756 @ Override
@@ -32,14 +61,15 @@ public void onInit() {
3261 @ NotNull
3362 @ Override
3463 public Result onMousePressed (int mouseButton ) {
35- // todo interaction maybe?
64+ // todo handle locked
3665 return Result .IGNORE ;
3766 }
3867
3968 @ Override
4069 public void draw (GuiContext context , WidgetTheme widgetTheme ) {
4170 // draw stuff
42- ItemStack stack = itemHandler .getStackInSlot (0 );
71+ ItemStack stack = virtualStack .get ();
72+ if (stack .isEmpty ()) stack = lockedStack .getValue ();
4373 if (stack .isEmpty ()) return ;
4474
4575 GuiScreenWrapper screenWrapper = getScreen ().getScreenWrapper ();
@@ -55,7 +85,8 @@ public void draw(GuiContext context, WidgetTheme widgetTheme) {
5585
5686 @ Override
5787 public void setGhostIngredient (@ NotNull ItemStack ingredient ) {
58- // itemHandler.setStackInSlot(0, ingredient);
88+ lockedStack .setValue (ingredient );
89+ this .syncHandler .syncToServer (0 , buffer -> NetworkUtils .writeItemStack (buffer , ingredient ));
5990 }
6091
6192 @ Override
@@ -65,6 +96,11 @@ public void setGhostIngredient(@NotNull ItemStack ingredient) {
6596
6697 @ Override
6798 public @ Nullable Object getIngredient () {
68- return itemHandler .getStackInSlot (0 );
99+ return lockedStack .getValue ();
100+ }
101+
102+ public QuantumItemRendererWidget onLock (Supplier <ItemStack > getter , Consumer <ItemStack > setter ) {
103+ this .lockedStack = new DynamicValue <>(getter , setter );
104+ return this ;
69105 }
70106}
0 commit comments