Jump to content

Recommended Posts

Posted

Hello, it's me again with another problem  :-\

 

So, i startet a new project which can save and edit a frequency in a GUI. Here is a screenshot of it, so that you know what i'm doing here:

 

0aOKFP6.png

 

 

In the game, everything works perfect. I can increase/decrease the frequency and when i close the GUI and open it again, the frequency is still there, but when I go out of the world (not the game) and go in again, the frequency is 0, again. However, the frequency is not getting saved or not getting load correctly.

 

Here is my Block-class:

 

public class WirelessReceiver extends Block implements ITileEntityProvider
{
    public WirelessReceiver(Material material)
    {
        super(material);

        setBlockName("WirelessReceiver");
        setCreativeTab(ControlCraft.ccTab);
        setBlockTextureName(Constants.MODID+":wireless_receiver");
        setHardness(1.0f);
    }

    @Override
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer ep, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_)
    {
        if(world.isRemote) return true;

        TileEntity te = world.getTileEntity(x,y,z);
        if(te != null && te instanceof WirelessReceiverTileEntity)
        {
            ep.openGui(ControlCraft.INSTANCE,Constants.WIRELESS_RECEIVER_GUI_ID,world,x,y,z);
        }

        return true;
    }

    @Override
    public TileEntity createNewTileEntity(World world, int meta)
    {
        return new WirelessReceiverTileEntity();
    }

    @Override
    public boolean hasTileEntity(int metadata)
    {
        return true;
    }

 

 

Here is my TileEntity-class:

 

public class WirelessReceiverTileEntity extends TileEntity
{
    int frequency=0;

    public WirelessReceiverTileEntity()
    {

    }
    
    public void setFrequency(int frequency)
    {
        this.frequency = frequency;
        this.markForUpdate();
    }

    public int getFrequency()
    {
        return frequency;
    }

    public void markForUpdate()
    {
        this.worldObj.markBlockForUpdate(xCoord,yCoord,zCoord);
        this.markDirty();
    }

    @Override
    public void writeToNBT(NBTTagCompound nbtTagCompound)
    {
        super.writeToNBT(nbtTagCompound);

        nbtTagCompound.setInteger("Frequency",frequency);
    }

    @Override
    public void readFromNBT(NBTTagCompound nbtTagCompound)
    {
        super.readFromNBT(nbtTagCompound);

        frequency = nbtTagCompound.getInteger("Frequency");
    }
}

 

 

Here is my GuiContainer:

 

public class WirelessReceiverGuiContainer extends GuiContainer
{
    ResourceLocation resourceLocation = new ResourceLocation(Constants.MODID+":textures/guis/wireless_receiver_gui_bg.png");

    WirelessReceiverTileEntity wrte;

    // Widgets
    GuiTextField tfFrequency;
    GuiButton btIncreaseByOne;
    GuiButton btIncreaseByTen;
    GuiButton btIncreaseByHundred;
    GuiButton btDecreaseByOne;
    GuiButton btDecreaseByTen;
    GuiButton btDecreaseByHundred;
    GuiButton btSet;

    public WirelessReceiverGuiContainer(WirelessReceiverTileEntity wrte, EntityPlayer ep)
    {
        super(new WirelessReceiverContainer(wrte, ep));

        this.wrte = wrte;
        xSize = 256;
        ySize = 57;
    }

