本帖最后由 等枫亭丶烟雨阁 于 2022-5-4 19:11 编辑
求一款可以追踪玩家的插件,让普通玩家可以查询其他玩家的坐标或用指南针指向被追踪玩家,最好可设置查询冷却时间和查询所需金钱(vault),服务端为1.16.5LoliServer
求一款可以追踪玩家的插件,让普通玩家可以查询其他玩家的坐标或用指南针指向被追踪玩家,最好可设置查询冷却时间和查询所需金钱(vault),服务端为1.16.5LoliServer
https://www.mcbbs.net/thread-1163103-1-1.html
冷却与查询需搭配其他插件。
冷却与查询需搭配其他插件。
名副其实 发表于 2022-4-29 23:23
https://www.mcbbs.net/thread-1163103-1-1.html
冷却与查询需搭配其他插件。
了解到该插件只能设置一个逃跑者,但需求是要可以多人被定位,请问如何实现这个情况
本帖最后由 632b781af97903 于 2022-4-30 01:48 编辑
你就说个vault这个又不负责存储金币
我也不知道你用的ESS还是CMI 就没弄金币功能
插件
Compassx.jar
(3.53 KB, 下载次数: 3)
命令
/compassx reload 重载#权限op
/compassx <player> 将指南针设置为该玩家的位置#无权限
使用指南针将坐标显示到手持指南针已经实际测试过 1.16.5可以用
复制代码
你就说个vault这个又不负责存储金币
我也不知道你用的ESS还是CMI 就没弄金币功能
插件

/compassx reload 重载#权限op
/compassx <player> 将指南针设置为该玩家的位置#无权限
使用指南针将坐标显示到手持指南针已经实际测试过 1.16.5可以用
- # 查询间隔冷却 (单位 秒)
- delay: 10
- message:
- # 下列 3 个信息 设置为 '' 则不发送信息
- se: '&c锁定玩家&r: <player>'
- ce: '&b冷却&r: <delay>'
- ou: '&c玩家离线'
- # 显示冷却
- re: true
632b781af97903 发表于 2022-4-30 01:45
你就说个vault这个又不负责存储金币
我也不知道你用的ESS还是CMI 就没弄金币功能
这是大佬临时写的吗很厉害欸,但好像使用指令后指南针并没有指向该玩家欸
等枫亭丶烟雨阁 发表于 2022-4-30 02:43
这是大佬临时写的吗很厉害欸,但好像使用指令后指南针并没有指向该玩家欸 ...
我这边再次测试了一遍,似乎是要点击两次才会显示 (也影响不大)
这一次改成了初始就显示这一次我这边测试是完全没问题,还是用不了就不修了,太麻烦了
以及如果可以用,那么你另外要的那个杀敌按照 百分比 掉落/获得金币的
就直接发你Q,论坛交流起来太慢了,我怕写了半天白写
插件





632b781af97903 发表于 2022-4-30 11:09
我这边再次测试了一遍,似乎是要点击两次才会显示 (也影响不大)
这一次改成了初始就显示这一次我这边测 ...
可以锁定了,但问题挺多的,由于原版游戏的特性导致指南针在下界和末地乱转无法定位,而且服务器里有多世界,在主世界定位玩家后被定位的玩家回到主城并不会取消定位而是将主城的坐标投影到主世界,举个例子,玩家在主城这个世界的(0,0)坐标上,那么定位者会发现指南针指向了主世界的(0,0)点
讲点细节啊
比如说,目标玩家不在同一世界时怎么处理,此时是否扣钱并计入冷却,是否显示坐标,是实时追踪还是只定位到使用指南针时那一瞬间的坐标
比如说,目标玩家不在同一世界时怎么处理,此时是否扣钱并计入冷却,是否显示坐标,是实时追踪还是只定位到使用指南针时那一瞬间的坐标
无敌三脚猫 发表于 2022-4-30 13:21
讲点细节啊
比如说,目标玩家不在同一世界时怎么处理,此时是否扣钱并计入冷却,是否显示坐标,是实时追踪 ...
希望是能做出和几年前饥饿游戏服务器里的那个定位指南针一样实时追踪,指向该玩家的同时可以用ACTIONBAR将定位者和被定位者的距离显示出来,并且可以自定义冷却时间和金钱扣除数量,如果玩家与目标玩家不在同一世界将会发送提示说明不在同世界,如果被定位玩家离开当前世界将会提示目标玩家离开世界并断开实时追踪,希望可以自定义提示语和世界使用限制
讲了这么多要求会不会有点难搞啊QwQ
等枫亭丶烟雨阁 发表于 2022-4-30 13:28
希望是能做出和几年前饥饿游戏服务器里的那个定位指南针一样实时追踪,指向该玩家的同时可以用ACTIONBAR将 ...
不在同一世界时,使用指南针是否扣钱并计入冷却?
同时追踪多个玩家的话要怎么处理呢?还挺难想的,比如这个时候ACTIONBAR显示谁的名字呢?还是禁止玩家拿两个指南针追踪两个玩家呢?
本帖最后由 等枫亭丶烟雨阁 于 2022-4-30 15:53 编辑
不在同一世界时不计入冷却也不扣除金钱,同时追踪玩家只是一个误区,一个玩家只能同时追踪一个玩家,我说的同时多个玩家是说可以同时A追踪B,C追踪D,而上面有人给我推荐的Dream追杀插件是只能做到A,B,C,同时追踪D,只能存在一个被追踪者且其他所有玩家都将成为追踪者
——另外可不可以让普通玩家在定位处于ess隐身状态下的玩家是显示被定位者不在线,我不希望其他玩家通过定位的方法来鉴定管理员是否在服务器中隐身
无敌三脚猫 发表于 2022-4-30 15:04
不在同一世界时,使用指南针是否扣钱并计入冷却?
同时追踪多个玩家的话要怎么处理呢?还挺难想的,比如 ...
不在同一世界时不计入冷却也不扣除金钱,同时追踪玩家只是一个误区,一个玩家只能同时追踪一个玩家,我说的同时多个玩家是说可以同时A追踪B,C追踪D,而上面有人给我推荐的Dream追杀插件是只能做到A,B,C,同时追踪D,只能存在一个被追踪者且其他所有玩家都将成为追踪者
——另外可不可以让普通玩家在定位处于ess隐身状态下的玩家是显示被定位者不在线,我不希望其他玩家通过定位的方法来鉴定管理员是否在服务器中隐身
等枫亭丶烟雨阁 发表于 2022-4-30 15:47
不在同一世界时不计入冷却也不扣除金钱,同时追踪玩家只是一个误区,一个玩家只能同时追踪一个玩家,我说 ...
三个选项:
——放弃在地狱、末地进行追踪
——使用磁石指南针的机制,可以在地狱、末地进行追踪,但是用这种方法,磁石指南针拿在手里的时候,因为要不停修改nbt,所以会不可避免地抽搐,就像是手里拿着经验修补的装备吸经验那样
——我写一个coremod,安装在客户端之后令地狱、末地的指南针不再乱转
无敌三脚猫 发表于 2022-4-30 19:54
三个选项:
——放弃在地狱、末地进行追踪
——使用磁石指南针的机制,可以在地狱、末地进行追踪,但是用 ...
第三个效果最好,如果大佬能做到十分感谢
等枫亭丶烟雨阁 发表于 2022-4-30 20:06
第三个效果最好,如果大佬能做到十分感谢

