Как пользоваться SDM CraftTweaker Plus [Guide]

Как пользоваться SDM CraftTweaker Plus [Guide]


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

Примеры и возможности

Ивенты

PlayerCloneEvent

Время от времени многим разработчикам проектов в Майнкрафт необходимо записывать в игрока свои параметры и для этого обычно используют `player.customData`, но вот беда, всё, что Вы запишите в игрока - пропадёт после его возрождения. Чтобы этого избежать, Вам пригодится следующий ивент mods.sdmcrtplus.events.entity.player.PlayerCloneEvent.
У него есть 2 метода.
  • getOriginal() - позволит получить игрока до его смерти.
  • isWasDeath() - позволит проверить умер игрок или зашёл в портал в Эндер мире.

Код, который я обычно пишу, когда использую данный ивент.
import crafttweaker.api.events.CTEventManager;
import mods.sdmcrtplus.events.entity.player.PlayerCloneEvent;
CTEventManager.register<mods.sdmcrtplus.events.entity.player.PlayerCloneEvent>((event) => {
    var player = event.player;
    if(player.level.isClientSide || !event.isWasDeath()) return;
    player.updateCustomData(event.getOriginal().customData);
});


PlayerChestLootEvent

Когда Вы хотите создать свою RPG сборку, Вам может понадобиться возможность изменить лут в генерируемых сундуках, а для этого пригодится ивент mods.sdmcrtplus.events.entity.player.PlayerChestLootEvent. Он вызывается каждый раз, когда лут в сундуке или любом контейнере с генерируемым лутом заполняется содержимым.
Существует 4 метода:
  • getPos() - позволяет получить координаты, на которых был открыт контейнер
  • getInventory() - предоставляет возможность получить инвентарь контейнера
  • getQueriedLootTableId() - разрешает получить ID таблицы, которой заполняется контейнер
  • getContext() - повзоляет получить условие заполнения контейнера

Пример использования
import crafttweaker.api.events.CTEventManager;
import mods.sdmcrtplus.events.entity.player.PlayerChestLootEvent;

CTEventManager.register<mods.sdmcrtplus.events.entity.player.PlayerChestLootEvent>((event) => {
    var player = event.player;
    if(player.level.isClientSide) return;
    var inventory = event.getInventory();

    if(inventory.countItem(<item:minecraft:potato>) > 2){
        var count = 0;
        for i in 0 .. inventory.getMaxStackSize(){
            if(count >= 2) {
                player.sendMessage("Ну я у тебя заберу 2 картошечки, а то кушац хочетца");
                break;
            }

            var item = inventory.getItem(i).asIItemStack();
            if(item.registryName == <item:minecraft:potato>.registryName){
                if(item.amount > 2){
                    count += 2;
                    item.asMutable().shrink(2);
                } else {
                    count++;
                    item.asMutable().shrink();
                }
            }
        }
    }
});


ColonyCreatedEvent

Ивент работает только в том случае, когда у Вас установлен мод Minecolonies

Для одного из наших проектов нужно было сделать следующий функционал - когда колония создавалась, игрок получает сообщение.
Для этого мы использовали ивент mods.sdmcrtplus.integration.api.events.colony.ColonyCreatedEvent. Он вызывается всякий раз, когда игрок создаёт колонию.

Пример
import crafttweaker.api.events.CTEventManager;
import mods.sdmcrtplus.integration.api.events.colony.ColonyCreatedEvent;
import stdlib.List;
import crafttweaker.api.world.Level;
import crafttweaker.api.world.ServerLevel;
import crafttweaker.api.entity.Entity;
import crafttweaker.api.entity.LivingEntity;
import crafttweaker.api.entity.type.player.Player;

CTEventManager.register<mods.sdmcrtplus.integration.api.events.colony.ColonyCreatedEvent>((event) => {
    val colony = event.getColony();
    if(colony.getWorld().isClientSide) return;
    
    val level as ServerLevel = colony.getWorld() as ServerLevel;
    val entityList as List<Entity> = level.getEntities((entity as Entity) => (entity.uuid == colony.getPermissions().getOwner() ? true : false), <entitytype:minecraft:player>);
    
    if(entityList.isEmpty) return; 
    if!(entityList[0] is Player) return;
    
    println("[INFO] : (ColonyCreatedEvent) Player Detected !");

    val player as Player;
    try {
        player = entityList[0] as Player;

        player.sendMessage("Колония создана, и Вы являетесь её создателем!");
    } catch ex as Exception{
        println("ERROR ON SCRIPT !\n" + (ex as string));
    }
});


