Μετάβαση στο κύριο περιεχόμενο

Χειριστές Εντολών Φωνής (Voiced Handlers)

Οι Χειριστές Εντολών Φωνής (Voiced Handlers) είναι λειτουργίες του server που επιτρέπουν στους παίκτες να χρησιμοποιούν νέες εντολές στη μορφή .command. Αυτές οι εντολές χρησιμοποιούνται συχνά για την αυτοματοποίηση εργασιών ή την πρόσβαση σε συγκεκριμένα παράθυρα.

Για να δημιουργήσετε μια νέα εντολή φωνής, έχετε διάφορες επιλογές: μπορείτε να αντιγράψετε ένα υπάρχον αρχείο, να χρησιμοποιήσετε το παρεχόμενο παράδειγμα ως πρότυπο, ή να δημιουργήσετε μια νέα κλάση από την αρχή υλοποιώντας τη διεπαφή IVoicedCommandHandler.

Ανεξάρτητα από τη μέθοδο που θα επιλέξετε για τη δημιουργία της κλάσης, θα χρειαστεί να υλοποιήσετε τη μέθοδο useVoicedCommand για να επεξεργαστείτε την εντολή. Ένα μόνο αρχείο Java μπορεί να χειριστεί πολλαπλές εντολές, συνήθως ομαδοποιημένες με βάση παρόμοιες λειτουργίες.

Υπάρχουν δύο τύποι εντολών: απλές εντολές και εντολές με παραμέτρους. Προς το παρόν, δεν υπάρχει τυπική μέθοδος για τον τεμαχισμό (tokenization) των παραμέτρων. Κάποιες τεχνικές περιλαμβάνουν το διαχωρισμό με κενά, αλλά αν τα tokens σας μπορεί να περιέχουν κενά, ο διαχωρισμός με κόμματα θα μπορούσε να είναι μια βιώσιμη επιλογή. Η επιλογή της μεθόδου τεμαχισμού αφήνεται στη διακριτική σας ευχέρεια.

Τώρα, ας εξερευνήσουμε τη δομή μιας βασικής εντολής φωνής.

package com.l2jserver.datapack.handlers.voicedcommandhandlers;

import com.l2jserver.gameserver.handler.IVoicedCommandHandler;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;

public class BasicVoicedCommand implements IVoicedCommandHandler {
// These are the commands you want to include.
private static final String[] VOICED_COMMANDS = {
"simple",
"withparams"
};

@Override
public boolean useVoicedCommand(String command, L2PcInstance player, String params) {
switch (command) {
case "simple": {
player.sendMessage("Invoked simple voiced command simple!");
// Add the logic associated to this command below.

break;
}
case "withparams": {
final var parameters = params.split(" ");

// Just checking if at least one parameter has been provided.
if (parameters.length == 0) {
player.sendMessage("Invoked voiced command withparams without parameters!");
return false;
}

player.sendMessage("Invoked voiced command withparams, with first parameter " + parameters[0] + "!");
// Add the logic associated to this command below.

break;
}
}
return true;
}

@Override
public String[] getVoicedCommandList() {
return VOICED_COMMANDS;
}
}

Η κλάση BasicVoicedCommand χειρίζεται δύο εντολές: simple και withparams. Αυτές οι εντολές επεξεργάζονται χρησιμοποιώντας ένα block switch, αν και θα μπορούσε επίσης να χρησιμοποιηθεί μια δομή if-else-if. Στην περίπτωση του simple, αποστέλλεται ένα μήνυμα στον παίκτη μαζί με ένα σχόλιο που ενθαρρύνει την προσθήκη custom λογικής. Για το withparams, οι παράμετροι αναλύονται (parsed) με διαχωρισμό στα κενά. Είναι σημαντικό να σημειωθεί ότι η παράμετρος params μπορεί να είναι είτε μια κενή συμβολοσειρά είτε η πραγματική είσοδος που παρέχεται από τον παίκτη.

Ο κώδικας επαληθεύει εάν έχει περάσει τουλάχιστον μία παράμετρος. Εάν όχι, εμφανίζεται ένα μήνυμα στον παίκτη και η εντολή επιστρέφει false για να υποδείξει την αποτυχία της. Από την άλλη πλευρά, εάν έχουν παρασχεθεί μία ή περισσότερες παράμετροι, αποστέλλεται ένα διαφορετικό μήνυμα στον παίκτη, συμπεριλαμβανομένης της πρώτης παραμέτρου.

Για να ολοκληρώσετε τη ρύθμιση, πρέπει να κάνετε τροποποιήσεις στην κλάση MasterHandler που βρίσκεται στο πακέτο com.l2jserver.datapack.handlers. Εντοπίστε τον πίνακα VOICED_COMMAND_HANDLERS μέσα στην κλάση και προσθέστε την κλάση σας ανάλογα.

import com.l2jserver.datapack.handlers.voicedcommandhandlers.BasicVoicedCommand;

// ...

private static final Class<?>[] VOICED_COMMAND_HANDLERS = {
AutoLoot.class,
StatsVCmd.class,
// TODO: Add configuration options for this voiced commands:
// CastleVCmd.class,
// SetVCmd.class,
(customs().allowWedding() ? Wedding.class : null),
(customs().bankingEnabled() ? Banking.class : null),
(customs().chatAdmin() ? ChatAdmin.class : null),
(customs().multiLangEnable() && customs().multiLangVoiceCommand() ? Lang.class : null),
(customs().debugVoiceCommand() ? Debug.class : null),
(customs().allowChangePassword() ? ChangePassword.class : null),
BasicVoicedCommand.class,
};

// ...

Βεβαιωθείτε ότι εισάγετε (import) την κλάση BasicVoicedCommand και στην κλάση MasterHandler.