1010import de .srendi .advancedperipherals .common .smartglasses .modules .IModule ;
1111import de .srendi .advancedperipherals .common .smartglasses .modules .IModuleItem ;
1212import de .srendi .advancedperipherals .common .smartglasses .modules .ModulePeripheral ;
13+ import net .minecraft .core .BlockPos ;
1314import net .minecraft .nbt .CompoundTag ;
1415import net .minecraft .resources .ResourceLocation ;
1516import net .minecraft .server .level .ServerLevel ;
16- import net .minecraft .server .level .ServerPlayer ;
1717import net .minecraft .world .entity .Entity ;
1818import net .minecraft .world .entity .item .ItemEntity ;
1919import net .minecraft .world .entity .player .Inventory ;
2020import net .minecraft .world .entity .player .Player ;
2121import net .minecraft .world .item .ItemStack ;
2222import org .jetbrains .annotations .NotNull ;
2323
24- import javax . annotation . Nullable ;
24+ import com . google . common . collect . ImmutableMap ;
2525import java .util .Collections ;
2626import java .util .HashMap ;
2727import java .util .HashSet ;
2828import java .util .Map ;
2929import java .util .Set ;
30+ import javax .annotation .Nullable ;
3031
3132/**
3233 * Basically just a {@link dan200.computercraft.shared.pocket.core.PocketServerComputer} but with some changes
@@ -40,20 +41,18 @@ public class SmartGlassesComputer extends ServerComputer implements IPocketAcces
4041 @ Nullable
4142 private SmartGlassesItemHandler itemHandler = null ;
4243 @ NotNull
43- private final ModulePeripheral peripheral ;
44+ private final ModulePeripheral modulePeripheral ;
4445
45- private int lightColour = -1 ;
46- private boolean lightChanged = false ;
47- private boolean isDirty = false ;
46+ private boolean isDirty = true ;
4847
49- private final Set < ServerPlayer > tracking = new HashSet <> ();
48+ private Map < ResourceLocation , IPeripheral > upgrades = Collections . emptyMap ();
5049 private final Map <Integer , IModule > modules = new HashMap <>();
5150
5251 public SmartGlassesComputer (ServerLevel world , int computerID , @ Nullable String label , ComputerFamily family ) {
5352 super (world , computerID , label , family , 39 , 13 );
5453 this .addAPI (new SmartGlassesAPI ());
55- peripheral = new ModulePeripheral (this );
56- this .setPeripheral (ComputerSide .BACK , peripheral );
54+ this . modulePeripheral = new ModulePeripheral (this );
55+ this .setPeripheral (ComputerSide .BACK , this . modulePeripheral );
5756 }
5857
5958 @ Nullable
@@ -65,7 +64,7 @@ public Entity getEntity() {
6564
6665 if (entity instanceof Player player ) {
6766 Inventory inventory = player .getInventory ();
68- if (inventory .items . contains ( stack ) || inventory . armor . contains ( stack ) || inventory . offhand . contains (stack )) {
67+ if (inventory .contains (stack )) {
6968 return player ;
7069 }
7170 return null ;
@@ -76,6 +75,16 @@ public Entity getEntity() {
7675 return null ;
7776 }
7877
78+ @ Override
79+ public ServerLevel getLevel () {
80+ return this .entity == null ? super .getLevel () : (ServerLevel ) this .entity .getCommandSenderWorld ();
81+ }
82+
83+ @ Override
84+ public BlockPos getPosition () {
85+ return this .entity == null ? super .getPosition () : this .entity .blockPosition ();
86+ }
87+
7988 @ Override
8089 public int getColour () {
8190 return 0 ;
@@ -96,20 +105,11 @@ public ItemStack getStack() {
96105
97106 @ Override
98107 public int getLight () {
99- return lightColour ;
108+ return 0 ;
100109 }
101110
102111 @ Override
103112 public void setLight (int colour ) {
104- if (colour < 0 || colour > 0xFFFFFF ) {
105- colour = -1 ;
106- }
107-
108- if (lightColour == colour ) {
109- return ;
110- }
111- lightColour = colour ;
112- lightChanged = true ;
113113 }
114114
115115 public void setItemHandler (@ Nullable SmartGlassesItemHandler itemHandler ) {
@@ -139,34 +139,35 @@ public void updateUpgradeNBTData() {
139139
140140 @ Override
141141 public void invalidatePeripheral () {
142+ updatePeripheralsAndModules (this .itemHandler );
142143 }
143144
144145 @ Override
145146 @ NotNull
146147 public Map <ResourceLocation , IPeripheral > getUpgrades () {
147- return Collections . emptyMap () ;
148+ return this . upgrades ;
148149 }
149150
151+ @ Override
150152 public void setPeripheral (ComputerSide side , IPeripheral peripheral ) {
151153 super .setPeripheral (side , peripheral );
152154 }
153155
154156 public void updatePeripheralsAndModules (SmartGlassesItemHandler itemHandler ) {
155- for (int slot = 0 ; slot < 5 ; slot ++) {
157+ Set <ResourceLocation > upgradesIdSet = new HashSet <>();
158+ ImmutableMap .Builder <ResourceLocation , IPeripheral > upgradesBuilder = new ImmutableMap .Builder <>();
159+ for (int slot = 0 ; slot < SmartGlassesItemHandler .PERIPHERAL_SLOTS ; slot ++) {
160+ ComputerSide side = SmartGlassesSlot .indexToSide (slot );
156161 ItemStack peripheralItem = itemHandler .getStackInSlot (slot );
157- if (!peripheralItem .isEmpty ()) {
158- IPocketUpgrade upgrade = PocketUpgrades .instance ().get (peripheralItem );
159- if (upgrade != null ) {
160- IPeripheral peripheral = upgrade .createPeripheral (smartGlassesAccess );
161- if (peripheral != null ) {
162- setPeripheral (SmartGlassesSlot .indexToSide (slot ), peripheral );
163- continue ;
164- }
165- }
162+ IPocketUpgrade upgrade = PocketUpgrades .instance ().get (peripheralItem );
163+ IPeripheral peripheral = upgrade != null ? upgrade .createPeripheral (smartGlassesAccess ) : null ;
164+ setPeripheral (side , peripheral );
165+ if (peripheral != null && upgradesIdSet .add (upgrade .getUpgradeID ())) {
166+ upgradesBuilder .put (upgrade .getUpgradeID (), peripheral );
166167 }
167- setPeripheral (SmartGlassesSlot .indexToSide (slot ), null );
168168 }
169- for (int slot = 5 ; slot < 11 ; slot ++) {
169+ this .upgrades = upgradesBuilder .build ();
170+ for (int slot = SmartGlassesItemHandler .PERIPHERAL_SLOTS ; slot < SmartGlassesItemHandler .SLOTS ; slot ++) {
170171 ItemStack peripheralItem = itemHandler .getStackInSlot (slot );
171172 IModule oldModule = modules .get (slot );
172173 if (!peripheralItem .isEmpty () && peripheralItem .getItem () instanceof IModuleItem module ) {
@@ -175,32 +176,25 @@ public void updatePeripheralsAndModules(SmartGlassesItemHandler itemHandler) {
175176 continue ;
176177 }
177178 modules .put (slot , newModule );
178- peripheral .updateModules ();
179- setPeripheral (ComputerSide .BACK , null );
180- setPeripheral (ComputerSide .BACK , peripheral );
181179 } else if (oldModule != null ) {
182180 oldModule .onUnequipped (smartGlassesAccess );
183181 modules .remove (slot );
184182 }
185183 }
184+ this .modulePeripheral .updateModules ();
185+ setPeripheral (ComputerSide .BACK , null );
186+ setPeripheral (ComputerSide .BACK , this .modulePeripheral );
187+ if (this .entity instanceof Player player ) {
188+ player .getInventory ().setChanged ();
189+ }
186190 }
187191
188192 @ Override
189193 public void tickServer () {
190194 super .tickServer ();
191195
192- // Find any players which have gone missing and remove them from the tracking list.
193- tracking .removeIf (player -> !player .isAlive () || player .level != getLevel ());
194-
195- // And now find any new players, add them to the tracking list, and broadcast state where appropriate.
196- boolean sendState = hasOutputChanged () || lightChanged ;
197- lightChanged = false ;
198- if (sendState ) {
199- tracking .addAll (getLevel ().players ());
200- }
201-
202196 if (isDirty ()) {
203- updatePeripheralsAndModules ( this . itemHandler );
197+ invalidatePeripheral ( );
204198 isDirty = false ;
205199 }
206200
@@ -210,14 +204,21 @@ public void tickServer() {
210204 }
211205
212206 public void setEntity (@ Nullable Entity entity ) {
207+ if (this .entity == entity ) {
208+ return ;
209+ }
213210 this .entity = entity ;
211+ if (entity == null ) {
212+ return ;
213+ }
214+ this .setLevel ((ServerLevel ) this .entity .getCommandSenderWorld ());
215+ this .setPosition (this .entity .blockPosition ());
214216 }
215217
216218 public Map <Integer , IModule > getModules () {
217219 return modules ;
218220 }
219221
220-
221222 @ Override
222223 protected void onRemoved () {
223224 super .onRemoved ();
0 commit comments