Back

events.md

markdown
wiki/examples/events.md
# 🎯 Примеры обработки событий

Готовые примеры обработки событий в ScriptsLab.

---

## Событие входа игрока

Срабатывает при входе игрока на сервер.

```javascript
/**
 * PlayerJoinEvent - Вход игрока на сервер
 */

Events.on('PlayerJoinEvent', function(event) {
    var player = event.getPlayer();
    
    // Убираем ванильное сообщение
    event.joinMessage(null);
    
    // Отправляем кастомное приветствие
    var Bukkit = Java.type('org.bukkit.Bukkit');
    
    player.sendMessage('§8§m                                           ');
    player.sendMessage('');
    player.sendMessage('  §6§l⚡ Добро пожаловать! ⚡');
    player.sendMessage('');
    player.sendMessage('  §7Привет, §e' + player.getName() + '§7!');
    player.sendMessage('  §7Онлайн: §a' + Bukkit.getOnlinePlayers().size() + ' §7игроков');
    player.sendMessage('');
    player.sendMessage('  §7Используй §e/help §7для помощи');
    player.sendMessage('');
    player.sendMessage('§8§m                                           ');
    
    // Сообщение другим игрокам
    Bukkit.getOnlinePlayers().forEach(function(p) {
        if (p.getName() !== player.getName()) {
            p.sendMessage('§8[§a+§8] §7' + player.getName() + ' §aзашёл на сервер');
        }
    });
    
    Console.log(player.getName() + ' зашёл на сервер');
});

Console.log('Обработчик PlayerJoinEvent загружен');
```

---

## Событие выхода игрока

Срабатывает при выходе игрока с сервера.

```javascript
/**
 * PlayerQuitEvent - Выход игрока с сервера
 */

Events.on('PlayerQuitEvent', function(event) {
    var player = event.getPlayer();
    
    // Убираем ванильное сообщение
    event.quitMessage(null);
    
    // Кастомное сообщение
    var Bukkit = Java.type('org.bukkit.Bukkit');
    Bukkit.getOnlinePlayers().forEach(function(p) {
        if (p.getName() !== player.getName()) {
            p.sendMessage('§8[§c-§8] §7' + player.getName() + ' §cвышел с сервера');
        }
    });
    
    Console.log(player.getName() + ' вышел с сервера');
});

Console.log('Обработчик PlayerQuitEvent загружен');
```

---

## Событие смерти

Срабатывает при смерти игрока.

```javascript
/**
 * PlayerDeathEvent - Смерть игрока
 */

Events.on('PlayerDeathEvent', function(event) {
    var entity = event.getEntity();
    var killer = event.getEntity().getKiller();
    
    // Проверяем, был ли убит игрок
    if (killer !== null) {
        var message = '§c' + entity.getName() + ' §7был убит §c' + killer.getName();
        event.deathMessage(message);
        
        Console.log(entity.getName() + ' был убит ' + killer.getName());
    } else {
        var message = '§c' + entity.getName() + ' §7умер';
        event.deathMessage(message);
        
        Console.log(entity.getName() + ' умер');
    }
});

Console.log('Обработчик PlayerDeathEvent загружен');
```

---

## Событие чата

Срабатывает при отправке сообщения в чат.

```javascript
/**
 * AsyncPlayerChatEvent - Сообщение в чат
 */

Events.on('AsyncPlayerChatEvent', function(event) {
    var player = event.getPlayer();
    var message = event.getMessage();
    
    // Фильтр плохих слов
    var badWords = ['badword1', 'badword2', 'мат'];
    
    for (var i = 0; i < badWords.length; i++) {
        if (message.toLowerCase().indexOf(badWords[i]) !== -1) {
            event.setCancelled(true);
            player.sendMessage('§cПожалуйста, следите за речью!');
            player.sendMessage('§7Нарушение: запрещённое слово');
            Console.log(player.getName() + '使用了 плохое слово: ' + badWords[i]);
            return;
        }
    }
    
    // Добавляем префикс к сообщению
    var format = '§e' + player.getName() + ' §7» §f' + message;
    event.setFormat(format);
});

Console.log('Обработчик AsyncPlayerChatEvent загружен');
```

---

## Событие урона

Срабатывает при получении урона.

```javascript
/**
 * EntityDamageEvent - Получение урона
 */

Events.on('EntityDamageEvent', function(event) {
    var entity = event.getEntity();
    var damage = event.getDamage();
    
    // Логирование
    Console.log(entity.getName() + ' получил урон: ' + damage);
    
    // Пример: нельзя умереть от падения с малой высоты
    var cause = event.getCause();
    if (cause.toString() === 'FALL') {
        if (damage < 5) {
            event.setCancelled(true);
        }
    }
});

Console.log('Обработчик EntityDamageEvent загружен');
```

---

## Событие атаки

Срабатывает при атаке одного моба другим.

