• 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!

2 Fragen zum Punktesystem

Mrcookie008

Braumeister
Registriert
15 Dezember 2011
Beiträge
380
Diamanten
0
Minecraft
xCookieZz oder Mrcookie008 (Beides Premium)
Hallo,
ich bin grade an einem kleinen "Gun-Game" Plugin , bloß ich habe 2 Probleme:

Problem 1: Der Spieler soll nach dem "Sterben" nicht zum Respawn Bildschirm kommen, sondern direkt wieder mit einem Holzsschwert spawnen, das klappt auch alles, bis auf das "Holzschwer geben" ..

Code:

Code:
    @EventHandler      public void onDeathPlayer(PlayerDeathEvent e) {
      Player p = e.getEntity();
      Player killer = p.getKiller();
      
        if (this.gejoint) {
      
      if(killer!=null) {
      int KitStufe = getConfig().getInt("Spieler." + killer.getName() + ".KitStufe");
      KitStufe++;
      getConfig().set("Spieler." + killer.getName() + ".KitStufe", KitStufe);
      p.sendMessage("§7§l[§aGun§7-§eGame§7§l] §7Du wurdest gekillt und bist nun wieder Kitstufe §60.");
      getConfig().set("Spieler." + p.getName() + ".KitStufe", 0);
      
        e.setDeathMessage(null);
        p.setHealth(20);
        p.setFoodLevel(20);
        p.setFireTicks(0);


        e.setDroppedExp(0);
        e.getDrops().clear();
        
      }
[COLOR=#ff0000]          p.getInventory().addItem(new ItemStack(Material.WOOD_SWORD));
                  //Funktioniert nicht.. kein Error, das Inventar ist einfach Leer nach dem "Tod".
                  //Und nein das Respawn Event nehme ich nicht.. will ja den "Respawn Screen" vermeiden :/
[/COLOR] 
      }
      
      saveConfig();
      
      }


Problem 2: Wie erkenne ich, dass der Killer den Spieler mit einem bestimmten Item (In diesem beispiel mit einem Stick) gekillt hat?, ich habe folgendes versucht:

Code:
      @EventHandler        public void onPlayInteract(PlayerInteractEvent e){
          
          Player p = e.getPlayer();
          Player killer = p.getKiller();
[COLOR=#ff0000]          [/COLOR]
[COLOR=#ff0000]                if(killer.getItemInHand().getType() == Material.STICK) {[/COLOR]
                      if(killer!=null) {
                          int KitStufe = getConfig().getInt("Spieler." + p.getName() + ".KitStufe");
                          KitStufe--;
                          getConfig().set("Spieler." + p.getName() + ".KitStufe", KitStufe);
                
                    
                }
                }

Das Rot makierte wird in der Console als Error angezeigt (NullPointer).


Würde mich über hilfe freuen :)
LG. der Javaanfänger :p
 
G

games6471

Guest
Schon einmal zwei Sachen. Also erstens formatiere bitte dein Code und zweitens solltest du erst überprüfen ob der Killer null ist und danach seine Items überprüfen.

EDIT: Des Weiteren solltest du für deinen Präfix einen konstanten String verwenden, so musst du nicht später einmal den kompletten Code durchwühlen oder bei jeder weiteren Nachricht den String immer wieder schreiben. Dabei könnten sich leicht Fehler einschleichen. Keine Sorge der Compiler wird bei einem konstanten Wert, wie String (andere Datentypen gehen auch), den Zeiger auf die Referenz der Konstante weg optimieren (Bei Veränderung der Konstante müssten aber alle Klassen, die auf diesen Wert zeigen neu kompiliert werden).

Nach meiner Interpretation von GunGame sollten doch normallerweise die Kitstufen nach beenden des Spiels gelöscht werden oder? Dann würde es sich gar nicht lohnen den Wert in einer Konfiguration abzuspeichern, sondern einfach nur im Arbeitsspeicher zu lassen.

Zu deinem Problem 2:

Wieso baust du das in ein anderes Event. Das PlayerDeathEvent ist doch gut geschaffen dafür. Das InteractEvent wird nämlich zudem auch noch für andere Dinge benutzt, die du bei dir völlig ausser Acht nimmst.
 
Zuletzt bearbeitet von einem Moderator:
G

games6471

Guest
So der Hintergrund zu Problem 1:

Schau dir mal den Code im Spoiler an. Dort steht sogar extra in den Kommentaren, dass das Inventar nachdem callen des Event geleert wird. Dein Code müsste danach ausgeführt werden.

Code:
    public void die(DamageSource damagesource) {
        // CraftBukkit start
        if (this.dead) {
            return;
        }

        java.util.List<org.bukkit.inventory.ItemStack> loot = new java.util.ArrayList<org.bukkit.inventory.ItemStack>();
        boolean keepInventory = this.world.getGameRules().getBoolean("keepInventory");

        if (!keepInventory) {
            for (int i = 0; i < this.inventory.items.length; ++i) {
                if (this.inventory.items[i] != null) {
                    loot.add(CraftItemStack.asCraftMirror(this.inventory.items[i]));
                }
            }

            for (int i = 0; i < this.inventory.armor.length; ++i) {
                if (this.inventory.armor[i] != null) {
                    loot.add(CraftItemStack.asCraftMirror(this.inventory.armor[i]));
                }
            }
        }

        ChatMessage chatmessage = this.aQ().b();

        String deathmessage = chatmessage.toString();
        [COLOR="#FF0000"]org.bukkit.event.entity.PlayerDeathEvent event = CraftEventFactory.callPlayerDeathEvent(this, loot, deathmessage);[/COLOR]

        String deathMessage = event.getDeathMessage();

        if (deathMessage != null && deathMessage.length() > 0) {
            if (deathMessage.equals(chatmessage.toString())) {
                this.server.getPlayerList().sendMessage(chatmessage);
            } else {
                this.server.getPlayerList().sendMessage(ChatMessage.d(event.getDeathMessage()));
            }
        }

[COLOR="#FFFF00"]        // CraftBukkit - we clean the player's inventory after the EntityDeathEvent is called so plugins can get the exact state of the inventory.
        if (!keepInventory) {
            for (int i = 0; i < this.inventory.items.length; ++i) {
                this.inventory.items[i] = null;
            }

            for (int i = 0; i < this.inventory.armor.length; ++i) {
                this.inventory.armor[i] = null;
            }
        }[/COLOR]

        this.closeInventory();
        // CraftBukkit end

        // CraftBukkit - Get our scores instead
        Collection<ScoreboardScore> collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.c, this.getLocalizedName(), new java.util.ArrayList<ScoreboardScore>());
        Iterator iterator = collection.iterator();

        while (iterator.hasNext()) {
            ScoreboardScore scoreboardscore = (ScoreboardScore) iterator.next(); // CraftBukkit - Use our scores instead

            scoreboardscore.incrementScore();
        }

        EntityLiving entityliving = this.aR();

        if (entityliving != null) {
            entityliving.b(this, this.bb);
        }

        this.a(StatisticList.y, 1);
    }
 
Oben