From 7bb172385dd48fa8366f6db27bb23f3ef9bf5ba5 Mon Sep 17 00:00:00 2001 From: ZXMushroom63 Date: Thu, 12 Sep 2024 17:29:10 +0800 Subject: [PATCH] leftclick LCI --- examplemods/CustomItemsDemo.js | 9 ++++++ examplemods/blocklook.js | 16 ++++++--- examplemods/lib.customitems.js | 59 +++++++++++++++++++++++++++++++--- 3 files changed, 75 insertions(+), 9 deletions(-) diff --git a/examplemods/CustomItemsDemo.js b/examplemods/CustomItemsDemo.js index cc624dc..f81bffc 100644 --- a/examplemods/CustomItemsDemo.js +++ b/examplemods/CustomItemsDemo.js @@ -23,6 +23,15 @@ ModAPI.addEventListener("lib:libcustomitems:loaded", () => { user.inventory.mainInventory[user.inventory.currentItem] = null; } user.setHealth(2); + return true; //PreventDefault + `, + onLeftClickGround: `/*/user, world, itemstack, blockpos/*/ + itemstack.stackSize -= 1; + if (itemstack.stackSize < 1) { + user.inventory.mainInventory[user.inventory.currentItem] = null; + } + user.setHealth(20); + return true; //PreventDefault ` }); }); \ No newline at end of file diff --git a/examplemods/blocklook.js b/examplemods/blocklook.js index 11d0016..a622d2a 100644 --- a/examplemods/blocklook.js +++ b/examplemods/blocklook.js @@ -43,11 +43,17 @@ ModAPI.dedicatedServer.appendCode(function () { event.preventDefault = true; } }); + var t = 0; ModAPI.addEventListener("tick", () => { + t++; + if (t > 2) { + t = 0; + } else { + return; + } if (!active) { return; } - active = false; //Don't run every tick, for debugging purposes. var playerEntities = getPlayerEntitiesAndTheirWorld(); playerEntities.forEach(pair => { var start = pair.player.getPositionEyes(1).getRef(); @@ -58,12 +64,14 @@ ModAPI.dedicatedServer.appendCode(function () { lookVector.addVector(start.$xCoord, start.$yCoord, start.$zCoord); var hitResult = rayTraceMethod(pair.world.getRef(), start, lookVector.getRef(), 0); if (hitResult) { - var blockPos = blockPosConstructor(Math.round(hitResult.$hitVec.$xCoord), Math.round(hitResult.$hitVec.$yCoord), Math.round(hitResult.$hitVec.$zCoord)); + var blockPos = blockPosConstructor(parseInt(hitResult.$hitVec.$xCoord), parseInt(hitResult.$hitVec.$yCoord), parseInt(hitResult.$hitVec.$zCoord)); var blockType = blockTypesList[Math.floor(Math.random() * blockTypesList.length)]; blockType = ModAPI.blocks[blockType]; - console.log(blockType); + if (!blockType.fullBlock) { + return; + } + console.log(ModAPI.util.unstr(blockType.unlocalizedName.getRef())); var block = blockType.getDefaultState().getRef(); - console.log(block, blockPos); pair.world.setBlockState(blockPos, block, 3); } }); diff --git a/examplemods/lib.customitems.js b/examplemods/lib.customitems.js index a805424..ddc409c 100644 --- a/examplemods/lib.customitems.js +++ b/examplemods/lib.customitems.js @@ -7,7 +7,8 @@ ModAPI.events.newEvent("lib:libcustomitems:loaded"); function libServerside() { globalThis.LCI_REGISTRY ||= []; - globalThis.LCI_ACTIONREGISTRY ||= {}; + globalThis.LCI_RMBEVENTS ||= {}; + globalThis.LCI_LMBEVENTS ||= {}; var useName = ModAPI.util.getMethodFromPackage("net.minecraft.network.NetHandlerPlayServer", "processPlayerBlockPlacement"); var oldUse = ModAPI.hooks.methods[useName]; ModAPI.hooks.methods[useName] = function ($this, packet) { @@ -18,16 +19,22 @@ if (displayTag.$hasKey(ModAPI.util.str("Lore"), 9)) { var loreTag = displayTag.$getTag(ModAPI.util.str("Lore")); if (loreTag.$tagCount() > 0 && globalThis.LCI_REGISTRY.includes(ModAPI.util.ustr(loreTag.$getStringTagAt(0)))) { - var cid = loreTag.$getStringTagAt(0); + var cid = ModAPI.util.ustr(loreTag.$getStringTagAt(0)); + if (!globalThis.LCI_RMBEVENTS[cid]) { + return oldUse.apply(this, [$this, packet]); + } var positionTag = Object.keys(packet).filter(x => { return x.startsWith("$position") })[0]; if (packet[positionTag].$x === -1 && packet[positionTag].$y === -1 && packet[positionTag].$z === -1) { return 0; } - globalThis.LCI_ACTIONREGISTRY[cid].call(globalThis, + var r = globalThis.LCI_RMBEVENTS[cid].call(globalThis, new Proxy($this.$playerEntity, ModAPI.util.TeaVM_to_Recursive_BaseData_ProxyConf), new Proxy($this.$serverController.$worldServerForDimension($this.$playerEntity.$dimension), ModAPI.util.TeaVM_to_Recursive_BaseData_ProxyConf), new Proxy(item, ModAPI.util.TeaVM_to_Recursive_BaseData_ProxyConf), new Proxy(packet[positionTag], ModAPI.util.TeaVM_to_Recursive_BaseData_ProxyConf)); + if (!r) { + return oldUse.apply(this, [$this, packet]); + } return 0; } } @@ -35,12 +42,54 @@ } return oldUse.apply(this, [$this, packet]); } + var digName = ModAPI.util.getMethodFromPackage("net.minecraft.network.NetHandlerPlayServer", "processPlayerDigging"); + var oldDig = ModAPI.hooks.methods[digName]; + ModAPI.hooks.methods[digName] = function ($this, packet) { + console.log(packet); + if ($this?.$playerEntity?.$inventory && $this.$playerEntity.$inventory.$getCurrentItem()) { + var item = $this.$playerEntity.$inventory.$getCurrentItem(); + if (item.$stackTagCompound && item.$stackTagCompound.$hasKey(ModAPI.util.str("display"), 10)) { + var displayTag = item.$stackTagCompound.$getCompoundTag(ModAPI.util.str("display")); + if (displayTag.$hasKey(ModAPI.util.str("Lore"), 9)) { + var loreTag = displayTag.$getTag(ModAPI.util.str("Lore")); + if (loreTag.$tagCount() > 0 && globalThis.LCI_REGISTRY.includes(ModAPI.util.ustr(loreTag.$getStringTagAt(0)))) { + var cid = ModAPI.util.ustr(loreTag.$getStringTagAt(0)); + if (!globalThis.LCI_LMBEVENTS[cid]) { + return oldDig.apply(this, [$this, packet]); + } + var statusTag = Object.keys(packet.$status).find(x => { return x.startsWith("$name") }); + var positionTag = Object.keys(packet).filter(x => { return x.startsWith("$position") })[0]; + if (ModAPI.util.unstr(packet.$status[statusTag]) !== "START_DESTROY_BLOCK") { + return 0; + } + + var r = globalThis.LCI_LMBEVENTS[cid].call(globalThis, + new Proxy($this.$playerEntity, ModAPI.util.TeaVM_to_Recursive_BaseData_ProxyConf), + new Proxy($this.$serverController.$worldServerForDimension($this.$playerEntity.$dimension), ModAPI.util.TeaVM_to_Recursive_BaseData_ProxyConf), + new Proxy(item, ModAPI.util.TeaVM_to_Recursive_BaseData_ProxyConf), + new Proxy(packet[positionTag], ModAPI.util.TeaVM_to_Recursive_BaseData_ProxyConf)); + if (!r) { + return oldDig.apply(this, [$this, packet]); + } + return 0; + } + } + } + } + return oldDig.apply(this, [$this, packet]); + } } function LCI_registerItem(data) { globalThis.LCI_REGISTRY ||= []; - globalThis.LCI_ACTIONREGISTRY ||= {}; + globalThis.LCI_RMBEVENTS ||= {}; + globalThis.LCI_LMBEVENTS ||= {}; globalThis.LCI_REGISTRY.push(data.tag); - globalThis.LCI_ACTIONREGISTRY[data.tag] = new Function("user", "world", "itemstack", "blockpos", data.onRightClickGround); + if (data.onRightClickGround) { + globalThis.LCI_RMBEVENTS[data.tag] = new Function("user", "world", "itemstack", "blockpos", data.onRightClickGround); + } + if (data.onLeftClickGround) { + globalThis.LCI_LMBEVENTS[data.tag] = new Function("user", "world", "itemstack", "blockpos", data.onLeftClickGround); + } var ObjectClass = ModAPI.reflect.getClassById("java.lang.Object").class; function ToChar(char) { return ModAPI.reflect.getClassById("java.lang.Character").staticMethods.valueOf.method(char[0].charCodeAt(0));