无敌三脚猫 发表于 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指令回到刚才的世界时仍然会有离开世界的提示
等枫亭丶烟雨阁 发表于 2022-5-3 22:59
我是直接把代码全部复制过去没有修改参数的,所以看起来这个冷却确实是有bug了
/back的bug是这样的,假 ...
我大概能理解了,cnpc的计时器,只用地狱门或者原版跨世界指令传送的话是没有问题的,但在玩家“被克隆”时(包含玩家重生,从末地门到主世界,以及插件的跨世界传送)会出问题,我确实需要想一种新的冷却机制了
要考虑到你可能设置的超长冷却时间(你前面说过的一个小时),同时要确保玩家在下线重进之后继续冷却……如果是插件,为了达成这种要求一般会把数据存在一份文件里,不过冷却时间只是一个数字而已,我决定把它存在计分板里
先使用一次
- /scoreboard objectives add cooldown dummy
本帖最后由 等枫亭丶烟雨阁 于 2022-5-4 17:19 编辑
不好意思好像是我搞错了,这是上次的报错
——内容存在误导可能性,已编辑
不好意思好像是我搞错了,这是上次的报错
——内容存在误导可能性,已编辑
无敌三脚猫 发表于 2022-5-4 15:11
我大概能理解了,cnpc的计时器,只用地狱门或者原版跨世界指令传送的话是没有问题的,但在玩家“被克隆” ...
发现bug,当追击者击杀被追击者后虽然定位会结束,但貌似提示语系统不会结束,当该被追击者返回后,即使追击者没有第二次定位被追击者,追击者将被追击者击杀后仍有烟花和恭喜亲手杀死的提示语,且当被追击者被其他玩家击杀后会给追击者提示人头被抢走之类的提示语
等枫亭丶烟雨阁 发表于 2022-5-4 18:10
发现bug,当追击者击杀被追击者后虽然定位会结束,但貌似提示语系统不会结束,当该被追击者返回后,即使 ...
我想起来我少写了啥了
其实只是加两句话,不过我还是全部复制吧
无敌三脚猫 发表于 2022-5-4 18:17
我想起来我少写了啥了
其实只是加两句话,不过我还是全部复制吧
经过一系列的测试,目前看来是没有bug了,虽然以后可能还会发现,但目前是没有了
经过了这么久终于算是完成了,十分感谢大佬的帮助,祝您有愉快的一天