Ивенты
PlayerCloneEvent
Время от времени многим разработчикам проектов в Minecraft необходимо записывать в игрока свои параметры и для этого обычно используют 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)
- разрешает установить биом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>);
}
}
});
Last updated