/god funktion programieren?
Hi, Ich beschäftige mich grad mit Plugin Programierung in Minecraft. Ich wollte eine god funktion in mein plugin einbauen. Hab dies auch gemacht hier der code:
package de.TreftCraft;
import java.util.ArrayList; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player;
public class God
implements CommandExecutor
{
public static ArrayList<String> god = new ArrayList();
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
{
Player p = (Player)sender;
if (p.hasPermission("system.god"))
{
if (args.length == 0)
{
if (god.contains(p.getName()))
{
god.remove(p.getName());
p.sendMessage("Du bist nun nicht mehr im Godmode!");
}
else
{
god.add(p.getName());
p.sendMessage("Du bist nun im Godmode!");
}
}
else {
p.sendMessage("Benutze /God");
}
}
else {
p.sendMessage("Dazu hast du keine Rechte!");
}
return false;
}
}
Und der EntityDamageListener:
package de.TreftCraft;
import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageEvent;
public class EntityDamage implements Listener { @EventHandler public void onDamage(EntityDamageEvent e) { Player p = (Player) e.getEntity(); if (God.god.contains(p.getName())) { e.setCancelled(true); } else { e.setCancelled(false); } } }
Ich hab alles in der Main.java hinzugefügt es geht auch alles aber in der Console wird dieser Fehler angezeigt:
[10:44:17 ERROR]: Could not pass event EntityDamageEvent to System v1.0
org.bukkit.event.EventException: null
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callEvent(CraftEventFactory.java:93) [spigot_server.jar:git-Spigot-c3093ef-7e94e65] .......
EDIT: Ich muss mich entschuldigen das es hier so komisch angezeigt wird
2 Antworten
Das Casten funktioniert (wie schon beschrieben) nicht...
Auch solltest du beachten, dass es noch andere Listener zB EntityDamageEntitiy gibt, die du eventuell auch canceln solltest. Könnte aber auch generell alles über den EntityDamage laufen, da bin ich nicht sicher
Du darfst nicht einfach jede Entity auf Player casten! Nach:
Player p = (Player) e.getEntity();
solltest du IMMER prüfen ob es auch geklappt hat und Player nicht null ist!!
if(p != null)
{
// gültiger Player
Immer wenn du eine Typumwandlung mit Objekten wie oben machst, solltest du danach direkt testen ob die Umwandlung funktioniert hat. Mit einem Nullpointer arbeiten bringt dein Programm schneller zum abstürzen als du gucken kannst...
soll if(p != null) { unter Player p = (Player)e.getEntity(); ?
Das kommt dann:
[11:14:48 ERROR]: Could not pass event EntityDamageByEntityEvent to System v1.0
org.bukkit.event.EventException: null
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callEvent(CraftEventFactory.java:93) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callEntityDamageEvent(CraftEventFactory.java:580) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.handleEntityDamageEvent(CraftEventFactory.java:483) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.handleLivingEntityDamageEvent(CraftEventFactory.java:612) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.EntityLiving.damageEntity0(EntityLiving.java:1344) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.EntityLiving.damageEntity(EntityLiving.java:868) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.EntityMonster.damageEntity(EntityMonster.java:44) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.EntityZombie.damageEntity(EntityZombie.java:163) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.EntityHuman.attack(EntityHuman.java:1005) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.EntityPlayer.attack(EntityPlayer.java:1311) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1621) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.PacketPlayInUseEntity.a(SourceFile:69) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.PacketPlayInUseEntity.a(SourceFile:13) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_161]
at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_161]
at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_161]
Caused by: java.lang.ClassCastException: org.bukkit.craftbukkit.v1_12_R1.entity.CraftZombie cannot be cast to org.bukkit.entity.Player
at de.TreftCraft.EntityDamage.onDamage(EntityDamage.java:11) ~[?:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_161]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_161]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_161]
at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_161]
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot_server.jar:git-Spigot-c3093ef-7e94e65]
... 25 more
Ja.
Player p = (Player)e.getEntity();
//Entity in Player-Objekt umwandeln
if(p != null)
{
// Umwandlung hat geklappt
Nicht jedes Entity-Objekt ist vom Typ Player, aber jeder Player ist vom Typ Entity. Du solltest dir auf jedenfall noch mal die Grundlagen der objektorientierten Programmierung angucken...
Ich will ja nichts sagen aber der fehler kommt immer noch.....
Hab geändert, gespeichert, exportortiert, Server reloadet immernoch der gleiche fehler:
[11:21:55 ERROR]: Could not pass event EntityDamageEvent to System v1.0
org.bukkit.event.EventException: null
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callEvent(CraftEventFactory.java:93) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callEntityDamageEvent(CraftEventFactory.java:580) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.handleEntityDamageEvent(CraftEventFactory.java:566) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.handleLivingEntityDamageEvent(CraftEventFactory.java:612) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.EntityLiving.damageEntity0(EntityLiving.java:1344) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.EntityLiving.damageEntity(EntityLiving.java:868) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.EntityMonster.damageEntity(EntityMonster.java:44) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.EntityZombie.damageEntity(EntityZombie.java:163) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.Entity.Y(Entity.java:439) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.EntityLiving.Y(EntityLiving.java:204) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.EntityInsentient.Y(EntityInsentient.java:186) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.Entity.B_(Entity.java:320) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.EntityLiving.B_(EntityLiving.java:1871) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.EntityInsentient.B_(EntityInsentient.java:246) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.EntityMonster.B_(EntityMonster.java:28) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.World.entityJoinedWorld(World.java:1631) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.World.h(World.java:1601) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.World.tickEntities(World.java:1435) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.WorldServer.tickEntities(WorldServer.java:665) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:817) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot_server.jar:git-Spigot-c3093ef-7e94e65]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_161]
Caused by: java.lang.ClassCastException: org.bukkit.craftbukkit.v1_12_R1.entity.CraftZombie cannot be cast to org.bukkit.entity.Player
at de.TreftCraft.EntityDamage.onDamage(EntityDamage.java:11) ~[?:?]
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) ~[?:?]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_161]
at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_161]
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot_server.jar:git-Spigot-c3093ef-7e94e65]
... 27 more
>
tut mir leid aber du solltest dir java auch noch mal anschauen das hat gefehlt:
if (entity instanceof Player) {
Für die die jetzt noch dazu kommen! So wie @user373h383 das beschrieben hat ist es auch nicht ganz richtig! Erst checken ob "if(e.getEntity() instanceof Player)" true ist. Danach kannst du casten, da er dir sonst eine ClassCastException schmeißt, noch bevor er zur if(p != null) Abfrage kommt :)
Okay, probier ich mal aus