[Гайд][Легко][1.6+] Модификация чужого кода при запуске (трансфомеры)

tox1cozZ

aka Agravaine
8,454
598
2,890
Можешь сделать минимальный тестовый пример в котором ошибка появляется?
Java:
@Hook(at = @At(point = InjectionPoint.RETURN))
    public static void getCollidingBoundingBoxes(World world, Entity entity, AxisAlignedBB box){
        if(entity instanceof EntityPlayer){
            EntityPlayer player = (EntityPlayer)entity;
            if(player.capabilities.isCreativeMode){
                return;
            }
        }
    }
Даже вот такой хук крашит сервер, мол сервак ищет EntityClientPlayerMP.
Не могу понять почему... Убрал его, но начинают другие хуки крашаться с той же проблемой.
Никто не знает!? @GloomyFolken
 
1,470
19
189
а если использовать не EntityPlayer а серверного в instanceof?
 
808
3
124
Java:
@Hook(at = @At(point = InjectionPoint.RETURN))
    public static void getCollidingBoundingBoxes(World world, Entity entity, AxisAlignedBB box){
        if(entity instanceof EntityPlayer){
            EntityPlayer player = (EntityPlayer)entity;
            if(player.capabilities.isCreativeMode){
                return;
            }
        }
    }
Даже вот такой хук крашит сервер, мол сервак ищет EntityClientPlayerMP.
Не могу понять почему... Убрал его, но начинают другие хуки крашаться с той же проблемой.
Никто не знает!? @GloomyFolken

С кодом самого хука это точно не имеет ничего связанного. Скорее всего, в том же классе есть какой-то метод, у которого в списке аргументов указано что-то вроде Minecraft/EntityClientPlayerMP/etc. Клиентские хуки надо держать в отдельном классе.
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Просто на все клиентские хуки вешаю.
Попробую разделить клиентские и серверные хуки в разные классы и отпишу, спасибо)
Надо ли писать что-то типа такого?
Java:
if(FMLCommonHandler.instance().getEffectiveSide().isClient()){
    registerHookContainer("HooksContainer");
}
 
808
3
124
В таком виде вряд ли сработает, FMLCommonHandler инициализируется уже после того, как надо регистрировать хуки. Если вынесены в отдельный класс будут только строго клиентские хуки, то проблем быть не должно: класс c хуками загрузится только если загрузится какой-нибудь класс, куда есть хуки из него.

Кроме того @SideOnly обычный все-таки должен работать: насколько я понимаю, он может ломаться только если класс с хуками почему-то грузится раньше, чем регистрируются все трансформеры. Возможно где-то забыл прописать @SideOnly.
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Все работает, спасибо тебе огромное.
И да, я такой неочень... Все таки пропустил @SideOnly, ибо хуков под сотню, не уследил.
На всякий случай все равно вынес клиентские хуки в отдельный класс.
СПАСИБО ОГРОМНОЕ (y)
 
808
3
124
Спасибо за тесты, у меня своя реализация того что делает @SideOnly, поэтому я не сталкивался с этой проблемой и не сообразил написать про это в туториал. Добавил.

Кстати, проверить, на клиенте ли мы находимся в момент регистрации хуков можно через FMLLaunchHandler.side().isClient().
 