    @Override
    public void initGui()
    {
        super.initGui();

        // TextFields
        int tfWidth = 60;
        int tfHeight=20;
        int tfX = (xSize/2)-(tfWidth/2);
        int tfY = 7;
        tfFrequency = new GuiTextField(fontRendererObj, tfX, tfY,tfWidth,tfHeight);
        tfFrequency.setText(wrte.getFrequency()+"");
        tfFrequency.setFocused(true);
        tfFrequency.setMaxStringLength(4);
        Keyboard.enableRepeatEvents(true);

        // Buttons (id, x, y, w, h, txt)
        int btIncOneWidth = 20;
        int btIncTenWidth = 25;
        int btIncHundredWith = 30;
        int btDecOneWidth = 20;
        int btDecTenWidth = 25;
        int btDecHundredWidth = 30;
        int btnHeight = 20;
        int btnMargin = 5;

        int widthSum = btIncOneWidth+btIncTenWidth+btIncHundredWith+btDecOneWidth+btDecTenWidth+btDecHundredWidth+5*btnMargin;
        int btnY = (height/2-ySize/2)+btnMargin+tfHeight+btnMargin;


        int btDecHundredX = (width-widthSum)/2-(btDecHundredWidth/2);
        btDecreaseByHundred = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_HUNDRED_ID, btDecHundredX,btnY,btDecHundredWidth,btnHeight,"-100");

        int btDecTenX = btDecHundredX+btDecHundredWidth+btnMargin;
        btDecreaseByTen = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_TEN_ID, btDecTenX,btnY,btDecTenWidth,btnHeight,"-10");

        int btDecOneX = btDecTenX+btDecTenWidth+btnMargin;
        btDecreaseByOne = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_ONE_ID, btDecOneX,btnY,btDecOneWidth,btnHeight,"-1");

        int btIncOneX = btDecOneX+btDecOneWidth+btnMargin;
        btIncreaseByOne = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_ONE_ID, btIncOneX,btnY,btIncOneWidth,btnHeight,"+1");

        int btIncTenX = btIncOneX+btIncOneWidth+btnMargin;
        btIncreaseByTen = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_TEN_ID, btIncTenX,btnY,btIncTenWidth,btnHeight,"+10");

        int btIncHundredX = btIncTenX+btIncTenWidth+btnMargin;
        btIncreaseByHundred = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_HUNDRED_ID, btIncHundredX,btnY,btIncHundredWith,btnHeight,"+100");

        int btSetWidth = 30;
        int btSetMargin = 10;
        int btSetX = (width/2)+(xSize/2)-btSetWidth-btSetMargin;
        btSet = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_SET_ID,btSetX,btnY,btSetWidth,btnHeight,"Set");

        buttonList.add(btIncreaseByOne);
        buttonList.add(btIncreaseByTen);
        buttonList.add(btIncreaseByHundred);
        buttonList.add(btDecreaseByOne);
        buttonList.add(btDecreaseByTen);
        buttonList.add(btDecreaseByHundred);
        buttonList.add(btSet);
    }

    @Override
    protected void keyTyped(char c, int keyCode)
    {
        if(c>=48 && c<=57 || c==8 || c==45 || c==43)
        {
            tfFrequency.textboxKeyTyped(c, keyCode);
        }

        super.keyTyped(c, keyCode);
    }

    @Override
    public void updateScreen()
    {
        tfFrequency.updateCursorCounter();

        super.updateScreen();
    }

    @Override
    protected void actionPerformed(GuiButton gb)
    {
        switch(gb.id)
        {
            case Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_ONE_ID:
                increaseFrequency(1); break;
            case Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_TEN_ID:
                increaseFrequency(10); break;
            case Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_HUNDRED_ID:
                increaseFrequency(100); break;
            case Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_ONE_ID:
                increaseFrequency(-1); break;
            case Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_TEN_ID:
                increaseFrequency(-10); break;
            case Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_HUNDRED_ID:
                increaseFrequency(-100); break;
            case Constants.WIRELESS_RECEIVER_GUI_BTN_SET_ID:
                onBtnSet();
        }

        super.actionPerformed(gb);
    }

    /**
     * Increases or Decreases the Frequency-GuiTextField
     * @param amt Factor
     */
    public void increaseFrequency(int amt)
    {
        String text = tfFrequency.getText();
        if(text=="")
        {
            tfFrequency.setText(amt+"");
        }
        else
        {
            int zahl = Integer.parseInt(text)+amt;
            tfFrequency.setText(zahl+"");
        }
    }

    public void onBtnSet()
    {
        String text = tfFrequency.getText();
        if(!text.equals(""))
        {
            int frequency = Integer.parseInt(text);
            wrte.setFrequency(frequency);
            this.mc.thePlayer.closeScreen();
        }
    }

    @Override
    protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3)
    {
        mc.renderEngine.bindTexture(resourceLocation);

        GL11.glColor4f(1.0f,1.0f,1.0f,1.0f);

        int bgX = width/2-128;
        int bgY = height/2-28;

        this.drawTexturedModalRect(bgX, bgY, 0, 0, 256, 57);
    }

    @Override
    protected void drawGuiContainerForegroundLayer(int p_146979_1_, int p_146979_2_)
    {
        super.drawGuiContainerForegroundLayer(p_146979_1_, p_146979_2_);

        tfFrequency.drawTextBox();
    }
}

 

 

