跳转至内容

【发帖必读】妙妙工具版版规与发帖规范

已固定 已锁定 妙妙工具
1 1 116 1
  • 第一章 板块定位

    第一条 核心宗旨

    妙妙工具板块致力于分享实用技术资源,包括但不限于:

    • 原创或转载的程序、网页工具
    • KubeJS/CrT魔改脚本、工具集、配置集、Lib库
    • 可复用的代码轮子、开发模板
    • 其他可提升效率的技术解决方案

    第二条 内容导向

    鼓励发布完整度高、逻辑清晰、注释规范的作品,倡导技术交流与开源精神。


    第二章 发帖规范

    第三条 标题格式

    一、基础格式

    [原创/搬运][工具平台][工具英文名——工具译名] 其他说明与描述
    说明

    1. 原创/搬运:必填,标明内容性质(搬运需注明原出处);
    2. 工具平台:必填,标明工具类型或适用平台(如 Windows / Forge / KubeJS 6 / 在线工具 等);
    3. 工具名称
      • 有中英文名:格式为 英文名——中文译名
      • 无中文译名:可仅写英文名;
      • 无英文名:可仅写中文名;
    4. 其他说明:选填,补充版本、功能亮点或短评(如 v3.2.1更新 / 便捷翻译工具)。

    二、注意事项

    1. 标题中英文间用 短破折号 ——(非短横线 -);
    2. 标题中方括号使用英文字符[],而不使用中文字符【】
    3. 禁止添加夸张符号(如 !!! 【爆款】);
    4. 平台分类需简洁明确,避免模糊表述(如 [Minecraft] 应改为 [Minecraft 1.20.1-1.21.X])。

    三、格式示例

    • [转载][Windows][JSON-i18n]一款JSON文件快速本地化的翻译工具
    • [转载][CrT 1.12.2][GrassUtils]基于CraftTweaker的便捷工具类集合

    第四条 版权声明

    1. 原创内容:需在正文显著位置标注原创声明以及授权协议;
    2. 搬运内容
      • 一般情况下禁止二次转载(即“二转”),原搬运贴年久失修例外(超过三个大版本更新未同步内容);
      • 若原作者注明转载需要授权,或原作品协议不允许转载,需在正文顶部展示授权协议截图/链接
      • 二次分发需要在协议允许的情况下进行,或获取原作者授权,需在正文顶部展示授权协议截图/链接
    3. 衍生作品:若涉及二改、二次分发或反向工程,必须符合原始协议条款,否则视为剽窃。

    第五条 安全警示

    内容若包含以下操作,必须添加 unsafe 标签并在正文详细说明风险:

    • 修改系统关键文件
    • 静默执行的操作
    • 涉及敏感权限
    • 存在数据丢失/泄露风险的功能
      (示例)
      本脚本涉及对系统文件进行修改的操作!

    第六条 质量管控

    禁止发布以下低质量内容:

    1. 功能重复:与已有工具核心功能高度相似;
    2. 代码简陋:无异常处理、无注释、逻辑混乱的“玩具代码”;
    3. 可替代性强:可通过现有工具组合或简单命令实现同等效果;
    4. 描述模糊:未提供使用场景、参数说明或效果演示。
      :若承诺改进,需在标题添加 [持续更新] 并公示开发计划(如更新日志)。

    第三章 违规行为

    第七条 绝对禁止

    1. 剽窃:直接复制他人代码未标注来源,或篡改版权声明;
    2. 黑箱分发:对闭源工具进行逆向工程并违规传播;
    3. 恶意组件:植入后门、挖矿代码、数据爬虫等危害性内容;
    4. 虚假更新:标注 [持续更新] 但超30天无实质进展且未说明原因。

    第八条 内容删除标准

    1. 未标注 [unsafe] 的高风险工具;
    2. 未提供授权证明的搬运内容;
    3. 被3名以上用户举报核实为低创作品。

    第九条 违规处罚

    违规类型 处理措施
    未标注[unsafe] 警告+强制编辑
    低创内容 删帖+禁止3日内发同类主题
    剽窃/黑箱分发 永久封禁账号+全论坛置顶晒尸

    第四章 附则

    第十条 本规则自发布之日起生效,最终解释权归VariedMC管理组所有。

  • 不是椰浆 不是椰浆 中锁定了该主题
  • 不是椰浆 不是椰浆 中固定了该主题

