Классы

В моде CraftTwekaer используется язык программирования zenScript, так что знания классов Вам будут очень полезны для написания профессионального рода скриптов!

Создадим класс, который будет отвечать за данные entity

Пример

public class EntityData {
    
}

Также нужно создать конструктор, который позволит динамически создавать класс, который не будет постоянно храниться в памяти. В любой другом ЯП мы бы писали следующим образом - public EntityData(){}, но в zenScript стоит писать public this(){}.

Пример

public class  EntityData {
    public this() {
        
    }
}

Следует ещё добавить в класс наше существо или же Entity. Необходимо импортировать его так - import crafttweaker.api.entity.Entity;. Кроме этого, нужно хранить данные или же IData. Импортируем - import crafttweaker.api.data.IData.

Пример

import crafttweaker.api.entity.Entity;
import crafttweaker.api.data.IData;

public class EntityData {
    public val entity as Entity;
    public val data as IData;
    
    public this(entity as Entit, data as IDatay) {
        this.entity = entity;
        this.data = data;
    }
}

Теперь нам важно создать метод, который будет проверять, есть ли у существа или же Entity соответствующие данные. Поможет в этом customData, так как в data мы записать ничего не сможем. Ключевое слово in аналогично contains & includes.

public isHaveData() as bool {
    if (this.data in this.entity.customData) return true;
    else return false;
}

Таким образом, у нас есть метод, который позволит проверить, есть ли у игрока нужные нам данные. После этого создадим нужно класс, который сможет записать в игрока новые данные.

Пример

public sendData() as bool {
    if (isHaveData()) return false;
    else this.entity.updateCustomData(this.data);
}

Теперь нас есть всё необходимое. Остаётся только применить данный класс. crafttweaker.api.event.entity.player.ItemPickupEvent.

Пример

import crafttweaker.api.events.CTEventManager;
import crafttweaker.api.event.entity.player.ItemPickupEvent;
CTEventManager.register<crafttweaker.api.event.entity.player.ItemPickupEvent>((event) => {
    var player = event.player;
    if (player.level.isClientSide) return;
    var myData as EntityData = new EntityData(player, {"firstPickUp" : true});
    myData.sendData();
});

При подборе любого предмета в игрока будут внесены новые данные в customData. Вы можете задаться вопросом, как же мы передали player в наш класс, если в его параметрах Entity? Всё потому, что игрок наследуется от EntityLiving, а он, в свою очередь, от Entity.

Полный код

import crafttweaker.api.entity.Entity;
import crafttweaker.api.data.IData;

public class EntityData {
    public val entity as Entity;
    public val data as IData;
    
    public this (entity as Entit, data as IDatay) {
        this.entity = entity;
        this.data = data;
    }

    public isHaveData() as bool {
        if (this.data in this.entity.customData) return true;
        else return false;
    }
    
    public sendData() as bool {
        if (isHaveData()) return false;
        else this.entity.updateCustomData(this.data);
    }
}

Last updated