Timer starten in een event, na tien minuten doorgaan met het uitvoeren van een script

Status
Niet open voor verdere reacties.

mcfreak

Gebruiker
Lid geworden
21 feb 2012
Berichten
508
Hallo!

Ik heb een opdracht gekregen om een spelletje te maken in bukkit.
Maar hoe kan ik ervoor Zorgen dat als een stukje script is uitgevoerd het tien minuten pauserd en dan weer verdergaat?
Het lijkt heel simpel, maar ik kom er niet uit...
Alles helpt, groetjes,

- mcfreak
 
het lukt niet, ik kan maar 1x extend doen tewijl ik het dan 2x moet doen.
ik ben overigens redelijk nieuw met java, dus ik ik begrijp nog niet alles...
thread sleep werkt, maar alles loopt wel vast.
is er iets met async ofzo?
 
Als je jouw code laat zien kunnen we je verder helpen; twee extends zijn namelijk niet nodig. Je kan een tweede thread aanmaken en die laten slapen, maar dit raad ik niet aan vanwege het bestaan van de timer klasse.
 
mijn code:
Code:
package cookcraft;

import java.util.logging.Logger;

import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin implements Listener {
	public Logger log = Logger.getLogger("Minecraft");
    public void onEnable() {
    	log.info("moge");
        getServer().getPluginManager().registerEvents(this, this);
    }
	@EventHandler
	public void onPlayerJoin(PlayerJoinEvent event){
		log.info("moge");
		try {
			Thread.sleep(5000);
			log.info("moge1");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

met de bukkit code eringezet
 
Je kan een Timertask aanmaken waarin de code staat die je elke ... seconden moet aanroepen. Deze timertask kan je uitvoeren met de methode 'schedule' van de Timer (zie de link die ik gegeven had).

Code:
		Timer timer = new Timer();
		//anonieme innerclass (timertask)
		timer.schedule(new TimerTask() {

			@Override
			public void run() {
				System.out.println("bla");
			}
			
		}, 0, 500);
		System.out.println("na");
	}

In jouw voorbeeld:
Code:
public class Main extends JavaPlugin implements Listener {
      private Timer timer;
       
    //constructor
    public Main(..) {
         timer = new Timer();
                               
    }
	public Logger log = Logger.getLogger("Minecraft");
    public void onEnable() {
    	log.info("moge");
        getServer().getPluginManager().registerEvents(this, this);
    }
	@EventHandler
	public void onPlayerJoin(PlayerJoinEvent event){
		log.info("moge");
		try {
			timer.schedule(new TimerTask() {

			@Override
			public void run() {
				//code die je wilt uitvoeren.
			}
			
		}, 0, 500);
//zonder body doe ik hier eigenlijk: timer.schedule(new TimerTask() {}, 0,500);, dus een methode aanroep waar ik een object en twee
// andere integers aan meegeef.
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
 
Laatst bewerkt:
Dank je!
Ga ik vanmiddag proberen, als ik thuis ben.
Maar blijft deze onbeperkt loopen of doet i t maar een keer?
En je bedoelt met 500 toch een halve seconden? Of iets anders?
 
Hij roept elke 500 milliseconde (halve seconde) de Task (en daarmee impliciet de run methode) aan.
 
Ow, kan ik er voor zorgen dat het stopt met een scriptje?
Niet met een tijd, maar als ik het oproep
 
Laatst bewerkt:
Nu snap ik niet meer precies wat je wilt. Schets een context (vertel waarom en hoe het moet werken) en bepaal precies wat je wilt en niet wilt.
 
Ok, opnieuw:

Ik heb een opdracht gekregen om een bukkit plugin te maken, die een lobby moet hebben.
Mijn idee was om een aftellen te maken die start nadat er zoveel spelers in de server zitten, wat dus wordt gecontroleerd in het onplayerjoin event.
Die lobby moet een aftellen hebben, van 30 seconden, ik gaf 10 minuten omdat ik dat wel makkelijk vond.
Nu heb ik de irritante tik om plotseling van idee te veranderen zonder t aan de rest te vertellen, wat dus net is gebeurd.
Het nieuwe idee is om het te laten telen om de seconden, dan checken hoeveel seconden er nog van die 30 over zijn en als ik wat heb ingesteld voor die seconden (zoals 30, 20, 10, 5, 3, 2, 1 en 0) moet het een script uitvoeren.
(Zeggen dat er nog ... Seconden over zijn voor de start, bij 0 het script te starten die het spel in werking zet)
Dan moet er een nieuwe timer starten, die 10 minuten aftelt (of van 0 naar 10 minuten optelt) die het tijdslimiet instelt

Ik hoop dat je het nu begrijpt, vragen mag natuurlijk altijd :)
 
Ik heb nu even geen tijd om een voorbeeldje te coderen. Je zou twee Tasks kunnen maken. Een task telt van 30 tot 1. De andere task start het scriptje. Dan kan je de timer de tasks na elkaar laten uitvoeren (twee keer de schedule methode aanroepen met verschillende parameters).

Neem een kijkje naar de api: http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html

schedule(TimerTask task, long delay, long period)
Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay.

p.s. ik geef je geen kant en klare code. Je zult zelf ook moeten nadenken. Ik probeer je hints te geven om je doel te bereiken ;)
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan