Jump to content

Recommended Posts

Posted

Hey all,

I'm new to modding in minecraft, and have started following the tutorials at orangetutorial.com to get started with some basics. Originally, I started using eclipse since I have used it before, and got about as far as making a basic, barebones mod. About all I had changed on my own was fiddle with the mcmod.info file, and the changes were there when I launched minecraft through eclipse. But after seeing some videos I decided I wanted to give Intellij a try. I got things set up and made sure things could compile and run, then continued on with the tutorials which went into adding a block to minecraft, and giving it a texture and a name.  After adding the code described in the tutorial and running minecraft, the block was added, but still with an unlocalized name and no texture, though my texture file and lang file were where they needed to be, and were being put into the proper place in the build directory. At this point I also noticed that the changes I made to the mcmod.info file were also not being recognized. Out of curiosity, I tried compiling a jar with gradlew build and dropping it into the mods folder like I would any mod, outside the dev environment. Done this way, the block had a name and texture, and I could see my mcmod.info changes, so it seems that minecraft in the dev environment isn't able to read in resources properly. Does anyone know how to fix this?

Thanks!

Posted

the en_US.lang file is in src\main\resources\assets\tutorialorange\lang and the texture is in src\resources\assets\tutorialorange\blocks (tutorialorange is the mod id). IntelliJ was setup by running gradlew setupDecompWorkspace --refresh-dependencies, importing the build.gradle file into IntelliJ as a project, and then running gradlew gIR to set up the run commands.

Posted

I know, right? I can see in the forge logs that it recurses through the resource folder while looking for mods, and it does say it found an mcmod.info file. At that point tutorialorange was already identified as a mod. Would that influence anything, with them being read at different times?

 

...Kind of running out of ideas xD

Posted

I see...

I noticed that in the build folder, the classes are in classes\main\<rest of file path> and resources are in resources\main\<rest of file path>. Compared to the jar file from gradlew build, where the classes\main and resources\main parts of those file paths are not present (meaning, there is the contents of classes\main and resources\main together in the jar). Could those extra folders in the build folder be keeping the mod from reading the resources properly?

Posted

Gah. Well thanks anyways. Whenever I try to do something new with computers, I seem to be plagued by weird problems like this xD

 

Do you know how forge knows where to look for the mod's assets? Maybe it's looking for them in the wrong place, and I need to configure it to look in the correct place?

Posted

