Skip to content

Commit

Permalink
base code
Browse files Browse the repository at this point in the history
  • Loading branch information
MeiNanziiii committed Dec 15, 2024
1 parent 5d61704 commit 88ffa07
Show file tree
Hide file tree
Showing 14 changed files with 220 additions and 63 deletions.
30 changes: 5 additions & 25 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
plugins {
id 'fabric-loom' version '1.8-SNAPSHOT'
id 'maven-publish'
}

version = project.mod_version
version = project.mod_version + "+" + project.minecraft_version
group = project.maven_group

base {
archivesName = project.archives_base_name
}

loom {
accessWidenerPath = file("src/main/resources/mgui.accesswidener")

runs {
testClient {
client()
Expand Down Expand Up @@ -52,13 +53,10 @@ dependencies {
}

processResources {
inputs.property "minecraft_version", project.minecraft_version
inputs.property "version", project.mod_version
filteringCharset "UTF-8"
inputs.property "version", project.version

filesMatching("fabric.mod.json") {
expand "minecraft_version": project.minecraft_version,
"version": project.mod_version
expand "version": project.version
}
}

Expand Down Expand Up @@ -90,21 +88,3 @@ jar {
rename { "${it}_${project.archivesBaseName}" }
}
}

// configure the maven publication
publishing {
publications {
create("mavenJava", MavenPublication) {
artifactId = project.archives_base_name
from components.java
}
}

// See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
repositories {
// Add repositories to publish to here.
// Notice: This block does NOT have the same function as the block in the top level.
// The repositories here will be used for publishing your artifact, not for
// retrieving dependencies.
}
}
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@ archives_base_name=mgui
# Dependencies
# check this on https://modmuss50.me/fabric.html
fabric_version=0.110.5+1.21.4
pfu_version=0.2.1+1.21.4
pfu_version=0.2.2+1.21.4
sgui_version=1.8.1+1.21.4
polymer_version=0.11.0+1.21.4-rc1
75 changes: 75 additions & 0 deletions src/main/java/ua/mei/mgui/api/gui/TexturedGui.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package ua.mei.mgui.api.gui;

import eu.pb4.sgui.api.gui.SimpleGui;
import eu.pb4.sgui.virtual.SguiScreenHandlerFactory;
import eu.pb4.sgui.virtual.inventory.VirtualScreenHandler;
import net.minecraft.screen.GenericContainerScreenHandler;
import net.minecraft.screen.NamedScreenHandlerFactory;
import net.minecraft.screen.ScreenHandler;
import net.minecraft.screen.ScreenHandlerType;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import ua.mei.mgui.impl.packet.MGuiOpenScreenPacket;
import ua.mei.mgui.mixin.SimpleGuiAccessor;

import java.util.OptionalInt;

public class TexturedGui extends SimpleGui {
public boolean showVanillaBackground = false;

public TexturedGui(ScreenHandlerType<GenericContainerScreenHandler> type, ServerPlayerEntity player, boolean manipulatePlayerSlots) {
super(type, player, manipulatePlayerSlots);
}

@Override
public void setTitle(Text title) {
((SimpleGuiAccessor) this).setTitle(title);

if (this.isOpen()) {
this.player.networkHandler.connection.send(new MGuiOpenScreenPacket(this.syncId, this.type, title));
this.screenHandler.syncState();
}
}

@Override
protected boolean sendGui() {
this.reOpen = true;

if (this.player.currentScreenHandler != this.player.playerScreenHandler) {
this.player.closeHandledScreen();
}
this.player.incrementScreenHandlerSyncId();

OptionalInt temp = OptionalInt.empty();

if (this.player.currentScreenHandler == this.player.playerScreenHandler) {
NamedScreenHandlerFactory factory = SguiScreenHandlerFactory.ofDefault(this);
ScreenHandler screenHandler = factory.createMenu(this.player.screenHandlerSyncId, this.player.getInventory(), this.player);

if (screenHandler == null) {
if (this.player.isSpectator()) {
this.player.sendMessage(Text.translatable("container.spectatorCantOpen").formatted(Formatting.RED), true);
}
} else {
this.player.networkHandler.connection.send(new MGuiOpenScreenPacket(screenHandler.syncId, screenHandler.getType(), factory.getDisplayName()));
this.player.onScreenHandlerOpened(screenHandler);
this.player.currentScreenHandler = screenHandler;

temp = OptionalInt.of(this.player.screenHandlerSyncId);
}
}
this.reOpen = false;

if (temp.isPresent()) {
this.syncId = temp.getAsInt();

if (this.player.currentScreenHandler instanceof VirtualScreenHandler) {
this.screenHandler = (VirtualScreenHandler) this.player.currentScreenHandler;
return true;
}
}

return false;
}
}
12 changes: 12 additions & 0 deletions src/main/java/ua/mei/mgui/impl/MGuiImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,26 @@

import eu.pb4.polymer.resourcepack.api.PolymerResourcePackUtils;
import net.fabricmc.api.ModInitializer;
import net.minecraft.screen.GenericContainerScreenHandler;
import net.minecraft.screen.ScreenHandlerType;
import org.jetbrains.annotations.ApiStatus;
import ua.mei.pfu.api.FontResourceManager;
import ua.mei.pfu.api.util.FontSpaceUtils;

import java.util.List;

@ApiStatus.Internal
public class MGuiImpl implements ModInitializer {
public static final String MOD_ID = "mgui";
public static final FontResourceManager manager = FontResourceManager.create(MOD_ID);
public static final List<ScreenHandlerType<GenericContainerScreenHandler>> genericScreenHandlers = List.of(
ScreenHandlerType.GENERIC_9X1,
ScreenHandlerType.GENERIC_9X2,
ScreenHandlerType.GENERIC_9X3,
ScreenHandlerType.GENERIC_9X4,
ScreenHandlerType.GENERIC_9X5,
ScreenHandlerType.GENERIC_9X6
);

@Override
public void onInitialize() {
Expand Down
23 changes: 9 additions & 14 deletions src/main/java/ua/mei/mgui/impl/VanillaTextures.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,17 @@

@ApiStatus.Internal
public class VanillaTextures {
public static FontResource resource = MGuiImpl.manager.requestFont("gui/vanilla");
private static final FontResource resource = MGuiImpl.manager.requestFont("gui/vanilla");

public static MutableText GENERIC_9X6;
public static MutableText GENERIC_9X5;
public static MutableText GENERIC_9X4;
public static MutableText GENERIC_9X3;
public static MutableText GENERIC_9X2;
public static MutableText GENERIC_9X1;
public static final MutableText GENERIC_9X1 = GUITextureManager.requestGui("gui/container/generic_9x1.png", resource);
public static final MutableText GENERIC_9X2 = GUITextureManager.requestGui("gui/container/generic_9x2.png", resource);
public static final MutableText GENERIC_9X3 = GUITextureManager.requestGui("gui/container/generic_9x3.png", resource);
public static final MutableText GENERIC_9X4 = GUITextureManager.requestGui("gui/container/generic_9x4.png", resource);
public static final MutableText GENERIC_9X5 = GUITextureManager.requestGui("gui/container/generic_9x5.png", resource);
public static final MutableText GENERIC_9X6 = GUITextureManager.requestGui("gui/container/generic_9x6.png", resource);

protected static void load() {

public static void load() {
GENERIC_9X6 = GUITextureManager.requestGui("gui/container/generic_9x6.png", resource);
GENERIC_9X5 = GUITextureManager.requestGui("gui/container/generic_9x5.png", resource);
GENERIC_9X4 = GUITextureManager.requestGui("gui/container/generic_9x4.png", resource);
GENERIC_9X3 = GUITextureManager.requestGui("gui/container/generic_9x3.png", resource);
GENERIC_9X2 = GUITextureManager.requestGui("gui/container/generic_9x2.png", resource);
GENERIC_9X1 = GUITextureManager.requestGui("gui/container/generic_9x1.png", resource);
}

public static MutableText fromScreenHandler(ScreenHandlerType<?> handler) {
Expand Down
20 changes: 20 additions & 0 deletions src/main/java/ua/mei/mgui/impl/packet/MGuiOpenScreenPacket.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package ua.mei.mgui.impl.packet;

import net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket;
import net.minecraft.screen.ScreenHandlerType;
import net.minecraft.text.Text;

public class MGuiOpenScreenPacket extends OpenScreenS2CPacket {
private final Text finalName;

public MGuiOpenScreenPacket(int syncId, ScreenHandlerType<?> screenHandlerId, Text name) {
super(syncId, screenHandlerId, name);

this.finalName = name;
}

@Override
public Text getName() {
return this.finalName;
}
}
35 changes: 35 additions & 0 deletions src/main/java/ua/mei/mgui/mixin/OpenScreenS2CPacketMixin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package ua.mei.mgui.mixin;

import net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket;
import net.minecraft.screen.ScreenHandlerType;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import ua.mei.mgui.impl.MGuiImpl;
import ua.mei.mgui.impl.VanillaTextures;
import ua.mei.pfu.api.util.TextBuilder;

@Mixin(OpenScreenS2CPacket.class)
public abstract class OpenScreenS2CPacketMixin {
@Shadow @Final private Text name;

@Shadow @Final private ScreenHandlerType<?> screenHandlerId;

@Inject(method = "getName", at = @At("HEAD"), cancellable = true)
public void mgui$replaceName(CallbackInfoReturnable<Text> cir) {
if (MGuiImpl.genericScreenHandlers.contains(this.screenHandlerId)) {
cir.setReturnValue(
new TextBuilder()
.text(VanillaTextures.fromScreenHandler(this.screenHandlerId).formatted(Formatting.WHITE))
.text((MutableText) this.name)
.build()
);
}
}
}
21 changes: 0 additions & 21 deletions src/main/java/ua/mei/mgui/mixin/ServerPlayerEntityMixin.java

This file was deleted.

15 changes: 15 additions & 0 deletions src/main/java/ua/mei/mgui/mixin/SimpleGuiAccessor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package ua.mei.mgui.mixin;

import eu.pb4.sgui.api.gui.SimpleGui;
import net.minecraft.text.Text;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

@Mixin(SimpleGui.class)
public interface SimpleGuiAccessor {
@Accessor
Text getTitle();

@Accessor
void setTitle(Text title);
}
3 changes: 2 additions & 1 deletion src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@
"mixins": [
"mgui.mixins.json"
],
"accesswidener": "mgui.accesswidener",
"depends": {
"minecraft": ">=${minecraft_version}"
"minecraft": ">=1.21.4"
},
"custom": {
"modmenu": {
Expand Down
9 changes: 9 additions & 0 deletions src/main/resources/mgui.accesswidener
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
accessWidener v2 named

accessible method net/minecraft/server/network/ServerPlayerEntity incrementScreenHandlerSyncId ()V

accessible field net/minecraft/server/network/ServerPlayerEntity screenHandlerSyncId I

accessible field net/minecraft/server/network/ServerCommonNetworkHandler connection Lnet/minecraft/network/ClientConnection;

accessible method net/minecraft/server/network/ServerPlayerEntity onScreenHandlerOpened (Lnet/minecraft/screen/ScreenHandler;)V
3 changes: 2 additions & 1 deletion src/main/resources/mgui.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
"package": "ua.mei.mgui.mixin",
"compatibilityLevel": "JAVA_21",
"mixins": [
"ServerPlayerEntityMixin"
"OpenScreenS2CPacketMixin",
"SimpleGuiAccessor"
],
"injectors": {
"defaultRequire": 1
Expand Down
14 changes: 14 additions & 0 deletions src/test/java/ua/mei/mgui/test/MGuiTest.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package ua.mei.mgui.test;

import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import eu.pb4.polymer.resourcepack.api.PolymerResourcePackUtils;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.minecraft.server.command.ServerCommandSource;
import ua.mei.mgui.test.gui.TestGui;
import ua.mei.pfu.api.FontResourceManager;

public class MGuiTest implements ModInitializer {
Expand All @@ -12,5 +16,15 @@ public void onInitialize() {
PolymerResourcePackUtils.addModAssets("mgui_test");

manager = FontResourceManager.create("mgui_test");

CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(LiteralArgumentBuilder.<ServerCommandSource>literal("test_gui")
.requires(player -> player.hasPermissionLevel(4))
.executes(ctx -> {
new TestGui(ctx.getSource().getPlayer()).open();
return 1;
})
);
});
}
}
21 changes: 21 additions & 0 deletions src/test/java/ua/mei/mgui/test/gui/TestGui.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ua.mei.mgui.test.gui;

import eu.pb4.sgui.api.GuiHelpers;
import eu.pb4.sgui.api.elements.GuiElementBuilder;
import net.minecraft.item.Items;
import net.minecraft.screen.ScreenHandlerType;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text;
import ua.mei.mgui.api.gui.TexturedGui;

public class TestGui extends TexturedGui {
public TestGui(ServerPlayerEntity player) {
super(ScreenHandlerType.GENERIC_9X3, player, false);

setSlot(13, new GuiElementBuilder()
.setItem(Items.DIAMOND)
.setCallback(() -> player.sendMessage(Text.literal("Hello world!")))
.build()
);
}
}

0 comments on commit 88ffa07

Please sign in to comment.