Skip to content

Commit

Permalink
Fix #4
Browse files Browse the repository at this point in the history
  • Loading branch information
Zolo101 committed Jun 17, 2024
1 parent 91e1324 commit a02b707
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 56 deletions.
13 changes: 6 additions & 7 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,11 @@ loom {
splitEnvironmentSourceSets()

mods {
"modid" {
"notenoughservers" {
sourceSet sourceSets.main
sourceSet sourceSets.client
}
}

}

dependencies {
Expand All @@ -69,8 +68,8 @@ dependencies {
modImplementation "com.terraformersmc:modmenu:${project.mod_menu_version}"

// config API for mod menu
modApi("me.shedaniel.cloth:cloth-config-fabric:15.0.127") {
exclude(group: "net.fabricmc.fabric-api")
modImplementation include("me.shedaniel.cloth:cloth-config-fabric:15.0.127") {
exclude group: "net.fabricmc.fabric-api"
}
}

Expand Down Expand Up @@ -131,7 +130,7 @@ curseforge {
// addGameVersion = project.cf_game_versions

mainArtifact(remapJar) {
displayName = "${project.mod_name} v${project.project.version}"
displayName = "NES ${project.mod_version} for ${project.minecraft_version}"
}

// Add any additional artifacts
Expand Down Expand Up @@ -164,8 +163,8 @@ modrinth {
debugMode = (System.getenv("MODRINTH_DEBUG") ?: "false").toBoolean()
projectId = project.md_project_id // This can be the project ID or the slug. Either will work!
// changelog = getChangelogNotes()
versionName = "mc${project.minecraft_version}-${project.mod_version}" // You don't need to set this manually. Will fail if Modrinth has this version already
versionNumber = project.mod_version // You don't need to set this manually. Will fail if Modrinth has this version already
versionName = "NES ${project.mod_version} for ${project.minecraft_version}" // You don't need to set this manually. Will fail if Modrinth has this version already
versionNumber = "${project.mod_version}+mc${project.minecraft_version}" // You don't need to set this manually. Will fail if Modrinth has this version already
versionType = "alpha" // This is the default -- can also be `beta` or `alpha`
uploadFile = remapJar // With Loom, this MUST be set to `remapJar` instead of `jar`!
gameVersions = [project.md_game_versions] // Must be an array, even with only one version
Expand Down
Original file line number Diff line number Diff line change
@@ -1,34 +1,34 @@
package dev.zelo.java.notenoughservers.mixins;

import dev.zelo.java.notenoughservers.NotEnoughServers;
import it.unimi.dsi.fastutil.booleans.BooleanConsumer;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.multiplayer.AddServerScreen;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
import net.minecraft.client.gui.screen.multiplayer.MultiplayerServerListWidget;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.client.network.ServerInfo;
import net.minecraft.client.option.ServerList;
import net.minecraft.client.resource.language.I18n;
import net.minecraft.text.Text;
import org.lwjgl.glfw.GLFW;
import org.objectweb.asm.Opcodes;
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.CallbackInfo;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

@Mixin(MultiplayerScreen.class)
public abstract class MultiplayerScreenMixin extends Screen {
@Shadow protected MultiplayerServerListWidget serverListWidget;

@Shadow private ServerList serverList;

@Shadow public abstract ServerList getServerList();

@Shadow protected abstract void removeEntry(boolean confirmedAction);

@Shadow protected abstract void editEntry(boolean confirmedAction);

@Shadow private ButtonWidget buttonEdit;

@Shadow private ButtonWidget buttonDelete;
Expand All @@ -39,20 +39,17 @@ public abstract class MultiplayerScreenMixin extends Screen {

@Shadow private ServerInfo selectedEntry;

// private ButtonWidget buttonAdd;
@Shadow protected abstract void editEntry(boolean confirmedAction);

public MultiplayerScreenMixin(Text title) {
super(title);
}

@Inject(method = "init()V", at = @At("TAIL"))
private void init(CallbackInfo ci) {
// this.addButton(new ButtonWidget(this.width / 2 + 4 + 50, this.height - 320, 100, 20, new TranslatableText("selectServer.search"), (buttonWidget) -> {
// this.client.openScreen(new SearchScreen(this));
// }));
@Redirect(method = "method_19915", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;setScreen(Lnet/minecraft/client/gui/screen/Screen;)V", opcode = Opcodes.GETFIELD))
private void initEditButton2(MinecraftClient client, Screen screen) {
noTypeHackIntoAddServerScreen(this::editEntry);
}


@Inject(method = "keyPressed(III)Z", at = @At("HEAD"))
private void keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable<Boolean> cir) {
// System.out.println(keyCode);
Expand All @@ -61,42 +58,56 @@ private void keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoRe
// return true if this does something
if (serverListWidget.children().isEmpty()) return;

if (NotEnoughServers.SERVER_LIST_TOP.matchesKey(keyCode, scanCode)) {
MultiplayerServerListWidget.Entry topEntry = serverListWidget.children().get(0);
serverListWidget.setSelected(topEntry);
serverListWidget.setScrollAmount(-serverListWidget.getMaxScroll());
return;
}

if (NotEnoughServers.SERVER_LIST_BOTTOM.matchesKey(keyCode, scanCode)) {
MultiplayerServerListWidget.Entry bottomEntry = serverListWidget.children().get(serverListWidget.children().size()-2);
serverListWidget.setSelected(bottomEntry);
serverListWidget.setScrollAmount(serverListWidget.getMaxScroll());
return;
}
switch (keyCode) {
case GLFW.GLFW_KEY_HOME: // HOME key
MultiplayerServerListWidget.Entry topEntry = serverListWidget.children().get(0);
serverListWidget.setSelected(topEntry);
serverListWidget.setScrollAmount(-serverListWidget.getMaxScroll());
break;

case GLFW.GLFW_KEY_END: // END key
MultiplayerServerListWidget.Entry bottomEntry = serverListWidget.children().get(serverListWidget.children().size() - 2);
serverListWidget.setSelected(bottomEntry);
serverListWidget.setScrollAmount(serverListWidget.getMaxScroll());
break;

case GLFW.GLFW_KEY_DELETE: // DELETE key
if (serverListWidget.getSelectedOrNull() != null) {
if (Screen.hasShiftDown()) { // quick delete
this.removeEntry(true);
} else { // ask to delete
this.buttonDelete.onPress();
}
}
break;

if (NotEnoughServers.SERVER_DELETE.matchesKey(keyCode, scanCode)) {
if (serverListWidget.getSelectedOrNull() != null) {
if (Screen.hasShiftDown()) { // quick delete
this.removeEntry(true);
} else { // ask to delete
this.buttonDelete.onPress();
case GLFW.GLFW_KEY_R: // R key (Rename)
if (serverListWidget.getSelectedOrNull() != null) {
this.buttonEdit.onPress();
}
}
return;
}
break;

if (NotEnoughServers.SERVER_RENAME.matchesKey(keyCode, scanCode)) {
if (serverListWidget.getSelectedOrNull() != null) {
this.buttonEdit.onPress();
}
return;
}
case GLFW.GLFW_KEY_A: // A key (ADD)
// TODO: Replace with Mixins using buttonAdd
this.selectedEntry = new ServerInfo(I18n.translate("selectServer.defaultName", new Object[0]), "", ServerInfo.ServerType.OTHER);
noTypeHackIntoAddServerScreen(this::addEntry);
break;

if (NotEnoughServers.SERVER_ADD.matchesKey(keyCode, scanCode)) {
// TODO: Replace with Mixins using buttonAdd
this.selectedEntry = new ServerInfo(I18n.translate("selectServer.defaultName", new Object[0]), "", ServerInfo.ServerType.OTHER);
this.client.setScreen(new AddServerScreen(this, this::addEntry, this.selectedEntry));
default:
break;
}
}

private void noTypeHackIntoAddServerScreen(BooleanConsumer action) {
// Below is a hack to fix https://github.com/Zolo101/NotEnoughServers/issues/4
AddServerScreen screen = new AddServerScreen(this, action, this.selectedEntry);
this.client.setScreen(screen);

TextFieldWidget selectedField = (TextFieldWidget) screen.getFocused();
screen.blur();

CompletableFuture.delayedExecutor(1, TimeUnit.MILLISECONDS).execute(() -> {
screen.setFocused(selectedField);
});
}
}
9 changes: 8 additions & 1 deletion src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,12 @@
},
"suggests": {
"modmenu": "*"
}
},
"breaks": {},
"custom": {},
"jars": [],
"conflicts": {},
"languageAdapters": {},
"recommends": {},
"contributors": []
}

0 comments on commit a02b707

Please sign in to comment.