Jump to content

Recommended Posts

Posted
  On 8/12/2016 at 5:07 PM, Animefan8888 said:

  Quote

  Quote

if (false) return;

There are two possible places for this, which are you referring to?

Here

                if (ChatListener.isAFK = false) {
	    ChatListener.isAFK = true;
	    icommandsender.addChatMessage(new ChatComponentText("You are now AFK!"));
	    return;
                }

If this doesn't work it is not being called.

I use that and it only comes up with the "Hello" message, not the "You are now AFK!".

  • Replies 50
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted
  On 8/11/2016 at 5:33 PM, CoalOres said:

  Quote

 

- Why are you still on 1.8? Update.

I'm more familiar with 1.8 and my goal is to create a special mod which is based around Hypixel, which supports 1.8. 1.9 and 1.10 is new territory for me.

10/10 IGN will never update again!

 

EDIT: I felt like adding some humor to this thead... So I did.

Posted
  On 8/12/2016 at 5:12 PM, CoalOres said:

  Quote

  Quote

  Quote

if (false) return;

There are two possible places for this, which are you referring to?

Here

                if (ChatListener.isAFK = false) {
	    ChatListener.isAFK = true;
	    icommandsender.addChatMessage(new ChatComponentText("You are now AFK!"));
	    return;
                }

If this doesn't work it is not being called.

I use that and it only comes up with the "Hello" message, not the "You are now AFK!".

Then it is never making it into the if statement, or it can't send the message try removing the help message.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted
  On 8/12/2016 at 5:19 PM, Animefan8888 said:

  Quote

  Quote

  Quote

  Quote

if (false) return;

There are two possible places for this, which are you referring to?

Here

                if (ChatListener.isAFK = false) {
	    ChatListener.isAFK = true;
	    icommandsender.addChatMessage(new ChatComponentText("You are now AFK!"));
	    return;
                }

If this doesn't work it is not being called.

I use that and it only comes up with the "Hello" message, not the "You are now AFK!".

Then it is never making it into the if statement, or it can't send the message try removing the help message.

Removed the help message and this time it came up with nothing.  I don't really understand how the code you sent me is going to work, what if isAfk = true? Then it does nothing and doesn't set it to false so it just doesn't work.

 

Was I supposed to use two of those if statements? <-- Will try

 

Edit: Having two statements returned "No longer afk" constantly. I feel like it isn't setting the variable to true.

Posted
  On 8/12/2016 at 5:38 PM, Animefan8888 said:

In your MainMod class in the @Mod annotation set clientSideOnly = true not sure if that will fix it, but you should do that anyways.

Didn't help, but if I set the isAfk variable to true beforehand the /r function works, upon doing it again it says "No longer afk" constantly and doesnt work.

Posted
  On 8/13/2016 at 12:03 PM, diesieben07 said:

  Quote
@EventHandler

    public void preInit(FMLPreInitializationEvent event)

    {

        // Stub Method

    MinecraftForge.EVENT_BUS.register(new ChatListener());

   

    }

What do you mean by "// Stub Method"?

 

  Quote
@EventHandler

    public void postInit(FMLPostInitializationEvent event)

    {

        // Stub Method

    }

Why is this here? It does precisely nothing.

 

  Quote
public static boolean isAFK = false;
Pretty ugly to just have it in a global variable somewhere, but I suppose this will work.

 

  Quote
@Override

public int compareTo(Object o) {

// TODO Auto-generated method stub

return 0;

}

Why is this still here? How many times do I need to say this?

Also why do all your methods still have the stupid comment from Eclipse inside them?!

 

  Quote
if (ChatListener.isAFK = false)
This is not how you check a boolean variable. This if statement will never run. = means assign, not compare. You want ==. Please learn basic Java.

 

  Quote
@Override

public boolean isUsernameIndex(String[] arg0, int arg1) {

// TODO Auto-generated method stub

return false;

}}

Same as above, why is this still here?

 

1. It's something generated automatically by eclipse.

 

2.It may do in the future, all of the tutorials I have seen recommend keeping those for the future.

 

3. Anyway I could make it neater? It was a post I saw on stack overflow.

 

4. I thought anything that returns false or 0 was important, but anything which returned null wasn't.

 

5. I'm sorry, it was a mistake I won't make again.

 

6. 4

 

And how do I add a reason to it? Another global string called reason which I modify in the SampleCommand class?

Posted
  On 8/13/2016 at 1:36 PM, diesieben07 said:

  Quote
It's something generated automatically by eclipse.
And why is it still there?

 

  Quote

It may do in the future, all of the tutorials I have seen recommend keeping those for the future.

...

 

  Quote
Anyway I could make it neater? It was a post I saw on stack overflow.
Well, static state is always bad, because it hurts maintainability, etc. Ideally you'd want this in like a capability on the player, but that is overkill for now.

 

  Quote
