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

CumingSoon

Местный стендапер
1,634
12
269
Странно,скачал сурс,залил к себе (проект начинается с папки gloonyFolken),компильнул,добавил аргументы в META-INF 
Код:
Manifest-Version: 1.0
FMLCorePlugin: gloomyfolken.hooklib.asm.HookLibPlugin
FMLCorePluginContainsFMLMod: true
Created-By: 1.7.0 (Oracle Corporation)
Но ничего не изменилось( я по прежнему могу хоть в ад чаше чем раз в 5 сек и у брони показатель защиты не изменился.Что я не так сделал?
 

CumingSoon

Местный стендапер
1,634
12
269
krok написал(а):
Надо ещё плагин указать твой.У меня крашалось и я сунул в ASmHook в injectData.
У тебя 1.7.10 ?Не мог бы показать свою META-INF ?Или дать свой проект с прикрепленным META-INF ,а то чувствую тут я не разберусь.
 
503
3
Я делал так
Код:
 @Override
    public void injectData(Map<String, Object> data) {
        obf = ((Boolean) data.get("runtimeDeobfuscationEnabled"));
        AsmHooks.hook();
    }
СОздал AsmHooks и там метод hook,там писал
Код:
AsmHook.newBuilder()
        .setTargetClassName("net.minecraft.client.Minecraft") // модифицируем класс Minecraft
        .setTargetMethodName("resize") // модифицируем метод resize
        .setTargetMethodObfuscatedName("a") // указываем обфусцированное название метода
        .appendTargetMethodParameters(Type.INT_TYPE, Type.INT_TYPE) // указываем параметры метода
        .setHooksClassName("gloomyfolken.hooklib.example.ClientHooks") // хук-метод находится в этом классе
        .setHookMethodName("onResize") // хук-метод называется onResize
        .appendHookMethodParameter(Type.INT_TYPE, 1) // добавляем параметр хук-метода, передаем в него par1
        .appendHookMethodParameter(Type.INT_TYPE, 2) // добавляем параметр хук-метода, передаем в него par2
        .buildAndRegister(); // создаем и регистрируем хук
И потом указывал путь к HookLibPlugin
 

CumingSoon

Местный стендапер
1,634
12
269
Блин,все равно не получилось.Может кинешь свой проект на какой нить файлообменник?Буду благодарен
 
808
3
124
krok написал(а):
Ах да,глуми ,русские коменты не работают
Мне рассказать тебе, что я думаю о людях, которые до сих пор используют локальные кодировки? В IDEA выставляется через file -> settings -> editor -> file encodings.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Охренительная вещь
 
1,239
2
24
Как я понимаю можно добавлять только вызов метода в конце или начале класса?А как насчет полей? :ermm:
 
808
3
124
XuPuPG написал(а):
Как я понимаю можно добавлять только вызов метода в конце или начале класса?А как насчет полей? :ermm:
Как ты это потом компилировать собираешься? Костыли удобнее всего вставлять именно хуками, проверено на богатом личном опыте :D

P.S: нашёл довольно крупный баг, вставка return не работает, если условие не always, а возвращаемое значение - HOOK_RETURN_VALUE. Фикс залью скоро. Мб уже со вставкой хуков через аннотации.
 
127
0
Привет, подскажи а как модифицировать метод execute?
Код:
public class TurtlePlaceCommand implements ITurtleCommand {

   private final InteractDirection m_direction;
   private final Object[] m_extraArguments;


   public TurtlePlaceCommand(InteractDirection direction, Object[] arguments) {
      this.m_direction = direction;
      this.m_extraArguments = arguments;
   }

   public TurtleCommandResult execute(ITurtleAccess turtle) {
      ItemStack stack = turtle.getInventory().getStackInSlot(turtle.getSelectedSlot());
      if(stack == null) {
         return TurtleCommandResult.failure("No items to place");
      } else {
         int direction = this.m_direction.toWorldDir(turtle);
         ItemStack remainder = deploy(stack, turtle, direction, this.m_extraArguments);
         if(remainder != stack) {
            turtle.getInventory().setInventorySlotContents(turtle.getSelectedSlot(), remainder);
            turtle.getInventory().onInventoryChanged();
            turtle.playAnimation(TurtleAnimation.Wait);
            return TurtleCommandResult.success();
         } else {
            return stack.getItem() instanceof ItemBlock?TurtleCommandResult.failure("Cannot place block here"):TurtleCommandResult.failure("Cannot place item here");
         }
      }
   }

Мне нужно добавить дополнительную проверку и возвращать TurtleCommandResult.failure("") если проверка не проходит, если проходит то должен продолжаться код метода. Как я понял этот метод нужно полностью заменить, но он использует поля класса, если замени полностью метод, как получить доступ к полям этого класса?
Код:
int direction = this.m_direction.toWorldDir(turtle);
 
808
3
124
Во-первых, полностью заменять метод не нужно. Во-вторых, нужно зайти на страницу репозитория на гитхабе и скачать обновленную либу. Там я как раз пофиксил баг, из-за которого не работал бы хук, который тебе нужен. А написать в твоем случае надо что-то вроде:
Код:
AsmHook.newBuilder()
.setTargetClass("cc.package.name.TurtlePlaceCommand")
.setTargetMethod("execute")
.addTargetMethodParameters("cc.package.name.ITurtleAccess")
.setTargetMethodReturnType("cc.package.name.TurtleCommandResult")
.setHookClass("your.package.name.Hooks")
.setHookMethod("turtleHook")
.addHookMethodParameter("cc.package.name.ITurtleAccess", 1)
.setReturnCondition(ReturnCondition.ON_NOT_NULL)
.setReturnValue(ReturnValue.HOOK_RETURN_VALUE)
.buildAndRegister();
И добавить у себя в классе Hooks метод:
Код:
public static TurtleCommandResult turtleHook(ITurtleAccess turtle){
  if (что-нибудь) {
    return TurtleCommandResult.failure("Чужой приват, или что там за сообщение");
  } else {
    return null; // если вернуть null, то продолжается выполнение целевого метода
  }
}
 
808
3
124
упс..) где это?
[merge_posts_bbcode]Добавлено: 29.06.2015 16:07:53[/merge_posts_bbcode]

Нашел. Выпили строчку просто. На гитхабе обновил. Как обычно, не выпилил свои дебаг-методы для распечатки байткода.
 
1,239
2
24
Глуми помоги,что не так?
Код:
 AsmHook.newBuilder()
                .setTargetClass("net.minecraft.item.ItemSword")
                .setTargetMethod("<init>") // модифицируем конструктор, обфусцированное имя не нужно
                .addTargetMethodParameters(Type.INT_TYPE, TypeHelper.getType("net/minecraft/item/Item"))
                .setHookClass("gloomyfolken.hooklib.example.CommonHooks")
                .setHookMethod("twiceDamage")
                // нулевой параметр - это this
                .addHookMethodParameter("net.minecraft.item.ItemSword", 0)
                .setInjectorFactory(AsmHook.ON_EXIT_FACTORY) // вставляем хук в конец метода
                .buildAndRegister();

CommonHooks:
Код:
 public static void twiceDamage(ItemSword sword){
            sword.setMaxStackSize(40);
        }
А вот что пишет:
[16:17:40] [main/WARN] [FML]: [HOOKLIB] Can not found target method of hook AsmHook: net.minecraft.item.ItemSword#<init> -> gloomyfolken.hooklib.example.CommonHooks#twiceDamage
 
Сверху