2 Fragen zum Punktesystem

Dieses Thema im Forum "Programmierung" wurde erstellt von Mrcookie008, 16. Juli 2013.

  1. Mrcookie008
    Offline

    Mrcookie008

    Registriert seit:
    15. Dezember 2011
    Beiträge:
    380
    Ort:
    /home
    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 (Text):
    1.     @EventHandler      public void onDeathPlayer(PlayerDeathEvent e) {
    2.       Player p = e.getEntity();
    3.       Player killer = p.getKiller();
    4.      
    5.         if (this.gejoint) {
    6.      
    7.       if(killer!=null) {
    8.       int KitStufe = getConfig().getInt("Spieler." + killer.getName() + ".KitStufe");
    9.       KitStufe++;
    10.       getConfig().set("Spieler." + killer.getName() + ".KitStufe", KitStufe);
    11.       p.sendMessage("§7§l[§aGun§7-§eGame§7§l] §7Du wurdest gekillt und bist nun wieder Kitstufe §60.");
    12.       getConfig().set("Spieler." + p.getName() + ".KitStufe", 0);
    13.      
    14.         e.setDeathMessage(null);
    15.         p.setHealth(20);
    16.         p.setFoodLevel(20);
    17.         p.setFireTicks(0);
    18.  
    19.  
    20.         e.setDroppedExp(0);
    21.         e.getDrops().clear();
    22.        
    23.       }
    24. [COLOR=#ff0000]          p.getInventory().addItem(new ItemStack(Material.WOOD_SWORD));
    25.                   //Funktioniert nicht.. kein Error, das Inventar ist einfach Leer nach dem "Tod".
    26.                   //Und nein das Respawn Event nehme ich nicht.. will ja den "Respawn Screen" vermeiden :/
    27. [/COLOR]
    28.       }
    29.      
    30.       saveConfig();
    31.      
    32.       }

    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 (Text):
    1.       @EventHandler        public void onPlayInteract(PlayerInteractEvent e){
    2.          
    3.           Player p = e.getPlayer();
    4.           Player killer = p.getKiller();
    5. [COLOR=#ff0000]          [/COLOR]
    6. [COLOR=#ff0000]                if(killer.getItemInHand().getType() == Material.STICK) {[/COLOR]
    7.                       if(killer!=null) {
    8.                           int KitStufe = getConfig().getInt("Spieler." + p.getName() + ".KitStufe");
    9.                           KitStufe--;
    10.                           getConfig().set("Spieler." + p.getName() + ".KitStufe", KitStufe);
    11.                
    12.                    
    13.                 }
    14.                 }
    Das Rot makierte wird in der Console als Error angezeigt (NullPointer).


    Würde mich über hilfe freuen :)
    LG. der Javaanfänger :p
     
    #1
  2. games6471
    Offline

    games6471

    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.
     
    #2
  3. games6471
    Offline

    games6471

    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 (Text):
    1.     public void die(DamageSource damagesource) {
    2.         // CraftBukkit start
    3.         if (this.dead) {
    4.             return;
    5.         }
    6.  
    7.         java.util.List<org.bukkit.inventory.ItemStack> loot = new java.util.ArrayList<org.bukkit.inventory.ItemStack>();
    8.         boolean keepInventory = this.world.getGameRules().getBoolean("keepInventory");
    9.  
    10.         if (!keepInventory) {
    11.             for (int i = 0; i < this.inventory.items.length; ++i) {
    12.                 if (this.inventory.items[i] != null) {
    13.                     loot.add(CraftItemStack.asCraftMirror(this.inventory.items[i]));
    14.                 }
    15.             }
    16.  
    17.             for (int i = 0; i < this.inventory.armor.length; ++i) {
    18.                 if (this.inventory.armor[i] != null) {
    19.                     loot.add(CraftItemStack.asCraftMirror(this.inventory.armor[i]));
    20.                 }
    21.             }
    22.         }
    23.  
    24.         ChatMessage chatmessage = this.aQ().b();
    25.  
    26.         String deathmessage = chatmessage.toString();
    27.         [COLOR="#FF0000"]org.bukkit.event.entity.PlayerDeathEvent event = CraftEventFactory.callPlayerDeathEvent(this, loot, deathmessage);[/COLOR]
    28.  
    29.         String deathMessage = event.getDeathMessage();
    30.  
    31.         if (deathMessage != null && deathMessage.length() > 0) {
    32.             if (deathMessage.equals(chatmessage.toString())) {
    33.                 this.server.getPlayerList().sendMessage(chatmessage);
    34.             } else {
    35.                 this.server.getPlayerList().sendMessage(ChatMessage.d(event.getDeathMessage()));
    36.             }
    37.         }
    38.  
    39. [COLOR="#FFFF00"]        // CraftBukkit - we clean the player's inventory after the EntityDeathEvent is called so plugins can get the exact state of the inventory.
    40.         if (!keepInventory) {
    41.             for (int i = 0; i < this.inventory.items.length; ++i) {
    42.                 this.inventory.items[i] = null;
    43.             }
    44.  
    45.             for (int i = 0; i < this.inventory.armor.length; ++i) {
    46.                 this.inventory.armor[i] = null;
    47.             }
    48.         }[/COLOR]
    49.  
    50.         this.closeInventory();
    51.         // CraftBukkit end
    52.  
    53.         // CraftBukkit - Get our scores instead
    54.         Collection<ScoreboardScore> collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.c, this.getLocalizedName(), new java.util.ArrayList<ScoreboardScore>());
    55.         Iterator iterator = collection.iterator();
    56.  
    57.         while (iterator.hasNext()) {
    58.             ScoreboardScore scoreboardscore = (ScoreboardScore) iterator.next(); // CraftBukkit - Use our scores instead
    59.  
    60.             scoreboardscore.incrementScore();
    61.         }
    62.  
    63.         EntityLiving entityliving = this.aR();
    64.  
    65.         if (entityliving != null) {
    66.             entityliving.b(this, this.bb);
    67.         }
    68.  
    69.         this.a(StatisticList.y, 1);
    70.     }
    71.  
    72.  
     
    #3