I thought anything that returns false or 0 was important, but anything which returned null wasn't.
What... that is not how Java works.

 

  Quote
And how do I add a reason to it? Another global string called reason which I modify in the SampleCommand class?

I guess you could do that, yes.

But as you can see this is already getting kinda messy ;)

 

Would this segment of code work?

 

if (args.length == 1){
		ChatListener.reason = args[0].toString();
		ChatListener.isAFK = true;

Posted
  On 8/13/2016 at 1:45 PM, diesieben07 said:

Not sure why the

toString

call is there, but yes, that would set the two fields...

The reason isn't working for some reason.

 

New Code:

 

Main:

 

package com.testmod;

import com.testmod.SampleCommand;

import net.minecraftforge.client.ClientCommandHandler;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.Mod.Instance;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;

@Mod(modid="testmod", name="Test Mod", version="1.0", clientSideOnly = true)

public class TutorialMain
{

    // The instance of your mod that Forge uses, in my case tutorial.
    @Instance("testmod")
    public static TutorialMain instance;
    

    @EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
        // Stub Method
    	MinecraftForge.EVENT_BUS.register(new ChatListener());
    	
    }

    @EventHandler
    public void init(FMLInitializationEvent event)
    {
    	ClientCommandHandler.instance.registerCommand(new SampleCommand());
    	
    	

    }

    @EventHandler
    public void postInit(FMLPostInitializationEvent event)
    {
        // Stub Method
    }
    

   

}

 

SampleCommand:

 

package com.testmod;

import java.util.ArrayList;
import java.util.List;
import eu.copybara.barra.util.*;
import net.minecraft.command.CommandBase;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommand;
import net.minecraft.command.ICommandSender;
import net.minecraft.util.BlockPos;
import net.minecraft.util.ChatComponentText;

public class SampleCommand extends CommandBase {

@Override
public boolean canCommandSenderUse(ICommandSender icommandsender) {
	// TODO Auto-generated method stub
	return true;
}
@Override
public void execute(ICommandSender icommandsender, String[] args) throws CommandException {
	// TODO Auto-generated method stub
	if (ChatListener.isAFK == false) {
	    ChatListener.isAFK = true;
	    icommandsender.addChatMessage(new ChatComponentText("You are now AFK!"));
	    return;
    }
	if (ChatListener.isAFK == true) {
	    ChatListener.isAFK = false;
	    icommandsender.addChatMessage(new ChatComponentText("You are no longer AFK!"));
	    return;
    }
	if (args.length == 1){
		ChatListener.reason = args[0].toString();
		ChatListener.isAFK = true;
	}

}
@Override
public String getCommandUsage(ICommandSender icommandsender) {
	// TODO Auto-generated method stub
	return "afk <reason>";
}

@Override
public String getName() {
	// TODO Auto-generated method stub
	return "afk";
}
@Override
public boolean isUsernameIndex(String[] arg0, int arg1) {
	// TODO Auto-generated method stub
	return false;
}}

 

 

 

ChatListener:

 

package com.testmod;

import net.minecraft.client.Minecraft;
import net.minecraftforge.client.event.ClientChatReceivedEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

public class ChatListener {
public static boolean isAFK = false;
public static String reason = "";

@SubscribeEvent
public void onChat(ClientChatReceivedEvent event) {
	String message = event.message.getUnformattedText();
	if (message.contains("From") && isAFK) {
		Minecraft.getMinecraft().thePlayer.sendChatMessage("/r I am currently AFK. Reason: " + ChatListener.reason);
	}




	}
}



 

If I do /afk <reason> it just comes up with whatever I had it preset to in the code, which in this case is "".

Posted
  On 8/13/2016 at 2:49 PM, CoalOres said:

If I do /afk <reason> it just comes up with whatever I had it preset to in the code, which in this case is "".

Because args.length is equal to the number of arguments aka "Hello my name is Anime" is 5 not 1.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted

if (status == true)
do stuff;
if (status == false)
do otherStuff;

 

*triggered*

 

if (status)
do stuff;
else
do otherStuff;

 

^ Hint: 2nd is better?

 

As to "args problem" - build your string with StringBuilder or just with:

String res = "";
for (String s : strings)
res += s + " ";

  Quote

1.7.10 is no longer supported by forge, you are on your own.

Posted
  On 8/13/2016 at 3:11 PM, Ernio said:

if (status == true)
do stuff;
if (status == false)
do otherStuff;

 

*triggered*

 

if (status)
do stuff;
else
do otherStuff;

 

^ Hint: 2nd is better?

 

As to "args problem" - build your string with StringBuilder or just with:

String res = "";
for (String s : strings)
res += s + " ";

How do I incorporate that bottom thing?

 

I've got to this stage:

 

		String res = ""; {

		for (String s : args) {
		res += s + " ";
		}}

