Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.11.2] Wierd compilation error


MisterPeModder
 Share

Recommended Posts

Hello!

I currently working on a mod called TooManyOres mod that depends on a library mod called HexianCore.

The mod worked properly and i could compile it without any problem but recently, I encountered some pretty strange compilation error sthat only occurs when I'm trying to build the project (works fine in dev environnement).

It says that I didn't implemented the method GuiContainer::drawGuiContainerBackgroundLayer even though it is implemented the the GuiConainerBase class.

So I almost tried everthing and I could not find a solution to this problem, so if someone knows what i did wrong, I would be very grateful ;)!

 

GuiContainerBase:

Spoiler

package misterpemodder.hc.main.client.gui;
import java.awt.Dimension;
import java.awt.Point;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang3.tuple.MutablePair;
import org.apache.commons.lang3.tuple.Pair;
import misterpemodder.hc.main.client.gui.tabs.TabArmorInventory;
import misterpemodder.hc.main.client.gui.tabs.TabBase;
import misterpemodder.hc.main.client.gui.tabs.TabBase.TabPos;
import misterpemodder.hc.main.client.gui.tabs.TabBase.TabTexture;
import misterpemodder.hc.main.client.gui.tabs.TabMain;
import misterpemodder.hc.main.client.gui.tabs.TabPlayerInventory;
import misterpemodder.hc.main.compat.craftingtweaks.CraftingTweaksCompat;
import misterpemodder.hc.main.compat.jei.JEICompat;
import misterpemodder.hc.main.compat.jei.JEIPluginHC;
import misterpemodder.hc.main.inventory.ContainerBase;
import misterpemodder.hc.main.tileentity.TileEntityContainerBase;
import misterpemodder.hc.main.utils.StringUtils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.init.SoundEvents;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.fml.client.config.GuiUtils;
public abstract class GuiContainerBase<C extends ContainerBase<TE>, TE extends TileEntityContainerBase> extends GuiContainer {
    
    public static final int TAB_OFFSET = 4;
    private static List<String> hoveringText;
    private static int hoveringTextMaxWidth;
    public C container;
    
    protected MutablePair<TabBase<C, TE>, TabBase<C, TE>> selectedTabs;
    protected List<TabBase<C, TE>> tabs;
    
    protected List<GuiButton> selectedButtonsLeft;
    protected List<GuiButton> selectedButtonsRight;
    
    private short ctButtonsState = -1;
    private List<GuiButton> ctButtons = new ArrayList<>();
    
    
    public GuiContainerBase(C container) {
        super(container);
        this.container = container;
        this.tabs = registerTabs();
        
        if(tabs.size() < 2) throw new IllegalArgumentException("There must be at least 2 tabs!");
        initTabs();
        
        Pair<TabBase<C, TE>, TabBase<C, TE>> p = getDefaultPair();
        this.selectedTabs = MutablePair.of(p.getLeft(), p.getRight());
        
        Dimension dl = selectedTabs.left.getTexture().dim;
        Dimension dr = selectedTabs.right.getTexture().dim;
        this.xSize = (Math.max(dl.width, dr.width) + TabBase.WIDTH);
          this.ySize = dl.height + dr.height;
          
          this.selectedButtonsLeft = new ArrayList<>();
          this.selectedButtonsRight = new ArrayList<>();
          
          if(CraftingTweaksCompat.isModLoaded() && CraftingTweaksCompat.guiTweakButtonClass != null) {
              ctButtonsState = 0;
          }
    }
    
    private void initTabs() {
        for(TabBase<C, TE> tab : tabs) {
            tab.setGuiContainer(this);
        }
    }
    
    @Override
    public void initGui() {
        super.initGui();
        for(TabBase<C, TE> tab : tabs) {
            tab.initButtons(this.guiLeft, this.guiTop);
        }
    }
    
    @Override
    public void setWorldAndResolution(Minecraft mc, int width, int height) {
        tabs.forEach(t -> t.getButtonsList().clear());
        super.setWorldAndResolution(mc, width, height);
    }
    
    protected Pair<TabBase<C, TE>, TabBase<C, TE>> getDefaultPair() {
        MutablePair<TabBase<C, TE>, TabBase<C, TE>> p = new MutablePair<>();
        for(TabBase<C, TE> tab : tabs) {
            if(tab instanceof TabMain) {
                p.setLeft(tab);
            } else if(tab instanceof TabPlayerInventory) {
                p.setRight(tab);
            }
        }
        if(p.getLeft() == null || p.getRight() == null) {
            p.setLeft(tabs.get(0));
            p.setRight(tabs.get(1));
        }
        return p;
    }
    
    public abstract List<TabBase<C, TE>> registerTabs();
    
    @Override
    public void drawScreen(int mouseX, int mouseY, float partialTicks) {
        super.drawScreen(mouseX, mouseY, partialTicks);
        this.selectedTabs.left.drawScreen(mouseX, mouseY, partialTicks);
        this.selectedTabs.right.drawScreen(mouseX, mouseY, partialTicks);
        addButtons();
    }
    