相关推荐


  • [原创][KubeJS]kubejs获取玩家所处坐标的结构

    妙妙工具 kubejs
    1
    1 赞同
    1 帖子
    146 浏览
    忆然
    本文使用:CC-BY-NC-SA 4.0协议 直接上代码 在此推荐下来自ZZZank的ProbeJS Legacy (已经支持1.20.1了(喜)) /** * 获取实体坐标的所有结构 * @param {Internal.Entity} entity * @returns {$StructureStart_[]} */ function getAllStructuresAt(entity) { let structureList = [] /**@type {$ServerLevel_} */ let serverLevel = entity.level let entityPos = entity.block.pos /** @type {Internal.Structure[]} */ let structureArray = serverLevel.structureManager().getAllStructuresAt(entityPos).keySet().toArray() for (let structure of structureArray) { let structureStart = serverLevel.structureManager().getStructureAt(entityPos, structure) if (structureStart.isValid()) { structureList.push(structureStart) } } return structureList }
  • [原创][Mod]通过特定格式文字进行查找结构

    妙妙工具 forge mixin
    1
    0 赞同
    1 帖子
    111 浏览
    昨天没做东西,今天也没K
    故事的起因是有帮twf写模组时,需要用到查找结构指令显示坐标给玩家,但是玩家不一定有权限或者ftbq发送并不会sendmessage给玩家,所以有了此代码。 我也将结构查找的功能写成了一个类,可以直接拿去用。 public class StructureLocator { private static final ResourceKey<Registry<ConfiguredStructureFeature<?, ?>>> STRUCTURE_REGISTRY_KEY = Registry.CONFIGURED_STRUCTURE_FEATURE_REGISTRY; /** * 根据单个结构 ResourceLocation(如 "minecraft:village" 或者自定义 mod:id)查找最近的那个点。 * * @param level 当前维度 * @param center 中心搜索点 * @param id 结构的 ResourceLocation * @param radius 搜索半径(方块数) * @param skipKnown 是否跳过已探索过的结构 * @return 如果找到,返回 Pair(结构坐标, Holder<该结构>); 找不到则 empty() */ public static Optional<Pair<BlockPos, Holder<ConfiguredStructureFeature<?, ?>>>> findNearest( ServerLevel level, BlockPos center, ResourceLocation id, int radius, boolean skipKnown ) { Registry<ConfiguredStructureFeature<?, ?>> registry = level.registryAccess().registryOrThrow(STRUCTURE_REGISTRY_KEY); ResourceKey<ConfiguredStructureFeature<?, ?>> key = ResourceKey.create(STRUCTURE_REGISTRY_KEY, id); Holder<ConfiguredStructureFeature<?, ?>> holder = registry.getHolder(key).orElse(null); if (holder == null) return Optional.empty(); HolderSet<ConfiguredStructureFeature<?, ?>> holderSet = HolderSet.direct(holder); Pair<BlockPos, Holder<ConfiguredStructureFeature<?, ?>>> result = level.getChunkSource() .getGenerator() .findNearestMapFeature(level, holderSet, center, radius, skipKnown); return Optional.ofNullable(result); } /** * 根据 TagKey(像 "#minecraft:village")来查找最近的结构。 * * @param level 当前维度 * @param center 中心搜索点 * @param tagKey 结构 TagKey(Registry.CONFIGURED_STRUCTURE_FEATURE_REGISTRY 下的 Tag) * @param radius 搜索半径 * @param skipKnown 是否跳过已探索结构 * @return 如果找到,返回 Pair(结构坐标, Holder<该结构>); 找不到则 empty() */ public static Optional<Pair<BlockPos, Holder<ConfiguredStructureFeature<?, ?>>>> findNearestByTag( ServerLevel level, BlockPos center, TagKey<ConfiguredStructureFeature<?, ?>> tagKey, int radius, boolean skipKnown ) { Registry<ConfiguredStructureFeature<?, ?>> registry = level.registryAccess().registryOrThrow(STRUCTURE_REGISTRY_KEY); HolderSet<ConfiguredStructureFeature<?, ?>> holderSet = registry.getOrCreateTag(tagKey); Pair<BlockPos, Holder<ConfiguredStructureFeature<?, ?>>> result = level.getChunkSource() .getGenerator() .findNearestMapFeature(level, holderSet, center, radius, skipKnown); return Optional.ofNullable(result); } /** * 把查到的结果格式化成一个聊天用的组件(绿色坐标 + 距离)。 * * @param structureName 你想显示的结构名称(如 "minecraft:village" 或 "#minecraft:village") * @param origin 搜索中心 * @param pair findNearest 返回的 Pair * @param translateKey 翻译 key,通常用 "commands.locate.success" */ public static Component formatLocateResult( String structureName, BlockPos origin, Pair<BlockPos, Holder<ConfiguredStructureFeature<?, ?>>> pair, String translateKey ) { BlockPos found = pair.getFirst(); int distance = Mth.floor( dist(origin.getX(), origin.getZ(), found.getX(), found.getZ()) ); MutableComponent coords = ComponentUtils.wrapInSquareBrackets( new TranslatableComponent("chat.coordinates", found.getX(), "~", found.getZ()) ); return new TranslatableComponent( translateKey, structureName, coords, distance ); } private static float dist(int x1, int z1, int x2, int z2) { int dx = x2 - x1, dz = z2 - z1; return Mth.sqrt((float) (dx * dx + dz * dz)); } } 这部分代码就是查找结构有关的类了,通过获取ConfiguredStructureFeature的注册表,然后再获取结构的Holder类,再给ChunkGenerator的findNearestMapFeature方法去获取到BlockPos。 @Mixin(ServerPlayer.class) public class ServerPlayerMixin { @ModifyArg(method = "sendMessage(Lnet/minecraft/network/chat/Component;Lnet/minecraft/network/chat/ChatType;Ljava/util/UUID;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/protocol/game/ClientboundChatPacket;<init>(Lnet/minecraft/network/chat/Component;Lnet/minecraft/network/chat/ChatType;Ljava/util/UUID;)V"), index = 0) public Component modifyMessage(Component component){ MutableComponent mutableComponent = component.copy(); String message = mutableComponent.getString(); ServerPlayer serverPlayer = (ServerPlayer) (Object) this; if (message.contains("<structure>") && message.contains("</structure>")) { String structure = message.replaceAll(".*<structure>(.*?)</structure>.*", "$1"); BlockPos center = serverPlayer.blockPosition(); Optional<Pair<BlockPos, Holder<ConfiguredStructureFeature<?, ?>>>> holderPair = StructureLocator.findNearest( serverPlayer.getLevel(), center, new ResourceLocation(structure), 100, false ); AtomicReference<String> replace = new AtomicReference<>(); holderPair.ifPresentOrElse(pair -> { Component component1 = StructureLocator.formatLocateResult(structure, center, pair, "commands.locate.success"); replace.set(component1.getString()); }, () -> { replace.set(new TranslatableComponent("commands.locate.failed", structure).getString()); }); Style style = component.getStyle(); mutableComponent = new TextComponent(message.replaceAll("<structure>(.*?)</structure>", "§a%s§r".formatted(replace.get()))).withStyle(style); } return mutableComponent; } } 这段mixin则是注入ServerPlayer的sendMessage方法,修改new ClientboundChatPacket(message, type, sender)的message参数,||因为我偷懒,所以没用MixinExtra||,用正则表达式进行匹配到对应的结构格式文字,然后修改原文字中的内容。 这差不多都就是本次代码的全部内容了。
  • 1 赞同
    14 帖子
    418 浏览
    sdjgeS
    补药偷走我的钱包