Skip to content

Commit 7f32526

Browse files
committed
Add screen size functions which are synced from the client to the server
1 parent f827740 commit 7f32526

File tree

7 files changed

+152
-12
lines changed

7 files changed

+152
-12
lines changed

src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
import de.srendi.advancedperipherals.AdvancedPeripherals;
44
import de.srendi.advancedperipherals.common.network.base.IPacket;
5+
import de.srendi.advancedperipherals.common.network.toclient.OverlayModuleClientRequestPacket;
56
import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectBulkSyncPacket;
67
import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectClearPacket;
78
import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectDeletePacket;
89
import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectSyncPacket;
910
import de.srendi.advancedperipherals.common.network.toclient.SaddleTurtleInfoPacket;
1011
import de.srendi.advancedperipherals.common.network.toclient.ToastToClientPacket;
1112
import de.srendi.advancedperipherals.common.network.toserver.GlassesHotkeyPacket;
13+
import de.srendi.advancedperipherals.common.network.toserver.OverlayModuleClientInfoPacket;
1214
import de.srendi.advancedperipherals.common.network.toserver.SaddleTurtleControlPacket;
1315
import net.minecraft.core.BlockPos;
1416
import net.minecraft.network.FriendlyByteBuf;
@@ -44,8 +46,11 @@ public static void init() {
4446
registerServerToClient(RenderableObjectDeletePacket.class, RenderableObjectDeletePacket::decode);
4547
registerServerToClient(RenderableObjectClearPacket.class, RenderableObjectClearPacket::decode);
4648
registerServerToClient(RenderableObjectBulkSyncPacket.class, RenderableObjectBulkSyncPacket::decode);
49+
registerServerToClient(OverlayModuleClientRequestPacket.class, OverlayModuleClientRequestPacket::decode);
50+
4751
registerClientToServer(GlassesHotkeyPacket.class, GlassesHotkeyPacket::decode);
4852
registerClientToServer(SaddleTurtleControlPacket.class, SaddleTurtleControlPacket::decode);
53+
registerClientToServer(OverlayModuleClientInfoPacket.class, OverlayModuleClientInfoPacket::decode);
4954
}
5055

