Jump to content

Recommended Posts

Posted

I have this json recipe in assets/modid/recipes folder

{
  "type": "minecraft:crafting_shaped",
  "pattern": [
    "AAA",
    "ASA",
    "AAA"
  ],
  "key": {
    "S": {
      "item": "mw:ruby"
    },
    "A": [
      {
        "item": "minecraft:stone",
      },
    ]
  },
  "result": {
    "item": "mw:ruby_ore",
    "data": 0
  }
}



But in game is not working, so i guess i have to register it. So how can i register a crafting recipe in 1.12? :)

  • Like 1

Don't blame me if i always ask for your help. I just want to learn to be better :)

Posted
2 minutes ago, JimiIT92 said:

assets/modid/recipes

Does the path actually contain "modid"? Because it should be the actual modid of your mod.

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 (edited)

Yes, i said "modid" to be generic, but the actual path is assets/mw/recipes (since mw is my mod id). Other things like blocks and items works as well so i guess is not a wrong folder path

Edited by JimiIT92

Don't blame me if i always ask for your help. I just want to learn to be better :)

Posted

Do you get any errors about recipes when loading the game? I'm asking because JSONLint gives an error at 

"A": [
      {
        "item": "minecraft:stone",
      },
    ]

as you have a spare comma after the "item" tag. Other than that, I can't see anything wrong.

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

Can you actually register recipes from the JSON files? I've been using GameRegistry.addShapedRecipe / GameRegistry.addShapelessRecipe in 1.12, and it works just fine...

Whatever Minecraft needs, it is most likely not yet another tool tier.

Posted
1 hour ago, IceMetalPunk said:

Can you actually register recipes from the JSON files? I've been using GameRegistry.addShapedRecipe / GameRegistry.addShapelessRecipe in 1.12, and it works just fine...

Yes. Json files is the 1.12 way.

  • Like 1

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 (edited)
2 minutes ago, Draco18s said:

Yes. Json files is the 1.12 way.

 

