Register for your free account! | Forgot your password?

Go Back   elitepvpers > Other Online Games > Minecraft
You last visited: Today at 10:53

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Bukkit Programmieren Plugin "warten" lassen

Discussion on Bukkit Programmieren Plugin "warten" lassen within the Minecraft forum part of the Other Online Games category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Nov 2014
Posts: 632
Received Thanks: 53
Bukkit Programmieren Plugin "warten" lassen

Hey leute,
ich wollte eine Chest Programmieren, wo die Items von der Seite "reinfliegen".
Ich wollte es folgend machen:

Code:
	public static void moveItem(Material material, String name, int von, int bis, Inventory inv) {
		ItemStack test = new ItemStack(material);
		ItemMeta meta = test.getItemMeta();
		meta.setDisplayName(name);
		test.setItemMeta(meta);
		while(durchzählen(von, bis) <= bis){
			Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
				@Override
				public void run() {
					Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
						@Override
						public void run() {
							inv.setItem(durchzählen(von, bis), new ItemStack(Material.AIR));
						}					
					}, 10);
					inv.setItem(durchzählen(von, bis), test);			
				}
			}, 10);
		}
	}
	
	public static int durchzählen(int von, int bis){
		for(von = 0; von <= bis; von++){
			return von;
		}
		return von;
	}
Jedoch erstellt es mir da ja so viele Scheduler, dass sogar mein Localhost Server abschmiert^^ weiß jemand eine Methode um einen Scheduler Warten zu lassen, oder eine andere Methode.

Danke
Origenes is offline  
Old 09/13/2015, 10:23   #2
Administrator
 
lordsill's Avatar
 
elite*gold: 26516
Join Date: May 2011
Posts: 21,004
Received Thanks: 2,351
liegt vllt an deiner guten endlos-schleife.

Betrachten wir erstmal deine durchzählen Methode.

Code:
public static int durchzählen(int von, int bis) {
	for(von = 0; von <= bis; von++){
		return von;
	}
	return von;
}
Kurz gesagt:
Du übergibst 2 Variablen. Danach wird die 1. Variable (von) direkt auf 0 gesetzt (durch die for-schleife) und wird dann durch das "return von;" in der for-Schleife direkt zurückgegeben. Damit ist die Methode abgeschlossen und macht nichts weiteres. Also entspricht deine Methode an sich nichts anderes als:
Code:
public static int durchzählen(int von, int bis) {
  return 0;
}
So, jetzt betrachten wir nochmal deine while-schleife. Die Bedingung ist:
Code:
durchzählen(von, bis) <= bis
Also solange aktuell 0 <= bis ist, wird die Schleife ausgeführt. Ich gehe mal davon aus, dass "bis" keine negative Zahl ist, somit ist diese Bedingung immer erfüllt => Endlos-Schleife

Im End-Effekt ist die durchzählen Methode aktuell der Hauptgrund, warum dir alles um die Ohren fliegt.

Also mögliche Lösung:
Code:
public static int durchzählen(int von, int bis) {
  if(von <= bis) {
    return von+1;
  }
  return von;
}
Dazu solltest du nicht vergessen, dass von dann um 1 Wert kleiner sein sollte, als sonst. (Willst du also mit der Zahl 3 anfangen, sollte der Methode als Variable von den Wert 2 übergeben werden (diese gibt dann 3 beim 1. durchlauf zurück))

Und oben dann halt noch:
Code:
von--; //Ist das selbe wie: von = von-1;
while((von = durchzählen(von, bis)) <= bis) {
}
und innerhalb der while-Schleife verwendest du dann statt "durchzählen(von, bis)" dann nur noch die variable "von". Danach kommen dann halt noch paar Logikfehler dazu, die du aber mit for-Schleifen beheben kannst.
Denn:
inv.setItem(durchzählen(von, bis), ItemStack); bewirkte nicht, dass alle Slots von von-bis auf ItemStack gesetzt werden, sondern nur 1 Slot wird gesetzt (der Wert, der von durchzählen zurückgegeben wurde (also 0)).
lordsill is offline  
Old 09/13/2015, 11:22   #3
Moderator


 
elite*gold: 558
Join Date: Feb 2010
Posts: 6,546
Received Thanks: 1,418
Ich würde das ganze anders angehen und nein, du bekommst von mir keine Komplettlösung in Code Form.

