Jump to content

[SOLVED][1.14.4] from config to Ingredient for ingredient list


Recommended Posts

Posted (edited)

trying to use a config file to load a list of item:ids from a config file defined using defineList.

["minecraft:apple", "minecraft:dried_kelp", "minecraft:melon_slice",[minecraft.apple] 

to be used by TemptGoal as one example.

this.goalSelector.addGoal(4, new TemptGoal(this, 1.2D, false, TEMPTATION_ITEMS));

TempGoal uses (Ingredient temptItemsIn). Since Ingredient does not have a ".add" how do I turn the array, a array, well any array into something I can pull from a config and into a Ingredient.
Hard coded would look something like this...

Ingredient TEMPTATION_ITEMS = Ingredient.fromItems(Items.CARROT, Items.POTATO, Items.BEETROOT);

Anyone got any ideas or can point me in the right direction and I hop this makes sense.
I saw the fromStream but it goes over my head and I have yet to find a good example of the streams being used.
Thanks.

Edited by frakier
SOLVED
Posted (edited)

I considered that, I know I can add a tags to a existing item, I've done that before. but say I create a tag

//herbivore
{
	"replace": false,
	"values": [
		"minecraft:apple",
		"minecraft:dried_kelp",
		"minecraft:melon_slice",
		"minecraft:golden_apple",
		"minecraft:enchanted_golden_apple",
		"minecraft:carrot",
		"minecraft:beetroot",
		"minecraft:sweet_berries"
	]
}

Then any mod that shows tags would show them and I have noticed that in those cases the list of "tags" is getting huge [was playing a modpack the tag list just kept going], should I be adding another on the pile? Figured a config file gave access to change the list but did not add to the overhead, but if you think that is the route to go I'll give it a try.

Edited by frakier
Posted

This is what tags are for. Mods that make tags visible have the onus on them to not make it overwhelming.

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/3/2020 at 11:34 PM, Draco18s said:

This is what tags are for. Mods that make tags visible have the onus on them to not make it overwhelming.

My Internet has been more out than on for the past two weeks makes researching a pain.

Anyway thinking this through, tell me if I'm wrong.
Where a config could have items from any mod, probably a test for use or mod existing before use would be needed.
...
With tags I can add items from minecraft or my current mod to say a carnivore tag. Then each other of my mods can do the same.  That takes care of my mods interacting.
For any third party mods  they would have to implement the tag or..
1. I would need to make a compat mod that uses tags to add to the carnivore tag or course it would fail on the first item not loaded so it would require a compat mod for each mod.
2. I would need to make a compat mod that tests for the existence of the mod I with to tag items in and add those dynamically [think that is a possibility i would need to research]?
3. Make resource pack that includes entries for each mod with a carnivore  for each implement the tag.
Did I miss anything and which would seem the most efficient and easy for the end user to simply add to a list. If #3 work the way I think [i need to research] it would work.
 

Posted

There's a way to check on the Java side if a tag exists.

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 hours ago, Draco18s said:

There's a way to check on the Java side if a tag exists.

yeah I do that already when checking to see if the user is wearing a specific collection of a suit of armor.

the problem I'm pondering on now is one bad tag and the whole JSON file fails. So if the mod that is the target of a item in the json tag does not exist the whole tag fails to work. Think I'm going to experiment with the 3rd option, one resource pack that has the tags for ever potential item in desired mods. Then all someone has to do to add more to the tag is create the structure for the desired mod in the resource pack and add the carnivore.json  with the items they want tagged for the mod. Going to go experiment soon, was hoping to get some pros and cons on the ideas though.

Edited by frakier
more info
Posted

You could include a JSON tag file with no items in it.

The whole point is that "an empty list" is still a valid list.

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
50 minutes ago, Draco18s said:

You could include a JSON tag file with no items in it.

The whole point is that "an empty list" is still a valid list.

Just trying to figure out the best way to add to the carnivore tag and still allow for the end user to add more if they wish in the easiest manner. Not sure about the empty list.

Posted

A tag with nothing in it generates an empty list. An empty list is special in that it contains zero items and is not null.

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)
1 hour ago, Draco18s said:

A tag with nothing in it generates an empty list. An empty list is special in that it contains zero items and is not null.

Oh I get what you are saying I did that with insectivore. Don't really have anything for insectivore in mind yet but know there will be eventually.

Edited by frakier
Posted (edited)

I have a "resources\data\minecraft\tags\items\carnivore.json"

{
	"replace": false,
	"values": [
		"minecraft:porkchop",
		"minecraft:chicken",
		"minecraft:mutton",
		"minecraft:rabbit",
		"minecraft:beef",
		"minecraft:egg",
		"minecraft:cod",
		"minecraft:salmon",
		"minecraft:tropical_fish"
	]
}

and I have "resources\data\mymod\tags\items\carnivore.json"

{
	"replace": false,
	"values": [
		"minecraft:porkchop"
	]
}

