Jump to content

Recommended Posts

Posted

I'm making a client-side mod which requires a GUI which may be bigger that the physical screen size. I've looked at the vanilla code for scroll bars (in GuiSlot), but I don't understand it. How would I implement a two-way scroll bar such that:

  • Everything drawn on the screen is translated (shifted) in the opposite direction to the scroll bars
  • The mouse co-ordinates are translated in the same direction as the scroll bars, so it is easy to determine what was clicked

Are there examples of code that can already to this? If not, how would I go about implementing it?

 

Thanks in advance for help.

 

Edit: okay, I've made a start. It's just the commented parts of drawScreen I need help with now.

 

 

 


public class GuiTwoWayScroll extends GuiScreen {

private static final Method keyTypedMethod = ReflectionHelper.findMethod(GuiScreen.class, null,
		new String[] { "func_73869_a", "keyTyped" }, char.class, int.class);
private static final Method mouseClickedMethod = ReflectionHelper.findMethod(GuiScreen.class, null,
		new String[] { "func_73864_a", "mouseClicked" }, int.class, int.class, int.class);
private static final Method mouseReleasedMethod = ReflectionHelper.findMethod(GuiScreen.class, null,
		new String[] { "func_146286_b", "mouseReleased" }, int.class, int.class, int.class);
private static final Method mouseClickMoveMethod = ReflectionHelper.findMethod(GuiScreen.class, null,
		new String[] { "func_146273_a", "mouseClickMove" }, int.class, int.class, int.class, long.class);
private static final Method actionPerformedMethod = ReflectionHelper.findMethod(GuiScreen.class, null,
		new String[] { "func_146284_a", "actionPerformed" }, GuiButton.class);

protected float amtScrolledX;
protected float amtScrolledY;
protected GuiScreen child;

public GuiTwoWayScroll(GuiScreen child) {
	this.child = child;
}

@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
	// translate(amtScrolledX, amtScrolledY);
	child.drawScreen(mouseX + (int) amtScrolledX, mouseY + (int) amtScrolledY, partialTicks);
	// translate(-amtScrolledX, -amtScrolledY);
	// drawScrollBars();
}

@Override
protected void keyTyped(char typedChar, int keyCode) throws IOException {
	invokeSilently(keyTypedMethod, child, typedChar, keyCode);
}

@Override
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
	invokeSilently(mouseClickedMethod, child, mouseX + (int) amtScrolledX, mouseY + (int) amtScrolledY,
			mouseButton);
}

@Override
protected void mouseReleased(int mouseX, int mouseY, int state) {
	invokeSilently(mouseReleasedMethod, child, mouseX + (int) amtScrolledX, mouseY + (int) amtScrolledY, state);
}

@Override
protected void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) {
	invokeSilently(mouseClickMoveMethod, child, mouseX + (int) amtScrolledX, mouseY + (int) amtScrolledY,
			clickedMouseButton, timeSinceLastClick);
}

@Override
protected void actionPerformed(GuiButton button) throws IOException {
	invokeSilently(actionPerformedMethod, child, button);
}

@Override
public void initGui() {
	child.initGui();
}

@Override
public void updateScreen() {
	child.updateScreen();
}

@Override
public void onGuiClosed() {
	child.onGuiClosed();
}

@Override
public void drawDefaultBackground() {
	child.drawDefaultBackground();
}

@Override
public void drawWorldBackground(int tint) {
	child.drawWorldBackground(tint);
}

@Override
public void drawBackground(int tint) {
	child.drawBackground(tint);
}

@Override
public boolean doesGuiPauseGame() {
	return child.doesGuiPauseGame();
}

@Override
public void confirmClicked(boolean result, int id) {
	child.confirmClicked(result, id);
}

private static Object invokeSilently(Method method, Object instance, Object... args) {
	Exception exception = null;
	try {
		return method.invoke(instance, args);
	} catch (IllegalAccessException e) {
		exception = e;
	} catch (IllegalArgumentException e) {
		exception = e;
	} catch (InvocationTargetException e) {
		exception = e;
	}
	throw new ReportedException(CrashReport.makeCrashReport(exception, "Doing reflection"));
}

}

 

 

catch(Exception e)

{

 

}

Yay, Pokémon exception handling, gotta catch 'em all (and then do nothing with 'em).

Posted

Well, after a week of playing around with this, I think I've got a working solution which works for me (with just one small bug):

 

 

package net.earthcomputer.easyeditors.gui;

import java.io.IOException;

import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;

import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.util.MathHelper;

public abstract class GuiTwoWayScroll extends GuiScreen {

private int headerHeight;
private int footerHeight;
private int virtualWidth;
private int virtualHeight;
private int scrollX;
private int scrollY;

private int shownWidth;
private int shownHeight;
private int maxScrollX;
private int maxScrollY;
private int xScrollBarWidth;
private int yScrollBarHeight;
private int xScrollBarLeft;
private int yScrollBarTop;
private int xScrollBarRight;
private int yScrollBarBottom;
private boolean xScrollBarVisible;
private boolean yScrollBarVisible;

private int firstXScrollBarPos = -1;
private int firstYScrollBarPos = -1;
private int firstMouseX = -1;
private int firstMouseY = -1;
private boolean leftButtonDown;

private int leftKey;
private int rightKey;
private int upKey;
private int downKey;
private boolean useMouseWheel = true;
private int xScrollBarPolicy;
private int yScrollBarPolicy;

public static final int SHOWN_NEVER = 0;
public static final int SHOWN_WHEN_NEEDED = 1;
public static final int SHOWN_ALWAYS = 2;

public GuiTwoWayScroll(int headerHeight, int footerHeight, int virtualWidth, int virtualHeight) {
	this.headerHeight = headerHeight;
	this.footerHeight = footerHeight;
	this.virtualWidth = virtualWidth;
	this.virtualHeight = virtualHeight;
	scrollX = scrollY = 0;
	xScrollBarPolicy = yScrollBarPolicy = SHOWN_WHEN_NEEDED;
}

private boolean hasInitialized = false;

@Override
public void initGui() {
	hasInitialized = true;
	refreshScrollBars();
}

private void refreshScrollBars() {
	if (!hasInitialized)
		return;
	switch (xScrollBarPolicy) {
	case SHOWN_NEVER:
		xScrollBarVisible = false;
		break;
	case SHOWN_WHEN_NEEDED:
		xScrollBarVisible = virtualWidth > width;
		break;
	case SHOWN_ALWAYS:
		xScrollBarVisible = true;
		break;
	default:
		throw new IllegalStateException("Illegal value for xScrollBarPolicy: " + xScrollBarPolicy);
	}
	shownHeight = height - headerHeight - footerHeight - (xScrollBarVisible ? 6 : 0);
	switch (yScrollBarPolicy) {
	case SHOWN_NEVER:
		yScrollBarVisible = false;
		break;
	case SHOWN_WHEN_NEEDED:
		yScrollBarVisible = virtualHeight > shownHeight;
		break;
	case SHOWN_ALWAYS:
		yScrollBarVisible = true;
		break;
	default:
		throw new IllegalStateException("Illegal value for yScrollBarPolicy: " + yScrollBarPolicy);
	}
	shownWidth = width - (yScrollBarVisible ? 6 : 0);
	if (yScrollBarVisible && !xScrollBarVisible && xScrollBarPolicy == SHOWN_WHEN_NEEDED
			&& virtualWidth > shownWidth) {
		xScrollBarVisible = true;
		shownHeight -= 6;
	}
	maxScrollX = virtualWidth - shownWidth;
	if (maxScrollX < 0)
		maxScrollX = 0;
	maxScrollY = virtualHeight - shownHeight;
	if (maxScrollY < 0)
		maxScrollY = 0;
	xScrollBarWidth = shownWidth * shownWidth / virtualWidth;
	if (xScrollBarWidth > shownWidth)
		xScrollBarWidth = shownWidth;
	yScrollBarHeight = shownHeight * shownHeight / virtualHeight;
	if (yScrollBarHeight > shownHeight)
		yScrollBarHeight = shownHeight;
	xScrollBarLeft = (maxScrollX == 0 ? 0 : (shownWidth - xScrollBarWidth) * scrollX / maxScrollX);
	yScrollBarTop = (maxScrollY == 0 ? 0 : (shownHeight - yScrollBarHeight) * scrollY / maxScrollY) + headerHeight;
	xScrollBarRight = xScrollBarLeft + xScrollBarWidth;
	yScrollBarBottom = yScrollBarTop + yScrollBarHeight;
	return;
}

public int getHeaderHeight() {
	return headerHeight;
}

public void setHeaderHeight(int headerHeight) {
	this.headerHeight = headerHeight;
	refreshScrollBars();
}

public int getFooterHeight() {
	return footerHeight;
}

public void setFooterHeight(int footerHeight) {
	this.footerHeight = footerHeight;
	refreshScrollBars();
}

public int getVirtualWidth() {
	return virtualWidth;
}

public void setVirtualWidth(int virtualWidth) {
	this.virtualWidth = virtualWidth;
	refreshScrollBars();
}

public int getVirtualHeight() {
	return virtualHeight;
}

public void setVirtualHeight(int virtualHeight) {
	this.virtualHeight = virtualHeight;
	refreshScrollBars();
}

public int getScrollX() {
	return scrollX;
}

public void setScrollX(int scrollX) {
	this.scrollX = MathHelper.clamp_int(scrollX, 0, maxScrollX);
	refreshScrollBars();
}

public void addScrollX(int scrollX) {
	setScrollX(this.scrollX + scrollX);
}

public int getScrollY() {
	return scrollY;
}

public void setScrollY(int scrollY) {
	this.scrollY = MathHelper.clamp_int(scrollY, 0, maxScrollY);
	refreshScrollBars();
}

public void addScrollY(int scrollY) {
	setScrollY(this.scrollY + scrollY);
}

public int getMaxScrollX() {
	return maxScrollX;
}

public int getMaxScrollY() {
	return maxScrollY;
}

public void scrollTo(int x, int y) {
	scrollX = MathHelper.clamp_int(x, 0, maxScrollX);
	scrollY = MathHelper.clamp_int(y, 0, maxScrollY);
	refreshScrollBars();
}

public int getShownWidth() {
	return shownWidth;
}

public int getShownHeight() {
	return shownHeight;
}

protected int getXScrollBarWidth() {
	return xScrollBarWidth;
}

protected int getYScrollBarHeight() {
	return yScrollBarHeight;
}

protected int getXScrollBarLeft() {
	return xScrollBarLeft;
}

protected int getYScrollBarTop() {
	return yScrollBarTop;
}

protected int getXScrollBarRight() {
	return xScrollBarRight;
}

protected int getYScrollBarBottom() {
	return yScrollBarBottom;
}

public int getXScrollBarPolicy() {
	return xScrollBarPolicy;
}

public void setXScrollBarPolicy(int xScrollBarPolicy) {
	this.xScrollBarPolicy = xScrollBarPolicy;
	refreshScrollBars();
}

public int getYScrollBarPolicy() {
	return yScrollBarPolicy;
}

public void setYScrollBarPolicy(int yScrollBarPolicy) {
	this.yScrollBarPolicy = yScrollBarPolicy;
	refreshScrollBars();
}

public int getLeftKey() {
	return leftKey;
}

public void setLeftKey(int leftKey) {
	this.leftKey = leftKey;
}

public int getRightKey() {
	return rightKey;
}

public void setRightKey(int rightKey) {
	this.rightKey = rightKey;
}

public int getUpKey() {
	return upKey;
}

public void setUpKey(int upKey) {
	this.upKey = upKey;
}

public int getDownKey() {
	return downKey;
}

public void setDownKey(int downKey) {
	this.downKey = downKey;
}

public boolean usesMouseWheel() {
	return useMouseWheel;
}

public void setUsesMouseWheel(boolean usesMouseWheel) {
	useMouseWheel = usesMouseWheel;
}

public void drawScreen(int mouseX, int mouseY, float partialTicks) {
	drawVirtualScreen(mouseX + scrollX, mouseY + scrollY - headerHeight, scrollX, scrollY, headerHeight);
	GlStateManager.disableLighting();
	GlStateManager.disableFog();
	Tessellator tessellator = Tessellator.getInstance();
	WorldRenderer worldRenderer = tessellator.getWorldRenderer();
	GlStateManager.disableDepth();

	overlayBackground(0, headerHeight);
	overlayBackground(height - footerHeight, footerHeight);
	drawForeground(mouseX, mouseY, partialTicks);

	GlStateManager.enableBlend();
	GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 0, 1);
	GlStateManager.disableAlpha();
	GlStateManager.shadeModel(GL11.GL_SMOOTH);
	GlStateManager.disableTexture2D();

	if (yScrollBarVisible) {
		worldRenderer.startDrawingQuads();
		worldRenderer.setColorRGBA_I(0, 255);
		worldRenderer.addVertexWithUV(shownWidth, height - footerHeight, 0, 0, 1);
		worldRenderer.addVertexWithUV(width, height - footerHeight, 0, 1, 1);
		worldRenderer.addVertexWithUV(width, headerHeight, 0, 1, 0);
		worldRenderer.addVertexWithUV(shownWidth, headerHeight, 0, 0, 0);
		tessellator.draw();
	}
	if (xScrollBarVisible) {
		worldRenderer.startDrawingQuads();
		worldRenderer.setColorRGBA_I(0, 255);
		worldRenderer.addVertexWithUV(0, height - footerHeight, 0, 0, 1);
		worldRenderer.addVertexWithUV(width, height - footerHeight, 0, 1, 1);
		worldRenderer.addVertexWithUV(width, shownHeight + headerHeight, 0, 1, 0);
		worldRenderer.addVertexWithUV(0, shownHeight + headerHeight, 0, 0, 0);
		tessellator.draw();
	}
	if (xScrollBarVisible && yScrollBarVisible) {
		worldRenderer.startDrawingQuads();
		worldRenderer.setColorRGBA_I(0x808080, 255);
		worldRenderer.addVertexWithUV(shownWidth, height - footerHeight, 0, 0, 1);
		worldRenderer.addVertexWithUV(width, height - footerHeight, 0, 1, 1);
		worldRenderer.addVertexWithUV(width, shownHeight + headerHeight, 0, 1, 0);
		worldRenderer.addVertexWithUV(shownWidth, shownHeight + headerHeight, 0, 0, 0);
		tessellator.draw();
	}
	if (yScrollBarVisible) {
		worldRenderer.startDrawingQuads();
		worldRenderer.setColorRGBA_I(0x808080, 255);
		worldRenderer.addVertexWithUV(shownWidth, yScrollBarBottom, 0, 0, 1);
		worldRenderer.addVertexWithUV(width, yScrollBarBottom, 0, 1, 1);
		worldRenderer.addVertexWithUV(width, yScrollBarTop, 0, 1, 0);
		worldRenderer.addVertexWithUV(shownWidth, yScrollBarTop, 0, 0, 0);
		tessellator.draw();
	}
	if (xScrollBarVisible) {
		worldRenderer.startDrawingQuads();
		worldRenderer.setColorRGBA_I(0x808080, 255);
		worldRenderer.addVertexWithUV(xScrollBarLeft, height - footerHeight, 0, 0, 1);
		worldRenderer.addVertexWithUV(xScrollBarRight, height - footerHeight, 0, 1, 1);
		worldRenderer.addVertexWithUV(xScrollBarRight, shownHeight + headerHeight, 0, 1, 0);
		worldRenderer.addVertexWithUV(xScrollBarLeft, shownHeight + headerHeight, 0, 0, 0);
		tessellator.draw();
	}
	if (yScrollBarVisible) {
		worldRenderer.startDrawingQuads();
		worldRenderer.setColorRGBA_I(0xc0c0c0, 255);
		worldRenderer.addVertexWithUV(shownWidth, yScrollBarBottom - 1, 0, 0, 1);
		worldRenderer.addVertexWithUV(width - 1, yScrollBarBottom - 1, 0, 1, 1);
		worldRenderer.addVertexWithUV(width - 1, yScrollBarTop, 0, 1, 0);
		worldRenderer.addVertexWithUV(shownWidth, yScrollBarTop, 0, 0, 0);
		tessellator.draw();
	}
	if (xScrollBarVisible) {
		worldRenderer.startDrawingQuads();
		worldRenderer.setColorRGBA_I(0xc0c0c0, 255);
		worldRenderer.addVertexWithUV(xScrollBarLeft, height - footerHeight - 1, 0, 0, 1);
		worldRenderer.addVertexWithUV(xScrollBarRight - 1, height - footerHeight - 1, 0, 1, 1);
		worldRenderer.addVertexWithUV(xScrollBarRight - 1, shownHeight + headerHeight, 0, 1, 0);
		worldRenderer.addVertexWithUV(xScrollBarLeft, shownHeight + headerHeight, 0, 0, 0);
		tessellator.draw();
	}

	GlStateManager.enableTexture2D();
	GlStateManager.shadeModel(GL11.GL_FLAT);
	GlStateManager.enableAlpha();
	GlStateManager.disableBlend();

	super.drawScreen(mouseX, mouseY, partialTicks);
}

protected void overlayBackground(int top, int bottom) {
	Tessellator tessellator = Tessellator.getInstance();
	WorldRenderer worldRenderer = tessellator.getWorldRenderer();
	this.mc.getTextureManager().bindTexture(Gui.optionsBackground);
	GlStateManager.color(1, 1, 1, 1);
	worldRenderer.startDrawingQuads();
	worldRenderer.setColorRGBA_I(0x404040, 255);
	worldRenderer.addVertexWithUV(0, bottom, 0, 0, (float) bottom / 32);
	worldRenderer.addVertexWithUV(width, bottom, 0, (float) width / 32, (float) bottom / 32);
	worldRenderer.addVertexWithUV(width, top, 0, (float) this.width / 32, (float) top / 32);
	worldRenderer.addVertexWithUV(0, top, 0, 0, (float) top / 32);
	tessellator.draw();
}

protected abstract void drawVirtualScreen(int virtualMouseX, int virtualMouseY, int scrollX, int scrollY,
		int headerHeight);

protected abstract void drawForeground(int mouseX, int mouseY, float partialTicks);