I wonder if this is the cause of my previous crashing problem I asked about in another topic that was never answered. If I were to have a recipe in its .json form and also register it through addShapedRecipe / addShapelessRecipe, would that cause a conflict and crash? (The error message received is a generic JVM one, so I didn't know where the problem was other than it only happened when I added the advancement and recipe .json files.)

Edited by IceMetalPunk
Added quote

Whatever Minecraft needs, it is most likely not yet another tool tier.

Posted
10 hours ago, larsgerrits said:

Do you get any errors about recipes when loading the game? I'm asking because JSONLint gives an error at 


"A": [
      {
        "item": "minecraft:stone",
      },
    ]

as you have a spare comma after the "item" tag. Other than that, I can't see anything wrong.

Woops. By the way that comma was not the problem, i removed that but the recipe is still not working. I guess i must register it before but can't figure out how

Don't blame me if i always ask for your help. I just want to learn to be better :)

Posted

The recipe should be registered automatically if your json is being loaded properly.

Do you actually get nothing in the output slot when trying to craft the recipe in-game? or is the recipe just not showing up in the recipe book in-game?

To get the recipe to show in the book, you should do the command: /recipe give @p <name of your recipe> in-game.

Posted (edited)

Hi there,

 

I was on the outlook for beginners information about "how to add a recipe" and started worrying about not finding beginner-friendly information about itemStacks and shapeless registries, when passing by this topic. And I can confirm the error you are observing.

 

The idea just to add a recipe.json in a designated folder and having all the magic done by forge did sound fabulous. So I copied your json file from the very first post, removed the comma-errors (why do you have an array containing the minecraft-stone?) and replaced all with stuff from my mod. And it worked perfectly. That is what it does look alike. 

Spoiler

{
  "type": "minecraft:crafting_shaped",
  "pattern": [
    "ASA",
    "A A",
    "ASA"
  ],
  "key": {
    "S": {
      "item": "ianusinchq:tutorial_ingot"
    },
    "A": [
      {
        "item": "ianusinchq:tutorial_nugget"
      }
    ]
  },
  "result": {
    "item": "ianusinchq:tutorial_ore",
    "data": 0
  }
}

 

More or less the same as you did, but with mod-exclusive items only. 

 

Than I added another part into it (attention, in relation to the attached picture, it was minecraft:stone what was there at the moment of screenshot)

Spoiler

{
  "type": "minecraft:crafting_shaped",
  "pattern": [
    "ASA",
    "ACA",
    "ASA"
  ],
  "key": {
    "S": {
      "item": "ianusinchq:tutorial_ingot"
    },
    "A":
      {
        "item": "ianusinchq:tutorial_nugget"
      },
    "C":
    {
      "item": "minecraft:sand"
    }

  },
  "result": {
    "item": "ianusinchq:tutorial_ore",
    "data": 0
  }
}

 

But this didn't work after all. As you might see I added two pictures from both recipes..... and I think I might need some online space to share pictures, because having them fully expanded at the end of my posts might be irritating to some. 

Next I was like "maybe its not called "stone" any more, which made me seek out one of the jars and... moron I am I looked inside the 1.11.2.jar. Waitaminute... no, its the same in 1.12.jar: there is a stone.json as a block and an item too, so that should not be the error. 

Next step was replacing stone with somethig else... like sand. My crafting table is situated at a beach (and it was the only blockItem I could identify shortly). With the same result: does not work.

 

And then I went to the logfiles. 

latestLog doesn't know any recipe. 

fml-junk does know one of the recipes: the one that contains just the mod items

fml-client-latest finally offered some insight, aaaand... I'll be so bold to assume, that this may be something that comes from forge itself, isn't it? Have a look: 

Spoiler

13:50:53] [main/DEBUG] [FML/]: Bar Finished: Rendering Setup took 6.572s
[13:50:54] [main/ERROR] [FML/]: Parsing error loading recipe ianusinchq:tutorial_recipe2
com.google.gson.JsonParseException: Missing data for item 'minecraft:sand'
    at net.minecraftforge.common.crafting.CraftingHelper.getItemStackBasic(CraftingHelper.java:256) ~[CraftingHelper.class:?]
    at net.minecraftforge.common.crafting.CraftingHelper.lambda$init$37(CraftingHelper.java:531) ~[CraftingHelper.class:?]
    at net.minecraftforge.common.crafting.CraftingHelper.getIngredient(CraftingHelper.java:201) ~[CraftingHelper.class:?]
    at net.minecraftforge.common.crafting.CraftingHelper.lambda$init$35(CraftingHelper.java:468) ~[CraftingHelper.class:?]
    at net.minecraftforge.common.crafting.CraftingHelper.getRecipe(CraftingHelper.java:402) ~[CraftingHelper.class:?]
    at net.minecraftforge.common.crafting.CraftingHelper.lambda$loadRecipes$42(CraftingHelper.java:702) ~[CraftingHelper.class:?]
    at net.minecraftforge.common.crafting.CraftingHelper.findFiles(CraftingHelper.java:790) ~[CraftingHelper.class:?]
    at net.minecraftforge.common.crafting.CraftingHelper.loadRecipes(CraftingHelper.java:659) ~[CraftingHelper.class:?]
    at java.util.ArrayList.forEach(ArrayList.java:1249) [?:1.8.0_66]
    at net.minecraftforge.common.crafting.CraftingHelper.loadRecipes(CraftingHelper.java:614) [CraftingHelper.class:?]
    at net.minecraftforge.fml.common.Loader.initializeMods(Loader.java:779) [Loader.class:?]
    at net.minecraftforge.fml.client.FMLClientHandler.finishMinecraftLoading(FMLClientHandler.java:343) [FMLClientHandler.class:?]
    at net.minecraft.client.Minecraft.init(Minecraft.java:576) [Minecraft.class:?]
    at net.minecraft.client.Minecraft.run(Minecraft.java:416) [Minecraft.class:?]
    at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_66]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_66]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_66]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_66]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_66]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_66]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_66]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_66]
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
    at GradleStart.main(GradleStart.java:26) [start/:?]
[13:50:54] [main/TRACE] [minecraft/minecraft]: Sending event FMLInitializationEvent to mod minecraft
[13:50:54] [main/TRACE] [minecraft/minecraft]: Sent event FMLInitializationEvent to mod minecraft

Well... I cannot say if the number (tutorial_recipe2) is legal... okay, renamed it to "tutorial_stuff.json" and... no, same error.

 

 

