ServerPlugin GermanEssentials Version: 1.9!!!

Dieses Thema im Forum "Selbstgeschriebene Plugins | Mods | Programme" wurde erstellt von [Dev] DerModderDEV, 19. März 2016.

  1. [Dev] DerModderDEV
    Offline

    [Dev] DerModderDEV

    Registriert seit:
    5. Februar 2016
    Beiträge:
    15
    Hallo liebe Minecraft Community,

    Ich habe für euch hier mal ein kleines Essentials geschrieben, das auf der Version 1.9 basiert. Hier sind soweit die wichtigsten Essentials Befehle dabei, es werden aber weitere Folgen.

    Die Permissions, sind die in den [].
    Commands:
    [ge.economy] /money - Zeigt dein Geld an.
    [ge.economy.add] /money add <Player> <Betrag> - Gibt einem Spieler einen Betrag.
    [ge.economy.set] /money set <Player> <Betrag> - Setzt einem Spieler einen Betrag.
    [ge.economy.remove] /money remove <Player> <Betrag> - Nimmt dem Spieler einen Betrag.
    [ge.kill] /kill <Player> - Tötet einen Spieler.
    [ge.bar] /bar create <Name> <Farbe> - Erstellt eine CrossBar (Wie die im End), mit einem Titel und einer beliebigen Farbe.
    [ge.fly] /fly - Setzt dir Fly.
    [ge.gm.<0|1|2|3>] /gm <0|1|2|3> - Gibt dir den jeweiligen Modus.
    [gm.ban] /ban <Player> <Grund> - Bannt einen Spieler, mit dem jeweiligen Grund.
    [gm.unban] /unban <Player> - Entbannt einen Spieler.
    [gm.time]/time <Zeit> - Setzt die Uhrzeit auf die jeweilige Zeit. (InGame Zeit = Ticks)
    [gm.time.<day|night> /time <day|night> - Setzt Tag oder Nacht.
    [gm.weather] /weather <rain|storm|clear> - Setzt das Wetter auf Regen, Sturm oder wieder auf klares Wetter.
    [gm.nick] /nick - Für einen Random Nick.
    [gm.nick] /nick set <Name> - Setzt dir einen beliebigen Nick.
    [gm.nick] /nick remove - Löscht einen aktuellen Nick.
    [gm.setspawn] /setspawn - Setzt den Spawn.
    [gm.spawn] /spawn - Telepotiert dich zum Spawn.
    [gm.speed] /speed <Spieed> - Gibt dir den angegebenen Speed.
    [gm.kick] /kick <Player> - Kickt einen Spieler von dem Server.
    [gm.feed] /feed - Füllt deine Hungersanzeige
    [gm.heal] /heal - Heilt dich voll.
    [gm.wb] /wb - Öffnet eine Workbench.
    [gm.ec] /ec - Öffnet eine Enderchest.
    [gm.gat] /hat - Gibt dir das Item das du in der Hand hast als Kopf.
    [gm.msg] /msg <Spieler> <Nachricht> - Schickt einem Spieler eine private Nachricht.
    [gm.msgspy] /msgspy - Wenn aktiviert, kann man die privaten Nachrichten anderer Spieler mit lesen.

    Code (Javascript):
    1. #GermanEssentials by DerModder
    2. #Ändere hier die Währung
    3. Waehrung: Geld
    4. #Ändere hier die Join Nachricht:
    5. Join: '&2Der Spieler %Player% hat den Server betreten.'
    6. #Ändere hier die Leave Nachricht:
    7. Leave: '&2Der Spieler %Player% hat den Server verlassen.'
    8. #Ändere hier die Kick Message
    9. KickMSG: '&4Du wurdest vom Server gekickt!'
    10. #Ändere hier den Ban Command
    11. BanMSG: '&4Du wurdest vom Server gebannt!'
    12. #Du kannst hier den Title ändern oder an und ausschalten.
    13. Title: true
    14.   MSGOne: '&4Wilkommen auf dem Server %Player%'
    15.   MSGTwo: '&4Das ist der Text unter dem ersten'
    16. #Ändere hier die Todes Nachricht.
    17. DeathMSG: 'Der Spieler %Player% wurde von %Killer% getötet.'  

    Der Cooldown ist deaktiviert!

    Download: HIER

    Bei fragen wende dich hier im Forum an mich, oder per Skype: dermodderdev.

    Achtung: Es könnten Bugs auftreten da dies die 1.9 ist! Wenn Bugs auftreten bitte sofort mir bescheid geben damit ich sie direkt fixen kann!

    Das wahr die Plugin vorstellung :). Es werden weitere Updates folgen.

    MfG
    -DerModderDEV
     
    #1
    jensIO gefällt das.
  2. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    Ich habe mir die Freiheit genommen dein Plugin ein wenig auseinanderzunehmen.


    Erster Eindruck:
    [​IMG]

    Klassennamen schreibt man nach den Java Code Conventions (http://www.oracle.com/technetwork/java/codeconvtoc-136057.html) groß (Siehe auch: https://en.wikipedia.org/wiki/CamelCase). Packagenamen schreibt man dagegen klein.

    Die Hauptklasse:
    PHP:
    1. package me.DerModder.GermanEssentials;
    2.  
    3. import java.io.File;
    4. import java.util.ArrayList;
    5. import java.util.List;
    6. import me.DerModder.GermanEssentials.CMD.ban_Command;
    7. import me.DerModder.GermanEssentials.CMD.ec_Command;
    8. import me.DerModder.GermanEssentials.CMD.feed_Command;
    9. import me.DerModder.GermanEssentials.CMD.fly_Command;
    10. import me.DerModder.GermanEssentials.CMD.gamemode_Command;
    11. import me.DerModder.GermanEssentials.CMD.hat_Command;
    12. import me.DerModder.GermanEssentials.CMD.heal_Command;
    13. import me.DerModder.GermanEssentials.CMD.kick_Command;
    14. import me.DerModder.GermanEssentials.CMD.kill_Command;
    15. import me.DerModder.GermanEssentials.CMD.money_Command;
    16. import me.DerModder.GermanEssentials.CMD.msg_Command;
    17. import me.DerModder.GermanEssentials.CMD.msgspy_Command;
    18. import me.DerModder.GermanEssentials.CMD.nick_Command;
    19. import me.DerModder.GermanEssentials.CMD.setspawn_Command;
    20. import me.DerModder.GermanEssentials.CMD.spawn_Command;
    21. import me.DerModder.GermanEssentials.CMD.speed_Command;
    22. import me.DerModder.GermanEssentials.CMD.time_Command;
    23. import me.DerModder.GermanEssentials.CMD.unban_Command;
    24. import me.DerModder.GermanEssentials.CMD.wb_Command;
    25. import me.DerModder.GermanEssentials.CMD.weather_Command;
    26. import me.DerModder.GermanEssentials.Events.death_Event;
    27. import me.DerModder.GermanEssentials.Events.join_Event;
    28. import me.DerModder.GermanEssentials.Events.playcommandpreproced_Event;
    29. import me.DerModder.GermanEssentials.Events.quit_Event;
    30. import org.bukkit.Bukkit;
    31. import org.bukkit.attribute.Attribute;
    32. import org.bukkit.command.ConsoleCommandSender;
    33. import org.bukkit.command.PluginCommand;
    34. import org.bukkit.configuration.file.FileConfiguration;
    35. import org.bukkit.configuration.file.YamlConfiguration;
    36. import org.bukkit.entity.Player;
    37. import org.bukkit.plugin.PluginDescriptionFile;
    38. import org.bukkit.plugin.java.JavaPlugin;
    39.  
    40. public class main
    41.   extends JavaPlugin
    42. {
    43.   private static main instance;
    44.   public static String pr = "��7[��2Essentials��7] ��b";
    45.   public static String noperm = "��7[��2Essentials��7] ��4Du hast keine Permissions!";
    46.   public static List<String> msgallowed = new ArrayList();
    47.   public static List<Player> flyList = new ArrayList();
    48.  
    49.   public void onEnable()
    50.   {
    51.     ConsoleCommandSender sender = Bukkit.getConsoleSender();
    52.     sender.sendMessage("��4==============================");
    53.     sender.sendMessage("��eDeveloper: ��4" + getDescription().getAuthors());
    54.     sender.sendMessage("��eVersion: ��4" + getDescription().getVersion());
    55.     sender.sendMessage("��eDas Plugin wurde gestartet!");
    56.     sender.sendMessage("��4==============================");
    57.     instance = this;
    58.     getConfig().addDefault(Attribute.GENERIC_ATTACK_SPEED.name(), Integer.valueOf(16));
    59.     saveDefaultConfig();
    60.     registerCommand();
    61.   }
    62.  
    63.   public void onDisable()
    64.   {
    65.     instance = null;
    66.   }
    67.  
    68.   public static main getInstance()
    69.   {
    70.     return instance;
    71.   }
    72.  
    73.   public void registerCommand()
    74.   {
    75.     getCommand("ban").setExecutor(new ban_Command());
    76.     getCommand("feed").setExecutor(new feed_Command());
    77.     getCommand("fly").setExecutor(new fly_Command());
    78.     getCommand("gm").setExecutor(new gamemode_Command());
    79.     getCommand("hat").setExecutor(new hat_Command());
    80.     getCommand("heal").setExecutor(new heal_Command());
    81.     getCommand("kick").setExecutor(new kick_Command());
    82.     getCommand("kill").setExecutor(new kill_Command());
    83.     getCommand("setspawn").setExecutor(new setspawn_Command());
    84.     getCommand("spawn").setExecutor(new spawn_Command());
    85.     getCommand("speed").setExecutor(new speed_Command());
    86.     getCommand("time").setExecutor(new time_Command());
    87.     getCommand("nick").setExecutor(new nick_Command());
    88.     getCommand("weather").setExecutor(new weather_Command());
    89.     getCommand("money").setExecutor(new money_Command());
    90.  
    91.     getCommand("wb").setExecutor(new wb_Command());
    92.     getCommand("ec").setExecutor(new ec_Command());
    93.     getCommand("msg").setExecutor(new msg_Command());
    94.     getCommand("msgspy").setExecutor(new msgspy_Command());
    95.     getCommand("unban").setExecutor(new unban_Command());
    96.   }
    97.  
    98.   public void registerEvents()
    99.   {
    100.     new death_Event();
    101.     new join_Event();
    102.     new quit_Event();
    103.     new playcommandpreproced_Event();
    104.   }
    105.  
    106.   public static File createFile(String filename)
    107.   {
    108.     return new File("plugins//GermanEssentials", filename + ".yml");
    109.   }
    110.  
    111.   public static FileConfiguration getConfiguration(File filename)
    112.   {
    113.     return YamlConfiguration.loadConfiguration(filename);
    114.   }
    115. }
    116.  

    Der erste Eindruck hinterlässt ein Bild, welches durch einen Blick in die Hauptklasse weiter gemalt wird. Auch hier gibt es kleine Klassennamen und ein paar allseits beliebte public static fields (Kann man nichts gegen sagen, nur auch hier werden Code Conventions ignoriert, objektoriert ist das in diesem Fall nur geringfügig). Die onEnable Methode:
    PHP:
    1.  
    2. public void onEnable()
    3.   {
    4.     ConsoleCommandSender sender = Bukkit.getConsoleSender();
    5.     sender.sendMessage("��4==============================");
    6.     sender.sendMessage("��eDeveloper: ��4" + getDescription().getAuthors());
    7.     sender.sendMessage("��eVersion: ��4" + getDescription().getVersion());
    8.     sender.sendMessage("��eDas Plugin wurde gestartet!");
    9.     sender.sendMessage("��4==============================");
    10.     instance = this;
    11.     getConfig().addDefault(Attribute.GENERIC_ATTACK_SPEED.name(), Integer.valueOf(16));
    12.     saveDefaultConfig();
    13.     registerCommand();
    14.   }
    15.  
    Hier sollte lieber mit dem von Bukkit genutzen Logger gearbeitet werden. Aber auch kein Beinbruch.

    Die registerCommand() Methode weißt von den Code Conventions die gleiche Auffäligkeit auf:
    PHP:
    1. public void registerCommand()
    2.   {
    3.     getCommand("ban").setExecutor(new ban_Command());
    4.     getCommand("feed").setExecutor(new feed_Command());
    5.     getCommand("fly").setExecutor(new fly_Command());
    6.     getCommand("gm").setExecutor(new gamemode_Command());
    7.     getCommand("hat").setExecutor(new hat_Command());
    8.     getCommand("heal").setExecutor(new heal_Command());
    9.     getCommand("kick").setExecutor(new kick_Command());
    10.     getCommand("kill").setExecutor(new kill_Command());
    11.     getCommand("setspawn").setExecutor(new setspawn_Command());
    12.     getCommand("spawn").setExecutor(new spawn_Command());
    13.     getCommand("speed").setExecutor(new speed_Command());
    14.     getCommand("time").setExecutor(new time_Command());
    15.     getCommand("nick").setExecutor(new nick_Command());
    16.     getCommand("weather").setExecutor(new weather_Command());
    17.     getCommand("money").setExecutor(new money_Command());
    18.  
    19.     getCommand("wb").setExecutor(new wb_Command());
    20.     getCommand("ec").setExecutor(new ec_Command());
    21.     getCommand("msg").setExecutor(new msg_Command());
    22.     getCommand("msgspy").setExecutor(new msgspy_Command());
    23.     getCommand("unban").setExecutor(new unban_Command());
    24.   }

    Deine registerEvents(), welche Listener registrieren soll wie ich vermute scheinst du gar nicht aufzurufen. Wenn du das irgendwo doch tust ist es anscheinend umständlich und nicht wirklich übersichtlich.
    Direkt bei dem Blick in in zwei Klasse für die implementierten Commands fällt auf, dass du wenig bis kei Exception Handling betreibst, I/= Operationen nur mangelhaft überwachst und die Usability durch viele Unnannehmlichkeiten leiden lässt. So sind zum Beispiel viele Commands auf Spieler beschränkt, auch wenn ein Aufruf per Konsole Sinn ergeben würde.

    PHP:
    1. if ((cs instanceof Player))
    2.     {
    3.      ...
    4.     }
    5.     else
    6.     {
    7.       System.out.println("ERROR");
    8.     }

    Ebenfalls wäre auch hier die Verwendung des Loggers von Bukkit zu empfehlen.
    Die schlechte Skalierbarkeit, Performance und die mangelhafte Effizienz deines Plugins werden einmal mehr durch deine Economyimplementierung bewiese.

    PHP:
    1. package me.DerModder.GermanEssentials.Economy;
    2.  
    3. import java.io.File;
    4. import java.io.IOException;
    5. import org.bukkit.configuration.file.FileConfiguration;
    6. import org.bukkit.configuration.file.YamlConfiguration;
    7.  
    8. public class API
    9. {
    10.   public static Integer getMoney(String name)
    11.   {
    12.     File file = new File("plugins/GeldSystem", "money.yml");
    13.     FileConfiguration cfg = YamlConfiguration.loadConfiguration(file);
    14.  
    15.     int money = cfg.getInt(name + ".money");
    16.     return Integer.valueOf(money);
    17.   }
    18.  
    19.   public static void addMoney(String name, int amount)
    20.   {
    21.     File file = new File("plugins/GeldSystem", "money.yml");
    22.     FileConfiguration cfg = YamlConfiguration.loadConfiguration(file);
    23.  
    24.     int money = cfg.getInt(name + ".money");
    25.     money += amount;
    26.     money -= amount;
    27.     cfg.set(name + ".money", Integer.valueOf(money));
    28.     try
    29.     {
    30.       cfg.save(file);
    31.     }
    32.     catch (IOException e)
    33.     {
    34.       e.printStackTrace();
    35.     }
    36.   }
    37.  
    38.   public static void removeMoney(String name, int amount)
    39.   {
    40.     File file = new File("plugins/GeldSystem", "money.yml");
    41.     FileConfiguration cfg = YamlConfiguration.loadConfiguration(file);
    42.  
    43.     int money = cfg.getInt(name + ".money");
    44.     money -= amount;
    45.     cfg.set(name + ".money", Integer.valueOf(money));
    46.     try
    47.     {
    48.       cfg.save(file);
    49.     }
    50.     catch (IOException e)
    51.     {
    52.       e.printStackTrace();
    53.     }
    54.   }
    55.  
    56.   public static void setMoney(String name, int amount)
    57.   {
    58.     File file = new File("plugins/GeldSystem", "money.yml");
    59.     FileConfiguration cfg = YamlConfiguration.loadConfiguration(file);
    60.  
    61.     cfg.set(name + ".money", Integer.valueOf(amount));
    62.     try
    63.     {
    64.       cfg.save(file);
    65.     }
    66.     catch (IOException e)
    67.     {
    68.       e.printStackTrace();
    69.     }
    70.   }
    71. }
    72.  

    Der größte Fehler liegt in deiner Speichermethode an sich. Du speicherst Geld in Verbindung mit dem Spielernamen, welche jedoch geändert werden kann, was einen Geldverlust bei Namensänderung zur Folge hat. Hier ist die Verwendung von UUIDs sinnvoll. Dann speicherst du dazu noch in Configs - Welche relativ langsam und schlecht zu warten sind. Eine Datenbank wie MySQL kann hier Abhilfe schaffen. Außerdem würde ich mir deine Berechnungen in der Methode addMoney() nochmal angucken.

    Ebenfalls unbegreiflich wie du zum Beispiel in deinem Deathlistener nicht ständig null Ausgaben bekommst:
    PHP:
    1. package me.DerModder.GermanEssentials.Events;
    2.  
    3. import me.DerModder.GermanEssentials.main;
    4. import org.bukkit.configuration.file.FileConfiguration;
    5. import org.bukkit.entity.Player;
    6. import org.bukkit.event.EventHandler;
    7. import org.bukkit.event.Listener;
    8. import org.bukkit.event.entity.PlayerDeathEvent;
    9.  
    10. public class death_Event
    11.   implements Listener
    12. {
    13.   @EventHandler
    14.   public void onDeaht(PlayerDeathEvent e)
    15.   {
    16.     Player p = e.getEntity();
    17.     Player k = p.getKiller();
    18.     String msg = main.getInstance().getConfig().getString("DeathMSG");
    19.     msg = msg.replace("%Player%", p.getName());
    20.     msg = msg.replace("%Killer%", k.getName());
    21.     e.setDeathMessage(msg);
    22.   }
    23. }
    24.  
    Deine Nick Klasse ist bestenfalls verbuggt und schlimmstenfalls... Keine Ahnung sag du es mir.
    PHP:
    1. package me.DerModder.GermanEssentials.Nick;
    2.  
    3. import com.mojang.authlib.GameProfile;
    4. import java.io.PrintStream;
    5. import java.util.ArrayList;
    6. import java.util.Arrays;
    7. import java.util.HashMap;
    8. import java.util.List;
    9. import java.util.Random;
    10. import java.util.UUID;
    11. import me.DerModder.GermanEssentials.main;
    12. import net.minecraft.server.v1_9_R1.EntityPlayer;
    13. import net.minecraft.server.v1_9_R1.MinecraftServer;
    14. import net.minecraft.server.v1_9_R1.PacketPlayOutPlayerInfo;
    15. import net.minecraft.server.v1_9_R1.PacketPlayOutPlayerInfo.EnumPlayerInfoAction;
    16. import net.minecraft.server.v1_9_R1.PlayerConnection;
    17. import net.minecraft.server.v1_9_R1.PlayerInteractManager;
    18. import net.minecraft.server.v1_9_R1.WorldServer;
    19. import org.bukkit.Bukkit;
    20. import org.bukkit.craftbukkit.v1_9_R1.CraftServer;
    21. import org.bukkit.craftbukkit.v1_9_R1.CraftWorld;
    22. import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer;
    23. import org.bukkit.entity.Player;
    24. import org.bukkit.plugin.Plugin;
    25.  
    26. public class API
    27. {
    28.   private static Plugin plugin;
    29.   public static HashMap<UUID, String> PlayerName = new HashMap();
    30.   public static HashMap<String, Player> NamePlayer = new HashMap();
    31.   public static String NameList = "Spooginator,Calnex,Mikey8152,cRaZyHoRnBaG,Grighton,thegoods1121,Unterwerfen,Alehks,jagstang,Klinke,Valkar,Reborn,Gunk,Nugget2468,Joeslop,omnivance,shot2bits,daverave,Freeek,Gennerator,Colin,rampageturke,SupraMan,GiantGonzoGuy,lothies,dhunter,windwakr,WANs,Fisheatsbear,cs028350,devin_ganoe,a003,Anjow,MrLoL,Kusssy,Hezzu,tenminutegod,benaq,legoss,Fanboy2003,DiamondSpidey,Big4Mac,Crafter2014,oodani,Ghost_Dev,kraxboy,MisterAwesome,MonstaBoy,PhinoGuy,bl4ckbird_,PascalHD,Juli203,champnice,kevkill99,x6ey7l,PartyFreak98,JanCraft1994,Peter8495,pamtum,Kariloko,ordi7,Reader27,Amaleeine,WillFrost,CyberKnight77,finsters05,m1a2h3a4,aperry1993,Bloodnight,ch0c0lat3man,cdog12456789,chall63461,daanisjaap,Misterz_Nodles,nosnarb,ogot101,quinnstrong,radioactivkitt,shadowtyp,stanglemer,TheFunkyBone,Timewaster8,Undead6,Yungenstein,_tever13,yankees2,wackoman689,torval01,Alizatina,bob6199,Burblessnot,Chieftainy,Deungo,Ever,Goldrim,iKanak,klanz,lucisiac,Mezua,BigMucho,bizznchriz,Braxis,craftermagic,Deungo,foxhull,ggt3416,jjd712,ktish,Mouei,,S4INT,Slurth,tgy320,Yuukke";
    32.   public static ArrayList<String> Names = new ArrayList();
    33.   public static Random rnd = new Random();
    34.   public static Random srnd = new Random();
    35.  
    36.   public API(Plugin Plugin)
    37.   {
    38.     plugin = Plugin;
    39.     List<String> Namess = new ArrayList(Arrays.asList(NameList.split(",")));
    40.     for (String s : Namess) {
    41.       Names.add(s);
    42.     }
    43.   }
    44.  
    45.   public static void setNick(Player player, String Nick)
    46.   {
    47.     PlayerName.put(player.getUniqueId(), player.getName());
    48.     NamePlayer.put(Nick, player);
    49.  
    50.     MinecraftServer nmsServer = ((CraftServer)Bukkit.getServer()).getServer();
    51.     WorldServer nmsWorld = ((CraftWorld)Bukkit.getWorlds().get(0)).getHandle();
    52.     EntityPlayer pNeu = new EntityPlayer(nmsServer, nmsWorld, new GameProfile(player.getUniqueId(), Nick), new PlayerInteractManager(nmsWorld));
    53.     EntityPlayer p = ((CraftPlayer)player).getHandle();
    54.     for (Player players : Bukkit.getOnlinePlayers())
    55.     {
    56.       PlayerConnection connection = ((CraftPlayer)players).getHandle().playerConnection;
    57.       connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, new EntityPlayer[] { p }));
    58.       connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { pNeu }));
    59.     }
    60.     player.setDisplayName(Nick);
    61.     player.setCustomName(Nick);
    62.   }
    63.  
    64.   public static void addNameToRandom(String Name)
    65.   {
    66.     if (Name.length() > 17) {
    67.       Names.add(Name);
    68.     } else {
    69.       System.out.println(Name + " ist zulang f��r einen Namen - addNameToRandom");
    70.     }
    71.   }
    72.  
    73.   public static void removeNameFromRandom(String Name)
    74.   {
    75.     if (Names.contains(Name)) {
    76.       Names.remove(Name);
    77.     }
    78.   }
    79.  
    80.   public static void setRandomNick(Player player)
    81.   {
    82.     PlayerName.put(player.getUniqueId(), player.getName());
    83.  
    84.     int zufall = rnd.nextInt(Names.size());
    85.     String Nick = (String)Names.get(zufall);
    86.  
    87.     NamePlayer.put(Nick, player);
    88.  
    89.     MinecraftServer nmsServer = ((CraftServer)Bukkit.getServer()).getServer();
    90.     WorldServer nmsWorld = ((CraftWorld)Bukkit.getWorlds().get(0)).getHandle();
    91.     EntityPlayer pNeu = new EntityPlayer(nmsServer, nmsWorld, new GameProfile(player.getUniqueId(), Nick), new PlayerInteractManager(nmsWorld));
    92.     EntityPlayer p = ((CraftPlayer)player).getHandle();
    93.     for (Player players : Bukkit.getOnlinePlayers())
    94.     {
    95.       PlayerConnection connection = ((CraftPlayer)players).getHandle().playerConnection;
    96.       connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, new EntityPlayer[] { p }));
    97.       connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { pNeu }));
    98.     }
    99.     player.setDisplayName(Nick);
    100.     player.setCustomName(Nick);
    101.  
    102.     player.sendMessage(main.pr + "Dein Nick ist nun: " + Nick);
    103.   }
    104.  
    105.   public static void removeNick(Player player)
    106.   {
    107.     String Name = getRealName(player.getCustomName());
    108.     MinecraftServer nmsServer = ((CraftServer)Bukkit.getServer()).getServer();
    109.     WorldServer nmsWorld = ((CraftWorld)Bukkit.getWorlds().get(0)).getHandle();
    110.     EntityPlayer pNeu = new EntityPlayer(nmsServer, nmsWorld, new GameProfile(player.getUniqueId(), Name), new PlayerInteractManager(nmsWorld));
    111.     EntityPlayer p = new EntityPlayer(nmsServer, nmsWorld, new GameProfile(player.getUniqueId(), player.getCustomName()), new PlayerInteractManager(nmsWorld));
    112.     for (Player players : Bukkit.getOnlinePlayers())
    113.     {
    114.       PlayerConnection connection = ((CraftPlayer)players).getHandle().playerConnection;
    115.       connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, new EntityPlayer[] { p }));
    116.       connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { pNeu }));
    117.     }
    118.     player.setDisplayName(Name);
    119.     player.setCustomName(Name);
    120.  
    121.     player.sendMessage("��7[��5Nick��7] >> Dein Nick wurde nun zur��ckgesetzt auf: ��e[" + Name + "]");
    122.   }
    123.  
    124.   public static String getRealName(String Name)
    125.   {
    126.     if (NamePlayer.containsKey(Name))
    127.     {
    128.       Player player = (Player)NamePlayer.get(Name);
    129.       if (PlayerName.containsKey(player.getUniqueId())) {
    130.         return (String)PlayerName.get(player.getUniqueId());
    131.       }
    132.     }
    133.     return "";
    134.   }
    135. }
    136.  

    Nicht nur die Namensgebung ist mehr als verwirrend sondern auch deine Algorithmen sind, entschuldigung, Schrott. Versionsübergreifende Kompatibilität ist nicht gegebenen. NMS Klasse werden ohne irgendwelche Vorkehrungen genutzt. Auf Code Conventions, Sicherheit und Usability wird nicht geachtet.

    Als Beispiel ist da deine plugin.yml zu nennen. Pastebin (Beitragszeichenlimit pfui): http://pastebin.com/DdMULV5Z

    Hier wurde nur das wirklich nötigste eingetragen. Andere Plugins die deine Beschreibung brauchen um zum Beispiel die Permissions zu analysiere sind hier vollkommen aufgeschmissen. Zumindest usage und Permission sollte man für die Help Seiten von Bukkit hunzufügen.


    Im großen und ganzen ist mir unklar warum dieses Plugin überhaupt vom Server geladen wird. Die Hälfte deiner Klassen weisen gravierende Logikfehler auf und irgendwie glaube ich dass du dieses Plugin nicht einmal getestet hast, oder eben kein Gewissen hast denn das kann gar nicht funktionieren - Das anderen Leuten unterzujubeln ist eigentlich unverantwortlich.


    Ich hoffe du kannst damit etwas anfangen und die gröbsten Fehler berichtigen, denn so wie es jetzt ist ist dein Plugin unbenutzbar.

    MFG
    Sasuke
     
    #2
  3. Soldat.Am.Huf
    Offline

    Soldat.Am.Huf

    Registriert seit:
    9. März 2016
    Beiträge:
    31
    @[Dev] iTzSasukeHDxLP MySQL ist nicht schneller als eine Config, weil eine Netzwerkoperation langsamer ist als eine Map zu durchsuchen. Die Configuration, die standardmäßig mit CraftBukkit ausgeliefert wird, speichert diese automatisch in eine intermediäre Datenstruktur zwischen.

    Auch ist dein Argument, dass NMS Klassen nicht benutzt werden sollten ohne größere Vorkehrungen nicht ansatzweise richtig. Im Objektorientierten Sinne wäre es natürlich Sinnig die Methoden in eigene gekapselte Objekte zu überführen und entsprechend zu laden. Sicherlich sollte auch Fokus auf andere Paradigment gelegt werden, jedoch macht das das Plugin noch lange nicht "unbenutzbar".

    Man braucht nicht seine eigene Meinung anderen ins Gesicht wedeln um seine eigenen Komplexe zu befriedigen. Ein derartiges Verhalten ist nicht kollegial.
     
    #3
    GPSforLEGENDS und jensIO gefällt das.
  4. [Dev] DerModderDEV
    Offline

    [Dev] DerModderDEV

    Registriert seit:
    5. Februar 2016
    Beiträge:
    15
    Lieber iTzSasukeHD,

    Erstmal Danke, für das downloaden des Plugins.

    Mit den Namen der Klassen und der Übersicht, ist meine Sache ich komme damit sehr gut zurecht. Und mit der addMoney() Methode was meinst du da ? Meinst du da etwa das:

    Code (Text):
    1. money=money+amount;
    2.         money=money-amount;

    Wenn du das meinst, dann ist hier die Erklärung:
    Wenn man /money add Spieler2 100 macht, dann gibt man dem Spieler 100, von seinem eigenem Geld. D.h. man muss das Geld ihm auch noch abziehen.

    Und mit der NickAPI, bei mir geht alles einwandfrei ich habe es auch öfters von Testern durch testen lassen da gab es nichts zu bemängeln.

    Und ich habe das Plugin getestet! Sogar mehrmals auf Bugs, und es sind KEINE aufgetreten!

    Das mit den registerEvents(), wahr mein Fehler. Sry.
    Und lass mich doch coden, wie ich will. Es ist mein eigener Stiel so habe ich es mit angewöhnt. Wenn dir was nicht passt, dann schau dir den Code doch nicht an.

    MfG
    - DerModderDEV
     
    #4
    adagi und jensIO gefällt das.
  5. Kroseida
    Offline

    Kroseida

    Registriert seit:
    28. September 2015
    Beiträge:
    54
    Ort:
    /root/
    Minecraft:
    Kroseida
    Es sind dinge die von Java als Standart gesetzt/gewählt wurden an denn die du dich nicht hältst.
    Es gibt Betriebssysteme welche durch diese fehler Exception o.ä verursachen.

    EDIT
    Das war auf Groß-/Kleinschreibung bezogen
     
    #5
  6. [Dev] DerModderDEV
    Offline

    [Dev] DerModderDEV

    Registriert seit:
    5. Februar 2016
    Beiträge:
    15
    Hallo Kroseida,

    Okay, dann werde ich mir das mal zu Herzen nehmen und mich daran halten.

    MfG
    - DerModderDEV
     
    #6
  7. Shio
    Offline

    Shio

    Registriert seit:
    6. Februar 2016
    Beiträge:
    13
    Wenn ihr euch mal den Java-Code von größeren Firmen(z.B. IBM) anschaut, dann wird sich dort an NULL Java Standards/Konventionen gehalten... und warum? Weil der Java-Code vor dem weitergeben der JAR's auf diese Weise unleserlich/unlesbar gemacht wird.

    Und wie man sieht, wird in der Minecraftszene sehr gerne der Code von anderen ausseinander genommen, kopiert, verbreitet und wie in diesem Fall kritisiert.

    Von daher sage ich die ModderDev, mach ihn NOCH unleserlicher, denn du veröffentlichst deine Plugins freiwillig
    und die anderen nutzen sie freiwillig.
     
    #7
  8. Soldat.Am.Huf
    Offline

    Soldat.Am.Huf

    Registriert seit:
    9. März 2016
    Beiträge:
    31
    @Kroseida

    Ich wage es mal zu bezweifeln. In der Java Spezifikation steht keine notwendigkeit diese Klassen zu verwenden. Ansonsten ist es ein Bug in der JVM.

    @Shio

    Da reicht ja nur ein Gegenbeispiel aus:
    https://github.com/watson-developer.../visual_recognition/v2/VisualRecognition.java

    Beispielsweise hier sind auch einige "IBM Konventionen":
    http://www.ibm.com/developerworks/library/ws-tip-namingconv.html

    Davon mal abgesehen, ist es keine Aussrede, dass schlechte Qualität (denn @[Dev] iTzSasukeHDxLP hat durchaus einige richtige Punkte angesprochen) durch kostenloses Angebot gerechtfertigt wird. Insbesondere deswegen, weil "Made in Germany" immer noch für Qualität steht.

    Deine hier angesprochene Forderung ist zudem einfach kindisch.

    Konventionen haben ihren Grund, weil sie die Meta-Ebene unterstützen. Etwas, dass die Unterhaltung über ein entsprechendes Fach vereinfacht. Zudem wird dadurch einfacheres und "smarteres" Denken der Maschienen ermöglicht.

    PS: https://de.wikipedia.org/wiki/Konvention_vor_Konfiguration
     
    #8
  9. Kroseida
    Offline

    Kroseida

    Registriert seit:
    28. September 2015
    Beiträge:
    54
    Ort:
    /root/
    Minecraft:
    Kroseida
    Ich hab hier wohl eine ungenau antwort gegeben, ich wollte bei dieser Aussage auf das Groß-/Kleinschreiben von Klassen und Paketen eingehen.
    Mein Fehler.
     
    #9
  10. Shio
    Offline

    Shio

    Registriert seit:
    6. Februar 2016
    Beiträge:
    13
    Schön, dass du mir als "Gegenbeispiel" link postest, jedoch kann ich dir als Mitarbeiter einer Firma, die genügend IBM-Systeme mit deren Jars im einsatz hat sagen, dass wenn du deren JAR's decompilst nur Methoden und Klassen drinne hast, die NIX aussagen.

    Das ist auch logisch, denn so schützen Sie ihren Source-Code und es gibt spezielle Programme die diese "verschlüsslung" tuen.

    Ich will natürlich nicht sagen, dass Ihr Code von Anfang an so aussehen, jedoch kann man nach außen hin seine Plugins so schützen.
     
    #10
  11. Immer wieder schön, dass hier nur die fähigsten und intelligentesten Personen aus diesem Feld auftauchen. Oh, moment!

    Es findet hier weder eine Verschlüsselung statt, noch schützt dies irgendetwas, jedoch kann es durchaus sein, dass IBM ihre Programme derartig ausliefert. Es erhöht nämlich den Aufwand von Reverse Engineering erheblich. Das ganze nennt sich auch "Obfuskation".

    Wenn andere Programme diese jedoch weiter verwenden sollen, so macht es wenig Sinn das Programm derartig zu verunstalten. Zudem zu behaupten, dass der SourceCode danach so aussieht ist ja wohl mehr als fahrlässig. Ein gutes Programm kann von jedem gelesen werden ohne große Arbeit. Das muss aber nicht für dessen Binaries gelten. Wobei ich nicht denke, dass ein wirklicher Schutz für ein derartiges Programm notwendig ist. - Daher würde ich es aber auch nicht benutzen.
     
    #11
    jensIO gefällt das.
  12. marCUBE
    Offline

    marCUBE

    Registriert seit:
    5. Juni 2015
    Beiträge:
    9
    Das Plugin klingt gut, jedoch benötige ich es nicht ;)
     
    #12
  13. happy1234
    Offline

    happy1234

    Registriert seit:
    1. April 2016
    Beiträge:
    1
    Hey cooles Plugin könntest du eine 1.8 Version machen :)
     
    #13
  14. Makrali
    Offline

    Makrali

    Registriert seit:
    13. Juli 2015
    Beiträge:
    1
    Ort:
    Hamburg
    Minecraft:
    Makrali
    Sehr cool <3
     
    #14