diff --git a/iclibs/Nukkit-MOT-SNAPSHOT.jar b/iclibs/Nukkit-MOT-SNAPSHOT.jar index 0e23629f..691b3284 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/Main.java b/src/main/java/com/reider745/Main.java index 8f5d514e..1b5adffc 100644 --- a/src/main/java/com/reider745/Main.java +++ b/src/main/java/com/reider745/Main.java @@ -9,7 +9,6 @@ import com.reider745.api.hooks.JarEditor; import com.reider745.event.DispenseBehaviorOverrides; import com.reider745.hooks.*; import com.reider745.hooks.bugfix.DimensionsFix; -import com.reider745.hooks.bugfix.EntityItemHooks; import com.reider745.network.CraftingTransactionPacket; import com.reider745.network.InnerCorePacket; @@ -67,7 +66,6 @@ public class Main { loader.registerHooksInitializationForClass(GlobalBanList.class); // bug fix - loader.registerHooksInitializationForClass(EntityItemHooks.class); loader.registerHooksInitializationForClass(DimensionsFix.class); loader.init(); diff --git a/src/main/java/com/reider745/commands/CommandsHelper.java b/src/main/java/com/reider745/commands/CommandsHelper.java index b23b5fa4..30e1d338 100644 --- a/src/main/java/com/reider745/commands/CommandsHelper.java +++ b/src/main/java/com/reider745/commands/CommandsHelper.java @@ -6,12 +6,15 @@ import cn.nukkit.command.SimpleCommandMap; public class CommandsHelper { public static void init() { final SimpleCommandMap map = Server.getInstance().getCommandMap(); - map.register("inner_core", new ModsListCommand()); - map.register("inner_core", new CustomBlocksCommands()); - map.register("inner_core", new CustomItemsCommands()); - map.register("inner_core", new StateCommand()); - map.register("inner_core", new InnerCoreNetworkCommand()); - map.register("inner_core", new GenChunksCommands()); - map.register("inner_core", new CallbackProfilingCommand()); + final String tag = "inner_core"; + + map.register(tag, new ModsListCommand()); + map.register(tag, new CustomBlocksCommands()); + map.register(tag, new CustomItemsCommands()); + map.register(tag, new StateCommand()); + map.register(tag, new InnerCoreNetworkCommand()); + map.register(tag, new GenChunksCommands()); + map.register(tag, new CallbackProfilingCommand()); + map.register(tag, new GetAllPlayersIdCommand()); } } diff --git a/src/main/java/com/reider745/commands/GetAllPlayersIdCommand.java b/src/main/java/com/reider745/commands/GetAllPlayersIdCommand.java new file mode 100644 index 00000000..69634d5b --- /dev/null +++ b/src/main/java/com/reider745/commands/GetAllPlayersIdCommand.java @@ -0,0 +1,20 @@ +package com.reider745.commands; + +import cn.nukkit.command.Command; +import cn.nukkit.command.CommandSender; +import com.reider745.entity.EntityMethod; + +public class GetAllPlayersIdCommand extends Command { + public GetAllPlayersIdCommand() { + super("get_all_players_id", ""); + } + + @Override + public boolean execute(CommandSender commandSender, String commandLabel, String[] args) { + if (!commandSender.isOp()) + return false; + + commandSender.getServer().getOnlinePlayers().values().forEach(player -> commandSender.sendMessage("Name: "+player.getDisplayName()+", Id: "+EntityMethod.getIdForEntity(player))); + return true; + } +} diff --git a/src/main/java/com/reider745/entity/EntityMethod.java b/src/main/java/com/reider745/entity/EntityMethod.java index 52cc3125..b984f757 100644 --- a/src/main/java/com/reider745/entity/EntityMethod.java +++ b/src/main/java/com/reider745/entity/EntityMethod.java @@ -46,8 +46,6 @@ import java.util.function.Function; public class EntityMethod { public static long getIdForEntity(Entity entity){ - if(entity instanceof EntityHuman human) - return human.getUniqueId().node(); return entity.getId(); } @@ -58,7 +56,7 @@ public class EntityMethod { Iterator> it = players.entrySet().iterator(); while (it.hasNext()){ Map.Entry entry = it.next(); - if(entry.getKey().node() == entity) + if(entry.getValue().getId() == entity) return entry.getValue(); } @@ -77,9 +75,11 @@ public class EntityMethod { return entity; } } + if (entityUid != 0 && InnerCoreServer.isDeveloperMode()) { Logger.warning("NativeAPI", "Unknown entityUid=" + entityUid + ", aborting requested action!"); } + return null; } diff --git a/src/main/java/com/reider745/entity/EntityMotion.java b/src/main/java/com/reider745/entity/EntityMotion.java index bc042341..fe95e8ad 100644 --- a/src/main/java/com/reider745/entity/EntityMotion.java +++ b/src/main/java/com/reider745/entity/EntityMotion.java @@ -2,6 +2,7 @@ package com.reider745.entity; import cn.nukkit.entity.Entity; +import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; // TODO: It was too good to be in ZoteCore, remote it. @@ -24,7 +25,7 @@ public class EntityMotion { public static void tick() { for (final Entity entity : positionsCurrent.keySet()) - positionsLast.put(entity, positionsCurrent.put(entity, new double[] { entity.x, entity.y, entity.z })); + positionsLast.put(entity, positionsCurrent.put(entity, new double[]{entity.x, entity.y, entity.z})); } public static void added(final Entity entity) { diff --git a/src/main/java/com/reider745/hooks/EntityOverrides.java b/src/main/java/com/reider745/hooks/EntityOverrides.java index 759201a2..26f41ad8 100644 --- a/src/main/java/com/reider745/hooks/EntityOverrides.java +++ b/src/main/java/com/reider745/hooks/EntityOverrides.java @@ -1,12 +1,19 @@ package com.reider745.hooks; +import cn.nukkit.Player; +import cn.nukkit.entity.Entity; +import com.reider745.api.ReflectHelper; import com.reider745.api.hooks.HookClass; import com.reider745.api.hooks.annotation.Hooks; +import com.reider745.api.hooks.annotation.Inject; import javassist.CannotCompileException; import javassist.CtClass; import javassist.CtMethod; import javassist.NotFoundException; +import java.lang.reflect.Field; +import java.util.UUID; + @Hooks(className = "cn.nukkit.entity.item.EntityArmorStand") public class EntityOverrides implements HookClass { @@ -24,6 +31,25 @@ public class EntityOverrides implements HookClass { } } + private static Field fieldId; + + static { + try { + fieldId = Entity.class.getDeclaredField("id"); + fieldId.setAccessible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Inject(className = "cn.nukkit.entity.Entity") + public static void scheduleUpdate(Entity self){ + try { + if(self.isPlayer) + fieldId.set(self, self.getUniqueId().toString().hashCode()); + } catch (IllegalAccessException ignore) {} + } + // @Inject(className = "cn.nukkit.entity.EntityHumanType", type = TypeHook.BEFORE, signature = "(Lcn/nukkit/item/Item;Lcn/nukkit/entity/Entity;FZLcn/nukkit/event/entity/EntityDamageEvent$DamageCause;)Lcn/nukkit/item/Item;") // public static void damageArmor(HookController controller, EntityHumanType human, Item armor, Entity damager, // float damage, boolean shield, DamageCause cause) { diff --git a/src/main/java/com/reider745/hooks/NetworkHooks.java b/src/main/java/com/reider745/hooks/NetworkHooks.java index 5d827408..b063c73e 100644 --- a/src/main/java/com/reider745/hooks/NetworkHooks.java +++ b/src/main/java/com/reider745/hooks/NetworkHooks.java @@ -83,7 +83,7 @@ public class NetworkHooks implements HookClass { if (player != null && packetId == 1) player.dataPacket(InnerCorePacket.sendInfo); - DataPacket pk = network.getPacket(packetId); + DataPacket pk = network.getPacket(packetId, InnerCoreServer.PROTOCOL); if (pk != null) { pk.protocol = player == null ? Integer.MAX_VALUE : player.protocol; diff --git a/src/main/java/com/reider745/hooks/PlayerHooks.java b/src/main/java/com/reider745/hooks/PlayerHooks.java index 29322b10..ab916056 100644 --- a/src/main/java/com/reider745/hooks/PlayerHooks.java +++ b/src/main/java/com/reider745/hooks/PlayerHooks.java @@ -8,6 +8,7 @@ import cn.nukkit.network.protocol.DataPacket; import cn.nukkit.utils.TextFormat; import com.reider745.InnerCoreServer; +import com.reider745.api.ReflectHelper; import com.reider745.api.hooks.HookClass; import com.reider745.api.hooks.TypeHook; import com.reider745.api.hooks.annotation.Inject; diff --git a/src/main/java/com/reider745/hooks/RhinoOverrides.java b/src/main/java/com/reider745/hooks/RhinoOverrides.java index 0bcc10b5..feb9258e 100644 --- a/src/main/java/com/reider745/hooks/RhinoOverrides.java +++ b/src/main/java/com/reider745/hooks/RhinoOverrides.java @@ -31,7 +31,7 @@ public class RhinoOverrides implements HookClass { @Inject(className = "org.mozilla.javascript.ScriptRuntime") public static String[] getTopPackageNames() { - return new String[] { "java", "javax", "org", "com", "edu", "net", "android" }; + return new String[] { "java", "javax", "org", "com", "edu", "net", "android", "cn"}; } @Inject(className = "org.mozilla.javascript.ScriptRuntime", type = TypeHook.BEFORE_REPLACE) diff --git a/src/main/java/com/reider745/hooks/bugfix/EntityItemHooks.java b/src/main/java/com/reider745/hooks/bugfix/EntityItemHooks.java deleted file mode 100644 index 25c90e02..00000000 --- a/src/main/java/com/reider745/hooks/bugfix/EntityItemHooks.java +++ /dev/null @@ -1,223 +0,0 @@ -package com.reider745.hooks.bugfix; - -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.block.BlockLava; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityItem; -import cn.nukkit.event.entity.ItemDespawnEvent; -import cn.nukkit.item.Item; -import cn.nukkit.network.protocol.EntityEventPacket; -import com.reider745.api.hooks.HookClass; -import com.reider745.api.hooks.TypeHook; -import com.reider745.api.hooks.annotation.Hooks; -import com.reider745.api.hooks.annotation.Inject; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.Iterator; - -@Hooks(className = "cn.nukkit.entity.item.EntityItem") -public class EntityItemHooks implements HookClass { - private static boolean isInsideOfLava(EntityItem self) { - Iterator var1 = self.getCollisionBlocks().iterator(); - - Block block; - do { - if (!var1.hasNext()) { - return false; - } - - block = var1.next(); - } while(!(block instanceof BlockLava)); - - return true; - } - - private static boolean enableHeadYaw(Entity self){ - return !(self instanceof EntityItem); - } - - //код взят из PowerNukkitX - @Inject(type = TypeHook.BEFORE_REPLACE, className = "cn.nukkit.entity.Entity") - public static void updateMovement(Entity self){ - try { - if (!enableHeadYaw(self)) { - self.headYaw = self.yaw; - } - double diffPosition = (self.x - self.lastX) * (self.x - self.lastX) + (self.y - self.lastY) * (self.y - self.lastY) + (self.z - self.lastZ) * (self.z - self.lastZ); - double diffRotation = (enableHeadYaw(self) ? (self.headYaw - self.lastHeadYaw) * (self.headYaw - self.lastHeadYaw) : 0) + (self.yaw - self.lastYaw) * (self.yaw - self.lastYaw) + (self.pitch - self.lastPitch) * (self.pitch - self.lastPitch); - - double diffMotion = (self.motionX - self.lastMotionX) * (self.motionX - self.lastMotionX) + (self.motionY - self.lastMotionY) * (self.motionY - self.lastMotionY) + (self.motionZ - self.lastMotionZ) * (self.motionZ - self.lastMotionZ); - - if (diffPosition > 0.0001 || diffRotation > 1.0) { //0.2 ** 2, 1.5 ** 2 - final Method method = Entity.class.getDeclaredMethod("getBaseOffset"); - method.setAccessible(true); - self.addMovement(self.x, self.isPlayer ? self.y : self.y + ((Float) method.invoke(self)), self.z, self.yaw, self.pitch, self.headYaw); - - self.lastX = self.x; - self.lastY = self.y; - self.lastZ = self.z; - - self.lastPitch = self.pitch; - self.lastYaw = self.yaw; - self.lastHeadYaw = self.headYaw; - - self.positionChanged = true; - } else { - self.positionChanged = false; - } - - if (diffMotion > 0.0025 || (diffMotion > 0.0001 && self.getMotion().lengthSquared() <= 0.0001)) { //0.05 ** 2 - self.lastMotionX = self.motionX; - self.lastMotionY = self.motionY; - self.lastMotionZ = self.motionZ; - - self.addMotion(self.motionX, self.motionY, self.motionZ); - } - }catch (Exception e){ - e.printStackTrace(); - } - } - - //код взят из PowerNukkitX - @Inject - public static boolean onUpdate(EntityItem self, int currentTick) { - try{ - if (self.closed) { - return false; - } - - int tickDiff = currentTick - self.lastUpdate; - - if (tickDiff <= 0 && !self.justCreated) { - return true; - } - - self.lastUpdate = currentTick; - - if (self.age % 60 == 0 && self.onGround && self.getItem() != null && self.isAlive()) { - if (self.getItem().getCount() < self.getItem().getMaxStackSize()) { - for (Entity entity : self.getLevel().getNearbyEntities(self.getBoundingBox().grow(1, 1, 1), self, false)) { - if (entity instanceof EntityItem) { - if (!entity.isAlive()) { - continue; - } - Item closeItem = ((EntityItem) entity).getItem(); - if (!closeItem.equals(self.getItem(), true, true)) { - continue; - } - if (!entity.isOnGround()) { - continue; - } - int newAmount = self.getItem().getCount() + closeItem.getCount(); - if (newAmount > self.getItem().getMaxStackSize()) { - continue; - } - entity.close(); - self.getItem().setCount(newAmount); - EntityEventPacket packet = new EntityEventPacket(); - packet.eid = self.getId(); - packet.data = newAmount; - packet.event = EntityEventPacket.MERGE_ITEMS; - Server.broadcastPacket(self.getViewers().values(), packet); - } - } - } - } - - boolean hasUpdate = self.entityBaseTick(tickDiff); - - boolean lavaResistant = self.fireProof || self.getItem() != null && self.fireProof; - - if (!lavaResistant && (self.isInsideOfFire() || isInsideOfLava(self))) { - self.kill(); - } - - if (self.isAlive()) { - final Field field = EntityItem.class.getDeclaredField("pickupDelay"); - field.setAccessible(true); - - int pickupDelay = field.getInt(self); - if (pickupDelay > 0 && pickupDelay < 32767) { - pickupDelay -= tickDiff; - if (pickupDelay < 0) { - pickupDelay = 0; - } - field.set(self, pickupDelay); - }/* else { // Done in Player#checkNearEntities - for (Entity entity : this.level.getNearbyEntities(this.boundingBox.grow(1, 0.5, 1), this)) { - if (entity instanceof Player) { - if (((Player) entity).pickupEntity(this, true)) { - return true; - } - } - } - }*/ - - int bid = self.level.getBlockIdAt((int) self.x, (int) self.boundingBox.getMaxY(), (int) self.z, 0); - if (bid == BlockID.WATER || bid == BlockID.STILL_WATER - || (bid = self.level.getBlockIdAt((int) self.x, (int) self.boundingBox.getMaxY(), (int) self.z, 1)) == BlockID.WATER - || bid == BlockID.STILL_WATER - ) { - //item is fully in water or in still water - self.motionY -= self.getGravity() * -0.015; - } else if (lavaResistant && ( - self.level.getBlockIdAt((int) self.x, (int) self.boundingBox.getMaxY(), (int) self.z, 0) == BlockID.WATER - || self.level.getBlockIdAt((int) self.x, (int) self.boundingBox.getMaxY(), (int) self.z, 0) == BlockID.STILL_LAVA - || self.level.getBlockIdAt((int) self.x, (int) self.boundingBox.getMaxY(), (int) self.z, 1) == BlockID.WATER - || self.level.getBlockIdAt((int) self.x, (int) self.boundingBox.getMaxY(), (int) self.z, 1) == BlockID.STILL_LAVA - )) { - //item is fully in lava or in still lava - self.motionY -= self.getGravity() * -0.015; - } else if (self.isInsideOfWater() || lavaResistant && isInsideOfLava(self)) { - self.motionY = self.getGravity() - 0.06; //item is going up in water, don't let it go back down too fast - } else { - self.motionY -= self.getGravity(); //item is not in water - } - - final Method method = Entity.class.getDeclaredMethod("checkObstruction", double.class, double.class, double.class); - method.setAccessible(true); - if((Boolean) method.invoke(self, self.x, self.y, self.z)) { - hasUpdate = true; - } - - self.move(self.motionX, self.motionY, self.motionZ); - - double friction = 1 - self.getDrag(); - - if (self.onGround && (Math.abs(self.motionX) > 0.00001 || Math.abs(self.motionZ) > 0.00001)) { - friction *= self.getLevel().getBlock(self.temporalVector.setComponents((int) Math.floor(self.x), (int) Math.floor(self.y - 1), (int) Math.floor(self.z))).getFrictionFactor(); - } - - self.motionX *= friction; - self.motionY *= 1 - self.getDrag(); - self.motionZ *= friction; - - if (self.onGround) { - self.motionY *= -0.5; - } - - self.updateMovement(); - - if (self.age > 6000) { - ItemDespawnEvent ev = new ItemDespawnEvent(self); - self.getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - self.age = 0; - } else { - self.kill(); - hasUpdate = true; - } - } - } - - return hasUpdate || !self.onGround || Math.abs(self.motionX) > 0.00001 || Math.abs(self.motionY) > 0.00001 || Math.abs(self.motionZ) > 0.00001; - }catch (Exception e){ - e.printStackTrace(); - self.closed = true; - } - - return false; - } -} diff --git a/src/main/java/com/zhekasmirnov/apparatus/mcpe/NativeBlockSource.java b/src/main/java/com/zhekasmirnov/apparatus/mcpe/NativeBlockSource.java index 200e044f..72914491 100644 --- a/src/main/java/com/zhekasmirnov/apparatus/mcpe/NativeBlockSource.java +++ b/src/main/java/com/zhekasmirnov/apparatus/mcpe/NativeBlockSource.java @@ -99,7 +99,7 @@ public class NativeBlockSource { public NativeBlockSource(Level level, boolean isFinalizable) { if (level == null) { - throw new IllegalArgumentException("cannot pass null pointer to NativeBlockSource constructor"); + throw new RuntimeException("cannot pass null pointer to NativeBlockSource constructor"); } this.level = level; } diff --git a/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/world/ScriptableSaverScope.java b/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/world/ScriptableSaverScope.java index a9bc85df..6d26dc41 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/world/ScriptableSaverScope.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/world/ScriptableSaverScope.java @@ -15,7 +15,7 @@ public abstract class ScriptableSaverScope implements WorldDataScopeRegistry.Sav } else if (scriptable instanceof Scriptable) { read((Scriptable) scriptable); } else { - throw new IOException("scriptable saver scope readJson() de-serialized into non scriptable"); + throw new IOException("scriptable saver scope readJson() de-serialized into non scriptable "+scriptable.getClass().toString()); } }