4,045
63
645
У меня ошибка при запуске собранного мода. Что не так?
Код:
> 2019-05-04 11:54:46,327 main WARN Unable to instantiate org.fusesource.jansi.WindowsAnsiOutputStream
> [11:54:46] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker
> [11:54:46] [main/INFO] [LaunchWrapper]: Using primary tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker
> [11:54:46] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLTweaker
> [11:54:46] [main/INFO] [FML]: Forge Mod Loader version 14.23.5.2811 for Minecraft 1.12.2 loading
> [11:54:46] [main/INFO] [FML]: Java is Java HotSpot(TM) 64-Bit Server VM, version 1.8.0_131, running on Windows 7:amd64:6.1, installed at C:\Program Files\Java\jre1.8.0_131
> [11:54:46] [main/INFO] [FML]: Searching C:\Users\Liahim\AppData\Roaming\.minecraft\mods for mods
> [11:54:46] [main/WARN] [FML]: Found FMLCorePluginContainsFMLMod marker in modid-1.0.jar. This is not recommended, @Mods should be in a separate jar from the coremod.
> [11:54:46] [main/INFO] [FML]: [HOOKLIB]  Obfuscated: true
> [11:54:46] [main/ERROR] [LaunchWrapper]: Unable to launch
> java.lang.RuntimeException: An error occurred trying to configure the Minecraft home at C:\Users\Liahim
\AppData\Roaming\.minecraft for Forge Mod Loader
>     at net.minecraftforge.fml.relauncher.FMLLaunchHandler.setupHome(FMLLaunchHandler.java:111) ~[forge-1.12.2-14.23.5.2811.jar:?]
>     at net.minecraftforge.fml.relauncher.FMLLaunchHandler.setupClient(FMLLaunchHandler.java:81) ~[forge-1.12.2-14.23.5.2811.jar:?]
>     at net.minecraftforge.fml.relauncher.FMLLaunchHandler.configureForClientLaunch(FMLLaunchHandler.java:42) ~[forge-1.12.2-14.23.5.2811.jar:?]
>     at net.minecraftforge.fml.common.launcher.FMLTweaker.injectIntoClassLoader(FMLTweaker.java:141) ~[forge-1.12.2-14.23.5.2811.jar:?]
>     at net.minecraft.launchwrapper.Launch.launch(Launch.java:115) [launchwrapper-1.12.jar:?]
>     at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
> Caused by: java.lang.ExceptionInInitializerError
>     at java.lang.Class.forName0(Native Method) ~[?:1.8.0_131]
>     at java.lang.Class.forName(Unknown Source) ~[?:1.8.0_131]
>     at net.minecraftforge.fml.relauncher.CoreModManager.loadCoreMod(CoreModManager.java:527) ~[forge-1.12.2-14.23.5.2811.jar:?]
>     at net.minecraftforge.fml.relauncher.CoreModManager.discoverCoreMods(CoreModManager.java:451) ~[forge-1.12.2-14.23.5.2811.jar:?]
>     at net.minecraftforge.fml.relauncher.CoreModManager.handleLaunch(CoreModManager.java:265) ~[forge-1.12.2-14.23.5.2811.jar:?]
>     at net.minecraftforge.fml.relauncher.FMLLaunchHandler.setupHome(FMLLaunchHandler.java:107) ~[forge-1.12.2-14.23.5.2811.jar:?]
>     ... 5 more
> Caused by: java.lang.NullPointerException
>     at net.minecraftforge.fml.common.asm.transformers.DeobfuscationTransformer.<init>(DeobfuscationTransformer.java:61) ~[forge-1.12.2-14.23.5.2811.jar:?]
>     at ru.liahim.mist.hooklib.minecraft.HookLoader.<clinit>(HookLoader.java:23) ~[HookLoader.class:?]
>     at java.lang.Class.forName0(Native Method) ~[?:1.8.0_131]
>     at java.lang.Class.forName(Unknown Source) ~[?:1.8.0_131]
>     at net.minecraftforge.fml.relauncher.CoreModManager.loadCoreMod(CoreModManager.java:527) ~[forge-1.12.2-14.23.5.2811.jar:?]
>     at net.minecraftforge.fml.relauncher.CoreModManager.discoverCoreMods(CoreModManager.java:451) ~[forge-1.12.2-14.23.5.2811.jar:?]
>     at net.minecraftforge.fml.relauncher.CoreModManager.handleLaunch(CoreModManager.java:265) ~[forge-1.12.2-14.23.5.2811.jar:?]
>     at net.minecraftforge.fml.relauncher.FMLLaunchHandler.setupHome(FMLLaunchHandler.java:107) ~[forge-1.12.2-14.23.5.2811.jar:?]
>     ... 5 more
> Exception in thread "main" [11:54:46] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:-1]: net.minecraftforge.fml.relauncher.FMLSecurityManager$ExitTrappedException
> [11:54:46] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:-1]:     at net.minecraftforge.fml.relauncher.FMLSecurityManager.checkPermission(FMLSecurityManager.java:49)
> [11:54:46] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:-1]:     at java.lang.SecurityManager.checkExit(Unknown Source)
> [11:54:46] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:-1]:     at java.lang.Runtime.exit(Unknown Source)
> [11:54:46] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:-1]:     at java.lang.System.exit(Unknown Source)
> [11:54:46] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:-1]:     at net.minecraft.launchwrapper.Launch.launch(Launch.java:138)
> [11:54:46] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:-1]:     at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
Here I am!
[VersionManager] Refreshing versions locally...
[VersionManager] Versions has been refreshed (16 ms)
[Launcher] Minecraft closed with exit code: 1
[Launcher] Launcher exited.
 

