Jump to content

Recommended Posts

Posted

Hello everyone!

I'm a VERY new modder in this community. I have never touched neither forge modding nor Java, however I am looking towards changing that. I'm in desperate need of tips, suggested learn curves, or ANYTHING! I HAVE watched a surface-level 1.15-16 forge modding in IntelliJ tutorial playlist, and I am currently working on a mod that adds tools and armor of every ore/item I think should have their counterparts, and its all going well so far... but I still want to learn some stuff like custom foods, custom GUIs, and much more. So, if any of you fellas out there are willing to help me out, I'd be more then happy to give you my contact information so you can help me. I am REALLY interested in this, so please respond if you can!

Cheers!

Posted

First of all, this sentence is in the wrong order:

Quote

I have never touched neither forge modding nor Java

You ideally would not want to start minecraft modding and hope to also learn java along the way because, trust me, it will be painful and probably will lead to you give up and stop modding very soon. First thing everyone here would suggest you is to get yourself a solid foundation in java programming, and only then start digging into the mess that is minecraft code. After you have learnt java the best sources when modding are: vanilla minecraft code, various test mods around the web, and a ton of open source mods you can look into to see how they do things. Regarding tutorials on the web, GreyGhost's one is a good place to learn: https://github.com/TheGreyGhost/MinecraftByExample. I suggest to not follow  the tutorial series you can find on youtube because:

1)  They follow and teach some bad coding practices (refer to this post for explanations https://forums.minecraftforge.net/topic/92655-1163-how-do-i-create-a-new-dimension/?tab=comments#comment-427419)

2) For the most part they don't explain how the code they are showing works

3) They don't really cover many things and if you need to do something that there is not a tutorials for you would be stuck because they didn't give you the tools to do things on your own.

Again, its highly suggested to learn java before even thinking to start modding minecraft (if you care about your mental sanity)

Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port

Posted
20 minutes ago, BeastDev said:

I have never touched neither forge modding nor Java

Do not try learning a library of Java without learning Java itself. It's like trying to run before you can walk. This is why almost everyone suggests that you take some time (probably a years-worth if you want to have the concepts with some level of mastery) before you learn how to use the Forge Modding Library

24 minutes ago, BeastDev said:

I HAVE watched a surface-level 1.15-16 forge modding in IntelliJ tutorial playlist

The only videos we recommend are those from McJty. This is because most tutorial videos usually promote bad practices or outdated code. Mine also fall under this category. Spend some time reading the documentation and analyzing the source before attempting this. This is of course once you have an intermediate level of Java.

Posted
13 minutes ago, Beethoven92 said:

First thing everyone here would suggest you is to get yourself a solid foundation in java programming, and only then start digging into the mess that is minecraft code.

Yeah, i figured... I DO have experience to some extend, but it's all from my school (electrical engineering)- I'm sure you know it's all basic-level stuff. School's killing me atm, but rumors are saying that my country is gonna close them again, which I am really hoping for (go figure), and if that IS the case, I'd me more then happy to spend a few months on constantly learning Java. I've always been told I'm a fast learner, and when I put my mind to learning something, that's basically all I do. I learned c#, GML and html that way, so I'm hoping a few months are enough for me to get a semi-solid foundation for this. Now, the question is: can you suggest a place to start? Perhaps a certain use of Java coding I should start with (like game development, program coding or anything like that), or a documented, or even better VIDEO tutorial/course I can follow? I'd be mad thankful if you did!

28 minutes ago, Beethoven92 said:

First of all, this sentence is in the wrong order:

Yeah, sorry about that... English is not my native language and I'm honestly tired rn... been a long day. So, apologies if my English is crooked, or my sentences don't make sense, I'm trying my best!

Posted (edited)
24 minutes ago, BeastDev said:

Yeah, sorry about that... English is not my native language and I'm honestly tired rn... been a long day. So, apologies if my English is crooked, or my sentences don't make sense, I'm trying my best!

Sorry, this was not meant to be a grammatical correction 😆 my english is pretty bad as well...i thought that what i said after that explained my first sentence, but for clarification i just meant that you should not put modding before java learning into your mindset, thats all

 

Quote

Now, the question is: can you suggest a place to start? Perhaps a certain use of Java coding I should start with (like game development, program coding or anything like that), or a documented, or even better VIDEO tutorial/course I can follow? I'd be mad thankful if you did!

Good Java knowledge (and a great amount of patience) should be enough to get you appreciable results..of course knowledge of how a video games generally works can only be of help, but its not really mandatory regarding minecraft modding (in my opinion). You marking the VIDEO word makes me think that you are someone who learns better by watching and listening rather than by reading? Unfortunately i do not know if there are good java tutorials on youtube because personally i learnt on a java manual. Probably someone else can point you to good java tutorials/courses on the web. Last, since you seem to prefer video tutorials, regarding forge modding there's actually a good tutorial on youtube. Take a look at McJty channel here: https://www.youtube.com/channel/UCYMg1JQw3syJBgPeW6m68lA/videos?view_as=subscriber

Edited by Beethoven92
  • Like 1

Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port

Posted
6 minutes ago, Beethoven92 said:

You marking the VIDEO word makes me think that you are someone who learns better by watching and listening rather than by reading?

 Thanks so much for the replies. I guess ill just go to my local IT store, I have been eyeballing some Java books... they are pretty thick tho so it might take a while 😂. Sorry for bothering you, but just one more question: in the meantime, do you think you can help me out with this mod? I'd like to ask you a few direct questions on what SHOULD be basic stuff, i'm just trying to finish this mod for now, but i'll be sure to get some good knowledge on Java later.

Posted (edited)

Well, i am by no means the best forge modder here, there are lot of people with much more experience around. Look, if you have trouble developing your mod you can make a post on this forum explaining what the issue is and possibly show the code you tried, and who will have time to answer (me or someone else) will help you. Just one recommendation, don't expect people here to give away the code ready for you...if possibile on this forum we try to give hints and point people to good learning material so they can eventually figure them out the solution of their problem, and learn something in the process

Edited by Beethoven92
  • Thanks 1

Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port

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

    • So me and a couple of friends are playing with a shitpost mod pack and one of the mods in the pack is corail tombstone and for some reason there is a problem with it, where on death to fire the player will get kicked out of the server and the tombstone will not spawn basically deleting an entire inventory, it doesn't matter what type of fire it is, whether it's from vanilla fire/lava, or from modded fire like ice&fire/lycanites and it's common enough to where everyone on the server has experienced at least once or twice and it doesn't give any crash log. a solution to this would be much appreciated thank you!
    • It is 1.12.2 - I have no idea if there is a 1.12 pack
    • Okay, but does the modpack works with 1.12 or just with 1.12.2, because I need the Forge client specifically for Minecraft 1.12, not 1.12.2
    • 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() ); } }  
  • Topics

×
×
  • Create New...

Important Information

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