import mods.randomtweaker.botania.IManaItemHandler;
import crafttweaker.world.IWorld;
import crafttweaker.player.IPlayer;
import crafttweaker.item.IItemStack;
import crafttweaker.event.PlayerRightClickItemEvent; // 玩家右键物品事件
import mods.randomtweaker.botania.IManaItemHandler; // 想使用就必须导包
// 在这里默认环境里装有植物魔法 Mod (没装的给我说 Example 有问题我当场...)
events.onPlayerRightClickItem(function(event as PlayerRightClickItemEvent) {
var player as IPlayer = event.player; // 获取触发事件的玩家
var world as IWorld = event.world; // 获取触发事件的玩家所在的世界
// 在 Example 里, 玩家饰品栏里有魔力之戒, 快捷栏第二格有魔力石板, 都是满魔力
if(!world.remote && <minecraft:stick>.matches(event.item)) { // 先确保在服务端执行代码, 再判断手上物品是否为木棍
// 先介绍 getFullDiscountForTools 方法
// 此方法是获取玩家的魔力减免数值
// 最后一个参数一般来说填的是正在提取魔力的物品 (题外话 : 在植魔原本的代码里没看到最后一个参数有什么运用)
// 当然也可以填 null
var discount as float = IManaItemHandler.getFullDiscountForTools(player, <minecraft:stick>);
print(discount); // 没有穿上有魔力减免的装备为 0
// 这里我穿了全套的泰拉杠套装, 打印 0.2
// 获取玩家背包里的魔力容器 (更具体一点为实现了 IManaItem 类的物品)
var manaItemInInventory as IItemStack[] = IManaItemHandler.getManaItems(player);
for item in manaItemInInventory {
print(item.commandString);
// 打印 <botania:manatablet>.withTag({mana: 500000})
}
// 获取玩家饰品栏里的魔力物品
var manaItemInBaubleInventory as IItemStack[int] = IManaItemHandler.getManaBaubles(player);
for slot, item in manaItemInBaubleInventory {
print("Slot : " + slot + ", item : " + item.commandString);
// 打印 Slot : 1, item : <botania:manaring>.withTag({mana: 500000, playerHashcode: 90})
// 注意这里的 Slot : 1, slot 是从 0 开始数的, 所以第二个格的 slot 是 1
}
// requestMana 方法
// 这个方法会优先提取 manaToGet 值的数量, 不足就提取剩余魔力
// 一般而言, stack 参数填的都是提取或者发送魔力的物品, 在代码中则为跳过该物品, 不进行判断
// 以免发生自己扣自己魔力, 自己给自己魔力这种神奇操作
// 假设我们右键一次木棍 (魔法棒), 最低消耗 80 魔力最高 100 魔力, 然后在玩家面前两格生成一只羊
// 注意最后填的为 false, 意味着这是模拟提取魔力
if(IManaItemHandler.requestMana(<minecraft:stick>, player, 100, false) >= 80) {
// 注意这里填的为 true, 意味真实提取魔力
// 代码运行到这你会发现背包中的魔力石板的魔力减少了 100
// 对, 这个方法是优先检查背包里有无符合的魔力物品, 没有再去饰品栏里找
// 以下操纵魔力的方法都是这个规则
IManaItemHandler.requestMana(<minecraft:stick>, player, 100, true);
// player.horizontalFacing 获取到玩家方向, getOffset 方法为坐标偏移方法
// spawnEntity 为方便生成一个不需要自定义数据的实体的方法, 不需要先 create 个实体再 setPosition
<entity:minecraft:sheep>.spawnEntity(world, event.position.getOffset(player.horizontalFacing, 2));
}
// requestManaExact 方法更为严格
// 提取魔力的魔力容器里的魔力没有大于 manaToGet 的值就直接跳过, 如果背包和饰品栏一个符合条件的魔力容器都没有则返回 false
// 返回 false 意味着提取失败, 不会扣除玩家身上的魔力
// 最后的值一样填 false, 想知道玩家是否符合条件的时候都应该填 false
// 以免误扣除玩家的魔力 (玩家 : 我...)
// 精确扣除玩家 1w 魔力, 后发送一句话
if(IManaItemHandler.requestManaExact(<minecraft:stick>, player, 10000, false)) {
IManaItemHandler.requestManaExact(<minecraft:stick>, player, 10000, true);
player.sendChat("你被骗了!");
}
// requestManaForTool 方法
// 此方法会考虑魔力减免, 所以如果想要一个物品或者其他什么的消耗魔力考虑魔力减免
// 就使用此方法
// 上述例子中都有判断魔力足不足够, 其实不判断也行 (doge)
// 不判断的话方法最好不用 Exact 的, 原因可以自己思考一下
// 如果穿戴了全套泰拉套, 那就会减免 20% 的魔力, 也就是只需要 800 魔力了
var requsetAmount as int = IManaItemHandler.requestManaForTool(<minecraft:stick>, player, 1000, true);
print(requsetAmount); // 打印 1000, 如果魔力不足 1000, 则会打印 (剩余魔力 / (1 - 魔力减免百分比化小数))
// requestManaExactForTool 方法与就是 requestManaExact 方法考虑魔力减免的版本
IManaItemHandler.requestManaExactForTool(<minecraft:stick>, player, 10000, true);
// dispatchMana 方法与 requestMana 类似
// 当可容纳的魔力数量不足 manaToSend 的值时, 就会返回实际发送的魔力
print(IManaItemHandler.dispatchMana(<minecraft:stick>, player, 10000, true));
// 打印了 10000 代表了身上有剩余可容纳魔力大于 10000 的魔力容器 (这不废话吗, 上面的代码都消耗不止 1w 魔力)
// dispatchManaExact 跟 requestManaExact 类似
// 返回 false 意味着发送魔力失败
print(IManaItemHandler.dispatchManaExact(<minecraft:stick>, player, 10000, true));
// 只要有容量大于等于 1w 的魔力容器就会打印 true, 否则 false
}
});