    @Override
    protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
        //Disabled Tabs
        GlStateManager.pushMatrix();
        GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f);
        this.drawDisabledTabs();
        
        //Top Part
        TabTexture lt = selectedTabs.getLeft().getTexture();
        this.mc.getTextureManager().bindTexture(lt.screenTexture);
        Gui.drawModalRectWithCustomSizedTexture(this.guiLeft, this.guiTop, 0, 0, lt.dim.width, lt.dim.height, lt.textureSize.width, lt.textureSize.height);
        
        //Bottom part
        TabTexture rt = selectedTabs.getRight().getTexture();
        this.mc.getTextureManager().bindTexture(rt.screenTexture);
        Gui.drawModalRectWithCustomSizedTexture(this.guiLeft, getBottomPartPos(), 0, 0, rt.dim.width, rt.dim.height, rt.textureSize.width, rt.textureSize.height);
        
        //Enabled Tabs
        this.drawTab(selectedTabs.getLeft(), true);
        selectedTabs.getLeft().drawGuiContainerBackgroundLayer(partialTicks, mouseX, mouseY);
        this.drawTab(selectedTabs.getRight(), true);
        selectedTabs.getRight().drawGuiContainerBackgroundLayer(partialTicks, mouseX, mouseY);
        
        GlStateManager.popMatrix();
    }
    
    protected void drawTab(TabBase<C, TE> tab, boolean enabled) {
        TabTexture texture = tab.getTexture();
        Point uv = enabled? texture.enabledCoords : texture.disabledCoords;
        Point coords = tab.getPos();
        this.mc.getTextureManager().bindTexture(tab.getTexture().tabTexture);
        Gui.drawModalRectWithCustomSizedTexture(this.getGuiLeft()+coords.x , this.getGuiTop()+coords.y, uv.x, uv.y, TabBase.WIDTH, TabBase.HEIGHT, 128F, 128F);
    }
    
    @Override
    protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
        
        selectedTabs.getLeft().updateButtons();
        selectedTabs.getRight().updateButtons();
        
        selectedTabs.getLeft().drawGuiContainerForegroundLayer(mouseX, mouseY);
        selectedTabs.getRight().drawGuiContainerForegroundLayer(mouseX, mouseY);
        
        boolean flag = true;
        for(TabBase<C, TE> tab : tabs) {
            RenderHelper.enableGUIStandardItemLighting();
            ItemStack stack = tab.getItemStack();
            Point tabPos = tab.getPos();
            this.itemRender.renderItemIntoGUI(stack, tabPos.x + 8, tabPos.y + 6);
            this.itemRender.renderItemOverlays(this.fontRendererObj, stack, tabPos.x + 8, tabPos.y + 6);
            RenderHelper.disableStandardItemLighting();
            if(isPointInRegion(tab.getPos().x+1, tab.getPos().y, TabBase.WIDTH, TabBase.HEIGHT-1, mouseX, mouseY)) {
                flag = false;
                addHoveringText(TextFormatting.GRAY + "" + TextFormatting.ITALIC + StringUtils.translate(tab.getUnlocalizedName()));
            }
        }
        
        
        
        if(flag && JEICompat.isModLoaded()) {
            List<RecipeClickableAreaHC> list = getRecipeClickableAreas();
            for(RecipeClickableAreaHC r : list) {
                if(r.checkHover(mouseX, mouseY)) {
                    addHoveringText(StringUtils.translate("jei.tooltip.show.recipes"));
                }
            }
        }
        
        if(hoveringText != null && !hoveringText.isEmpty()) {
            GuiUtils.drawHoveringText(hoveringText, mouseX-this.getGuiLeft(), mouseY-this.getGuiTop(), this.width, this.height, hoveringTextMaxWidth, fontRendererObj);
            hoveringText = null;
        }
        
    }
    
    private List<RecipeClickableAreaHC> getRecipeClickableAreas() {
        List<RecipeClickableAreaHC> l = new ArrayList<>();
        if(selectedTabs.getLeft().hasRecipeClickableAreas()) {
            l.addAll(Arrays.asList(selectedTabs.getLeft().getRecipeClickableAreas()));
        }
        if(selectedTabs.getRight().hasRecipeClickableAreas()) {
            l.addAll(Arrays.asList(selectedTabs.getRight().getRecipeClickableAreas()));
        }
        return l;
    }
    
    @Override
    protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
        
        this.selectedTabs.left.mouseClicked(mouseX, mouseY, mouseButton);
        this.selectedTabs.right.mouseClicked(mouseX, mouseY, mouseButton);
        
        for(TabBase<C, TE> tab : tabs) {
            Point pos = tab.getPos();
            if(isPointInRegion(pos.x+1, pos.y, TabBase.WIDTH, TabBase.HEIGHT-1, mouseX, mouseY)) {
                if(tab.isEnabled() && selectedTabs.getLeft() != tab && selectedTabs.getRight() != tab) {
                    this.mc.player.playSound(SoundEvents.UI_BUTTON_CLICK, 1.0F, 1.0F);
                    TabPos tabPos = tab.getTabPos();
                    if(tabPos == TabPos.TOP_LEFT || tabPos == TabPos.TOP_RIGHT) {
                        selectedTabs.setLeft(tab);
                    } else {
                        selectedTabs.setRight(tab);
                    }
                    selectedTabs = tab.forceTabConfig();
                    setContainerTabs();
                    this.container.hideSlots();
                }
            } else if(JEIPluginHC.hasJEIRuntime()) {
                List<RecipeClickableAreaHC> list = getRecipeClickableAreas();
                for(RecipeClickableAreaHC r : list) {
                    if(r.checkHover(mouseX, mouseY)) {
                        JEIPluginHC.getJEIRuntime().getRecipesGui().showCategories(r.getRecipeCategoryUids());
                        this.onGuiClosed();
                    }
                }
            }
        }
        super.mouseClicked(mouseX, mouseY, mouseButton);
    }
    
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public void setContainerTabs() {
        this.container.setSelectedTabs((Pair)selectedTabs);
    }
    
    public void updateScreen() {
        super.updateScreen();
        TE te = this.container.getTileEntity();
        if(te == null || !te.hasWorld() || te.getWorld().getBlockState(te.getPos()).getBlock() != te.getBlockType()) {
            this.onGuiClosed();
            this.mc.player.closeScreen();
        }
    }
    
    public boolean isPointInTheRegion(int rectX, int rectY, int rectWidth, int rectHeight, int pointX, int pointY) {
        return this.isPointInRegion(rectX, rectY, rectWidth, rectHeight, pointX, pointY);
    }
    
    @Override
    public void onGuiClosed() {
        this.selectedTabs.left.onGuiClosed();
        this.selectedTabs.right.onGuiClosed();
        
        tabs.forEach(t -> t.getButtonsList().clear());
        super.onGuiClosed();
    }
    
    protected void keyTyped(char typedChar, int keyCode) throws IOException {
        if(!selectedTabs.left.keyTyped(typedChar, keyCode) && !selectedTabs.right.keyTyped(typedChar, keyCode)) {
            super.keyTyped(typedChar, keyCode);
        }
    }
    
    private void addButtons() {
        List<GuiButton> leftButtons = this.selectedTabs.left.getButtonsList();
        List<GuiButton> rightButtons = this.selectedTabs.right.getButtonsList();
        
        if(leftButtons == null || leftButtons.isEmpty()) {
            selectedButtonsLeft.clear();
        }
        else if(!selectedButtonsLeft.containsAll(leftButtons)) {
            selectedButtonsLeft.clear();
            selectedButtonsLeft.addAll(leftButtons);
        }
        
        if(rightButtons == null || rightButtons.isEmpty()) {
            selectedButtonsRight.clear();
        }
        else if(!selectedButtonsRight.containsAll(rightButtons)) {
            selectedButtonsRight.clear();
            selectedButtonsRight.addAll(rightButtons);
        }
        
        
        
        if(ctButtonsState == 0 && !buttonList.isEmpty()) {
            for(GuiButton b : buttonList) {
                if(CraftingTweaksCompat.guiTweakButtonClass.isAssignableFrom(b.getClass())) {
                    this.ctButtonsState = 1;
                    this.ctButtons.add(b);
                }
            }
        }
        
        try {
        if(ctButtonsState == 1 && !buttonList.isEmpty() && !ctButtons.isEmpty()) {
            List<GuiButton> blist = new ArrayList<>(buttonList);
            for(GuiButton b1 : blist) {
                for(GuiButton b2 : ctButtons) {
                    if(b1 == b2) {
                        buttonList.remove(b1);
                    }
                }
            }
        }
        } catch(Exception e) {
            e.printStackTrace();
        }
        
        this.buttonList.clear();
        this.buttonList.addAll(selectedButtonsLeft);
        this.buttonList.addAll(selectedButtonsRight);
        if(this.selectedTabs.right instanceof TabArmorInventory && !ctButtons.isEmpty()) {
            buttonList.addAll(ctButtons);
        }
        
    }
    
    @Override
    protected void actionPerformed(GuiButton button) throws IOException {
        
        if(selectedButtonsLeft.contains(button)) {
            this.selectedTabs.left.onButtonClicked(button);
        }
        else if(selectedButtonsRight.contains(button)) {
            this.selectedTabs.right.onButtonClicked(button);
        }
    }
    
    public static void addHoveringText(String str) {
        addHoveringText(Arrays.asList(str), -1);
    }
    
    public static void addHoveringText(List<String> strs, int maxWidth) {
        if(strs != null && !strs.isEmpty()) {
            hoveringText = strs;
            hoveringTextMaxWidth = maxWidth;
        }
    }
    
    public FontRenderer getFontRenderer() {
        return this.fontRendererObj;
    }
    
    public int getBottomPartPos() {
        return this.getGuiTop() + selectedTabs.getLeft().getTexture().dim.height;
    }
    
    protected void drawDisabledTabs() {
        for(TabBase<C, TE> tab : tabs) {
            if(tab != selectedTabs.getLeft() && tab != selectedTabs.getRight()) {
                this.drawTab(tab, false);
            }
        }
    }
    
    @Override
    public boolean isPointInRegion(int rectX, int rectY, int rectWidth, int rectHeight, int pointX, int pointY) {
        return super.isPointInRegion(rectX, rectY, rectWidth, rectHeight, pointX, pointY);
    }
    
    public MutablePair<TabBase<C, TE>, TabBase<C, TE>> getSelectedTabs() {
        return this.selectedTabs;
    }
    public List<TabBase<C, TE>> getRegisteredTabs() {
        return this.tabs;
    }
    
    public Minecraft getMinecraft() {
        return this.mc;
    }
    
}

 

 

