• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Lebensanzeige Plugin

Darkblader24

Kuhfänger
Registriert
22 August 2012
Beiträge
79
Alter
32
Diamanten
300
Minecraft
Darkblader24
Hallo
ich weiß, es gab vor kurzem einen Tread dazu, aber ich dachte mir, ich mache einen neuen auf.
Und zwar möchte ich ein Plugin schreiben, mit dem die Herzen des Gegners im Chat angezeigt werden. Der Grundcode ist von Benni1000, doch ich habe noch ein paar Fragen dazu.

Code: http://pastebin.com/bNKaZURG

Wie müsste man den Code umschreiben, sodass das Leben des Gegners erst nach dem Abzug des Schadens angezeigt wird? Denn bis jetzt zeigt es nur das Leben vor dem Schlag an und das bringt den Spielern ja nicht viel.

Und ich habe es jetzt auch so geschrieben, dass es auch Treffer mit Pfeilen und Schadenstränken anzeigt. Jedoch habe ich es in zwei verschiedene if-Abfragen gepackt welche bei den beiden Varianten jeweils das gleiche ausführen. Geht es auch, dass ich es in eine gemeinsame if-Abfrage packen kann, oder dass man es einfacher schreiben kann?

Danke :)
 

Darkblader24

Kuhfänger
Registriert
22 August 2012
Beiträge
79
Alter
32
Diamanten
300
Minecraft
Darkblader24
So ich habe jetzt mal den Code mal etwas eingekürzt und wollte einen durch deinen Scheduler die Lebensabfrage des Gegners um 1 oder 2 Ticks verzögern, um das Leben nach dem Schlag zu bekommen. Doch irgendwie spuckt die Konsole dann bei jedem Schlag auf einen Gegner einen Error aus und es wird nix angezeigt. Mein Code:

Code:
    @EventHandler(priority = EventPriority.HIGH)    public void onDamage(final EntityDamageByEntityEvent event) {
        
        PlanetEssentials.plugin.getServer().getScheduler().scheduleAsyncDelayedTask(PlanetEssentials.plugin, new Runnable() {


        public void run() {
        
        Player victim = null;
        Player attacker = null;
        
        if ((event.getDamager() instanceof Projectile)) {
            Projectile bullit = (Projectile)event.getDamager();
            if ((bullit.getShooter() instanceof Player && event.getEntity() instanceof Player)) {
                victim = (Player)event.getEntity();
                attacker = (Player)bullit.getShooter();
            }
        }
        if (event.getDamager() instanceof Player && event.getEntity() instanceof Player) {
            victim = (Player)event.getEntity();
            attacker = (Player)event.getDamager();
        }
        
              String toPlayer = "";
              int dmg = event.getDamage();
              int hth = victim.getHealth();
              if(event.isCancelled()){
                  if(hth%2 != 0) {
                      for(int i = 0; i < (hth-1)/2; i++) {
                          toPlayer = toPlayer + "❤";
                      }
                      toPlayer = toPlayer + "♥";
                  }
                  else {
                      for(int i = 0; i < hth/2; i++) {
                          toPlayer = toPlayer + "❤";
                      }
                  }
                    ChatColor prefix;
                    if(toPlayer.length() > 7)
                        prefix = ChatColor.GREEN;
                    else if(toPlayer.length() > 4)
                        prefix = ChatColor.YELLOW;
                    else
                        prefix = ChatColor.RED;
                    attacker.sendMessage(ChatColor.GOLD+"Leben von "+ChatColor.DARK_GREEN+victim.getName()+ChatColor.GOLD+": "+prefix+toPlayer);
                   }  
              else {
                  if(hth-dmg > 0 && dmg > 0){
                    if((hth-dmg)%2 != 0 && hth-dmg != 0) {
                        for(int i = 0; i < ((hth-dmg)-1)/2; i++) {
                           toPlayer = toPlayer + "❤";
                          }
                          toPlayer = toPlayer + "♥";
                    }
                  else {
                      for(int i = 0; i < (hth-dmg)/2; i++) {
                          toPlayer = toPlayer + "❤";
                      }
                  }
                  ChatColor prefix;
                  if(toPlayer.length() > 7)
                      prefix = ChatColor.GREEN;
                  else if(toPlayer.length() > 4)
                      prefix = ChatColor.YELLOW;
                  else
                      prefix = ChatColor.RED;
                  attacker.sendMessage(ChatColor.GOLD+"Leben von "+ChatColor.DARK_GREEN+victim.getName()+ChatColor.GOLD+": "+prefix+toPlayer);
                }
              }
              
           }
           }, 2);
          return;
          }

