diff --git a/iclibs/Nukkit-MOT-SNAPSHOT.jar b/iclibs/Nukkit-MOT-SNAPSHOT.jar index 18ac04c1..58cad615 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/InnerCoreServer.java b/src/main/java/com/reider745/InnerCoreServer.java index b75e84ad..465456d7 100644 --- a/src/main/java/com/reider745/InnerCoreServer.java +++ b/src/main/java/com/reider745/InnerCoreServer.java @@ -1,11 +1,14 @@ package com.reider745; import cn.nukkit.Server; +import cn.nukkit.inventory.transaction.CraftingTransaction; import cn.nukkit.plugin.PluginDescription; import cn.nukkit.plugin.PluginManager; +import cn.nukkit.recipe.RecipeRegistry; import com.google.common.base.Preconditions; import com.reider745.api.CallbackHelper; +import com.reider745.api.ReflectHelper; import com.reider745.behavior.BehaviorPack; import com.reider745.block.CustomBlock; import com.reider745.commands.CommandsHelper; @@ -320,6 +323,18 @@ public class InnerCoreServer { CustomItem.addCreativeItemsWeapons(); CustomItem.addCreativeItems(); CustomItem.addCreativeItemsNature(); + + try{ + for(File file : Objects.requireNonNull(new File(InnerCoreServer.dataPath, "behavior_packs").listFiles())) { + try{ + BehaviorPack pack = new BehaviorPack(file.getAbsolutePath()); + pack.load(); + }catch (Exception e) { + Logger.error("Error loaded behavior pack " + file.getAbsolutePath(), e); + } + } + }catch (Exception ignore){} + NativeWorkbench.init(); NativeFurnaceRegistry.init(); CommandsHelper.init(); @@ -343,19 +358,6 @@ public class InnerCoreServer { } } - public void start() { - try{ - for(File file : Objects.requireNonNull(new File(InnerCoreServer.dataPath, "behavior_packs").listFiles())) { - try{ - BehaviorPack pack = new BehaviorPack(file.getAbsolutePath()); - pack.load(); - }catch (Exception e) { - Logger.error("Error loaded behavior pack " + file.getAbsolutePath(), e); - } - } - }catch (Exception ignore){} - } - public static Object getProperty(String variable) { return getProperty(variable, (Object) null); } diff --git a/src/main/java/com/reider745/behavior/BehaviorPack.java b/src/main/java/com/reider745/behavior/BehaviorPack.java index b4497aca..8db16e3f 100644 --- a/src/main/java/com/reider745/behavior/BehaviorPack.java +++ b/src/main/java/com/reider745/behavior/BehaviorPack.java @@ -2,6 +2,8 @@ package com.reider745.behavior; import com.reider745.behavior.entities.EntitiesContent; import com.reider745.behavior.items.ItemsContent; +import com.reider745.behavior.recipes.RecipesShapedContent; +import com.reider745.behavior.recipes.RecipesShapelessContent; import com.reider745.behavior.spawnrules.SpawnRulesContent; import com.zhekasmirnov.horizon.runtime.logger.Logger; import com.zhekasmirnov.horizon.util.FileUtils; @@ -19,6 +21,8 @@ public class BehaviorPack { contents_api.add(new EntitiesContent()); contents_api.add(new SpawnRulesContent()); contents_api.add(new ItemsContent()); + contents_api.add(new RecipesShapedContent()); + contents_api.add(new RecipesShapelessContent()); } private final String path; diff --git a/src/main/java/com/reider745/behavior/recipes/RecipesShapedContent.java b/src/main/java/com/reider745/behavior/recipes/RecipesShapedContent.java new file mode 100644 index 00000000..30f6698e --- /dev/null +++ b/src/main/java/com/reider745/behavior/recipes/RecipesShapedContent.java @@ -0,0 +1,76 @@ +package com.reider745.behavior.recipes; + +import cn.nukkit.item.Item; +import cn.nukkit.recipe.RecipeRegistry; +import cn.nukkit.recipe.descriptor.DefaultDescriptor; +import cn.nukkit.recipe.descriptor.ItemDescriptor; +import cn.nukkit.recipe.impl.ShapedRecipe; +import com.reider745.behavior.BehaviorContent; +import com.zhekasmirnov.horizon.runtime.logger.Logger; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class RecipesShapedContent extends BehaviorContent { + protected static long RECIPE_ID = Long.MAX_VALUE; + + @Override + public String getTagName() { + return "minecraft:recipe_shaped"; + } + + @Override + public String getDefaultDirectory() { + return "recipes"; + } + + protected Item parse(Object json) { + if (json instanceof JSONObject jsonObject) { + Item item = Item.fromString(jsonObject.getString("item")); + item.setCount(jsonObject.optInt("count", 1)); + item.setDamage(jsonObject.optInt("data", 0)); + return item; + } else if (json instanceof JSONArray jsonArray) { + if(jsonArray.length() == 1){ + return parse(jsonArray.get(0)); + } + } + + throw new RuntimeException("Not implemented yet"); + } + + @Override + public void load(JSONObject content, String file) { + final JSONObject json = content.getJSONObject(getTagName()); + final Item result = parse(json.get("result")); + final Map map = new HashMap<>(); + + final JSONObject key = json.getJSONObject("key"); + for(String character : key.keySet()) { + map.put(character.charAt(0), new DefaultDescriptor(parse(key.getJSONObject(character)))); + } + + final JSONArray pattern = json.getJSONArray("pattern"); + final String[] patters = new String[pattern.length()]; + + for(int i = 0; i < pattern.length(); i++) { + patters[i] = pattern.getString(i); + for(int a = patters[i].length(); a < 3; a++) { + patters[i] = patters[i] + " "; + } + } + + final JSONArray tags = json.getJSONArray("tags"); + for(int i = 0; i < tags.length(); i++) { + final String tag = tags.getString(i); + + switch(tag) { + case "crafting_table" -> RecipeRegistry.registerShapedRecipe(new ShapedRecipe(String.valueOf(RECIPE_ID--), json.optInt("priority", 1), result, patters, map, List.of())); + default -> Logger.warning("Not implemented yet: " + tag + ", " + file); + } + } + } +} diff --git a/src/main/java/com/reider745/behavior/recipes/RecipesShapelessContent.java b/src/main/java/com/reider745/behavior/recipes/RecipesShapelessContent.java new file mode 100644 index 00000000..37688f83 --- /dev/null +++ b/src/main/java/com/reider745/behavior/recipes/RecipesShapelessContent.java @@ -0,0 +1,57 @@ +package com.reider745.behavior.recipes; + +import cn.nukkit.item.Item; +import cn.nukkit.recipe.RecipeRegistry; +import cn.nukkit.recipe.descriptor.DefaultDescriptor; +import cn.nukkit.recipe.descriptor.ItemDescriptor; +import cn.nukkit.recipe.impl.ShapelessRecipe; +import cn.nukkit.recipe.impl.StonecutterRecipe; +import com.zhekasmirnov.horizon.runtime.logger.Logger; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Collection; + +public class RecipesShapelessContent extends RecipesShapedContent { + @Override + public String getTagName() { + return "minecraft:recipe_shapeless"; + } + + @Override + public void load(JSONObject content, String file) { + final JSONObject json = content.getJSONObject(this.getTagName()); + final JSONArray ingredientsJson = json.getJSONArray("ingredients"); + + final Item result = parse(json.get("result")); + final Collection ingredients = new ArrayList<>(); + + for (int i = 0; i < ingredientsJson.length(); i++) { + Item item = parse(ingredientsJson.get(i)); + if(item.isNull()) { + Logger.warning("Invalid ingredient " + ingredientsJson.get(i)); + return; + } + ingredients.add(new DefaultDescriptor(item)); + } + + if(result.isNull()){ + Logger.warning("Invalid result " + json.get("result")); + return; + } + + final JSONArray tags = json.getJSONArray("tags"); + for(int i = 0; i < tags.length(); i++) { + final String tag = tags.getString(i); + final String id = String.valueOf(RECIPE_ID--); + final int priority = json.optInt("priority", 1); + + switch(tag) { + case "crafting_table" -> RecipeRegistry.registerShapelessRecipe(new ShapelessRecipe(id, priority, result, ingredients)); + case "stonecutter" -> RecipeRegistry.addStonecutterRecipe(new StonecutterRecipe(id, priority, result, ingredients)); + default -> Logger.warning("Not implemented yet: " + tag + ", " + file); + } + } + } +} diff --git a/src/main/java/com/reider745/event/EventListener.java b/src/main/java/com/reider745/event/EventListener.java index 069eb2dc..84a50e2f 100644 --- a/src/main/java/com/reider745/event/EventListener.java +++ b/src/main/java/com/reider745/event/EventListener.java @@ -525,14 +525,17 @@ public class EventListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onCraftItem(CraftItemEvent event) { + Player player = event.getPlayer(); CraftingGrid grid = event.getPlayer().getCraftingGrid(); long playerUid = EntityMethod.getIdForEntity(event.getPlayer()); int inventorySize = (int) Math.sqrt(grid.getSize()); - if(!NativeWorkbench.canRemoveRecipe(event.getTransaction().getRecipe().getId())) - consumeEvent(event, () -> NativeCallback.onWorkbenchCraft(grid, playerUid, inventorySize)); - else - event.setCancelled(); + if(player.craftingType == Player.CRAFTING_SMALL || player.craftingType == Player.CRAFTING_BIG) { + if (!NativeWorkbench.canRemoveRecipe(event.getTransaction().getRecipe().getId())) + consumeEvent(event, () -> NativeCallback.onWorkbenchCraft(grid, playerUid, inventorySize)); + else + event.setCancelled(); + } } @EventHandler(priority = EventPriority.HIGHEST) diff --git a/src/main/java/com/reider745/hooks/ServerHooks.java b/src/main/java/com/reider745/hooks/ServerHooks.java index 8ab9f094..b67ae5e6 100644 --- a/src/main/java/com/reider745/hooks/ServerHooks.java +++ b/src/main/java/com/reider745/hooks/ServerHooks.java @@ -32,7 +32,6 @@ public class ServerHooks { @Inject public static void start(Server self) throws Exception { innerCoreServer.afterload(); - innerCoreServer.start(); } @Inject(className = "cn.nukkit.dispenser.DispenseBehaviorRegister", type = TypeHook.AFTER) diff --git a/src/main/java/com/reider745/hooks/item/RuntimeItemsHooks.java b/src/main/java/com/reider745/hooks/item/RuntimeItemsHooks.java index 349fe523..53e27a9d 100644 --- a/src/main/java/com/reider745/hooks/item/RuntimeItemsHooks.java +++ b/src/main/java/com/reider745/hooks/item/RuntimeItemsHooks.java @@ -54,7 +54,7 @@ public class RuntimeItemsHooks implements HookClass { Item item = Item.get(id, 0); if (item.getId() != 0) { - Item.NAMESPACED_ID_ITEM.put(name, () -> item); + Item.NAMESPACED_ID_ITEM.put(name, item::clone); } boolean hasDamage = item instanceof ItemDurable; int damage = ItemMethod.getMaxDamageForId(id, 0); @@ -90,7 +90,7 @@ public class RuntimeItemsHooks implements HookClass { Item item = Item.get(id, 0); if (item.getId() != 0) { - Item.NAMESPACED_ID_ITEM.put(name, () -> item); + Item.NAMESPACED_ID_ITEM.put(name, item::clone); } }); diff --git a/src/main/java/com/zhekasmirnov/innercore/mod/build/ModLoader.java b/src/main/java/com/zhekasmirnov/innercore/mod/build/ModLoader.java index ad7a0dbc..c497b6d0 100644 --- a/src/main/java/com/zhekasmirnov/innercore/mod/build/ModLoader.java +++ b/src/main/java/com/zhekasmirnov/innercore/mod/build/ModLoader.java @@ -228,31 +228,37 @@ public class ModLoader { } for (File file : files) { - File targetZip = new File(targetDir, file.getName() + ".zip"); - while (targetZip.exists()) { - targetZip = new File(targetDir, targetZip.getName().replaceFirst("\\.zip$", "") + "-.zip"); - } - - try { - // Создаем ZIP-архив - try (FileOutputStream fos = new FileOutputStream(targetZip); - ZipOutputStream zos = new ZipOutputStream(fos)) { - - zipDirectory(file, file.getName(), zos); + if (compression) { + File targetZip = new File(targetDir, file.getName() + ".zip"); + while (targetZip.exists()) { + targetZip = new File(targetDir, targetZip.getName().replaceFirst("\\.zip$", "") + "-.zip"); } - // Если MinecraftPack может работать с ZIP, передаем архив - // Иначе нужно будет добавить распаковку как в первом варианте - MinecraftPack pack = MinecraftPack.fromDirectory(targetZip, type); - if (pack != null) { - minecraftPacks.add(pack); - } + try { + try (FileOutputStream fos = new FileOutputStream(targetZip); + ZipOutputStream zos = new ZipOutputStream(fos)) { - } catch (IOException e) { - e.printStackTrace(); - continue; + zipDirectory(file, file.getName(), zos); + } + + MinecraftPack pack = MinecraftPack.fromDirectory(targetZip, type); + if (pack != null) { + minecraftPacks.add(pack); + } + + } catch (IOException e) { + e.printStackTrace(); + continue; + } + } else { + try { + FileUtils.copyFileTree(file, new File(targetDir, file.getName()), null, null); + } catch (IOException e) { + throw new RuntimeException(e); + } } } + } private void zipDirectory(File directory, String baseName, ZipOutputStream zos) throws IOException {