note: yes this should be a raw meat item from my own mod in this tag group but for the particular mod I am working with there is not one, actually probably going to add one just to satisfy my own ODC but have not got around to it so porkchop it is.

I can get the ingredients [don't get too hung up on code examples I'm cobbling them together to present the general ides without all the variables] that would make it harder to read without posting everything, which I can't post everything because it is someone elses mod that I am working on to send them as a quarantine gift [had a lot of time on my hands recently].

Ingredient CARNIVORE_TAGED_ITEMS = Ingredient.fromTag(ItemTags.getCollection().getOrCreate(new ResourceLocation(MyMOD.MODID, "carnivore"))));
goalSelector.addGoal(4, new TemptGoal(this, 1.2D, false, CARNIVORE_TAGED_ITEMS));

When I test all that is returned is what is in my group tag reference [the lone porkchop] so that does not help much. Too much trouble to get a list of every tag group that could possibly be added and try to cobble them all together into one  list.

So trying another way.. I have a init called from the mainmod commonSetup where I collect the list of items like so using ForgeRegistries.ITEMS and I have a resource reload listener that will call the same init if the resources are reloaded. So quick and dirty i get a list of items....
 

IForgeRegistry<Item> test = ForgeRegistries.ITEMS;
List<Item> temp =  Lists.newArrayList();;
for(Item i: test) {
	if(i.getTags().toString().contains("carnivore")) { //not the smoothest way but got to get it working to reine
      temp.add(i.asItem().getItem());
	}
}


Now how to get those items in temp into Ingredient CARNIVORE_TAGED_ITEMS so i can use them in the goals.

Or better yet get the items from ForgeRegistries.ITEMS  using the the carnivore item group more directly bu that does not seem to be an option.

Edited by frakier
Posted
1 hour ago, frakier said:

"resources\data\minecraft\tags\items\carnivore.json"

Don't put your mod's tags in the Minecraft domain, put them in yours. Its your mod's tag it belongs with YOUR mod, doesn't matter that they're vanilla items.

 

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)
6 hours ago, frakier said:

"resources\data\minecraft\tags\items\carnivore.json"

 

6 hours ago, frakier said:

"resources\data\mymod\tags\items\carnivore.json"

These are 2 different tags ("minecraft:carnivore" and "mymod:carnivore" respectively).

You should make 1 tag "mymod:carnivore" and add all the defaults to it (as in all the vanilla items, and your custom items if applicable), then if you want to add items in another mod, you also define the "mymod:carnivore" tag (not the "mysecondmod:carnivore", again that would be a different tag).

 

As an extension on what draco said, the only time you should put tags in the minecraft domain is if you are overriding/adding to an existing vanilla tag.

Edited by Alpvax
Posted (edited)

OK so then what happens when another mod wants to add the carnivore tag to their own mod my mod will never see them because...

Ingredient CARNIVORE_TAGED_ITEMS = Ingredient.fromTag(ItemTags.getCollection().getOrCreate(new ResourceLocation(MyMOD.MODID, "carnivore"))));
goalSelector.addGoal(4, new TemptGoal(this, 1.2D, false, CARNIVORE_TAGED_ITEMS));

is only reading  the internal omnivore tag, it does not even see the tag addition in the data pack while ForgeRegistries.ITEMS does see the addition from the datapack. All this code does is read the carnivore tag in the mod itself at the specified location.

Now lets say i have four distinct mods, because not everyone wants the stoats mod, they can pick and choose, other mods have used this strategy rather than creating one huge monolithic mod [a strategy I like].  The monolithic mod would require a custom carnivore tag for the modpack it will run in [not that the above code would see it at all either]....
goats, boars, stoats, snakes [whatever mods].. they are all individual lightweight mods with their own raw meat additions to the carnivore group.
Then a few other people add the carnivore tag as well to their mods.

The only way to get a complete list would be to look at the ForgeRegistries.ITEMS and get all the items that are associated with the carnivore tag otherwise you are only working with a local list, which will fail if even one item exists in the carnivore list without the associated mod loaded and as said with the above code it would all have to be in the mod file structure itself because the datapack is not seen by that code.
 

There really should be something like....

Ingredient CARNIVORE_TAGED_ITEMS = ForgeRegistries.ITEMS.withTag("carnivore");

to work with.


Going to look and see what the newest recommended 1.14.4 forge is to see if i am dealing with some problem. Going to take it up to 1.15 eventually but not yet. [nope 28.2.0 is recommended and that is what I have]

Edited by frakier
more readable
Posted
2 hours ago, frakier said:

ForgeRegistries.ITEMS.withTag("carnivore");

That's basically what Ingredient.fromTag is. It doesn't make sense to query the item registry, the item registry doesn't know or care about tags.

Try also:

new ItemTags.Wrapper(new ResourceLocation(...));

  • Thanks 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)
On 8/11/2020 at 1:52 PM, Draco18s said:

