diff --git a/iclibs/Nukkit-MOT-SNAPSHOT.jar b/iclibs/Nukkit-MOT-SNAPSHOT.jar index c2732da4..826aa93b 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/event/EventListener.java b/src/main/java/com/reider745/event/EventListener.java index 4a292e92..355579b2 100644 --- a/src/main/java/com/reider745/event/EventListener.java +++ b/src/main/java/com/reider745/event/EventListener.java @@ -35,8 +35,11 @@ import cn.nukkit.level.Position; import cn.nukkit.level.format.FullChunk; import cn.nukkit.math.Vector3; import cn.nukkit.network.protocol.UpdateBlockPacket; +import cn.nukkit.utils.BinaryStream; import com.reider745.InnerCoreServer; import com.reider745.Main; +import com.reider745.item.ItemMethod; +import com.reider745.network.InnerCorePacket; import com.reider745.world.BiomesMethods; import com.reider745.world.FakeDimensions; import com.zhekasmirnov.apparatus.mcpe.NativeWorkbench; @@ -311,6 +314,12 @@ public class EventListener implements Listener { ? damageByEntityEvent.getDamager() : null; + if(damageEvent.getCause() == DamageCause.ENTITY_EXPLOSION && + entity instanceof EntityItem entityItem && + !ItemMethod.canExplodable(entityItem.getItem().getId())){ + event.setCancelled(); + } + NativeCallback.onEntityDied(EntityMethod.getIdForEntity(entity), attacker != null ? EntityMethod.getIdForEntity(attacker) : -1, convertDamageCauseToEnum(damageEvent != null ? damageEvent.getCause() : DamageCause.CUSTOM)); } @@ -542,6 +551,12 @@ public class EventListener implements Listener { e.printStackTrace(); } } + + @EventHandler + public void onItemDespawn(ItemDespawnEvent event){ + if(!ItemMethod.canShouldDespawn(event.getEntity().getItem().getId())) + event.setCancelled(); + } // TODO: onPathNavigationDone diff --git a/src/main/java/com/reider745/hooks/NetworkHooks.java b/src/main/java/com/reider745/hooks/NetworkHooks.java index 60bdcf4c..98ac4569 100644 --- a/src/main/java/com/reider745/hooks/NetworkHooks.java +++ b/src/main/java/com/reider745/hooks/NetworkHooks.java @@ -4,16 +4,11 @@ import cn.nukkit.Player; import cn.nukkit.Server; import cn.nukkit.network.CompressionProvider; import cn.nukkit.network.Network; -import cn.nukkit.network.RakNetInterface; import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.network.session.RakNetPlayerSession; import cn.nukkit.utils.BinaryStream; import cn.nukkit.utils.MainLogger; -import cn.nukkit.utils.Utils; import cn.nukkit.utils.VarInt; import com.reider745.InnerCoreServer; -import com.reider745.Main; -import com.reider745.api.ReflectHelper; import com.reider745.api.hooks.HookClass; import com.reider745.api.hooks.TypeHook; import com.reider745.api.hooks.annotation.Inject; @@ -21,19 +16,18 @@ import com.reider745.api.hooks.annotation.Hooks; import com.reider745.network.BasePacket; import com.reider745.network.InnerCorePacket; import com.zhekasmirnov.apparatus.mcpe.NativeNetworking; -import com.zhekasmirnov.horizon.runtime.logger.Logger; import java.io.ByteArrayInputStream; import java.net.ProtocolException; -import java.nio.charset.StandardCharsets; import java.util.Collection; import java.util.LinkedList; @Hooks(className = "cn.nukkit.network.Network") public class NetworkHooks implements HookClass { + private static final LinkedList canSendInfo = new LinkedList<>(); public static void close(Player player){ - + canSendInfo.remove(NativeNetworking.getId(player)); } @Inject(signature = "([BLjava/util/Collection;Lcn/nukkit/network/CompressionProvider;ILcn/nukkit/Player;)V", type = TypeHook.BEFORE_REPLACE) @@ -100,12 +94,20 @@ public class NetworkHooks implements HookClass { Хранить все пакеты с null player Хукнуть setPlayer из cn.nukkit.network.session.RakNetPlayerSession и в нем обрабатывать пакеты */ - log.warning("processBatch player null, ignore packet "+packetId); + log.error("processBatch player null, ignore packet "+packetId); break; } ((BasePacket) pk).player = player; } + if(player != null){ + final String id = NativeNetworking.getId(player); + if(!canSendInfo.contains(id)){ + canSendInfo.add(id); + player.dataPacket(InnerCorePacket.sendInfo); + } + } + try { if (raknetProtocol > 8) { pk.decode(); @@ -128,13 +130,6 @@ public class NetworkHooks implements HookClass { } } - @Inject(className = "cn.nukkit.network.session.RakNetPlayerSession") - public static void setPlayer(RakNetPlayerSession self, Player player){ - if(InnerCoreServer.isDebugInnerCoreNetwork()) - System.out.println("Send inner core info"); - player.dataPacket(InnerCorePacket.sendInfo); - } - @Inject(type = TypeHook.AFTER_NOT_REPLACE) public static void registerPackets(Network network) { network.registerPacket(InnerCoreServer.PROTOCOL, InnerCorePacket.NETWORK_ID, InnerCorePacket.class); diff --git a/src/main/java/com/reider745/hooks/PlayerHooks.java b/src/main/java/com/reider745/hooks/PlayerHooks.java index 7197c477..cea101eb 100644 --- a/src/main/java/com/reider745/hooks/PlayerHooks.java +++ b/src/main/java/com/reider745/hooks/PlayerHooks.java @@ -1,9 +1,11 @@ package com.reider745.hooks; import cn.nukkit.Player; +import cn.nukkit.Server; import cn.nukkit.form.element.ElementButton; import cn.nukkit.form.window.FormWindowSimple; import cn.nukkit.lang.TextContainer; +import cn.nukkit.network.SourceInterface; import cn.nukkit.network.protocol.DataPacket; import cn.nukkit.utils.TextFormat; @@ -65,7 +67,7 @@ public class PlayerHooks implements HookClass { } public static ConnectedClient getForPlayer(Player player) { - Listclients = Network.getSingleton().getServer().getConnectedClients(); + List clients = Network.getSingleton().getServer().getConnectedClients(); for (ConnectedClient client : clients) if (equalsAddress(player.getSocketAddress().toString(), client.getChannelInterface().getChannel().getClient())) diff --git a/src/main/java/com/reider745/item/ItemMethod.java b/src/main/java/com/reider745/item/ItemMethod.java index 6f3c0c31..4d4958c0 100644 --- a/src/main/java/com/reider745/item/ItemMethod.java +++ b/src/main/java/com/reider745/item/ItemMethod.java @@ -11,6 +11,7 @@ import com.zhekasmirnov.innercore.api.mod.adaptedscript.AdaptedScriptAPI.IDRegis import com.zhekasmirnov.innercore.api.runtime.other.NameTranslation; import java.util.ArrayList; +import java.util.HashMap; public class ItemMethod { public static boolean isPostLoad = false; @@ -30,6 +31,7 @@ public class ItemMethod { public static final String REPAIRS = "repairs"; public static final String CREATIVE_CATEGORY = "creative_category"; public static final String FIRE_RESISTANT = "fire_resistant"; + public static final String EXPLODABLE = "explodable"; public static class Armors { public static final String SLOT = "slot"; @@ -159,6 +161,42 @@ public class ItemMethod { manager.put(PropertiesNames.ARMOR_DAMAGEABLE, value); } + public static HashMap despawn = new HashMap<>(); + + public static void setShouldDespawn(int id, boolean value) { + despawn.put(id, value); + } + + public static boolean canShouldDespawn(int id){ + return despawn.getOrDefault(id, true); + } + + public static void setFireResistant(CustomManager manager, boolean resist) { + if (resist || (manager.get(PropertiesNames.ID, 0) >= Item.NETHERITE_INGOT + && manager.get(PropertiesNames.ID, 0) <= Item.NETHERITE_SCRAP)) { + manager.put(PropertiesNames.FIRE_RESISTANT, resist); + } else { + manager.remove(PropertiesNames.FIRE_RESISTANT); + } + } + + public static HashMap explodable = new HashMap<>(); + + public static void setExplodable(int id, boolean value) { + explodable.put(id, value); + } + + public static boolean canExplodable(int id){ + return explodable.getOrDefault(id, true); + } + + public static int getArmorValue(int id) { + Item item = Item.get(id); + if(item != null) + return item.getArmorPoints(); + return 0; + } + public static void addRepairItemId(CustomManager manager, int id) { ArrayList repairs = manager.get(PropertiesNames.REPAIRS); if (repairs == null) { diff --git a/src/main/java/com/zhekasmirnov/apparatus/multiplayer/util/list/ConnectedClientList.java b/src/main/java/com/zhekasmirnov/apparatus/multiplayer/util/list/ConnectedClientList.java index 01381de8..ee125cb7 100644 --- a/src/main/java/com/zhekasmirnov/apparatus/multiplayer/util/list/ConnectedClientList.java +++ b/src/main/java/com/zhekasmirnov/apparatus/multiplayer/util/list/ConnectedClientList.java @@ -196,7 +196,7 @@ public class ConnectedClientList implements Iterable { if (addPolicy != null && addPolicyNextRefresh <= time) { for (ConnectedClient client : Network.getSingleton().getServer().getConnectedClients()) { - if (!clients.contains(client) && addPolicy.check(client)) { + if (client != null && !clients.contains(client) && addPolicy.check(client)) { clients.add(client); for (Listener listener : listeners) { listener.onAdd(client); diff --git a/src/main/java/com/zhekasmirnov/innercore/api/NativeAPI.java b/src/main/java/com/zhekasmirnov/innercore/api/NativeAPI.java index 946c05e1..1198745d 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/NativeAPI.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/NativeAPI.java @@ -180,6 +180,11 @@ public class NativeAPI { InnerCoreServer.useNotCurrentSupport("NativeAPI.addParticle(i, d, d2, d3, d4, d5, d6, i2)"); } + @Deprecated(since = "Zote") + public static void addBreakingItemParticle(int id, int data, double x, double y, double z) { + InnerCoreServer.useNotCurrentSupport("NativeAPI.addBreakingItemParticle(id, data, x, y, z)"); + } + @Deprecated(since = "Zote") public static void addPlayerExperience(int experience) { InnerCoreServer.useClientMethod("NativeAPI.addPlayerExperience(experience)"); diff --git a/src/main/java/com/zhekasmirnov/innercore/api/NativeItem.java b/src/main/java/com/zhekasmirnov/innercore/api/NativeItem.java index 54dfec5c..1189c82d 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/NativeItem.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/NativeItem.java @@ -135,11 +135,19 @@ public class NativeItem { setArmorDamageable(properties, value); } - @ZoteOnly - public void setFireResistant(boolean resist) { - setFireResistant(properties, resist); + public void setShouldDespawn(boolean value) { + ItemMethod.setShouldDespawn(id, value); } + public void setFireResistant(boolean value) { + ItemMethod.setFireResistant(properties, value); + } + + public void setExplodable(boolean value) { + ItemMethod.setExplodable(id, value); + } + + @JSStaticFunction public static NativeItem getItemById(int id) { if (id < 0 || id >= MAX_ITEM_ID) { @@ -271,16 +279,6 @@ public class NativeItem { ItemMethod.setArmorDamageable(manager, value); } - @ZoteOnly - public static void setFireResistant(CustomManager manager, boolean resist) { - if (resist || (manager.get(PropertiesNames.ID, 0) >= Item.NETHERITE_INGOT - && manager.get(PropertiesNames.ID, 0) <= Item.NETHERITE_SCRAP)) { - manager.put(PropertiesNames.FIRE_RESISTANT, resist); - } else { - manager.remove(PropertiesNames.FIRE_RESISTANT); - } - } - public static void addRepairItemId(CustomManager manager, int id) { ItemMethod.addRepairItemId(manager, id); } @@ -300,6 +298,11 @@ public class NativeItem { public static String getNameForId(int id, int data, NativeItemInstanceExtra extra) { return ItemMethod.getNameForId(id, data, extra); } + @JSStaticFunction + public static int getArmorValue(int id){ + return ItemMethod.getArmorValue(id); + } + public static void setCreativeCategoryForId(int id, int category) { ItemMethod.setCreativeCategory(CustomManager.getFor(id), category); diff --git a/src/main/resources/innercore/coreengine/core-engine.dev.js b/src/main/resources/innercore/coreengine/core-engine.dev.js index 1b4af8e2..171d8a8a 100755 --- a/src/main/resources/innercore/coreengine/core-engine.dev.js +++ b/src/main/resources/innercore/coreengine/core-engine.dev.js @@ -2349,6 +2349,9 @@ var ItemRegistry = { getName: function(id, data, extra) { return Item.getName(id, data, extra); }, + getArmorValue: function(id) { + return Item.getArmorValue(id); + }, isValid: function(id, data) { return Item.isValid(id); }, @@ -2389,6 +2392,16 @@ var ItemRegistry = { setArmorDamageable: function(id, val) { this.getItemById(id).setArmorDamageable(val); }, + setShouldDespawn: function(id, val) { + this.getItemById(id).setShouldDespawn(val); + }, + setFireResistant: function(id, val) { + this.getItemById(id).setFireResistant(val); + }, + setExplodable: function(id, val) { + this.getItemById(id).setExplodable(val); + }, + addRepairItemIds: function(id, items) { var item = this.getItemById(id); for (var i in items) { @@ -6516,9 +6529,11 @@ Callback.addCallback("EntityRemoved", function(entity) { }); var Particle_addParticle = requireMethodFromNativeAPI("api.NativeAPI", "addParticle"); var Particle_addFarParticle = requireMethodFromNativeAPI("api.NativeAPI", "addFarParticle"); +var Particle_addBreakingItemParticle = requireMethodFromNativeAPI("api.NativeAPI", "addBreakingItemParticle"); var ParticleAnimator = { addParticle: Particle_addParticle, addFarParticle: Particle_addFarParticle, + addBreakingItemParticle: Particle_addBreakingItemParticle, line: function(particle, coords1, coords2, gap, vel, data) { gap = gap || 1; var delta = {