FillBiomesFromNoiseEvent

Допустим, Вам хочется сделать сборку про выживание в пустыне, и Вы не можете найти мод на пустыню. Но это совершенно не проблема с данной модификацией. Можете воспользоваться mods.sdmcrtplus.events.level.generation.FillBiomesFromNoiseEvent -
он позволяет заменять нежелательные биомы и может даже что-то ещё (●'◡'●)
Доступны 4 метода:

  • getBiome() - позволяет получить ID биома в виде ResourceLocation
  • setBiome(biome as ResourceLocation) - разрешает установить биом
  • getChunkpos() - даёт возможность получить координаты в чанке
  • getPlayer() - можно получить игрока, который генерирует биом


Пример
import crafttweaker.api.events.CTEventManager;
import mods.sdmcrtplus.events.level.generation.FillBiomesFromNoiseEvent;

CTEventManager.register<mods.sdmcrtplus.events.level.generation.FillBiomesFromNoiseEvent>((event) => {
    event.setBiome(<resource:minecraft:biomes/desert>)
});


StructureSpawnEvent

Ох, нет. Я не хочу, чтобы у меня в мире спавнились пирамиды! Что же мне делать? Воспользуюсь-ка ивентом mods.sdmcrtplus.events.level.generation.StructureSpawnEvent, он позволит избавиться от любых структур или заменить их!
У нас есть 7 методов:

  • getStructure() - позволяет получить структуру
  • setStructure() - делает возможным изменение структуры
  • getChunkpos() - разрешает получить координаты структуры в чанке
  • getSectionpos() - разрешает полчить координаты структуры в секции
  • getStructureManager() - позволяет получить менеджера структур
  • getLevel() - можно получить мир, в котором создаётся структура
  • @Nullable getPlayer() - предоставляет право получить данные об игроке, который спавнит структуру при генерации чанков


Пример
import crafttweaker.api.events.CTEventManager;
import mods.sdmcrtplus.events.level.generation.StructureSpawnEvent;

CTEventManager.register<mods.sdmcrtplus.events.level.generation.StructureSpawnEvent>((event) => {
    if(!event.getLevel().isClientSide) {
        if(event.getStructure().registryName == <resource:minecraft:desert_pyramid>){
           //Заменяем пустынные пирамиды на город края
            event.setStructure(<resource:minecraft:end_city>);
        }
    }
});


Глобальные функции

Скажи мне сегодняшнюю дату!

Возможно, Вам когда-то нужно было проверять дату при запуске сборки. Так вот, теперь Вы можете это сделать! Всё, что нужно - это mods.sdmcrtplus.utils.Data!
Данный класс отсылает нас к Data в Java.
Здесь есть 7 методов:

  • getSeconds() - разрешает получить секунды от 0 до 59
  • getMinutes() - позволяет получить минуты от 0 до 59
  • getHours() - можно получить часы от 0 до 23
  • getDay() - теперь доступно получение дня недели (0 - Воскресенье, 1 - Понедельник, 2 - Вторник, 3 - Среда, 4 - Четверг, 5 - Пятница, 6 - Суббота)
  • getMonth() - позволяет получить месяц от 0 до 11
  • getYear() - если хотите получить год
  • getTime() - делает возможным получение точной даты в секундах с (January 1, 1970, 00:00:00 GMT) по текущую дату.


Пример
import mods.sdmcrtplus.utils.Data;

var d = new Data();
if(d.getSeconds() >= 40) println("Уже 40 секунд прошло!");


Воспроизведение сообщений

Работает только с загрузчиком sdmcrtplus.

Возможно, только ради этого Вы и скачали или скачаете данный мод.
Если хотите воспроизвести сообщение на экране игрока, да и не просто текстом, а и со звуком, тогда Вам нужно использовать mods.sdmcrtplus.utils.functions.sixikLore.LoreBuilder.
Текст сообщения пишется в lang файле.

