This commit is contained in:
eymendemez
2025-09-21 09:09:54 +03:00
parent 2d18dc9362
commit 11e604148e
17 changed files with 293 additions and 77 deletions
@@ -1,4 +1,4 @@
package com.demez.eaglercraft;
package net.eymenwsmc;
import java.util.ArrayList;
import java.util.Collection;
@@ -1,4 +1,4 @@
package com.demez.eaglercraft;
package net.eymenwsmc;
public enum EnumOS2 {
linux, solaris, windows, macos, unknown;
+30
View File
@@ -0,0 +1,30 @@
package net.eymenwsmc;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class FAQData {
private static final List<FAQItem> ITEMS;
static {
List<FAQItem> tmp = new ArrayList<FAQItem>();
add(tmp, "Why do NPC skins and holograms look strange when I join with Minecraft 1.7.10 on a ViaVersion (1.8+) server?", "Because Minecraft 1.7 does not support many of the features introduced in 1.8 (like armor stands, skin layers, and hologram text rendering), connecting with 1.7.10 causes NPC skins to break and holograms to display incorrectly. To see them properly, you need to join with a 1.8+ client.");
add(tmp, "How do I join a 1.12/1.8 server in 1.7.10?", "Normally you cant, because 1.7.10 doesnt understand the newer protocols. However, you can use the EaglerXRewind plugin, which adds backward compatibility and lets 1.7.10 clients connect to 1.81.12 servers. Server owners just need to install the plugin alongside ViaVersion/ProtocolSupport.");
add(tmp, "Performance tips?", "Lower render distance and turn off fancy graphics in Options.");
add(tmp, "Why there are no singleplayer mode?", "Because I had a weird chunk loading bug which makes singleplayer UNPLAYABLE. I tried to fix it but It didn't work. Singleplayer will be released in the next update.");
add(tmp, "Can I make my own 1.7.10 server?", "Yes, you can use EaglerXRewind plugin in your 1.8/1.12 servers. But If you want the backend to be 1.7.10, then you need to make a velocity server with EaglerXServer and EaglerXRewind plugin. Then make the normal 1.7.10 server and add it to velocity..");
add(tmp, "Why is am I getting a bad FPS?", "Because this client is not that optimized as 1.8, but I will be backporting optimizitations from 1.8");
add(tmp, "Why did you port 1.7.10?", "Because I saw people wanting 1.7.10 to be ported, I think they love the combat of 1.7.10");
add(tmp, "Why does some plugins does not work?", "Many plugins are built for newer Minecraft versions (1.8+), which include features 1.7.10 doesnt support—such as armor stands, JSON chat, advanced holograms, or extra skin layers. When you connect with 1.7.10, these elements either dont render at all or look broken because your client simply cannot display them. To avoid issues, use a 1.8+ client or ask the server owner if they support 1.7 with compatibility plugins (like ProtocolSupport/EaglerXRewind).");
ITEMS = Collections.unmodifiableList(tmp);
}
private static void add(List<FAQItem> list, String q, String a) {
list.add(new FAQItem(q, a));
}
public static List<FAQItem> items() {
return ITEMS;
}
}
+11
View File
@@ -0,0 +1,11 @@
package net.eymenwsmc;
public class FAQItem {
public String question;
public String answer;
public FAQItem(String question, String answer) {
this.question = question;
this.answer = answer;
}
}
@@ -0,0 +1,47 @@
package net.eymenwsmc;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import net.lax1dude.eaglercraft.internal.vfs2.VFile2;
public class FAQStorage {
private static final String PATH = "eymen/faq.json";
public static List<FAQItem> load() {
List<FAQItem> list = new ArrayList<FAQItem>();
VFile2 f = new VFile2(PATH);
if (!f.exists()) {
return list;
}
try {
String json = f.getAllChars();
if (json == null || json.isEmpty()) return list;
JSONArray arr = new JSONArray(json);
for (int i = 0; i < arr.length(); i++) {
JSONObject o = arr.getJSONObject(i);
String q = o.optString("q", "");
String a = o.optString("a", "");
list.add(new FAQItem(q, a));
}
} catch (Throwable t) {
// ignore and return empty
}
return list;
}
public static void save(List<FAQItem> items) {
JSONArray arr = new JSONArray();
for (FAQItem it : items) {
JSONObject o = new JSONObject();
o.put("q", it.question == null ? "" : it.question);
o.put("a", it.answer == null ? "" : it.answer);
arr.put(o);
}
VFile2 f = new VFile2(PATH);
f.setAllChars(arr.toString());
}
}
@@ -1,4 +1,4 @@
package com.demez.eaglercraft;
package net.eymenwsmc;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
+131
View File
@@ -0,0 +1,131 @@
package net.eymenwsmc;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import org.lwjgl.input.Mouse;
public class GuiFAQ extends GuiScreen {
private final GuiScreen parent;
private List<FAQItem> items = new ArrayList<FAQItem>();
private int selectedIndex = 0;
private int scrollOffset = 0;
private static final int BTN_BACK = 0;
public GuiFAQ(GuiScreen parent) {
this.parent = parent;
}
@Override
public void initGui() {
this.buttonList.clear();
this.items = new ArrayList<FAQItem>(FAQData.items());
this.buttonList.add(new GuiButton(BTN_BACK, this.width / 2 - 210, this.height - 28, 120, 20, "Back"));
if (selectedIndex < 0 && !items.isEmpty()) selectedIndex = 0;
}
@Override
protected void actionPerformed(GuiButton button) {
if (!button.enabled) return;
if (button.id == BTN_BACK) {
this.mc.displayGuiScreen(parent);
return;
}
}
@Override
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) {
super.mouseClicked(mouseX, mouseY, mouseButton);
// Handle selecting an item from the left list
int listX = 12;
int listY = 58;
int listW = this.width / 3 - 24;
int rowH = 28;
if (mouseX >= listX && mouseX <= listX + listW && mouseY >= listY) {
int idx = (mouseY - listY) / rowH + scrollOffset;
if (idx >= 0 && idx < items.size()) {
selectedIndex = idx;
}
}
}
@Override
public void updateScreen() {
// no-op for read-only
}
@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
this.drawDefaultBackground();
this.drawCenteredString(this.fontRendererObj, "Frequently Asked Questions", this.width / 2, 18, 0xFFFFFF);
this.drawCenteredString(this.fontRendererObj, "Browse common questions and answers.", this.width / 2, 32, 0xAAAAAA);
int leftPanelWidth = this.width / 3;
// Left panel background
drawRect(8, 50, leftPanelWidth - 8, this.height - 36, 0x66000000);
// Right panel background
drawRect(leftPanelWidth + 8, 50, this.width - 8, this.height - 36, 0x33000000);
// Left list
int y = 58;
int rowH = 28;
int listW = leftPanelWidth - 24;
int visibleRows = (this.height - 36 - y) / rowH;
int maxOffset = Math.max(0, items.size() - visibleRows);
if (scrollOffset > maxOffset) scrollOffset = maxOffset;
if (scrollOffset < 0) scrollOffset = 0;
for (int i = 0; i < visibleRows && (i + scrollOffset) < items.size(); i++) {
int idx = i + scrollOffset;
int top = y + i * rowH;
int left = 12;
int right = left + listW;
int bottom = top + rowH - 4;
int bg = (idx == selectedIndex) ? 0xFF2E7D32 : 0x88212121; // green selected, dark default
drawRect(left, top, right, bottom, bg);
String q = items.get(idx).question;
if (q == null) q = "";
String clipped = this.fontRendererObj.trimStringToWidth(q, listW - 10);
this.fontRendererObj.drawString(clipped, left + 6, top + 8, 0xFFFFFF);
}
// Right viewer labels and content
int rightX = leftPanelWidth + 16;
this.fontRendererObj.drawString("Question", rightX, 48, 0xCCCCCC);
String qText = (selectedIndex >= 0 && selectedIndex < items.size()) ? items.get(selectedIndex).question : "";
if (qText == null) qText = "";
int contentWidth = this.width - rightX - 20;
int questionY = 64;
this.fontRendererObj.drawSplitString(qText, rightX, questionY, contentWidth, 0xFFFFFF);
int qLines = this.fontRendererObj.listFormattedStringToWidth(qText, contentWidth).size();
int answerLabelY = questionY + qLines * this.fontRendererObj.FONT_HEIGHT + 10;
this.fontRendererObj.drawString("Answer", rightX, answerLabelY, 0xCCCCCC);
String aText = (selectedIndex >= 0 && selectedIndex < items.size()) ? items.get(selectedIndex).answer : "";
if (aText == null) aText = "";
int answerY = answerLabelY + 16;
this.fontRendererObj.drawSplitString(aText, rightX, answerY, contentWidth, 0xFFFFFF);
super.drawScreen(mouseX, mouseY, partialTicks);
}
@Override
public void handleMouseInput() {
super.handleMouseInput();
int d = Mouse.getEventDWheel();
if (d != 0) {
if (d < 0) scrollOffset += 1;
if (d > 0) scrollOffset -= 1;
}
}
}
@@ -1,9 +1,11 @@
package net.minecraft.client.gui;
package net.eymenwsmc;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.multiplayer.GuiConnecting;
import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.multiplayer.ServerList;
@@ -1,4 +1,4 @@
package com.demez;
package net.eymenwsmc;
public class ProfilerEymen {
private long startTime;
@@ -1,4 +1,4 @@
package com.demez.eaglercraft;
package net.eymenwsmc;
import net.lax1dude.eaglercraft.EagRuntime;
@@ -1,7 +1,7 @@
/*
* Ported wrapper for Eaglercraft 1.7.10-style networking into com.demez package
*/
package com.demez;
package net.eymenwsmc;
import java.io.IOException;
import java.util.List;
@@ -1,6 +1,6 @@
package net.lax1dude.eaglercraft.internal;
import com.demez.eaglercraft.EnumOS2;
import net.eymenwsmc.EnumOS2;
/**
* Copyright (c) 2022 lax1dude. All Rights Reserved.
@@ -16,10 +16,10 @@
package net.lax1dude.eaglercraft.sp.socket;
import com.demez.eaglercraft.Sys;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import io.netty.buffer.Unpooled;
import net.eymenwsmc.Sys;
import net.lax1dude.eaglercraft.socket.EaglercraftNetworkManager;
import net.lax1dude.eaglercraft.socket.protocol.GamePluginMessageProtocol;
import net.minecraft.client.Minecraft;
@@ -34,13 +34,13 @@ import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.glu.GLU;
import com.demez.eaglercraft.Sys;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Queues;
import com.google.common.util.concurrent.ListenableFuture;
import com.mojang.authlib.minecraft.MinecraftSessionService;
import net.eymenwsmc.Sys;
import net.lax1dude.eaglercraft.EagRuntime;
import net.lax1dude.eaglercraft.EaglercraftVersion;
import net.lax1dude.eaglercraft.IOUtils;
@@ -429,84 +429,73 @@ public class GuiIngame extends Gui {
this.mc.mcProfiler.endSection();
GL11.glPopMatrix();
var37 = this.mc.theWorld.getScoreboard().func_96539_a(0);
if (this.mc.gameSettings.keyBindPlayerList.getIsKeyPressed()
&& (!this.mc.isIntegratedServerRunning()
|| this.mc.thePlayer.sendQueue.playerInfoList.size() > 1
|| var37 != null)) {
if (this.mc.gameSettings.keyBindPlayerList.getIsKeyPressed() && (!this.mc.isIntegratedServerRunning()
|| this.mc.thePlayer.sendQueue.playerInfoList.size() > 1 || var37 != null)) {
this.mc.mcProfiler.startSection("playerList");
NetHandlerPlayClient var40 = this.mc.thePlayer.sendQueue;
List var42 = var40.playerInfoList;
var15 = var40.currentServerMaxPlayers;
var16 = var15;
this.mc.mcProfiler.startSection("playerList");
for (var17 = 1; var16 > 20 && var17 < 4; var16 = (var15 + var17 - 1) / var17) {
++var17;
}
NetHandlerPlayClient var40 = this.mc.thePlayer.sendQueue;
List<GuiPlayerInfo> var42 = var40.playerInfoList;
int playerCount = var42.size();
int columns = 1;
while (playerCount > 20 * columns && columns < 4) columns++;
int rows = (playerCount + columns - 1) / columns;
int var46 = Math.max(120, 400 / var17);
int maxNameWidth = 0;
for (GuiPlayerInfo p : var42) {
ScorePlayerTeam t = this.mc.theWorld.getScoreboard().getPlayersTeam(p.name);
String nm = ScorePlayerTeam.formatPlayerName(t, p.name);
maxNameWidth = Math.max(maxNameWidth, this.mc.fontRenderer.getStringWidth(nm));
}
int var46 = Math.min(200, Math.max(120, maxNameWidth + 12));
if (var46 > 200) {
var46 = 200;
}
int var19 = (var6 - columns * var46) / 2;
int var47 = 10;
int var19 = (var6 - var17 * var46) / 2;
byte var47 = 10;
drawRect(var19 - 1, var47 - 1, var19 + var46 * var17, var47 + 9 * var16, Integer.MIN_VALUE);
drawRect(var19 - 1, var47 - 1,
var19 + var46 * columns, var47 + 9 * rows,
Integer.MIN_VALUE);
for (var21 = 0; var21 < var15; ++var21) {
var22 = var19 + var21 % var17 * var46;
var23 = var47 + var21 / var17 * 9;
drawRect(var22, var23, var22 + var46 - 1, var23 + 8, 553648127);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
GL11.glEnable(GL11.GL_ALPHA_TEST);
for (int i = 0; i < playerCount; i++) {
int var221 = var19 + (i % columns) * var46;
int var231 = var47 + (i / columns) * 9;
if (var21 < var42.size()) {
GuiPlayerInfo var48 = (GuiPlayerInfo) var42.get(var21);
ScorePlayerTeam var49 = this.mc.theWorld.getScoreboard().getPlayersTeam(var48.name);
String var50 = ScorePlayerTeam.formatPlayerName(var49, var48.name);
var8.drawStringWithShadow(var50, var22, var23, 16777215);
drawRect(var221, var231, var221 + var46 - 1, var231 + 8, 553648127);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
GL11.glEnable(GL11.GL_ALPHA_TEST);
if (var37 != null) {
int var27 = var22 + var8.getStringWidth(var50) + 5;
int var28 = var22 + var46 - 12 - 5;
GuiPlayerInfo var48 = var42.get(i);
ScorePlayerTeam var49 = this.mc.theWorld.getScoreboard().getPlayersTeam(var48.name);
String var50 = ScorePlayerTeam.formatPlayerName(var49, var48.name);
var8.drawStringWithShadow(var50, var221, var231, 0xFFFFFF);
if (var28 - var27 > 5) {
Score var29 = var37.getScoreboard().func_96529_a(var48.name, var37);
String var30 = EnumChatFormatting.YELLOW + "" + var29.getScorePoints();
var8.drawStringWithShadow(var30, var28 - var8.getStringWidth(var30), var23, 16777215);
}
}
if (var37 != null) {
int var27 = var221 + var8.getStringWidth(var50) + 5;
int var28 = var221 + var46 - 12 - 5;
if (var28 - var27 > 5) {
Score var29 = var37.getScoreboard().func_96529_a(var48.name, var37);
String var30 = EnumChatFormatting.YELLOW + "" + var29.getScorePoints();
var8.drawStringWithShadow(var30, var28 - var8.getStringWidth(var30), var231, 0xFFFFFF);
}
}
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
this.mc.getTextureManager().bindTexture(icons);
byte var51 = 0;
boolean var52 = false;
byte var53;
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
this.mc.getTextureManager().bindTexture(icons);
byte var53;
if (var48.responseTime < 0) var53 = 5;
else if (var48.responseTime < 150) var53 = 0;
else if (var48.responseTime < 300) var53 = 1;
else if (var48.responseTime < 600) var53 = 2;
else if (var48.responseTime < 1000) var53 = 3;
else var53 = 4;
if (var48.responseTime < 0) {
var53 = 5;
} else if (var48.responseTime < 150) {
var53 = 0;
} else if (var48.responseTime < 300) {
var53 = 1;
} else if (var48.responseTime < 600) {
var53 = 2;
} else if (var48.responseTime < 1000) {
var53 = 3;
} else {
var53 = 4;
}
this.zLevel += 100.0F;
this.drawTexturedModalRect(var22 + var46 - 12, var23, 0 + var51 * 10, 176 + var53 * 8, 10, 8);
this.zLevel -= 100.0F;
}
}
this.zLevel += 100.0F;
this.drawTexturedModalRect(var221 + var46 - 12, var231, 0, 176 + var53 * 8, 10, 8);
this.zLevel -= 100.0F;
}
}
drawSingleplayerStats(var5);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_ALPHA_TEST);
}
public void func_152126_a(float p_152126_1_, float p_152126_2_) {
@@ -34,6 +34,7 @@ import net.lax1dude.eaglercraft.sp.gui.GuiScreenDemoPlayWorldSelection;
import net.lax1dude.eaglercraft.sp.gui.GuiScreenIntegratedServerBusy;
import net.lax1dude.eaglercraft.sp.gui.GuiScreenIntegratedServerStartup;
import net.lax1dude.eaglercraft.Random;
import net.eymenwsmc.GuiFAQ;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.renderer.DefaultVertexFormats;
@@ -284,6 +285,9 @@ public class GuiMainMenu extends GuiScreen implements GuiYesNoCallback {
this.buttonList.add(new GuiButtonLanguage(5, this.width / 2 - 124, i + 72 + 12));
// FAQ button
this.buttonList.add(new GuiButton(15, this.width / 2 - 100, i + 72 + 12 + 24, 200, 20, "FAQ"));
}
/**
@@ -352,7 +356,7 @@ public class GuiMainMenu extends GuiScreen implements GuiYesNoCallback {
}
if (parGuiButton.id == 15) {
this.mc.displayGuiScreen(new GuiFAQ(this));
}
}
@@ -3,6 +3,8 @@ package net.minecraft.client.gui;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import java.util.List;
import net.eymenwsmc.GuiSupportedServers;
import net.minecraft.client.multiplayer.GuiConnecting;
import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.multiplayer.ServerList;