RT, 想知道 bukkit 插件能否调整作物的生长速度?这里指的是动态调整, spigot.yml 里那个貌似不能够动态应用...
调整随机刻的话, 虽然可以加速但是同时也会影响到很多诸如流水等的特性所以不考虑在内.
我比较菜只能想到遍历世界找农作物然后手动调整, 不过这也太浪费性能了遂直接 pass 掉
希望有大佬能够抛砖引玉一下QAQ 非常感谢
调整随机刻的话, 虽然可以加速但是同时也会影响到很多诸如流水等的特性所以不考虑在内.
我比较菜只能想到遍历世界找农作物然后手动调整, 不过这也太浪费性能了遂直接 pass 掉
希望有大佬能够抛砖引玉一下QAQ 非常感谢
本帖最后由 南柯郡守 于 2020-6-17 19:53 编辑
可以尝试监听 BlockGrowEvent
https://papermc.io/javadocs/pape ... BlockGrowEvent.html
可以尝试监听 BlockGrowEvent
https://papermc.io/javadocs/pape ... BlockGrowEvent.html
应该是不能针对单个农作物方块进行调整的,详见NMS类: net.minecraft.server.v1_8_R3.BlockCrops类,以下是其生长代码:
复制代码
可以看到其仍然是调用spigotConfig的,你可以在代码里对spigotConfig(org.spigotmc.SpigotWorldConfig)内的农作物生长速度成员进行实时修改, 这是1.8所有农作物的modifier:
复制代码
以下是一个example:
复制代码
- @Override
- public void b(final World world, final BlockPosition blockposition, final IBlockData iblockdata, final Random random) {
- super.b(world, blockposition, iblockdata, random);
- if (world.getLightLevel(blockposition.up()) >= 9) {
- final int i = iblockdata.get((IBlockState<Integer>)BlockCrops.AGE);
- if (i < 7) {
- final float f = a(this, world, blockposition);
- if (random.nextInt((int)(world.growthOdds / world.spigotConfig.wheatModifier * (25.0f / f)) + 1) == 0) {
- final IBlockData data = iblockdata.set((IBlockState<Comparable>)BlockCrops.AGE, i + 1);
- CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, this.toLegacyData(data));
- }
- }
- }
- }
可以看到其仍然是调用spigotConfig的,你可以在代码里对spigotConfig(org.spigotmc.SpigotWorldConfig)内的农作物生长速度成员进行实时修改, 这是1.8所有农作物的modifier:
- private void growthModifiers() {
- this.cactusModifier = this.getAndValidateGrowth("Cactus");
- this.caneModifier = this.getAndValidateGrowth("Cane");
- this.melonModifier = this.getAndValidateGrowth("Melon");
- this.mushroomModifier = this.getAndValidateGrowth("Mushroom");
- this.pumpkinModifier = this.getAndValidateGrowth("Pumpkin");
- this.saplingModifier = this.getAndValidateGrowth("Sapling");
- this.wheatModifier = this.getAndValidateGrowth("Wheat");
- this.wartModifier = this.getAndValidateGrowth("NetherWart");
- }
以下是一个example:
- public static void modify(World world){
- // 强转为NMS World实例,如果你的插件是公开插件,请针对不同版本写不同的NMS适配类,或者直接反射
- net.minecraft.server.v1_8_R3.World targetWorld = ((CraftWorld)world).getHandle();
- // 获得SpigotWorldConfig实例
- SpigotWorldConfig worldConfig = targetWorld.spigotConfig;
- // 修改西瓜生长速度
- worldConfig.melonModifier = 100;
- // 修改胡萝贝生长速度
- worldConfig.carrotModifier = 100;
- }