You are not logged in.

  • Login
Bitte besucht unser neues Forum unter https://forum.nitrado.net | Please visit our new Forum at https://forum.nitrado.net

Dear visitor, welcome to Nitrado.net Prepaid Gameserver Community-Support - Archiv. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

BtoBastian

Moderator

  • "BtoBastian" is male
  • "BtoBastian" started this thread

Posts: 3,612

Occupation: Softwareentwickler

  • Send private message

1

Monday, April 21st 2014, 11:11pm

[Tipps und Tricks] Rund um Java und Bukkit

Hi, nachdem schon der Codeschnipsel-Thread sich relativ großer Beliebtheit erfreute, hab ich mir gedacht nun auch einen Thread für Tipps&Tricks rund um Bukkit und Java zu erstellen. Hierbei geht es mehr um allgemeine Sachen, die oft ganz nützlich zu wissen sind. Wenn ihr nicht wisst was ich damit meine, schaut euch einfach ein paar Tipps an, dann sollte es klar werden.
Tipps & Tricks

final-'Zwang' umgehen. by BtoBastian


Oft ist man gezwungen (z.B. in lokalen Klassen) Variablen als final zu deklarieren, obwohl man sie noch ändern will. Um dies zu umgehen kann man die Variable einfach zu einem Array mit Platz für ein Element machen.
Beispielcode:

Java source code

1
2
3
4
5
6
7
8
9
10
11
final int[] COUNTER = new int[] { 10 };
final int[] ID = new int[1];
ID[0] = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getInstance(), new Runnable() {
  public void run() {
    if (--COUNTER[0] == 0) {
      Bukkit.getScheduler().cancelTask(ID[0]);
      return;
    }
    Bukkit.broadcastMessage("Noch " + COUNTER[0] + "Sekunden");
  }
}, 0L, 20L);

Reload-resistente Timer. by 0liCom


Siehe Beitrag: Klick mich

Standard Standart eines Flamingos ist einbeinig.

This post has been edited 7 times, last edit by "BtoBastian" (Jun 17th 2014, 8:59pm)


ChaboGames

User / Kunde

Posts: 65

  • Send private message

2

Tuesday, April 22nd 2014, 3:52pm

Nice

Gefällt mir gut der Post ;)
Kann man selbst auch Code-Teile drunter Posten?

BtoBastian

Moderator

  • "BtoBastian" is male
  • "BtoBastian" started this thread

Posts: 3,612

Occupation: Softwareentwickler

  • Send private message

3

Tuesday, April 22nd 2014, 6:08pm

Darum geht's doch. ;)
Standard Standart eines Flamingos ist einbeinig.

BlazeMania

User / Kunde

  • "BlazeMania" is male

Posts: 1,299

Location: Berlin

Occupation: Schüler (Gymnasium)

  • Send private message

4

Tuesday, April 22nd 2014, 7:18pm

Ich zitier hier einfach meine geposteten Snippets aus dem TheSnippet Thread:

Spoiler Spoiler

Mit diesem Snippet kann man Welten kinderleicht Laden/Entladen oder gucken ob eine Welt existiert:

Spoiler Spoiler

Source code

1
package de.codebucket.survivalgames.util;import org.bukkit.Bukkit;import org.bukkit.Chunk;import org.bukkit.World;import org.bukkit.WorldCreator;import org.bukkit.entity.Player;public class WorldManager {public static World loadWorld(String world){if(!isLoaded(world)){return Bukkit.getServer().createWorld(new WorldCreator(world));}else{return Bukkit.getWorld(world);}}public static boolean isLoaded(String world){for (World w : Bukkit.getServer().getWorlds()){if (w.getName().equals(world)) {return true;}}return false;}public static boolean unloadWorld(String world){if(isLoaded(world)){World w = Bukkit.getWorld(world);for (Player p : w.getPlayers()) {p.teleport(Bukkit.getWorlds().get(0).getSpawnLocation());}for(Chunk c : w.getLoadedChunks()){c.unload();}boolean unload = Bukkit.unloadWorld(w, true);return unload;}return false;}}
Mit diesem Snippet hier kann man mithilfe der Apache IO Libary ganz leicht Ordner kopieren/verschieben/löschen (Geht auch mit Dateien):

Spoiler Spoiler

Source code

1
        private static void deleteDir(File dir) throws IOException{FileUtils.deleteDirectory(dir);}private static void copyDir(File src, File dir) throws IOException{FileUtils.copyDirectory(src, dir);}private static void moveDir(File src, File dir) throws IOException{FileUtils.moveDirectory(src, dir);}
