02 / Praktiske mønstre

Guides

Her samler vi de integrationer, du typisk bygger oven på MineCore.

Event-livscyklus

MineCore bruger events til at beskrive hele rejsen fra en request bliver bygget, til den er oprettet og modtaget af serveren. Votes følger deres egen modtagelsesflow.

Det samlede flow

01PreCreateRequestEventFør request oprettes
→
02PostCreateRequestEventEfter request er oprettet
→
03ReceiveRequestEventServeren modtager request
VOTEReceiveVoteEventServeren modtager et vote

1. Før requesten oprettes

PreCreateRequestEvent bliver sendt med en StoreRequest, før requesten oprettes. Brug eventet til at validere eller stoppe requesten, hvis den ikke må sendes.

public void onPreCreate(PreCreateRequestEvent event) {
    StoreRequest request = event.getStoreRequest();

    if (!isAllowed(request)) {
        event.setCancelled(true);
    }
}

Hvis eventet bliver annulleret, returnerer callEvent() true, og requesten bør ikke fortsætte.

2. Efter requesten er oprettet

PostCreateRequestEvent bliver sendt, når requesten er oprettet. Her får du en StoreCreatedRequest, som indeholder den oprettede requests ID og kan gemmes til senere sporing.

public void onPostCreate(PostCreateRequestEvent event) {
    StoreCreatedRequest request = event.getStoreRequest();
    saveRequestId(request.getId());
}

3. Når serveren modtager en request

ReceiveRequestEvent betyder, at serveren har modtaget en request fra MineClub. Eventet har både en type og en StoreCreatedRequest. Brug typen til at skelne mellem request-typer, og udfør først belønningen, når requestens data er valideret.

public void onReceiveRequest(ReceiveRequestEvent event) {
    StoreCreatedRequest request = event.getStoreRequest();

    if ("purchase".equals(event.getType()) && isValid(request)) {
        giveProducts(request);
        MineCoreApi.getInstance()
            .getMinecoreRequestManager()
            .acceptRequest(request);
    }
}

Gem ikke belønningen som gennemført, før din egen behandling er lykkedes. Det gør det lettere at håndtere genforsøg uden at give den samme belønning flere gange.

Samme livscyklus i Skript

Skript-hook’et bruger de samme fire trin, men med Skript-events. Du kan derfor bygge requesten, reagere før og efter oprettelsen og til sidst håndtere den request eller det vote, serveren modtager.

01pre create requestValidér eller stop requesten
→
02post create requestRequesten er oprettet
→
03receive requestGiv købte produkter
VOTEreceive voteGiv vote-belønningen

Opret requesten

create a minecore request for player:
    add product "my-product" named "My Product" price 10
    add product "premium" named "Premium" price 20 quantity 1

Før requesten oprettes

Brug pre create request til at kontrollere requesten, før den sendes. I en Skript-hook, der understøtter event-cancellation, kan du stoppe flowet med cancel event.

on minecore pre create request:
    if <din validering fejler>:
        cancel event
        log "MineCore request blev stoppet"

Efter requesten oprettes

on minecore post create request:
    log "MineCore request blev oprettet"
    log "Request: %event-request%"

Modtag køb og votes

on minecore receive request:
    log "Modtog request: %event-type%"
    accept minecore request event-request

on minecore receive vote:
    log "Modtog vote"
    accept minecore vote event-vote

Brug event-request og event-vote i accept-effects, når du vil markere den aktuelle request eller vote som behandlet. Kontrollér altid dine egne belønninger før accept, så genforsøg ikke giver dobbelt belønning.

4. Når serveren modtager et vote

ReceiveVoteEvent indeholder et MappedVote. Giv spillerens vote-belønning, og kald derefter acceptVote. Hvis vote-data ikke kan behandles, skal du bruge rejectVote.

public void onReceiveVote(ReceiveVoteEvent event) {
    MappedVote vote = event.getVote();

    if (alreadyProcessed(vote)) {
        return;
    }

    giveVoteReward(vote);
    markAsProcessed(vote);
    MineCoreApi.getInstance()
        .getMinecoreRequestManager()
        .acceptVote(vote);
}

Async event bus

Event-klasserne sender sig selv via MineCoreApi.getInstance().getAsyncEventBus().post(this). Behandl derfor handlers som asynkrone: undgå direkte Bukkit- eller world-operationer fra event-handleren, og hop over på serverens scheduler, når en handling kræver main thread.

Se API-reference for eventernes felter og managers, eller Skript-hooks for den samme livscyklus i Skript.