= 创作分享 =
你问我答
1.12.2有模组可以限制玩家放置方块数量吗 ...
Nyonio

1.12.2有模组可以限制玩家放置方块数量吗

Nyonio 于 2025-11-26 13:34 ( 9天前 ) [复制链接] [显示全部楼层] [打印]
10RF
1.12.2有模组可以限制玩家放置方块数量吗,做整合包想要防止玩家无脑堆矿机,于是自己用Crt写了一个。
但是矿机控制器被假破坏也会恢复放置次数(真的没招了)。

Crt脚本部分:
#loader crafttweaker reloadableevents

import crafttweaker.world.IWorld;
import crafttweaker.block.IBlock;
import crafttweaker.world.IBlockPos;
import crafttweaker.player.IPlayer;
import crafttweaker.data.IData;
import crafttweaker.event.BlockBreakEvent;
import crafttweaker.event.BlockPlaceEvent;

// 检查方块是否是矿机控制器
function isMinerController(block as IBlock) as bool {
    var blockName = block.definition.id;

    // 直接检查是否是矿机控制器
    if(blockName == "environmentaltech:void_res_miner_cont_1") return true;
    if(blockName == "environmentaltech:void_res_miner_cont_2") return true;
    if(blockName == "environmentaltech:void_res_miner_cont_3") return true;
    if(blockName == "environmentaltech:void_res_miner_cont_4") return true;
    if(blockName == "environmentaltech:void_res_miner_cont_5") return true;
    if(blockName == "environmentaltech:void_res_miner_cont_6") return true;

    return false;
}

//方块破坏事件
events.onBlockBreak(function(event as BlockBreakEvent){
    var world = event.world;
    var player = event.player;
    var pos = event.position;
    var block = world.getBlock(pos);

    if(!world.remote && !player.creative && isMinerController(block)){

        var playerData = player.data;
        var currentCount = 0;

        if(playerData has "minerControllerCount") {
            currentCount = playerData.minerControllerCount.asInt();
        }

        if(currentCount > 0) {
            var newCount = currentCount - 1;
            player.update({minerControllerCount: newCount});
            player.sendChat("矿机控制器已拆除,当前数量: " + newCount);
        }
    }
});

//方块放置事件
events.onBlockPlace(function(event as BlockPlaceEvent){
    var world = event.world;
    var player = event.player;
    var pos = event.position;
    var block = world.getBlock(pos);

    if(!world.remote && !player.creative && isMinerController(block)){
        var playerData = player.data;
        var currentCount = 0;

        if(playerData has "minerControllerCount") {
            currentCount = playerData.minerControllerCount.asInt();
        }

        if(currentCount >= 5){
            player.sendChat("矿机控制器数量已达上限(5个)!无法放置更多。");
            event.cancel();
        }else{
            var newCount = currentCount + 1;
            player.update({minerControllerCount: newCount});
            player.sendChat("矿机控制器已放置,当前数量: " + newCount + "/5");
        }
    }
});

发表于 2025-11-26 13:34:15 | 显示全部楼层 |阅读模式

回复 | 举报

该帖共收到 10 条回复!
YY12138喵
那我用别的mod放置矿机也能检测吗,感觉不如完全ban了然后一个人发几个,或者官方放置在固定位置每天可以产出xxx个物品"
发表于 2025-11-27 15:08:54 | 显示全部楼层

回复 | 举报

Nyonio
YY12138 发表于 2025-11-27 15:08
那我用别的mod放置矿机也能检测吗,感觉不如完全ban了然后一个人发几个,或者官方放置在固定位置每天可以产 ...

不能检测……脚本功能所限,所以有没有类似的模组,或者限制玩家合成数量的模组
发表于 2025-11-27 15:19:35 | 显示全部楼层

回复 | 举报

QiguaiAAAA
Emm没怎么用过CrT,但刚刚看了一下官方wiki,CrT的事件handler即使事件已被其它CrT的handler cancel了也会接收,因此应该要用event.canceled先看看是否已被取消,见 https://docs.blamejared.com/1.12 ... s/IEventCancelable/
当然这就引起另外一个问题。如果上面的logic在事件未取消时收到并操作了currentCount,然后事件被取消了也会引起bug。应此应保证其它取消逻辑在之前就加载。翻代码可发现https://github.com/CraftTweaker/ ... util/EventList.java 中是链表结构,保证这个script的加载顺序在其它取消事件之前即可。
但是我翻了代码,https://github.com/CraftTweaker/ ... onEventHandler.java 里面BlockEvent相关的优先级是默认,这意味着即使Crt脚本的handlers顺序正确,若有mod以更低优先级接收并取消那就没办法了,除非Crt提供相关API,但似乎并没有。只不过只要没有mod这么干就不会有问题。
最严谨的办法是写mod然后Mixin到相关event完成之后( 因为即使是mod似乎也很难保证是最后一个收到的。这就十分麻烦。但这仍然不够严谨,因为并非所有方块破坏逻辑之后都会引发事件。
因此要么不要限那么死,允许玩家升级上限,要么我还有一个想法:
玩家NBT维护一个含有world+pos信息的列表,打开矿机时若矿机TileEntity没有存储当前玩家名就check玩家NBT,若list.length>5就拒绝否则记录当前玩家并add到玩家NBT。相当于实现一个简单的物主功能,但可以有多个物主
每隔一段时间check列表并remove不存在的矿机
但这不知能否用crt实现(
发表于 2025-11-27 16:13:08 | 显示全部楼层

回复 | 举报

QiguaiAAAA
QQ酱243595 发表于 2025-11-27 15:19
不能检测……脚本功能所限,所以有没有类似的模组,或者限制玩家合成数量的模组 ...

如果只是限制合成,那或许可以remove原有配方,用CrT偷梁换柱,然后自定义合成函数,比如:
  1. recipes.addShapeless("example",<example:example>,[<some:ingredients>],
  2.     function (out,ins,info) {
  3.         var playerData = info.player.data;
  4.         var currentCount = 0;

  5.         if(playerData has "minerControllerCount") {
  6.             currentCount = playerData.minerControllerCount.asInt();
  7.         }

  8.         if(currentCount >= 5){
  9.             player.sendChat("矿机控制器数量已达上限(5个)!无法合成更多。");
  10.             return null;
  11.         }else{
  12.             var newCount = currentCount + 1;
  13.             player.update({minerControllerCount: newCount});
  14.             player.sendChat("矿机控制器已合成,当前数量: " + newCount + "/5");
  15.             return 矿机;
  16.         }
  17.     },
  18. null);
复制代码

上述代码未经测试,仅示例
但要是玩家不小心丢了一个怎么办?
发表于 2025-11-27 16:44:30 | 显示全部楼层

回复 | 举报

QiguaiAAAA
本帖最后由 QiguaiAAAA 于 2025-11-27 18:05 编辑
QiguaiAAAA 发表于 2025-11-27 16:44
如果只是限制合成,那或许可以remove原有配方,用CrT偷梁换柱,然后自定义合成函数,比如:

上述代码未 ...

不对应该这样子:
  1. recipes.addShapeless("example",<example:example>,[<some:ingredients>],
  2.     function (out,ins,info) {
  3.         var playerData = info.player.data;
  4.         var currentCount = 0;

  5.         if(playerData has "minerControllerCount") {
  6.             currentCount = playerData.minerControllerCount.asInt();
  7.         }

  8.         if(currentCount >= 5){
  9.             player.sendChat("矿机控制器数量已达上限(5个)!无法合成更多。");
  10.             return null;
  11.         }else{

  12.             return 矿机;
  13.         }
  14.     },function (out,info,player) {
  15.        var playerData = player.data;
  16.         var currentCount = 0;

  17.         if(playerData has "minerControllerCount") {
  18.             currentCount = playerData.minerControllerCount.asInt();
  19.         }
  20.         var newCount = currentCount + 1;
  21.          player.update({minerControllerCount: newCount});
  22.          player.sendChat("矿机控制器已合成,当前数量: " + newCount + "/5");
  23.   });
复制代码

应在合成之后再记录
补:那个翻wiki发现player可能为null,所以一定要先check isNull(player)
发表于 2025-11-27 16:55:10 | 显示全部楼层

回复 | 举报

Nyonio
QiguaiAAAA 发表于 2025-11-27 16:55
不对应该这样子:

应在合成之后再记录

那自动化合成也没法限制吧……已经放弃了
发表于 2025-11-27 18:13:23 | 显示全部楼层

回复 | 举报

QiguaiAAAA
QQ酱243595 发表于 2025-11-27 18:13
那自动化合成也没法限制吧……已经放弃了

player为null就不给合成了呗(
发表于 2025-11-27 18:28:02 | 显示全部楼层

回复 | 举报

0825NoRe
为什么要限制呢?这种事情不应该是玩家根据自己的MSPT等状况自行取舍的嘛?
发表于 6 天前 | 显示全部楼层

回复 | 举报

Nyonio
Wze1234 发表于 2025-11-30 00:37
为什么要限制呢?这种事情不应该是玩家根据自己的MSPT等状况自行取舍的嘛? ...

玩家堆几百个矿机就不会这么说的,关键是不卡资源还多,最后放弃了-删除环境科技
发表于 6 天前 | 显示全部楼层

回复 | 举报

12下一页
百科目前不允许匿名发帖哦~ 请先 [ 登陆 ][ 注册 ] 吧~

本版积分规则

发新帖
  • 回复
  • 点评
  • 评分

[ MC百科(mcmod.cn) 除另有声明,所有开放公共编辑的内容均使用 BY-NC-SA 3.0 协议 ]

Minecraft百科CC协议
快速回复 返回顶部 返回列表