Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

Dear Forge Community,

 

I have an idea for a mod which implementation is a bit invasive and I have only c++ experience yet so I've came here to ask this question. (I know I should not program MC mods without java experience but in my opinion the seek for knowledge should not be refused under any circumstances and I'm turning to you guys hoping you would not reject it either.)

 

The base idea is to implement heat and heat exchange and add this mechanic to the vanilla blocks of minecraft. My idea is to only calculate a blocks init heat if It's heat transfer rate is far enough from 0 in any direction. This would allow me to calculate efficiently and would not require me to store a new unsigned short for every block. Also I'm planning to use air as a block group with same heat unit at init. At least yet.

 

The question is. I need to mixin into the chunk generation in order to catch the event block generated event and inject my code before return but I can not find any good documentation about this topic and I also can not find the block generated event function which I need to overwrite. Can you help me out with this?

Every help is appreciated since I'm learning modding and java.

 

Edit: typo

Edited by Tret

6 hours ago, Tret said:

(I know I should not program MC mods without java experience but in my opinion the seek for knowledge should not be refused under any circumstances and I'm turning to you guys hoping you would not reject it either.)

basic java is required for modding minecraft 

Also coremodding/mixin is not supported on this Forum, if you have a real case to use mixin, refer to the Forge Discord into the channel non-api-modding

  • Author
7 hours ago, Tret said:

I also can not find the block generated event function which I need to overwrite

And can you help me out with that?

  • Author

So in theory if I had an event that is triggered when a block's neighbor changes I can determine the heat transfer rate at a given tick for the block and with this way I can spare lot's of calculations. So I would need an event that triggers when a block is placed but not just for my blocks, for every block there is in minecraft. I'm searching for that function so I can implement my mechanic in it.

  • Author

The problem is, this is a constructor and mixin can not modify constructors. Subscribing to the event would still not work as I need to apply my mechanic to every block there is in Minecraft. Subscribing only applies my mechanic to my blocks or am I wrong here?

24 minutes ago, Tret said:

Subscribing only applies my mechanic to my blocks or am I wrong here?

the Event fires for all Blocks, not only for your's

  • Author

Another question arises. How could I add a custom property to every block in Minecraft? Do I need mixin for that?

  • Author

So my only option is to store them in a map with a blockpos as a key so I can identify where it belongs?

11 minutes ago, Tret said:

that's exactly what D7 told you

 

11 minutes ago, Tret said:

Or do I need to create my own capability?

read the doc, you also can look at the Forge Community Wiki

 

11 minutes ago, Tret said:

Also considering I need to store the BlockPos too as a key my storage size would almost go triple the size as opposed if I try to add my value as a block property. Is there a way to avoid this?

what, create a Map<BlockPos, your Property>, the BlockPos is the Key and your Property is the value

Edited by Luis_ST

  • Author

Yeah but a BlockPos contains a lot of information. For example 3 ints for the 3D space. Id of the world which could be an unsigned short but it is still 31bit of information. If java is smart enough maybe it will use references instead of copy constructors but is it smart enough for that or should I dig into java symbols for getting a value by reference?

4 minutes ago, Tret said:

Yeah but a BlockPos contains a lot of information. For example 3 ints for the 3D space. Id of the world which could be an unsigned short but it is still 31bit of information.

then create your own BlockPos, with the Data which is relevant for you

but iirc the BlockPos is an extension of Vec3 which use 3 Integer there no more Data

  • Author

And since I add chunk capabilities the container itself will only exist per chunk so it does not need to know which chunk it is in right?

Thank you for the suggestion and the help!

9 minutes ago, Tret said:

And since I add chunk capabilities the container itself will only exist per chunk so it does not need to know which chunk it is in right?

yeah, each Chunk has it's own data

  • Author

I've been digging for some capabilities knowledge and I can see a lot of people using capabilities and nbt tags to add custom properties to block entities. Should I stick with the custom storage or would the capability system be a better way to implement my mechanic?

So far I have these prototype codes:
 

public class HeatCapability implements IHeat{
    @Override
    public void setHeat(double heat) {

    }

    @Override
    public double getHeat() {
        return 0;
    }

    @Override
    public double ExchangeRate() {
        return 0;
    }

    @Override
    public double HeatCapacity() {
        return 0;
    }

    @Override
    public double ExchangeFactor() {
        return 0;
    }

    @Override
    public void write(DataOutput pOutput) throws IOException {

    }

    @Override
    public byte getId() {
        return 0;
    }

    @Override
    public TagType<?> getType() {
        return null;
    }

    @Override
    public Tag copy() {
        return null;
    }

    @Override
    public void accept(TagVisitor pVisitor) {

    }
}
public class HeatStorage implements ICapabilitySerializable<CompoundTag> {
    @CapabilityInject(IHeat.class)
    public static final Capability<IHeat> HEAT_CAPABILITY = null;
    public static final LazyOptional<IHeat> instance = LazyOptional.of(HEAT_CAPABILITY::getDefaultInstance);

    @Nonnull
    @Override
    public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
        return cap == HEAT_CAPABILITY? (LazyOptional<T>) instance : LazyOptional.empty();
    }

    @Override
    public CompoundTag serializeNBT() {
        CompoundTag nbt = new CompoundTag();
        nbt.putDouble("Heat", instance.resolve().get().getHeat());
        return nbt;
    }

    @Override
    public void deserializeNBT(CompoundTag nbt) {
        instance.resolve().get().setHeat(nbt.getDouble("Heat"));
    }
}
  • Author

Do you by any chance have good code examples of chunk capabilities in 1.17 forge? I can't find any and I really need some to fully understand the forge documentation.

  • Author

So I just need to attach my code (I posted above) to chunks?

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.