GuiContainerDestabilizer:

Spoiler

package misterpemodder.tmo.main.client.gui;
import java.util.ArrayList;
import java.util.List;
import org.objectweb.asm.commons.Method;
import misterpemodder.hc.main.client.gui.GuiContainerBase;
import misterpemodder.hc.main.client.gui.tabs.TabBase;
import misterpemodder.hc.main.client.gui.tabs.TabPlayerInventory;
import misterpemodder.tmo.main.client.gui.tabs.TabArmorInventoryTMO;
import misterpemodder.tmo.main.client.gui.tabs.TabIO;
import misterpemodder.tmo.main.client.gui.tabs.TabInfo;
import misterpemodder.tmo.main.client.gui.tabs.TabMainDestabilizer;
import misterpemodder.tmo.main.inventory.ContainerDestabilizer;
import misterpemodder.tmo.main.tileentity.TileEntityDestabilizer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraftforge.fml.relauncher.ReflectionHelper;
public class GuiContainerDestabilizer extends GuiContainerBase<ContainerDestabilizer, TileEntityDestabilizer> {
    public GuiContainerDestabilizer(InventoryPlayer playerInv, TileEntityDestabilizer te) {
        super(new ContainerDestabilizer(te, playerInv));
    }
    @Override
    public List<TabBase<ContainerDestabilizer, TileEntityDestabilizer>> registerTabs() {
        List<TabBase<ContainerDestabilizer, TileEntityDestabilizer>> list = new ArrayList<>();
        list.add(new TabMainDestabilizer());
        list.add(new TabInfo<ContainerDestabilizer, TileEntityDestabilizer>(false));
        list.add(new TabPlayerInventory<ContainerDestabilizer, TileEntityDestabilizer>());
        list.add(new TabArmorInventoryTMO<ContainerDestabilizer, TileEntityDestabilizer>());
        list.add(new TabIO<>(container.getTileEntity().getIoConfigHandler()));
        return list;
    }
    
}

 

