Thanks @Lonelobo and @SilverSatin for the information and the logs!
It's a clientside issue, so unfortunately nothing that can be done serverside. It's caused by the physics engine, and it happens especially when there are many animals in the world. We'll do some changes to the game, so this issue might be fixed with the next update I guess. In addition, we will add a command to reload the physics (this helps when someone gets stuck for no apparent reason), just in case the issue still occurs after the update. The next update will be available in a few days ![]()
Posts by red51
A small new update is available now!
-
-
Sorry für meine späte Antwort, der Log enthielt leider nichts Nennenswertes. Freut mich aber, wenn es jetzt wieder funktioniert.
Ich gehe immer wieder von Server weil ich ja dann erst wieder programmieren muss und letztens habe ich mich gewundert wer mir den da immer so lustvoll ins Ohr stöhnt.
Im Singleplayer hättest du immerhin den Vorteil, dass das Spiel (seit dem letzten Update) pausiert, wenn du das ESC Menü aufrufst^^ Dann knurrt dich immerhin niemand an, und du landest auch nicht plötzlich in einem "Game Over" Screen, wenn du wieder ins Spiel wechselst

-
Grundsätzlich kannst du Plugins auch einfach mit reloadplugins oder rp neu laden (dann wird quasi ein Reconnect des Spielers simuliert). Oder alternativ die Plugins im Singleplayer testen, das geht weitaus schneller, vor allem wenn du deine Plugins vom Spiel automatisch kompilieren lässt (dann kannst du direkt was im Sourcecode ändern, ins Spiel wechseln und die Plugins neuladen lassen, ohne dass du irgendwelche Dateien hin und her kopieren musst)

Aber zum eigentlichen Problem: Wie weit gelangt denn der Ladebalken? Poste am besten mal den vollständigen Serverlog.
-
Das sieht gut aus, das kannst du so machen