It didn't recognize the minecraft:sand item (or stone)... so aren't they available at the moment of parsing, or do we use a wrong naming scheme for them?

 

EDIT: I thing I rember some post with a link inside where the chief developers told that there where some changes made in 1.12 which aren't included into forge at the moment, and all we could do was being patient. Is this error about this, or is it something else?

 

Greetings, ConfusedMerlin

working.png

notworking.png

Edited by ConfusedMerlin
did remember something
Posted

I don't know what causes it, or if it is blocks only because for me, it works fine for vanilla items. Here's my json file...

{
  "result": {
    "item": "am:line_button"
  },
  "pattern": [
    " s ",
    "sbs",
    "sss"
  ],
  "type": "minecraft:crafting_shaped",
  "key": {
    "s": {
      "item": "am:steel_ingot"
    },
	"b": {
		"item": "minecraft:stone_button"
	}
  }
}

Let me try changing it to stone...

Nope, doesn't work for stone... Maybe it has something to do with the block metadata? Because sand and stone both have other blocks using meta...

Jup, that was it.. Actually looking at the code printing the error in the console that's exactly the thing... Take a look:

        if (item.getHasSubtypes() && !json.has("data"))
            throw new JsonParseException("Missing data for item '" + itemName + "'");

So, you need to add "data": 0 to your file.

Classes: 94

Lines of code: 12173

Other files: 206

Github repo: https://github.com/KokkieBeer/DeGeweldigeMod

Posted

Oh, someone found the cure for that error already?

 

4 minutes ago, Kokkie said:

 

So, you need to add "data": 0 to your file.

 

Ehm... and where does it need to go to? *thinking*

...

Oh, like this: 

Spoiler

{
  "type": "minecraft:crafting_shaped",
  "pattern": [
    "ASA",
    "ACA",
    "ASA"
  ],
  "key": {
    "S": {
      "item": "ianusinchq:tutorial_ingot"
    },
    "A":
      {
        "item": "ianusinchq:tutorial_nugget"
      },
    "C":
    {
      "item": "minecraft:sand",
      "data": 0
    }

  },
  "result": {
    "item": "ianusinchq:tutorial_ore",
    "data": 0
  }
}

 

observe the changes I made below minecraft:sand

 

Still, what does this do to make the error message I found in one of my logs go away completely? 

 

Anyway, thanks for finding a solution,

 

Greetings, Confused Merlin

Posted
4 minutes ago, ConfusedMerlin said:

Still, what does this do to make the error message I found in one of my logs go away completely? 

Forge checks if the block/item has a subitem, if it has it looks for the data you provided in the json file.

 

16 minutes ago, Kokkie said:

if (item.getHasSubtypes() && !json.has("data"))

If you didn't provide any data, instead of just passing 0 which would be logical to do, it ignores the whole file and throws an exception.

 

16 minutes ago, Kokkie said:

throw new JsonParseException("Missing data for item '" + itemName + "'");

But if you do provide the data it doesn't throw any exception and just continues, so it (obviously) doesn't show up in the logs/console.

Anyway, great to see I could help. :D

Classes: 94

Lines of code: 12173

Other files: 206

Github repo: https://github.com/KokkieBeer/DeGeweldigeMod

Posted

Ok, so if a block has a variant but you don't want to use a specific one you still need to specify it? That means, if the block has 10 variants, that you have to specify 10 recipes changing the data value every time? :/

Don't blame me if i always ask for your help. I just want to learn to be better :)

Posted

Thank you. Infact having this file 

{
  "type": "minecraft:crafting_shaped",
  "pattern": [
    "AAA",
    "ASA",
    "AAA"
  ],
  "key": {
    "S": {
      "item": "mw:ruby"
    },
    "A": 
      {
        "item": "minecraft:stone",
        "data": 0
      }
  },
  "result": {
    "item": "mw:ruby_ore",
    "data": 0
  }
}



Now the recipe work. But i've noticed is not going in the proper tab on the recipe book. For example, this recipe refers to a building block, how can i display it in that tab and not only in the "all recipes" tab?

Don't blame me if i always ask for your help. I just want to learn to be better :)

Posted

