From f92a988ab03cd02a95bdfe65ab31529ee8415b9e Mon Sep 17 00:00:00 2001 From: Reider745 <70357814+Reider745@users.noreply.github.com> Date: Tue, 29 Oct 2024 12:31:42 +0300 Subject: [PATCH] =?UTF-8?q?fixed:=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BA=D0=BE=D0=BE=D1=80=D0=B4=D0=B8?= =?UTF-8?q?=D0=BD=D0=B0=D1=82=D1=8B=20=D1=81=20=D0=BF=D0=BB=D0=B0=D0=B2?= =?UTF-8?q?=D0=B0=D1=8E=D1=89=D0=B5=D0=B9=20=D1=82=D0=BE=D1=87=D0=BA=D0=BE?= =?UTF-8?q?=D0=B9=20&=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=20isValid=20=D0=B2=20ServerPlayerTick?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/reider745/api/ReflectHelper.java | 3 --- .../com/reider745/entity/EntityMethod.java | 4 ++++ .../com/reider745/event/EventListener.java | 13 ++++++++++++- .../java/com/reider745/hooks/LevelHooks.java | 18 ++++++++++++++++++ .../java/com/reider745/hooks/PlayerHooks.java | 1 + .../com/reider745/world/BiomesMethods.java | 3 ++- .../api/player/NetworkPlayerHandler.java | 2 +- 7 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/reider745/api/ReflectHelper.java b/src/main/java/com/reider745/api/ReflectHelper.java index 90857dfb..ec2bd2d5 100644 --- a/src/main/java/com/reider745/api/ReflectHelper.java +++ b/src/main/java/com/reider745/api/ReflectHelper.java @@ -1,8 +1,5 @@ package com.reider745.api; -import cn.nukkit.entity.Entity; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; import java.lang.reflect.Field; import java.lang.reflect.Method; diff --git a/src/main/java/com/reider745/entity/EntityMethod.java b/src/main/java/com/reider745/entity/EntityMethod.java index e3b5301c..fb8247d1 100644 --- a/src/main/java/com/reider745/entity/EntityMethod.java +++ b/src/main/java/com/reider745/entity/EntityMethod.java @@ -111,6 +111,10 @@ public class EntityMethod { return entity != null && entity.isValid(); } + public static boolean isValid(long entity) { + return isValid(getEntityById(entity)); + } + private static T validateThen(long entityUid, Function then, T defaultValue) { Entity entity = getEntityById(entityUid); if (isValid(entity)) { diff --git a/src/main/java/com/reider745/event/EventListener.java b/src/main/java/com/reider745/event/EventListener.java index d005a5e5..37d857cf 100644 --- a/src/main/java/com/reider745/event/EventListener.java +++ b/src/main/java/com/reider745/event/EventListener.java @@ -47,6 +47,7 @@ import com.zhekasmirnov.apparatus.multiplayer.Network; import oshi.hardware.NetworkIF; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import com.reider745.api.CallbackHelper; import com.reider745.api.CustomManager; @@ -96,6 +97,16 @@ public class EventListener implements Listener { level.sendBlocks(players, new Vector3[]{new Vector3(x, y, z)}, UpdateBlockPacket.FLAG_ALL); } + private static final ConcurrentHashMap vectorPositions = new ConcurrentHashMap<>(); + + public static void setPosition(Player player, Vector3 pos){ + vectorPositions.put(player, pos); + } + + public static void remove(Player player){ + vectorPositions.remove(player); + } + @EventHandler(priority = EventPriority.HIGHEST) public void onInteract(PlayerInteractEvent event) { if (event.equals(dealingEvent) || Boolean.TRUE.equals(dealingEvent)) { @@ -106,7 +117,7 @@ public class EventListener implements Listener { final Player player = event.getPlayer(); if (event.getAction() == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK) { - final Vector3 pos = event.getTouchVector(); + final Vector3 pos = vectorPositions.get(player); pos.x = Math.abs(pos.x) + block.x; pos.y = Math.abs(pos.y) + block.y; diff --git a/src/main/java/com/reider745/hooks/LevelHooks.java b/src/main/java/com/reider745/hooks/LevelHooks.java index 4bd741ad..60242fb5 100644 --- a/src/main/java/com/reider745/hooks/LevelHooks.java +++ b/src/main/java/com/reider745/hooks/LevelHooks.java @@ -18,6 +18,8 @@ import cn.nukkit.level.ChunkLoader; import cn.nukkit.level.GameRule; import cn.nukkit.level.Level; import cn.nukkit.level.Position; +import cn.nukkit.level.format.LevelProvider; +import cn.nukkit.level.format.anvil.Anvil; import cn.nukkit.level.format.generic.BaseFullChunk; import cn.nukkit.level.format.generic.BaseLevelProvider; import cn.nukkit.level.particle.DestroyBlockParticle; @@ -411,4 +413,20 @@ public class LevelHooks implements HookClass { } return true; } + + @Inject + public static void useItemOn(Level self, Vector3 vector, Item item, BlockFace face, float fx, float fy, float fz, Player player, boolean playSound) { + // TODO: Событие нажатия на блок от Nukkit-Mot не дает координаты с плавающей точкой + EventListener.setPosition(player, new Vector3(fx, fy, fz)); + } + + // TODO: Удаление поддержки leveldb(не стабилен, ломает пользовательские биомы) + /* + Ломает сохранение пользовательских биомов + Имеет утечки памяти + */ + @Inject(className = "cn.nukkit.level.format.LevelProviderManager") + public static Class getProviderByName(String name){ + return Anvil.class; + } } diff --git a/src/main/java/com/reider745/hooks/PlayerHooks.java b/src/main/java/com/reider745/hooks/PlayerHooks.java index 19a1ef5a..153ccbc2 100644 --- a/src/main/java/com/reider745/hooks/PlayerHooks.java +++ b/src/main/java/com/reider745/hooks/PlayerHooks.java @@ -85,6 +85,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.remove(player); ConnectedClient client = getForPlayer(player); try { if (client != null) diff --git a/src/main/java/com/reider745/world/BiomesMethods.java b/src/main/java/com/reider745/world/BiomesMethods.java index 56ebc6b2..9a974613 100644 --- a/src/main/java/com/reider745/world/BiomesMethods.java +++ b/src/main/java/com/reider745/world/BiomesMethods.java @@ -80,12 +80,13 @@ public class BiomesMethods { return json; } + // TODO: Проблема клиент не правильно обрабатывает пользовательские биомы(вероятнее всего проблема на стороне клиента) public static long nativeRegister(String name) { if(AvailableIDS.isEmpty()){ throw new RuntimeException("MAX BIOMES!"); } NukkitCustomBiome biome = new NukkitCustomBiome(null, name); - biome.reg(AvailableIDS.remove(AvailableIDS.size()-1)); + biome.reg(AvailableIDS.remove(0)); customBiomes.put(biome.getId(), biome); // без этого дерьма работает diff --git a/src/main/java/com/zhekasmirnov/apparatus/api/player/NetworkPlayerHandler.java b/src/main/java/com/zhekasmirnov/apparatus/api/player/NetworkPlayerHandler.java index f720ec7c..10d8a8db 100644 --- a/src/main/java/com/zhekasmirnov/apparatus/api/player/NetworkPlayerHandler.java +++ b/src/main/java/com/zhekasmirnov/apparatus/api/player/NetworkPlayerHandler.java @@ -53,7 +53,7 @@ public class NetworkPlayerHandler { } } - if (!isTickCallbackDisabled) { + if (!isTickCallbackDisabled && EntityMethod.isValid(actor.getUid())) { try { Callback.invokeCallback(isLocal ? "LocalPlayerTick" : "ServerPlayerTick", actor.getUid(), isDead); } catch (Throwable err) {