Aber: Das Speichern in der Datenbank macht eigentlich nur Sinn, wenn die per Befehl "/back" gespeicherte Position auch nach dem Disconnect des Spielers verfügbar bleiben soll (also quasi dauerhafte Gültigkeit haben soll, selbst nach Serverrestart etc). Wenn es nur um eine temporäre Information geht, kannst du die Position bspw. auch einfach als Attribut des Spielers speichern (Attribute können für jeden Spieler festgelegt und anhand eines eindeutigen Strings beschrieben werden, dabei kann jedes erdenkliche Objekt als Attribut gespeichert werden - also eine Zahl, ein Vector3f, ein anderer Spieler, ein GUI Element, ein String usw). Hier ein Beispiel (wie gesagt, wenn du es weiterhin per Datenbank speichern möchtest, kannst du das hier eigentlich ignorieren^^):
Display MoreJava -
Vielen Dank für das Video
Das ist offensichtlich ein Bug, verwundert mich zwar ein wenig (da die cmds "gm 1" und "gm 0" ja auch funktionieren), aber ich denke der sollte einfach reproduzierbar und somit auf jeden Fall fürs nächste Update behebbar sein 
-
Nun gibt es aber nicht mehr getPosition() wie lautet es den nun?
Die Funktion gibt es weiterhin, einfach player.getPosition() aufrufen
Hier findet sich generell eine Übersicht über alle Spielerfunktionen: PlayerKommt ein Spieler das erste mal auf den Server wird geprüft ob er schon mal da war, wenn nein dann wird ein Back Punkt erstellt anhand der getSpawnPosition() ist das ok?
Ja, also wenn du "getSpawnPosition()" auf das Eventobjekt aufrufst, dann erhälst du exakt die Position, an welcher der Spieler online kommt. Bedenke, dass PlayerSpawnEvent nur einmal aufgerufen wird, nämlich wenn der Spieler zum Server verbindet und gespawnt ist (nach seinem Ableben wird immer PlayerRespawnEvent aufgerufen, erst wenn der Spieler disconnected und wieder zum Server verbindet, wird das PlayerSpawnEvent aufgerufen - aber ich denke das entspricht auch der Intention hinter deinem Code?)
-
Naja, bei MySQL etwas tricky: Es wird dann gespeichert, wenn der nächste Commit auf diese Connection aufgerufen wird. Da MySQL über mehrere Connections verfügt (standardmäßig ist 10 in der server.properties eingestellt), kann es sein, dass es sehr lange dauert, bis ein Commit mal zufällig durchgeführt wird
Das sollte aber wie gesagt eigentlich nicht sein, weswegen es in Kürze behoben wird. -
Well... the plank issue is caused by the minimum size of planks. We changed it some updates ago, it has a minimum size of 5 units now (considering a block has a size of 100 units). Resizing planks uses steps of 10 units, so if you scale it down to the minimum size, you can't scale it back to the default size (unless you scale it to the maximum size). I know this is a little bit awkward. You can change the resize precision though, by typing "setl <value>" (e.g. "setl 5", so you can resize in steps of 5), in the future, there will be a more convenient way to do that.
About lags in singleplayer: This always depends on your hardware, what hardware do you have exactly? Maybe post a report file here (to do that, open console ingame [by pressing ^ or `] and type "report" [w/o quot. marks], then a file called "report" [followed by a number] will appear in your game directory [steamversion: to get there, rightclick on rw in steam -> properties -> local files -> browse local files], please upload this file here)
-
Hmm... syntaktisch sieht das jetzt richtig aus. Ich habe die Vermutung, dass es ein Problem mit der MySQL Datenbank gibt, nämlich, dass Commits, die auf die Weltdatenbank angewendet werden, nicht sofort durchgeführt werden
Ich werde mir das mal genauer anschauen, ggf. wird in wenigen Tagen ein Fix dafür verfügbar sein -
You can do that programmatically of course
Each model is a separate object, but one could create a new class which holds multiple World3DModel instances. Once we have some more time we may release an example plugin for that (or maybe integrate such a class in the API directly).
However, it's always necessary that your model still has a separate obj file (and texture) per part^^ -
Generell ist es bei der Pluginentwicklung sehr hilfreich, wenn die (zumindestens wenn man im Singleplayer testet) Debugkonsole aktiviert ist, dann sieht man sofort, wenn ein Fehler auftritt
Diese kann aktiviert werden, indem game_debug_console in der config.properties Datei auf true gesetzt wird. Kombiniert man das damit, dass das Spiel im Fenstermodus ausgeführt wird (sodass man die Konsole gleichzeitig im Blick hat), hat man eine enorme Effizienzsteigerung 
Aber ich merke doch sehr wie das nix für mich ist.
Aller Anfang ist schwer, wobei solche MySQL Dinge ja nicht mehr unbedingt zum Einstiegskram gehören
MySQL ist generell pingeliger bei den Abfragen und verlangt einen ordentlichen Syntax (hat ja nichts mit Java zutun), SQLite ist da deutlich toleranter (bei Lua hatten wir ja nie MySQL Support, wobei man SQLite jetzt natürlich auch weiterhin nutzen kann)^^ -
so this shows you can use multiple textures on the same car
Just to avoid misunderstandings: every model can only have one single texture, trust me
In other words, if you want to use multiple textures, you have to use multiple models (one texture per model).because it gives me around 20-30 fps I would need to reduce it down a lot
It's important to keep polycounts as low as possible
On the one hand, it has a direct impact on rendering performance (it highly depends on your hardware, an NVIDIA GTX 1080 can definitely handle much more polygons than an integrated Intel HD graphics adapter), usually you can keep "a few million triangles" in mind when it comes to the total polygon count (but keep in mind that the game scene already consists of a lot of triangles).
But on the other hand, high polygon counts also result in bigger file sizes, i.e. especially in multiplayer it takes more bandwith to transfer the model data to the client.
For a decent looking car (if you create a model from scratch), I'd recommend to not use more than 10,000 - 30,000 triangles (you can achieve really great results with these limits, everything above that is basically a waste of resources). -
Der eigentliche Fehler ist dieser hier (ab der nächsten Version werden die Pluginfehlermeldungen deutlicher):
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -7
Der besagt, dass du bei einer String-Operation (in dem Fall "substring()") einen falschen Index angegeben hast, der länger als der String selber ist.
Hier ist der Übeltäter:
QuoteString welcomeTextNew = cmd[2];
String welcomeTextNew2 = welcomeTextNew.substring(12);In cmd[2] bzw. "welcomeTextNew" würde in deinem Fall nur "Hallo" stehen, wenn du versuchst, davon ab dem 12. Zeichen einen Substring zu bilden, schlägt das natürlich fehl (weil das Wort "Hallo" nicht so viele Zeichen besitzt)
Hingegen macht es Sinn, den Substring des gesamten Commands zu nehmen, also was in der Variable "command" bzw. in "event.getCommand()" steht. Also so:
String welcomeTextNew2 = command.substring(12); -
Wenn ich das richtig verstanden habe brauche ich gar nicht eine Verbindung mit getMySQLGedönns aufbauen ich kann ja einfach die vorhandene benutzen.
Ja also wenn du direkt auf die Weltdatenbank zugreifen möchtest, dann musst du keine eigene Verbindung aufbauen, sondern kannst direkt getWorldDatabase() aufrufen. Damit hast du Zugriff entweder auf die bestehenden Welttabellen (zB die Spielertabelle, oder Direktzugriff auf Chunks etc), du kannst natürlich aber auch eigene Tabellen anlegen. Nur das wird dann logischerweise alles direkt in der Weltdatenbank vorgenommen.
nimmt er doch die Datenbank die der Admin in der server.properties angegeben hat, dabei richtet er sich doch nach dem Wert der unter database_type= angegeben wurde, oder liege ich da ganz falsch?
Genau, halt die Weltdatenbank. Im Grundsatz sind aber alle Fkt in dieser Klasse so ausgelegt, dass es dir quasi egal sein kann, ob es eine SQLite oder MySQL Datenbank ist
Ansonsten kannst du auf die Weltdatenbank auch getType() aufrufen, dann erhälst du den Datenbanktyp (also SQLite oder MySQL)Diese kann ich aber nicht mit db.close(); dicht machen, dann zeigt mir Eclipse ne Warnung an.
Nee, die "Weltdatenbank" ist ein Sonderfall, die kann nicht mit close() dichtgemacht werden, sondern ist zur Laufzeit immer vorhanden und offen

Ganz wichtig sind die Hochkomma Teile, mal müssen diese ` und mal diese ' verwendet werden.... wer kommt den bitte auf so einen Mist?
Ja, das ist bei MySQL leider so. SQLite ist da eher unproblematisch und legt gar nicht so viel Wert auf die korrekte Zeichenverwendung, MySQL hingegen ist da pingelig
Grundsätzlich die Hochkomma ` für Tabellen- oder Spaltennamen, die einfachen Anführungszeichen ' für Strings -
-
I moved your topic to the plugins section then
However, you can only have one single texture on a model. When creating a model file, you have to assign an ImageInformation object to it, which represents the texture. That's the texture that will be applied to the model. -
Are you referring to plugins or to "classical mods"?
If you're talking about plugins, every model can only have a single texture. So if your car consists of several textures, every part that's covered by a different texture has to be a separate model. -
68. String query = "SELECT * FROM EffNet WHERE Player_user = GetPlayer";
As mentioned, you have to use single quotes, and if it's a variable, you have to use string concatenation: String query = "SELECT * FROM EffNet WHERE Player_user = '" + GetPlayer + "';
and I did reply to my old topic and no one answered
Your latest post was >>the above code SHOULD work and update the record<<, how is this a question? Apparently you edited your initial post (you removed your original text and replaced it by a new question), you should never do that, since that makes all replies in your topic pointless (and, in addition, no one will see your question)
If you have a new question (which is related to the topic), post it in a new response. -
But that's no reason to create multiple topics about the same issue. If you have created a topic, please stick to that topic when you want to post anything that's related to your topic.
In this case, please post your full code.
-
As it has been pointed out in your other topic, you have to put strings into single quotes (INSERT INTO `XXXXX` (Player_user, Player_money) VALUES ('GetPlayer', 2000);), or if "GetPlayer" is a variable, you have to use string concatenation (INSERT INTO `XXXXX` (Player_user, Player_money) VALUES ('" + GetPlayer + "', 2000);)