Here is my GuiHandler:

 

public class WirelessReceiverGuiContainer extends GuiContainer
{
    ResourceLocation resourceLocation = new ResourceLocation(Constants.MODID+":textures/guis/wireless_receiver_gui_bg.png");

    WirelessReceiverTileEntity wrte;

    // Widgets
    GuiTextField tfFrequency;
    GuiButton btIncreaseByOne;
    GuiButton btIncreaseByTen;
    GuiButton btIncreaseByHundred;
    GuiButton btDecreaseByOne;
    GuiButton btDecreaseByTen;
    GuiButton btDecreaseByHundred;
    GuiButton btSet;

    public WirelessReceiverGuiContainer(WirelessReceiverTileEntity wrte, EntityPlayer ep)
    {
        super(new WirelessReceiverContainer(wrte, ep));

        this.wrte = wrte;
        xSize = 256;
        ySize = 57;
    }

    @Override
    public void initGui()
    {
        super.initGui();

        // TextFields
        int tfWidth = 60;
        int tfHeight=20;
        int tfX = (xSize/2)-(tfWidth/2);
        int tfY = 7;
        tfFrequency = new GuiTextField(fontRendererObj, tfX, tfY,tfWidth,tfHeight);
        tfFrequency.setText(wrte.getFrequency()+"");
        tfFrequency.setFocused(true);
        tfFrequency.setMaxStringLength(4);
        Keyboard.enableRepeatEvents(true);

        // Buttons (id, x, y, w, h, txt)
        int btIncOneWidth = 20;
        int btIncTenWidth = 25;
        int btIncHundredWith = 30;
        int btDecOneWidth = 20;
        int btDecTenWidth = 25;
        int btDecHundredWidth = 30;
        int btnHeight = 20;
        int btnMargin = 5;

        int widthSum = btIncOneWidth+btIncTenWidth+btIncHundredWith+btDecOneWidth+btDecTenWidth+btDecHundredWidth+5*btnMargin;
        int btnY = (height/2-ySize/2)+btnMargin+tfHeight+btnMargin;


        int btDecHundredX = (width-widthSum)/2-(btDecHundredWidth/2);
        btDecreaseByHundred = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_HUNDRED_ID, btDecHundredX,btnY,btDecHundredWidth,btnHeight,"-100");