Und das ist der Error:

Code:
14:33:59 [SEVERE] Could not pass event EntityDamageByEntityEvent to PlanetEssentials v1.0
org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:341)
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:477)
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:462)
        at org.bukkit.craftbukkit.event.CraftEventFactory.callEvent(CraftEventFactory.java:80)
        at org.bukkit.craftbukkit.event.CraftEventFactory.callEntityDamageEvent(CraftEventFactory.java:377)
        at org.bukkit.craftbukkit.event.CraftEventFactory.handleEntityDamageEvent(CraftEventFactory.java:399)
        at net.minecraft.server.EntityLiving.damageEntity(EntityLiving.java:658)


        at net.minecraft.server.EntityHuman.damageEntity(EntityHuman.java:605)
        at net.minecraft.server.EntityPlayer.damageEntity(EntityPlayer.java:306)


        at net.minecraft.server.EntityHuman.attack(EntityHuman.java:794)
        at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:1124)
        at net.minecraft.server.Packet7UseEntity.handle(SourceFile:36)
        at net.minecraft.server.NetworkManager.b(NetworkManager.java:290)
        at net.minecraft.server.NetServerHandler.d(NetServerHandler.java:113)
        at net.minecraft.server.ServerConnection.b(SourceFile:39)
        at net.minecraft.server.DedicatedServerConnection.b(SourceFile:30)
        at net.minecraft.server.MinecraftServer.r(MinecraftServer.java:595)
        at net.minecraft.server.DedicatedServer.r(DedicatedServer.java:222)
        at net.minecraft.server.MinecraftServer.q(MinecraftServer.java:493)
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:426)
        at net.minecraft.server.ThreadServerApplication.run(SourceFile:856)
Caused by: java.lang.NullPointerException
        at me.Darkblader24.PlanetEssentials.PlanetEssentialsJoinListener.onDamage(PlanetEssentialsJoinListener.java:32)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:339)
        ... 21 more

Sobald ich den Scheduler rausnehme, klappt alles wunderbar. Was mache ich an dem Scheduler falsch?
 

MrFlieder

Braumeister
Registriert
30 Dezember 2011
Beiträge
332
Diamanten
0
Minecraft
MrFlieder
So ich habe jetzt mal den Code mal etwas eingekürzt und wollte einen durch deinen Scheduler die Lebensabfrage des Gegners um 1 oder 2 Ticks verzögern, um das Leben nach dem Schlag zu bekommen. Doch irgendwie spuckt die Konsole dann bei jedem Schlag auf einen Gegner einen Error aus und es wird nix angezeigt. Mein Code:

Code:
    @EventHandler(priority = EventPriority.HIGH)    public void onDamage(final EntityDamageByEntityEvent event) {
        
        PlanetEssentials.plugin.getServer().getScheduler().scheduleAsyncDelayedTask(PlanetEssentials.plugin, new Runnable() {


        public void run() {
        
        Player victim = null;
        Player attacker = null;
        
        if ((event.getDamager() instanceof Projectile)) {
            Projectile bullit = (Projectile)event.getDamager();
            if ((bullit.getShooter() instanceof Player && event.getEntity() instanceof Player)) {
                victim = (Player)event.getEntity();
                attacker = (Player)bullit.getShooter();
            }
        }
        if (event.getDamager() instanceof Player && event.getEntity() instanceof Player) {
            victim = (Player)event.getEntity();
            attacker = (Player)event.getDamager();
        }
        
              String toPlayer = "";
              int dmg = event.getDamage();
              int hth = victim.getHealth();
              if(event.isCancelled()){
                  if(hth%2 != 0) {
                      for(int i = 0; i < (hth-1)/2; i++) {
                          toPlayer = toPlayer + "❤";
                      }
                      toPlayer = toPlayer + "♥";
                  }
                  else {
                      for(int i = 0; i < hth/2; i++) {
                          toPlayer = toPlayer + "❤";
                      }
                  }
                    ChatColor prefix;
                    if(toPlayer.length() > 7)
                        prefix = ChatColor.GREEN;
                    else if(toPlayer.length() > 4)
                        prefix = ChatColor.YELLOW;
                    else
                        prefix = ChatColor.RED;
                    attacker.sendMessage(ChatColor.GOLD+"Leben von "+ChatColor.DARK_GREEN+victim.getName()+ChatColor.GOLD+": "+prefix+toPlayer);
                   }  
              else {
                  if(hth-dmg > 0 && dmg > 0){
                    if((hth-dmg)%2 != 0 && hth-dmg != 0) {
                        for(int i = 0; i < ((hth-dmg)-1)/2; i++) {
                           toPlayer = toPlayer + "❤";
                          }
                          toPlayer = toPlayer + "♥";
                    }
                  else {
                      for(int i = 0; i < (hth-dmg)/2; i++) {
                          toPlayer = toPlayer + "❤";
                      }
                  }
                  ChatColor prefix;
                  if(toPlayer.length() > 7)
                      prefix = ChatColor.GREEN;
                  else if(toPlayer.length() > 4)
                      prefix = ChatColor.YELLOW;
                  else
                      prefix = ChatColor.RED;
                  attacker.sendMessage(ChatColor.GOLD+"Leben von "+ChatColor.DARK_GREEN+victim.getName()+ChatColor.GOLD+": "+prefix+toPlayer);
                }
              }
              
           }
           }, 2);
          return;
          }