MfG David


Spoiler Spoiler

@YourSky:
Hier ein Snippet geeignet für BungeeCord:
Mit diesem Snippet kann man eine PluginMessage abfangen und die Daten auslesen. Nützlich für einen Datenaustausch zwischen Bukkit und BungeeCord.

Java source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
        @EventHandler
	public void onListenChannel(PluginMessageEvent e)
	{
		String[] data = readData(e.getData());
		for(String s : data)
		{
			plugin.getProxy().broadcast(s);
		}
	}
	
	private String[] readData(byte[] data)
	{
		List<String> readed = new ArrayList<>();
		DataInputStream di = new DataInputStream(new ByteArrayInputStream(data));
		for(int i = 0; i < 255; i++)
    		{
    			try 
               		{
    				String dr = di.readUTF();
	    			readed.add(dr);
              		}
    			catch (IOException e) 
               		{
    				if(readed.size() != 0)
    				{
    					String[] out = readed.toArray(new String[readed.size()]);
        				return out;
    				}
    			
    				String[] out = {new String(data, Charset.forName("UTF-8"))};
		        	return out;
        		}
    		}
        
		String[] out = readed.toArray(new String[readed.size()]);
		return out;
	}


Ausgabe:

Source code

1
2
Connect
lobby


MfG David

This post has been edited 1 times, last edit by "BlazeMania" (Apr 22nd 2014, 8:10pm)


DerLuuc

User / Kunde

Posts: 284

  • Send private message

5

Wednesday, April 23rd 2014, 12:33am

@BlazeMania das lässt sich 1. sehr schlecht lesen und 2. sollen hier ja nicht normale Snippets rein oder? Sondern eher solche Tipps oder Tricks...

BlazeMania

User / Kunde

  • "BlazeMania" is male

Posts: 1,299

Location: Berlin

Occupation: Schüler (Gymnasium)

  • Send private message

6

Wednesday, April 23rd 2014, 1:09am

@DerLuuc:
Beide sind Tricks vorallem der 2., weil man so ein Datenpacket aus BungeeCord nicht so leicht auslesen kann und halt tricky ist. Den 1. editier ich morgen neu.

BtoBastian

Moderator

  • "BtoBastian" is male
  • "BtoBastian" started this thread

Posts: 3,612

Occupation: Softwareentwickler

  • Send private message

7

Wednesday, April 23rd 2014, 9:25pm

@BlazeMania
Danke, allerdings hat @DerLuuc Recht, dass das eher Snippets sind. Habe mir eher allgemeinere Dinge vorgestellt, die man nicht erst nach Copy&Paste benutzen kann, sondern die man sich einmal durch liest, sich denk "Cool, wusste ich noch gar nicht"/"Gute Idee, da hätte ich eig. auch selbst drauf kommen können" und dann ohne erst wieder nach zuschauen nutzen kann, wenn man's mal braucht.
Standard Standart eines Flamingos ist einbeinig.

0liCom

User / Kunde

  • "0liCom" is male

Posts: 61

Location: Bayern

Occupation: Schüler

  • Send private message

8

Saturday, April 26th 2014, 3:56pm

Noch etwas, was Java-Vertrauten eventuell bekannt sein sollte, aber unter Nur-Bukkit-Programmierern nicht so verbreitet ist:

Reload-resistente Timer

Ein normaler Bukkit Scheduler wird bei einem Reload automatisch gecancelled. Nicht so bei Java-Tasks. So lassen sich Langzeit-Timer ohne config und komplizierter Funktionen verwirklichen. Für Restarts funktioniert es nicht!


Hier ein Beispiel:

Java source code

1
2
3
4
5
6
7
8
9
10
11
12
13
int time = 30;

final Timer timer1 = new Timer(); //timer1 ist nur der Name des Timers

TimerTask task1 = new TimerTask() {
    public void run() {
        
        time--;
        
        //Dein Code
        
    }
}; //Hier ist das ; wichtig


Das ganze einfach in der Class platzieren und mit folgendem Code starten lassen:

Java source code

1
timer1.schedule(task1, 0, 1000);


Die 1000 ist die Zahl in Millisekunden, nach der run() aufgerufen wird. 1000ms = 1s heißt, dass run() jede Sekunde ausgeführt wird.


Wichtige Info's zum Timer:

- In Fehlermeldungen wird angegeben, ob der Fehler in einem Timer ist. Jedem Timer wird wie beim Bukkit-Scheduler eine id je nachdem wann er startet zugewiesen. Also der 1. Timer ist dann Timer-0 usw.

- Man sollte niemals einen Timer im onEnable() aufrufen, wenn man ihn nicht im onDisable() cancelled oder es so gewollt ist. Das könnte sonst dazu führen, dass beide Timer parralel arbeiten und unterschiedliche Werte ausgeben.

- die Timer würden bei einem Bukkit-Scheduler am ehesten dem AsyncRepeatingTask entsprechen.


Aufgrund folgendem Thread habe ich hier den Timer gepostet: -Klicken-

Bei Fehlern, wie immer sagen!

MfG, 0liCom
:cookie:

FrozenBrain

User / Kunde

  • "FrozenBrain" is male

Posts: 2,145

Thanks: 6

  • Send private message

9

Saturday, April 26th 2014, 4:10pm

- die Timer würden bei einem Bukkit-Scheduler am ehesten dem AsyncRepeatingTask entsprechen.

Und das ist auch das Problem: Die Tasks werden in ihrem eigenen Thread ausgeführt. Wer da auf die Bukkit API zugreifen möchte, muss extrem aufpassen. Außerdem ist es mit diesen Tasks nicht (unkompliziert) möglich, eine bestimmte Aktion nach exakt X Ticks auszuführen.
Wer zumindest bei Problem Nr. 1 auf Nummer sicher gehen will, der plant im TimerTask einen neuen (sync) Task mit dem Bukkit Scheduler mit einem Ticket Verzögerung. Dann wird's nach einem Tick im Hauptthread ausgeführt und die Bukkit API kann ausnahmslos genutzt werden.
Aber ganz ehrlich: Das ist eher eine krass umständliche Workaround-Lösung.

BtoBastian

Moderator

  • "BtoBastian" is male
  • "BtoBastian" started this thread

Posts: 3,612

Occupation: Softwareentwickler

  • Send private message

10

Saturday, April 26th 2014, 4:36pm

@0liCom
Danke. :)
Standard Standart eines Flamingos ist einbeinig.

0liCom

User / Kunde

  • "0liCom" is male

Posts: 61

Location: Bayern

Occupation: Schüler

  • Send private message

11

Sunday, April 27th 2014, 8:19am

@FrozenBrain
Wie gesagt, es ist kein Bukkit-Scheduler, also ist er nicht mit Ticks verbindbar. Das hat Vor- und Nachteile.

Ich verwende den Timer für mein Lobby-System, da er sehr genau ist und sich durch Skippen von Ticks oder Lags nicht durcheinander bringen lässt, da es ein Java-Util ist.

Wer das nicht verwenden möchte hat sicher seine Argumente dagegen, aber es hat nicht nur Nachteile.
:cookie:

FrozenBrain

User / Kunde

  • "FrozenBrain" is male

Posts: 2,145

Thanks: 6

  • Send private message

12

Sunday, April 27th 2014, 10:09am

aber es hat nicht nur Nachteile.

Das habe ich nicht behauptet. Ich wollte lediglich auf die Probleme hinweisen, da hier sicherlich auch Unerfahrene herumgeistern und sich vielleicht dadurch verwirren lassen.

BtoBastian

Moderator

  • "BtoBastian" is male
  • "BtoBastian" started this thread

Posts: 3,612

Occupation: Softwareentwickler

  • Send private message

13

Sunday, April 27th 2014, 11:43am

@FrozenBrain
Wenn die noch nie was von Threadsicherheit gehört haben werden sie dann aber vermutlich mit deinen Post auch nicht viel anfangen können ...
Standard Standart eines Flamingos ist einbeinig.

0liCom

User / Kunde

  • "0liCom" is male

Posts: 61

Location: Bayern

Occupation: Schüler

  • Send private message

14

Sunday, April 27th 2014, 12:17pm

aber es hat nicht nur Nachteile.

Das habe ich nicht behauptet. Ich wollte lediglich auf die Probleme hinweisen, da hier sicherlich auch Unerfahrene herumgeistern und sich vielleicht dadurch verwirren lassen.


Ich wollte nicht damit sagen, du hättest es gesagt.
Es stimmt schon, es ist manchmal etwas problematisch, aber nicht in jeder Verwendung. Es ist jedem frei überlassen, was er jetzt nimmt.
:cookie:

Bitte besucht unser neues Forum unter https://forum.nitrado.net| Please visit our new Forum at https://forum.nitrado.net