```javascript
/**
 * EntityDamageByEntityEvent - Атака сущности
 */

Events.on('EntityDamageByEntityEvent', function(event) {
    var damager = event.getDamager();
    var victim = event.getEntity();
    
    var Player = Java.type('org.bukkit.entity.Player');
    
    // Проверяем, что атакующий - игрок
    if (damager instanceof Player) {
        Console.log(damager.getName() + ' атаковал ' + victim.getName());
    }
});

Console.log('Обработчик EntityDamageByEntityEvent загружен');
```

---

## Событие стрельбы из лука

```javascript
/**
 * EntityShootBowEvent - Стрельба из лука
 */

Events.on('EntityShootBowEvent', function(event) {
    var entity = event.getEntity();
    var item = event.getBow();
    
    Console.log(entity.getName() + ' стреляет из лука');
    
    // Проверяем, что это игрок
    var Player = Java.type('org.bukkit.entity.Player');
    if (entity instanceof Player) {
        // Дополнительная логика
    }
});

Console.log('Обработчик EntityShootBowEvent загружен');
```

---

## Событие установки блока

```javascript
/**
 * BlockPlaceEvent - Установка блока
 */

Events.on('BlockPlaceEvent', function(event) {
    var player = event.getPlayer();
    var block = event.getBlock();
    var type = block.getType();
    
    // Запрет установки определённых блоков
    var blockedBlocks = ['TNT', 'LAVA', 'WATER'];
    
    for (var i = 0; i < blockedBlocks.length; i++) {
        if (type.toString() === blockedBlocks[i]) {
            event.setCancelled(true);
            player.sendMessage('§cНельзя ставить: ' + type);
            Console.log(player.getName() + ' попытался поставить ' + type);
            return;
        }
    }
    
    Console.log(player.getName() + ' поставил ' + type);
});

Console.log('Обработчик BlockPlaceEvent загружен');
```

---

## Событие разрушения блока

```javascript
/**
 * BlockBreakEvent - Разрушение блока
 */

Events.on('BlockBreakEvent', function(event) {
    var player = event.getPlayer();
    var block = event.getBlock();
    var type = block.getType();
    
    // Запрет разрушения определённых блоков
    var protectedBlocks = ['BEDROCK', 'COMMAND_BLOCK'];
    
    for (var i = 0; i < protectedBlocks.length; i++) {
        if (type.toString() === protectedBlocks[i]) {
            event.setCancelled(true);
            player.sendMessage('§cНельзя ломать: ' + type);
            Console.log(player.getName() + ' попытался сломать ' + type);
            return;
        }
    }
    
    Console.log(player.getName() + ' сломал ' + type);
});

Console.log('Обработчик BlockBreakEvent загружен');
```

---

## Событие входа в регион (WorldGuard)

```javascript
/**
 * PlayerMoveEvent - Движение игрока
 * Можно использовать для проверки входа в регион
 */

Events.on('PlayerMoveEvent', function(event) {
    var player = event.getPlayer();
    var from = event.getFrom();
    var to = event.getTo();
    
    // Проверяем, изменилась ли позиция
    if (from.getBlockX() !== to.getBlockX() || 
        from.getBlockY() !== to.getBlockY() || 
        from.getBlockZ() !== to.getBlockZ()) {
        
        // Логика проверки региона
        // WorldGuard API: event.getPlayer().inWorldRegion("region_name")
    }
});

Console.log('Обработчик PlayerMoveEvent загружен');
```

---

## Событие изменения предмета в руке

```javascript
/**
 * PlayerItemHeldEvent - Смена предмета в руке
 */

Events.on('PlayerItemHeldEvent', function(event) {
    var player = event.getPlayer();
    var newSlot = event.getNewSlot();
    var oldSlot = event.getPreviousSlot();
    
    var newItem = player.getInventory().getItem(newSlot);
    var oldItem = player.getInventory().getItem(oldSlot);
    
    Console.log(player.getName() + ' сменил предмет: ' + oldSlot + ' -> ' + newSlot);
    
    // Пример: проверка кастомного предмета
    if (newItem !== null && newItem.hasItemMeta()) {
        var meta = newItem.getItemMeta();
        if (meta.hasDisplayName() && meta.getDisplayName().indexOf('МЕЧ') !== -1) {
            player.sendMessage('§6Вы взяли меч!');
        }
    }
});

Console.log('Обработчик PlayerItemHeldEvent загружен');
```

---

## Таблица событий

| Событие | Описание | Пример файла |
|---------|----------|--------------|
| PlayerJoinEvent | Вход | welcome_message.js |
| PlayerQuitEvent | Выход | welcome_message.js |
| AsyncPlayerChatEvent | Чат | event_listener.js |
| PlayerDeathEvent | Смерть | - |
| EntityDamageByEntityEvent | Атака | custom_sword.js |
| PlayerItemHeldEvent | Смена предмета | custom_sword.js |
| BlockPlaceEvent | Установка блока | - |
| BlockBreakEvent | Разрушение блока | - |

---

## Следующие шаги

| Шаг | Описание |
|-----|----------|
| [Команды](commands.md) | Примеры команд |
| [Scheduler](scheduler.md) | Планирование задач |
| [Предметы](items.md) | Кастомные предметы |