Skip to content

Commit b5230f1

Browse files
authored
Merge pull request #697 from zyxkad/pick_block-feature
smart glass patch
2 parents 278aab1 + 4731502 commit b5230f1

File tree

3 files changed

+108
-60
lines changed

3 files changed

+108
-60
lines changed

src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import dan200.computercraft.api.ComputerCraftAPI;
66
import dan200.computercraft.api.filesystem.IWritableMount;
77
import dan200.computercraft.api.media.IMedia;
8+
import dan200.computercraft.api.peripheral.IPeripheral;
9+
import dan200.computercraft.api.pocket.IPocketUpgrade;
10+
import dan200.computercraft.shared.PocketUpgrades;
811
import dan200.computercraft.shared.computer.core.ComputerFamily;
912
import dan200.computercraft.shared.computer.core.ServerComputerRegistry;
1013
import dan200.computercraft.shared.computer.core.ServerContext;
@@ -23,6 +26,7 @@
2326
import net.minecraft.core.Direction;
2427
import net.minecraft.nbt.CompoundTag;
2528
import net.minecraft.network.chat.Component;
29+
import net.minecraft.resources.ResourceLocation;
2630
import net.minecraft.server.MinecraftServer;
2731
import net.minecraft.server.level.ServerLevel;
2832
import net.minecraft.world.Container;
@@ -47,6 +51,7 @@
4751
import org.jetbrains.annotations.Nullable;
4852

4953
import java.util.List;
54+
import java.util.Map;
5055

