Jump to content

Recommended Posts

Posted

Let's try this again I am going to ask this for 1.10.2 then....

 

I know you are suppose to extend the event class then register it with forge event bus. I don't know how your suppose to get the variables from vanilla and stop vanilla from doing it's function nor how/when to manually fire it. 

 

I need the event to fire upon creation of any tile entity into the world as a pre-initialization so I don't  use asm for removing tile entities. Then I need to grab variables... Tile Entity,World,BlockPos,BlockState. 

 

Basically I am asking how to create the event with it registers, when/how to manually fire it with a pre and post,grabbing vanilla variables, runs on server and client....

Posted
35 minutes ago, diesieben07 said:

Same reply as in your other thread:

 

This time please answer all questions.

I am trying to make an event that fires pre-creation of a tile entity into the world. This would fire on both server and client so neither would crash? I need a custom event to replace invalid tile entities with my new tile entities. Although I removed the mappings /setblock ~ ~ ~ blockTileEntity crashes. This is because, I only patched it only for block place event which doesn't fire with world.setBlockState...

Posted
Just now, diesieben07 said:

Oh god... why... this is a terrible idea.

 

What are you trying to achieve?

Make furnace save to long, Totally override the vanilla mob spawner to support mounting dynamic logic

Posted (edited)

2017-09-01_12.46.49.png

 

Each displayed render represents one entity in the mounting:[] tag list where it's created by name or nbt depending on the logic which vanilla can't handle 

Edited by jredfox
Posted (edited)

Well I haven't written it for anything besides older versions and can't really port it to newer versions without this event thing...

 

Basically {EntityId:"id",mounts:[{id:"entityid"},{id:"entityid",EntityNBT:{nbtstuff} }]}

where EntityId is the top mob and mounts go from 0 to max index get created downwards. No there is two ways to create the spawnage,

A:create by name and use interface (no EntityNBT:{})

B: create by nbt if has tag EntityNBT:{}.

 

Vanilla can't support this so I just have to completly override it. I have reported several spawner issues like not supporting anything but, nbt with multiple index spawner but, they said it works as intended which can't be right since EntityId tag with no spawn data single index spawner creates it by name. So I have to patch the tile entity itself as well as the render.

 

Yes I want the furnace to have a bigger savetime as long that's hours of real game time smelting for charcoal block mod yay?

Edited by jredfox
Posted
14 minutes ago, diesieben07 said:

What?

 

What is "dynamic logic"?

 

Replacing TileEntity registrations like this is a very bad idea, it will break. If you want to replace vanilla blocks, use the registry replacements to replace the whole block.

can't find out how to put the quote to the above comment . The answers why I need to make a custom event are above and are pretty detailed.

Posted (edited)
3 minutes ago, diesieben07 said:

Yes, vanilla supports this just fine: https://minecraft.gamepedia.com/Chunk_format#Block_entity_format

 

The furnace saves it's time values as a 32-bit integer, meaning it can store values of up to 4,294,967,295 ticks. That is nearly 60,000 hours. Is that not enough for your purposes?

No it doesn't I dare you to try to create a dynamic mounted horse spawner that will spawn in different horses each time based on one index of mounted spawners. The answer is  you can't because, it's going to create them from nbt every time for either multiple index spawners or passenger tags

Edited by jredfox
Posted
Just now, diesieben07 said:

You said nothing about it being dynamic. I suggest you create your own spawner for that instead of hacking around with the vanilla one.

I have that's why I am hacking around with the vanilla one. I have done my best and it's a complete mess that I refuse to do the same thing to newer versions. I had to create them by name use the interface and then put all that messy nbt tags into the riding tags for 1.7.10 and 1.10.2 it was a mess. 

 

It only creates them by nbt meaning it will be the same type every time. 

Posted (edited)

Vanilla: shows pig on spawner for a second before reading it

Vanilla: creates same mob every time rather then by name if(multi index spawnpotential spawner, or spawn data spawner regardless of mounts)

