# 自定义传送门

该项目使用[Custom Portal API \[Forge\]](https://www.mcmod.cn/class/10354.html)作为前置，在使用时需要安装该模组

涉及模组及版本:

1. rhino-forge-2001.2.2-build.18
2. architectury-9.2.14-forge
3. kubejs-forge-2001.6.5-build.14
4. probejs-6.0.1-forge
5. customportalapi-0.0.1-forge-1.20

## 项目代码

该示例代码需要写进`startup_scripts`文件夹内

```js
const $CustomPortalBuilder = Java.loadClass("net.kyrptonaught.customportalapi.api.CustomPortalBuilder")
const $BuiltinDimensionTypes = Java.loadClass("net.minecraft.world.level.dimension.BuiltinDimensionTypes")

StartupEvents.postInit(e=>{
    $CustomPortalBuilder
        .beginPortal() //开始构建自定义传送门
        ["frameBlock(net.minecraft.world.level.block.Block)"](Blocks.STONE) //传送门的框架方块
        .destDimID($BuiltinDimensionTypes.NETHER_EFFECTS) //传送维度
        .tintColor(131, 66, 184) // 传送门的RGB颜色
        .registerPortal(); //注册自定义传送门

    $CustomPortalBuilder
        .beginPortal() //开始构建自定义传送门
        ["frameBlock(net.minecraft.world.level.block.Block)"](Blocks.DIAMOND_BLOCK) //传送门的框架方块
        .destDimID($BuiltinDimensionTypes.NETHER_EFFECTS) //传送维度
        .lightWithItem(Items.DIAMOND) //激活传送门的物品
        .flatPortal() // 传送门为平面的
        .tintColor(131, 133, 184) // 传送门的RGB颜色
        .registerPortal(); //注册自定义传送门
})
```

## CustomPortalBuilder可调用方法

参考开源路径:<https://github.com/kyrptonaught/customportalapi/blob/1.20/src/main/java/net/kyrptonaught/customportalapi/api/CustomPortalBuilder.java>

|                                    方法名                                   |        方法参数        |               方法作用               |
| :----------------------------------------------------------------------: | :----------------: | :------------------------------: |
|                               beginPortal()                              |          -         |             创建一个新的传送门            |
|                             registerPortal()                             |          -         |         注册传送门，在所有参数传完之后调用        |
|                       frameBlock(ResourceLocation)                       |        方块id        |             设置传送门框架方块            |
|                             frameBlock(Block)                            |       Block类       |             设置传送门框架方块            |
|                        destDimID(ResourceLocation)                       |        纬度id        |             设置传送门前往纬度            |
|                              tintColor(int)                              |       16进制颜色       |             设置传送门的颜色             |
|                       tintColor(int r,int g,int b)                       |       传入RGB数字      |             设置传送门的颜色             |
|                             lightWithWater()                             |          -         |             设置传送门被水激活            |
|                            lightWithItem(Item)                           |        Item类       |            设置传送门被物品激活            |
|                           lightWithFluid(Fluid)                          |       Fluid类       |            设置传送门被流体激活            |
|                  customIgnitionSource(ResourceLocation)                  |         \~         |                a1                |
|                customIgnitionSource(PortalIgnitionSource)                |         \~         |                a1                |
|                          forcedSize(int w,int h)                         |      w 宽度,h 高度     |            强制设置传送门的大小            |
|                   customPortalBlock(CustomPortalBlock)                   | CustomPortalBlock类 |             自定义传送门方块             |
|                    returnDim(ResourceLocation,boolean)                   |       纬度id,b1      |              设置返回纬度              |
|                          onlyLightInOverworld()                          |          -         |                a2                |
|                               flatPortal()                               |          -         |        设置为平面传送门(末地传送门呈现形式)       |
|                    customFrameTester(ResourceLocation)                   |         \~         |                a3                |
|             registerBeforeTPEvent(Function\<Entity,SHOULDTP>)            |         \~         | 注册一个在实体传送前调用事件，可以通过SHOULDTP来取消事件 |
| registerInPortalAmbienceSound(Function\<PlayerEntity,CPASoundEventData>) |         \~         |           注册玩家在传送门内的声音           |
|  registerPostTPPortalAmbience(Function\<PlayerEntity,CPASoundEventData>) |         \~         |            注册玩家在传送时的声音           |
|                  registerPostTPEvent(Consumer\<Entity>)                  |         \~         |              注册传送后事件             |

### fabric 版本独占

这个地方根据可调用情况推测下面只有[fabric版本](https://www.mcmod.cn/class/15391.html)的开源调用

|                        方法名                        |     方法参数    |                     方法作用                     |
| :-----------------------------------------------: | :---------: | :------------------------------------------: |
|              beginPortal(PortalLink)              | PortalLink类 |           使用自定义的PortalLink类创建新的传送门           |
|               registerPortalForced()              |      -      |                    强制注册传送门                   |
|    registerPreIgniteEvent(PortalPreIgniteEvent)   |      \~     | 传送门激活之前事件，如果PortalPreIgniteEvent返回false则激活失败 |
|       registerIgniteEvent(PortalIgniteEvent)      |      \~     |                   传送门激活后事件                   |
|    setPortalSearchYRange(int bottomY,int topY)    |      -      |          设置传送门搜索有效生成y轴，默认为世界的最高点和最低点         |
| setReturnPortalSearchYRange(int bottomY,int topY) |      -      |        设置传送门返回时搜索有效生成的y轴，默认为世界的最高点和最低点       |

### 关于官方的解释

a1: Specify a Custom Ignition Source to be used to ignite the portal. You must manually trigger the ignition yourself.

a2: Specify that this portal can only be ignited in the Overworld.Attempting to light it in other dimensions will fail.

a3: Specify a custom portal frame tester to be used.

b1: Should this portal only be ignitable in returnDimID.

## 关于注册传送门方块

```js
const $CustomPortalsMod = Java.loadClass("net.kyrptonaught.customportalapi.CustomPortalsMod")
const $CustomPortalBlock = Java.loadClass("net.kyrptonaught.customportalapi.CustomPortalBlock")
const $BlockBehaviourProperties = Java.loadClass("net.minecraft.world.level.block.state.BlockBehaviour$Properties")
const $SoundType = Java.loadClass("net.minecraft.world.level.block.SoundType")
const $EventBuses = Java.loadClass("dev.architectury.platform.forge.EventBuses");

let test;

StartupEvents.init(e => {
    test = $CustomPortalsMod.registerOnlyBlock("test",()=>{
        return new $CustomPortalBlock(
            $BlockBehaviourProperties.copy(Blocks.NETHER_PORTAL)
            .lightLevel(() => 11)
            .noCollission()
            .strength(-1)
            .sound($SoundType.GLASS)
        )
    })

    $CustomPortalsMod.BLOCKS.register($EventBuses.getModEventBus("kubejs").get());
})

StartupEvents.postInit(e=>{
    $CustomPortalBuilder
        .beginPortal()
        ["frameBlock(net.minecraft.world.level.block.Block)"](Blocks.STONE)
        .customPortalBlock(test)
        .destDimID($BuiltinDimensionTypes.NETHER_EFFECTS) 
        .tintColor(131, 66, 184)
        .registerPortal();
})
```

## 一些注意事项

1. 该项目主要测试版本为`1.20.1`模组为[Custom Portal API \[Forge\]](https://www.mcmod.cn/class/10354.html)
2. 如果因为模组版本跟该项目模组版本不同导致报错请自行解决
3. 该项目主要分享主要写法，更多内容请自行查看开源项目后进行编写


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gumeng.gitbook.io/kubejs-jiao-cheng-1.20.1/kubejsprojects/customportal.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
