diff --git a/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSAdvanced/ForgeEvent.md b/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSAdvanced/ForgeEvent.md new file mode 100644 index 00000000..979c6387 --- /dev/null +++ b/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSAdvanced/ForgeEvent.md @@ -0,0 +1,56 @@ +# ForgeEvent的使用 +> 孤梦注:可千万不要玩forge事件啊,玩了你就要长脑子了!!! + +`ForgeEvent`是写在**startup**里的,这个一定得注意! + +ForgeEvent不仅仅只能调用到forge提供的事件,如果其他模组在源代码(指的Java代码)里直接继承了`Event`类,也是可以被ForgeEvent捕捉下来的,类似的示例:[机械动力修改流体管道流体和流体产生块](../KubejsProjects/Meng/SmallProject/CreatePipeCollision.md) + +ForgeEvent是可以搭配着[loadClass](./JavaLoadClass.md)一起使用的 + +## forge提供的事件 +forge本身提供了非常多的事件可以使我们捕捉到游戏内的事情,但是我们一个个去翻又太过麻烦,这里孤梦就推荐使用[crt文档](https://docs.blamejared.com/1.20.1/en)去找对应的事件! + +[crt文档](https://docs.blamejared.com/1.20.1/en)的forge栏里的event目录下是非常好的ForgeEvent文档 + +我们可以现在crt文档里找到对应的事件,然后再去[forge的GitHub](https://github.com/MinecraftForge/MinecraftForge/tree/1.20.1/src/main/java/net/minecraftforge/event)上去找到相应事件的类 + +## 关于使用 +```js +ForgeEvents.onEvent("事件类",event=>{ + //关于事件的code +}) +``` +因为每个事件给出的方法是有可能不一样的,所以这里无法举例,且提供不了详细的函数使用(这里也可以简单参考一下crt文档提供的事件的使用函数) + +## 事件的“热加载” +绝大部分的事件都是可以“热加载”的,但是需要使用一点手段 + +在前面我们学习了[global全局变量](./GlobalVariable.md),我们可以在事件里嵌入一个[global全局变量](./GlobalVariable.md),将事件处理引出来,像下面这样写 +```js +ForgeEvents.onEvent("事件类",event=>{ + global.eventTest(event); +}) + +global.eventTest = event =>{ + //事件处理 +} +``` +这样我们在游戏里只需要输入 `/kjs reload startup_scripts` 就可以进行事件处理的热加载了 + +## 注意事项 +startup是非常脆弱的,稍不注意就会大退然后报错,说你的“犀牛”有问题, + +所以建议在测试的过程中使用`try catch`包裹处理一下报错,能够减少闪退的次数 + +具体像下面这样写(沿用上面代码) + +```js +global.eventTest = event =>{ + try{ + //事件处理 + }catch(err){ + console.error(err); + } +} +``` +这样在报错时,可以在`/logs/kubejs/startup.log`里看见因为什么报错,然后去调整代码,一定不要因为错误被catch了就不管不顾了,除非你的这个错误是在意料之中的,并且出现报错后也有对应的处理,不会导致一直重复报错 \ No newline at end of file diff --git a/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSAdvanced/JavaLoadClass.md b/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSAdvanced/JavaLoadClass.md new file mode 100644 index 00000000..bc38871a --- /dev/null +++ b/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSAdvanced/JavaLoadClass.md @@ -0,0 +1,29 @@ +# LoadClass使用 +> 孤梦注:千万不要玩Java.loadClass啊,这东西比较废人 + +在使用Java.loadClass时,孤梦建议是你有一定的Java基础,至少得知道类、类路径、静态、对象、访问修饰符等概念 + +在绝大多数时候我们都用不到loadClass + +loadclass就是kjs提供给我们用来加载java类的 + +这使得KubeJS的可玩性非常高,比如[注册AE存储元件和对应的组件](../KubejsProjects/Meng/RegComponent&Storage.md)就使用到了非常多的loadClass + +## 关于使用 +```js +let class = Java.loadClass("类路径"); +``` +在使用ProbeJS时,在绝大多数时候都会为你补齐类路径,但是ProbeJS并不是所有的类都有对应的路径,所以这个时候你可以去翻一下对应模组的GitHub开源链接,查找到你需要的类,并将其路径复制过来 + +在你使用`Java.loadClass`class时候,你可以直接去调用到里面的`public static`的方法或者变量常量等 + +但是有些内容调用不到,你就可以和写java一样去`new`这个类 + +沿用上面的内容 +```js +let newClass = new class(); +``` +这里的`new class()`括号里可能会需要传参有的也不需要,这里根据对应类提供的源码来写 + +## 总结 +总的来说你如果需要更好的使用`Java.loadClass`你是需要有一定的Java基础,这不是靠一个篇章能说明白的事情 \ No newline at end of file diff --git a/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSBasic/LootTables/README.md b/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSBasic/LootTables/README.md index d5940279..617e83e1 100644 --- a/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSBasic/LootTables/README.md +++ b/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSBasic/LootTables/README.md @@ -16,3 +16,30 @@ | ServerEvents.fishingLootTables | 钓鱼战利品 | modify | addFishing | [钓鱼战利品](./FishingLootTable) | | ServerEvents.chestLootTables | 宝箱战利品 | modify | addChest | [宝箱战利品](./ChestLootTable) | +## LootBuilderPool通用方法 +| 方法名 | 参数 | 用途 | 返回类型 | +| :-----------------------------------------------------: | :-------------------------------------: | :----------------------: | :----------------: | +| `setUniformRolls(int1,int2)` | int1->最小抽取次数 int2->最大抽取次数 | 随机从奖池抽取次数 | void | +| `addCondition(JsonObject)` | ~ | ~ | ConditionContainer | +| `addConditionalFunction(Consumer)` | ~ | ~ | FunctionContainer | +| `addEmpty(int)` | int->空值占比权重 | 设置抽到空的权重 | LootTableEntry | +| `addEntry(JsonObject)` | ~ | ~ | LootTableEntry | +| `addItem(ItemStack)` | -> | 添加物品 | LootTableEntry | +| `addItem(ItemStack,int)` | int-> 权重占比 | 添加物品 | LootTableEntry | +| `addItem(ItemStack,int,NumberProvider)` | NumberProvider-> 数量范围 | 添加物品 | LootTableEntry | +| `addLootTable(ResourceLocation)` | -> | 添加到其他的战利品表里 | LootTableEntry | +| `addTag(string,bool)` | string->tagId bool-> 是否从其中抽取一个 | 添加tag作为战利品 | LootTableEntry | +| `randomChanceWithLooting(int1,int2)` | int1->chance int2->multiplier | ~ | ConditionContainer | +| `count(NumberProvider)` | -> | 设置数量范围 | FunctionContainer | +| `damage(NumberProvider)` | -> | 设置损坏值范围 | FunctionContainer | +| `enchantRandomly(ResourceLocation[])` | -> | 随机附魔 | FunctionContainer | +| `enchantWithLevels(NumberProvider,bool)` | ~ | ~ | FunctionContainer | +| `entityProperties(EntityTarget,JsonObject)` | ~ | ~ | ConditionContainer | +| `entityScores(EntityTarget,Map)` | ~ | ~ | ConditionContainer | +| `entries()` | - | 获取entries列表 | JsonArray | +| `killedByPlayer()` | - | 设置需要玩家击杀 | ConditionContainer | +| `randomChance(int)` | -> | ~ | ConditionContainer | +| `randomChanceWithLooting(int1,int2)` | int1-> chance int2-> multiplier | ~ | ConditionContainer | +| `setBinomialRolls(int1,int2)` | ~ | ~ | void | +| `survivesExplosion()` | - | ~ | ConditionContainer | +| `furnaceSmelt()` | - | 掉落物品可被火焰附加熔炼 | FunctionContainer | \ No newline at end of file diff --git a/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSProjects/Meng/RegComponent&Storage.md b/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSProjects/Meng/RegComponent&Storage.md new file mode 100644 index 00000000..84bdfa36 --- /dev/null +++ b/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSProjects/Meng/RegComponent&Storage.md @@ -0,0 +1,88 @@ +# 注册AE存储元件和对应的组件 +本章涉及内容:`Java.loadClass`的使用、`StartupEvents.registry`里的`createCustom`使用 + +本章使用模组: +1. jei-1.20.1-forge-15.3.0.4 +2. rhino-forge-2001.2.2-build.18 +3. architectury-9.2.14-forge +4. kubejs-forge-2001.6.5-build.14 +5. probejs-6.0.1-forge +6. appliedenergistics2-forge-15.2.13 + +## 代码部分 +下面代码全部都在`startup`文件夹内 + +```js +const $BasicStorageCell = Java.loadClass("appeng.items.storage.BasicStorageCell") +const $StorageComponentItem = Java.loadClass("appeng.items.materials.StorageComponentItem") +const $AEItems = Java.loadClass("appeng.core.definitions.AEItems") +const $AEKeyType = Java.loadClass("appeng.api.stacks.AEKeyType") +const $Item = Java.loadClass("net.minecraft.world.item.Item"); + +const namespace = "meng:"; + +let AECellComponentItems = { +} + +/** + * 注册存储元件和对应的组件 + * @param {Number} byte 最大内存 kb + * @param {Number} maxItemTypeCount 最大物品类型属性 1~63 + * @param {Number} AE2Energy 消耗的ae能 + * @param {Number} bytesPer 每一个新物品开辟所需的空间byte + */ +function regCellComponent(byte,maxItemTypeCount,AE2Energy,bytesPer){ + let cellComponentId = `${namespace}cell_component_${byte}k` + let storageCellId = `${namespace}item_storage_cell_${byte}k` + AECellComponentItems[byte] = { + byte:byte, + cellComponent: cellComponentId, + storageCell:storageCellId, + maxItemTypeCount:maxItemTypeCount, + AE2Energy:AE2Energy, + bytesPer:bytesPer + } +} + +regCellComponent(512,63,3.0,4096) +regCellComponent(1024,63,4.0,4096) +regCellComponent(2048,63,5.0,4096) +regCellComponent(4096,63,6.0,4096) +regCellComponent(8192,63,7.0,4096) + +StartupEvents.registry("item", event => { + for (const key in AECellComponentItems) { + let aeValue = AECellComponentItems[key]; + event.createCustom(aeValue.cellComponent, + ()=>new $StorageComponentItem($Item.Properties().stacksTo(1), aeValue.byte)) + event.createCustom(aeValue.storageCell, + ()=>new $BasicStorageCell( + $Item.Properties().stacksTo(1), + Item.of(aeValue.cellComponent), + $AEItems.ITEM_CELL_HOUSING, + aeValue.AE2Energy, + aeValue.byte, + aeValue.bytesPer, + aeValue.maxItemTypeCount, + $AEKeyType.items() + ) + ) + } +}) +``` +上面代码注册了512k到8192k的存储元件和对应的组件 + +在游戏内也可以和原版一样`shift+右键`将组件和对应的框拆开 + +汉化和贴图和正常注册物品流程一样 + +## 我该如何使用上方代码 +孤梦已经为你造好了轮子,你只需要调用`regCellComponent`这个方法然后往里面传参,剩下的就是重启游戏就可以了 +```js +regCellComponent(512,63,3.0,4096) +``` +就跟上方代码一样,直接正常调用然后重启游戏就可以被加载进游戏里了 + +## 注意事项 +1. 该项目只是作为示例,可能有些地方没有解释清除,如需请自己查阅相关资料 +2. 如需使用代码请注释表明此文档链接(浏览器链接区) \ No newline at end of file diff --git a/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSProjects/Meng/SmallProject/CreatePipeCollision.md b/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSProjects/Meng/SmallProject/CreatePipeCollision.md index 4402bde1..b180f5a8 100644 --- a/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSProjects/Meng/SmallProject/CreatePipeCollision.md +++ b/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/KubeJSProjects/Meng/SmallProject/CreatePipeCollision.md @@ -1,6 +1,7 @@ # 机械动力修改流体管道流体和流体产生块 本章主要涉及内容:ForgeEvents、机械动力事件里的`PipeCollisionEvent.Spill`,本章所有代码部分都在`startup_scripts`里 +关于`PipeCollisionEvent`的[参考位置](https://github.com/Creators-of-Create/Create/blob/mc1.20.1/dev/src/main/java/com/simibubi/create/api/event/PipeCollisionEvent.java):https://github.com/Creators-of-Create/Create/blob/mc1.20.1/dev/src/main/java/com/simibubi/create/api/event/PipeCollisionEvent.java ## 完整代码 ```js const $PipeCollisionEvent = Java.loadClass("com.simibubi.create.api.event.PipeCollisionEvent") diff --git a/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/README.md b/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/README.md index 0c417db9..07661422 100644 --- a/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/README.md +++ b/docs/en/modpack/kubejs/1.20.1/KubeJSCourse/README.md @@ -56,7 +56,11 @@ Project [issue feedback](https://gitee.com/gumengmengs/kubejs-course/issues/new/ ### Documentation Rules * Tables in the documentation can have three types of markers: `-`, `~`, and `?`. `-` represents "none," `~` represents "to be edited," and `?` represents "unknown." -* Images must use absolute paths. +* 图片一定要使用**绝对路径** +# 关于开源 +本项目遵循 [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en) +您可以转载并使用但是请附上相应的参考文档链接 +**您不得将本项目内容用于商业目的**