Brauche Dringend Hilfe beim Programmieren

05/27/2015 18:56 the_cake#1
Hallo Leute ich prgorammiere zurzeit dieses Plugin: [Only registered and activated users can see links. Click Here To Register...]
Ich habe niemals geglaubt das es so viele Leute benutzen und genau dort fangen die Probleme an meine Möbel/Furniture bestehen ja aus ArmorStands da das den Server nur sinnlos belastet möchte ich nun auf ProtocolLib umsteigen.
Damit die Auslastung des Server nicht ganz so hoch ist. Ich hab es auch schon geschaft die ArmorStands zu spawnen.
Hier wäre mal der Quellcode der ArmorStand class: [Only registered and activated users can see links. Click Here To Register...]
Nun fange ich die Entity Interact Pakete ab und ändere die einstellungen des ArmorStands z.B ändere ich den namen.
Wenn ich nun allerdings das Paket erneut den spieler übergebe verschwindet der ArmorStand einfach.

Ich hab hier mal ein kleines Video hochgeladen:
Wie man am ende des Videos sieht regiert der ArmorStand auf den rechtklick dabei möchte ich den ArmorStand den namen CLICK UPDATE geben. Sobald das Packet gesendet bzw empfangen wurde despawnt der ArmorStand.

Ich hoffe mir kann da jemand helfen ich rätsel nun schon seit mehreren Tagen rum.

Mfg.: The_cake / Ste3et_C0st
05/27/2015 19:27 ComputerBaer#2
Das wird dir zwar nicht sonderlich helfen, aber ich denke ich muss es erwähnen.

Howaner hat viel an einem Server rumgeschrieben und für seine Plugins auch die ProtocolLib verwendet. Dabei ist ihm aufgefallen, dass ausgerechnet die ProtocolLib bei einigen Aktionen extrem viel Zeit und Leistung verschlingt. Aus dem Grund hat er sie dann wieder entfernt und eine eigene Lösung gebastelt.

Edit:
Alles soweit ich das damals von ihm verstanden und mich jetzt daran erinnert habe, könnte also sein das ein Fehler in dem Text steckt.
Ich habe ihn jetzt einfach mal auf das Thema hingewiesen, vielleicht sagt er noch etwas dazu oder kennt die Lösung für dein Problem.
05/27/2015 19:52 the_cake#3
Dankeschön ComputerBear.
Das mit der Leistung kann man wahrscheinlich nie perfekt machen aber es wird hoffentlich weniger Leistung saugen als die ArmorStands als richtige Entitys zu spawnen.
05/28/2015 01:09 Howaner#4
Ja, ProtocolLib zieht schon ordentlich Performance weg, wenn extrem viele Pakete versendet werden.
(Mit extrem viele Pakete meine ich, das jede Sekunde 2 Spieler joinen und 100 oder mehr Spieler auf dem Server sind)
Sollte bei dir wahrscheinlich kein Problem sein, aber ich will 500 - 600 Spieler in einen Server bringen.

Das mit dem verschwinden ist ein ganz einfacher Minecraft 1.8 Bug, der wahrscheinlich auch alle weiteren Versionen betreffen wird.
Mojang hat einfach das Löschen eines Entities verkackt.

Du musst folgendes machen, damit das Entity nicht unsichtbar wird:
- Entity Despawn verschicken
- 2 Ticks warten
- Entity wieder schicken
05/28/2015 12:49 the_cake#5
Ok danke wie soll ich es den noch Performance schonender machen ?

Ok ich habs nun geschafft nun hätte ich noch ne frage wie speichere ich nun das ganze.
Soll ich ne Datenbank nehmen oder eher eine flatfile.
Soll ich alle einzelnen ArmorStand Einstellungen separat speicher oder gleich das ganze object ?
05/29/2015 12:22 Howaner#6
Ich würds in einer SQLite Datenbank speichern.
05/29/2015 19:57 the_cake#7
Ok ich hab nun noch zwei fragen:

1. Wie setze ich yaw/pitch ich hab mir mal die source von deinem Plugin auf github angeschaut und hab festgestellt das ich es eigentlich auch schon so hatte:

Code:
private byte getCompressedAngle(float value) {return (byte)(int)(value * 256.0F / 360.0F);}

	public void setYaw(Player player, double yaw) {
		PacketContainer packet = this.manager.createPacket(PacketType.Play.Server.ENTITY_HEAD_ROTATION);
		packet.getIntegers().write(0, this.getEntityId());
		packet.getBytes().write(0, (byte)(int)(yaw * 256.0F / 360.0F));
		player.sendMessage(getCompressedAngle(getLocation().getYaw()) + "");
		try {
			this.manager.sendServerPacket(player, packet);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
Das hier wäre der Code es kommt leider kein error dennoch funktioniert er nicht. Ich hab es auch schon zeitversetzt geschickt geht leider auch nicht.
(Das war überings ein guter Tipp den hatte ich schonmal bei meinem EasterEgg plugin benutzt das hatte ich ganz vergessen.).

Edit://Ok ich bekome doch nen error und zwar NoSuchMethodError

2. Wegen der Datenbank soll ich da für alles eine eigene Tabelle anlegen oder soll ich das object Serializen und dann zurückkasten ?
05/29/2015 21:10 ComputerBaer#8
Quote:
Originally Posted by the_cake View Post
Edit://Ok ich bekome doch nen error und zwar NoSuchMethodError
Da wäre jetzt vermutlich interessant welche Methode denn gemeint ist.
Unabhängig davon würde ich einfach mal einen Unterscheid bei der Bukkit Version mit der du entwickelst und der Version mit der du testest vermuten.
05/29/2015 21:44 the_cake#9
Quote:
Originally Posted by ComputerBaer View Post
Da wäre jetzt vermutlich interessant welche Methode denn gemeint ist.
Unabhängig davon würde ich einfach mal einen Unterscheid bei der Bukkit Version mit der du entwickelst und der Version mit der du testest vermuten.
Ok der Error ist nun weg war ein Fehler von mir allerdings aus irgendeinen Grund funktioniert mein Code nicht das versteh ich nicht.

Code:
private byte getCompressedAngle(float value) {return (byte)(int)(value * 256.0F / 360.0F);}

	public void setYaw(Player player, double yaw) {
		PacketContainer packet = this.manager.createPacket(PacketType.Play.Server.ENTITY_HEAD_ROTATION);
		packet.getIntegers().write(0, this.getEntityId());
		packet.getBytes().write(0, (byte)(int)(yaw * 256.0F / 360.0F));
		player.sendMessage(getCompressedAngle(getLocation().getYaw()) + "");
		try {
			this.manager.sendServerPacket(player, packet);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
Also über die debug nachricht bekomme ich den richtigen wert zurückgegeben allerdings verändert sich an der ausrichtung des ArmorStands nichts hier wäre mal der komplette code: [Only registered and activated users can see links. Click Here To Register...]
05/30/2015 22:10 the_cake#10
Ok nun geht alles und ich wäre soweit mit den ArmorStands durch.
Nun meine frage wie speichere ich das am besten in eine SqlLite Datenbank ich verstehe schon wie das grundsätzliche Speichern von z.b Strings etc geht allerdings wäre das glaub ich eine Jahrhundert Aufgabe alles in einen String zu packen gibt es da eine einfachere Möglichkeit ?
05/31/2015 00:54 ComputerBaer#11
Mit relationalen Datenbanken kenne ich mich, aber mit deinen Daten nicht.

Wenn ich wüsste welche Informationen du da ablegen willst und was die Kriterien sind nach denen du sie abrufst, dann kann ich dir da sicherlich helfen. Aktell weiß ich nur, dass du irgendwelche Informationen hast und die in der Datenbank speichern willst.
05/31/2015 10:35 the_cake#12
Das möchte ich speichern:

- Location des armorstands
- Rotation des Kopfs,Körper,.... (EularAngle)
- Itemstack des Helms,Brustplatte,....
- Verschiedene Booleans

Ich hab mich mal hingesetzt und erzeuge nun für jeden einzelnen Punkt eine neue Tabelle mein Problem Sind die Itemstack ich muss diese 1zu1 speichern Da darf nichts verloren gehen.
05/31/2015 11:42 ComputerBaer#13
Du hast keinen Grund nur ArmorStands zu laden, die einen Eisenhelm haben, oder?
Von daher würde nichts dagegen sprechen, wenn du die ItemStacks serialisierst und dann in der Datenbank ablegst.

Die Position solltest du komplett aufteilen, 4 Spalten - Welt, X, Y, Z - dann kannst du ganz gezielt alle ArmorStands abrufen, die sich in einem bestimmten Bereich einer Welt befinden.

Bei Rotation und den Booleans liegt es bei dir. Du kannst alle einzeln ablegen oder wenn es für dich einfacher ist sie auch in irgendeiner Form serialisieren und speichern. Ich gehe davon aus das du über keinen von denen versuchen wirst einen ArmorStand zu laden.

Die Aufteilung auf mehrere Tabellen ist vermutlich nicht notwendig und bringt dir keinen Vorteil., aber vielleicht kenne ich auch ein Detail nicht das zu einem Vorteil führen würde.
05/31/2015 16:05 the_cake#14
Gibts da ihrgendeine BukkitApi o.ä den ItemStack komplett zu serialisieren ohne verluste egal was für meta data eingestellt sind ?

Ich weiß das mann bei getConfig itemstacks laden und speichern kann ich schau mir mal den code an.