Beiträge von IDK_WHO_AM_I

    Ich muss das jetzt kurz fragen sonst haben wir hier eine massive Epidemie von "Verwirrung"

    Muss das Plugin die Maps aus irgendeinem Grund nicht auf dem Server haben oder warum sind bei deine Vorschläge so formuliert als dürften die Map Daten nicht auf dem Server liegen?


    Ich gehe jetzt trotzdem einfach mal von der normalen Prozedur aus.


    Ich speichere nicht eine ganze Map ist vollkommen unnötig. Es reicht doch die Eckdaten zu speichern.

    So kannst du ohne irgendwelche Logistik Probleme speichern wie die Map/Arena/Whatever definiert ist.

    Wenn es dir darum geht z.B. mehr als eine Map zur Verfügung zu stellen, selbes Prinzip nur mit mehreren und vielleicht einigen zusätzlichen Variablen über die Map (Builder, Name, etc)


    Wie du das JSON/YAML dann speicherst ist dir überlassen passt in eine Datei aber auch super in eine Datenbank.

    Du brauchst eine Tabelle in der zugewiesen wird welcher Spieler in welchem Clan ist.


    Du brauchst folgende Tabellen Struktur:


    clans

    ID (AUTO_INCREMENT, PRIMARY KEY)CLANNAME (UNIQUE)TAG (UNIQUE)LEADERUUID (UNIQUE)
    1MyClanMyC1319b060-20ae-42e3-91e5-4a70034d5d54


    clans_player

    CLANIDPLAYERUUID (UNIQUE)
    11319b060-20ae-42e3-91e5-4a70034d5d54
    1e1e04aed-e773-4512-8a59-e427182eb8f6


    Dann kannst du in nach der Spieler UUID prüfen und checken wenn sie vorkommt ob der Spieler überhaupt einen Clan hat.


    Statement:

    SELECT PLAYERUUID FROM clans_player WHERE PLAYERUUID = 'e1e04aed-e773-4512-8a59-e427182eb8f6'


    Result:

    e1e04aed-e773-4512-8a59-e427182eb8f6


    Das ist zwar nicht die optimallste Struktur aber funktionieren tut es trotzdem :D

    Um das zu fixen gibt es 2 Möglichkeiten entweder die Klasse vorladen oder über den DriverManager die Verbindung initialisieren.


    Code
    Class.forName("org.sqlite.SQLiteJDBCLoader");
    
    java.sql.Connection connection = DriverManager.getConnection("jdbc:sqlite:database.db");


    Im normalfall reicht es wenn du die untere Zeile verwendest ansonsten füge die obere Zeile irgendwo drüber hinzu um den Treiber zu laden.

    Hallo Leute,


    ich habe schon vor 1 - 2 Jahren mal meine Aufmerksamkeit auf diese Seite gerrichtet gehabt aber bin nicht wirklich darauf eingegangen.

    Nun habe ich die Seite zufälligerweise wieder ins Blickfeld bekommen und wollte nun mal eine Diskussion starten ob jemand anderes mehr weiß.


    Also kurz zur Erklärung ich denke die meisten hier kennen die EULA und DMCA Regelungen die Mojang mit der Übernahme durch Microsoft eingeführt hat aber hier nochmal die Links zum nachlesen.


    These Guidelines apply in addition to and not in place of our Account Terms or End User License Agreements (EULAs). Please remember that we have always said in our EULAs that we have one major rule: do not distribute anything we've made. This means don't:

    • give copies of our games to anyone else;
    • make commercial use of anything we've made (including our Names, Brands, and Assets);
    • try to make money from anything we've made (including our Names, Brands, and Assets); or
    • let other people get access to anything we've made in a way that is unfair or unreasonable;

    unless we specifically agree to it or allow it.

    Ich mag kein Jurist sein aber selbst für einen Laien steht da es ist VERBOTEN jegliche Art von ihrem Eigentum auf irgendeine Art zu vertreiben.


    Wie ich das sehe verdienen die Betreiber der Seite sehr wohl Geld durch die geschaltene Werbung auf der Seite.


    Advertisement LocationCostPeriod
    Bottom Banner$7530 Days
    Top banner$10030 Days
    Download Pages$15030 Days
    Host Create Button$15030 Days
    Looking to purchase more?ContactBy Request


    Und das noch zu ganz rentablen Preisen!


    Und dann ist da ja noch der Premium Account!


    Premium Membership: (One-Time) 8$

    API Membership: (Monthly): 20$ - COMING SOON


    Leider kann man nicht die Vorteile von Premium anschauen weil man dazu einen Account braucht.


    Also habe ich mich mal registriert natürlich in aller Vorsicht ein generiertes Passwort verwendet etc.

    Und nun ja die Registration klappte und auch die Email Bestätigung kam an aber das wars, wenn man sich einloggen will, geht es nicht, die Daten seine falsch oder der Account nicht Aktiviert!

    Drückt man auf Passwort vergessen und gibt seine Email ein, gibt es diese Email nicht?


    Fragt man sich doch was machen die nun mit den Daten?


    Nun seid Ihr an der Reihe wisst Ihr da was genaueres? Habt ihr irgendwelche Informationen zu getbukkit?

    Ich finde die ganze Seite extrem seltsam.


    Sollte ich irgendwo auf dem Weg etwas falsch verstanden haben informiert mich bitte, ich will hier schließlich keine falschen Infos verbreiten.


    Grüße Maxi

    Eine kurze Google Suche später...

    Open the server.properties file, set use-native-transport=false
    Will have a performance hit, but might stop it from exploding

    Zum PVP Thema auch in 1.14.X kann man das langweilige 1.8 Spam System simulieren. Ganz einfach, Balken ausblenden und den Schaden selbst berechnen :D

    Und eine Sache noch ich weiß das mag dir seltsam vorkommen, aber wenn du so Sachen wie CB1-16 oder CB Golder/Nero schreibst versteht jeder normale Mensch einfach nur Bahnhof.

    Das hier, diese Methode ist das Problem. In so einem try-with-resources wie du ihn hier verwendest kannst du nicht einfach jede Klasse verwenden,

    sondern nur welche die das interface AutoCloseable implementieren.

    Und das gilt auch für ein PreparedStatement bzw dessen Superinterface Statement.


    Was diese besondere Art von try-catch Block macht ist, es schließt die "Resource" automatisch am Ende. bedeutet jede nachfolgende Verwendung der "Resource" Instanz wird ein Operation not allowed werfen, weil diese nun mal geschlossen ist.

    Kurz gesagt diese Objekte sind nicht dazu gedacht in irgendeinem anderen "Scope" verwendet zu werden, als in dem es Initialisiert wurde.


    Jedoch selbst wenn du nicht ein try-with-resources nutzen würdest, sondern ein try-finally

    wäre das das selbe Problem. Am Ende der Leine wartet immer die Tatsache das das Objekt geschlossen wurde.


    Wenn du jedoch zum Beispiel es einfach nicht schließen würdest hättest du ein ganz anderes Problem würde das Statement offen bleiben mag das JDBC noch viel weniger.

    By default, only one ResultSet object per Statement object can be open at the same time. Therefore, if the reading of one ResultSet object is interleaved with the reading of another, each must have been generated by different Statement objects. All execution methods in the Statement interface implicitly close a statment's current ResultSet object if an open one exists.

    Nein, was du hier machst ist die direkte Verarbeitung der Daten.

    Du gibts hier schließlich nicht das ResultSet zurück bzw. verwendest es nicht nachdem das Statement geschlossen wurde, sondern prüfst ob die Spalte UUID nicht leer ist

    und gibst das Ergebnis aus dieser Prüfung zurück.


    Grundsätzlich sollte bei einer Query-Abfrage immer ein PreparedStatement verwendet. Vertraue niemals User Input!

    Ja direkte Verarbeitung wäre wenn du das Statement nicht über deine Utility Klasse ausführst sondern direkt da wo du die Daten brauchst und dann direkt aus dem ResultSetausliest.


    Aber da Utility Klassen ja eigentlich genau dazu da sind, wäre die andere Variante wohl besser. Und ich würde das nicht als Zwischenspeichern bezeichnen.

    Wenn dein Schiff sinkt fährst du ja auch nicht noch bis zum nächsten Hafen, sondern rufst ein anderes Schiff und lädst deine Ware um! (Metapher)


    Da es nun mal die unveränderliche Regel gibt, dass das ResultSet gelöscht wird nachdem das Statement geschlossen wird, muss ich halt meine Daten in ein anderes Objekt verfrachten wenn ich diese weiter verwenden will.

    Wie verbindet man zu deinem Server? Per Domain oder einfach die IP?

    Sind andere Services auf der Maschine ebenfalls "langsam" z.B.

    eine Webseite auf dem selben Server lädt die überdurchschnittlich lange?


    Vorerst versuch mal von deinem Server aus zu pingen und prüfe da den Ping!

    schreib einfach mal


    Linux:

    ping -c 15 8.8.8.8


    Windows:

    ping -n 15 8.8.8.8


    in die Konsole und dann mach das selbe nochmal von deinem PC aus. Ich vermute das dein PC einfach nur langsam ist.

    BTW. wie viele Server sind in deiner Serverliste? Ich kenne da so einige Kandidaten die da knapp 100 Stück drinnen haben und sich dann wundern das es lange lädt.


    Aber abgesehen vom Schönheitsfaktor ist es den wirklich so schlimm das es länger braucht, man kann schließlich auch schon davor verbinden man muss nicht auf die MOTD warten.

    Schreib mal das ganz an den Anfang deiner PHP. Dann wird dir nicht "500 Internal Error" gezeigt sondern der Fehler!

    Code
    error_reporting(E_ALL);
    ini_set("display_errors", 1);

    (Wieder entfernen wenn der Bug gefixt ist)


    Ansonsten empfehle ich, wenn du mit einer IDE entwickelst, den Debugger der entsprechenden IDE zu nutzen, so lassen sich Fehler am einfachsten finden und fixen.

    Hi erstmal,


    also zunächst steht die Lösung ja eigentlich schon in der Fehlermeldung

    Zitat

    java.sql.SQLException: Operation not allowed after ResultSet closed

    Du kannst leider nicht einfach ein ResultSetObjekt zurückgeben zumindest nicht wenn die Methode so aufgebaut ist wie hier :D

    A ResultSet object is automatically closed when the Statement object that generated it is closed, re-executed, or used to retrieve the next result from a sequence of multiple results.

    Du müsstest entweder das Query Ergebnis direkt verarbeiten ODER in irgendein anderes Objekt speichern. Hier bietet sich eine Tabelle ganz gut an


    Solltest du dich dazu entscheiden es umzuwandeln sollte dir das hier helfen:

    Code
            ResultSet rs = null;
            HashBasedTable<Integer, String, Object> table = HashBasedTable.create();
    
            while (rs.next()) {
                ResultSetMetaData metaData = rs.getMetaData();
                for (int i = 1; i < metaData.getColumnCount(); i++) {
                    String column = metaData.getColumnName(i);
                    table.put(i, column, rs.getObject(column));
                }
            }

    Am Ende solltest du dann eine Repräsentation des Query Ergebnisses haben.

    Die Spalten kannst du über den Spalten Namen abfragen und die Zeilen über die Nummer 1 - X

    bzw mit einem Loop durchgehen ist ebenfalls ein Kinderspiel :D


    Weiter zu der 2 ten Fehlermeldung, das ist kein Zusatz das ist ein ganz anderes Problem.


    Das Problem ist das du versuchst einen neuen Eintrag zu erstellen obwohl die eindeutige ID bereits vergeben ist, hier ist es die UUID.

    Damit dieses Problem nicht mehr vorkommt mach einfach folgendes. Verändere dieses Statement:


    INSERT INTO `system_players`(UUID, USERNAME, IP) VALUES (?, ?, ?)


    zu diesem:


    INSERT INTO `system_players`(UUID, USERNAME, IP) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE USERNAME=?, IP=?


    Das macht folgendes sollte der PRIMARY KEY wie in deinem Fall schon vorhanden sein führt SQL stattdessen ein UPDATE aus. Ist die kurze Variante von prüfen ob der Key schon vorhanden ist und dann Einfügen bzw Updaten :D


    Allerdings musst du dann den die Parameter für USERNAME und IP wiederholt übergeben.

    Es gibt eine Möglichkeit Parameter zu benennen aber das wäre zu ausschweifend deswegen hier einfach ein Link falls es dich interessiert.

    https://stackoverflow.com/ques…/named-parameters-in-jdbc

    Das liegt am Proxy! BungeeCord (die neuste Version) kommt nicht mit Spigot 1.8.X klar, zumindest was "Server beitreten" angeht.

    Aber normalerweise empfiehlt sich schon aufgrund der Sicherheitslücken immer die neuste Version zu nutzen.

    Darf man fragen warum du diese uralte Spigot Version benutzt?


    Ich meine es kommt in knapp 2 Monaten die 1.15 raus? Das sind dann 7 Minor Versionen hinterher, ganz davon abgesehen der ganze neue Content der verloren geht. Pandas, Lamas, Neue Villager Dörfer, Pillager, Füchse, Bambus, Bienen!

    Grundsätzlich bin ich kein Freund davon Software unter Druck zu entwickeln weil Fehler vorprogrammiert sind besonders wenn man selbst noch "lernt"!

    Ich habe zwar selbst noch nie mit Python gearbeitet aber eine vollständige Anwendung mit User Verwaltungssystem sowie einer Hauptfunktion die es in sich hat, würde ich normalerweise einen wesentlich längeren Zeitraum einplanen.


    2 Wochen ist ein verdammt knackiger Zeitraum für das was es können soll!

    Ich denke nicht die Frage sollte lauten wie viel würdet Ihr verlangen, sondern ist es überhaupt in 70 Stunden pro Woche möglich. Da aufgrund des sehr engen Zeitplans die Wahrscheinlichkeit sehr hoch ist das der Preis gedrückt werden wird aufgrund von Verzögerungen. Würde ich etwa einen Stundensatz von min 40 € empfehlen.


    Das wiederum wäre im unteren Bereich zwischen 5K - 10K

    Leider habe ich nie Packets verwendet. Zumindest nicht so das ich dir sagen könnte was es fordert als byte aber nach einer kurzen Google Suche fand ich das hier:

    Ist aus einem Tutorial Video von GerVobis und du solltest das nicht einfach kopieren sondern dir hiermit erschließen wie man das Ganze verwendet:

    Code
            public byte getFixRotation(float yawpitch){
                    return (byte) ((int) (yawpitch * 256.0F / 360.0F));
            }

    Ich denke damit kann man ganz gut verstehen wie das Packet verwendet wird.