Gradle log:

Spoiler

This mapping 'snapshot_20161220' was designed for MC 1.11! Use at your own peril.This mapping 'snapshot_20161220' was designed for MC 1.11! Use at your own peril.

#################################################
         ForgeGradle 2.2-SNAPSHOT-d13a6c8        
  https://github.com/MinecraftForge/ForgeGradle  
#################################################
               Powered by MCP unknown               
            http://modcoderpack.com             
         by: Searge, ProfMobius, Fesh0r,         
         R4wk, ZeuX, IngisKahn, bspkrs           
#################################################
:extractMcpMappings SKIPPED
:deobfCompileDeobfDepTask0
:deobfCompileDeobfDepTask1 SKIPPED
:deobfCompileRemapDepSourcesTask2 SKIPPED
:deobfCompileRemapDepSourcesTask3 SKIPPED
:deobfCompileDummyTask
:deobfProvidedDummyTask
:sourceApiJava UP-TO-DATE
:compileApiJava
:processApiResources UP-TO-DATE
:apiClasses
:sourceMainJava
:compileJavaC:\Users\Patricia\Desktop\Modding\Workspace\TooManyOres\build\sources\main\java\misterpemodder\tmo\main\tileentity\TileEntityTitaniumChest.java:5: error: TileEntityTitaniumChest is not abstract and does not override abstract method update() in ITickable
public class TileEntityTitaniumChest extends TileEntityCustomChest {
       ^
C:\Users\Patricia\Desktop\Modding\Workspace\TooManyOres\build\sources\main\java\misterpemodder\tmo\main\tileentity\TileEntityStrongPiston.java:70: error: no suitable method found for findMethod(Class<CAP#1>,<null>,String[],Class<?>[])
            return ReflectionHelper.findMethod(clazz, null, methodNames, methodTypes);
                                   ^
    method ReflectionHelper.<E>findMethod(Class<? super E>,E,String[],Class<?>...) is not applicable
      (cannot infer type-variable(s) E
        (argument mismatch; Class<CAP#1> cannot be converted to Class<? super E>))
    method ReflectionHelper.findMethod(Class<?>,String,String,Class<?>...) is not applicable
      (argument mismatch; String[] cannot be converted to String)
  where E is a type-variable:
    E extends Object declared in method <E>findMethod(Class<? super E>,E,String[],Class<?>...)
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Object from capture of ?
C:\Users\Patricia\Desktop\Modding\Workspace\TooManyOres\build\sources\main\java\misterpemodder\tmo\main\client\gui\GuiContainerDestabilizer.java:20: error: GuiContainerDestabilizer is not abstract and does not override abstract method drawGuiContainerBackgroundLayer(float,int,int) in GuiContainer
public class GuiContainerDestabilizer extends GuiContainerBase<ContainerDestabilizer, TileEntityDestabilizer> {
       ^
C:\Users\Patricia\Desktop\Modding\Workspace\TooManyOres\build\sources\main\java\misterpemodder\tmo\main\client\gui\GuiContainerInjector.java:17: error: GuiContainerInjector is not abstract and does not override abstract method drawGuiContainerBackgroundLayer(float,int,int) in GuiContainer
public class GuiContainerInjector extends GuiContainerBase<ContainerInjector, TileEntityInjector> {
       ^
C:\Users\Patricia\Desktop\Modding\Workspace\TooManyOres\build\sources\main\java\misterpemodder\tmo\main\client\gui\GuiContainerThermoelectricGenerator.java:17: error: GuiContainerThermoelectricGenerator is not abstract and does not override abstract method drawGuiContainerBackgroundLayer(float,int,int) in GuiContainer
public class GuiContainerThermoelectricGenerator extends GuiContainerBase<ContainerThermoelectricGenerator, TileEntityThemoelectricGenerator> {
       ^
C:\Users\Patricia\Desktop\Modding\Workspace\TooManyOres\build\sources\main\java\misterpemodder\tmo\main\client\gui\GuiContainerTitaniumAnvil.java:16: error: GuiContainerTitaniumAnvil is not abstract and does not override abstract method drawGuiContainerBackgroundLayer(float,int,int) in GuiContainer
public class GuiContainerTitaniumAnvil extends GuiContainerBase<ContainerTitaniumAnvil, TileEntityTitaniumAnvil>{
       ^
C:\Users\Patricia\Desktop\Modding\Workspace\TooManyOres\build\sources\main\java\misterpemodder\tmo\main\client\gui\GuiContainerTitaniumChest.java:18: error: GuiContainerTitaniumChest is not abstract and does not override abstract method drawGuiContainerBackgroundLayer(float,int,int) in GuiContainer
public class GuiContainerTitaniumChest extends GuiContainerBase<ContainerTitaniumChest, TileEntityTitaniumChest>{
       ^
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: C:\Users\Patricia\Desktop\Modding\Workspace\TooManyOres\build\sources\main\java\misterpemodder\tmo\main\items\TMOItemVariants.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
7 errors
 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 1 mins 44.976 secs
 

 

 

PS: sorry for my bad english :)

Edited by MisterPeModder
PS: sorry for my bad english :)
Link to comment
Share on other sites

1) Your reflection is broken you need to add the srg names as well. The findMethod you are using is deprecated and switching to the other one will make it compile. I believe that the problem is the null instance

2) All the other errors are that you are not implementing things in the classes. You need to implement the missing methods.

 

Once these things are fixed it compiles

Edited by CoderAtParadise
grammer

If I sound like a jerk it's because I'm tired

Link to comment
Share on other sites

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
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.

 Share



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Hi, this article is more of a experience sharing instead of a tutorial as the way I do things may not be the best practice, or most efficient. Product:   I started with the textures, we need the textures/icons that are being rendered to the world, and the ones for the UI. The blue textures are used when the option is hovered. Then, we need to find out where the mouse is at and which one is selected, we can check the distance and angle from the screen center and decide which part it is on: private int getHoveringType(Minecraft minecraft) { double mX = minecraft.mouseHelper.getMouseX(); double mY = minecraft.mouseHelper.getMouseY(); double actualW = minecraft.getMainWindow().getWidth() / 2.0F; double actualH = minecraft.getMainWindow().getHeight() / 2.0F; double mX2 = mX - actualW; double mY2 = mY - actualH; double angle = AVAWeaponUtil.getAngleFromCoord(mX2, -mY2) + 30; if (Math.sqrt(mX2 * mX2 + mY2 * mY2) <= 15 * minecraft.getMainWindow().getGuiScaleFactor()) return -1; if (angle > 360 || angle <= 60) return 0; return ((int) angle / 60); } public static double getAngleFromCoord(double x, double y) { double angle; angle = abs(atan2(x, y) * 180.0D / PI); if (x < 0) angle = 360 - angle; return angle; } In this case the angle is 60 because 360 / 6 options = 60, and if the mouse is within radius of 15 from the screen center then no action is performed (-1) And then the rendering can be done. @Override public void render(Minecraft minecraft, PlayerEntity player, MatrixStack stack, IPlayerAction capability, float screenWidth, float screenHeight) { float x = screenWidth / 2.0F; float y = screenHeight / 2.0F; float size = 60; int type = getHoveringType(minecraft); AVAClientUtil.blit(stack, type == -1 ? UI_BG_LIT : UI_BG, x - size, y - size, x + size, y + size); for (int i = 0; i < 6; i++) { stack.push(); stack.translate(x, y, 0.0F); stack.rotate(Vector3f.ZP.rotationDegrees(i * 60)); stack.translate(-x, -y, 0.0F); AVAClientUtil.blit(stack, type == i ? UI_BG_2_LIT : UI_BG_2, x - size, y - size, x + size, y + size); stack.pop(); } AVAClientUtil.blit(stack, UI_BG_ICON_LAYER, x - size, y - size, x + size, y + size); } public static void blit(MatrixStack stack, @Nullable ResourceLocation texture, float x1, float y1, float x2, float y2) { if (texture != null) Minecraft.getInstance().getTextureManager().bindTexture(texture); Matrix4f matrix = stack.getLast().getMatrix(); Tessellator tessellator = Tessellator.getInstance(); BufferBuilder bufferbuilder = tessellator.getBuffer(); bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX); bufferbuilder.pos(matrix, x1, y2, 0.0F).tex(0.0F, 1.0F).endVertex(); bufferbuilder.pos(matrix, x2, y2, 0.0F).tex(1.0F, 1.0F).endVertex(); bufferbuilder.pos(matrix, x2, y1, 0.0F).tex(1.0F, 0.0F).endVertex(); bufferbuilder.pos(matrix, x1, y1, 0.0F).tex(0.0F, 0.0F).endVertex(); tessellator.draw(); } If the type is -1, then the circle at the center use the blue texture. Otherwise if the type equals the index of the option, it uses the blue texture (or just use RenderSystem.color4f). By rotating an identical texture we don't need to have 6 different textures for each option.     public static boolean ACTIVE = false; public static Vector3d VEC = null; @Override public void tick(Minecraft minecraft, PlayerEntity player) { if (minecraft.isGameFocused() && minecraft.currentScreen == null && AVAClientConfig.ENABLE_PING_HOTKEY.get()) { if (AVAClientUtil.middleMouseDown()) { if (!ACTIVE) { Vector3d eye = AVAWeaponUtil.getEyePositionFor(player); BlockRayTraceResult result = player.world.rayTraceBlocks(new RayTraceContext(eye, eye.add(player.getLookVec().scale(100.0F)), RayTraceContext.BlockMode.VISUAL, RayTraceContext.FluidMode.NONE, player)); if (result.getType() != RayTraceResult.Type.MISS) { ACTIVE = true; minecraft.mouseHelper.ungrabMouse(); if (minecraft.gameSettings.keyBindPickBlock.getKey().getKeyCode() == GLFW.GLFW_MOUSE_BUTTON_MIDDLE) AVAClientUtil.unpressKeybind(minecraft.gameSettings.keyBindPickBlock); VEC = result.getHitVec(); } } } else { int type = getHoveringType(minecraft); if (ACTIVE && VEC != null && type != -1) AVAPackets.INSTANCE.sendToServer(new PingMessage(VEC, ActivePingEffect.Type.values()[type])); reset(minecraft); } } else reset(minecraft); } If player's focusing, the middle mouse is down, then we check if there's terrain (block) in player's sight within 100 blocks, if not, reset the vec, regrab the mouse and set active to false. MouseHelper#ungrabMouse call allows players to move mouse around the screen.   Once we have the VEC set (where the ping will occur), we can render a line between the center of the screen and the ping location. (White line) { ActiveRenderInfo info = minecraft.gameRenderer.getActiveRenderInfo(); Vector3f view = info.getViewVector(); Vector3d vec = info.getProjectedView().add(view.getX(), view.getY(), view.getZ()); drawLine(stack, (float) vec.x, (float) vec.y, (float) vec.z, (float) pingVec.x, (float) pingVec.y, (float) pingVec.z, 255, 255, 255, 1.0F) } public static void drawLine(MatrixStack stack, float x1, float y1, float z1, float x2, float y2, float z2, int r, int g, int b, float a) { AVAClientUtil.drawTransparent(true); IRenderTypeBuffer.Impl impl = IRenderTypeBuffer.getImpl(Tessellator.getInstance().getBuffer()); IVertexBuilder builder = impl.getBuffer(RenderType.LINES); Vector3d view = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView(); stack.push(); stack.translate(-view.x, -view.y, -view.z); Matrix4f matrix = stack.getLast().getMatrix(); builder.pos(matrix, x1, y1, z1).color(r, g, b, (int) (a * 255.0F)).endVertex(); builder.pos(matrix, x2, y2, z2).color(r, g, b, (int) (a * 255.0F)).endVertex(); stack.pop(); impl.finish(); AVAClientUtil.drawTransparent(false); RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); } If you did not add the look offset to the camera position it will not be visible.   Then we send a packet to the server to notify all other players that I've ping the location. Once players receives the location of the pings, it's time to render them. RenderSystem.disableDepthTest(); AVAClientUtil.drawTransparent(true); Vector3d view = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView(); Vector3d vec = activePing.getVec(); double distance = activePing.getVec().distanceTo(view); if (distance > 100.0F) continue; renderObjectAt(minecraft, activePing, world, stack, (float) (distance / 20.0F), 0.0F, activePing.getTexture()); double x = vec.x - view.getX(); double y = vec.y - view.getY(); double z = vec.z - view.getZ(); stack.push(); stack.translate(x, y, z); stack.rotate(minecraft.getRenderManager().getCameraOrientation()); stack.rotate(Vector3f.ZP.rotationDegrees(180.0F)); float size = (float) (distance / 200.0F); stack.scale(size, size, size); IRenderTypeBuffer.Impl impl = IRenderTypeBuffer.getImpl(Tessellator.getInstance().getBuffer()); String text = AVACommonUtil.round(distance, 2) + "m"; minecraft.fontRenderer.func_243247_a(new StringTextComponent(text), -minecraft.fontRenderer.getStringWidth(text) / 2.0F, 10, AVAConstants.AVA_HUD_TEXT_WHITE, false, stack.getLast().getMatrix(), impl, true, 0, 15728880); impl.finish(); stack.pop(); private static void renderObjectAt(Minecraft minecraft, EnvironmentObjectEffect object, World world, MatrixStack stack, float size, float offsetScale, ResourceLocation texture) { Vector3d vec = object.getVec(); stack.push(); Vector3d view = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView(); double x = vec.x - view.getX(); double y = vec.y - view.getY(); double z = vec.z - view.getZ(); if (Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2)) > 100.0F) return; stack.translate(x, y, z); Direction direction = object.getDirection(); if (direction != null) { Vector3i offset = direction.getDirectionVec(); stack.translate(offset.getX() * offsetScale, offset.getY() * offsetScale, offset.getZ() * offsetScale); rotateByDirection(stack, direction); } else { stack.rotate(minecraft.getRenderManager().getCameraOrientation()); stack.rotate(Vector3f.ZP.rotationDegrees(180.0F)); } if (object.doBlend()) { Color colour = new Color(world.getBlockState(object.getPos()).getMaterialColor(world, object.getPos()).colorValue); RenderSystem.color4f(colour.getRed() / 255.0F, colour.getGreen() / 255.0F, colour.getBlue() / 255.0F, object.getTransparency()); } AVAClientUtil.blit(stack, texture, -size, -size, size, size); RenderSystem.color4f(1.0F, 1.0F, 1.0f, 1.0F); stack.pop(); } In the code I change the size of the object according to the distance ( (distance / 20.0F) ), so the object will stay at similar size no matter the distance between them, and so does the text size. The direction is always null, and doBlend is false. They are used in my other renderings.      
    • Hello There! We got another Hunger Games for you guys and in this episode we get so lucky right off the bat and we get 4 diamonds so we knew as soon as we got this we had to win! However something happens that I am not gonna spoil but it doesn't change too much within us winning! There are some hilarious moments in this episode that I know you guys are gonna love! I hope you all enjoy this video and if you did please consider subscribing and liking the video while you are at it!  
    • java.lang.IllegalArgumentException: Failed to create model for tutorialmod:tutorial_horse at net.minecraft.client.renderer.entity.EntityRenderers.lambda$createEntityRenderers$2(EntityRenderers.java:41) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at java.util.HashMap.forEach(HashMap.java:1421) ~[?:?] {} at net.minecraft.client.renderer.entity.EntityRenderers.createEntityRenderers(EntityRenderers.java:37) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.renderer.entity.EntityRenderDispatcher.onResourceManagerReload(EntityRenderDispatcher.java:333) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.server.packs.resources.ResourceManagerReloadListener.lambda$reload$0(ResourceManagerReloadListener.java:13) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:787) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:784) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:795) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:784) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:795) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:784) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:795) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:784) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:726) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:714) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:726) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:714) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:726) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:714) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:726) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:714) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:726) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:714) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:726) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:714) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:726) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at com.mojang.blaze3d.systems.RenderSystem.replayQueue(RenderSystem.java:172) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:runtimedistcleaner:A} at com.mojang.blaze3d.systems.RenderSystem.flipFrame(RenderSystem.java:161) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:runtimedistcleaner:A} at com.mojang.blaze3d.platform.Window.updateDisplay(Window.java:333) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.runTick(Minecraft.java:1062) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.run(Minecraft.java:660) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.main.Main.main(Main.java:205) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:runtimedistcleaner:A} at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] {} at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?] {} at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] {} at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?] {} at net.minecraftforge.fml.loading.targets.ForgeClientUserdevLaunchHandler.lambda$launchService$0(ForgeClientUserdevLaunchHandler.java:38) ~[fmlloader-1.18-38.0.5.jar%230!:?] {} at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-9.0.7.jar%2310!:?] {} at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:53) [modlauncher-9.0.7.jar%2310!:?] {} at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:71) [modlauncher-9.0.7.jar%2310!:?] {} at cpw.mods.modlauncher.Launcher.run(Launcher.java:106) [modlauncher-9.0.7.jar%2310!:?] {} at cpw.mods.modlauncher.Launcher.main(Launcher.java:77) [modlauncher-9.0.7.jar%2310!:?] {} at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:26) [modlauncher-9.0.7.jar%2310!:?] {} at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:23) [modlauncher-9.0.7.jar%2310!:?] {} at cpw.mods.bootstraplauncher.BootstrapLauncher.main(BootstrapLauncher.java:90) [bootstraplauncher-0.1.17.jar:?] {} Caused by: java.lang.IllegalArgumentException: No model for layer tutorialmod:tutorial_horse#tutorial_horse at net.minecraft.client.model.geom.EntityModelSet.bakeLayer(EntityModelSet.java:18) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.renderer.entity.EntityRendererProvider$Context.bakeLayer(EntityRendererProvider.java:50) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:runtimedistcleaner:A} at com.tutorial.tutorialmod.mobdata.TutorialHorse.TutorialHorseRenderer.<init>(TutorialHorseRenderer.java:42) ~[%2380!:?] {re:classloading} at net.minecraft.client.renderer.entity.EntityRenderers.lambda$createEntityRenderers$2(EntityRenderers.java:39) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} ... 115 more A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Render thread Stacktrace: at net.minecraft.client.renderer.entity.EntityRenderers.lambda$createEntityRenderers$2(EntityRenderers.java:41) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at java.util.HashMap.forEach(HashMap.java:1421) ~[?:?] {} at net.minecraft.client.renderer.entity.EntityRenderers.createEntityRenderers(EntityRenderers.java:37) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.renderer.entity.EntityRenderDispatcher.onResourceManagerReload(EntityRenderDispatcher.java:333) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.server.packs.resources.ResourceManagerReloadListener.lambda$reload$0(ResourceManagerReloadListener.java:13) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:787) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:784) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:795) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:784) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:795) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:784) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:795) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:784) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:726) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:714) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:726) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:714) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:726) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:714) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:726) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:714) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:726) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:714) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:726) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$3(SimpleReloadInstance.java:67) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at net.minecraft.util.thread.BlockableEventLoop.execute(BlockableEventLoop.java:90) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.packs.resources.SimpleReloadInstance.lambda$new$4(SimpleReloadInstance.java:66) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading} at java.util.concurrent.CompletableFuture$UniCompletion.claim(CompletableFuture.java:572) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:714) ~[?:?] {} at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?] {} at java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:614) ~[?:?] {} at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:726) ~[?:?] {} at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {} at com.mojang.blaze3d.systems.RenderSystem.replayQueue(RenderSystem.java:172) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:runtimedistcleaner:A} at com.mojang.blaze3d.systems.RenderSystem.flipFrame(RenderSystem.java:161) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:runtimedistcleaner:A} -- Overlay render details -- Details: Overlay name: net.minecraft.client.gui.screens.LoadingOverlay Stacktrace: at net.minecraft.client.renderer.GameRenderer.render(GameRenderer.java:877) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.runTick(Minecraft.java:1040) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.run(Minecraft.java:660) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.main.Main.main(Main.java:205) ~[forge-1.18-38.0.5_mapped_official_1.18-recomp.jar%2376!:?] {re:classloading,pl:runtimedistcleaner:A} at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] {} at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?] {} at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] {} at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?] {} at net.minecraftforge.fml.loading.targets.ForgeClientUserdevLaunchHandler.lambda$launchService$0(ForgeClientUserdevLaunchHandler.java:38) ~[fmlloader-1.18-38.0.5.jar%230!:?] {} at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-9.0.7.jar%2310!:?] {} at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:53) [modlauncher-9.0.7.jar%2310!:?] {} at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:71) [modlauncher-9.0.7.jar%2310!:?] {} at cpw.mods.modlauncher.Launcher.run(Launcher.java:106) [modlauncher-9.0.7.jar%2310!:?] {} at cpw.mods.modlauncher.Launcher.main(Launcher.java:77) [modlauncher-9.0.7.jar%2310!:?] {} at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:26) [modlauncher-9.0.7.jar%2310!:?] {} at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:23) [modlauncher-9.0.7.jar%2310!:?] {} at cpw.mods.bootstraplauncher.BootstrapLauncher.main(BootstrapLauncher.java:90) [bootstraplauncher-0.1.17.jar:?] {} Caused by: java.lang.IllegalArgumentException: Failed to create model for tutorialmod:tutorial_horse Caused by: java.lang.IllegalArgumentException: No model for layer tutorialmod:tutorial_horse#tutorial_horse There is no model layer, so the model is supposed to be non-existent?
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.