15.5 本章例子
一、使玩家在潜行状态下无法使用指定物品
第一块是对着空气使用物品,第二块是对着方块使用物品
onEvent('item.right_click', event => {
if(event.player.crouching == true && event.item.id == "minecraft:diamond"){
event.cancel();// 取消该事件
}
})
onEvent('block.right_click', event => {
if(event.player.crouching == true && event.item.id == "minecraft:diamond"){
event.cancel();// 取消该事件
}
})
二、随机传送
// 最小及最大坐标
const minX = 1000;
const minZ = 1000;
const maxX = 10000;
const maxZ = 10000;
const minY = 100;
const maxY = 200;
// 是否随机取负值
const reverseNumber = true;
// 返回随机数
function getNumber(min,max){
let randNumber = Math.floor(Math.random() * (max - min + 1) ) + min;
if(Math.random() > 0.5 && reverseNumber){
randNumber = -randNumber;
}
return randNumber;
}
// 监听聊天事件,如果内容为 "!rtp" 就随机传送并给予缓降效果
onEvent('player.chat',function (event){
let input = event.message.trim();
if(input == "!rtp"){
event.player.setPosition(getNumber(minX,maxX), Math.abs(getNumber(minY,maxY)), getNumber(minZ,maxZ));// 设置坐标
event.player.statusMessage = `已将你传送到 x: ${event.player.x} y: ${event.player.y} z: ${event.player.z}`;// 玩家状态栏显示文字
event.player.potionEffects.add('minecraft:slow_falling', 600, 10, false, false);// 给予缓降效果
/**
* EntityPotionEffectsJS支持以下函数
* .clear() 清除药水效果
* .getActive() 返回具有的效果
* .isActive(MobEffect 效果) 返回是否具有给定效果
* .getDuration(MobEffect 效果) 返回给定效果剩余时间
* .add(MobEffect 效果, 整形 持续时间(tick), 整形 等级, 布尔值 是否为信标产生, 布尔值 是否显示粒子)
* 其中后三项,后两项,后一项均可省略不写,默认值对应为0,false, true.
* .isApplicable(MobEffect 效果) 返回给定效果是否能应用于当前实体上
*/
event.cancel();// 取消该事件,也就是说玩家发送的消息不会显示在其他玩家的公屏上
}
})
/**
* 另一种写法:监听物品右键事件,如果物品id为钻石则消耗一个钻石随机传送并冷却100秒
* 此处钻石可以替换为你想使用的物品
* 注:重进世界会刷新冷却时间
*/
onEvent('item.right_click',function (event){
if(event.player.mainHandItem.id == "minecraft:diamond"){
event.player.setPosition(getNumber(minX,maxX), Math.abs(getNumber(minY,maxY)), getNumber(minZ,maxZ));
event.player.statusMessage = `已将你传送到 x: ${event.player.x} y: ${event.player.y} z: ${event.player.z}`;
event.player.potionEffects.add('minecraft:slow_falling', 600, 10, false, false);
// 钻石数量减一
event.item.count--;
event.player.addItemCooldown('minecraft:diamond', 2000);
}
})
三、爆炸“法杖”
这里的烈焰棒只是一个"占位符",你可以换成你想使用的任何物品
// 绘制粒子函数
function drawParticle(event, intensity, particle) {
let start = event.getPlayer()
let target = event.player.rayTrace(1000)
if(target == null){
return false;
}
let rayx = target.block.x;
let rayy = target.block.y
let rayz = target.block.z;
let d = getDistance(start.x, start.y + 1, start.z, rayx, rayy, rayz)
for (let i = -1; i < d*intensity; i++) {
let delta = i / d
let x = (1 - delta) * start.x + delta * (rayx + 0.5)
let y = (1 - delta) * start.y + delta * (rayy + 0.5)
let z = (1 - delta) * start.z + delta * (rayz + 0.5)
event.server.runCommandSilent(`/particle ${particle} ${x} ${y} ${z} 0.1 0.1 0.1 0.01 5 normal`)
}
return true;
}
// 生成爆炸(使用火球实体来实现爆炸)
onEvent("item.right_click", event => {
if(event.player.rayTrace(1000).block != null && event.item.id == "minecraft:blaze_rod"){
let entity = event.world.createEntity('minecraft:fireball');
// 合并NBT设置爆炸等级
entity.mergeFullNBT('{ExplosionPower:2}')
entity.setPosition(event.player.rayTrace(1000).block.x, event.player.rayTrace(1000).block.y + 1, event.player.rayTrace(1000).block.z);
entity.setMotion(0, -20, 0);
entity.spawn();
drawParticle(event,0.5,"minecraft:spit");
// 添加物品冷却
event.player.addItemCooldown(event.item.id, 1000);
}
})
// 生成爆炸(使用ExplosionJS)
onEvent("item.right_click", event => {
if(event.player.rayTrace(1000).block != null && event.item.id == "minecraft:blaze_rod"){
let explosion = event.player.rayTrace(1000).block.createExplosion();
// 设置引爆者
explosion.exploder(event.player);
// 设置其他属性
explosion.strength(2.0);
explosion.causesFire(true);
// 引爆
explosion.explode();
// 绘制粒子
drawParticle(event,0.5,"minecraft:spit");
// 添加物品冷却
event.player.addItemCooldown(event.item.id, 1000);
}
})
四、扫地机器人
// 物品白名单
const whitelist = Ingredient.matchAny([
'minecraft:diamond', //单个物品
'minecraft:gold_ingot',//单个物品
'@tinkersconstruct', //mod物品示例
'minecraft:emerald'
])
// 执行一次间隔(注:该值必须大于1)
const minutes = 30;
// ======================================
var lastResult = [];
var totalResult = [];
var lastItemCount = 0;
var totalItemCount = 0;
function clearLag(server){
lastResult = [];
lastItemCount = 0;
server.getEntities("@e[type=item]").forEach(entity => {
if (!whitelist.test(entity.item.id)){
lastResult.push([entity.item.id, entity.item.count]);
totalResult.push([entity.item.id, entity.item.count]);
lastItemCount += entity.item.count;
entity.kill();
}
});
lastResult.sort();
totalResult.sort();
server.tell([Text.lightPurple('[扫地机器人]'), `本次共清除 ${lastItemCount} 个物品`]);
server.tell([Text.lightPurple('[扫地机器人]'), "在聊天框中输入 !clearLag last 来获取本次详细信息"]);
server.tell([Text.lightPurple('[扫地机器人]'), "在聊天框中输入 !clearLag total 来获取全部详细信息"]);
}
function countResult(result,event){
if(result != []){
result.forEach((singleResult, index) => {
event.server.tell([Text.lightPurple(`第 ${index + 1} 项 `), `${singleResult[0]} , 个数为 ${singleResult[1]}`])
})
}
}
onEvent('server.load', function (event) {
event.server.scheduleInTicks(100, event.server, function (callback0) {
callback0.data.tell([Text.lightPurple('[扫地机器人]'), `加载成功,使用 !clearlag help 查看帮助`]);
})
event.server.schedule((minutes - 1) * MINUTE, event.server, function (callback1) {
callback1.data.tell([Text.lightPurple('[扫地机器人]'), "1分钟后将清理地面掉落物"]);
callback1.data.schedule(MINUTE, callback1.data, function(callback2) {
clearLag(callback2.data);
})
callback1.reschedule();
})
})
// 聊天事件,只有有OP权限的文件才能执行查询/扫地
onEvent('player.chat',function (event){
let input = event.message.trim();
switch (input) {
case "!clearlag last":
if (event.player.op){// 判断玩家权限
countResult(lastResult,event);
}else{
event.player.tell([Text.lightPurple('[扫地机器人]'), "你没有权限这样做"]);
}
break;
case "!clearlag total":
if (event.player.op){
countResult(totalResult,event);
}else{
event.player.tell([Text.lightPurple('[扫地机器人]'), "你没有权限这样做"]);
}
break;
case "!clearlag help":
event.player.tell([Text.lightPurple('[扫地机器人]'), "扫地机器人 by Wudji@mcbbbs.net. Powered by KubeJS"]);
event.player.tell([Text.lightPurple('[扫地机器人]'), "在聊天框中输入 !clearLag last 来获取本次详细信息"]);
event.player.tell([Text.lightPurple('[扫地机器人]'), "在聊天框中输入 !clearLag total 来获取全部详细信息"]);
event.player.tell([Text.lightPurple('[扫地机器人]'), "在聊天框中输入 !clearLag 立即清除掉落物"]);
break;
case "!clearlag":
if (event.player.op){
clearLag(event.server);
}else{
event.player.tell([Text.lightPurple('[扫地机器人]'), "你没有权限这样做"]);
}
break;
}
})