Und das ist der Error:

Code:
14:33:59 [SEVERE] Could not pass event EntityDamageByEntityEvent to PlanetEssentials v1.0
org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:341)
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:477)
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:462)
        at org.bukkit.craftbukkit.event.CraftEventFactory.callEvent(CraftEventFactory.java:80)
        at org.bukkit.craftbukkit.event.CraftEventFactory.callEntityDamageEvent(CraftEventFactory.java:377)
        at org.bukkit.craftbukkit.event.CraftEventFactory.handleEntityDamageEvent(CraftEventFactory.java:399)
        at net.minecraft.server.EntityLiving.damageEntity(EntityLiving.java:658)


        at net.minecraft.server.EntityHuman.damageEntity(EntityHuman.java:605)
        at net.minecraft.server.EntityPlayer.damageEntity(EntityPlayer.java:306)


        at net.minecraft.server.EntityHuman.attack(EntityHuman.java:794)
        at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:1124)
        at net.minecraft.server.Packet7UseEntity.handle(SourceFile:36)
        at net.minecraft.server.NetworkManager.b(NetworkManager.java:290)
        at net.minecraft.server.NetServerHandler.d(NetServerHandler.java:113)
        at net.minecraft.server.ServerConnection.b(SourceFile:39)
        at net.minecraft.server.DedicatedServerConnection.b(SourceFile:30)
        at net.minecraft.server.MinecraftServer.r(MinecraftServer.java:595)
        at net.minecraft.server.DedicatedServer.r(DedicatedServer.java:222)
        at net.minecraft.server.MinecraftServer.q(MinecraftServer.java:493)
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:426)
        at net.minecraft.server.ThreadServerApplication.run(SourceFile:856)
Caused by: java.lang.NullPointerException
        at me.Darkblader24.PlanetEssentials.PlanetEssentialsJoinListener.onDamage(PlanetEssentialsJoinListener.java:32)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:339)
        ... 21 more

Sobald ich den Scheduler rausnehme, klappt alles wunderbar. Was mache ich an dem Scheduler falsch?
Hast du das Problem mittlerweile gelöst?
Sonst würde ich vorschlagen, tausche das Async beim Scheduler mit Sync aus.
 

MrFlieder

Braumeister
Registriert
30 Dezember 2011
Beiträge
332
Diamanten
0
Minecraft
MrFlieder

Darkblader24

Kuhfänger
Registriert
22 August 2012
Beiträge
79
Alter
32
Diamanten
300
Minecraft
Darkblader24

Das hat leider genau das gleiche Problem, an dem ich in diesem Thread die ganze Zeit hänge xD
Auch dein Plugin zeigt das Leben des Gegners VOR dem Schlag an.
Das ist besonders störend, wenn man mit starken Schwertern zuhaut, weil es dann sein kann, dass bei dir 3 Herzen im Chat stehen und der Gegner aber nur noch eins hat oder er schon lange tot ist. Das ist verwirrend. Besser wäre es, wenn man das Leben des Gegnern NACH dem Schlag angezeigt bekommen würde.
 
Zuletzt bearbeitet:
Oben