然后是cnpc的players脚本
- var packet=Java.type("net.minecraft.network.play.server.SWorldSpawnChangedPacket")
- var titlepacket=Java.type("net.minecraft.network.play.server.STitlePacket")
- var text=Java.type("net.minecraft.util.text.StringTextComponent")
- var ess=Java.type("org.bukkit.Bukkit").getPluginManager().getPlugin("Essentials")
- var BigDecimal=Java.type("java.math.BigDecimal")
- var compass=Java.type("net.minecraft.item.Items").field_151111_aL
- var gui=Java.type("noppes.npcs.api.NpcAPI").Instance().createCustomGui(1,130,32,false)
- gui.addTextField(1,0,5,100,15).setHoverText("输入玩家名字")
- gui.addTexturedRect(2,"minecraft:textures/gui/social_interactions.png",102,5,14,14,241,0)
- //在gui内显示要花的钱,你下面要改的话这里也要改
- gui.addTexturedButton(3,"",102,5,14,14,"minecraft:textures/gui/social_interactions.png",241,40).setHoverText("花费§610¥§f定位此玩家")
- gui.getComponent(3)
- function interact(e){
- var p=e.player
- var mcp=e.player.getMCEntity()
- if(mcp.func_233631_a_(compass)&&!mcp.func_184811_cZ().func_185141_a(compass)){
- p.showCustomGui(gui)
- mcp.func_184811_cZ().func_185145_a(compass,20)
- }
- }
- function customGuiButton(e){
- var target=e.gui.getComponent(1).getText()
- var player=e.player
- player.closeGui()
- if(target==""){
- player.message("§4玩家名不能为空")
- }
- else if(target==player.name){
- player.message("§4不能选自己为目标")
- }
- else{
- var essuser=ess.getUser(player.name)
- //要花的钱
- var cost=new BigDecimal(10)
- if(essuser.getMoney().compareTo(cost)==1){
- if(findplayer(player,target)){
- e.player.getNbt().getString("target")
- //每4tick,也就是每0.2秒进行一次定位,你可以改得更小
- player.getTimers().forceStart(1,4,true)
- essuser.setMoney(essuser.getMoney().subtract(cost))
- e.player.getNbt().putString("target",target)
- //开始定位的提示
- player.message("§b追猎开始!")
- //开始定位后,计入200tick冷却
- player.getMCEntity().func_184811_cZ().func_185145_a(compass,200)}
- //定位失败的提示
- else player.message("§4"+target+"不在这个世界……")
- }
- else player.message("金币不足")
- }
- }
- function logout(e){
- e.player.getTimers().clear()
- }
- function timer(e){
- var t=e.player.getNbt().getString("target")
- if(!findplayer(e.player,t)){
- //追踪途中定位失败的提示
- e.player.message(t+"离开了这个世界,跟丢了……")
- e.player.getTimers().clear()
- }
- }
- function findplayer(p,t){
- var target=p.world.getPlayer(t)
- if(target!=null){
- if(!ess.getUser(target.name).isVanished()){
- p.getMCEntity().field_71135_a.func_147359_a(new packet(target.getMCEntity().func_233580_cy_(),0))
- //这里是ACTIONBAR
- p.getMCEntity().field_71135_a.func_147359_a(new titlepacket(titlepacket.Type.ACTIONBAR,new text("距目标 "+t+" "+parseInt(target.pos.distanceTo(p.pos))+"m")))
- return true}}
- return false
- }
本帖最后由 等枫亭丶烟雨阁 于 2022-5-1 21:29 编辑
哇大佬幸苦了,cnpc真是被您开发到了极致,但仍有以下几个问题:
1、当玩家拥有的金钱数量刚好等于所需金钱时会显示金币不足,必须大于才能进行定位
2、被定位者离开当前世界会有提示,定位者离开当前世界却没有对应的定位取消提示
3、假如我想将定位冷却设置为1小时一次(假如),但目前有一个bug,定位者定位后传送到别的世界会导致冷却重置,即可以再次右键指南针,冷却机制不完善
4、被定位玩家离开世界后会有提示发送给定位者,定位者的ActionBar也会消失字幕,但指南针却一直指向者被定位者离开世界前的最后位置,可否设置为被定位玩家离开世界后指南针将不再会指向被定位者离开世界前的最后位置而是之间恢复到未定位玩家时的指向方向
无敌三脚猫 发表于 2022-5-1 17:45
再次说明,这是装在客户端的,如果装在服务端不会导致故障,但也没什么效果就是了
然后是cnpc的players脚 ...
哇大佬幸苦了,cnpc真是被您开发到了极致,但仍有以下几个问题:
1、当玩家拥有的金钱数量刚好等于所需金钱时会显示金币不足,必须大于才能进行定位
2、被定位者离开当前世界会有提示,定位者离开当前世界却没有对应的定位取消提示
3、假如我想将定位冷却设置为1小时一次(假如),但目前有一个bug,定位者定位后传送到别的世界会导致冷却重置,即可以再次右键指南针,冷却机制不完善
4、被定位玩家离开世界后会有提示发送给定位者,定位者的ActionBar也会消失字幕,但指南针却一直指向者被定位者离开世界前的最后位置,可否设置为被定位玩家离开世界后指南针将不再会指向被定位者离开世界前的最后位置而是之间恢复到未定位玩家时的指向方向
本帖最后由 无敌三脚猫 于 2022-5-3 21:09 编辑
我还加了些东西
首先目标死亡和目标离开世界,要是用同一个句子肯定不恰当,目标被其它角色杀死跟亲手杀死目标也要区分开来
然后上次判断玩家杀玩家的脚本其实有缺陷,不应该看最后致死的伤害来源,就比如玩家被其他玩家打了一拳,然后摔死,按照原来的写**认为没有击杀者,更好的写法是像原版的死亡提示那样,获取最后一个攻击死者的玩家,这次就一起改了
var packet=Java.type("net.minecraft.network.play.server.SWorldSpawnChangedPacket")
var titlepacket=Java.type("net.minecraft.network.play.server.STitlePacket")
var PlayerData=Java.type("noppes.npcs.controllers.data.PlayerData")
var text=Java.type("net.minecraft.util.text.StringTextComponent")
var ess=Java.type("org.bukkit.Bukkit").getPluginManager().getPlugin("Essentials")
var BigDecimal=Java.type("java.math.BigDecimal")
var compass=Java.type("net.minecraft.item.Items").field_151111_aL
var HALF_UP=Java.type("java.math.RoundingMode").HALF_UP
var MathContext=Java.type("java.math.MathContext")
var API=Java.type("noppes.npcs.api.NpcAPI").Instance()
var spawnpoint=new packet(API.getIWorld("minecraft:overworld").getMCWorld().func_241135_u_(),0)
var gui=Java.type("noppes.npcs.api.NpcAPI").Instance().createCustomGui(1,130,32,false)
gui.addTextField(1,0,5,100,15).setHoverText("输入玩家名字")
gui.addTexturedRect(2,"minecraft:textures/gui/social_interactions.png",102,5,14,14,241,0)
//在gui内显示要花的钱,你下面要改的话这里也要改
gui.addTexturedButton(3,"",102,5,14,14,"minecraft:textures/gui/social_interactions.png",241,40).setHoverText("花费§610¥§f定位此玩家")
gui.getComponent(3)
function interact(e){
var p=e.player
var mcp=e.player.getMCEntity()
if(mcp.func_233631_a_(compass)&&!mcp.func_184811_cZ().func_185141_a(compass)){
var timers=PlayerData.get(mcp).timers
var timermap=timers.getClass().getDeclaredField("timers")
timermap.setAccessible(true)
var cooldown=timermap.get(timers).get(2)
if(cooldown!=null){
var ticks=cooldown.getClass().getDeclaredField("ticks")
ticks.setAccessible(true)
ticks=ticks.getInt(cooldown)
p.world.broadcast("正在冷却,剩余"+ticks/20+"s")
mcp.func_184811_cZ().func_185145_a(compass,ticks)
return
}
p.showCustomGui(gui)
mcp.func_184811_cZ().func_185145_a(compass,20)
}
}
function customGuiButton(e){
var target=e.gui.getComponent(1).getText()
var player=e.player
player.closeGui()
if(target==""){
player.message("§4玩家名不能为空")
}
else if(target==player.name){
player.message("§4不能选自己为目标")
}
else{
var essuser=ess.getUser(player.name)
//要花的钱
var cost=new BigDecimal(10)
if(essuser.getMoney().compareTo(cost)!=-1){
if(findplayer(player,target)){
//每4tick,也就是每0.2秒进行一次定位,你可以改得更小
player.getTimers().forceStart(1,4,true)
essuser.setMoney(essuser.getMoney().subtract(cost))
e.player.getNbt().putString("target",target)
//开始定位的提示
player.message("§b追猎开始!")
//开始定位后,计入200tick冷却
player.getTimers().forceStart(2,200,false)
player.getMCEntity().func_184811_cZ().func_185145_a(compass,200)}
//定位失败的提示
else player.message("§4"+target+"不在这个世界……")
}
else player.message("金币不足")
}
}
function logout(e){
e.player.getTimers().stop(1)
}
function timer(e){
if(e.id==1){
var t=e.player.getNbt().getString("target")
if(!findplayer(e.player,t)){
//追踪途中定位失败的提示
e.player.message(t+"逃离了这个世界,定位终止")
e.player.getTimers().stop(1)
e.player.getMCEntity().field_71135_a.func_147359_a(spawnpoint)
}
}
else if(e.id==2){
e.player.message("指南针冷却完毕,可再次进行定位")
e.player.playSound("item.lodestone_compass.lock",1,1)
}
}
function findplayer(p,t){
var target=p.world.getPlayer(t)
if(target!=null){
if(!ess.getUser(target.name).isVanished()){
p.getMCEntity().field_71135_a.func_147359_a(new packet(target.getMCEntity().func_233580_cy_(),0))
//这里是ACTIONBAR
p.getMCEntity().field_71135_a.func_147359_a(new titlepacket(titlepacket.Type.ACTIONBAR,new text("距目标 "+t+" "+parseInt(target.pos.distanceTo(p.pos))+"m")))
return true}}
return false
}
function died(e){
var player=e.player
var playername=player.name
var killer=player.getMCEntity().field_70717_bb
if(killer!=null){
var killername=killer.func_200200_C_().getString()
var players=player.world.getAllPlayers()
for(var i in players){
if(players.getTimers().has(1)&&players.getNbt().getString("target")==playername){
players.getTimers().stop(1)
players.getMCEntity().field_71135_a.func_147359_a(spawnpoint)
if(players.name==killername){
players.message("恭喜你亲手杀死了目标")
var server=killer.func_184102_h()
//放个烟花庆祝一下
server.func_195571_aL().func_197059_a(server.func_195573_aM().func_197031_a(),"execute at "+playername+" run summon firework_rocket ~ ~ ~ {FireworksItem:{id:firework_rocket,Count:1,tag:{Fireworks:{Explosions:[{Type:4,Trail:1,Colors:[I;11743532,14602026],FadeColors:[I;4312372,14602026]}]}}}}")
}
else players.message("人头被"+killername+"抢走了,终止定位")
}
}
var userk=ess.getUser(killername)
var userp=ess.getUser(playername)
var award=userp.getMoney().multiply(new BigDecimal(0.1)).setScale(0,HALF_UP)
userk.setMoney(userk.getMoney().add(award).setScale(0,HALF_UP))
userp.setMoney(userp.getMoney().subtract(award).setScale(0,HALF_UP))
player.world.getPlayer(killername).message("你击杀了"+playername+"并获得了§e"+award+"金币¥")
player.message("你被"+killername+"击杀了并损失了"+award+"金币¥")
}
else{
var players=player.world.getAllPlayers()
for(var i in players){
if(players.getTimers().has(1)&&players.getNbt().getString("target")==playername){
players.getTimers().stop(1)
players.getMCEntity().field_71135_a.func_147359_a(spawnpoint)
players.message("目标意外死亡,终止定位")
}
}
}
}
另外,cnpc的players脚本里没有监听玩家切换世界的事件,只有forge有,所以下面这部分是forge脚本
常规的切换世界是一种事件,玩家从末地的传送门返回主世界以及死亡后重生,是另一种事件,所以这里有两个事件
第三个事件是生物受伤事件,因为我打算在杀死目标玩家之后放个烟花,装饰性质的烟花肯定不能有伤害,所以就在这里写个事件取消无主烟花的伤害
function playerEventPlayerChangedDimensionEvent(e){
var timers=e.entity.getTimers()
if(timers.has(1)){
timers.stop(1)
e.entity.message("你离开了目标所在世界,终止定位")
}
}
function playerEventClone(e){
var timers=e.entity.getTimers()
if(timers.has(1)){
timers.stop(1)
e.entity.message("你离开了目标所在世界,终止定位")
}
}
function livingAttackEvent(e){
var source=e.event.getSource()
if(source.func_76355_l()=="fireworks"){
if(source.func_76346_g()==null)
e.setCanceled(true)
}
}
我不能理解
我不知道这篇回复里有什么神秘的符号,每次我回复的时候都提示然后我把复制代码删掉之后就能发出来了,不过后面一截的字全都变成了斜体?莫名其妙
等枫亭丶烟雨阁 发表于 2022-5-1 20:22
哇大佬幸苦了,cnpc真是被您开发到了极致,但仍有以下几个问题:
1、当玩家拥有的金钱数量刚好等于所需金 ...
我还加了些东西
首先目标死亡和目标离开世界,要是用同一个句子肯定不恰当,目标被其它角色杀死跟亲手杀死目标也要区分开来
然后上次判断玩家杀玩家的脚本其实有缺陷,不应该看最后致死的伤害来源,就比如玩家被其他玩家打了一拳,然后摔死,按照原来的写**认为没有击杀者,更好的写法是像原版的死亡提示那样,获取最后一个攻击死者的玩家,这次就一起改了
var packet=Java.type("net.minecraft.network.play.server.SWorldSpawnChangedPacket")
var titlepacket=Java.type("net.minecraft.network.play.server.STitlePacket")
var PlayerData=Java.type("noppes.npcs.controllers.data.PlayerData")
var text=Java.type("net.minecraft.util.text.StringTextComponent")
var ess=Java.type("org.bukkit.Bukkit").getPluginManager().getPlugin("Essentials")
var BigDecimal=Java.type("java.math.BigDecimal")
var compass=Java.type("net.minecraft.item.Items").field_151111_aL
var HALF_UP=Java.type("java.math.RoundingMode").HALF_UP
var MathContext=Java.type("java.math.MathContext")
var API=Java.type("noppes.npcs.api.NpcAPI").Instance()
var spawnpoint=new packet(API.getIWorld("minecraft:overworld").getMCWorld().func_241135_u_(),0)
var gui=Java.type("noppes.npcs.api.NpcAPI").Instance().createCustomGui(1,130,32,false)
gui.addTextField(1,0,5,100,15).setHoverText("输入玩家名字")
gui.addTexturedRect(2,"minecraft:textures/gui/social_interactions.png",102,5,14,14,241,0)
//在gui内显示要花的钱,你下面要改的话这里也要改
gui.addTexturedButton(3,"",102,5,14,14,"minecraft:textures/gui/social_interactions.png",241,40).setHoverText("花费§610¥§f定位此玩家")
gui.getComponent(3)
function interact(e){
var p=e.player
var mcp=e.player.getMCEntity()
if(mcp.func_233631_a_(compass)&&!mcp.func_184811_cZ().func_185141_a(compass)){
var timers=PlayerData.get(mcp).timers
var timermap=timers.getClass().getDeclaredField("timers")
timermap.setAccessible(true)
var cooldown=timermap.get(timers).get(2)
if(cooldown!=null){
var ticks=cooldown.getClass().getDeclaredField("ticks")
ticks.setAccessible(true)
ticks=ticks.getInt(cooldown)
p.world.broadcast("正在冷却,剩余"+ticks/20+"s")
mcp.func_184811_cZ().func_185145_a(compass,ticks)
return
}
p.showCustomGui(gui)
mcp.func_184811_cZ().func_185145_a(compass,20)
}
}
function customGuiButton(e){
var target=e.gui.getComponent(1).getText()
var player=e.player
player.closeGui()
if(target==""){
player.message("§4玩家名不能为空")
}
else if(target==player.name){
player.message("§4不能选自己为目标")
}
else{
var essuser=ess.getUser(player.name)
//要花的钱
var cost=new BigDecimal(10)
if(essuser.getMoney().compareTo(cost)!=-1){
if(findplayer(player,target)){
//每4tick,也就是每0.2秒进行一次定位,你可以改得更小
player.getTimers().forceStart(1,4,true)
essuser.setMoney(essuser.getMoney().subtract(cost))
e.player.getNbt().putString("target",target)
//开始定位的提示
player.message("§b追猎开始!")
//开始定位后,计入200tick冷却
player.getTimers().forceStart(2,200,false)
player.getMCEntity().func_184811_cZ().func_185145_a(compass,200)}
//定位失败的提示
else player.message("§4"+target+"不在这个世界……")
}
else player.message("金币不足")
}
}
function logout(e){
e.player.getTimers().stop(1)
}
function timer(e){
if(e.id==1){
var t=e.player.getNbt().getString("target")
if(!findplayer(e.player,t)){
//追踪途中定位失败的提示
e.player.message(t+"逃离了这个世界,定位终止")
e.player.getTimers().stop(1)
e.player.getMCEntity().field_71135_a.func_147359_a(spawnpoint)
}
}
else if(e.id==2){
e.player.message("指南针冷却完毕,可再次进行定位")
e.player.playSound("item.lodestone_compass.lock",1,1)
}
}
function findplayer(p,t){
var target=p.world.getPlayer(t)
if(target!=null){
if(!ess.getUser(target.name).isVanished()){
p.getMCEntity().field_71135_a.func_147359_a(new packet(target.getMCEntity().func_233580_cy_(),0))
//这里是ACTIONBAR
p.getMCEntity().field_71135_a.func_147359_a(new titlepacket(titlepacket.Type.ACTIONBAR,new text("距目标 "+t+" "+parseInt(target.pos.distanceTo(p.pos))+"m")))
return true}}
return false
}
function died(e){
var player=e.player
var playername=player.name
var killer=player.getMCEntity().field_70717_bb
if(killer!=null){
var killername=killer.func_200200_C_().getString()
var players=player.world.getAllPlayers()
for(var i in players){
if(players.getTimers().has(1)&&players.getNbt().getString("target")==playername){
players.getTimers().stop(1)
players.getMCEntity().field_71135_a.func_147359_a(spawnpoint)
if(players.name==killername){
players.message("恭喜你亲手杀死了目标")
var server=killer.func_184102_h()
//放个烟花庆祝一下
server.func_195571_aL().func_197059_a(server.func_195573_aM().func_197031_a(),"execute at "+playername+" run summon firework_rocket ~ ~ ~ {FireworksItem:{id:firework_rocket,Count:1,tag:{Fireworks:{Explosions:[{Type:4,Trail:1,Colors:[I;11743532,14602026],FadeColors:[I;4312372,14602026]}]}}}}")
}
else players.message("人头被"+killername+"抢走了,终止定位")
}
}
var userk=ess.getUser(killername)
var userp=ess.getUser(playername)
var award=userp.getMoney().multiply(new BigDecimal(0.1)).setScale(0,HALF_UP)
userk.setMoney(userk.getMoney().add(award).setScale(0,HALF_UP))
userp.setMoney(userp.getMoney().subtract(award).setScale(0,HALF_UP))
player.world.getPlayer(killername).message("你击杀了"+playername+"并获得了§e"+award+"金币¥")
player.message("你被"+killername+"击杀了并损失了"+award+"金币¥")
}
else{
var players=player.world.getAllPlayers()
for(var i in players){
if(players.getTimers().has(1)&&players.getNbt().getString("target")==playername){
players.getTimers().stop(1)
players.getMCEntity().field_71135_a.func_147359_a(spawnpoint)
players.message("目标意外死亡,终止定位")
}
}
}
}
另外,cnpc的players脚本里没有监听玩家切换世界的事件,只有forge有,所以下面这部分是forge脚本
常规的切换世界是一种事件,玩家从末地的传送门返回主世界以及死亡后重生,是另一种事件,所以这里有两个事件
第三个事件是生物受伤事件,因为我打算在杀死目标玩家之后放个烟花,装饰性质的烟花肯定不能有伤害,所以就在这里写个事件取消无主烟花的伤害
function playerEventPlayerChangedDimensionEvent(e){
var timers=e.entity.getTimers()
if(timers.has(1)){
timers.stop(1)
e.entity.message("你离开了目标所在世界,终止定位")
}
}
function playerEventClone(e){
var timers=e.entity.getTimers()
if(timers.has(1)){
timers.stop(1)
e.entity.message("你离开了目标所在世界,终止定位")
}
}
function livingAttackEvent(e){
var source=e.event.getSource()
if(source.func_76355_l()=="fireworks"){
if(source.func_76346_g()==null)
e.setCanceled(true)
}
}
我不能理解
我不知道这篇回复里有什么神秘的符号,每次我回复的时候都提示
412 Precondition Failed
The precondition on the request for the URL evaluated to false. Sorry for the inconvenience.
Please report this message and include the following information to us.
Thank you very much!
- 这个框框
无敌三脚猫 发表于 2022-5-3 21:08
我还加了些东西
首先目标死亡和目标离开世界,要是用同一个句子肯定不恰当,目标被其它角色杀死跟亲手杀死 ...
- Tue May 03 22:08:32 CST 2022 tab 1:
- javax.script.ScriptException: TypeError: players.getTimers is not a function in <eval> at line number 113
- at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:470)
- at jdk.nashorn.api.scripting.NashornScriptEngine.invokeImpl(NashornScriptEngine.java:392)
- at jdk.nashorn.api.scripting.NashornScriptEngine.invokeFunction(NashornScriptEngine.java:190)
- at noppes.npcs.controllers.ScriptContainer.run(ScriptContainer.java:151)
- at noppes.npcs.controllers.ScriptContainer.run(ScriptContainer.java:108)
- at noppes.npcs.controllers.data.PlayerScriptData.runScript(PlayerScriptData.java:88)
- at noppes.npcs.EventHooks.onPlayerDeath(EventHooks.java:353)
- at noppes.npcs.ScriptPlayerEventHandler.invoke(ScriptPlayerEventHandler.java:222)
- at net.minecraftforge.eventbus.ASMEventHandler_231_ScriptPlayerEventHandler_invoke_LivingDeathEvent.invoke(.dynamic)
- at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:85)
- at net.minecraftforge.eventbus.EventBus.post(EventBus.java:302)
- at net.minecraftforge.eventbus.EventBus.post(EventBus.java:283)
- at net.minecraftforge.common.ForgeHooks.onLivingDeath(ForgeHooks.java:382)
- at net.minecraft.entity.player.ServerPlayerEntity.func_70645_a(ServerPlayerEntity.java:596)
- at net.minecraft.entity.LivingEntity.func_70097_a(LivingEntity.java:1284)
- at net.minecraft.entity.player.PlayerEntity.func_70097_a(PlayerEntity.java:858)
- at net.minecraft.entity.player.ServerPlayerEntity.func_70097_a(ServerPlayerEntity.java:762)
- at com.mrcrayfish.guns.world.ProjectileExplosion.func_77278_a(ProjectileExplosion.java:146)
- at com.mrcrayfish.guns.entity.ProjectileEntity.createExplosion(ProjectileEntity.java:783)
- at com.mrcrayfish.guns.entity.GrenadeEntity.onHitEntity(GrenadeEntity.java:33)
- at com.mrcrayfish.guns.entity.ProjectileEntity.onHit(ProjectileEntity.java:481)
- at com.mrcrayfish.guns.entity.ProjectileEntity.func_70071_h_(ProjectileEntity.java:263)
- at net.minecraft.world.server.ServerWorld.func_217479_a(ServerWorld.java:776)
- at net.minecraft.world.World.func_217390_a(World.java:814)
- at net.minecraft.world.server.ServerWorld.func_72835_b(ServerWorld.java:549)
- at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:1036)
- at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:334)
- at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:929)
- at net.minecraft.server.MinecraftServer.func_240802_v_(MinecraftServer.java:762)
- at net.minecraft.server.MinecraftServer.func_240783_a_(MinecraftServer.java:264)
- at java.lang.Thread.run(Unknown Source)
- Caused by: <eval>:113 TypeError: players.getTimers is not a function
- at jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:57)
- at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:213)
- at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:185)
- at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:172)
- at jdk.nashorn.internal.runtime.Undefined.lookup(Undefined.java:102)
- at jdk.nashorn.internal.runtime.linker.NashornLinker.getGuardedInvocation(NashornLinker.java:106)
- at jdk.nashorn.internal.runtime.linker.NashornLinker.getGuardedInvocation(NashornLinker.java:98)
- at jdk.internal.dynalink.support.CompositeTypeBasedGuardingDynamicLinker.getGuardedInvocation(CompositeTypeBasedGuardingDynamicLinker.java:176)
- at jdk.internal.dynalink.support.CompositeGuardingDynamicLinker.getGuardedInvocation(CompositeGuardingDynamicLinker.java:124)
- at jdk.internal.dynalink.support.LinkerServicesImpl.getGuardedInvocation(LinkerServicesImpl.java:154)
- at jdk.internal.dynalink.DynamicLinker.relink(DynamicLinker.java:253)
- at jdk.nashorn.internal.scripts.Script$Recompilation$647$3416A$\^eval\_.died(<eval>:113)
- at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:639)
- at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494)
- at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
- at jdk.nashorn.api.scripting.ScriptObjectMirror.callMember(ScriptObjectMirror.java:199)
- at jdk.nashorn.api.scripting.NashornScriptEngine.invokeImpl(NashornScriptEngine.java:386)
- ... 29 more
这个报错是脚本魔杖里的
等枫亭丶烟雨阁 发表于 2022-5-3 22:12
大佬幸苦了,但好像出了点问题,加入脚本后出现了如下报错
这个报错是脚本魔杖里的
...
诶?那里我没改吗?
我又进游戏里看了一眼,我明明是改了的,这里发的却是没改的版本,奇怪
既然再发一次,我再试试把代码放进代码框里吧
- var packet=Java.type("net.minecraft.network.play.server.SWorldSpawnChangedPacket")
- var titlepacket=Java.type("net.minecraft.network.play.server.STitlePacket")
- var PlayerData=Java.type("noppes.npcs.controllers.data.PlayerData")
- var text=Java.type("net.minecraft.util.text.StringTextComponent")
- var ess=Java.type("org.bukkit.Bukkit").getPluginManager().getPlugin("Essentials")
- var BigDecimal=Java.type("java.math.BigDecimal")
- var compass=Java.type("net.minecraft.item.Items").field_151111_aL
- var HALF_UP=Java.type("java.math.RoundingMode").HALF_UP
- var MathContext=Java.type("java.math.MathContext")
- var API=Java.type("noppes.npcs.api.NpcAPI").Instance()
- var spawnpoint=new packet(API.getIWorld("minecraft:overworld").getMCWorld().func_241135_u_(),0)
- var gui=Java.type("noppes.npcs.api.NpcAPI").Instance().createCustomGui(1,130,32,false)
- gui.addTextField(1,0,5,100,15).setHoverText("输入玩家名字")
- gui.addTexturedRect(2,"minecraft:textures/gui/social_interactions.png",102,5,14,14,241,0)
- //在gui内显示要花的钱,你下面要改的话这里也要改
- gui.addTexturedButton(3,"",102,5,14,14,"minecraft:textures/gui/social_interactions.png",241,40).setHoverText("花费§610¥§f定位此玩家")
- gui.getComponent(3)
- function interact(e){
- var p=e.player
- var mcp=e.player.getMCEntity()
- if(mcp.func_233631_a_(compass)&&!mcp.func_184811_cZ().func_185141_a(compass)){
- var timers=PlayerData.get(mcp).timers
- var timermap=timers.getClass().getDeclaredField("timers")
- timermap.setAccessible(true)
- var cooldown=timermap.get(timers).get(2)
- if(cooldown!=null){
- var ticks=cooldown.getClass().getDeclaredField("ticks")
- ticks.setAccessible(true)
- ticks=ticks.getInt(cooldown)
- p.world.broadcast("正在冷却,剩余"+ticks/20+"s")
- mcp.func_184811_cZ().func_185145_a(compass,ticks)
- return
- }
- p.showCustomGui(gui)
- mcp.func_184811_cZ().func_185145_a(compass,20)
- }
- }
- function customGuiButton(e){
- var target=e.gui.getComponent(1).getText()
- var player=e.player
- player.closeGui()
- if(target==""){
- player.message("§4玩家名不能为空")
- }
- else if(target==player.name){
- player.message("§4不能选自己为目标")
- }
- else{
- var essuser=ess.getUser(player.name)
- //要花的钱
- var cost=new BigDecimal(10)
- if(essuser.getMoney().compareTo(cost)!=-1){
- if(findplayer(player,target)){
- //每4tick,也就是每0.2秒进行一次定位,你可以改得更小
- player.getTimers().forceStart(1,4,true)
- essuser.setMoney(essuser.getMoney().subtract(cost))
- e.player.getNbt().putString("target",target)
- //开始定位的提示
- player.message("§b追猎开始!")
- //开始定位后,计入200tick冷却
- player.getTimers().forceStart(2,200,false)
- player.getMCEntity().func_184811_cZ().func_185145_a(compass,200)}
- //定位失败的提示
- else player.message("§4"+target+"不在这个世界……")
- }
- else player.message("金币不足")
- }
- }
- function logout(e){
- e.player.getTimers().stop(1)
- }
- function timer(e){
- if(e.id==1){
- var t=e.player.getNbt().getString("target")
- if(!findplayer(e.player,t)){
- //追踪途中定位失败的提示
- e.player.message(t+"逃离了这个世界,定位终止")
- e.player.getTimers().stop(1)
- e.player.getMCEntity().field_71135_a.func_147359_a(spawnpoint)
- }
- }
- else if(e.id==2){
- e.player.message("指南针冷却完毕,可再次进行定位")
- e.player.playSound("item.lodestone_compass.lock",1,1)
- }
- }
- function findplayer(p,t){
- var target=p.world.getPlayer(t)
- if(target!=null){
- if(!ess.getUser(target.name).isVanished()){
- p.getMCEntity().field_71135_a.func_147359_a(new packet(target.getMCEntity().func_233580_cy_(),0))
- //这里是ACTIONBAR
- p.getMCEntity().field_71135_a.func_147359_a(new titlepacket(titlepacket.Type.ACTIONBAR,new text("距目标 "+t+" "+parseInt(target.pos.distanceTo(p.pos))+"m")))
- return true}}
- return false
- }
- function died(e){
- var player=e.player
- var playername=player.name
- var killer=player.getMCEntity().field_70717_bb
- if(killer!=null){
- var killername=killer.func_200200_C_().getString()
- var players=player.world.getAllPlayers()
- for(var i in players){
- if(players[i].getTimers().has(1)&&players[i].getNbt().getString("target")==playername){
- players[i].getTimers().stop(1)
- players[i].getMCEntity().field_71135_a.func_147359_a(spawnpoint)
- if(players[i].name==killername){
- players[i].message("恭喜你亲手杀死了目标")
- var server=killer.func_184102_h()
- //放个烟花庆祝一下
- server.func_195571_aL().func_197059_a(server.func_195573_aM().func_197031_a(),"execute at "+playername+" run summon firework_rocket ~ ~ ~ {FireworksItem:{id:firework_rocket,Count:1,tag:{Fireworks:{Explosions:[{Type:4,Trail:1,Colors:[I;11743532,14602026],FadeColors:[I;4312372,14602026]}]}}}}")
- }
- else players[i].message("人头被"+killername+"抢走了,终止定位")
- }
- }
- var userk=ess.getUser(killername)
- var userp=ess.getUser(playername)
- var award=userp.getMoney().multiply(new BigDecimal(0.1)).setScale(0,HALF_UP)
- userk.setMoney(userk.getMoney().add(award).setScale(0,HALF_UP))
- userp.setMoney(userp.getMoney().subtract(award).setScale(0,HALF_UP))
- player.world.getPlayer(killername).message("你击杀了"+playername+"并获得了§e"+award+"金币¥")
- player.message("你被"+killername+"击杀了并损失了"+award+"金币¥")
- }
- else{
- var players=player.world.getAllPlayers()
- for(var i in players){
- if(players[i].getTimers().has(1)&&players[i].getNbt().getString("target")==playername){
- players[i].getTimers().stop(1)
- players[i].getMCEntity().field_71135_a.func_147359_a(spawnpoint)
- players[i].message("目标意外死亡,终止定位")
- }
- }
- }
- }
- function playerEventPlayerChangedDimensionEvent(e){
- var timers=e.entity.getTimers()
- if(timers.has(1)){
- timers.stop(1)
- e.entity.message("你离开了目标所在世界,终止定位")
- }
- }
- function playerEventClone(e){
- var timers=e.entity.getTimers()
- if(timers.has(1)){
- timers.stop(1)
- e.entity.message("你离开了目标所在世界,终止定位")
- }
- }
- function livingAttackEvent(e){
- var source=e.event.getSource()
- if(source.func_76355_l()=="fireworks"){
- if(source.func_76346_g()==null)
- e.setCanceled(true)
- }
- }
本帖最后由 等枫亭丶烟雨阁 于 2022-5-3 22:45 编辑
嗯,现在没有报错了,但好像还是有一些问题,服务器里是有指令传送的,假如追击者死亡后使用/back指令回到死亡地点也会有你离开了世界的提示,但这明显是回到了刚刚的那个世界
另外,当冷却结束后如果去到另一个世界,将会再次进行冷却的倒计时,这又是一个问题了,建议使用一种新的冷却计时法,不收世界传送所影响的那种
看起来这个问题越来越复杂了,我再把金粒往高抬一些吧
——新发现一个情况,提示的bug为追击者死亡后才有,且传送到其他世界不会有离开世界的提示,冷却的bug又出现了其他的情况,我也不太清楚到底什么时候会触发什么时候正常,建议换一套冷却系统,实在没有好的方法就放弃冷却系统吧
无敌三脚猫 发表于 2022-5-3 22:21
诶?那里我没改吗?
我又进游戏里看了一眼,我明明是改了的,这里发的却是没改的版本,奇怪
既然再发一次 ...
嗯,现在没有报错了,但好像还是有一些问题,服务器里是有指令传送的,假如追击者死亡后使用/back指令回到死亡地点也会有你离开了世界的提示,但这明显是回到了刚刚的那个世界
另外,当冷却结束后如果去到另一个世界,将会再次进行冷却的倒计时,这又是一个问题了,建议使用一种新的冷却计时法,不收世界传送所影响的那种
看起来这个问题越来越复杂了,我再把金粒往高抬一些吧
——新发现一个情况,提示的bug为追击者死亡后才有,且传送到其他世界不会有离开世界的提示,冷却的bug又出现了其他的情况,我也不太清楚到底什么时候会触发什么时候正常,建议换一套冷却系统,实在没有好的方法就放弃冷却系统吧
等枫亭丶烟雨阁 发表于 2022-5-3 22:34
嗯,现在没有报错了,但好像还是有一些问题,服务器里是有指令传送的,假如追击者死亡后使用/back指令回到 ...
加金粒倒不必,这些是bug,修bug是应该的
冷却的问题,我想是因为我少写了一句注释,我在记事本里打草稿的时候是写了这句的,但在游戏里没写,抱歉有所误导
- //开始定位后,计入200tick冷却
- player.getTimers().forceStart(2,200,false)
- //上一行的冷却改了的话,这一行也要改
- player.getMCEntity().func_184811_cZ().func_185145_a(compass,200)}
"追击者死亡后使用/back指令回到死亡地点"仍会有提示?按理说那句提示不该在重生的时候出现吗
无敌三脚猫 发表于 2022-5-3 22:21
诶?那里我没改吗?
我又进游戏里看了一眼,我明明是改了的,这里发的却是没改的版本,奇怪
既然再发一次 ...
如果实在太麻烦可以简化一下离开世界的提示,不需要区分是不是从末地传送门去到其他世界、追击者死亡之类的,只检测追击者启动追击时的世界是否和追击者现在的世界一致,只要有一次不一致直接取消追击并发送提示,杜绝出现返回启动追击的世界时又出现提示的bug
无敌三脚猫 发表于 2022-5-3 22:51
加金粒倒不必,这些是bug,修bug是应该的
冷却的问题,我想是因为我少写了一句注释,我在记事本里打草稿 ...
我是直接把代码全部复制过去没有修改参数的,所以看起来这个冷却确实是有bug了
/back的bug是这样的,假如玩家死亡,复活时会有一句提示,但玩家使用/back指令回到刚才的世界时仍然会有离开世界的提示