Пример
Script1

#loader sdmcrtplus
import mods.sdmcrtplus.utils.functions.sixikLore.LoreBuilder;
import mods.sdmcrtplus.utils.functions.sixikLore.LoreQuote;
import mods.sdmcrtplus.utils.functions.sixikLore.LoreSubtitles;

/*
    addSubtitles - добавляет текст
    add - добавляет дополнительное сообщение

    LoreBuilder.registerLore(new LoreQuote(<Имя вашего сообщения>).addSubtitles(new LoreSubtitles(<Время проигрывания сообщения>).add(<Сколько проигрваается дополнительное сообщение>)))
*/
LoreBuilder.registerLore(new LoreQuote("test_message").addSubtitles(new LoreSubtitles(20).add(8).add(8).add(8)));

Script2

import crafttweaker.api.events.CTEventManager;
import crafttweaker.api.event.entity.player.ItemPickupEvent;
import mods.sdmcrtplus.utils.functions.sixikLore.LoreQuoteUtils;

CTEventManager.register<crafttweaker.api.event.entity.player.ItemPickupEvent>((event) => {
    val player = event.player;

    //LoreQuoteUtils.play(сообщение, игрок, задержка);
    LoreQuoteUtils.play(LoreQuoteUtils.getByName("test_message"), player, 80);
});


Воспроизведение видео


Если Вы хотите включить какое-либо видео игроку, используйте класс mods.sdmcrtplus.utils.functions.sixikLore.LoreQuoteUtils.
Для начала Вам нужно переместить видео в папку video, которая находится в папке с Майнкрафтом

Пример
import crafttweaker.api.events.CTEventManager;
import crafttweaker.api.event.entity.player.ItemPickupEvent;
import mods.sdmcrtplus.utils.functions.sixikLore.LoreQuoteUtils;
import crafttweaker.api.entity.type.player.ServerPlayer;
import crafttweaker.api.entity.type.player.Player;

CTEventManager.register<crafttweaker.api.event.entity.player.ItemPickupEvent>((event) => {
    val player as Player = event.player;

    /*
        LoreQuoteUtils.playVideo(игрок, имя видео, громкость);
    */
    LoreQuoteUtils.playVideo(player as ServerPlayer, "video.mp4", 100);
});


Отключение частей интерфейса

Хотели ли Вы когда-нибудь отключить части интерфейса игрока?
Хотбар? Показатели еды или хп?
Теперь, благодаря mods.sdmcrtplus.client.ClientRestricted это стало возможно!

Пример
import mods.sdmcrtplus.client.ClientRestricted;

ClientRestricted.setClientGUIRestricted(<constant:overlay:hotbar>);
ClientRestricted.setClientGUIRestricted(<constant:overlay:hotbar>, "one");
ClientRestricted.setClientGUIRestricted(<constant:overlay:hotbar>, {"close" : true});

/*
    ClientRestricted.setClientGUIRestricted(<overlay>)
    ClientRestricted.setClientGUIRestricted(<overlay>, <stage>)
    ClientRestricted.setClientGUIRestricted(<overlay>, <IData>)
*/


Модули

RPG Модуль

Перед использование нужно включить в config файле RPG Module и другие нужные Вам функции.

Если Вы хотели когда-то создать RPG Сборку и сделать собственную систему лута с множеством условий на выпадение предметов - используйте mods.sdmcrtplus.utils.functions.sixikrpg.utils.SixikRPGUtils.

