|
You last visited: Today at 13:34
Advertisement
Bukkit Kit alle 3 Stunden?
Discussion on Bukkit Kit alle 3 Stunden? within the Minecraft forum part of the Other Online Games category.
04/12/2014, 18:41
|
#1
|
elite*gold: 106
Join Date: Dec 2013
Posts: 435
Received Thanks: 23
|
Bukkit Kit alle 3 Stunden?
Hey Community,
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.
mfg
|
|
|
04/12/2014, 18:59
|
#2
|
elite*gold: 36
Join Date: Jun 2013
Posts: 701
Received Thanks: 170
|
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.
Mit freundlichen Grüßen
Floppy012
|
|
|
04/12/2014, 20:01
|
#3
|
elite*gold: 106
Join Date: Dec 2013
Posts: 435
Received Thanks: 23
|
phuuu. Also ich schaffe es irgendwie nicht. Kann mir jemand eine kleine Hilfe geben?
|
|
|
04/12/2014, 20:04
|
#4
|
elite*gold: 36
Join Date: Jun 2013
Posts: 701
Received Thanks: 170
|
Wo hängt es denn?
Mit freundlichen Grüßen
Floppy012
|
|
|
04/12/2014, 20:38
|
#5
|
elite*gold: 7
Join Date: Oct 2010
Posts: 662
Received Thanks: 60
|
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.
|
|
|
04/12/2014, 20:40
|
#6
|
Administrator
elite*gold: 25736
Join Date: May 2011
Posts: 20,759
Received Thanks: 2,291
|
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:
Code:
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:
Code:
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
|
|
|
04/12/2014, 22:09
|
#7
|
elite*gold: 106
Join Date: Dec 2013
Posts: 435
Received Thanks: 23
|
The operator + is undefined for the argument type(s) HashMap<Player,Long>, long steht bei mir.
|
|
|
04/12/2014, 22:13
|
#8
|
Administrator
elite*gold: 25736
Join Date: May 2011
Posts: 20,759
Received Thanks: 2,291
|
argh sorry, mein fehler:
if((waittime.get(p)+dreiStunden) < System.currentTimeMillis())
|
|
|
04/13/2014, 12:12
|
#9
|
elite*gold: 106
Join Date: Dec 2013
Posts: 435
Received Thanks: 23
|
PHP Code:
public boolean onCommand(CommandSender sender, Command cmd, String label, String args) { Player p = (Player)sender; if(cmd.getName().equalsIgnoreCase("das")) { if(waittime.containsKey(p)) { long dreistunden = 3L*3600L*1000L; if((waittime.get(p)+dreistunden) < System.currentTimeMillis()) { p.sendMessage("Du kannst das Kit erst wieder in §b" + waittime + "§f Sekunden nutzen."); return true; } }
ItemStack helm = new ItemStack(Material.IRON_HELMET); helm.addUnsafeEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1); helm.addUnsafeEnchantment(Enchantment.DURABILITY, 1); ItemMeta helmm = helm.getItemMeta(); helmm.setDisplayName("§7Eisen Kit §8| §fHelm"); helm.setItemMeta(helmm); p.getInventory().setItem(4, helm); waittime.put(p, System.currentTimeMillis()); } return true; }
Hmm klappt bei mir nicht.
|
|
|
04/13/2014, 12:17
|
#10
|
Administrator
elite*gold: 25736
Join Date: May 2011
Posts: 20,759
Received Thanks: 2,291
|
1.
Code:
public boolean onCommand(CommandSender sender, Command cmd, String label,
String args) {
zu:
Code:
public boolean onCommand(CommandSender sender, Command cmd, String label,
String[] args) {
da args ein Array ist
2.
Code:
p.sendMessage("Du kannst das Kit erst wieder in §b" + waittime + "§f Sekunden nutzen.");
zu
Code:
p.sendMessage("Du kannst das Kit erst wieder in §b" + waittime.get(p) + "§f Sekunden nutzen.");
3. Ist der Befehl registriert? also in der plugin.yml Datei? Bzw. was geht denn sonst genau nicht?
|
|
|
04/13/2014, 12:21
|
#11
|
elite*gold: 106
Join Date: Dec 2013
Posts: 435
Received Thanks: 23
|
ohhh **** xD genau da fehlt []
srry war zu dumm^^
€: Man kanns immer wieder holen.
|
|
|
04/13/2014, 12:28
|
#12
|
Administrator
elite*gold: 25736
Join Date: May 2011
Posts: 20,759
Received Thanks: 2,291
|
oh stimmt, die if anweisung ist falsch:
Code:
if((waittime.get(p)+dreiStunden) < System.currentTimeMillis()) {
müsste
Code:
if((waittime.get(p)+dreiStunden) > System.currentTimeMillis()) {
sein
Denn erst wenn der aktuelle Timestamp größer (und nicht kleiner) als der Timestamp+3h ist, soll ja der andere Code ausgeführt werden
|
|
|
04/13/2014, 14:42
|
#13
|
elite*gold: 106
Join Date: Dec 2013
Posts: 435
Received Thanks: 23
|
Uff das klappt einfach nicht -.-
|
|
|
04/13/2014, 14:45
|
#14
|
elite*gold: 36
Join Date: Jun 2013
Posts: 701
Received Thanks: 170
|
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;
}
Mit freundlichen Grüßen
Floppy012
|
|
|
04/13/2014, 16:50
|
#15
|
Moderator
elite*gold: 558
Join Date: Feb 2010
Posts: 6,544
Received Thanks: 1,424
|
Quote:
Originally Posted by Floppy012
Code:
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.");
|
|
|
Similar Threads
|
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
|
All times are GMT +2. The time now is 13:34.
|
|