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

GermanEssentials Version: 1.9!!!

D

[Dev] DerModderDEV

Guest
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.

Javascript:
#GermanEssentials by DerModder
#Ändere hier die Währung
Waehrung: Geld
#Ändere hier die Join Nachricht:
Join: '&2Der Spieler %Player% hat den Server betreten.'
#Ändere hier die Leave Nachricht:
Leave: '&2Der Spieler %Player% hat den Server verlassen.'
#Ändere hier die Kick Message
KickMSG: '&4Du wurdest vom Server gekickt!'
#Ändere hier den Ban Command
BanMSG: '&4Du wurdest vom Server gebannt!'
#Du kannst hier den Title ändern oder an und ausschalten.
Title: true
  MSGOne: '&4Wilkommen auf dem Server %Player%'
  MSGTwo: '&4Das ist der Text unter dem ersten'
#Ändere hier die Todes Nachricht.
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
 
Zuletzt bearbeitet von einem Moderator:

FelixKlauke

Erzengel
Ehem. Teammitglied
Registriert
5 Januar 2014
Beiträge
1.038
Diamanten
299
Minecraft
FelixKlauke
Ich habe mir die Freiheit genommen dein Plugin ein wenig auseinanderzunehmen.


Erster Eindruck:
CcpBa5T.png

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:
package me.DerModder.GermanEssentials;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import me.DerModder.GermanEssentials.CMD.ban_Command;
import me.DerModder.GermanEssentials.CMD.ec_Command;
import me.DerModder.GermanEssentials.CMD.feed_Command;
import me.DerModder.GermanEssentials.CMD.fly_Command;
import me.DerModder.GermanEssentials.CMD.gamemode_Command;
import me.DerModder.GermanEssentials.CMD.hat_Command;
import me.DerModder.GermanEssentials.CMD.heal_Command;
import me.DerModder.GermanEssentials.CMD.kick_Command;
import me.DerModder.GermanEssentials.CMD.kill_Command;
import me.DerModder.GermanEssentials.CMD.money_Command;
import me.DerModder.GermanEssentials.CMD.msg_Command;
import me.DerModder.GermanEssentials.CMD.msgspy_Command;
import me.DerModder.GermanEssentials.CMD.nick_Command;
import me.DerModder.GermanEssentials.CMD.setspawn_Command;
import me.DerModder.GermanEssentials.CMD.spawn_Command;
import me.DerModder.GermanEssentials.CMD.speed_Command;
import me.DerModder.GermanEssentials.CMD.time_Command;
import me.DerModder.GermanEssentials.CMD.unban_Command;
import me.DerModder.GermanEssentials.CMD.wb_Command;
import me.DerModder.GermanEssentials.CMD.weather_Command;
import me.DerModder.GermanEssentials.Events.death_Event;
import me.DerModder.GermanEssentials.Events.join_Event;
import me.DerModder.GermanEssentials.Events.playcommandpreproced_Event;
import me.DerModder.GermanEssentials.Events.quit_Event;
import org.bukkit.Bukkit;
import org.bukkit.attribute.Attribute;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.command.PluginCommand;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.java.JavaPlugin;