        int btDecTenX = btDecHundredX+btDecHundredWidth+btnMargin;
        btDecreaseByTen = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_TEN_ID, btDecTenX,btnY,btDecTenWidth,btnHeight,"-10");

        int btDecOneX = btDecTenX+btDecTenWidth+btnMargin;
        btDecreaseByOne = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_ONE_ID, btDecOneX,btnY,btDecOneWidth,btnHeight,"-1");

        int btIncOneX = btDecOneX+btDecOneWidth+btnMargin;
        btIncreaseByOne = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_ONE_ID, btIncOneX,btnY,btIncOneWidth,btnHeight,"+1");

        int btIncTenX = btIncOneX+btIncOneWidth+btnMargin;
        btIncreaseByTen = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_TEN_ID, btIncTenX,btnY,btIncTenWidth,btnHeight,"+10");

        int btIncHundredX = btIncTenX+btIncTenWidth+btnMargin;
        btIncreaseByHundred = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_HUNDRED_ID, btIncHundredX,btnY,btIncHundredWith,btnHeight,"+100");

        int btSetWidth = 30;
        int btSetMargin = 10;
        int btSetX = (width/2)+(xSize/2)-btSetWidth-btSetMargin;
        btSet = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_SET_ID,btSetX,btnY,btSetWidth,btnHeight,"Set");

        buttonList.add(btIncreaseByOne);
        buttonList.add(btIncreaseByTen);
        buttonList.add(btIncreaseByHundred);
        buttonList.add(btDecreaseByOne);
        buttonList.add(btDecreaseByTen);
        buttonList.add(btDecreaseByHundred);
        buttonList.add(btSet);
    }

    @Override
    protected void keyTyped(char c, int keyCode)
    {
        if(c>=48 && c<=57 || c==8 || c==45 || c==43)
        {
            tfFrequency.textboxKeyTyped(c, keyCode);
        }

        super.keyTyped(c, keyCode);
    }

    @Override
    public void updateScreen()
    {
        tfFrequency.updateCursorCounter();

        super.updateScreen();
    }

    @Override
    protected void actionPerformed(GuiButton gb)
    {
        switch(gb.id)
        {
            case Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_ONE_ID:
                increaseFrequency(1); break;
            case Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_TEN_ID:
                increaseFrequency(10); break;
            case Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_HUNDRED_ID:
                increaseFrequency(100); break;
            case Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_ONE_ID:
                increaseFrequency(-1); break;
            case Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_TEN_ID:
                increaseFrequency(-10); break;
            case Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_HUNDRED_ID:
                increaseFrequency(-100); break;
            case Constants.WIRELESS_RECEIVER_GUI_BTN_SET_ID:
                onBtnSet();
        }

        super.actionPerformed(gb);
    }

    /**
     * Increases or Decreases the Frequency-GuiTextField
     * @param amt Factor
     */
    public void increaseFrequency(int amt)
    {
        String text = tfFrequency.getText();
        if(text=="")
        {
            tfFrequency.setText(amt+"");
        }
        else
        {
            int zahl = Integer.parseInt(text)+amt;
            tfFrequency.setText(zahl+"");
        }
    }

    public void onBtnSet()
    {
        String text = tfFrequency.getText();
        if(!text.equals(""))
        {
            int frequency = Integer.parseInt(text);
            wrte.setFrequency(frequency);
            this.mc.thePlayer.closeScreen();
        }
    }

    @Override
    protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3)
    {
        mc.renderEngine.bindTexture(resourceLocation);

        GL11.glColor4f(1.0f,1.0f,1.0f,1.0f);

        int bgX = width/2-128;
        int bgY = height/2-28;

        this.drawTexturedModalRect(bgX, bgY, 0, 0, 256, 57);
    }

    @Override
    protected void drawGuiContainerForegroundLayer(int p_146979_1_, int p_146979_2_)
    {
        super.drawGuiContainerForegroundLayer(p_146979_1_, p_146979_2_);

        tfFrequency.drawTextBox();
    }
}

 

 