5156
public static <MSG extends IPacket> void registerServerToClient(Class<MSG> packet, Function<FriendlyByteBuf, MSG> decode) {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package de.srendi.advancedperipherals.common.network.toclient;
2+
3+
import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder;
4+
import de.srendi.advancedperipherals.common.addons.minecolonies.MineColonies;
5+
import de.srendi.advancedperipherals.common.network.APNetworking;
6+
import de.srendi.advancedperipherals.common.network.base.IPacket;
7+
import de.srendi.advancedperipherals.common.network.toserver.OverlayModuleClientInfoPacket;
8+
import net.minecraft.client.Minecraft;
9+
import net.minecraft.network.FriendlyByteBuf;
10+
import net.minecraftforge.network.NetworkEvent;
11+
12+
public class OverlayModuleClientRequestPacket implements IPacket {
13+
14+
public OverlayModuleClientRequestPacket() {
15+
16+
}
17+
18+
@Override
19+
public void handle(NetworkEvent.Context context) {
20+
Minecraft minecraft = Minecraft.getInstance();
21+
22+
int sizeX = minecraft.getWindow().getWidth(), sizeY = minecraft.getWindow().getHeight();
23+
double guiScale = minecraft.getWindow().getGuiScale();
24+
25+
APNetworking.sendToServer(new OverlayModuleClientInfoPacket(minecraft.player.getUUID(), sizeX, sizeY, guiScale));
26+
}
27+
28+
@Override
29+
public void encode(FriendlyByteBuf buffer) {
30+
31+
}
32+
33+
public static OverlayModuleClientRequestPacket decode(FriendlyByteBuf buffer) {
34+
return new OverlayModuleClientRequestPacket();
35+
}
36+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package de.srendi.advancedperipherals.common.network.toserver;
2+
3+
import de.srendi.advancedperipherals.common.items.SmartGlassesItem;
4+
import de.srendi.advancedperipherals.common.network.base.IPacket;
5+
import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesComputer;
6+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule;
7+
import net.minecraft.network.FriendlyByteBuf;
8+
import net.minecraft.server.MinecraftServer;
9+
import net.minecraft.server.level.ServerPlayer;
10+
import net.minecraft.world.item.ItemStack;
11+
import net.minecraftforge.network.NetworkEvent;
12+
import net.minecraftforge.server.ServerLifecycleHooks;
13+
14+
import java.util.UUID;
15+
16+
public class OverlayModuleClientInfoPacket implements IPacket {
17+
18+
private final UUID player;
19+
private final int screenWidth;
20+
private final int screenHeight;
21+
private final double guiScale;
22+
23+
public OverlayModuleClientInfoPacket(UUID player, int screenWidth, int screenHeight, double guiScale) {
24+
this.player = player;
25+
this.screenWidth = screenWidth;
26+
this.screenHeight = screenHeight;
27+
this.guiScale = guiScale;
28+
}
29+
30+
@Override
31+
public void handle(NetworkEvent.Context context) {
32+
MinecraftServer server = ServerLifecycleHooks.getCurrentServer();
33+
34+
ServerPlayer serverPlayer = server.getPlayerList().getPlayer(player);
35+
if (serverPlayer == null)
36+
return;
37+
38+
for (ItemStack stack : serverPlayer.getAllSlots()) {
39+
if (stack.getItem() instanceof SmartGlassesItem) {
40+
SmartGlassesComputer computer = SmartGlassesItem.getServerComputer(server, stack);
41+
42+
if (computer != null) {
43+
OverlayModule module = computer.getModule(OverlayModule.class);
44+
45+
if (module != null)
46+
module.setScreenSizes(screenWidth, screenHeight, guiScale);
47+
}
48+
}
49+
}
50+
}
51+
52+
@Override
53+
public void encode(FriendlyByteBuf buffer) {
54+
buffer.writeUUID(player);
55+
buffer.writeInt(screenWidth);
56+
buffer.writeInt(screenHeight);
57+
buffer.writeDouble(guiScale);
58+
}
59+
60+
public static OverlayModuleClientInfoPacket decode(FriendlyByteBuf buffer) {
61+
return new OverlayModuleClientInfoPacket(buffer.readUUID(), buffer.readInt(), buffer.readInt(), buffer.readDouble());
62+
}
63+
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,11 @@ public Map<Integer, IModule> getModules() {
247247
return modules;
248248
}
249249

250+
@Nullable
251+
public <T extends IModule> T getModule(Class<T> module) {
252+
return modules.values().stream().filter(module::isInstance).map(module::cast).findFirst().orElse(null);
253+
}
254+
250255
@Override
251256
protected void onRemoved() {
252257
super.onRemoved();

src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@
33
import dan200.computercraft.api.lua.LuaFunction;
44
import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesComputer;
55
import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral;
6+
import org.jetbrains.annotations.NotNull;
67

78
public class ModulePeripheral extends BasePeripheral<ModulePeripheralOwner> {
89

910
public static final String PERIPHERAL_TYPE = "smart_glasses";
1011

1112
public ModulePeripheral(SmartGlassesComputer computer) {
1213
super(PERIPHERAL_TYPE, new ModulePeripheralOwner(computer));
13-
1414
}
1515

1616
public void updateModules() {
17-
// We need to set the initialisation to false so the dynamic peripheral re-builds the plugins
17+
// We need to set the initialization to false so the dynamic peripheral re-builds the plugins
1818
clearAllPlugins();
1919

2020
SmartGlassesComputer computer = getPeripheralOwner().getComputer();
@@ -35,4 +35,9 @@ public boolean isEnabled() {
3535
public final String[] getModules() {
3636
return getPeripheralOwner().getComputer().getModules().values().stream().map(module -> module.getName().toString()).toArray(String[]::new);
3737
}
38+
39+
@LuaFunction(mainThread = true)
40+
public final boolean hasModule(@NotNull String module) {
41+
return getPeripheralOwner().getComputer().getModules().values().stream().anyMatch(m -> m.getName().toString().equals(module));
42+
}
3843
}

src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,14 @@ public final MethodResult getObjectsSize() {
122122
return MethodResult.of(overlayModule.getObjects().size());
123123
}
124124

125-
// TODO: This will crash on dedicated servers
126125
@LuaFunction
127126
public final MethodResult getSize() {
128-
return MethodResult.of(Minecraft.getInstance().getWindow().getWidth(), Minecraft.getInstance().getWindow().getHeight());
127+
return MethodResult.of(overlayModule.getScreenWidth(), overlayModule.getScreenHeight());
128+
}
129+
130+
@LuaFunction
131+
public final MethodResult getGuiScale() {
132+
return MethodResult.of(overlayModule.getGuiScale());
129133
}
130134

131135
@LuaFunction

src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import de.srendi.advancedperipherals.AdvancedPeripherals;
44
import de.srendi.advancedperipherals.common.network.APNetworking;
5+
import de.srendi.advancedperipherals.common.network.toclient.OverlayModuleClientRequestPacket;
56
import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectBulkSyncPacket;
67
import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectClearPacket;
78
import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectDeletePacket;
@@ -11,18 +12,17 @@
1112
import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions;
1213
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject;
1314
import net.minecraft.resources.ResourceLocation;
15+
import net.minecraft.server.level.ServerLevel;
1416
import net.minecraft.server.level.ServerPlayer;
17+
import net.minecraft.world.entity.Entity;
18+
import net.minecraft.world.phys.Vec3;
1519
import org.jetbrains.annotations.NotNull;
1620

1721
import java.util.ArrayList;
1822
import java.util.List;
1923
import java.util.Map;
2024
import java.util.concurrent.ConcurrentHashMap;
2125

22-
/**
23-
* We want to support scripts which were made for the plethora classes. So we call this item the same as the overlay item from plethora
24-
* We'll first add our own implementation for a rendering system and then add the API endpoints for plethora scripts
25-
*/
2626
public class OverlayModule implements IModule {
2727

2828
public final ConcurrentHashMap<Integer, RenderableObject> objects = new ConcurrentHashMap<>();
@@ -32,6 +32,10 @@ public class OverlayModule implements IModule {
3232
public boolean autoUpdate = true;
3333
private int idCounter = 0;
3434

35+
private int screenWidth = 0;
36+
private int screenHeight = 0;
37+
private double guiScale = 1;
38+
3539
public OverlayModule(SmartGlassesAccess access) {
3640
this.access = access;
3741
}
@@ -48,11 +52,29 @@ public IModuleFunctions getFunctions(SmartGlassesAccess smartGlassesAccess) {
4852

4953
@Override
5054
public void tick(@NotNull SmartGlassesAccess smartGlassesAccess) {
51-
/*
55+
5256
Entity entity = smartGlassesAccess.getEntity();
53-
if (entity != null && entity.getLevel().getGameTime() % 20 == 0)
54-
AdvancedPeripherals.LOGGER.info("I'm an overlay module! And I'm alive!");
55-
*/
57+
if (entity instanceof ServerPlayer player && entity.getLevel().getGameTime() % 2 == 0) {
58+
APNetworking.sendTo(new OverlayModuleClientRequestPacket(), player);
59+
}
60+
}
61+
62+
public void setScreenSizes(int screenWidth, int screenHeight, double guiScale) {
63+
this.screenWidth = screenWidth;
64+
this.screenHeight = screenHeight;
65+
this.guiScale = guiScale;
66+
}
67+
68+
public int getScreenWidth() {
69+
return screenWidth;
70+
}
71+
72+
public int getScreenHeight() {
73+
return screenHeight;
74+
}
75+
76+
public double getGuiScale() {
77+
return guiScale;
5678
}
5779

5880
public SmartGlassesAccess getAccess() {

0 commit comments

Comments
 (0)