@Override
public void keyTyped(char typedChar, int keyCode) throws IOException {
	if (keyCode == leftKey) {
		addScrollX(-20);
	} else if (keyCode == rightKey) {
		addScrollX(20);
	} else if (keyCode == upKey) {
		addScrollY(-20);
	} else if (keyCode == downKey) {
		addScrollY(20);
	} else {
		super.keyTyped(typedChar, keyCode);
	}
}

@Override
public void handleMouseInput() throws IOException {
	super.handleMouseInput();

	if (useMouseWheel) {
		int amtToScroll = Mouse.getEventDWheel();
		if (amtToScroll < 0)
			amtToScroll = 20;
		else if (amtToScroll > 0)
			amtToScroll = -20;
		addScrollY(amtToScroll);
	}
}

@Override
public void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
	if (mouseButton == 0) {
		if (yScrollBarVisible && mouseX >= width - 6 && mouseY >= getYScrollBarTop() && mouseX < width
				&& mouseY < getYScrollBarBottom()) {
			firstYScrollBarPos = scrollY;
			firstMouseY = mouseY;
		} else if (xScrollBarVisible && mouseX >= getXScrollBarLeft() && mouseY >= headerHeight + shownHeight
				&& mouseX < getXScrollBarRight() && mouseY < height - footerHeight) {
			firstXScrollBarPos = scrollX;
			firstMouseX = mouseX;
		} else {
			mouseClickedVirtual(mouseX + scrollX, mouseY + scrollY - headerHeight, mouseButton);
		}
	} else if (mouseY > headerHeight && mouseY < height - footerHeight) {
		mouseClickedVirtual(mouseX + scrollX, mouseY + scrollY - headerHeight, mouseButton);
	}
	super.mouseClicked(mouseX, mouseY, mouseButton);
}

protected void mouseClickedVirtual(int virtualMouseX, int virtualMouseY, int mouseButton) {
}

@Override
public void mouseReleased(int mouseX, int mouseY, int state) {
	if (state == 0) { // This test does not work
		firstXScrollBarPos = firstYScrollBarPos = firstMouseX = firstMouseY = -1;
	}
	if (mouseY > headerHeight && mouseY < height - footerHeight)
		mouseReleasedVirtual(mouseX + scrollX, mouseY + scrollY - headerHeight, state);
	super.mouseReleased(mouseX, mouseY, state);
}

protected void mouseReleasedVirtual(int virtualMouseX, int virtualMouseY, int releasedButton) {
}

@Override
public void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) {
	if (firstXScrollBarPos != -1) {
		int dx = mouseX - firstMouseX;
		float multiplier = (float) getShownWidth() / getXScrollBarWidth();
		setScrollX(firstXScrollBarPos + MathHelper.ceiling_float_int(dx * multiplier));
	} else if (firstYScrollBarPos != -1) {
		int dy = mouseY - firstMouseY;
		float multiplier = (float) getShownHeight() / getYScrollBarHeight();
		setScrollY(firstYScrollBarPos + MathHelper.ceiling_float_int(dy * multiplier));
	} else if (mouseY > headerHeight && mouseY < height - footerHeight) {
		mouseClickMoveVirtual(mouseX + scrollX, mouseY + scrollY - headerHeight, clickedMouseButton,
				timeSinceLastClick);
	}
}

protected void mouseClickMoveVirtual(int virtualMouseX, int virtualMouseY, int clickedMouseButton,
		long timeSinceLastClick) {
}

}

 

 

 

The small bug is in the method mouseReleased. Anyone know how to differentiate between different mouse buttons in that method?

catch(Exception e)

{

 

}

