Skip to content

Commit

Permalink
#22 Sync Gumeng's Ddc - 24/9/20
Browse files Browse the repository at this point in the history
  • Loading branch information
M1hono committed Sep 19, 2024
1 parent e98d27e commit 4c6b27d
Show file tree
Hide file tree
Showing 14 changed files with 423 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -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了就不管不顾了,除非你的这个错误是在意料之中的,并且出现报错后也有对应的处理,不会导致一直重复报错
Original file line number Diff line number Diff line change
@@ -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基础,这不是靠一个篇章能说明白的事情
Original file line number Diff line number Diff line change
Expand Up @@ -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<ConditionalFunction>)` | ~ | ~ | 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<string, any>)` | ~ | ~ | 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 |
Original file line number Diff line number Diff line change
@@ -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. 如需使用代码请注释表明此文档链接(浏览器链接区)
Original file line number Diff line number Diff line change
@@ -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")
Expand Down
6 changes: 5 additions & 1 deletion docs/en/modpack/kubejs/1.20.1/KubeJSCourse/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
您可以转载并使用但是请附上相应的参考文档链接
**您不得将本项目内容用于商业目的**

<script setup>
import { VPTeamMembers } from 'vitepress/theme'
Expand Down
9 changes: 6 additions & 3 deletions docs/en/modpack/kubejs/1.20.1/KubeJSCourse/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
* [Foreword](/KubeJSBasic/Foreword.md)
* [Understanding kjs Folder Structure](/KubeJSBasic/FileStructure.md)
* [Using All Events](/KubeJSBasic/AllEvent.md)
* [Game Resource Invocation](/KubeJSBasic/GameSources.md)
* [文件优先级](/KubeJSBasic/FilePriority.md)
* [ProbeJS Register Name Lookup](/KubeJSBasic/RegisterType.md)
* [Basic Syntax - Adding Recipes](/KubeJSBasic/BasicSyntax-Add.md)
* [Basic Syntax - Deleting and Modifying](/KubeJSBasic/BasicSyntax-DeleteAndModify.md)
* [Universal Recipe Modification (Adding)](/KubeJSBasic/Custom.md)
* [Modifying Window Title and Logo](/KubeJSBasic/ModifyWindowTitleAndLogo.md)
* [Game Resource Invocation](/KubeJSBasic/GameSources.md)
* [文件优先级](/KubeJSBasic/FilePriority.md)
* [ProbeJS Register Name Lookup](/KubeJSBasic/RegisterType.md)
* [执行游戏内指令](/KubeJSBasic/RunCommand.md)
* [Item Tooltip](/KubeJSBasic/Tooltip.md)
* [Loot Tables](/KubeJSBasic/LootTables/README.md)
Expand Down Expand Up @@ -51,6 +51,8 @@
* [物品属性修改——待编写](/KubeJSAdvanced/ItemAttributeModify.md)
* [World Generation](/KubeJSAdvanced/WorldGen.md)
* [Global Variables](/KubeJSAdvanced/GlobalVariable.md)
* [LoadClass使用](/KubejsAdvanced/JavaLoadClass.md)
* [ForgeEvent的使用](/KubejsAdvanced/ForgeEvent.md)
* [RecipesSchema Simple Tutorial](/KubeJSAdvanced/RecipesSchemaAdded.md)
* [实体持久化数据——待编写](/KubeJSAdvanced/EntityPersistentData.md)
* [屏幕“绘画”——待编写](/KubeJSAdvanced/Paint.md)
Expand Down Expand Up @@ -110,6 +112,7 @@
* [Falling Item Crafting](/KubeJSProjects/Meng/FallItem.md)
* [Player Muting](/KubeJSProjects/Meng/NoChat.md)
* [服务器签到](/KubeJSProjects/Meng/SignIn.md)
* [注册AE存储元件和对应的组件](/KubejsProjects/Meng/RegComponent&Storage.md)
* [孤梦的小项目](/KubeJSProjects/Meng/SmallProject/README.md)
* [自动适配台阶合成对应块](/KubeJSProjects/Meng/SmallProject/SlabPairBlock.md)
* [原版修改流体对撞产生块](/KubeJSProjects/Meng/SmallProject/McFluidPlaceBlock.md)
Expand Down
Original file line number Diff line number Diff line change
@@ -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了就不管不顾了,除非你的这个错误是在意料之中的,并且出现报错后也有对应的处理,不会导致一直重复报错
Original file line number Diff line number Diff line change
@@ -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基础,这不是靠一个篇章能说明白的事情
Loading

0 comments on commit 4c6b27d

Please sign in to comment.