> For the complete documentation index, see [llms.txt](https://wiki.aegis-mine.ru/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wiki.aegis-mine.ru/modifications/sozdanie-kontenta/sdm-crafttweaker-plus/iventy.md).

# Ивенты

## <mark style="color:blue;">PlayerCloneEvent</mark>

Время от времени многим разработчикам проектов в Minecraft необходимо записывать в игрока свои параметры и для этого обычно используют <mark style="color:blue;">**player.customData**</mark>, но вот беда, всё, что Вы запишите в игрока - пропадёт после его возрождения. Чтобы этого избежать, Вам пригодится следующий ивент - <mark style="color:blue;">**mods.sdmcrtplus.events.entity.player.PlayerCloneEvent**</mark>. У него есть 2 метода.

* `getOriginal()` - позволит получить игрока до его смерти.
* `isWasDeath()` - можно проверить умер игрок или зашёл в портал в Эндер мире.

### Пример

{% code lineNumbers="true" %}

```typescript
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);
});
```

{% endcode %}

***

## <mark style="color:blue;">PlayerChestLootEvent</mark>

Когда Вы хотите создать свою RPG сборку, Вам может понадобиться возможность изменить лут в генерируемых сундуках, а для этого пригодится ивент <mark style="color:blue;">**mods.sdmcrtplus.events.entity.player.PlayerChestLootEvent**</mark>. Он вызывается каждый раз, когда лут в сундуке или любом контейнере с генерируемым лутом заполняется содержимым. Существует 4 метода:

* `getPos()` - позволяет получить координаты, на которых был открыт контейнер
* `getInventory()` - предоставляет возможность получить инвентарь контейнера
* `getQueriedLootTableId()` - разрешает получить ID таблицы, которой заполняется контейнер
* `getContext()` - повзоляет получить условие заполнения контейнера

### Пример

{% code lineNumbers="true" %}

```typescript
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();
                }
            }
        }
    }
});
```

{% endcode %}

***

## <mark style="color:blue;">ColonyCreatedEvent</mark>

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

Для одного из наших проектов нужно было сделать следующий функционал - когда колония создавалась, игрок получает сообщение. Для этого можно использовать ивент <mark style="color:blue;">**mods.sdmcrtplus.integration.api.events.colony.ColonyCreatedEvent**</mark>. Он вызывается всякий раз, когда игрок создаёт колонию.

### Пример

{% code lineNumbers="true" %}

```typescript
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));
    }
});
```

{% endcode %}

***

## <mark style="color:blue;">FillBiomesFromNoiseEvent</mark>

Допустим, Вам хочется сделать сборку про выживание в пустыне, и Вы не можете найти мод на пустыню. Но это совершенно не проблема с данной модификацией. Можете воспользоваться <mark style="color:blue;">**mods.sdmcrtplus.events.level.generation.FillBiomesFromNoiseEvent**</mark> - он позволяет заменять нежелательные биомы и может даже что-то ещё. Доступны 4 метода:

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

### Пример

{% code lineNumbers="true" %}

```typescript
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>)
});
```

{% endcode %}

***

## <mark style="color:blue;">StructureSpawnEvent</mark>

Ох, нет. Я не хочу, чтобы у меня в мире спавнились пирамиды! Что же мне делать? Воспользуюсь-ка ивентом <mark style="color:blue;">**mods.sdmcrtplus.events.level.generation.StructureSpawnEvent**</mark>, он позволит избавиться от любых структур или заменить их!

У нас есть 7 методов:

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

### Пример

{% code lineNumbers="true" %}

```typescript
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>);
        }
    }
});
```

{% endcode %}
