Skip to content

Commit 7850137

Browse files
committed
feat: Add Teleporter slot
1 parent 056ce7c commit 7850137

File tree

17 files changed

+134
-21
lines changed

17 files changed

+134
-21
lines changed

src/main/java/dev/tonimatas/mekanismcurios/MekanismCurios.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package dev.tonimatas.mekanismcurios;
22

33
import com.mojang.logging.LogUtils;
4+
import dev.tonimatas.mekanismcurios.bridge.PlayerBridge;
45
import dev.tonimatas.mekanismcurios.networking.ModMessages;
6+
import net.minecraft.server.level.ServerPlayer;
57
import net.minecraft.world.InteractionHand;
68
import net.minecraft.world.entity.player.Player;
79
import net.minecraft.world.item.ItemStack;
@@ -20,15 +22,25 @@ public MekanismCurios(FMLJavaModLoadingContext context) {
2022

2123
LOGGER.info("Mekanism Curios initialized successfully.");
2224
}
23-
24-
public static ItemStack getQIO(Player player) {
25+
26+
public static ItemStack getSlot(Player player) {
27+
String slot = ((PlayerBridge) player).mci$getSlot().id();
2528
return CuriosApi.getCuriosInventory(player).map(iCuriosItemHandler ->
26-
iCuriosItemHandler.getCurios().get("qio").getStacks().getStackInSlot(0)).orElse(ItemStack.EMPTY);
29+
iCuriosItemHandler.getCurios().get(slot).getStacks().getStackInSlot(0)).orElse(ItemStack.EMPTY);
30+
}
31+
32+
public static void setSlot(Player player, ItemStack stack) {
33+
if (player instanceof ServerPlayer) {
34+
String slot = ((PlayerBridge) player).mci$getSlot().id();
35+
36+
CuriosApi.getCuriosInventory(player).ifPresent(curiosInventory ->
37+
curiosInventory.setEquippedCurio(slot, 0, stack));
38+
}
2739
}
2840

