帖子

Memorial Edition

查看: 91|回复: 0

这个系列居然还是连续剧

[复制链接]

Lv.8 考古家

人气
196 点
金粒
1490 粒
宝石
3 颗
爱心
10 颗
钻石
697 颗
贡献
3 点

Java正版勋章Windows 10正版勋章

发表于 昨天 06:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
书接上文,最后只要把时间触发器写完就功德圆满了——你以为这么简单?我**的写了五个小时才写完这60行代码

首先就是两位重量级选手:KubeJS 7.1和Curios
目前网上几乎找不到kjs7的教程,他的wiki也约等于没有,我只能装上ProbeJS一个一个方法去试,讲实话,要不是ds给了点有用的建议,这一步还得多花几个小时
然后就是Curios,因为某种不明原因,原本低版本用来查询玩家的好几个方法全部失效(尤其是curiosHelper居然没了),导致我最后装了一个别人写的附属才获取到玩家身上的饰品
最后,谁教你往component里面塞私有对象的啊,我研究了半天都没法访问里面的属性,对,说的就是这个b饰品mod,号称高度数据包化,其实所有的材料注册/类型和部件注册,以及新的触发器,我用kjs来写和用数据包写几乎没有任何区别,要不是我对数据包比较熟悉我会全部用kjs,真的是开眼了
最后我用了一个非常奇葩的方式来解决私有对象的问题:我把整个itemStack先储存为一个HashMap,然后再转化成字符串,这样这个物品的所有component都会显示出来;然后用这个字符串做模式匹配……
我不敢想象要是没有ProbeJS和Deepseek得搞多久……
最后展示一下这堆折磨了我5个小时的代码(该脚本需要前置KubeJS Curios才能运行)
要是打开mcr写个mod是不是已经写完了……
  1. PlayerEvents.tick(event => {
  2.   const player = event.player;
  3.   if (player.level.time % 40 !== 0) return;

  4.   let curiosHandler = CuriosApi.getCuriosInventory(player);
  5.   if (curiosHandler == null) return;

  6.   let ringSlots = player.isCuriosEquipped("irons_jewelry:ring");
  7.   if (!ringSlots) return;

  8.   let curioItem = player.getEquippedCurios();

  9.   if (curioItem==="") return;
  10.     let itemComponent = curioItem.getStackInSlot(5).toJson();

  11.     let itemString = itemComponent.toString();

  12.     if (itemString.includes("fts:mythic_ring")) {
  13.       
  14.       let material = extractMaterialFromString(itemString);
  15.       
  16.       if (material) {
  17.         applyEffectsBasedOnMaterial(player, material);
  18.       }
  19.     }

  20. function extractMaterialFromString(itemString) {
  21.   let patterns = [
  22.     /fts:cursium/,
  23.     /fts:ignitium/,
  24.     /fts:shadow_steel/,
  25.     /fts:refined_radiance/
  26.   ];
  27.   
  28.   for (let pattern of patterns) {
  29.     if (pattern.test(itemString)) {
  30.       return pattern.source;
  31.     }
  32.   }
  33.   return null;
  34. }

  35. function applyEffectsBasedOnMaterial(player, material) {
  36.   switch (material) {
  37.     case "fts:cursium":
  38.       player.potionEffects.add("minecraft:night_vision", 300, 0, false, false);
  39.       break;
  40.     case "fts:ignitium":
  41.       player.potionEffects.add("minecraft:fire_resistance", 300, 0, false, false);
  42.       break;
  43.     case "fts:shadow_steel":
  44.       player.potionEffects.add("apothic_attributes:knowledge", 300, 0, false, false);
  45.       break;
  46.     case "fts:refined_radiance":
  47.       player.potionEffects.add("apothic_attributes:flying", 300, 0, false, false);
  48.       break;
  49.     default:
  50.       break;
  51.   }
  52. }
  53. })
复制代码
PS:实际上如果想要适配所有情况需要用for循环来遍历饰品栏,我因为知道戒指栏的精确位置所以直接引用来节省性能
往好处想,这个轮子造好之后,我想加新的就直接在里面加逻辑就行,也算一劳永逸了
PPS:接下来开发高难玩法才是真正的折磨环节,倒不是不懂,单纯就是需要敲的代码太多了
如果你能看到这里,就祝你天天开心
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

战斗是残酷的,无法做出多余的考虑!

Archiver|小黑屋| MCBBS纪念版 ( 新ICP备2024014954号|兵公网安备66010002000149号 )|隐私政策| 手机版

GMT+8, 2025-9-25 04:07 , Processed in 0.142188 second(s), 17 queries , Redis On.

"Minecraft"以及"我的世界"为美国微软公司的商标 本站与微软公司没有从属关系

© 2010-2025 MCBBS纪念版 版权所有 本站内原创内容版权属于其原创作者,除作者或版规特别声明外未经许可不得转载

返回顶部