Bloc

Les blocs permettent de décupler les possibilités de Sqript, mais seront de fait les objets les plus abstraits et les plus difficiles à manipuler. Pour créer un bloc, il suffit de créer une classe qui hérite de ScriptBlock et y ajouter l'annotation @Block, puis la remplir. Les blocs sont reconnus automatiquement au démarrage de Sqript, et le constructeur de votre classe sera appelé si le Regex passé dans l'annotation a été reconnu lors de la lecture de la première ligne du bloc. Cette ligne sera appelée l'entête du bloc.

Lors de la lecture du bloc, plusieurs sous-blocs vont être générés par Sqript, et donnés à votre objet ScriptBlock. Pour les configurer, il suffit de les ajouter à la liste fields() de l'annotation @Block. Si votre bloc n'a pas de structure particulière (contrairement au bloc command, auquel on peut donner une description, ou des aliases par exemple), tout le contenu de votre bloc sera dans l'objet mainField , contenant tout ce que contient votre bloc. Libre à vous de travailler avec ces lignes comme il vous semble. Il est possible de compiler ces lignes grâce à la méthode compile de votre mainField, puis grâce à la méthode createCompileGroup() à donner en argument de la méthode précédente.

Pour des structures de blocs plus complexes, il est possible de récupérer des sous blocs particuliers en utilisant ce code très simple (ici extrait de la classe du bloc command) :

if(fieldDefined("description"))
    this.setDescription(getSubBlock("description").getRawHead()); 

Les méthodes les plus importantes étant fieldDefined(String) et getSubBlock(String). La méthode getRawContent() renvoie en chaîne de caractères brute l'entête du sous-block à laquelle on a enlevé le nom du sous bloc (ici "description") suivi de deux points ":".

Voici un exemple, la classe du bloc packet qui permet d'échanger des informations entre le côté client et le côté serveur:

@Block(
        feature = @Feature(name = "Packet",
                description = "Define a packet of data that can be sent to a player or to the server. Packets will transmit data only if the data's type is serialisable. Packets are used to transmit information between players (clients) and the server, they are useful in GUIs for example, to tell the server whenever the client clicks on a button (otherwise, as this happens on the player's computer, the server can't know it). Be careful when using packets, and always try to check if the information is verified, because anyone can send a packet with false informations in order to cheat or to mess with the server. For example, checking distances can be good when a player asks the server to open an inventory. ",
                examples = "packet test_packet(message):\n" +
                        "\tclient:\n" +
                        "\t\tprint message\n" +
                        "\tserver:\n" +
                        "\t\tprint message\n" +
                        "\n" +
                        "command /sendPacket {string}:\n" +
                        "\tsend test_packet(arg-1) to player",
                regex = "^packet .*",
                side = Side.BOTH),
        fields = {
                @Feature(name = "client"),
                @Feature(name = "server")
        }
)
public class ScriptBlockPacket extends ScriptFunctionalBlock {

    //Les IScript à exécuter en fonction du side de réception
    IScript client = null;
    IScript server = null;

    public IScript getClient() {
        return client;
    }

    public IScript getServer() {
        return server;
    }

    @SideOnly(net.minecraftforge.fml.relauncher.Side.CLIENT)
    @Override
    public ScriptType get(ScriptContext context, ScriptType<?>[] parameters) throws ScriptException {
        return new TypeMessagePrototype(new ScriptMessage(this.name, parameters));
    }

    public ScriptBlockPacket(ScriptToken head) throws ScriptException {
        super(head);
    }

    @Override
    protected void load() throws Exception {

        //Compilation des fields "client" et "server"
        if(fieldDefined("client")){
            client = getSubBlock("client").compile();
        }
        if(fieldDefined("server")){
            server = getSubBlock("server").compile();
        }

        //On enregistre le message fraîchement créé, pour qu'il soit reconnu par le reste du script.
        ScriptNetworkManager.registerMessage(this);
    }

}
Retour en haut de la page