# Ивенты

## <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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wiki.aegis-mine.ru/modifications/sozdanie-kontenta/sdm-crafttweaker-plus/iventy.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