public class main
  extends JavaPlugin
{
  private static main instance;
  public static String pr = "��7[��2Essentials��7] ��b";
  public static String noperm = "��7[��2Essentials��7] ��4Du hast keine Permissions!";
  public static List<String> msgallowed = new ArrayList();
  public static List<Player> flyList = new ArrayList();

  public void onEnable()
  {
    ConsoleCommandSender sender = Bukkit.getConsoleSender();
    sender.sendMessage("��4==============================");
    sender.sendMessage("��eDeveloper: ��4" + getDescription().getAuthors());
    sender.sendMessage("��eVersion: ��4" + getDescription().getVersion());
    sender.sendMessage("��eDas Plugin wurde gestartet!");
    sender.sendMessage("��4==============================");
    instance = this;
    getConfig().addDefault(Attribute.GENERIC_ATTACK_SPEED.name(), Integer.valueOf(16));
    saveDefaultConfig();
    registerCommand();
  }

  public void onDisable()
  {
    instance = null;
  }

  public static main getInstance()
  {
    return instance;
  }

  public void registerCommand()
  {
    getCommand("ban").setExecutor(new ban_Command());
    getCommand("feed").setExecutor(new feed_Command());
    getCommand("fly").setExecutor(new fly_Command());
    getCommand("gm").setExecutor(new gamemode_Command());
    getCommand("hat").setExecutor(new hat_Command());
    getCommand("heal").setExecutor(new heal_Command());
    getCommand("kick").setExecutor(new kick_Command());
    getCommand("kill").setExecutor(new kill_Command());
    getCommand("setspawn").setExecutor(new setspawn_Command());
    getCommand("spawn").setExecutor(new spawn_Command());
    getCommand("speed").setExecutor(new speed_Command());
    getCommand("time").setExecutor(new time_Command());
    getCommand("nick").setExecutor(new nick_Command());
    getCommand("weather").setExecutor(new weather_Command());
    getCommand("money").setExecutor(new money_Command());
 
    getCommand("wb").setExecutor(new wb_Command());
    getCommand("ec").setExecutor(new ec_Command());
    getCommand("msg").setExecutor(new msg_Command());
    getCommand("msgspy").setExecutor(new msgspy_Command());
    getCommand("unban").setExecutor(new unban_Command());
  }

  public void registerEvents()
  {
    new death_Event();
    new join_Event();
    new quit_Event();
    new playcommandpreproced_Event();
  }

  public static File createFile(String filename)
  {
    return new File("plugins//GermanEssentials", filename + ".yml");
  }

  public static FileConfiguration getConfiguration(File filename)
  {
    return YamlConfiguration.loadConfiguration(filename);
  }
}

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:
public void onEnable()
  {
    ConsoleCommandSender sender = Bukkit.getConsoleSender();
    sender.sendMessage("��4==============================");
    sender.sendMessage("��eDeveloper: ��4" + getDescription().getAuthors());
    sender.sendMessage("��eVersion: ��4" + getDescription().getVersion());
    sender.sendMessage("��eDas Plugin wurde gestartet!");
    sender.sendMessage("��4==============================");
    instance = this;
    getConfig().addDefault(Attribute.GENERIC_ATTACK_SPEED.name(), Integer.valueOf(16));
    saveDefaultConfig();
    registerCommand();
  }
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:
public void registerCommand()
  {
    getCommand("ban").setExecutor(new ban_Command());
    getCommand("feed").setExecutor(new feed_Command());
    getCommand("fly").setExecutor(new fly_Command());
    getCommand("gm").setExecutor(new gamemode_Command());
    getCommand("hat").setExecutor(new hat_Command());
    getCommand("heal").setExecutor(new heal_Command());
    getCommand("kick").setExecutor(new kick_Command());
    getCommand("kill").setExecutor(new kill_Command());
    getCommand("setspawn").setExecutor(new setspawn_Command());
    getCommand("spawn").setExecutor(new spawn_Command());
    getCommand("speed").setExecutor(new speed_Command());
    getCommand("time").setExecutor(new time_Command());
    getCommand("nick").setExecutor(new nick_Command());
    getCommand("weather").setExecutor(new weather_Command());
    getCommand("money").setExecutor(new money_Command());
 
    getCommand("wb").setExecutor(new wb_Command());
    getCommand("ec").setExecutor(new ec_Command());
    getCommand("msg").setExecutor(new msg_Command());
    getCommand("msgspy").setExecutor(new msgspy_Command());
    getCommand("unban").setExecutor(new unban_Command());
  }

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:
if ((cs instanceof Player))
    {
     ...
    }
    else
    {
      System.out.println("ERROR");
    }

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:
package me.DerModder.GermanEssentials.Economy;

import java.io.File;
import java.io.IOException;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;

public class API
{
  public static Integer getMoney(String name)
  {
    File file = new File("plugins/GeldSystem", "money.yml");
    FileConfiguration cfg = YamlConfiguration.loadConfiguration(file);
 
    int money = cfg.getInt(name + ".money");
    return Integer.valueOf(money);
  }