Seems like when you set the item's creative tab to CreativeTabs.BUILDING_BLOCKS, it shows up in the blocks tab of the crafting book as well as the building blocks tab of the creative inventory.

Posted
4 hours ago, Kokkie said:

Indeed.

Wow. That  is  bad. So the old ore dictionary wildcarding is no longer a thing for input ingredients? What about custom IRecipe implementations? (sorry I've not started 1.12 porting yet but I'm trying to keep track of all the gotchas others seem to be having...)

Posted
5 hours ago, JimiIT92 said:

Ok, so if a block has a variant but you don't want to use a specific one you still need to specify it? That means, if the block has 10 variants, that you have to specify 10 recipes changing the data value every time? :/

According to the vanilla recipe files, no; you can specify an array of items for any of the ingredient keys, and any item which is included in that array will match for your recipe. That's how the bed recipe checks for all the different planks, at least; I'd hope Forge is able to handle it, too :)

Whatever Minecraft needs, it is most likely not yet another tool tier.

Posted

I hope I'm not "hijacking" this topic (if I am, let me know and I'll post my own topic for this), but I'm having a very similar problem now that I'm trying to transition to recipe .json files instead of using the #add[X]Recipe methods. I'm testing the transition with just one item, and although the recipe works (I can craft it), it's not showing up in the recipe book. I have, in fact, called /recipe give @a * to make sure I've unlocked the recipe; then I even specified the item in that command and it told me I already have the recipe for it. And yet, it's not anywhere in the recipe book. (I've tried searching for its name, and also just looking through every page of the book to the end, and it's not there.)

 

The JSON file (which I assume is okay, since the recipe itself works) contains this:

 

{
  "type": "minecraft:crafting_shaped",
  "group": "redplusplus:diamond_pressure_plate",
  "pattern": [
    "DD"
  ],
  "key": {
    "D": {
      "item": "minecraft:diamond"
    }
  },
  "result": {
    "item": "redplusplus:diamond_pressure_plate",
	"data":0
  }
}

If the recipe is properly loading, shouldn't it also be properly added to the recipe book? (Note: I tried removing the group and it didn't change anything.)

Whatever Minecraft needs, it is most likely not yet another tool tier.

Posted
8 hours ago, The_Wabbit said:

Wow. That  is  bad. So the old ore dictionary wildcarding is no longer a thing for input ingredients? What about custom IRecipe implementations? (sorry I've not started 1.12 porting yet but I'm trying to keep track of all the gotchas others seem to be having...)

 

You can still use OreDictionary.WILDCARD_VALUE (32767) as the metadata of an ingredient to match any metadata value.

 

You can create custom IRecipe and Ingredient implementations by creating an IRecipeFactory or IIngredientFactory and specifying them in your _factories.json file.

 

You can see some examples here and here.

  • Like 2

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Posted
19 hours ago, electrohedric said:

Seems like when you set the item's creative tab to CreativeTabs.BUILDING_BLOCKS, it shows up in the blocks tab of the crafting book as well as the building blocks tab of the creative inventory.

That's unfortunate, i hope there will be a way to specify the Recipe Book tab too soon for any block/item that is not in the vanilla creative tabs

Don't blame me if i always ask for your help. I just want to learn to be better :)

  • 4 weeks later...
Posted (edited)

Sorry, can't understand...

I made a new json file in src/main/resource/(MymodID)/recipes. I made it copy-paste the one u had shared, put my things ("MymodID" : "myCostumItem") instead yours. But when I run the game and put all the elements in the crafting table in the right order it doesn't work. Why? Have I to call the Json file somewhere?


Thnx for help

Edited by IlTosaerba
Posted
1 hour ago, IlTosaerba said:

Sorry, can't understand...

I made a new json file in src/main/resource/(MymodID). I made it copy-paste the one u had shared, put my things ("MymodID" : "myCostumItem") instead yours. But when I run the game and put all the elements in the crafting table in the right order it doesn't work. Why? Have I to call the Json file somewhere?


Thnx for help

 

Recipe files need to be in src/main/resources/assets/<modid>/recipes.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Posted
1 hour ago, Choonster said:

 

Recipe files need to be in src/main/resources/assets/<modid>/recipes.

Of curse! Is what I done, forget to write in the previous comment, updating it

Guest
This topic is now closed to further replies.

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.