ich hätte eine frage bezüglich kits, wie muss
ich das machen? wenn ein ItemStack alle 3 Stunden
nutzbar sein kann? Falls er noch 2 Stunden warten muss, dass es dann
auch im chat steht?
Muss ich das in einer ArrayList machen? wenn ja wie.
Ich danke euch jetzt schon für die Leute, die sich die
Zeit genommen haben.
Wenn das Item genutzt wird, dann Trage seinen Namen in eine List ein und starte einen Delayed Scheduler der erst nach 3 Stunden auslösen soll. Dieser nimmt dann den Namen wieder aus der Liste. Dann kannst du noch einen für 2 Stunden starten. Der dann die Nachricht schickt.
Benutzt du Essentials Kits?
Wenn ja schreib in der config:
kits:
[kitname]:
delay: 10800 (in Sekunden, sind 3 Stunden)
items:
- [itemid] [anzahl]
Falls man das kit vor den 3 Stunden nutzt, steht dort wieviele Sekunden man noch warten muss.
Hoffe du meintest das damit, habe die Frage jetzt nicht so richtig verstanden.
Wie genau soll es denn sein?
1. Automatisch alle 3 Stunden das ItemStack
2. Erst nach 3h wieder erlauben, dass der Befehl ausgeführt wird, ansonsten eine Nachricht mit der Wartezeit an den Spieler
Die Beispielcodes dienen dafür, wenn du nicht genau weißt, wie du das machen solltest, um dir so nochmal etwas Hilfestellung zu geben
Zu 1.
Einfach ein Scheduler alle 3h laufen lassen, der dann die ItemStacks an die Spieler vergibt
Hier mal ein Beispielcode:
this.getServer().getScheduler().runTaskTimer(this, new Runnable() {
@Override
public void run() {
for(Player player : Bukkit.getOnlinePlayers())
{
//Spieler den ItemStack geben
}
}
}, 3*3600*20, 3*3600*20);
Zu 2.
In einer HashMap Spielername + Timestamp speichern. Dabei kannst du entscheiden, ob du den Timestamp in 3h oder den aktuellen nimmst (siehe System.currentTimeMillis()).
Wenn der Befehl ausgeführt wird, prüfe es, ob die 3h über dem Wert liegen. Wenn ja => Spieler erhält ItemStack. Wenn nicht, Spieler erhält die Nachricht. Aus der Differenz der beiden Werte (Ablauf-Timestamp und aktuellen Timestamp) kannst du dann die Restzeit berechnen, bis der Spieler den Befehl wieder einsetzen kann und ihm diese Zeit senden.
Der Timestamp von System.currentTimeMillis() sind die ms (nicht die Sekunden wie beim unix-Timestamp) seit 01.01.1970
Hier ebenfalls ein Beispielcode:
private final HashMap<Player, Long> waittime = new HashMap<Player, Long>();
....
Player p = (Player)sender;
...
if(waittime.containsKey(p))
{
long dreiStunden = 3L*3600L*1000L;
if((waittime+dreiStunden) < System.currentTimeMillis)
{
//Meldung das die 3h noch nicht rum sind
return true; //Verhindert u.a. das der Code für das erhalten der Items ausgeführt wird, da hier bereits eine Rückgabe erhalten wird
}
}
//Hier der Code, damit der Spieler das Item erhält
... DEIN CODE ...
//Nun speichern, dass der Spieler den Befehl verwendet und die Items auch erhalten hat
waittime.put(p, System.currentTimeMillis());
return true; //War ja alles erfolgreich
@Attila494: Ich denke er möchte das gerne selbst programmieren
Poste mal den ganzen Code in [code]...[/code] tags.
Kommt ein Fehler in der Konsole?
Und du versuchst direkt am anfang der onCommand Methode den CommandSender zu Player zu casten. Wenn du jetzt z.B. einen Befehl über die Konsole machst, bekommst du einen Fehler.
Code:
Player p = null;
if(sender instanceof Player){
p = (Player)sender;
}
Das wäre eine Möglichkeit da müsstest du dann aber bei jedem Command abfragen ob Player nicht null ist. Ist ganz nützlich wenn du Befehle hast, die auch von der Konsole ausführbar sein sollen. Wenn du nur befehle hast in denen ein Player benötigt wird kannst du das ganze mit else schreiben und dann eifach return true.
Code:
Player p = null;
if(sender instanceof Player){
p = (Player)sender;
}else{
sender.sendMessage("Befehle koennen nicht aus der Konsole ausgefuehrt werden"); //Optional
return true;
}
Player p = null;
if(sender instanceof Player){
Player p = (Player)sender;
}
Dann aber bitte auch so, sonst gibt es nur einen weiteren Fehler.
Code:
Player p = null;
if(sender instanceof Player){
p = (Player)sender;
}
Edit:
Ich würde die HashMap wher mit <String, Long> aufbauen, weil ich nicht mit Sicherheit sagen kann, dass das Spielobjekt bis zum Ende der drei Stunden existiert bzw. immernoch das selbe ist. (Der String ist der Spielername, alternativ geht da auch die UUID)
Edit 2:
Code:
p.sendMessage("Du kannst das Kit erst wieder in §b" + waittime.get(p) + "§f Sekunden nutzen.");
Stehen da wirklich die Sekunden drin? Ich denke mal das sind eher Millisekunden, oder?
Code:
p.sendMessage("Du kannst das Kit erst wieder in §b" + (waittime.get(p) / 1000) + "§f Sekunden nutzen.");
Edit 3:
Die Zeit in der Nachricht ist ohnehin blödsinn, mit den Sekunden seit 1970 wird wohl keiner etwas anfangen können. Richtig wäre also eher:
Code:
p.sendMessage("Du kannst das Kit erst wieder in §b" + ((waittime.get(p) + dreistunden - System.currentTimeMillis())/ 1000) + "§f Sekunden nutzen.");
Server kackt alle 1-2 Stunden ab! 12/06/2013 - Metin2 Private Server - 6 Replies Hallo Community,
und zwar habe ich ein Problem der Server kackt alle 1-2 Stunden immer ab in der Syserr von CH1 steht
Könnte es eventuell daran liegen?
die Syserr wird von Sekunde zu Sekunde immer voller...
Mit freundlichen Grüßen.
!! Alle 48 Stunden 500 free SpotifyAccounts !! 06/10/2013 - Freebies - 0 Replies Einfach just 4 fun, es wird hier alle 48 Stunden genau 500 kostenlose 48 Stunden Spotify Premium Accounts incl. @hotmail.de e-mail geben!
Viel Spaß mit den Accounts:
Name: PGEKJ
Passwort:nvzepvp
Email: [email protected]
Name: AMODH
Passwort:nvzepvp