Vanilla: doesn't support multi render mounted spawner system

 

Only way to fix said issues:

replace tile entity mob spawner with a new one extending it

create custom event on tile entity pre creation to remove invalid tile entities

 

You still don't believe me that I haven't tried this is why I am re-writing silk spawners because of the vanilla bugs that I no longer support / make work arounds for.

https://github.com/jredfox/silkspawners/tree/master/src/main/java/com/EvilNotch/silkspawners

Edited by jredfox
Posted
21 minutes ago, diesieben07 said:

What? Sorry, I do not understand what your problem is.

Stupid quoting system / editor. Explanation is above I am not sure if you get a notification otherwise. Sorry for spamming?

Posted
4 minutes ago, diesieben07 said:

No, the "fix" if you want to add additional features to spawners is to make your own spawner block and leave the vanilla one alone.

Not possible otherwise silk spawners blocks would be modded blocks and when you leave your would your vanilla spawners would disappear with vanilla tags.

Posted (edited)
4 minutes ago, diesieben07 said:

Yes, if you uninstall a mod the features of that mod disappear. Thats how modding works.

My thing is suppose to be able for vanilla map makers to make as well as modded features like mounted spawners

 

A: I plan on all tags being used in mounting when modded

B: I plan on having vanilla tags in the spawner for when the map creator leaves yes it will have the issues described as above.

C: map makers know of these issues already and would be happy to have a program make spawners them for them....

D: it would confuse the heck out of people to setblock mob spawner with the tags specified and get no output and doesn't work with silk spawners....

Edited by jredfox
Posted (edited)

Just tell me how to do the event thing. I need to know more then just a tile entity event I need to create a custom lightmap event to so my mod could configure different mc version light maps based on the clients happiness 

Edited by jredfox
Posted
3 minutes ago, diesieben07 said:

There is no clean way to replace TileEntities, it causes issues all over the place.

Don't do it.

I realized this after 8 hours of debugging this past week. 

 

Everything will run clean soon if you could tell me please how to create the event ASM needed? Is this the same for lightmap event?

Posted
15 minutes ago, diesieben07 said:

We will not help you make a coremod.

Coremods are a terrible idea, especially if someone who has no idea what they are doing makes them.

 

If you cannot figure out how to write one, you are not the person to do so.

I don't like the fact that both the light map and the tile entity into the world should already be vanilla forge events. Why were these never done? 

Posted

ZmL17.gif

  • Like 3

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.

  • 3 weeks later...
Posted
On 9/2/2017 at 3:39 AM, diesieben07 said:

Because nobody needed them.

If you need them, file an issue on Github explaining your use-case or, preferably, make a pull request.

No it's fine I have to learn ASM anyways to revert the combat system if configured to do so. After I do this for older versions and learned asm I will then submit an issue.

Posted (edited)
9 hours ago, diesieben07 said:

You don't need ASM for this.

Stop making a coremod.

Then how am I suppose to do this then you said so yourself events that hook into vanilla require a coremod.

anyways I need to remove tile entities. I tried print a list on world load and it said TileEntities:[] list was empty but, I printed it on tick event. Then it gave me some output. I need to know where this is happening at is it world.setTileEntity(...)? 
TileEntityList[net.minecraft.tileentity.TileEntityMobSpawner@557ed124, net.minecraft.tileentity.TileEntityChest@1b2b7e61] 

 

I found out that it's not one but, three methods I need to patch

addTileEntity()//patch tile entity parameter
setTileEntity()//patch tile entity parameter
func_147457_a()//patch tile entity parameter

Edited by jredfox
Posted
On 9/2/2017 at 4:39 AM, diesieben07 said:

make a pull request.

 

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

 

I will for newer versions? does the pull mean I have to code my own forge version and request it to be implemented or just asking for forge to do something?

Edited by jredfox
Posted

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.

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.