Finally, here is my Container: (I don't know if I need this class, but i implemented it)

 

public class WirelessReceiverContainer extends Container
{
    public WirelessReceiverContainer(WirelessReceiverTileEntity wrte, EntityPlayer ep)
    {

    }

    @Override
    public boolean canInteractWith(EntityPlayer entityPlayer)
    {
        return true;
    }
}

 

 

I registered my TileEntity in my CommonProxy-class as followed: (registerTileEntities() gets called in the FMLInitializationEvent-method)

 

public void registerTileEntites()
    {
        GameRegistry.registerTileEntity(WirelessReceiverTileEntity.class,"WirelessReceiverTileEntity");
    }

 

 

I hope that anybody takes the time to read through this. I would really appreciate this.

 

Thanks,

Julian

Posted

Thank you for your answer!

 

This is how i made it for now:

 

PacketHandler:

 

public static class WirelessReceiverPacketHandler implements IMessageHandler<WirelessReceiverPacket, IMessage>
    {
        @Override
        public IMessage onMessage(WirelessReceiverPacket message, MessageContext ctx)
        {
            Container con = ctx.getServerHandler().playerEntity.openContainer;
            if(con != null && con instanceof WirelessReceiverContainer)
            {
                ((WirelessReceiverContainer)con).setFrequency(message.frequency);
            }

            return null;
        }
    }

 

 

The frequency is now changed to the frequency I got from the packet, but it would be strange if I wouldn't have got another problem :)

 

The next time I open my WirelessReceiverGUI, the frequency is 0 again.

 

Could it be, that the TileEntity is created every time I do right-click on my WirelessReceiverBlock? Because then, I would need to store my frequency-variable anywhere else.

 

PS: I removed the initialization =0 in the TileEntity-class.

 

Would be nice if you could help me again :)

Posted

So I need to create a new ClientPacket like this:

snw.registerMessage(WirelessReceiverGuiPacket.WirelessReceiverGuiPacketHandler.class,WirelessReceiverGuiPacket.class,1,Side.CLIENT);

 

...and implement it like this (more or less):

package at.stjubit.ControlCraft.packets;

import at.stjubit.ControlCraft.utilities.Constants;
import cpw.mods.fml.common.network.ByteBufUtils;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import io.netty.buffer.ByteBuf;

/**
* Created by kauju_000 on 16.07.2015.
*/
public class WirelessReceiverGuiPacket implements IMessage
{
    int frequency;

    public WirelessReceiverGuiPacket() {}

    public WirelessReceiverGuiPacket(int frequency)
    {
        this.frequency = frequency;
    }

    @Override
    public void fromBytes(ByteBuf buf)
    {
        frequency = ByteBufUtils.readVarInt(buf, 4);
    }

    @Override
    public void toBytes(ByteBuf buf)
    {
        ByteBufUtils.writeVarInt(buf,frequency,4);
    }

    public static class WirelessReceiverGuiPacketHandler implements IMessageHandler<WirelessReceiverGuiPacket, IMessage>
    {

        @Override
        public IMessage onMessage(WirelessReceiverGuiPacket message, MessageContext ctx)
        {
            return null;
        }
    }
}

 

...and open the GUI like this:

ep.openGui(ControlCraft.INSTANCE,Constants.WIRELESS_RECEIVER_GUI_ID,world,x,y,z);
ControlCraft.snw.sendTo(new WirelessReceiverGuiPacket(((WirelessReceiverTileEntity) te).getFrequency()), (EntityPlayerMP) ep);

 

Next problem (of course):

How can I get the GuiContainer to update the frequency in the onMessage()-method?

 

I am stupid, sry..

Posted

Thank you sooooooooo much.

I would like to give you more than a Thanks in this forum :)

 

For everyone who has the same / will have the same problem like me, this is how i did it:

 

Insert an empty method in your CommonProxy-class like this:

public void updateWirelessReceiveGuiFrequency(int frequency)
    {

    }

 

...and overwrite the method in your ClientProxy like this:

@Override
    public void updateWirelessReceiveGuiFrequency(int frequency)
    {
        super.updateWirelessReceiveGuiFrequency(frequency);

        GuiScreen guiScreen = Minecraft.getMinecraft().currentScreen;

        if(guiScreen instanceof WirelessReceiverGuiContainer)
        {
            ((WirelessReceiverGuiContainer) guiScreen).updateFrequency(frequency);
        }
    }

 

...and call this method from your onMessage-method:

@Override
        public IMessage onMessage(WirelessReceiverGuiPacket message, MessageContext ctx)
        {
            ControlCraft.PROXY.updateWirelessReceiveGuiFrequency(message.frequency);

            return null;
        }

 