Yay, Pokémon exception handling, gotta catch 'em all (and then do nothing with 'em).

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Hello, i've tried to make a minecraft server for my friends on old laptop. But im getting this error   ---- Minecraft Crash Report ---- WARNING: coremods are present:   DCLoadingPlugin (DummyCoreUnofficial-2.4.112.3.jar)   HCASM (HammerLib-1.12.2-2.0.6.23.jar) Contact their authors BEFORE contacting forge // I feel sad now Time: 19.06.25 22:26 Description: Exception in server tick loop java.lang.NoClassDefFoundError: net/minecraft/client/Minecraft     at nukeduck.armorchroma.ArmorChroma.<clinit>(ArmorChroma.java:23)     at java.lang.Class.forName0(Native Method)     at java.lang.Class.forName(Class.java:348)     at net.minecraftforge.fml.common.FMLModContainer.constructMod(FMLModContainer.java:539)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     at java.lang.reflect.Method.invoke(Method.java:498)     at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91)     at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMethod(Subscriber.java:150)     at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76)     at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:399)     at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71)     at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatcher.java:116)     at com.google.common.eventbus.EventBus.post(EventBus.java:217)     at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:219)     at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:197)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     at java.lang.reflect.Method.invoke(Method.java:498)     at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91)     at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMethod(Subscriber.java:150)     at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76)     at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:399)     at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71)     at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatcher.java:116)     at com.google.common.eventbus.EventBus.post(EventBus.java:217)     at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:136)     at net.minecraftforge.fml.common.Loader.loadMods(Loader.java:595)     at net.minecraftforge.fml.server.FMLServerHandler.beginServerLoading(FMLServerHandler.java:98)     at net.minecraftforge.fml.common.FMLCommonHandler.onServerStart(FMLCommonHandler.java:333)     at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(DedicatedServer.java:125)     at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:486)     at java.lang.Thread.run(Thread.java:750) Caused by: java.lang.ClassNotFoundException: net.minecraft.client.Minecraft     at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:191)     at java.lang.ClassLoader.loadClass(ClassLoader.java:418)     at java.lang.ClassLoader.loadClass(ClassLoader.java:351)     ... 35 more Caused by: net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerException: Exception in class transformer net.minecraftforge.fml.common.asm.transformers.SideTransformer@57fae983 from coremod FMLCorePlugin     at net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerWrapper.transform(ASMTransformerWrapper.java:260)     at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279)     at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176)     ... 37 more Caused by: java.lang.RuntimeException: Attempted to load class bib for invalid side SERVER     at net.minecraftforge.fml.common.asm.transformers.SideTransformer.transform(SideTransformer.java:62)     at net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerWrapper.transform(ASMTransformerWrapper.java:256)     ... 39 more A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- System Details -- Details:     Minecraft Version: 1.12.2     Operating System: Linux (amd64) version 6.8.0-51-generic     Java Version: 1.8.0_452, Private Build     Java VM Version: OpenJDK 64-Bit Server VM (mixed mode), Private Build     Memory: 1088926088 bytes (1038 MB) / 1634205696 bytes (1558 MB) up to 4194304000 bytes (4000 MB)     JVM Flags: 2 total; -Xms1024M -Xmx4500M     IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0     FML: MCP 9.42 Powered by Forge 14.23.5.2859 44 mods loaded, 44 mods active     States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored     | State | ID                       | Version            | Source                                        | Signature                                |     |:----- |:------------------------ |:------------------ |:--------------------------------------------- |:---------------------------------------- |     | LC    | minecraft                | 1.12.2             | minecraft.jar                                 | None                                     |     | LC    | mcp                      | 9.42               | minecraft.jar                                 | None                                     |     | LC    | FML                      | 8.0.99.99          | forge-1.12.2-14.23.5.2859.jar                 | e3c3d50c7c986df74c645c0ac54639741c90a557 |     | LC    | forge                    | 14.23.5.2859       | forge-1.12.2-14.23.5.2859.jar                 | e3c3d50c7c986df74c645c0ac54639741c90a557 |     | LC    | codechickenlib           | 3.2.3.358          | CodeChickenLib-1.12.2-3.2.3.358-universal.jar | f1850c39b2516232a2108a7bd84d1cb5df93b261 |     | LC    | ancientwarfare           | 1.12.2-2.7.0.1032  | ancientwarfare-1.12.2-2.7.0.1032.jar          | None                                     |     | LC    | ancientwarfareautomation | 1.12.2-2.7.0.1032  | ancientwarfare-1.12.2-2.7.0.1032.jar          | None                                     |     | LC    | ancientwarfarenpc        | 1.12.2-2.7.0.1032  | ancientwarfare-1.12.2-2.7.0.1032.jar          | None                                     |     | LC    | ancientwarfarestructure  | 1.12.2-2.7.0.1032  | ancientwarfare-1.12.2-2.7.0.1032.jar          | None                                     |     | LC    | ancientwarfarevehicle    | 1.12.2-2.7.0.1032  | ancientwarfare-1.12.2-2.7.0.1032.jar          | None                                     |     | L     | armorchroma              | 1.4-beta           | armorchroma-1.12.2-1.4.jar                    | None                                     |     | L     | baubles                  | 1.5.2              | Baubles-1.12-1.5.2.jar                        | None                                     |     | L     | betterburning            | 0.9.2              | BetterBurning-1.12.2-0.9.2.jar                | None                                     |     | L     | bettercaves              | 1.12.2             | bettercaves-1.12.2-2.0.4.jar                  | None                                     |     | L     | betterinvisibility       | 1.0.1              | betterinvisibility-1.0.1.jar                  | None                                     |     | L     | bettermineshafts         | 1.12.2-2.2         | BetterMineshaftsForge-1.12.2-2.2.jar          | None                                     |     | L     | bookshelf                | 2.3.590            | Bookshelf-1.12.2-2.3.590.jar                  | None                                     |     | L     | collective               | 2.11               | collective-1.12.2-2.11.jar                    | None                                     |     | L     | extendedrenderer         | v1.0               | coroutil-1.12.1-1.2.37.jar                    | None                                     |     | L     | coroutil                 | 1.12.1-1.2.37      | coroutil-1.12.1-1.2.37.jar                    | None                                     |     | L     | configmod                | v1.0               | coroutil-1.12.1-1.2.37.jar                    | None                                     |     | L     | dummycore                | 2.4.112.3.         | DummyCoreUnofficial-2.4.112.3.jar             | None                                     |     | L     | dynamictrees             | 1.12.2-0.9.22      | DynamicTrees-1.12.2-0.9.22.jar                | None                                     |     | L     | thaumcraft               | 6.1.BETA26         | Thaumcraft_1.12.2_6.1.BETA26.jar              | None                                     |     | L     | dynamictreestc           | 1.12.2-1.4.2       | DynamicTreesTC-1.12.2-1.4.2.jar               | None                                     |     | L     | hammercore               | 2.0.6.23           | HammerLib-1.12.2-2.0.6.23.jar                 | None                                     |     | L     | waila                    | 1.8.26             | Hwyla-1.8.26-B41_1.12.2.jar                   | None                                     |     | L     | jei                      | 4.16.1.302         | jei_1.12.2-4.16.1.302.jar                     | None                                     |     | L     | keepinginventory         | 2.4                | KeepingInventory-1.12.2-2.4.jar               | None                                     |     | L     | libraryex                | 1.2.1              | LibraryEx-1.12.2-1.2.1.jar                    | None                                     |     | L     | netherex                 | 2.2.4              | NetherEx-1.12.2-2.2.4.jar                     | None                                     |     | L     | recipehandler            | 0.13               | NoMoreRecipeConflict-0.13(1.12.2).jar         | None                                     |     | L     | nei                      | 2.4.3              | NotEnoughItems-1.12.2-2.4.3.245-universal.jar | None                                     |     | L     | thaumadditions           | 12.6.6             | ThaumicAdditions-1.12.2-12.6.6.jar            | None                                     |     | L     | thaumicbases             | 3.3.500.6r         | thaumicbases-3.3.500.6r.jar                   | None                                     |     | L     | thaumictinkerer          | 1.12.2-5.0-620a0c5 | thaumictinkerer-1.12.2-5.0-620a0c5.jar        | None                                     |     | L     | thaumicwaila             | 1.12.2-0.0.2       | ThaumicWaila-1.12.2-0.0.2.jar                 | None                                     |     | L     | tumbleweed               | 1.12-0.4.7         | tumbleweed-1.12-0.4.7.jar                     | None                                     |     | L     | villagespawnpoint        | 1.5                | villagespawnpoint_1.12.2-1.5.jar              | None                                     |     | L     | wawla                    | 2.6.275            | Wawla-1.12.2-2.6.275.jar                      | None                                     |     | L     | wooltostring             | 1.12.2             | WoolToString-1.12.2-1.0.0.jar                 | None                                     |     | L     | zombieawareness          | 1.12.1-1.11.16     | zombieawareness-1.12.1-1.11.16.jar            | None                                     |     | L     | betteranimalsplus        | 9.0.1              | betteranimalsplus-1.12.2-9.0.1.jar            | None                                     |     | L     | orelib                   | 3.6.0.1            | OreLib-1.12.2-3.6.0.1.jar                     | None                                     |     Loaded coremods (and transformers):  DCLoadingPlugin (DummyCoreUnofficial-2.4.112.3.jar)   DummyCore.ASM.DCASMManager HCASM (HammerLib-1.12.2-2.0.6.23.jar)   com.zeitheron.hammercore.asm.HammerCoreTransformer     Profiler Position: N/A (disabled)     Is Modded: Definitely; Server brand changed to 'fml,forge'     Type: Dedicated Server (map_server.txt)
    • Hey! I noticed you're trying to register your alexandrite item and possibly set its resource location manually with setId(...). I wanted to help clarify a few things that might simplify your code and avoid errors. ✅ The issue: You're using setId(...) inside the item registration like this:   public static final RegistryObject<Item> ALEXANDRITE = ITEMS.register("alexandrite", () -> new Item(new Item.Properties().useItemDescriptionPrefix() .setId(ResourceKey.create(Registries.ITEM, ResourceLocation.fromNamespaceAndPath(TutorialMod.MOD_ID, "alexandrite"))))); But: Item.Properties does not have a setId(...) method — this line will either fail or do nothing meaningful. useItemDescriptionPrefix() is mostly used for translation keys (like "item.modid.name") but isn't needed unless you have a very specific reason. 🛠 The fix: You only need to register your item like this:   public static final RegistryObject<Item> ALEXANDRITE = ITEMS.register("alexandrite", () -> new Item(new Item.Properties())); Forge automatically handles the ResourceLocation (modid:alexandrite) based on the name passed into .register(...), so there’s no need to manually assign it. 📝 For the texture: Make sure you have this file in your resources: src/main/resources/assets/tutorialmod/models/item/alexandrite.json { "parent": "item/generated", "textures": { "layer0": "tutorialmod:item/alexandrite" } } And your texture PNG goes here: src/main/resources/assets/tutorialmod/textures/item/alexandrite.png 🌍 For the name in-game: Add this to your en_us.json under: src/main/resources/assets/tutorialmod/lang/en_us.json { "item.tutorialmod.alexandrite": "Alexandrite" }   Note: if im wrong about the issues you are encountering, i apologize.
    • 🛠️ Fix for Transparent or Clipping Item Render Issues When Held in First Person (Forge 1.20+) Hey everyone! I recently ran into a frustrating bug while making a custom item (a rocket) for my Forge mod, and I’m sharing the fix because it’s a bit obscure — and it worked wonders. 💥 The Problem: My item rendered semi-transparent and see-through — but only in first person. It also clipped through nearby blocks when held, unlike default items like swords or leads. The texture file was confirmed to be fully opaque (alpha 255), so the issue wasn’t the PNG itself. Interestingly, when no texture was present and the default purple-black checkerboard appeared, the clipping issue disappeared. ✅ The Fix: I ended up resolving it by randomly trying something I found on a Forge forum post about block rendering. I added this property to my item's model JSON — even though it's typically only used for blocks: { "parent": "item/generated", "textures": { "layer0": "farbeyond:item/rocket_item" }, "render_type": "minecraft:cutout" } Boom. That single line forced the item to render using a proper opaque (cutout) layer, removing all the unwanted transparency and clipping behavior in first person. 🙌 Credit: I originally found the "render_type" trick mentioned here, in a block rendering context: 👉 https://forums.minecraftforge.net/topic/149644-1201-help-with-transparent-blocks/ Even though it was meant for blocks, I thought, why not try it on an item? And it worked! Big thanks to the poster — this fix wouldn’t have happened without that tip. Hopefully this helps anyone else stuck on a weird rendering bug like I was. This isn’t a common item solution, so feel free to share it further. I’d love to know if it works for you too.
    • Use Java 21 instead of Java 24   Also make a test without modernfix
    • Ive been on this world for 2 days now, my computer blue screens pretty often so maybe that has something to do with it. maybe just incompatible mods like a lot of people so im hoping someone more knowledgeable can help me find what i need to get rid of. thank you! paste bin
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.