feat: Реализация калбека ItemDispensed
- Превент действия отменяет дроп, позволяя задать пользовательское поведение.
This commit is contained in:
@@ -6,6 +6,7 @@ import cn.nukkit.network.Network;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
import com.reider745.api.hooks.JarEditor;
|
import com.reider745.api.hooks.JarEditor;
|
||||||
|
import com.reider745.event.DispenseBehaviorOverrides;
|
||||||
import com.reider745.hooks.*;
|
import com.reider745.hooks.*;
|
||||||
import com.reider745.hooks.bugfix.DimensionsFix;
|
import com.reider745.hooks.bugfix.DimensionsFix;
|
||||||
import com.reider745.hooks.bugfix.EntityItemHooks;
|
import com.reider745.hooks.bugfix.EntityItemHooks;
|
||||||
@@ -79,6 +80,7 @@ public class Main {
|
|||||||
loader.registerHooksInitializationForClass(LevelHooks.class);
|
loader.registerHooksInitializationForClass(LevelHooks.class);
|
||||||
loader.registerHooksInitializationForClass(ItemUtils.class);
|
loader.registerHooksInitializationForClass(ItemUtils.class);
|
||||||
loader.registerHooksInitializationForClass(EntityOverrides.class);
|
loader.registerHooksInitializationForClass(EntityOverrides.class);
|
||||||
|
loader.registerHooksInitializationForClass(DispenseBehaviorOverrides.class);
|
||||||
loader.registerHooksInitializationForClass(AndroidHooks.class);
|
loader.registerHooksInitializationForClass(AndroidHooks.class);
|
||||||
|
|
||||||
if (Arrays.stream(args).anyMatch("--snowfall-everywhere"::equals)) {
|
if (Arrays.stream(args).anyMatch("--snowfall-everywhere"::equals)) {
|
||||||
|
|||||||
@@ -0,0 +1,68 @@
|
|||||||
|
package com.reider745.event;
|
||||||
|
|
||||||
|
import com.reider745.api.hooks.HookClass;
|
||||||
|
import com.reider745.api.hooks.HookController;
|
||||||
|
import com.reider745.api.hooks.TypeHook;
|
||||||
|
import com.reider745.api.hooks.annotation.Hooks;
|
||||||
|
import com.reider745.api.hooks.annotation.Inject;
|
||||||
|
import com.reider745.hooks.ItemUtils;
|
||||||
|
import com.zhekasmirnov.innercore.api.NativeCallback;
|
||||||
|
|
||||||
|
import cn.nukkit.block.BlockDispenser;
|
||||||
|
import cn.nukkit.dispenser.DefaultDispenseBehavior;
|
||||||
|
import cn.nukkit.event.Cancellable;
|
||||||
|
import cn.nukkit.event.block.BlockEvent;
|
||||||
|
import cn.nukkit.item.Item;
|
||||||
|
import cn.nukkit.math.BlockFace;
|
||||||
|
import cn.nukkit.math.BlockFace.Axis;
|
||||||
|
import javassist.CannotCompileException;
|
||||||
|
import javassist.CtClass;
|
||||||
|
import javassist.CtMethod;
|
||||||
|
import javassist.NotFoundException;
|
||||||
|
import cn.nukkit.math.Vector3;
|
||||||
|
|
||||||
|
@Hooks(className = "cn.nukkit.block.BlockDispenser")
|
||||||
|
public class DispenseBehaviorOverrides implements HookClass {
|
||||||
|
public static int dispenseSlot = -1;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(CtClass ctClass) {
|
||||||
|
try {
|
||||||
|
CtMethod dispenseMethod = ctClass.getDeclaredMethod("dispense");
|
||||||
|
dispenseMethod.insertAt(dispenseMethod.getMethodInfo().getLineNumber(310),
|
||||||
|
"com.reider745.event.DispenseBehaviorOverrides.dispenseSlot = slot;");
|
||||||
|
} catch (NotFoundException | CannotCompileException e) {
|
||||||
|
System.out.println("Nukkit-MOT has been updated and overrides for `BlockDispenser.dispense` method are no longer available.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class BlockDispenseEvent extends BlockEvent implements Cancellable {
|
||||||
|
public BlockDispenseEvent(BlockDispenser block) {
|
||||||
|
super(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(className = "cn.nukkit.dispenser.DefaultDispenseBehavior", type = TypeHook.BEFORE, signature = "(Lcn/nukkit/block/BlockDispenser;Lcn/nukkit/math/BlockFace;Lcn/nukkit/item/Item;)Lcn/nukkit/item/Item;")
|
||||||
|
public static void dispense(HookController controller, DefaultDispenseBehavior behavior, BlockDispenser block,
|
||||||
|
BlockFace face, Item item) {
|
||||||
|
Vector3 dispensePos = block.getDispensePosition();
|
||||||
|
|
||||||
|
if (face.getAxis() == Axis.Y) {
|
||||||
|
dispensePos.y -= 0.125;
|
||||||
|
} else {
|
||||||
|
dispensePos.y -= 0.15625;
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockDispenseEvent event = new BlockDispenseEvent(block);
|
||||||
|
EventListener.consumeEvent(event,
|
||||||
|
() -> NativeCallback.onItemDispensed((float) dispensePos.x, (float) dispensePos.y,
|
||||||
|
(float) dispensePos.z, face.getIndex(), item.getId(), item.getCount(), item.getDamage(),
|
||||||
|
ItemUtils.getItemInstanceExtra(item), block.getLevel(), dispenseSlot));
|
||||||
|
dispenseSlot = -1;
|
||||||
|
|
||||||
|
if (event.isCancelled()) {
|
||||||
|
controller.setReplace(true);
|
||||||
|
controller.setResult(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -478,6 +478,4 @@ public class EventListener implements Listener {
|
|||||||
// TODO: onItemUseReleased (not only custom items)
|
// TODO: onItemUseReleased (not only custom items)
|
||||||
|
|
||||||
// TODO: onItemUseComplete (not only custom items)
|
// TODO: onItemUseComplete (not only custom items)
|
||||||
|
|
||||||
// TODO: onItemDispensed
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user