Как установить title на 1.16.5 Forge?

Версия Minecraft
1.16.5
API
Forge
70
1
0
Я сейчас знаю что можно вот так: Minecraft.getInstance().getWindow().setTitle("Text Title"), но когда нажимаешь эскейп или свернуть и развернуть окно заголовок меняется, конечно можно сделать постоянное обновление в цикле, но как по мне это костыль, я вот думаю можно ли как то перехватывать вызов майнкрафтом этого метода и что бы выполнялся твой код вместо него например или сразу после выполнения этого метода выполнялся твой код, и вообще как можно еще реализовать?
 
Решение
тогда тут либо ASM, либо самое простое - миксины использовать и инжектиться в Minecraft::createTitle.
У исходного майна он выглядит так
Java:
 private String createTitle() {
      StringBuilder stringbuilder = new StringBuilder("Minecraft");
      if (checkModStatus().shouldReportAsModified()) {
         stringbuilder.append("*");
      }
      stringbuilder.append(" ");
      stringbuilder.append(SharedConstants.getCurrentVersion().getName());
      ClientPacketListener clientpacketlistener = this.getConnection();
      if (clientpacketlistener != null && clientpacketlistener.getConnection().isConnected()) {
         stringbuilder.append(" - ");
         if (this.singleplayerServer != null &&...
70
1
0
Попробуй через lwjgl: Display.setTitle,раньше так работало, мб легаси код, но проверить стоит
Вот код в самой функции, дело в том что функция Display.setTitle уже на этой версии не работает, а если устанавливать как дает возможность майн то слетает
Java:
public void setTitle(String p_230148_1_) {
      GLFW.glfwSetWindowTitle(this.window, p_230148_1_);
   }
 
627
72
178
тогда тут либо ASM, либо самое простое - миксины использовать и инжектиться в Minecraft::createTitle.
У исходного майна он выглядит так
Java:
 private String createTitle() {
      StringBuilder stringbuilder = new StringBuilder("Minecraft");
      if (checkModStatus().shouldReportAsModified()) {
         stringbuilder.append("*");
      }
      stringbuilder.append(" ");
      stringbuilder.append(SharedConstants.getCurrentVersion().getName());
      ClientPacketListener clientpacketlistener = this.getConnection();
      if (clientpacketlistener != null && clientpacketlistener.getConnection().isConnected()) {
         stringbuilder.append(" - ");
         if (this.singleplayerServer != null && !this.singleplayerServer.isPublished()) {
            stringbuilder.append(I18n.get("title.singleplayer"));
         } else if (this.isConnectedToRealms()) {
            stringbuilder.append(I18n.get("title.multiplayer.realms"));
         } else if (this.singleplayerServer == null && (this.currentServer == null || !this.currentServer.isLan())) {
            stringbuilder.append(I18n.get("title.multiplayer.other"));
         } else {
            stringbuilder.append(I18n.get("title.multiplayer.lan"));
         }
      }
      return stringbuilder.toString();
   }
А через миксины можно так сделать (как настроить почитай тут)

Java:
@Mixin(Minecraft.class)
public class MinecraftMixin {
  @Inject(method = "createTitle", at = @At("HEAD"), cancellable = true)
  private void injectedCreateTitle(CallbackInfoReturnable<String> cir) {
    String title = "Title Name";
    cir.setReturnValue(title);
  }
}
 
70
1
0
тогда тут либо ASM, либо самое простое - миксины использовать и инжектиться в Minecraft::createTitle.
У исходного майна он выглядит так
А через миксины можно так сделать (как настроить почитай тут)
А нельзя таким же способом инжектится и в сам setTitle? Мне кажется не будет лишним
 
627
72
178
можно, но зачем? суть одна и та же, но при инициализации окна у тебя setTitle не вызывается, а соответственно какую-то часть времени ты будешь со стандартным именем окна сидеть. Плюсом, в случае чего, ты потом не сможешь имя окна вытащить для использования в коде.
 
70
1
0
можно, но зачем? суть одна и та же, но при инициализации окна у тебя setTitle не вызывается, а соответственно какую-то часть времени ты будешь со стандартным именем окна сидеть. Плюсом, в случае чего, ты потом не сможешь имя окна вытащить для использования в коде.
Я сейчас немного разобрался, как я понял createTitle вызывается каждый раз когда майнкрафт хочет сменить титл, тогда да можно работать через него, добавить свой билдер например, и когда в другой момент нужно сменить титл просто вызывать обычный setTitle
 
70
1
0
тогда тут либо ASM, либо самое простое - миксины использовать и инжектиться в Minecraft::createTitle.
У исходного майна он выглядит так
Java:
 private String createTitle() {
      StringBuilder stringbuilder = new StringBuilder("Minecraft");
      if (checkModStatus().shouldReportAsModified()) {
         stringbuilder.append("*");
      }
      stringbuilder.append(" ");
      stringbuilder.append(SharedConstants.getCurrentVersion().getName());
      ClientPacketListener clientpacketlistener = this.getConnection();
      if (clientpacketlistener != null && clientpacketlistener.getConnection().isConnected()) {
         stringbuilder.append(" - ");
         if (this.singleplayerServer != null && !this.singleplayerServer.isPublished()) {
            stringbuilder.append(I18n.get("title.singleplayer"));
         } else if (this.isConnectedToRealms()) {
            stringbuilder.append(I18n.get("title.multiplayer.realms"));
         } else if (this.singleplayerServer == null && (this.currentServer == null || !this.currentServer.isLan())) {
            stringbuilder.append(I18n.get("title.multiplayer.other"));
         } else {
            stringbuilder.append(I18n.get("title.multiplayer.lan"));
         }
      }
      return stringbuilder.toString();
   }
А через миксины можно так сделать (как настроить почитай тут)

Java:
@Mixin(Minecraft.class)
public class MinecraftMixin {
  @Inject(method = "createTitle", at = @At("HEAD"), cancellable = true)
  private void injectedCreateTitle(CallbackInfoReturnable<String> cir) {
    String title = "Title Name";
    cir.setReturnValue(title);
  }
}
Я вроде все сделал так, запускается но название майновское
 
70
1
0
Миксины зарегал? Запускаешь через таски? Что в консоль пишет (красным в начале может писать)
Я создал еще один проект через Minecraft Dev сразу с миксинами, и там в параметрах запуска есть такая установка, я ее прописал в своем и заработало, но, а когда скомпилиться будет ли работать или нет, в инструкции говорилось что нужно прописать аргументы в gradle.build, в runs, но не написали куда именно в клиент, сервер, дату (если в дату то там уже есть args и в них же или другой строкой), вот это меня очень смутило как то1652972984723.png
 
70
1
0
Надо и в клиент и в сервер, посмотри в той же теме репозитории с миксинами
У меня мод чисто для игроков, он никак не будет загружаться на сервер, без новых блоков и предметов, скорее дополнение интерфейса, настройка майновского клиента и т д
 
Сверху