2941
public static ItemStack getHandOrCuriosItem(Player player, InteractionHand hand) {
3042
if (hand == null) {
31-
return MekanismCurios.getQIO(player);
43+
return MekanismCurios.getSlot(player);
3244
} else {
3345
return player.getItemInHand(hand);
3446
}

src/main/java/dev/tonimatas/mekanismcurios/MekanismCuriosClient.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import dev.tonimatas.mekanismcurios.networking.ModMessages;
44
import dev.tonimatas.mekanismcurios.networking.packet.OpenPortableQIOPacket;
5+
import dev.tonimatas.mekanismcurios.util.CuriosSlots;
56
import dev.tonimatas.mekanismcurios.util.KeyBinding;
67
import net.minecraftforge.api.distmarker.Dist;
78
import net.minecraftforge.client.event.InputEvent;
@@ -15,7 +16,11 @@ public static class ClientForgeEvents {
1516
@SubscribeEvent
1617
public static void onClientTick(InputEvent event) {
1718
while (KeyBinding.PORTABLE_QIO_MAPPING.get().consumeClick()) {
18-
ModMessages.sendToServer(new OpenPortableQIOPacket());
19+
ModMessages.sendToServer(new OpenPortableQIOPacket(CuriosSlots.QIO));
20+
}
21+
22+
while (KeyBinding.PORTABLE_TELEPORTER_MAPPING.get().consumeClick()) {
23+
ModMessages.sendToServer(new OpenPortableQIOPacket(CuriosSlots.TELEPORTER));
1924
}
2025
}
2126
}
@@ -25,6 +30,7 @@ public static class ClientModBusEvents {
2530
@SubscribeEvent
2631
public static void onKeyRegister(RegisterKeyMappingsEvent event) {
2732
event.register(KeyBinding.PORTABLE_QIO_MAPPING.get());
33+
event.register(KeyBinding.PORTABLE_TELEPORTER_MAPPING.get());
2834
}
2935
}
3036
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package dev.tonimatas.mekanismcurios.bridge;
2+
3+
import dev.tonimatas.mekanismcurios.util.CuriosSlots;
4+
5+
public interface PlayerBridge {
6+
void mci$setSlot(CuriosSlots slot);
7+
CuriosSlots mci$getSlot();
8+
}

src/main/java/dev/tonimatas/mekanismcurios/mixins/MekanismItemContainerMixin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class MekanismItemContainerMixin {
2424
@Inject(method = "stillValid", at = @At("HEAD"), cancellable = true)
2525
private void mci$stillValid(Player player, CallbackInfoReturnable<Boolean> cir) {
2626
if (this.hand == null) {
27-
ItemStack curiosStack = MekanismCurios.getQIO(player);
27+
ItemStack curiosStack = MekanismCurios.getSlot(player);
2828
boolean validCurios = !curiosStack.isEmpty() && (curiosStack.is(this.stack.getItem()));
2929
cir.setReturnValue(validCurios);
3030
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package dev.tonimatas.mekanismcurios.mixins;
2+
3+
import dev.tonimatas.mekanismcurios.MekanismCurios;
4+
import mekanism.common.network.to_server.PacketPortableTeleporterTeleport;
5+
import net.minecraft.server.level.ServerPlayer;
6+
import net.minecraft.world.InteractionHand;
7+
import net.minecraft.world.item.ItemStack;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.injection.At;
10+
import org.spongepowered.asm.mixin.injection.Redirect;
11+
12+
@Mixin(PacketPortableTeleporterTeleport.class)
13+
public class PacketPortableTeleporterTeleportMixin {
14+
@Redirect(method = "handle", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;getItemInHand(Lnet/minecraft/world/InteractionHand;)Lnet/minecraft/world/item/ItemStack;"))
15+
private ItemStack mci$handle$getItemInHand(ServerPlayer instance, InteractionHand interactionHand) {
16+
return MekanismCurios.getHandOrCuriosItem(instance, interactionHand);
17+
}
18+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package dev.tonimatas.mekanismcurios.mixins;
2+
3+
import dev.tonimatas.mekanismcurios.bridge.PlayerBridge;
4+
import dev.tonimatas.mekanismcurios.util.CuriosSlots;
5+
import net.minecraft.world.entity.player.Player;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.Unique;
8+
9+
@Mixin(Player.class)
10+
public class PlayerMixin implements PlayerBridge {
11+
@Unique
12+
private CuriosSlots mci$slot = null;
13+
14+
@Override
15+
public void mci$setSlot(CuriosSlots slot) {
16+
this.mci$slot = slot;
17+
}
18+
19+
@Override
20+
public CuriosSlots mci$getSlot() {
21+
return mci$slot;
22+
}
23+
}

src/main/java/dev/tonimatas/mekanismcurios/mixins/PortableQIODashboardContainerMixin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public abstract class PortableQIODashboardContainerMixin {
2222
@Inject(method = "stillValid", at = @At("HEAD"), cancellable = true)
2323
private void mci$stillValid(Player player, CallbackInfoReturnable<Boolean> cir) {
2424
if (this.hand == null) {
25-
ItemStack curiosStack = MekanismCurios.getQIO(player);
25+
ItemStack curiosStack = MekanismCurios.getSlot(player);
2626
boolean validCurios = !curiosStack.isEmpty() && (curiosStack.is(this.stack.getItem()));
2727
cir.setReturnValue(validCurios);
2828
}

src/main/java/dev/tonimatas/mekanismcurios/networking/ModMessages.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ public static void register() {
2626
INSTANCE = net;
2727

2828
net.messageBuilder(OpenPortableQIOPacket.class, id(), NetworkDirection.PLAY_TO_SERVER)
29-
.decoder(OpenPortableQIOPacket::new)
30-
.encoder(OpenPortableQIOPacket::toBytes)
29+
.decoder(OpenPortableQIOPacket::decode)
30+
.encoder(OpenPortableQIOPacket::encode)
3131
.consumerMainThread(OpenPortableQIOPacket::handle)
3232
.add();
3333
}

src/main/java/dev/tonimatas/mekanismcurios/networking/packet/OpenPortableQIOPacket.java

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33

44
import dev.tonimatas.mekanismcurios.MekanismCurios;
5-
import mekanism.common.item.ItemPortableQIODashboard;
5+
import dev.tonimatas.mekanismcurios.bridge.PlayerBridge;
6+
import dev.tonimatas.mekanismcurios.util.CuriosSlots;
7+
import mekanism.common.item.interfaces.IGuiItem;
68
import mekanism.common.util.SecurityUtils;
79
import net.minecraft.network.FriendlyByteBuf;
810
import net.minecraft.server.level.ServerPlayer;
@@ -13,11 +15,19 @@
1315
import java.util.function.Supplier;
1416

1517
public class OpenPortableQIOPacket {
16-
public OpenPortableQIOPacket() {}
17-
18-
public OpenPortableQIOPacket(FriendlyByteBuf buf) {}
18+
private final CuriosSlots slot;
19+
20+
public OpenPortableQIOPacket(CuriosSlots slot) {
21+
this.slot = slot;
22+
}
1923

20-
public void toBytes(FriendlyByteBuf buf) {}
24+
public void encode(FriendlyByteBuf buf) {
25+
buf.writeEnum(slot);
26+
}
27+
28+
public static OpenPortableQIOPacket decode(FriendlyByteBuf buf) {
29+
return new OpenPortableQIOPacket(buf.readEnum(CuriosSlots.class));
30+
}
2131

2232
@SuppressWarnings({"DataFlowIssue", "unused", "UnusedReturnValue"})
2333
public boolean handle(Supplier<NetworkEvent.Context> supplier) {
@@ -26,10 +36,15 @@ public boolean handle(Supplier<NetworkEvent.Context> supplier) {
2636
context.enqueueWork(() -> {
2737
ServerPlayer player = context.getSender();
2838
Level level = player.level();
29-
ItemStack stack = MekanismCurios.getQIO(player);
30-
31-
if (!stack.isEmpty() && stack.getItem() instanceof ItemPortableQIODashboard item) {
32-
SecurityUtils.get().claimOrOpenGui(level, player, null, item.getContainerType()::tryOpenGui);
39+
40+
((PlayerBridge) player).mci$setSlot(this.slot);
41+
42+
ItemStack stack = MekanismCurios.getHandOrCuriosItem(player, null);
43+
44+
if (!stack.isEmpty()) {
45+
if (stack.getItem() instanceof IGuiItem item) {
46+
SecurityUtils.get().claimOrOpenGui(level, player, null, item.getContainerType()::tryOpenGui);
47+
}
3348
}
3449
});
3550

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package dev.tonimatas.mekanismcurios.util;
2+
3+
import java.util.Locale;
4+
5+
public enum CuriosSlots {
6+
QIO,
7+
TELEPORTER;
8+
9+
public String id() {
10+
return this.toString().toLowerCase(Locale.ENGLISH);
11+
}
12+
}

0 commit comments

Comments
 (0)