Posted
  On 8/13/2016 at 3:55 PM, diesieben07 said:

  Quote
As to "args problem" - build your string with StringBuilder or just with

Simpler imho:

Joiner.on("").join(strings);

 

Or some Java 8 magic:

Stream.of(strings).join(Collectors.joining());

 

  Quote
How do I incorporate that bottom thing? It says "strings cannot be resolved to a variable".

Jesus... you are not supposed to just copy the code. You are supposed to understand it and adapt it to your situation.

 

I understand now, just threw me off with the Strings thing, didn't realise I needed to replace it with args. I would have written it for(String s: (strings)), that would have made more sense to me because it was in brackets.

 

Either way I understand now, still don't know how to incorporate it. Be nice if you could just send me a corrected version.

Posted
  On 8/13/2016 at 4:04 PM, diesieben07 said:

Correct version? The version Ernio posted was fine.

You dump the array of strings into one String. It's really not hard. If you do not understand basic programming like this you need to stop modding and learn programming first.

Why is it so difficult to convey things to you -_-. I meant the corrected version of MY code. I have no idea how to put that into my code. It would save a lot of time if I could just have it fixed and then try to understand from that.

Posted
  On 8/13/2016 at 4:09 PM, Animefan8888 said:

You currently have it. Instead of setting your message variable to args[0] set it to res.

I've done so and it doesn't even come with any reason at all. That was my initial problem, none of the arguments actually came up.

Posted
  On 8/13/2016 at 4:06 PM, CoalOres said:

  Quote

Correct version? The version Ernio posted was fine.

You dump the array of strings into one String. It's really not hard. If you do not understand basic programming like this you need to stop modding and learn programming first.

Why is it so difficult to convey things to you -_-. I meant the corrected version of MY code. I have no idea how to put that into my code. It would save a lot of time if I could just have it fixed and then try to understand from that.

 

No one is going to provide you code that you can copy and paste. You have top actually know what you're doing.

 

You apparently missed the "this is not Java school" on the board description. Good news: that info is also in my sig.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted
  On 8/13/2016 at 4:19 PM, Draco18s said:

  Quote

  Quote

Correct version? The version Ernio posted was fine.

You dump the array of strings into one String. It's really not hard. If you do not understand basic programming like this you need to stop modding and learn programming first.

Why is it so difficult to convey things to you -_-. I meant the corrected version of MY code. I have no idea how to put that into my code. It would save a lot of time if I could just have it fixed and then try to understand from that.

 

No one is going to provide you code that you can copy and paste. You have top actually know what you're doing.

 

You apparently missed the "this is not Java school" on the board description. Good news: that info is also in my sig.

 

Helpful comment is helpful.

 

The majority of stuff said in this post could be on the first page.

 

I've had an issue getting the arguments to work at all.

Posted
  On 8/13/2016 at 4:23 PM, Animefan8888 said:

  Quote

I've had an issue getting the arguments to work at all.

Could you explain a little more?

 

This is my command's execute method:

 

public void execute(ICommandSender icommandsender, String[] args) throws CommandException {
	// TODO Auto-generated method stub
	if (ChatListener.isAFK == false) {
	    ChatListener.isAFK = true;
	    icommandsender.addChatMessage(new ChatComponentText("You are now AFK!"));
	    return;
    }
	if (ChatListener.isAFK == true) {
	    ChatListener.isAFK = false;
	    icommandsender.addChatMessage(new ChatComponentText("You are no longer AFK!"));
	    return;
    }
	 ChatListener.reason = Joiner.on(" ").join(args);

 

This is my chatlistener class:

 

public void onChat(ClientChatReceivedEvent event) {
	String message = event.message.getUnformattedText();
	if (message.contains("From") && isAFK) {
		Minecraft.getMinecraft().thePlayer.sendChatMessage("/r I am currently AFK. Reason: " + ChatListener.reason);
	}

Upon doing /afk this is a test, it replies "I am currently AFK. Reason: "

 

If I change Reason manually in the code it sets it to that.

Posted
  On 8/13/2016 at 4:30 PM, Animefan8888 said:

Try removing the space in the Joiner.on(" ")

Nope...

  Quote

  Quote

Try removing the space in the Joiner.on(" ")

Didn't work.

Because it was correct. Read Guava docs.

 

I already gave you solution in my 1st post.

DO YOUR STATEMENTS LIKE I SHOWED AND DON'T USE "return"... (Joiner is never reached)

  Quote

1.7.10 is no longer supported by forge, you are on your own.

Guest
This topic is now closed to further replies.

Announcements




  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • To prevent dependency errors, yes  
    • dynamictrees and dtneapolitan are the last mentioned mod - remove these
    • https://mclo.gs/9y5ciD2 anyone ever had this issue?  Internal exception illegal argument exception: unable to fit 3194354 into 3
    • 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.
  • Topics

×
×
  • Create New...

Important Information

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