Programming a Plugin

Discussion in 'Plugin Development' started by Countdown2000, Sep 3, 2011.

Thread Status:
Not open for further replies.
  1. Offline

    muCkk

  2. Offline

    Pencil

    Achwas. Stimmt doch garnicht D: Du kannst in java fast alles in eine klasse schreiben. Er kann onEnable etc auch in seinen listener schreiben, solange das die Einzige datei ist... Ist auch nicht sonderlich schwer :3

    No need XD I'm 100% German myself ;D
     
  3. Offline

    Countdown2000

    so nun hab ich das mit dem listner gemacht soweit ist dann auch alles klar wenn man die loc1 und loc2 weg lässt
    dann kommt die gewünschte aussage zumindest ... aber das ist ja eher ein abfallprodukt das eigentliche ereignis was ja dahinter sitzten soll ist die positionen zu speichern

    also hier mal meine codes :

    MostUses.java:
    Code:
    package me.countdown2000.mostUses;
     
    import org.bukkit.ChatColor;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Event;
    import org.bukkit.event.Event.Priority;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.plugin.PluginManager;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class MostUses extends JavaPlugin {
    
        private final MostUsesPlayerListener playerListener = new MostUsesPlayerListener(this);
     
        @Override
        public void onDisable() {
    
            System.out.println("das MostUses Plugin ist ausgeschaltet!");
    
        }
     
        @Override
        public void onEnable() {
    
            PluginManager pm = getServer().getPluginManager();
    
            pm.registerEvent(Event.Type.PLAYER_INTERACT, this.playerListener, Priority.Normal, this);
    
            System.out.println("das MostUses Plugin ist eingeschaltet!");
    
        }
     
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)  {
    
            boolean succeed = false;
            if (sender instanceof Player) {
    
                Player player = (Player) sender;
                // Konsolenbefehl für Diamantruestung "/iamadmin"
                if (cmd.getName().equalsIgnoreCase("iamadmin"))  {
    
                    if (args.length == 0) {
    
                        player.getInventory().setHelmet(new ItemStack(310, 1));
                        player.getInventory().setChestplate(new ItemStack(311, 1));
                        player.getInventory().setLeggings(new ItemStack(312, 1));
                        player.getInventory().setBoots(new ItemStack(313, 1));
                        player.getInventory().addItem(new ItemStack(276, 1));
                        player.getInventory().addItem(new ItemStack(277, 1));
                        player.getInventory().addItem(new ItemStack(278, 1));
                        player.getInventory().addItem(new ItemStack (279, 1));
                        player.getInventory().addItem(new ItemStack (271, 1));
                        player.getInventory().addItem(new ItemStack (345, 1));
                        player.getInventory().addItem(new ItemStack (287, 1));
                        succeed = true;
    
                    } else {
    
                        player.sendMessage(ChatColor.RED + "Tipp den Befehl richtig ein!");
                        succeed = false;
    
                    }
                }
    
                // Konsolenbefehl für Heilung "/heilen"
                if (cmd.getName().equalsIgnoreCase("heilen"))  {
    
                    if (args.length == 0) {
    
                        player.setHealth(20);
                        succeed = true;
    
                    } else {
    
                        player.sendMessage(ChatColor.RED + "Tipp den Befehl richtig ein!");
                        succeed = false;
                    }
                }
            }
            return succeed;
        }
    
    }
    an dem ist alles ok und wird auch nichts als warnung angezeigt

    nun der listener MostUsesPlayerListener.java:

    Code:
    package me.countdown2000.mostUses;
      
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.entity.Player;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.event.player.PlayerListener;
    
    public class MostUsesPlayerListener extends PlayerListener{
    
        public static MostUses plugin;
     
        public MostUsesPlayerListener(MostUses mostUses) {
    
            plugin = mostUses;
    
        }
     
        public void onPlayerInteract(PlayerInteractEvent event) {
    
            Player player = event.getPlayer();
           [COLOR=rgb(255, 102, 0)] Location loc1, loc2;[/COLOR]
    
            // ist der gegenstand ein stock id:280 dann ...
            if (player.getItemInHand().getTypeId() == 280) {
    
                //passiert eine aktion und diese aktion ist ein linksklick dann ...
                if (event.getAction() == Action.LEFT_CLICK_BLOCK) {
    
                    loc1 = event.getClickedBlock().getLocation();
                    player.sendMessage(ChatColor.GREEN + "Position 1 gesetzt.");
                }
     
                //passiert eine aktion und diese aktion ist ein linksklick dann
                if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
    
                    loc2 = event.getClickedBlock().getLocation();
                    player.sendMessage(ChatColor.GREEN + "Position 2 gesetzt.");
                }
    
            }
    
        }
      
    }
    
    da ist das Location loc1, loc2; mit einer Warung die mir sagt das man das nicht so schreiben darf ... wenn ich nur Location loc1; schreibe ist es ok aber dann meckert er an der zeile mit loc2 = event .... und wenn ich die lösche dann mault er wieder über Location loc1;
    ich weis echt nicht was der genau noch haben woll ...

    hier zur vervollständigung noch die plugin.yml

    Code:
    name: MostUses
    version: 0.3
    description: CommandSammlung
    author: Countdown2000
    website:  http://www.bukkit.org/
    
    main: me.countdown2000.mostUses.MostUses
    
    commands:
      iamadmin:
        description: Diamantruestung geben.
        usage: /<command>
      heilen:
        description: Heilung.
        usage: /<command>
    
    
     
  4. Offline

    Pencil


    Versuchs mal mit Location loc1 = null;
    Location loc2 = null;
     
  5. Offline

    Countdown2000

    ne hat alles nicht funktioniert er hörte erst auf an dem code rumzumeckern als ich bei public void .... in
    die klammern die Location loc1 reingeschrieben hab aber das ist ja nur mehr oder weniger eine umbenennung oder

    mein code sieht so aus und das ergebnis ist das jetzt nicht gemault wird oder fehler auftreten aber auch nix mehr passiert also nichtmal mehr die message "Position 1 gesetzt" wird angezeigt ...

    Code:
    package me.countdown2000.mostUses;
    
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.entity.Player;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.event.player.PlayerListener;
    import org.bukkit.event.player.PlayerMoveEvent;
    
    public class MostUsesPlayerListener extends PlayerListener{
    
        public static MostUses plugin;
    
        public MostUsesPlayerListener(MostUses mostUses) {
    
            plugin = mostUses;
    
        }
    
        public void onPlayerInteract(PlayerInteractEvent event, Location loc1, Location loc2) {
    
            Player player = event.getPlayer();
    
            // ist der gegenstand ein stock id:280 dann ...
            if (player.getItemInHand().getTypeId() == 280) {
    
                //passiert eine aktion und diese aktion ist ein linksklick dann ...
                if (event.getAction() == Action.LEFT_CLICK_BLOCK) {
    
                    loc1 = event.getClickedBlock().getLocation();
                    player.sendMessage(ChatColor.GREEN + "Position 1 gesetzt.");
                }
    
                //passiert eine aktion und diese aktion ist ein linksklick dann
                if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
    
                    loc2 = event.getClickedBlock().getLocation();
                    player.sendMessage(ChatColor.GREEN + "Position 2 gesetzt.");
                }
    
            }
    
        }
    
        public void onPlayerMove(PlayerMoveEvent event, Player player, Location loc1, Location loc2) {
    
            int x = player.getLocation().getBlockX(), y = player.getLocation().getBlockY(), z = player.getLocation().getBlockZ();
    
            // jetzt vergleicht man den standort vom spieler mit dem gespeicherten bereich, vorher musst du gucken, dass die loc1 die größeren korrdinaten hat
    
            if( x < loc1.getBlockX() && x > loc2.getBlockX() && y < loc1.getBlockY() && y > loc2.getBlockY() && z < loc1.getBlockZ() && z > loc2.getBlockZ()) {
    
                   player.sendMessage(ChatColor.GOLD + "du betritts den bereich!");
    
            }
        }
    
    }
    das ist die MostUsesPlayerListener.java




    ps.: langsam verzweifel ich noch an dem zeug ... ich will doch nur ein cuboid erstellen der das inventar komplett leert unwiederruflich
     
  6. Offline

    muCkk

    Ich hab ja auch geschrieben sollte und nicht muss ;). Alles in eine Datei zu klatschen entspricht einfach nicht der Idee von Java und macht den Code nur unübersichtlich.

    @Countdown2000 Du musst die Variablen vorher deklarieren, damit die überhaupt erstellt werden. Das sieht dann so aus:
    Code:
    package me.countdown2000.mostUses;
    
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.entity.Player;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.event.player.PlayerListener;
    import org.bukkit.event.player.PlayerMoveEvent;
    
    public class MostUsesPlayerListener extends PlayerListener{
    
        public static MostUses plugin;
        private Location loc1, loc2;
    
        public MostUsesPlayerListener(MostUses mostUses) {
    
            plugin = mostUses;
    
        }
    
        public void onPlayerInteract(PlayerInteractEvent event) {
    
            Player player = event.getPlayer();
    
            // ist der gegenstand ein stock id:280 dann ...
            if (player.getItemInHand().getTypeId() == 280) {
    
                //passiert eine aktion und diese aktion ist ein linksklick dann ...
                if (event.getAction() == Action.LEFT_CLICK_BLOCK) {
    
                    loc1 = event.getClickedBlock().getLocation();
                    player.sendMessage(ChatColor.GREEN + "Position 1 gesetzt.");
                }
    
                //passiert eine aktion und diese aktion ist ein linksklick dann
                if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
    
                    loc2 = event.getClickedBlock().getLocation();
                    player.sendMessage(ChatColor.GREEN + "Position 2 gesetzt.");
                }
    
            }
    
        }
    
        public void onPlayerMove(PlayerMoveEvent event) {
            Player player = event.getPlayer();
            int x = player.getLocation().getBlockX(), y = player.getLocation().getBlockY(), z = player.getLocation().getBlockZ();
    
            // jetzt vergleicht man den standort vom spieler mit dem gespeicherten bereich, vorher musst du gucken, dass die loc1 die größeren korrdinaten hat
    
            if( x < loc1.getBlockX() && x > loc2.getBlockX() && y < loc1.getBlockY() && y > loc2.getBlockY() && z < loc1.getBlockZ() && z > loc2.getBlockZ()) {
    
                   player.sendMessage(ChatColor.GOLD + "du betritts den bereich!");
    
            }
        }
    
    }
    Die Methoden onPlayerMove und onPlayerInteract sind ja von Bukkit vorgegeben. Was in den Klammern dahinter steht gibt an was den Methoden übergeben wird und das ist immer nur der Event selber. Von dem event kannst du dir dann zum Beispiel den spieler holen mit event.getPlayer().
     
  7. Offline

    Pencil

    Genauso hab ich das mit dem Loc1 Loc2 oben gemeint XD
     
  8. Offline

    Countdown2000

    ok soweit funktionierts jetzt ... nun kommt das problem:
    ich schlag auf die blöcke bekomme gesagt das der eine block gesetzt ist und der andere auch.
    jetzt sollte ja die abfrage nach meiner position kommen und sobald ich in den bereich gehe innerhalb der makierten punkte das die nachricht "du betrittst den bereich" ausgegeben werden soll aber das tut es nicht ...
    oder muss man vorher noch was da rein programmieren damit er das volumen nicht die positionen als bereich nimmt

    und abgesehn davon seh ich das in der programmierung die ich da hab die positionen nicht wirklich gespeichert werden sondern nur solange pos1 auch pos1 für das volumen bleibt solange ich mit dem stock nicht woanders drauf haue und somit eine neue pos1 definiere ...

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 19, 2016
  9. Offline

    muCkk

    Hm hab ich doch schon geschrieben. Du musst loc1 die größten korrdinaten hat und loc2 die kleinsten.
    Also wenn du zwei Punkte makierst mit den Koordinaten:
    loc1: 10, 60, 20
    loc2: 20, 70, 10
    Dann musst du bei loc1 x auf 20 setzen, y auf 70 und z so lassen, bei loc2 x auf 10, y auf 60 und z bleibt ebenfalls so. Jetzt kann man ja checken, ob sich die location vom Spieler zwischen diesen beiden befindet, denn dann wär sie ja in dem markierten bereich.

    Edit:
    Ja ich hab ja auch nur ungefähr gezeigt wie man das machen kann, etwas selber überlegen musst du schon noch ;).
    Es gibt ja einige Plugins die Regionen haben (WorldGuard und Towny zB.). Da kannst du dir ja mal den Quellcode anschauen und gucken, wie die das realisiert haben.
     
  10. Offline

    Pencil

    Wie oben schon von mir gesagt, du must einmal durch alle blocks loopen die im cuboid bereich sind
     
  11. Offline

    muCkk

    Oder du guckst ob sich der Spieler zwischen den beiden Locations befindet, dann musst du nicht tausende Vergleiche durchführen.
     
  12. Offline

    Countdown2000

    wie kann ich den von worldguard und so die quellcodes anschauen ? brauch man dafür nur die jar und öffnet die ?
    aber mit welchem programm
     
  13. Offline

    Pencil

    :3 Ja wenn er NUR des will dann ja XD
     
  14. Offline

    muCkk

    @Countdown2000 Die meisten Entwickler geben immer einen Link zu dem Sourcecode an. Im WorldGuard-Thread musst du auf den "Fork on Github" Button klicken.
    Alternativ funktioniert meist das hier ;)
     
  15. Offline

    randomman159

    haha i reckon half of us in this post are :p
     
  16. Offline

    Pencil

    Most are German D:
     
  17. Offline

    Countdown2000

    ok ... das ist alles echt komplex ....

    ich dachte das es einfacher wäre ein simples kleines plugin eben was nix kann außer einen würfel/volumen/bereich/region was auch immer zu definieren so das das inventar gelöscht wird wenn man rein rennt ...

    sei es per ecke makieren oder per die koordinaten als befehl eintippen oder sonst wie ... kann doch nicht so schwer sein ... von mir aus geht man auch hin und nimmt ein volumen was mit worldguard/edit makiert ist und tippt dann statt dem befehl /region define ...blabla .. einfach /deleteinv ein und dann ist der bereich gespeichert als inventarkiller ... und wenn man das dann nicht mehr haben will löscht man die region oder so mit den bekannten worldedit befehlen z.b. ....
     
  18. Programmieren ist nunmal eine komplexe Angelegenheit. ;)
    Lass mal die Finger von den WorldGuard sources, ich denke die könnten einen Anfänger mehr verwirren als helfen. Vielleicht solltest du eher mit weniger komplexen Plugins weiter machen um ein besseres Verständniss für Programmabläufe zu bekommen. Wenn du dann fleißig lernst wette ich du wirst in ein paar Wochen/Monaten über diesen Thread lachen und das Plugin komplett selbstständig schreiben. :)

    //EDIT: Ansonsten kann ich dir noch anbieten mich die nächsten Tage mal hinzusetzen und das Plugin für dich zu schreiben. Wenn du es aber exklusiv nur für dich haben willst kostet das eine Kleinigkeit.
     
  19. Offline

    Countdown2000

    danke für dein verständnis ...es ist nicht so das ich nicht die komplexität des programmierens kenne und sie interessiert mich ja auch aber es ist so..

    ich hab eine server idee und um diese idee zu realisieren ist so eine zone von nöten und alle plugins machen immer nur heil zonen und todeszonen und allen möglichen quatsch aber keine löscht das inventar .. ich hab schon mehrere nachfragen gestellt und 2 plugin programmierer einmal der von zdinv und der von regios haben mir gesagt sie bauen die option in ihr plugin ein

    aber das ist nun schon wochen her bei dem einen sogar 2 monate und mein server steht schon alles ist fertig bis auf diese eine region die das inventar löscht...

    deswegen dachte ich mach ich das plugin selbst ... aber wenn das nun monate dauern soll bis ich mal annähernd soweit bin das selbst zu schreiben dann bringt mir das jetzt nix...

    naja ich werd mal noch bissi spielereien in mein plugin einbauen und muss leider hoffen das irgendwer bald mal so was in sein plugin einbaut ... sonst ist mein server idee gestorben ...

    @V10lator : exklusiv für mich ist relativ wegenmeiner kann das auch ein öffentliches sein ... aber was meinste mit kostet eine kleinigkeit ... über welches preisleistungsverhältnis reden wir hier .. also wie schnell kannste sowas schreiben und was willste dafür

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 19, 2016
  20. Wenn es nicht exklusiv ist will ich garnichts, es steht dir aber immer frei den "Donate" Button in meiner Signatur zu nutzen. ;)
    Ansonsten meine ich mit einer Kleinigkeit, je nach Arbeitsaufwand, in etwa 5-20 Euro (natürlich auch Verhandlungssache... ;)).
    Mit dem schreiben habe ich bereits angefangen. Es wird bml für die Konfiguration nutzen und permissionsBukkit (superPerms) unterstützen. Leider habe ich jedoch gestern zu viel gefeiert weswegen ich viele Pausen einlege... Schätzungsweise wird es Morgen bis Übermorgen fertig sein, außer es kommt irgendwas dazwischen... :)
     
  21. Offline

    Countdown2000

    na dann bin ich mal gespannt ich tüfftel auch noch ein bissi rum und check mal was ich aus meinem plugin da machen kann ...
     
Thread Status:
Not open for further replies.

Share This Page