diff --git a/build.gradle b/build.gradle index 1493d73d..5ed50e8d 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ dependencies { implementation group: 'com.google.code.gson', name: 'gson', version: '2.7' // https://mvnrepository.com/artifact/org.mozilla/rhino - implementation group: 'org.mozilla', name: 'rhino', version: '1.7.14' + implementation group: 'org.mozilla', name: 'rhino', version: '1.7.8' implementation fileTree (dir: 'iclibs', include: ['*.jar']) implementation 'org.json:json:20231013' diff --git a/iclibs/Nukkit-MOT-SNAPSHOT.jar b/iclibs/Nukkit-MOT-SNAPSHOT.jar index 28855c1d..739a46e9 100644 Binary files a/iclibs/Nukkit-MOT-SNAPSHOT.jar and b/iclibs/Nukkit-MOT-SNAPSHOT.jar differ diff --git a/src/main/java/com/reider745/api/hooks/JarEditor.java b/src/main/java/com/reider745/api/hooks/JarEditor.java index 20bbe8b1..74339e61 100644 --- a/src/main/java/com/reider745/api/hooks/JarEditor.java +++ b/src/main/java/com/reider745/api/hooks/JarEditor.java @@ -57,12 +57,18 @@ public class JarEditor { all_hooks.put(className, hooks); } + private static String getClassName(Object class_name){ + if(class_name instanceof Class clazz) + return clazz.getName(); + return (String) class_name; + } + public JarEditor registerHooksInitializationForClass(Class clazz) throws InstantiationException, IllegalAccessException, NotFoundException { HookClass instance = clazz.newInstance(); Annotation[] annotatedsClass = clazz.getAnnotations(); for(Annotation annotationClass : annotatedsClass) - if(annotationClass instanceof Hooks) { - String className = ((Hooks) annotationClass).class_name(); + if(annotationClass instanceof Hooks hooks) { + String className = getClassName(hooks.class_name()); Method[] methods = clazz.getMethods(); for(Method method : methods){ @@ -71,13 +77,13 @@ public class JarEditor { for (Annotation annotationMethod : annotationsMethod) if(annotationMethod instanceof Inject inject){ String method_name = inject.method(); - String className_ = inject.class_name(); + String className_ = getClassName(inject.class_name()); String sig = inject.signature(); this.addHookInitialization(className_.equals("-1") ? className : className_, method_name.equals("-1") ? method.getName() : method_name, sig, method, inject.type_hook(), isController(method), inject.arguments_map()); }else if(annotationMethod instanceof Injects inject){ String method_name = inject.method(); - String className_ = inject.class_name(); + String className_ = getClassName(inject.class_name()); String[] sigs = inject.signature(); String className__ = className_.equals("-1") ? className : className_; @@ -106,8 +112,8 @@ public class JarEditor { HookClass instance = clazz.newInstance(); Annotation[] annotatedsClass = clazz.getAnnotations(); for(Annotation annotationClass : annotatedsClass) - if(annotationClass instanceof Hooks) { - String className = ((Hooks) annotationClass).class_name(); + if(annotationClass instanceof Hooks hooks) { + String className = getClassName(hooks.class_name()); System.out.println("====="+className+"====="); Method[] methods = clazz.getMethods(); @@ -117,13 +123,13 @@ public class JarEditor { for (Annotation annotationMethod : annotationsMethod) if(annotationMethod instanceof Inject inject){ String method_name = inject.method(); - String className_ = inject.class_name(); + String className_ = getClassName(inject.class_name()); String sig = inject.signature(); this.addHook(className_.equals("-1") ? className : className_, method_name.equals("-1") ? method.getName() : method_name, sig, method, inject.type_hook(), isController(method), inject.arguments_map()); }else if(annotationMethod instanceof Injects inject){ String method_name = inject.method(); - String className_ = inject.class_name(); + String className_ = getClassName(inject.class_name()); String[] sigs = inject.signature(); String className__ = className_.equals("-1") ? className : className_; @@ -162,11 +168,10 @@ public class JarEditor { } StringBuilder args = new StringBuilder(); + if(isStatic) args.append("this"); - if(controller || arguments_map) - args.append("_ctr_hook"); for(int i = 1;i <= arguments_types.length;i++) if(args.toString().equals("")) args.append("$"+i); @@ -204,6 +209,7 @@ public class JarEditor { (retType.equals("void") ? "return;" : "return " + Arguments.getConvertCode(retType, false, "_ctr_hook.getResult()")) + "\n"; else if(typeHook == TypeHook.BEFORE_REPLACE || typeHook == TypeHook.AFTER_REPLACE) code += "return;"; + return code; } @@ -256,12 +262,14 @@ public class JarEditor { private boolean isController(Method replaced){ Class[] parameters = replaced.getParameterTypes(); - return parameters.length == 1 && parameters[0].getName().equals(NameController); + return parameters.length >= 1 && parameters[0].getName().equals(NameController); } private boolean isMapArguments(Method replaced, String[] types, boolean isStatic, boolean isController){ Class[] parameters = replaced.getParameterTypes(); - return parameters.length-(!isStatic ? 0 : 1) != types.length+(isController ? 1 : 0); + if(isController) + return parameters.length <= 1+(isStatic ? 0 : 1); + return false; } private void replaceField(String className, HookClass field_replaced) { diff --git a/src/main/java/com/reider745/commands/ModsListCommand.java b/src/main/java/com/reider745/commands/ModsListCommand.java index 3dbaa53c..226ef75e 100644 --- a/src/main/java/com/reider745/commands/ModsListCommand.java +++ b/src/main/java/com/reider745/commands/ModsListCommand.java @@ -12,11 +12,13 @@ import java.util.List; public class ModsListCommand extends Command { public ModsListCommand() { - super("mods", " - get list mod"); + super("mods", "get list mod"); } @Override public boolean execute(CommandSender commandSender, String s, String[] strings) { + if(!commandSender.isOp()) return false; + List mods = ApparatusModLoader.getSingleton().getAllMods(); String message = "===InnerCoreMods==="; for(ApparatusMod mod : mods){ diff --git a/src/main/java/com/reider745/event/EventListener.java b/src/main/java/com/reider745/event/EventListener.java index 62e660cb..fb3d4896 100644 --- a/src/main/java/com/reider745/event/EventListener.java +++ b/src/main/java/com/reider745/event/EventListener.java @@ -13,20 +13,29 @@ import cn.nukkit.event.entity.EntityDamageByChildEntityEvent; import cn.nukkit.event.entity.EntityDamageByEntityEvent; import cn.nukkit.event.entity.EntityDamageEvent; import cn.nukkit.event.entity.ProjectileHitEvent; +import cn.nukkit.event.inventory.CraftItemEvent; import cn.nukkit.event.inventory.FurnaceBurnEvent; +import cn.nukkit.event.inventory.InventoryClickEvent; import cn.nukkit.event.level.ChunkPopulateEvent; +import cn.nukkit.event.player.CraftingTableOpenEvent; import cn.nukkit.event.player.PlayerEatFoodEvent; import cn.nukkit.event.player.PlayerInteractEvent; import cn.nukkit.event.redstone.RedstoneUpdateEvent; +import cn.nukkit.inventory.CraftingGrid; +import cn.nukkit.item.Item; import cn.nukkit.item.food.Food; import cn.nukkit.level.Level; import cn.nukkit.level.format.FullChunk; import cn.nukkit.math.Vector3; +import cn.nukkit.network.protocol.InventoryTransactionPacket; import com.reider745.api.CallbackHelper; import com.reider745.api.hooks.HookController; +import com.reider745.workbench.Workbench; import com.zhekasmirnov.innercore.api.NativeCallback; import com.zhekasmirnov.innercore.api.NativeFurnaceRegistry; +import java.util.Arrays; + public class EventListener implements Listener { public static void preventedCallback(Event event, CallbackHelper.ICallbackApply apply){ CallbackHelper.apply(event, apply); @@ -92,7 +101,7 @@ public class EventListener implements Listener { } @EventHandler - public void damagetEntity(EntityDamageEvent event){ + public void damageEntity(EntityDamageEvent event){ Entity self = event.getEntity(); Entity attacker; @@ -107,4 +116,9 @@ public class EventListener implements Listener { preventedCallback(event, () -> NativeCallback.onEntityHurt(self.getId(), attacker == null ? -1 : attacker.getId(), event.getCause().ordinal(), (int) event.getDamage() * 2, event.canBeReducedByArmor(), event.isBreakShield()));//последний 2 boolean тут врменн } + + @EventHandler + public void openCraftTable(CraftItemEvent event){ + // Workbench.addCraft(event); + } } \ No newline at end of file diff --git a/src/main/java/com/reider745/hooks/Other.java b/src/main/java/com/reider745/hooks/Other.java index adccc6b4..d9e8b498 100644 --- a/src/main/java/com/reider745/hooks/Other.java +++ b/src/main/java/com/reider745/hooks/Other.java @@ -1,10 +1,28 @@ package com.reider745.hooks; -import cn.nukkit.network.protocol.InventoryContentPacket; +import cn.nukkit.Player; +import cn.nukkit.inventory.CraftingGrid; +import cn.nukkit.inventory.Inventory; +import cn.nukkit.inventory.PlayerUIInventory; +import cn.nukkit.inventory.ShapedRecipe; +import cn.nukkit.inventory.transaction.action.SlotChangeAction; +import cn.nukkit.item.Item; +import com.reider745.api.hooks.ArgumentTypes; import com.reider745.api.hooks.HookClass; +import com.reider745.api.hooks.HookController; +import com.reider745.api.hooks.TypeHook; import com.reider745.api.hooks.annotation.Hooks; import com.reider745.api.hooks.annotation.Inject; +import com.reider745.workbench.Workbench; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; @Hooks public class Other implements HookClass { + @Inject(class_name = "org.mozilla.javascript.ScriptRuntime") + public static String[] getTopPackageNames(){ + return new String[] {"java", "javax", "org", "com", "edu", "net", "android"}; + } } diff --git a/src/main/java/com/reider745/workbench/Workbench.java b/src/main/java/com/reider745/workbench/Workbench.java new file mode 100644 index 00000000..2cbb307e --- /dev/null +++ b/src/main/java/com/reider745/workbench/Workbench.java @@ -0,0 +1,44 @@ +package com.reider745.workbench; + +import cn.nukkit.Player; +import cn.nukkit.event.inventory.CraftItemEvent; +import cn.nukkit.inventory.CraftingGrid; +import cn.nukkit.inventory.PlayerUIInventory; +import cn.nukkit.inventory.transaction.action.SlotChangeAction; +import cn.nukkit.item.Item; +import com.reider745.api.hooks.HookController; + +import java.util.concurrent.ConcurrentHashMap; + +public class Workbench { + private static ConcurrentHashMap playerCrafts = new ConcurrentHashMap<>(); + + public static void addCraft(CraftItemEvent event){ + playerCrafts.put(event.getPlayer(), event); + } + + public static void slotChange(HookController controller, SlotChangeAction self, Player player){ + if(self.getInventory() instanceof PlayerUIInventory playerUIInventory){ + CraftItemEvent event = playerCrafts.get(player); + if(event == null){ + controller.setReplace(false); + return; + } + playerCrafts.remove(player); + CraftingGrid grid = player.getCraftingGrid(); + + System.out.println(grid.getClass()); + System.out.println(grid.getSize()); + System.out.println(self.getSlot()); + + Item item = playerUIInventory.getItem(self.getSlot()); + System.out.println(item); + item.setCount(item.getCount()*2); + playerUIInventory.setItem(self.getSlot(), item); + + controller.setResult(true); + controller.setReplace(true); + } + controller.setReplace(false); + } +} diff --git a/src/main/java/com/zhekasmirnov/innercore/api/mod/API.java b/src/main/java/com/zhekasmirnov/innercore/api/mod/API.java index 9621af05..53ffac76 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/mod/API.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/mod/API.java @@ -95,7 +95,6 @@ public abstract class API extends ScriptableObject { public void injectIntoScope(ScriptableObject scope) { injectIntoScope(scope, null); - scope.put("android", scope, new NativeJavaPackage("android")); } private static HashMap> getAllClassMethods(Class clazz, List filter) { diff --git a/src/main/java/com/zhekasmirnov/innercore/api/mod/recipes/workbench/WorkbenchRecipe.java b/src/main/java/com/zhekasmirnov/innercore/api/mod/recipes/workbench/WorkbenchRecipe.java index 4bfe5879..ff45cd86 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/mod/recipes/workbench/WorkbenchRecipe.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/mod/recipes/workbench/WorkbenchRecipe.java @@ -102,7 +102,8 @@ public abstract class WorkbenchRecipe { public abstract RecipeEntry[] getSortedEntries(); - public void addToVanillaWorkbench() { } + public void addToVanillaWorkbench() { + } public void putIntoTheField(WorkbenchField field, long player) { InventoryPool pool = new InventoryPool(player); diff --git a/src/main/java/com/zhekasmirnov/innercore/api/mod/recipes/workbench/WorkbenchRecipeListBuilder.java b/src/main/java/com/zhekasmirnov/innercore/api/mod/recipes/workbench/WorkbenchRecipeListBuilder.java index 4d0812ca..aa65c08a 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/mod/recipes/workbench/WorkbenchRecipeListBuilder.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/mod/recipes/workbench/WorkbenchRecipeListBuilder.java @@ -76,17 +76,17 @@ public class WorkbenchRecipeListBuilder { public static void selectRecipe(ItemContainer container, WorkbenchRecipe recipe, long player) { deselectRecipe(container, player); - /* container.runTransaction(container0 -> { + container.runTransaction(container0 -> { recipe.putIntoTheField(container, player); container.markAllSlotsDirty(); container.sendChanges(); - });*/ + }); } public static void deselectRecipe(ItemContainer container, long player) { - /*container.runTransaction(container0 -> { + container.runTransaction(container0 -> { WorkbenchRecipeRegistry.cleanupWorkbenchField(container, player); - });*/ + }); } } diff --git a/src/main/java/com/zhekasmirnov/innercore/api/mod/recipes/workbench/WorkbenchRecipeRegistry.java b/src/main/java/com/zhekasmirnov/innercore/api/mod/recipes/workbench/WorkbenchRecipeRegistry.java index edd3d957..2d798b6d 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/mod/recipes/workbench/WorkbenchRecipeRegistry.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/mod/recipes/workbench/WorkbenchRecipeRegistry.java @@ -217,7 +217,7 @@ public class WorkbenchRecipeRegistry { public static void cleanupWorkbenchField(WorkbenchField field, long playerUid) { float[] pos = new float[3]; - NativeAPI.getPosition(NativeAPI.getPlayer(), pos); + NativeAPI.getPosition(playerUid, pos); NativePlayer player = new NativePlayer(playerUid); for (int i = 0; i < 9; i++) { diff --git a/src/main/java/com/zhekasmirnov/innercore/api/runtime/AsyncModLauncher.java b/src/main/java/com/zhekasmirnov/innercore/api/runtime/AsyncModLauncher.java index b773f2ab..e4beb53e 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/runtime/AsyncModLauncher.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/runtime/AsyncModLauncher.java @@ -98,7 +98,7 @@ public class AsyncModLauncher { } private static void loadAllMenuScripts() { - //loadMenuScript("innercore/scripts/workbench", "screen_workbench"); + loadMenuScript("innercore/scripts/workbench", "screen_workbench"); } private static void loadMenuScript(String asset, String name) { diff --git a/src/main/java/com/zhekasmirnov/innercore/mod/executable/Executable.java b/src/main/java/com/zhekasmirnov/innercore/mod/executable/Executable.java index 6ee0cddc..31eb1b16 100644 --- a/src/main/java/com/zhekasmirnov/innercore/mod/executable/Executable.java +++ b/src/main/java/com/zhekasmirnov/innercore/mod/executable/Executable.java @@ -180,8 +180,9 @@ public class Executable implements Runnable { public void run() { // String str = parentContext.decompileScript(script, 4); - // Logger.debug("DECOMPILED SCRIPT", str); + // System.out.println(str); runForResult(); + } protected Object runScript() { diff --git a/src/main/java/com/zhekasmirnov/innercore/utils/FileTools.java b/src/main/java/com/zhekasmirnov/innercore/utils/FileTools.java index 181bfe80..1fb6a0fe 100644 --- a/src/main/java/com/zhekasmirnov/innercore/utils/FileTools.java +++ b/src/main/java/com/zhekasmirnov/innercore/utils/FileTools.java @@ -76,7 +76,7 @@ public class FileTools { } public static InputStream getAssetInputStream(String name) { - return null; + return new ByteArrayInputStream(getAssetBytes(name)); } public static byte[] getAssetBytes(String name) {