Du machst es aktuell so, dass du für jedes Item eine ganze Reihe Tasks anlegst. Ich weiß nicht in welchem Bereich sich "von" und "bis" bewegen, aber ich sage jetzt einfach mal das es 20 Tasks pro Item sind, die parallel ausgeführt werden. Dann hast du mit Sicherheit deutlich mehr als ein Item und schon bist du ganz schnell bei Zahlen die kein Programmierer erreichen will.

Ich würde es so machen, dass ich alle Items an einem Ort sammel, z.B. eine Liste, und dann mit genau einem Task alle Items bearbeite. Da gehören dann nürlich ein paar mehr Informationen zu einem Item, aber das ist ja kein Problem. Jedes mal wenn der Task ausgeführt wird, gehst du alle Items durch und schaust welche du jetzt bewegen musst.

Edit:
Außerdem wäre es gut, wenn du auf deutsche Umlaute verzichtest. Mach aus durchzählen lieber durchzaehlen, dann bist du definitiv auf der sicheren Seite. Die Inhaltlichen Probleme hat lordsill schon gut bearbeitet.
ComputerBaer is offline  
Old 09/13/2015, 13:41   #4
 
elite*gold: 0
Join Date: Nov 2014
Posts: 632
Received Thanks: 53
Quote:
Originally Posted by ComputerBaer View Post
Ich würde das ganze anders angehen und nein, du bekommst von mir keine Komplettlösung in Code Form.

Du machst es aktuell so, dass du für jedes Item eine ganze Reihe Tasks anlegst. Ich weiß nicht in welchem Bereich sich "von" und "bis" bewegen, aber ich sage jetzt einfach mal das es 20 Tasks pro Item sind, die parallel ausgeführt werden. Dann hast du mit Sicherheit deutlich mehr als ein Item und schon bist du ganz schnell bei Zahlen die kein Programmierer erreichen will.

Ich würde es so machen, dass ich alle Items an einem Ort sammel, z.B. eine Liste, und dann mit genau einem Task alle Items bearbeite. Da gehören dann nürlich ein paar mehr Informationen zu einem Item, aber das ist ja kein Problem. Jedes mal wenn der Task ausgeführt wird, gehst du alle Items durch und schaust welche du jetzt bewegen musst.

Edit:
Außerdem wäre es gut, wenn du auf deutsche Umlaute verzichtest. Mach aus durchzählen lieber durchzaehlen, dann bist du definitiv auf der sicheren Seite. Die Inhaltlichen Probleme hat lordsill schon gut bearbeitet.
Nur mein Problem ist ja, wenn ich die Items umsetzen muss ich das ja mit einem Integer machen, der pro durchgang um 1 erhöht wird. Jedoch kann ich ja pro durchgang das nicht um 1 hochzählen, da der Integer Final sein muss und ich ihn so nicht verändern kann^^ Sonst hätte ich das garnicht mit der Methode gemacht
Origenes is offline  
Old 09/13/2015, 17:50   #5
Moderator


 
elite*gold: 558
Join Date: Feb 2010
Posts: 6,546
Received Thanks: 1,418
Quote:
Originally Posted by Origenes View Post
Nur mein Problem ist ja, wenn ich die Items umsetzen muss ich das ja mit einem Integer machen, der pro durchgang um 1 erhöht wird. Jedoch kann ich ja pro durchgang das nicht um 1 hochzählen, da der Integer Final sein muss und ich ihn so nicht verändern kann^^ Sonst hätte ich das garnicht mit der Methode gemacht
Also um ehrlich zu sein, verstehe ich nicht was du mir damit sagen willst.

Bei meiner Lösung funktioniert das alles ohne Probleme, bei deiner funktioniert es überhaupt nicht.
ComputerBaer is offline  
Reply


Similar Threads Similar Threads
Die Quest "warten" lassen (sleep)?
03/23/2013 - Metin2 Private Server - 6 Replies
Hallo liebe Community, ich würde gerne eine Quest für ca. 5 Sekunden warten lassen und wollte mal fragen, wie das funktioniert. Kann ich einfach "sleep(300)" schreiben oder gibt es dafür einen anderen Befehl. Würde mich sehr über Antworten freuen! MfG
[Suche]Redstone-"Verlängerungs"-Plugin[Root][Bukkit]
08/07/2011 - Minecraft - 6 Replies
Hey, wie der Titel schon sagt suche ich ein Plugin + Beschreibung wie man es benutzt / einstellt das Redstone entweder viel verlängert oder "wireless".(für Bukkit Build 830) Ich weiß es gibt ein Plugin für Wireless Redstone aber ich verstehe es nicht wie man es einstellt / die Commands.



All times are GMT +1. The time now is 10:53.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.