From 0a0009a01cfe50147f37d7d817b2c74c533cccc5 Mon Sep 17 00:00:00 2001 From: Reider745 <70357814+Reider745@users.noreply.github.com> Date: Sun, 12 May 2024 09:40:39 +0300 Subject: [PATCH] =?UTF-8?q?Feat:=20=D0=9F=D0=BE=D0=B4=D0=B4=D0=B5=D1=80?= =?UTF-8?q?=D0=B6=D0=BA=D0=B0=20=D1=82=D0=BE=D1=87=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BE=D1=80=D0=B4=D0=B8=D0=BD=D0=B0=D1=82=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B6=D0=B0=D1=82=D0=B8=D1=8F=20=D0=B2=20ItemUse=20&=20?= =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20?= =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B5?= =?UTF-8?q?=D1=86=D0=B5=D0=BF=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлена проверка на blockSource при разрушении TileEntity --- .../com/reider745/event/EventListener.java | 21 +++++-- .../java/com/reider745/hooks/LevelHooks.java | 5 ++ .../java/com/reider745/hooks/PlayerHooks.java | 1 + .../apparatus/mcpe/NativeWorkbench.java | 59 ++++++++++--------- .../innercore/coreengine/core-engine.dev.js | 2 +- 5 files changed, 54 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/reider745/event/EventListener.java b/src/main/java/com/reider745/event/EventListener.java index c677fca6..4a292e92 100644 --- a/src/main/java/com/reider745/event/EventListener.java +++ b/src/main/java/com/reider745/event/EventListener.java @@ -39,10 +39,13 @@ import com.reider745.InnerCoreServer; import com.reider745.Main; import com.reider745.world.BiomesMethods; import com.reider745.world.FakeDimensions; +import com.zhekasmirnov.apparatus.mcpe.NativeWorkbench; import oshi.hardware.NetworkIF; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.UUID; import com.reider745.api.CallbackHelper; import com.reider745.api.CustomManager; @@ -93,6 +96,8 @@ public class EventListener implements Listener { level.sendBlocks(players, new Vector3[]{new Vector3(x, y, z)}, UpdateBlockPacket.FLAG_ALL); } + public static final LinkedHashMap itemUseVector = new LinkedHashMap<>(); + @EventHandler(priority = EventPriority.HIGHEST) public void onInteract(PlayerInteractEvent event) { if (event.equals(dealingEvent) || Boolean.TRUE.equals(dealingEvent)) { @@ -101,13 +106,14 @@ public class EventListener implements Listener { final Block block = event.getBlock(); final Player player = event.getPlayer(); - final Vector3 pos = player.getDirectionVector(); - - pos.x = Math.abs(pos.x) + block.x; - pos.y = Math.abs(pos.y) + block.y; - pos.z = Math.abs(pos.z) + block.z; if (event.getAction() == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK) { + final Vector3 pos = itemUseVector.get(player.getUniqueId()); + + pos.x = Math.abs(pos.x) + block.x; + pos.y = Math.abs(pos.y) + block.y; + pos.z = Math.abs(pos.z) + block.z; + consumeEvent(event, () -> NativeCallback.onItemUsed((int) block.x, (int) block.y, (int) block.z, event.getFace().getIndex(), (float) pos.x, (float) pos.y, (float) pos.z, true, @@ -479,7 +485,10 @@ public class EventListener implements Listener { long playerUid = EntityMethod.getIdForEntity(event.getPlayer()); int inventorySize = (int) Math.sqrt(grid.getSize()); - consumeEvent(event, () -> NativeCallback.onWorkbenchCraft(grid, playerUid, inventorySize)); + 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/LevelHooks.java b/src/main/java/com/reider745/hooks/LevelHooks.java index 365e5251..59fcf4c5 100644 --- a/src/main/java/com/reider745/hooks/LevelHooks.java +++ b/src/main/java/com/reider745/hooks/LevelHooks.java @@ -218,6 +218,11 @@ public class LevelHooks implements HookClass { return item; } + @Inject + public static void useItemOn(Level self, Vector3 vector3, Item item, BlockFace face, float fx, float fy, float fz, Player player, boolean sound){ + EventListener.itemUseVector.put(player.getUniqueId(), new Vector3(fx, fy, fz)); + } + @Inject(className = "cn.nukkit.level.EnumLevel") public static void initLevels(){ DimensionsMethods.initLevels(); diff --git a/src/main/java/com/reider745/hooks/PlayerHooks.java b/src/main/java/com/reider745/hooks/PlayerHooks.java index 268f71a7..7197c477 100644 --- a/src/main/java/com/reider745/hooks/PlayerHooks.java +++ b/src/main/java/com/reider745/hooks/PlayerHooks.java @@ -83,6 +83,7 @@ public class PlayerHooks implements HookClass { @Inject(type = TypeHook.BEFORE_NOT_REPLACE) public static void close(Player player, TextContainer message, String reason, boolean notify) { NetworkHooks.close(player); + EventListener.itemUseVector.remove(player.getUniqueId()); ConnectedClient client = getForPlayer(player); try { if (client != null) diff --git a/src/main/java/com/zhekasmirnov/apparatus/mcpe/NativeWorkbench.java b/src/main/java/com/zhekasmirnov/apparatus/mcpe/NativeWorkbench.java index 3be117be..adb1c265 100644 --- a/src/main/java/com/zhekasmirnov/apparatus/mcpe/NativeWorkbench.java +++ b/src/main/java/com/zhekasmirnov/apparatus/mcpe/NativeWorkbench.java @@ -1,21 +1,22 @@ package com.zhekasmirnov.apparatus.mcpe; import cn.nukkit.Server; -import cn.nukkit.inventory.CraftingManager; -import cn.nukkit.inventory.ShapedRecipe; -import cn.nukkit.inventory.ShapelessRecipe; +import cn.nukkit.inventory.*; import cn.nukkit.item.Item; import cn.nukkit.item.RuntimeItemMapping; import cn.nukkit.item.RuntimeItems; +import cn.nukkit.network.protocol.ProtocolInfo; import com.reider745.InnerCoreServer; import com.reider745.hooks.ItemUtils; import com.zhekasmirnov.apparatus.adapter.innercore.game.item.ItemStack; import com.zhekasmirnov.horizon.runtime.logger.Logger; import com.zhekasmirnov.innercore.api.NativeItemInstanceExtra; +import java.lang.reflect.Method; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; public class NativeWorkbench { @@ -23,6 +24,12 @@ public class NativeWorkbench { void apply(RuntimeItemMapping mapping, CraftingManager craftingManager); } + private static final ArrayList removedRecipes = new ArrayList<>(); + + public static boolean canRemoveRecipe(UUID uuid){ + return removedRecipes.contains(uuid); + } + private static class RecipeRemove implements IApply { public int resultId, resultCount, resultData; @@ -32,35 +39,33 @@ public class NativeWorkbench { this.resultData = resultData; } + private static Collection getRecipes(CraftingManager craftingManager){ + try{ + Method method = craftingManager.getClass().getDeclaredMethod("getRegisterRecipes", int.class); + method.setAccessible(true); + return (Collection) method.invoke(craftingManager, InnerCoreServer.RECIPES_PROTOCOL); + }catch (Exception e){ + Logger.error("ERROR-REMOVE-RECIPE", e); + } + return null; + } + @Override public void apply(RuntimeItemMapping mapping, CraftingManager craftingManager) { - Item itemInstance = ItemUtils.get(this.resultId, this.resultCount, this.resultData); - AtomicBoolean canRemove = new AtomicBoolean(false); + final Item itemInstance = ItemUtils.get(this.resultId, this.resultCount, this.resultData); + final Collection recipes = getRecipes(craftingManager); + boolean removeRecipe = false; - craftingManager.getShapelessRecipes(InnerCoreServer.PROTOCOL).forEach((uid, recipes) -> { - for (UUID uuid : recipes.keySet()) { - ShapelessRecipe recipe = recipes.get(uuid); - if (recipe.getResult().equals(itemInstance)) { - recipes.remove(uuid); - canRemove.set(true); - return; - } + // TODO: Удаляет все крафты этого предмета, в том числе ели их несколько + for(Recipe recipe : recipes){ + if(recipe instanceof CraftingRecipe craftingRecipe && recipe.getResult().equals(itemInstance)){ + removedRecipes.add(craftingRecipe.getId()); + removeRecipe = true; } - }); + } - craftingManager.getShapedRecipes(InnerCoreServer.PROTOCOL).forEach((uid, recipes) -> { - for (UUID uuid : recipes.keySet()) { - ShapedRecipe recipe = recipes.get(uuid); - if (recipe.getResult().equals(itemInstance)) { - recipes.remove(uuid); - canRemove.set(true); - return; - } - } - }); - - if(!canRemove.get()) - Logger.warning("Not remove recipe "+itemInstance); + if(!removeRecipe) + Logger.warning("Not remove recipe " + itemInstance); } } diff --git a/src/main/resources/innercore/coreengine/core-engine.dev.js b/src/main/resources/innercore/coreengine/core-engine.dev.js index 705e9b14..1b4af8e2 100755 --- a/src/main/resources/innercore/coreengine/core-engine.dev.js +++ b/src/main/resources/innercore/coreengine/core-engine.dev.js @@ -1099,7 +1099,7 @@ var TileEntity = { tileEntity.container.close(); if (tileEntity.container.isLegacyContainer()) { tileEntity.container.dropAt(tileEntity.x + 0.5, tileEntity.y + 0.5, tileEntity.z + 0.5); - } else { + } else if(tileEntity.blockSource) { tileEntity.container.dropAt(tileEntity.blockSource, tileEntity.x + 0.5, tileEntity.y + 0.5, tileEntity.z + 0.5); tileEntity.container.removeEntity(); }