Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Mixin tutorials


Tret
 Share

Recommended Posts

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
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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

Link to comment
Share on other sites

You can write your own record that stores just the position within the chunk. That's two 4-bit numbers (0-15 for x and z) and the y position (pre 1.18 this is just a byte, 0-255). So for pre 1.18 you need a record with two bytes in it.

For 1.18 you'll have to be more sophisticated, because the build height has been increased.

Link to comment
Share on other sites

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"));
    }
}
Link to comment
Share on other sites

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

 Share



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • 1.12 is no longer supported on this forum. Please update to a modern version of Minecraft to receive support.
    • I've been trying to install Forge version 1.12.2 to play a minecraft server with some friends but it is not working. I saw another post with the same issue as me; that being that a certain library will not install. The recommendation for that post was running the installer through CMD. I have tried that and am still getting the same error.   Logs JVM info: Oracle Corporation - 1.8.0_321 - 25.321-b07 java.net.preferIPv4Stack=true Found java version 1.8.0_321 Extracting json Considering minecraft client jar Downloading libraries Found 0 additional library directories Considering library net.minecraftforge:forge:1.12.2-14.23.5.2859   File exists: Checksum validated. Considering library org.ow2.asm:asm-debug-all:5.2   File exists: Checksum validated. Considering library net.minecraft:launchwrapper:1.12   File exists: Checksum validated. Considering library org.jline:jline:3.5.1   File exists: Checksum validated. Considering library com.typesafe.akka:akka-actor_2.11:2.3.3   File exists: Checksum validated. Considering library com.typesafe:config:1.2.1   File exists: Checksum validated. Considering library org.scala-lang:scala-actors-migration_2.11:1.1.0   File exists: Checksum validated. Considering library org.scala-lang:scala-compiler:2.11.1   File exists: Checksum invalid, deleting file:     Expected: 56ea2e6c025e0821f28d73ca271218b8dd04926a     Actual:   e36a29a94e39c5b4215e88a2bf5c044539cf3203   Downloading library from https://maven.minecraftforge.net/org/scala-lang/scala-compiler/2.11.1/scala-compiler-2.11.1.jar java.net.SocketTimeoutException: Read timed out     at java.net.SocketInputStream.socketRead0(Native Method)     at java.net.SocketInputStream.socketRead(Unknown Source)     at java.net.SocketInputStream.read(Unknown Source)     at java.net.SocketInputStream.read(Unknown Source)     at sun.security.ssl.SSLSocketInputRecord.read(Unknown Source)     at sun.security.ssl.SSLSocketInputRecord.readFully(Unknown Source)     at sun.security.ssl.SSLSocketInputRecord.decodeInputRecord(Unknown Source)     at sun.security.ssl.SSLSocketInputRecord.decode(Unknown Source)     at sun.security.ssl.SSLTransport.decode(Unknown Source)     at sun.security.ssl.SSLSocketImpl.decode(Unknown Source)     at sun.security.ssl.SSLSocketImpl.readApplicationRecord(Unknown Source)     at sun.security.ssl.SSLSocketImpl.access$300(Unknown Source)     at sun.security.ssl.SSLSocketImpl$AppInputStream.read(Unknown Source)     at java.io.BufferedInputStream.read1(Unknown Source)     at java.io.BufferedInputStream.read(Unknown Source)     at sun.net.www.MeteredStream.read(Unknown Source)     at java.io.FilterInputStream.read(Unknown Source)     at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(Unknown Source)     at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(Unknown Source)     at java.nio.file.Files.copy(Unknown Source)     at java.nio.file.Files.copy(Unknown Source)     at net.minecraftforge.installer.DownloadUtils.download(DownloadUtils.java:186)     at net.minecraftforge.installer.DownloadUtils.download(DownloadUtils.java:174)     at net.minecraftforge.installer.DownloadUtils.downloadLibrary(DownloadUtils.java:159)     at net.minecraftforge.installer.actions.Action.downloadLibraries(Action.java:89)     at net.minecraftforge.installer.actions.ClientInstall.run(ClientInstall.java:110)     at net.minecraftforge.installer.InstallerPanel.run(InstallerPanel.java:423)     at net.minecraftforge.installer.SimpleInstaller.launchGui(SimpleInstaller.java:175)     at net.minecraftforge.installer.SimpleInstaller.main(SimpleInstaller.java:147) Considering library org.scala-lang.plugins:scala-continuations-library_2.11:1.0.2_mc   File exists: Checksum validated. Considering library org.scala-lang.plugins:scala-continuations-plugin_2.11.1:1.0.2_mc   File exists: Checksum validated. Considering library org.scala-lang:scala-library:2.11.1   File exists: Checksum validated. Considering library org.scala-lang:scala-parser-combinators_2.11:1.0.1   File exists: Checksum validated. Considering library org.scala-lang:scala-reflect:2.11.1   File exists: Checksum validated. Considering library org.scala-lang:scala-swing_2.11:1.0.1   File exists: Checksum validated. Considering library org.scala-lang:scala-xml_2.11:1.0.2   File exists: Checksum validated. Considering library lzma:lzma:0.0.1   File exists: Checksum validated. Considering library java3d:vecmath:1.5.2   File exists: Checksum validated. Considering library net.sf.trove4j:trove4j:3.0.3   File exists: Checksum validated. Considering library org.apache.maven:maven-artifact:3.5.3   File exists: Checksum validated. Considering library net.sf.jopt-simple:jopt-simple:5.0.3   File exists: Checksum validated. Considering library org.apache.logging.log4j:log4j-api:2.15.0   File exists: Checksum validated. Considering library org.apache.logging.log4j:log4j-core:2.15.0   File exists: Checksum validated. Considering library org.apache.logging.log4j:log4j-slf4j18-impl:2.15.0   File exists: Checksum validated. These libraries failed to download. Try again. org.scala-lang:scala-compiler:2.11.1
    • I locally hosted a modpack server and it takes 10 minutes for my friend to join the world. He is stuck on "Joining World" without the option to cancel for 10 minutes and hes just impatient and this never happened before with other modpacks we used to play.   There are 0 errors or fails in the logs.
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.