Пример
import mods.sdmcrtplus.utils.functions.sixikrpg.property.entity.EntityPropertyItemBase;
import crafttweaker.api.item.IItemStack;
import stdlib.List;
import mods.sdmcrtplus.utils.functions.sixikrpg.utils.SixikRPGUtils;
import mods.sdmcrtplus.utils.functions.sixikrpg.entity.elements.EntityElementBase;
import mods.sdmcrtplus.utils.functions.sixikrpg.property.entity.EntityDropLootProperty;
import mods.sdmcrtplus.utils.functions.sixikrpg.property.loot.ItemLootPropertyDay;
import mods.sdmcrtplus.utils.functions.sixikrpg.property.loot.ItemLootPropertyBase;
import mods.sdmcrtplus.utils.functions.sixikrpg.property.entity.EntityPropertyBase;
import crafttweaker.api.entity.EntityType;
import crafttweaker.api.entity.Entity;
import mods.sdmcrtplus.utils.functions.sixikrpg.property.loot.ItemLootBase;
import mods.sdmcrtplus.utils.functions.sixikrpg.property.loot.ItemLootPropertyKillCurrentItem;
import mods.sdmcrtplus.utils.functions.sixikrpg.property.loot.ItemLootPropertyOnlyPlayer;
import mods.sdmcrtplus.utils.functions.sixikrpg.block.BlockSkillBase;
import mods.sdmcrtplus.utils.functions.sixikrpg.property.block.destroy.BlockNoDestroy;
import mods.sdmcrtplus.utils.functions.sixikrpg.property.block.destroy.BlockPropertyDestroy;
import mods.sdmcrtplus.utils.functions.sixikrpg.property.block.BlockDropLoot;
import mods.sdmcrtplus.utils.functions.sixikrpg.property.block.BlockExplosion;


/*
    Со слизней при убийстве деревянным мечом, после 10 дня игры, будет падать алмаз или золотой слиток 
с шансом в 50%, а максимальное количество выпадаемых за раз предметов равно 10 ед.
*/
SixikRPGUtils.register(
    new EntityElementBase([<entitytype:minecraft:slime>] as EntityType<Entity>[], [
        new EntityDropLootProperty(
            new ItemLootBase(
                [
                    <item:minecraft:diamond>, 
                    <item:minecraft:gold_ingot>
                ], 
                [
                    new ItemLootPropertyDay(10),
                    new ItemLootPropertyKillCurrentItem([<item:minecraft:wooden_sword>]),
              
                ], 
                50.0
            ),
            10
        )
    ] as EntityPropertyBase[])
);

/*
    Со слизней при убийстве деревянным мечом, после 12 дня игры, будет падать изумруд или медный слиток
с шансом в 50%, а максимальное количество выпадаемых за раз предметов равно 10 ед.
*/
SixikRPGUtils.register(
    new EntityElementBase([<entitytype:minecraft:slime>] as EntityType<Entity>[], [
        new EntityDropLootProperty(
            new ItemLootBase(
                [
                    <item:minecraft:emerald>, 
                    <item:minecraft:copper_ingot>
                ], 
                [
                    new ItemLootPropertyDay(12),
                    new ItemLootPropertyKillCurrentItem([<item:minecraft:wooden_sword>]),
        
                ], 
                50.0
            ),
            10
        )
    ] as EntityPropertyBase[])
);


/*
    При ломании камня он будет взрываться!
*/
SixikRPGUtils.register(
    new BlockSkillBase(<blockstate:minecraft:stone>, [
        new BlockExplosion(10.0, 20.0, 50.0)
    ])
);


Голосуй за новость:
(+4.0040.00)
  • Просмотров: 700
  • Комментариев: 0
Рекомендуемое для Вас:
Для написания комментария зарегистрируйся на сайте, это займет всего пару минут, голосуй за новости, зарабатывай репутацию.

Последние сообщения с форума

Название темы Автор Статистика Последнее сообщение
Как сделать так чтобы блок слизи не прилипал к блокам?

Тема в разделе: Ваши вопросы по Minecraft

harvik

Просмотров: 250

Ответов: 2

Автор: cat1967

Сегодня, 08:53

Голосование, за снятие самых худших Администраторов*

Тема в разделе: Амнистия

OneCatPlaton

Просмотров: 5763

Ответов: 60

Автор: vovanhurcane

Сегодня, 00:14

Проблема с текстурами в игре

Тема в разделе: Ваши вопросы по Minecraft

Nerfost

Просмотров: 422

Ответов: 2

Автор: cat1967

Вчера, 19:19

мод simple planes 1.12.2 HELP!!!

Тема в разделе: Ваши вопросы по Minecraft

Wizardblack

Просмотров: 154

Ответов: 0

Автор: Wizardblack

Вчера, 18:00

Видео/Стримы канал Ritterydam

Тема в разделе: Флудильня

ritterydam

Просмотров: 98949

Ответов: 491

Автор: ritterydam

Вчера, 17:30