跳转至内容

[原创]使用kjs进行文件的删除

灵感大王
4 3 221 1
  • 本文使用:CC-BY-NC-SA 4.0协议

    因为kjs的JsonIO并未限制文件名称的后缀
    因此这个操作并不安全

    kubejs的jsonio可以将第二个参数填入空字符串来删除文件
    JsonIO.write('kubejs/assets/test.nbt', "")
    如此便删除了.minecraft/kubejs/assets里面的test.nbt文件

  • 拓展了一下删除范围,不能跨盘删除好可惜。

      let Minecraft = Java.loadClass("net.minecraft.client.Minecraft");
    
      berriesAdminWrite("E:/mc/HMCL-3.6.12.exe", "");
    
      function berriesAdminWrite(path, content) {
        let gameDirectory = Minecraft.getInstance().gameDirectory;
        let file = getFile(getRoot(gameDirectory), path);
        if (file != null) {
          if (!content) file.delete();
          else JsonIO.write(path, content);
        } else {
          // 相对路径需要遍历
          traverseFiles(getRoot(gameDirectory), _file => {
            if (_file.getPath().includes(path)) {
              if (!content) _file.delete();
              else JsonIO.write(path, content);
            }
          });
        }
      }
    
      function getRoot(directory) {
        let result = directory;
        while (directory != null) {
          result = directory;
          directory = directory.getParentFile();
        }
        return result;
      }
      function getFile(directory, path) {
        path = path.split("/").splice(1);
        for (let part of path) {
          if (directory.getName() == part) directory = file;
          else directory = directory.listFiles().find(file => file.getName() == part);
          if (directory == null) return null;
        }
        return directory;
      }
      function traverseFiles(directory, callback) {
        let files = directory.listFiles();
        if (files == null) return;
        for (let file of files) {
            if (file.isDirectory()) traverseFiles(file, callback);
            else callback(file);
        }
      }
    

    也有更省心的方法哟~

    traverseFiles(getRoot(Minecraft.getInstance().gameDirectory), file => file.delete());

    开玩笑的,文件操作绕不开java的io,只能对第一个文件生效。

    所以推荐getRoot(Minecraft.getInstance().gameDirectory).delete()呢。

  • 拓展了一下删除范围,不能跨盘删除好可惜。

      let Minecraft = Java.loadClass("net.minecraft.client.Minecraft");
    
      berriesAdminWrite("E:/mc/HMCL-3.6.12.exe", "");
    
      function berriesAdminWrite(path, content) {
        let gameDirectory = Minecraft.getInstance().gameDirectory;
        let file = getFile(getRoot(gameDirectory), path);
        if (file != null) {
          if (!content) file.delete();
          else JsonIO.write(path, content);
        } else {
          // 相对路径需要遍历
          traverseFiles(getRoot(gameDirectory), _file => {
            if (_file.getPath().includes(path)) {
              if (!content) _file.delete();
              else JsonIO.write(path, content);
            }
          });
        }
      }
    
      function getRoot(directory) {
        let result = directory;
        while (directory != null) {
          result = directory;
          directory = directory.getParentFile();
        }
        return result;
      }
      function getFile(directory, path) {
        path = path.split("/").splice(1);
        for (let part of path) {
          if (directory.getName() == part) directory = file;
          else directory = directory.listFiles().find(file => file.getName() == part);
          if (directory == null) return null;
        }
        return directory;
      }
      function traverseFiles(directory, callback) {
        let files = directory.listFiles();
        if (files == null) return;
        for (let file of files) {
            if (file.isDirectory()) traverseFiles(file, callback);
            else callback(file);
        }
      }
    

    也有更省心的方法哟~

    traverseFiles(getRoot(Minecraft.getInstance().gameDirectory), file => file.delete());

    开玩笑的,文件操作绕不开java的io,只能对第一个文件生效。

    所以推荐getRoot(Minecraft.getInstance().gameDirectory).delete()呢。

    @BerriesAdmin

    let Minecraft = Java.loadClass("net.minecraft.client.Minecraft");
    Minecraft.getInstance().gameDirectory;
    

    其實可以直接改成

    Client.gameDirectory;
    
  • @BerriesAdmin

    let Minecraft = Java.loadClass("net.minecraft.client.Minecraft");
    Minecraft.getInstance().gameDirectory;
    

    其實可以直接改成

    Client.gameDirectory;
    

    @芒果凍布丁 我揣测Client可能被安全化了,所以loadClass,能直接用的话就安全多了呢。


相关推荐


  • 1 赞同
    1 帖子
    171 浏览
    忆然
    本文使用:CC-BY-NC-SA 4.0协议 kjs本身提供的物品注册比较有限,在注册某些kjs未提供的item的时候我们就需要用到createCustom 如果有需要的item注册可以在本文下方留言,会考虑更新 createCustom注册model是没有的,也就是你还得去写一份model.json(这部分可以参考原版wiki) 下面是使用createCustom去注册一个弓的例子 let $BowItem = Java.loadClass("net.minecraft.world.item.BowItem") let $Item$Properties = Java.loadClass("net.minecraft.world.item.Item$Properties") StartupEvents.registry("item", event => { event.createCustom("modid:item_name", () => { let properties = new $Item$Properties() //修改耐久 为0则无耐久属性 properties.durability(0) //修改最大堆叠数量 properties.stacksTo(1) //修改稀有度 properties.rarity("epic") //创建新的bowitem let item = new $BowItem(properties) //返回新的bowitem进行注册 return item }) })
  • 0 赞同
    4 帖子
    144 浏览
    QiHuang02Q
    这里贴一份1.21.1版本的实现
  • 美食再就业:用紫颂果慕斯进行定点传送

    灵感大王 kubejs 物品
    1
    3 赞同
    1 帖子
    50 浏览
    草莓呜咩B
    美食们可不止能饱腹而已! 紫颂果慕斯既然是紫颂果做的,就和传送脱不了关系? 现在可以将它在铁砧上改名为坐标,逗号间隔,吃了就可以传送到该坐标,是不是很方便呀。 不过还是要消耗一点点经验呢。 ItemEvents.foodEaten("kitchenkarrot:chorus_mousse", event => { let position = event.player.mainHandItem.displayName.getString().slice(1, -1).split(","); if (event.player.xpLevel < 3) event.player.statusMessage = "经验等级不足, 需要三级经验!"; else if (position.length == 3) { event.player.setPosition(position[0], position[1], position[2]); event.player.addXPLevels(-3); } }); 那么草莓慕斯会是什么效果呢?要是能召唤草莓军团就太帅了!