  public static void addMoney(String name, int amount)
  {
    File file = new File("plugins/GeldSystem", "money.yml");
    FileConfiguration cfg = YamlConfiguration.loadConfiguration(file);
 
    int money = cfg.getInt(name + ".money");
    money += amount;
    money -= amount;
    cfg.set(name + ".money", Integer.valueOf(money));
    try
    {
      cfg.save(file);
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
  }

  public static void removeMoney(String name, int amount)
  {
    File file = new File("plugins/GeldSystem", "money.yml");
    FileConfiguration cfg = YamlConfiguration.loadConfiguration(file);
 
    int money = cfg.getInt(name + ".money");
    money -= amount;
    cfg.set(name + ".money", Integer.valueOf(money));
    try
    {
      cfg.save(file);
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
  }

  public static void setMoney(String name, int amount)
  {
    File file = new File("plugins/GeldSystem", "money.yml");
    FileConfiguration cfg = YamlConfiguration.loadConfiguration(file);
 
    cfg.set(name + ".money", Integer.valueOf(amount));
    try
    {
      cfg.save(file);
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
  }
}

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:
package me.DerModder.GermanEssentials.Events;

import me.DerModder.GermanEssentials.main;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;

public class death_Event
  implements Listener
{
  @EventHandler
  public void onDeaht(PlayerDeathEvent e)
  {
    Player p = e.getEntity();
    Player k = p.getKiller();
    String msg = main.getInstance().getConfig().getString("DeathMSG");
    msg = msg.replace("%Player%", p.getName());
    msg = msg.replace("%Killer%", k.getName());
    e.setDeathMessage(msg);
  }
}

Deine Nick Klasse ist bestenfalls verbuggt und schlimmstenfalls... Keine Ahnung sag du es mir.
PHP:
package me.DerModder.GermanEssentials.Nick;

import com.mojang.authlib.GameProfile;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import java.util.UUID;
import me.DerModder.GermanEssentials.main;
import net.minecraft.server.v1_9_R1.EntityPlayer;
import net.minecraft.server.v1_9_R1.MinecraftServer;
import net.minecraft.server.v1_9_R1.PacketPlayOutPlayerInfo;
import net.minecraft.server.v1_9_R1.PacketPlayOutPlayerInfo.EnumPlayerInfoAction;
import net.minecraft.server.v1_9_R1.PlayerConnection;
import net.minecraft.server.v1_9_R1.PlayerInteractManager;
import net.minecraft.server.v1_9_R1.WorldServer;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_9_R1.CraftServer;
import org.bukkit.craftbukkit.v1_9_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;

public class API
{
  private static Plugin plugin;
  public static HashMap<UUID, String> PlayerName = new HashMap();
  public static HashMap<String, Player> NamePlayer = new HashMap();
  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";
  public static ArrayList<String> Names = new ArrayList();
  public static Random rnd = new Random();
  public static Random srnd = new Random();

  public API(Plugin Plugin)
  {
    plugin = Plugin;
    List<String> Namess = new ArrayList(Arrays.asList(NameList.split(",")));
    for (String s : Namess) {
      Names.add(s);
    }
  }

  public static void setNick(Player player, String Nick)
  {
    PlayerName.put(player.getUniqueId(), player.getName());
    NamePlayer.put(Nick, player);
 
    MinecraftServer nmsServer = ((CraftServer)Bukkit.getServer()).getServer();
    WorldServer nmsWorld = ((CraftWorld)Bukkit.getWorlds().get(0)).getHandle();
    EntityPlayer pNeu = new EntityPlayer(nmsServer, nmsWorld, new GameProfile(player.getUniqueId(), Nick), new PlayerInteractManager(nmsWorld));
    EntityPlayer p = ((CraftPlayer)player).getHandle();
    for (Player players : Bukkit.getOnlinePlayers())
    {
      PlayerConnection connection = ((CraftPlayer)players).getHandle().playerConnection;
      connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, new EntityPlayer[] { p }));
      connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { pNeu }));
    }
    player.setDisplayName(Nick);
    player.setCustomName(Nick);
  }

  public static void addNameToRandom(String Name)
  {
    if (Name.length() > 17) {
      Names.add(Name);
    } else {
      System.out.println(Name + " ist zulang f��r einen Namen - addNameToRandom");
    }
  }

  public static void removeNameFromRandom(String Name)
  {
    if (Names.contains(Name)) {
      Names.remove(Name);
    }
  }

  public static void setRandomNick(Player player)
  {
    PlayerName.put(player.getUniqueId(), player.getName());
 
    int zufall = rnd.nextInt(Names.size());
    String Nick = (String)Names.get(zufall);
 
    NamePlayer.put(Nick, player);
 
    MinecraftServer nmsServer = ((CraftServer)Bukkit.getServer()).getServer();
    WorldServer nmsWorld = ((CraftWorld)Bukkit.getWorlds().get(0)).getHandle();
    EntityPlayer pNeu = new EntityPlayer(nmsServer, nmsWorld, new GameProfile(player.getUniqueId(), Nick), new PlayerInteractManager(nmsWorld));
    EntityPlayer p = ((CraftPlayer)player).getHandle();
    for (Player players : Bukkit.getOnlinePlayers())
    {
      PlayerConnection connection = ((CraftPlayer)players).getHandle().playerConnection;
      connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, new EntityPlayer[] { p }));
      connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { pNeu }));
    }
    player.setDisplayName(Nick);
    player.setCustomName(Nick);
 
    player.sendMessage(main.pr + "Dein Nick ist nun: " + Nick);
  }

  public static void removeNick(Player player)
  {
    String Name = getRealName(player.getCustomName());
    MinecraftServer nmsServer = ((CraftServer)Bukkit.getServer()).getServer();
    WorldServer nmsWorld = ((CraftWorld)Bukkit.getWorlds().get(0)).getHandle();
    EntityPlayer pNeu = new EntityPlayer(nmsServer, nmsWorld, new GameProfile(player.getUniqueId(), Name), new PlayerInteractManager(nmsWorld));
    EntityPlayer p = new EntityPlayer(nmsServer, nmsWorld, new GameProfile(player.getUniqueId(), player.getCustomName()), new PlayerInteractManager(nmsWorld));
    for (Player players : Bukkit.getOnlinePlayers())
    {
      PlayerConnection connection = ((CraftPlayer)players).getHandle().playerConnection;
      connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, new EntityPlayer[] { p }));
      connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { pNeu }));
    }
    player.setDisplayName(Name);
    player.setCustomName(Name);
 
    player.sendMessage("��7[��5Nick��7] >> Dein Nick wurde nun zur��ckgesetzt auf: ��e[" + Name + "]");
  }

  public static String getRealName(String Name)
  {
    if (NamePlayer.containsKey(Name))
    {
      Player player = (Player)NamePlayer.get(Name);
      if (PlayerName.containsKey(player.getUniqueId())) {
        return (String)PlayerName.get(player.getUniqueId());
      }
    }
    return "";
  }
}

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
 

