Jump to content

Recommended Posts

Posted

We currently have the ability to add fluids to all entities, but no real system to handle the fluid itself. Specifically, I will be talking about the associated physics as the client side effects are simply just fluid checks with events. The relevant common code effects can also be matched using the many provided events added by Forge. There are a few places where relevant tagged data would need to be check for custom fluid handling, but its less important for the purposes of this post.

 

To make a minimum viable fluid with unique physics, one must apply two methods provided within the entity: Entity#handleFluidAcceleration which does exactly what it says and Entity#func_233571_b_ which grabs where the entities eyes are within the fluid level. Both of these are used in different places. The first is used within the entity tick via Entity#func_233566_aG_.  The second is used to determine if the user might be jumping off the ground within a fluid, moving through fluid, swimming in fluid, etc.

 

Exposing this would result in some class object or registry that would store the associated fluid tag, a function given the entity and returning the acceleration, a consumer containing the entity if the fluid acceleration returns true to update a specific state. The fluid code would also need to be patched within LivingEntity#livingTick to check the tags for the correct fluid the entity is in when jumping and whether or not entities can swim within it.

 

I want to discuss what would be the optimal way of storing and handling these instances. Creating an event is out of the question as its unnecessary ticks for a portion of the code that can be handled with a registry. It would also be good to consider fluids in some sort of dynamic context where existing hardcoded traits could be genericized in some fashion. However, most of this code dances in the realm of tags, so there would need to be some discussion on how to handle and comply with Forge's stance on tags.

  • Like 1
  • 1 month later...
Posted

I think this is a needed feature, the only mod I've seen so far with correct fluid physics was Create and it did so by registering all of its fluids as "minecraft:fluid/water" which had a ton of side-effects.

 

Would some of this fit in the FluidAttributes class that modded fluids need anyway? It could have properties such as acceleration or a custom physics flag. If mods need dynamic acceleration based on an entity there could be methods to override like how water does with FluidAttributes#getColor. Patching the Entity code might be complicated though, the existing #handleFluidAcceleration method only takes a fluid tag and a fixed acceleration value.

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

    • Hello, New to modding, but have a solid CS foundation. I've created multiple custom BlockEntities that all have the same issue, which is that the inventory only updates on right click (overriding the useItemOn method). I've seen multiple posts on here outlining a similar issue to mine, but I've already implemented the solution of: overriding the correct methods in the BlockEntity class and calling setChanged(). I've tried every different place for setChanged() to no success. I'm wondering if I'm missing something else or if there was some change to sending data to the client in 1.21.5? Or will I have to use a custom packet sender? Here is the code for one of my BlockEntity classes with a single inventory slot: public class MyCustomBlockEntity extends BlockEntity { public final ItemStackHandler inventory = new ItemStackHandler(1) { @Override protected int getStackLimit(int slot, @NotNull ItemStack stack) { return 1; } @Override protected void onContentsChanged(int slot) { setChanged(); if (!level.isClientSide()) { level.setBlockAndUpdate(getBlockPos(), getBlockState()); } } }; public MyCustomBlockEntity(BlockPos pPos, BlockState pBlockState) { super(ModBlockEntities.MY_CUSTOM_BE.get(), pPos, pBlockState); } public void clearContents() { inventory.setStackInSlot(0, ItemStack.EMPTY); } public void dropItem() { SimpleContainer inv = new SimpleContainer(inventory.getSlots()); inv.setItem(0, inventory.getStackInSlot(0)); Containers.dropContents(this.level, this.worldPosition, inv); } @Override public void setRemoved() { dropItem(); super.setRemoved(); } @Override protected void saveAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { super.saveAdditional(pTag, pRegistries); pTag.put("inventory", inventory.serializeNBT(pRegistries)); } @Override protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { super.loadAdditional(pTag, pRegistries); inventory.deserializeNBT(pRegistries, pTag.getCompound("inventory").get()); } @Override public Packet<ClientGamePacketListener> getUpdatePacket() { return ClientboundBlockEntityDataPacket.create(this); } @Override public CompoundTag getUpdateTag(HolderLookup.Provider pRegistries) { return saveWithoutMetadata(pRegistries); } } Mostly encountering the issue when calling the clearContents() method anywhere outside of useItemOn() in the Block class. I've also tried overriding both the handleUpdateTag() and onDataPacket() methods, calling their super along with loadAdditional(), but neither changed the outcome. Thanks in advance for any replies.
    • Hi all! I’m working on a Jurassic Park-themed mod for Minecraft 1.20.1, aiming to include dinosaurs, fossils, DNA extraction, and cool machines. This is a free project, mainly passion-driven, and I’ll give full credit to everyone involved. this is the perfect opportunity for beginners of modeling and coding. This project will give you experience and a creative freedom If you love dinosaurs and Minecraft modding, hit me up! Thanks! Add Me ogfrost. <--- Discord
    • I've just started modding, and I'm trying to make custom swords. When I try to import SwordItem, I get the error:  What confuses me is that other item classes work fine: package io.github.xxx.denseswords.item; import io.github.xxx.denseswords.DenseSwords; import net.minecraft.world.item.Item; // works fine import net.minecraft.world.item.ShovelItem; // works fine import net.minecraft.world.item.SwordItem; // Error: The import cannot be resolved import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.RegistryObject; Forge MDK v55.0.15 - Minecraft 1.21.5 Java v24.0.1 Windows 11 IDE: Visual Studio Code
    • Any forge run instance of minecraft I run, regardless of mods or none can't seem to connect to a server, or my microsoft account. I tried redownloading forge and minecraft, restarting the computer, turning the firewall and antivirus off entirely, flushed my DNS cache, but nothing seems to work.
    • ??????????????????
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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