5156
public class SmartGlassesItem extends ArmorItem implements IComputerItem, IMedia {
5257

@@ -83,6 +88,9 @@ public <T> LazyOptional<T> getCapability(@NotNull Capability<T> cap, @Nullable D
8388

8489
private boolean tick(ItemStack stack, Level world, Entity entity, SmartGlassesComputer computer) {
8590
computer.setLevel((ServerLevel) world);
91+
if (entity != null) {
92+
computer.setPosition(entity.blockPosition());
93+
}
8694

8795
boolean changed = false;
8896

@@ -118,16 +126,23 @@ private boolean tick(ItemStack stack, Level world, Entity entity, SmartGlassesCo
118126
computer.setStack(stack);
119127
}
120128

129+
for (Map.Entry<ResourceLocation, IPeripheral> e : computer.getUpgrades().entrySet()) {
130+
IPocketUpgrade upgrade = PocketUpgrades.instance().get(e.getKey().toString());
131+
if (upgrade != null) {
132+
upgrade.update(computer, e.getValue());
133+
}
134+
}
135+
121136
return changed;
122137
}
123138

124139
@Override
125140
public void inventoryTick(@NotNull ItemStack stack, @NotNull Level world, @NotNull Entity entity, int slotNum, boolean selected) {
126141
LazyOptional<IItemHandler> optItemHandler = stack.getCapability(ForgeCapabilities.ITEM_HANDLER);
127142
SmartGlassesItemHandler itemHandler = (SmartGlassesItemHandler) optItemHandler.orElse(null);
128-
for(int slot = 0; slot < itemHandler.getSlots(); slot++) {
143+
for (int slot = 0; slot < itemHandler.getSlots(); slot++) {
129144
ItemStack itemStack = itemHandler.getStackInSlot(slot);
130-
if(itemStack.getItem() instanceof IModuleItem iModuleItem) {
145+
if (itemStack.getItem() instanceof IModuleItem iModuleItem) {
131146
SmartGlassesAccess glassesAccess = null;
132147
IModule module = null;
133148
if (!world.isClientSide) {
@@ -155,7 +170,9 @@ public void inventoryTick(@NotNull ItemStack stack, @NotNull Level world, @NotNu
155170

156171
@Override
157172
public boolean onEntityItemUpdate(ItemStack stack, ItemEntity entity) {
158-
if (entity.level.isClientSide || entity.level.getServer() == null) return false;
173+
if (entity.level.isClientSide || entity.level.getServer() == null) {
174+
return false;
175+
}
159176

160177
SmartGlassesComputer computer = getServerComputer(entity.level.getServer(), stack);
161178
if (computer != null && tick(stack, entity.level, entity, computer)) {

src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java

Lines changed: 49 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,24 @@
1010
import de.srendi.advancedperipherals.common.smartglasses.modules.IModule;
1111
import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleItem;
1212
import de.srendi.advancedperipherals.common.smartglasses.modules.ModulePeripheral;
13+
import net.minecraft.core.BlockPos;
1314
import net.minecraft.nbt.CompoundTag;
1415
import net.minecraft.resources.ResourceLocation;
1516
import net.minecraft.server.level.ServerLevel;
16-
import net.minecraft.server.level.ServerPlayer;
1717
import net.minecraft.world.entity.Entity;
1818
import net.minecraft.world.entity.item.ItemEntity;
1919
import net.minecraft.world.entity.player.Inventory;
2020
import net.minecraft.world.entity.player.Player;
2121
import net.minecraft.world.item.ItemStack;
2222
import org.jetbrains.annotations.NotNull;
2323

24-
import javax.annotation.Nullable;
24+
import com.google.common.collect.ImmutableMap;
2525
import java.util.Collections;
2626
import java.util.HashMap;
2727
import java.util.HashSet;
2828
import java.util.Map;
2929
import 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();

src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
11
package de.srendi.advancedperipherals.common.smartglasses;
22

3+
import dan200.computercraft.api.pocket.IPocketUpgrade;
4+
import dan200.computercraft.shared.PocketUpgrades;
35
import de.srendi.advancedperipherals.common.items.SmartGlassesItem;
6+
import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleItem;
47
import net.minecraft.core.NonNullList;
8+
import net.minecraft.resources.ResourceLocation;
59
import net.minecraft.world.ContainerHelper;
10+
import net.minecraft.world.item.Item;
611
import net.minecraft.world.item.ItemStack;
712
import net.minecraftforge.items.IItemHandlerModifiable;
813
import net.minecraftforge.items.ItemHandlerHelper;
914
import org.jetbrains.annotations.NotNull;
1015
import org.jetbrains.annotations.Nullable;
1116

17+
import java.util.List;
1218
import javax.annotation.Nonnull;
1319

1420
public class SmartGlassesItemHandler implements IItemHandlerModifiable {
1521

16-
private static final int SLOTS = 12;
22+
public static final int SLOTS = 11;
23+
public static final int PERIPHERAL_SLOTS = 5;
1724

1825
private final ItemStack glasses;
1926
@Nullable
@@ -40,7 +47,34 @@ public int getSlotLimit(int slot) {
4047

4148
@Override
4249
public boolean isItemValid(int slot, @NotNull ItemStack stack) {
43-
return !(stack.getItem() instanceof SmartGlassesItem);
50+
if (stack.getItem() instanceof SmartGlassesItem) {
51+
return false;
52+
}
53+
List<ItemStack> items = this.loadItems();
54+
if (slot < PERIPHERAL_SLOTS) {
55+
IPocketUpgrade upgrade = PocketUpgrades.instance().get(stack);
56+
if (upgrade == null) {
57+
return false;
58+
}
59+
ResourceLocation id = upgrade.getUpgradeID();
60+
for (int i = 0; i < PERIPHERAL_SLOTS; i++) {
61+
IPocketUpgrade u = PocketUpgrades.instance().get(items.get(i));
62+
if (u != null && u.getUpgradeID().equals(id)) {
63+
return false;
64+
}
65+
}
66+
return true;
67+
}
68+
Item item = stack.getItem();
69+
if (!(item instanceof IModuleItem module)) {
70+
return false;
71+
}
72+
for (int i = PERIPHERAL_SLOTS; i < SLOTS; i++) {
73+
if (items.get(i).getItem() == item) {
74+
return false;
75+
}
76+
}
77+
return true;
4478
}
4579

4680
@Override
@@ -53,15 +87,11 @@ public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate
5387
return stack;
5488
}
5589
ItemStack existing = getStackInSlot(slot);
56-
int limit = getSlotLimit(slot);
57-
5890
if (!existing.isEmpty()) {
59-
if (!ItemHandlerHelper.canItemStacksStack(stack, existing)) {
60-
return stack;
61-
}
62-
limit -= existing.getCount();
91+
return stack;
6392
}
6493

94+
int limit = getSlotLimit(slot);
6595
if (limit <= 0) {
6696
return stack;
6797
}
@@ -117,7 +147,7 @@ public ItemStack getStackInSlot(int slot) {
117147
@Override
118148
public void setStackInSlot(int slot, @NotNull ItemStack stack) {
119149
NonNullList<ItemStack> items = loadItems();
120-
if (stack.equals(items.get(slot))) {
150+
if (ItemStack.isSameItemSameTags(stack, items.get(slot))) {
121151
return;
122152
}
123153
items.set(slot, stack);

0 commit comments

Comments
 (0)