1.8.X Mod em dll 1.0

Quem disse que não dá pra fazer mod em dll?

Acompanhando:
Este recurso está sendo acompanhado por 3 usuários.
  1. natan12_
    Versão do Minecraft:
    1.8.9 SÓ PRA WINDOWS
    Mod em dll pro minecraft

    Tudo que ele faz é printar no log
    Código (Forge Crash):

    Hello world from c++
     
    Código (Java):

    package natan12_.mods.nativemod;

    import cz.adamh.utils.NativeUtils;
    import net.minecraftforge.fml.common.Mod;
    import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;

    @Mod(modid = "nativetestmod")
    public class NativeMod
    {
        static
        {
            String bits = (System.getProperty("os.arch").contains("64") ? "64" : "32");
            String libname = System.mapLibraryName("nmod" + bits);
            System.out.println("Loading lib " + libname);
            try
            {
                NativeUtils.loadLibraryFromJar("/libs/" + libname);
            }
            catch(java.io.IOException e)
            {
                throw new ExceptionInInitializerError(e);
            }
        }

        @Mod.EventHandler
        public native void nPreInit(FMLPreInitializationEvent event);
    }

     
    Código (Java):

    package cz.adamh.utils;

    import java.io.*;

    public class NativeUtils {
        private NativeUtils() {}

        public static void loadLibraryFromJar(String path) throws IOException {

            if (!path.startsWith("/")) {
                throw new IllegalArgumentException("The path has to be absolute (start with '/').");
            }

            String[] parts = path.split("/");
            String filename = (parts.length > 1) ? parts[parts.length - 1] : null;

            String prefix = "";
            String suffix = null;
            if (filename != null) {
                parts = filename.split("\\.", 2);
                prefix = parts[0];
                suffix = (parts.length > 1) ? "."+parts[parts.length - 1] : null; // Thanks, davs! :-)
            }

            if (filename == null || prefix.length() < 3) {
                throw new IllegalArgumentException("The filename has to be at least 3 characters long.");
            }

            File temp = File.createTempFile(prefix, suffix);
            temp.deleteOnExit();

            if (!temp.exists()) {
                throw new FileNotFoundException("File " + temp.getAbsolutePath() + " does not exist.");
            }

            byte[] buffer = new byte[1024];
            int readBytes;

            InputStream is = NativeUtils.class.getResourceAsStream(path);
            if (is == null) {
                throw new FileNotFoundException("File " + path + " was not found inside JAR.");
            }

            OutputStream os = new FileOutputStream(temp);
            try {
                while ((readBytes = is.read(buffer)) != -1) {
                    os.write(buffer, 0, readBytes);
                }
            } finally {
                os.close();
                is.close();
            }

            System.load(temp.getAbsolutePath());
           
            final String libraryPrefix = prefix;
            final String lockSuffix = ".lock";
           
            final File lock = new File( temp.getAbsolutePath() + lockSuffix);
            lock.createNewFile();
            lock.deleteOnExit();
         
            FileFilter tmpDirFilter =
              new FileFilter()
              {
                public boolean accept(File pathname)
                {
                  return pathname.getName().startsWith( libraryPrefix) && !pathname.getName().endsWith( lockSuffix);
                }
              };
             
            String tmpDirName = System.getProperty("java.io.tmpdir");
            File tmpDir = new File(tmpDirName);
            File[] tmpFiles = tmpDir.listFiles(tmpDirFilter);

            for (int i = 0; i < tmpFiles.length; i++)
            {
                File lockFile = new File( tmpFiles[i].getAbsolutePath() + lockSuffix);
              if (!lockFile.exists())
              {
                System.out.println( "deleting: " + tmpFiles[i].getAbsolutePath());
                tmpFiles[i].delete();
              }
            }
        }
    }
     
    Código (C):

    #include <jni.h>

    #ifndef NULL
        #define NULL ((void*)0)
    #endif

    #ifdef __cplusplus
    extern "C" {
    #endif


    JNIEXPORT void JNICALL Java_natan12_1_mods_nativemod_NativeMod_nPreInit(JNIEnv* env, jobject thiz, jobject event)
    {
        jclass eventclass = env->FindClass("net/minecraftforge/fml/common/event/FMLPreInitializationEvent");
        if(eventclass == NULL)
        {
            return;
        }
        jmethodID getLogMtd = env->GetMethodID(eventclass, "getModLog", "()Lorg/apache/logging/log4j/Logger;");
        if(getLogMtd == NULL)
        {
            return;
        }
        jobject logger = env->CallObjectMethod(event, getLogMtd);
        if(logger == NULL)
        {
            return;
        }
        jmethodID info = env->GetMethodID(env->GetObjectClass(logger), "info", "(Ljava/lang/String;)V");
        if(info == NULL)
        {
            return;
        }
        env->CallVoidMethod(logger, info, env->NewStringUTF("Hello world from c++"));
    }



    #ifdef __cplusplus
    }
    #endif
     
    EsdricoXD curtiu isso.
  1. Lucas_gamer13
    Online

    Lucas_gamer13 Veterano Testador Veterano VIP Sabotador.com VIP Industrial

    Afiliado:
    17 Novembro 2015
    Mensagens:
    883
    Sexo:
    Masculino
    Avaliações:
    +1,119 / -0
    Apelido no Minecraft:
    Lucas_gamer13
    Screenshot_1.png
     
    • Engraçado Engraçado x 2

  2. EsdricoXD
    Offline

    EsdricoXD Moderador Veterano Testador Equipe GameMods Moderador Veterano Moderador do servidor Veterano VIP Sabotador.com

    Afiliado:
    25 Maio 2013
    Mensagens:
    1,241
    Sexo:
    Masculino
    Avaliações:
    +1,461 / -0
    Apelido no Minecraft:
    EsdricoXD
    CARAMA, QUE MOD INCRIVEL! Estou impressionado, mil vezes melhor que qualquer outro mod, e ainda em .dll. Com certeza o futuro.
     

  3. natan12_
    Offline

    natan12_ Veterano Dono do Recurso Veterano VIP Industrial

    Afiliado:
    22 Fevereiro 2014
    Mensagens:
    1,028
    Sexo:
    Masculino
    Avaliações:
    +354 / -0
    Apelido no Minecraft:
    natan12_
    O dll ta dentro da jar, todo o código em java só carrega a dll e fala pro forge rodar o código nativo
     
    • Engraçado Engraçado x 1

  4. Rikuuh
    Offline

    Rikuuh Moderadora do Fórum Equipe GameMods Moderador do Fórum Veterano VIP Industrial VIP Sabotador.com

    Afiliado:
    2 Dezembro 2012
    Mensagens:
    660
    Avaliações:
    +1,377 / -0
    Apelido no Minecraft:
    Rikuuh
    Se é assim por que não faz em .jar de uma vez?
    lol
     
  5. natan12_
    Offline

    natan12_ Veterano Dono do Recurso Veterano VIP Industrial

    Afiliado:
    22 Fevereiro 2014
    Mensagens:
    1,028
    Sexo:
    Masculino
    Avaliações:
    +354 / -0
    Apelido no Minecraft:
    natan12_
    Queria ver o quão difícil é criar um mod em c++ (resultado: muito)
     
    • Engraçado Engraçado x 1