Soldat.Am.Huf

Redstoneengineer
Registriert
9 März 2016
Beiträge
31
Diamanten
0
@[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.
 
D

[Dev] DerModderDEV

Guest
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:
money=money+amount;
        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
 
Zuletzt bearbeitet von einem Moderator:

Kroseida

Schafhirte
Registriert
28 September 2015
Beiträge
110
Alter
28
Diamanten
307
Minecraft
Kroseida
Mit den Namen der Klassen und der Übersicht
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
 
Zuletzt bearbeitet:
D

[Dev] DerModderDEV

Guest
Hallo Kroseida,

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

MfG
- DerModderDEV
 
S

Shio

Guest
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.
 

Soldat.Am.Huf

Redstoneengineer
Registriert
9 März 2016
Beiträge
31
Diamanten
0
@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
 

Kroseida

Schafhirte
Registriert
28 September 2015
Beiträge
110
Alter
28
Diamanten
307
Minecraft
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.
Ich hab hier wohl eine ungenau antwort gegeben, ich wollte bei dieser Aussage auf das Groß-/Kleinschreiben von Klassen und Paketen eingehen.
Mein Fehler.
 
S

Shio

Guest
@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

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.
 
X

|| xX [DEV][LP] Ms. DivaCraft Xx ||

Guest
als Mitarbeiter einer Firma, die genügend IBM-Systeme mit deren Jars im einsatz hat sagen
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.
 
Oben