Can I see the latest log and the Constants class? (Please use http://gist.github.com or any other pastebin)

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Posted

I spent a while messing the the debugger to see how FML is loading the mod and it's resources. I was able to find out that it loads the mod with directory build/classes, which is fine...but then when loading resource packs in which to find textures, the same mod location is added as a resource path. Though both build/classes and build/resources are in the classpath, build/resources is never used because no mods were found in it, while build/classes is used as the resource path because it is the mod's class path. This would explain why compiling to a .jar works, because then the class path and resource path are the same. To test, I copied my resources to the build/classes folder, and it worked. How to fix this, though, I have no clue >.>

Posted

Aside from just wanting to try something new, I was also having difficulty getting the code completion in Eclipse to work the way I wanted it to. In IntelliJ it's working perfectly xD but otherwise no particular reason. Yes Eclipse does have lots of features, but I never really used any of them that IntelliJ doesn't have. I actually like the less feature-cluttered workspace lol

Posted

After looking more closely at why it works in Eclipse, I noticed that Eclipse puts everything into a bin folder, both compiled classes and resources. This would make the class path and resource path the same, and so it works properly. So I guess now the question is, how can I set up IntelliJ to put classes and resources in the same directory?

Posted

Most of this is beyond my current knowledge so this may be a stupid question but i noticed toy setup your workspace in a way i am not familiar with.

 

the en_US.lang file is in src\main\resources\assets\tutorialorange\lang and the texture is in src\resources\assets\tutorialorange\blocks (tutorialorange is the mod id). IntelliJ was setup by running gradlew setupDecompWorkspace --refresh-dependencies, importing the build.gradle file into IntelliJ as a project, and then running gradlew gIR to set up the run commands.

 

Have you tried creating a fresh workspace and using

gradlew setupDecompWorkspace

gradlew idea

 

I am the author of Draconic Evolution

Posted

Use diesieben07's tutorial for setting up Forge with IntelliJ. Tutorial found in the tutorials section.

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Posted

Well I figured it out. I knew I must have been missing something obvious, and I was...IntelliJ 14 places resources in it's own resource folder, while IntelliJ 13 places them in the classes folder. No tutorials I've seen mentioned a version, but I saw from screenshots that 13 was being used. I had just gone ahead and grabbed the latest though, and apart from the screen displayed when no projects are open, they look almost identical, so it took a while to notice. So yeah, fixed xD

Posted

Well I figured it out. I knew I must have been missing something obvious, and I was...IntelliJ 14 places resources in it's own resource folder, while IntelliJ 13 places them in the classes folder. No tutorials I've seen mentioned a version, but I saw from screenshots that 13 was being used. I had just gone ahead and grabbed the latest though, and apart from the screen displayed when no projects are open, they look almost identical, so it took a while to notice. So yeah, fixed xD

Very nice find! Did you solve it without downgrading to IntelliJ 13 or is downgrading necessary to fix this problem?

Posted

Well I figured it out. I knew I must have been missing something obvious, and I was...IntelliJ 14 places resources in it's own resource folder, while IntelliJ 13 places them in the classes folder. No tutorials I've seen mentioned a version, but I saw from screenshots that 13 was being used. I had just gone ahead and grabbed the latest though, and apart from the screen displayed when no projects are open, they look almost identical, so it took a while to notice. So yeah, fixed xD

Very nice find! Did you solve it without downgrading to IntelliJ 13 or is downgrading necessary to fix this problem?

This bloke came up with a fix

http://www.minecraftforge.net/forum/index.php/topic,25429.msg129629.html#msg129629

 

Well I figured it out. I knew I must have been missing something obvious,

 

You've got a funny definition of "obvious" I must say :)

 

-TGG

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

    • Version 1.19 - Forge 41.0.63 I want to create a wolf entity that I can ride, so far it seems to be working, but the problem is that when I get on the wolf, I can’t control it. I then discovered that the issue is that the server doesn’t detect that I’m riding the wolf, so I’m struggling with synchronization. However, it seems to not be working properly. As I understand it, the server receives the packet but doesn’t register it correctly. I’m a bit new to Java, and I’ll try to provide all the relevant code and prints *The comments and prints are translated by chatgpt since they were originally in Spanish* Thank you very much in advance No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. MountableWolfEntity package com.vals.valscraft.entity; import com.vals.valscraft.network.MountSyncPacket; import com.vals.valscraft.network.NetworkHandler; import net.minecraft.client.Minecraft; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.animal.Wolf; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.Entity; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.network.PacketDistributor; public class MountableWolfEntity extends Wolf { private boolean hasSaddle; private static final EntityDataAccessor<Byte> DATA_ID_FLAGS = SynchedEntityData.defineId(MountableWolfEntity.class, EntityDataSerializers.BYTE); public MountableWolfEntity(EntityType<? extends Wolf> type, Level level) { super(type, level); this.hasSaddle = false; } @Override protected void defineSynchedData() { super.defineSynchedData(); this.entityData.define(DATA_ID_FLAGS, (byte)0); } public static AttributeSupplier.Builder createAttributes() { return Wolf.createAttributes() .add(Attributes.MAX_HEALTH, 20.0) .add(Attributes.MOVEMENT_SPEED, 0.3); } @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack itemstack = player.getItemInHand(hand); if (itemstack.getItem() == Items.SADDLE && !this.hasSaddle()) { if (!player.isCreative()) { itemstack.shrink(1); } this.setSaddle(true); return InteractionResult.SUCCESS; } else if (!level.isClientSide && this.hasSaddle()) { player.startRiding(this); MountSyncPacket packet = new MountSyncPacket(true); // 'true' means the player is mounted NetworkHandler.CHANNEL.sendToServer(packet); // Ensure the server handles the packet return InteractionResult.SUCCESS; } return InteractionResult.PASS; } @Override public void travel(Vec3 travelVector) { if (this.isVehicle() && this.getControllingPassenger() instanceof Player) { System.out.println("The wolf has a passenger."); System.out.println("The passenger is a player."); Player player = (Player) this.getControllingPassenger(); // Ensure the player is the controller this.setYRot(player.getYRot()); this.yRotO = this.getYRot(); this.setXRot(player.getXRot() * 0.5F); this.setRot(this.getYRot(), this.getXRot()); this.yBodyRot = this.getYRot(); this.yHeadRot = this.yBodyRot; float forward = player.zza; float strafe = player.xxa; if (forward <= 0.0F) { forward *= 0.25F; } this.flyingSpeed = this.getSpeed() * 0.1F; this.setSpeed((float) this.getAttributeValue(Attributes.MOVEMENT_SPEED) * 1.5F); this.setDeltaMovement(new Vec3(strafe, travelVector.y, forward).scale(this.getSpeed())); this.calculateEntityAnimation(this, false); } else { // The wolf does not have a passenger or the passenger is not a player System.out.println("No player is mounted, or the passenger is not a player."); super.travel(travelVector); } } public boolean hasSaddle() { return this.hasSaddle; } public void setSaddle(boolean hasSaddle) { this.hasSaddle = hasSaddle; } @Override protected void dropEquipment() { super.dropEquipment(); if (this.hasSaddle()) { this.spawnAtLocation(Items.SADDLE); this.setSaddle(false); } } @SubscribeEvent public static void onServerTick(TickEvent.ServerTickEvent event) { if (event.phase == TickEvent.Phase.START) { MinecraftServer server = net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(); if (server != null) { for (ServerPlayer player : server.getPlayerList().getPlayers()) { if (player.isPassenger() && player.getVehicle() instanceof MountableWolfEntity) { MountableWolfEntity wolf = (MountableWolfEntity) player.getVehicle(); System.out.println("Tick: " + player.getName().getString() + " is correctly mounted on " + wolf); } } } } } private boolean lastMountedState = false; @Override public void tick() { super.tick(); if (!this.level.isClientSide) { // Only on the server boolean isMounted = this.isVehicle() && this.getControllingPassenger() instanceof Player; // Only print if the state changed if (isMounted != lastMountedState) { if (isMounted) { Player player = (Player) this.getControllingPassenger(); // Verify the passenger is a player System.out.println("Server: Player " + player.getName().getString() + " is now mounted."); } else { System.out.println("Server: The wolf no longer has a passenger."); } lastMountedState = isMounted; } } } @Override public void addPassenger(Entity passenger) { super.addPassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(true)); } } } @Override public void removePassenger(Entity passenger) { super.removePassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is no longer mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(false)); } } } @Override public boolean isControlledByLocalInstance() { Entity entity = this.getControllingPassenger(); return entity instanceof Player; } @Override public void positionRider(Entity passenger) { if (this.hasPassenger(passenger)) { double xOffset = Math.cos(Math.toRadians(this.getYRot() + 90)) * 0.4; double zOffset = Math.sin(Math.toRadians(this.getYRot() + 90)) * 0.4; passenger.setPos(this.getX() + xOffset, this.getY() + this.getPassengersRidingOffset() + passenger.getMyRidingOffset(), this.getZ() + zOffset); } } } MountSyncPacket package com.vals.valscraft.network; import com.vals.valscraft.entity.MountableWolfEntity; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class MountSyncPacket { private final boolean isMounted; public MountSyncPacket(boolean isMounted) { this.isMounted = isMounted; } public void encode(FriendlyByteBuf buffer) { buffer.writeBoolean(isMounted); } public static MountSyncPacket decode(FriendlyByteBuf buffer) { return new MountSyncPacket(buffer.readBoolean()); } public void handle(NetworkEvent.Context context) { context.enqueueWork(() -> { ServerPlayer player = context.getSender(); // Get the player from the context if (player != null) { // Verifies if the player has dismounted if (!isMounted) { Entity vehicle = player.getVehicle(); if (vehicle instanceof MountableWolfEntity wolf) { // Logic to remove the player as a passenger wolf.removePassenger(player); System.out.println("Server: Player " + player.getName().getString() + " is no longer mounted."); } } } }); context.setPacketHandled(true); // Marks the packet as handled } } networkHandler package com.vals.valscraft.network; import com.vals.valscraft.valscraft; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.simple.SimpleChannel; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class NetworkHandler { private static final String PROTOCOL_VERSION = "1"; public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel( new ResourceLocation(valscraft.MODID, "main"), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals ); public static void init() { int packetId = 0; // Register the mount synchronization packet CHANNEL.registerMessage( packetId++, MountSyncPacket.class, MountSyncPacket::encode, MountSyncPacket::decode, (msg, context) -> msg.handle(context.get()) // Get the context with context.get() ); } }  
    • Do you use features of inventory profiles next (ipnext) or is there a change without it?
    • Remove rubidium - you are already using embeddium, which is a fork of rubidium
  • Topics

×
×
  • Create New...

Important Information

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