Posted December 5, 20213 yr 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 December 6, 20213 yr by Tret
December 6, 20213 yr 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
December 6, 20213 yr 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?
December 6, 20213 yr 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.
December 6, 20213 yr 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?
December 6, 20213 yr 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
December 6, 20213 yr Author Another question arises. How could I add a custom property to every block in Minecraft? Do I need mixin for that?
December 6, 20213 yr 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?
December 6, 20213 yr Author Is this as easy as this: https://mcforge.readthedocs.io/en/latest/datastorage/capabilities/#attaching-capabilities Or do I need to create my own capability? 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?
December 6, 20213 yr 11 minutes ago, Tret said: Is this as easy as this: https://mcforge.readthedocs.io/en/latest/datastorage/capabilities/#attaching-capabilities 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 December 6, 20213 yr by Luis_ST
December 6, 20213 yr 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?
December 6, 20213 yr 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
December 6, 20213 yr 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!
December 6, 20213 yr 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
December 6, 20213 yr 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")); } }
December 6, 20213 yr 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.
December 6, 20213 yr https://forge.gemwire.uk/wiki/Capabilities#Attaching_a_Capability do the same thing but with LevelChunk
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.