Skip to content

Commit

Permalink
Feat: Добавлена поддержка методов из b119
Browse files Browse the repository at this point in the history
- Исправления подключения
- Обновлен Nukkit-Mot
  • Loading branch information
Reider745 committed May 29, 2024
1 parent fe7ac16 commit b24f13f
Show file tree
Hide file tree
Showing 9 changed files with 104 additions and 31 deletions.
Binary file modified iclibs/Nukkit-MOT-SNAPSHOT.jar
Binary file not shown.
15 changes: 15 additions & 0 deletions src/main/java/com/reider745/event/EventListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,11 @@
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;
Expand Down Expand Up @@ -311,6 +314,12 @@ public void onEntityDeath(EntityDeathEvent event) {
? 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));
}
Expand Down Expand Up @@ -542,6 +551,12 @@ public void stopServer(ServerStopEvent event){
e.printStackTrace();
}
}

@EventHandler
public void onItemDespawn(ItemDespawnEvent event){
if(!ItemMethod.canShouldDespawn(event.getEntity().getItem().getId()))
event.setCancelled();
}

// TODO: onPathNavigationDone

Expand Down
27 changes: 11 additions & 16 deletions src/main/java/com/reider745/hooks/NetworkHooks.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,30 @@
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;
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<String> 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)
Expand Down Expand Up @@ -100,12 +94,20 @@ public static void processBatch(Network network, byte[] payload, Collection<Data
Хранить все пакеты с 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();
Expand All @@ -128,13 +130,6 @@ public static void processBatch(Network network, byte[] payload, Collection<Data
}
}

@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);
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/com/reider745/hooks/PlayerHooks.java
Original file line number Diff line number Diff line change
@@ -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;

Expand Down Expand Up @@ -65,7 +67,7 @@ private static boolean equalsAddress(String address1, String address2) {
}

public static ConnectedClient getForPlayer(Player player) {
List<ConnectedClient>clients = Network.getSingleton().getServer().getConnectedClients();
List<ConnectedClient> clients = Network.getSingleton().getServer().getConnectedClients();
for (ConnectedClient client : clients)
if (equalsAddress(player.getSocketAddress().toString(),
client.getChannelInterface().getChannel().getClient()))
Expand Down
38 changes: 38 additions & 0 deletions src/main/java/com/reider745/item/ItemMethod.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.zhekasmirnov.innercore.api.runtime.other.NameTranslation;

import java.util.ArrayList;
import java.util.HashMap;

public class ItemMethod {
public static boolean isPostLoad = false;
Expand All @@ -30,6 +31,7 @@ public static class PropertiesNames {
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";
Expand Down Expand Up @@ -159,6 +161,42 @@ public static void setArmorDamageable(CustomManager manager, boolean value) {
manager.put(PropertiesNames.ARMOR_DAMAGEABLE, value);
}

public static HashMap<Integer, Boolean> 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<Integer, Boolean> 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<Integer> repairs = manager.get(PropertiesNames.REPAIRS);
if (repairs == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ public void refresh() {

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);
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/com/zhekasmirnov/innercore/api/NativeAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,11 @@ public static void addParticle(int i, double d, double d2, double d3, double d4,
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)");
Expand Down
29 changes: 16 additions & 13 deletions src/main/java/com/zhekasmirnov/innercore/api/NativeItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -135,11 +135,19 @@ public void setArmorDamageable(boolean value) {
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) {
Expand Down Expand Up @@ -271,16 +279,6 @@ public static void setArmorDamageable(CustomManager manager, boolean value) {
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);
}
Expand All @@ -300,6 +298,11 @@ public static String getNameForId(int id, int data, Item extra) {
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);
Expand Down
15 changes: 15 additions & 0 deletions src/main/resources/innercore/coreengine/core-engine.dev.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
},
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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 = {
Expand Down

0 comments on commit b24f13f

Please sign in to comment.