That's basically what Ingredient.fromTag is. It doesn't make sense to query the item registry, the item registry doesn't know or care about tags.

Try also:

new ItemTags.Wrapper(new ResourceLocation(...));

Worked that was what I needed....
added to MyModTags class where I handle all my tag group stuff [yeah, stuff, I could not think of a better word].

public static Tag<Item> makeWrapperTag(String p_199901_0_) {
	return new ItemTags.Wrapper(new ResourceLocation(p_199901_0_));
}

then where I needed to use the tagged items i did something like this....

Ingredient CARNIVORE_TAGED_ITEMS = Ingredient.fromTag(makeWrapperTag("carnivore"));
goalSelector.addGoal(4, new TemptGoal(this, 1.2D, false, CARNIVORE_TAGED_ITEMS));


Well I went around the world to get here, thanks again Draco18s and thanks Alpvax.

[EDIT:] SORRY I WAS WRONG... only getting the minecraft tags this using carnivore this way.
Doing this all the tagged items were found from inside the mod and from the datapack. Both those I put under minecraft and under my mod [see earlier comments above]

I should probably change the title of this post to something like "Ingredient from Tags for goalSelector use.

Edited by frakier
thanks and wrapping up
Posted (edited)

I may  have spoke too soon.
--Using wrapper code I talked about in the previous post only gets tagged items from minecraft "resources\data\minecraft\tags\items\carnivore.json" tagged items from inside the mod or from datapacks, totally ignores items tagged under "resources\data\mymod\tags\items\carnivore.json".
So I put my debugging code back in and looped over ForgeRegistries.ITEMS to see if my items were there, they were and they were appropriately tagged.
-using the code "Ingredient.fromTag(ItemTags.getCollection().getOrCreate(new ResourceLocation(MyMOD.MODID, "carnivore"))));"
sees only mymods tagged items and ignores the items tagged in minecraft .

So I am back to  the same place I started, should not be this big a pain in the rear to collect up all items with a given tag regardless of mod that adds them when the items are tagged correctly in ForgeRegistries.ITEMS .

Edited by frakier
Posted

You haven't understood what Draco and I told you.

minecraft:carnivores is a completely unrelated tag to mymod:carnivores. There is no link between them AT ALL. You need to make a single tag (maybe myanimalmodid:carnivores), then for each of your expansion mods, you add to THAT tag. Not to a different tag for each mod.

  • Thanks 1
Posted (edited)
1 hour ago, Alpvax said:

You haven't understood what Draco and I told you.

minecraft:carnivores is a completely unrelated tag to mymod:carnivores. There is no link between them AT ALL. You need to make a single tag (maybe myanimalmodid:carnivores), then for each of your expansion mods, you add to THAT tag. Not to a different tag for each mod.

So I have four mods and regardless of the modid I create a namespace/path [somecommonnamespace:carnivores] in tags for each mod then use the same namespace/path in every mod with the items from that mod I want included listed in it? I hope I understand that right... I'll give that a try because even though I have four mods I have branded them with a common name encompassing the four mods.

Edited by frakier
Posted

Yes.

That's how tags work.

They are tied to a resource location.

Just as minecraft:stone and somemode:stone are different, so too is minecraft:carnivore and mymod:carnivore.

  • Thanks 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)
3 hours ago, Alpvax said:

You haven't understood what Draco and I told you.

minecraft:carnivores is a completely unrelated tag to mymod:carnivores. There is no link between them AT ALL. You need to make a single tag (maybe myanimalmodid:carnivores), then for each of your expansion mods, you add to THAT tag. Not to a different tag for each mod.

Yeah that part went over my head because I let the four mods thing get in my head I was still trying to use the modid from each mod.

1 hour ago, Draco18s said:

Yes.

That's how tags work.

They are tied to a resource location.

Just as minecraft:stone and somemode:stone are different, so too is minecraft:carnivore and mymod:carnivore.

Got it working now, just need to test more. Thanks again I knew it was in the ballpark but just could not see the resolution.

all the mod tag groups are now under "resources\data\commonnamespace\tags\items\carnivore.json" in all four mods [and any other third party mods as well as datapacks]
and then I do  something like

loc = new ResourceLocation("commonnamespace", "carnivore");
tagwrapper = new ItemTags.Wrapper(loc);
ingredientlist = Ingredient.fromTag(tagwrapper);
goalSelector.addGoal(4, new TemptGoal(this, 1.2D, false, ingredientlist));


 

Edited by frakier
Posted

(And I assume that "commonnamespace" is not literally "commonnamespace" but something identifiable to your mod.)

  • Like 1
  • Haha 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)
23 hours ago, Draco18s said:

(And I assume that "commonnamespace" is not literally "commonnamespace" but something identifiable to your mod.)

Oh yeah the mod has a longer name where part of the longer name is common. Just used the part common to all the mods. Like
MyModSameNameDogs
MyModSameNameCats
MyModSameNameBirds

so using MyModSameName as the common element.

Edited by frakier

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.