...send the packet after your Gui has been opened:

ControlCraft.snw.sendTo(new WirelessReceiverGuiPacket(((WirelessReceiverTileEntity) te).getFrequency()), (EntityPlayerMP) ep);

 

That's all!

 

I know diesieben07, that this question has been asked a few times to you, but I want to know it. How have you learned something like this? I haven't seen any Tutorials about things like that.

 

Thanks for your help,

Julian

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

    • Hi! I'm trying to add my custom models/textures renderer like this: public class PonyPlayerWrapperRenderer extends EntityRenderer<Player> { // wrapper class under my LivingEntityRenderer class implementation private final PonyPlayerRenderer innerRenderer; private final PonyPlayerRenderer innerSlimRenderer; public PonyPlayerWrapperRenderer(final EntityRendererProvider.Context context) { super(context); System.out.println("creating new PonyPlayerWrapperRenderer"); this.innerRenderer = new PonyPlayerRenderer(context, false); this.innerSlimRenderer = new PonyPlayerRenderer(context, true); } @Override public void render(final Player entity, final float yaw, final float partialTicks, final PoseStack poseStack, final MultiBufferSource bufferSource, final int packedLight) { System.out.println("PonyPlayerWrapperRenderer render: " + entity.toString()); if (entity instanceof AbstractClientPlayer clientPlayer) { if (clientPlayer.getModelName().contains("slim")) { innerSlimRenderer.render(clientPlayer, yaw, partialTicks, poseStack, bufferSource, packedLight); } else { innerRenderer.render(clientPlayer, yaw, partialTicks, poseStack, bufferSource, packedLight); } } } @Override public ResourceLocation getTextureLocation(final Player player) { System.out.println("PonyPlayerWrapperRenderer getTextureLocation"); if (player instanceof AbstractClientPlayer clientPlayer) { return clientPlayer.getSkinTextureLocation(); } System.out.println("player instanceof AbstractClientPlayer is false"); return getDefaultSkin(player.getUUID()); } } public class PonyPlayerRenderer extends LivingEntityRenderer<AbstractClientPlayer, PlayerModel<AbstractClientPlayer>> { private final PlayerModel<AbstractClientPlayer> earthModel; private final PlayerModel<AbstractClientPlayer> pegasusModel; private final PlayerModel<AbstractClientPlayer> unicornModel; public PonyPlayerRenderer(final EntityRendererProvider.Context context, final boolean slim) { super( context, slim ? new PonyModelSlim(context.bakeLayer(PonyModelSlim.LAYER_LOCATION)) : new PonyModel(context.bakeLayer(PonyModel.LAYER_LOCATION)), 0.5f ); System.out.println("creating new PonyPlayerRenderer"); this.earthModel = slim ? new PonyModelSlim(context.bakeLayer(PonyModelSlim.LAYER_LOCATION)) : new PonyModel(context.bakeLayer(PonyModel.LAYER_LOCATION)); this.pegasusModel = new PegasusModel(context.bakeLayer(PegasusModel.LAYER_LOCATION)); this.unicornModel = new UnicornModel(context.bakeLayer(UnicornModel.LAYER_LOCATION)); } @Override public void render(final AbstractClientPlayer player, final float entityYaw, final float partialTicks, final PoseStack poseStack, final MultiBufferSource buffer, final int packedLight) { final PonyRace race = player.getCapability(PONY_DATA) .map(data -> ofNullable(data.getRace()).orElse(PonyRace.EARTH)) .orElse(PonyRace.EARTH); this.model = switch (race) { case PEGASUS -> pegasusModel; case UNICORN -> unicornModel; case EARTH -> earthModel; }; super.render(player, entityYaw, partialTicks, poseStack, buffer, packedLight); } @Override public ResourceLocation getTextureLocation(final AbstractClientPlayer player) { final PonyRace race = player.getCapability(PONY_DATA) .map(data -> ofNullable(data.getRace()).orElse(PonyRace.EARTH)) .orElse(PonyRace.EARTH); return switch (race) { case EARTH -> fromNamespaceAndPath(MODID, "textures/entity/earth_pony.png"); case PEGASUS -> fromNamespaceAndPath(MODID, "textures/entity/pegasus.png"); case UNICORN -> fromNamespaceAndPath(MODID, "textures/entity/unicorn.png"); }; } } @Mod.EventBusSubscriber(modid = MODID, bus = MOD, value = CLIENT) public class ClientRenderers { // mod bus render registration config @SubscribeEvent public static void onRegisterLayerDefinitions(final EntityRenderersEvent.RegisterLayerDefinitions event) { event.registerLayerDefinition(PonyModel.LAYER_LOCATION, PonyModel::createBodyLayer); event.registerLayerDefinition(PonyModelSlim.LAYER_LOCATION, PonyModelSlim::createBodyLayer); event.registerLayerDefinition(PegasusModel.LAYER_LOCATION, PegasusModel::createBodyLayer); event.registerLayerDefinition(UnicornModel.LAYER_LOCATION, UnicornModel::createBodyLayer); event.registerLayerDefinition(InnerPonyArmorModel.LAYER_LOCATION, InnerPonyArmorModel::createBodyLayer); event.registerLayerDefinition(OuterPonyArmorModel.LAYER_LOCATION, OuterPonyArmorModel::createBodyLayer); } @SubscribeEvent public static void onRegisterRenderers(final EntityRenderersEvent.RegisterRenderers event) { event.registerEntityRenderer(EntityType.PLAYER, PonyPlayerWrapperRenderer::new); System.out.println("onRegisterRenderers end"); } } Method onRegisterRenderers() is called and I can see it being logged. But when I enter the world, my PonyWrapperRenderer render() method doesn't ever seem to be called. I also tried to put my renderer to EntityRenderDispatcher's playerRenderers via reflection: @Mod.EventBusSubscriber(modid = MODID, bus = MOD, value = CLIENT) public class ClientRenderers { @SubscribeEvent public static void onRegisterLayerDefinitions(final EntityRenderersEvent.RegisterLayerDefinitions event) { event.registerLayerDefinition(PonyModel.LAYER_LOCATION, PonyModel::createBodyLayer); event.registerLayerDefinition(PonyModelSlim.LAYER_LOCATION, PonyModelSlim::createBodyLayer); event.registerLayerDefinition(PegasusModel.LAYER_LOCATION, PegasusModel::createBodyLayer); event.registerLayerDefinition(UnicornModel.LAYER_LOCATION, UnicornModel::createBodyLayer); event.registerLayerDefinition(InnerPonyArmorModel.LAYER_LOCATION, InnerPonyArmorModel::createBodyLayer); event.registerLayerDefinition(OuterPonyArmorModel.LAYER_LOCATION, OuterPonyArmorModel::createBodyLayer); } @SubscribeEvent public static void onClientSetup(final FMLClientSetupEvent event) { event.enqueueWork(() -> { try { final EntityRenderDispatcher dispatcher = Minecraft.getInstance().getEntityRenderDispatcher(); final Field renderersField = getEntityRenderDispatcherField("playerRenderers"); final Field itemInHandRenderer = getEntityRenderDispatcherField("itemInHandRenderer"); @SuppressWarnings("unchecked") final Map<String, EntityRenderer<? extends Player>> playerRenderers = (Map<String, EntityRenderer<? extends Player>>)renderersField.get(dispatcher); final PonyPlayerWrapperRenderer renderer = new PonyPlayerWrapperRenderer( new EntityRendererProvider.Context( dispatcher, Minecraft.getInstance().getItemRenderer(), Minecraft.getInstance().getBlockRenderer(), (ItemInHandRenderer)itemInHandRenderer.get(dispatcher), Minecraft.getInstance().getResourceManager(), Minecraft.getInstance().getEntityModels(), Minecraft.getInstance().font ) ); playerRenderers.put("default", renderer); playerRenderers.put("slim", renderer); System.out.println("Player renderers replaced"); } catch (final Exception e) { throw new RuntimeException("Failed to replace player renderers", e); } }); } private static Field getEntityRenderDispatcherField(final String fieldName) throws NoSuchFieldException { final Field field = EntityRenderDispatcher.class.getDeclaredField(fieldName); field.setAccessible(true); return field; } } But I receive the error before Minecraft Client appears (RuntimeException: Failed to replace player renderers - from ClientRenderers onClientSetup() method - and its cause below): java.lang.IllegalArgumentException: No model for layer anotherlittlepony:earth_pony#main at net.minecraft.client.model.geom.EntityModelSet.bakeLayer(EntityModelSet.java:18) ~[forge-1.20.1-47.4.0_mapped_official_1.20.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.renderer.entity.EntityRendererProvider$Context.bakeLayer(EntityRendererProvider.java:69) ~[forge-1.20.1-47.4.0_mapped_official_1.20.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at com.thuggeelya.anotherlittlepony.client.renderer.pony.PonyPlayerRenderer.<init>(PonyPlayerRenderer.java:32) ~[main/:?] {re:classloading} at com.thuggeelya.anotherlittlepony.client.renderer.pony.PonyPlayerWrapperRenderer.<init>(PonyPlayerWrapperRenderer.java:24) ~[main/:?] {re:classloading} at com.thuggeelya.anotherlittlepony.client.renderer.ClientRenderers.lambda$onClientSetup$0(ClientRenderers.java:79) ~[main/:?] {re:classloading} ... 33 more Problem appears when EntityRendererProvider context tries to bakeLayer with my model layer location: new PonyModel(context.bakeLayer(PonyModel.LAYER_LOCATION)); // PonyPlayerRenderer.java:32 public class PonyModel extends PlayerModel<AbstractClientPlayer> { // the model class itself public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation( ResourceLocation.fromNamespaceAndPath(MODID, "earth_pony"), "main" ); public PonyModel(final ModelPart root) { super(root, false); } public static LayerDefinition createBodyLayer() { // some CubeListBuilder stuff for model appearance } } Textures PNGs are placed at: resources/assets/[my mod id]/textures/entity. My forge version is 1.20.1. Would appreciate any help.
    • Well, a bit more information about what you're trying to do would be helpful. e.g. why you're trying to use "INVOKE_ASSIGN" instead of "INVOKE". "INVOKE_ASSIGN" calls your code after the "target" is called and its value is stored, if applicable. "INVOKE" calls your code before the target is called. "target" expects a fully qualified name, as per the SpongePowered docs, if that name is going to be remapped (which it will be if your injecting into Minecraft itself and not another mod). For more information on fully qualified names versus canonical names, see the Java specifications. Here's an example of a working "@At" from my own code that targets the "getClosestsVulnerablePlayerToEntity" call inside a mob's logic: @At(value = "INVOKE_ASSIGN", target = "net.minecraft.world.World.getClosestVulnerablePlayerToEntity(Lnet/minecraft/entity/Entity;D)Lnet/minecraft/entity/player/EntityPlayer;") Hope this helps!
    • Ran it one more time just to check, and there's no errors this time on the log??? Log : https://mclo.gs/LnuaAiu I tried allocating more memory to the modpack, around 8000MB and it's still the same; stopping at "LOAD_REGISTRIES". Are some of the mods clashing, maybe? I have no clue what to do LOL
    • Tried removing some biome generation mods and test ran it again, but it's still the same; still not responding as soon as it gets to "LOAD_REGISTRIES". This time with more errors though. Log : https://mclo.gs/uygZzD8 Is there too little memory allocated to the modpack maybe? Can someone help please.    (T.T)💔
    • This is sad. Over 3300 people have checked the thread and no one is able to help or give any ideas :(.
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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