timaxa007

Модератор
5,831
409
672
Код:
> Caused by: java.lang.NullPointerException
>     at net.minecraftforge.fml.common.asm.transformers.DeobfuscationTransformer.<init>(DeobfuscationTransformer.java:61) ~[forge-1.12.2-14.23.5.2811.jar:?]
>     at ru.liahim.mist.hooklib.minecraft.HookLoader.<clinit>(HookLoader.java:23) ~[HookLoader.class:?]
Файл methods.bin присутствует у тебя? Если да, то он: нужной версии или нужной сборкой обуфицированых методов этот файл?
 

timaxa007

Модератор
5,831
409
672
Я генерировал, сменив на:
Java:
List<String> lines = FileUtils.readLines(new File("C:/Users/timaxa007/.gradle/caches/minecraft/net/minecraftforge/forge/1.7.10-10.13.4.1614-1.7.10/unpacked/conf/methods.csv"));
Java:
package gloomyfolken.hooklib.helper;

import org.apache.commons.io.FileUtils;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* Генерирует из mcp-шного methods.csv словарь с названиями методов для хуклибы.
* Файл methods.csv лежит в mcp/conf/
*
* Настоятельно рекомендую сгенерировать methods.bin самостоятельно для своей версии mcp, иначе могут быть
* внезапные ошибки уровня "can not find target method of hook".
*/
public class DictionaryGenerator {

    public static void main(String[] args) throws Exception {
        List<String> lines = FileUtils.readLines(new File("C:/Users/timaxa007/.gradle/caches/minecraft/net/minecraftforge/forge/1.7.10-10.13.4.1614-1.7.10/unpacked/conf/methods.csv"));
        lines.remove(0);
        HashMap<Integer, String> map = new HashMap<Integer, String>();
        for (String str : lines) {
            String[] splitted = str.split(",");
            int first = splitted[0].indexOf('_');
            int second = splitted[0].indexOf('_', first+1);
            int id = Integer.valueOf(splitted[0].substring(first+1, second));
            map.put(id, splitted[1]);
        }

        DataOutputStream out = new DataOutputStream(new FileOutputStream("methods.bin"));
        out.writeInt(map.size());

        for (Map.Entry<Integer, String> entry : map.entrySet()) {
            out.writeInt(entry.getKey());
            out.writeUTF(entry.getValue());
        }

        out.close();

    }
}
И в eclipse я добавил запуск программы, класс "DictionaryGenerator" и затем в свитке запуска я выбрал его.
И в корневой папке проекта (где был разархивирован Forge), появляется methods.bin.
 
5,018
47
783
В дереве скрипт находишь. В скрипт, где сохранение, прописываешь полный путь сохранения начиная от диска, а затем запускаешь этот скрипт отдельным приложением (пкм -> Run As -> java application)
 
4,045
63
645
В общем, у кого есть methods.bin от forge-1.12.2-14.23.5.2768?
Либо проблема не в этом.
Или дело в том, что запускаю я его на forge-1.12.2-14.23.5.2811???
Но ведь не могло же всё так измениться?
 
Последнее редактирование:
Сверху