From 1d3ec94130672cbce020af3c5a084f3844bb5e2e Mon Sep 17 00:00:00 2001 From: ZorahM Date: Thu, 1 May 2025 17:29:46 +0000 Subject: [PATCH] skypvp.sk 1.3.7 Added skypvp.sk 1.3.7 --- skypvp.sk | 896 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 896 insertions(+) create mode 100644 skypvp.sk diff --git a/skypvp.sk b/skypvp.sk new file mode 100644 index 0000000..2fdd20b --- /dev/null +++ b/skypvp.sk @@ -0,0 +1,896 @@ +# === SkyPvP Skript === +# Автор: Zorahm +# Описание: Управление инвентарем, сохранение купленных предметов и механика победы. +# Версия: 1.3.7 + +# === Плейсхолдеры === +placeholderapi placeholder with the prefix "skript": + if the identifier is "kills": + set the result to "%{kills::%player's uuid%}%" + else if the identifier is "killstreak": + set the result to "%{killstreak::%player's uuid%}%" + else if the identifier is "winner": + set the result to "%{skypvp_winner}%" + else if the identifier is "alive": + set the result to "%size of {alive_players::*}%" + else if the identifier is "elo_rank": + set {_elo} to {elo::%player's uuid%} + set the result to get_elo_rank({_elo}) + else if the identifier is "elo": + set {_elo} to {elo::%player%} + if {_elo} is not set: + set {_elo} to 100 + set {elo::%player%} to 100 + set the result to "%{_elo}%" + +# === Режим "Хаотичные эффекты" === +on script load: + set {effect_list::*} to "speed", "slowness", "haste", "mining_fatigue", "strength", "instant_health", "jump_boost", "nausea", "regeneration", "resistance", "fire_resistance", "water_breathing", "invisibility", "blindness", "night_vision", "hunger", "weakness", "poison", "health_boost", "absorption", "saturation", "glowing", "levitation", "luck", "unluck", "slow_falling", "conduit_power", "dolphins_grace", "bad_omen", "hero_of_the_village" + +command /random_effects : + permission: skypvp.admin + trigger: + if argument 1 is "on": + set {random_effects_active} to true + random_effect_loop() + else if argument 1 is "off": + delete {random_effects_active} + message "&c❌ Хаотичные эффекты отключены." + +function random_effect_loop(): + if {random_effects_active} is not set: + stop + + set {_players::*} to all players + if size of {_players::*} > 0: + set {_randomPlayer} to random element out of {_players::*} + set {_randomEffect} to random element out of {effect_list::*} + + # Генерация случайных параметров эффекта + set {_level} to random integer between 0 and 2 # Уровень в команде начинается с 0 + set {_duration} to random integer between 1 and 15 + set {_effectName} to get_effect_name({_randomEffect}) + + # Выдаем эффект игроку + execute console command "effect give %{_randomPlayer}% %{_randomEffect}% %{_duration}% %{_level}%" + message "&d✨ %{_randomPlayer}% получил эффект &b%{_effectName}% &7(%{_duration}% сек, уровень %{_level} + 1%)!" to all players # Исправлено! + + # Ждем завершения эффекта + wait {_duration} * 20 ticks + random_effect_loop() + +# === Список эффектов с переводами === +function get_effect_name(effect: text) :: text: + set {_effects::speed} to "Скорость" + set {_effects::slowness} to "Медлительность" + set {_effects::haste} to "Ускорение копания" + set {_effects::mining_fatigue} to "Усталость" + set {_effects::strength} to "Сила" + set {_effects::instant_health} to "Мгновенное лечение" + set {_effects::instant_damage} to "Мгновенный урон" + set {_effects::jump_boost} to "Высокий прыжок" + set {_effects::nausea} to "Тошнота" + set {_effects::regeneration} to "Регенерация" + set {_effects::resistance} to "Сопротивление" + set {_effects::fire_resistance} to "Огнестойкость" + set {_effects::water_breathing} to "Подводное дыхание" + set {_effects::invisibility} to "Невидимость" + set {_effects::blindness} to "Слепота" + set {_effects::night_vision} to "Ночное зрение" + set {_effects::hunger} to "Голод" + set {_effects::weakness} to "Слабость" + set {_effects::poison} to "Отравление" + set {_effects::wither} to "Иссушение" + set {_effects::health_boost} to "Доп. здоровье" + set {_effects::absorption} to "Поглощение" + set {_effects::saturation} to "Насыщение" + set {_effects::glowing} to "Свечение" + set {_effects::levitation} to "Левитация" + set {_effects::luck} to "Удача" + set {_effects::unluck} to "Неудача" + set {_effects::slow_falling} to "Медленное падение" + set {_effects::conduit_power} to "Сила проводника" + set {_effects::dolphins_grace} to "Благодать дельфина" + set {_effects::bad_omen} to "Дурное знамение" + set {_effects::hero_of_the_village} to "Герой деревни" + + return {_effects::%{_effect}%} if {_effects::%{_effect}%} is set else {_effect} + +# === Очистка инвентаря при входе === +on join: + wait 1 tick + clear player's inventory + set player's health to 20 + set player's food level to 20 + execute console command "tp %player% 269.5 118.0 135.5" + execute console command "gamemode adventure %player%" + +#======================= +# 🛠️ КОМАНДЫ +#======================= + +# ======================= +# 🎮 Управление рейтингом Elo +# ======================= + +command /elo : + permission: skypvp.admin + trigger: + set {_action} to argument 1 + set {_player} to argument 2 + set {_amount} to argument 3 + + if {_action} != "give": + if {_action} != "take": + message "&c❌ Используйте: /elo give <игрок> <количество> или /elo take <игрок> <количество>" to sender + stop + + if {_amount} <= 0: + message "&c❌ Количество должно быть больше 0!" to sender + stop + + if {_action} = "give": + add {_amount} to {elo::%{_player}%} + message "&a✅ Вы выдали &e%{_amount}% &aElo игроку &b%{_player}%!" to sender + message "&6🏆 Вам добавлено &e%{_amount}% &6Elo! Новый рейтинг: &b%{elo::%{_player}%}%" to {_player} + + else if {_action} = "take": + remove {_amount} from {elo::%{_player}%} + if {elo::%{_player}%} < 0: + set {elo::%{_player}%} to 0 + message "&a✅ Вы сняли &e%{_amount}% &aElo у игрока &b%{_player}%!" to sender + message "&c⚠ У вас отняли &e%{_amount}% &cElo! Новый рейтинг: &b%{elo::%{_player}%}%" to {_player} + + +# ▸ Магазин ▸ +command /shopitems_add : + trigger: + if argument 1 is not set: + message "&cОшибка: Не указан игрок!" to sender + stop + if argument 2 is not set: + message "&cОшибка: Не указан предмет!" to sender + stop + + set {_item} to argument 2 + add {_item} to {shopitems::%argument 1%::*} + + message "&aДобавлено в список купленных: %{_item}%!" to argument 1 + +command /addshop : + permission: skypvp.shop + trigger: + set {_item} to argument 2 + add {_item} to {shopitems::%argument 1%::*} + execute console command "give %argument 1% %{_item}%" + message "&aВы купили: %{_item}%!" to argument 1 + +# ▸ Управление игрой ▸ +command /startgame: + permission: skypvp.start + trigger: + # Проверка: достаточно ли игроков? + if size of all players < 2: + message "&c❌ Ошибка: недостаточно игроков для начала игры!" to sender + stop + + # Проверка: идет ли уже игра? + if {skypvp_winner} is not set: + message "&c❌ Игра уже запущена!" to sender + stop + + # Очистка старых данных + clear {alive_players::*} + set {skypvp_winner} to "Нет" + + # === Настройка Redstone для механик === + execute console command "setblock 23 -55 52 minecraft:stone_pressure_plate" + execute console command "setblock 251 129 148 minecraft:redstone_wire" # Включение темноты + execute console command "setblock 23 -57 52 minecraft:redstone_wire" + execute console command "setblock 8 -56 83 minecraft:redstone_block" + execute console command "kill @e[type=minecraft:interaction]" + execute console command "setblock -13 -55 -13 minecraft:stone_pressure_plate" + + # === Объявление начала игры === + broadcast "&8━━━━━━━━━━━━━━━━━━━━━━━" + broadcast "&a🏆 &lНАЧАЛО ИГРЫ!" + broadcast "&7Игроки телепортированы на арену." + broadcast "&8━━━━━━━━━━━━━━━━━━━━━━━" + + loop all players: + execute console command "tp %loop-player% 10 -54 13" + + add loop-player to {alive_players::*} + set {round_kills::%loop-player%} to 0 + set {round_elo::%loop-player%} to 0 + + clear loop-player's inventory + set loop-player's health to 20 + set loop-player's food level to 20 + + apply damage resistance 5 to loop-player for 5 seconds + execute console command "effect give @a minecraft:invisibility 5 0 true" + + # === Активация PVP === + wait 5 seconds + execute console command "setblock 7 -57 82 minecraft:repeater[facing=east]" + set {pvp_enabled} to true + broadcast " " + broadcast "&c🔥 &lPVP ВКЛЮЧЕНО!" + broadcast " " + +# ============================== +# 💀 ДРОП С УБИЙСТВ +# ============================== + +on death of player: + set {_killer} to attacker + if {_killer} is set: + + # 🍏 50% шанс - Золотое яблоко + if chance of 50%: + drop 1 golden apple at victim's location + message "&e🍏 Вам выпало &6Золотое яблоко!" to {_killer} + + # ⚡ 30% шанс - Жемчуг эндера + if chance of 30%: + drop 1 ender pearl at victim's location + message "&b⚡ Вам выпал &3Жемчуг эндера!" to {_killer} + + # 🏹 3% шанс - Улучшенный лук (Power II, Infinity) + if chance of 3%: + set {_bow} to a bow + enchant {_bow} with power 2 + enchant {_bow} with infinity 1 + give {_killer} {_bow} + message "&9🏹 Вам выпал &bУлучшенный лук (Power II, Infinity)!" to {_killer} + + + # 🍏 5% шанс - Зачарованное золотое яблоко + if chance of 5%: + drop 1 enchanted golden apple at victim's location + message "&6✨ Вам выпало &eЗачарованное золотое яблоко!" to {_killer} + +# === Управление PVP === +on script load: + set {pvp_enabled} to false # PVP отключено по умолчанию + +on damage: + if attacker is a player: + if victim is a player: + if {pvp_enabled} is false: + cancel event + send "&c⛔ PVP отключен! Дождитесь начала игры." to attacker + stop + +# ▸ Статистика ▸ +command /stats []: + trigger: + set {_target} to argument 1 + if {_target} is not set: + set {_target} to player + + # Устанавливаем значения по умолчанию + if {elo::%{_target}%} is not set: + set {elo::%{_target}%} to 100 + if {prestige::%{_target}%} is not set: + set {prestige::%{_target}%} to 0 + if {wins::%{_target}%} is not set: + set {wins::%{_target}%} to 0 + if {losses::%{_target}%} is not set: + set {losses::%{_target}%} to 0 + if {kills::%{_target}%} is not set: + set {kills::%{_target}%} to 0 + if {deaths::%{_target}%} is not set: + set {deaths::%{_target}%} to 0 + + # Определяем K/D + set {_kills} to {kills::%{_target}%} + set {_deaths} to {deaths::%{_target}%} + if {_deaths} is 0: + set {_kd} to {_kills} # Если смертей нет, K/D = количеству убийств + else: + set {_kd} to {_kills} / {_deaths} + + # Проверяем, является ли {_kd} числом + if {_kd} is a number: + set {_kd} to round({_kd}, 2) + else: + set {_kd} to 0 + + # Определяем PvP-рейтинг + set {_elo} to {elo::%{_target}%} + set {_rank} to get_elo_rank({_elo}) + + # Получаем баланс через PlaceholderAPI + set {_balance} to placeholder "vault_eco_balance_fixed_%{_target}%" + + # Выводим статистику + send "&8━━━━━━━━━━━━━━━━━━━━━━━" + send "&6📊 Статистика игрока: &e%{_target}%" + send "&8━━━━━━━━━━━━━━━━━━━━━━━" + send "&f▸ Престиж: &e%{prestige::%{_target}%}%" + send "&f▸ Победы: &a%{wins::%{_target}%}%" + send "&f▸ Поражения: &c%{losses::%{_target}%}%" + send "&f▸ Убийства: &e%{_kills}%" + send "&f▸ Смерти: &c%{_deaths}%" + send "&f▸ K/D: &6%{_kd}%" + send "&f▸ Баланс: &6%{_target}'s balance%" + send "&f▸ PvP-рейтинг: &b%{_elo}% &7(%{_rank}%)" + send "&8━━━━━━━━━━━━━━━━━━━━━━━" + +# ▸ Ставки ▸ +on script load: + set {bet_min} to 10 # Минимальная ставка + clear {bet::*} # Очистка прошлых ставок + clear {bet_pool} # Очистка общего пула ставок + +command /bet [] []: + trigger: + if argument 1 is not set: + send "&c❌ Использование: /bet <сумма> [игрок]" to player + send "&7📌 Например: &e/bet 100 &fили &e/bet 100 Steve" to player + stop + + set {_amount} to argument 1 + set {_targetName} to argument 2 # Сохраняем имя как текст + + if {_amount} is not a number: + send "&c❌ Неверный формат! Введите число, например: &e/bet 100" to player + stop + + if {_amount} < {bet_min}: + send "&c❌ Минимальная ставка: %{bet_min}% монет!" to player + stop + + if {_amount} > player's balance: + send "&c❌ У вас недостаточно монет для ставки!" to player + stop + + if {bet::%player's uuid%} is set: + send "&c❌ Вы уже сделали ставку! Дождитесь конца игры." to player + stop + + # Если игрок не указан, ставим на себя + if {_targetName} is not set: + set {_target} to player + else: + set {_target} to "%{_targetName}%" parsed as player # Парсим имя в объект игрока + + # Проверяем, существует ли игрок + if {_target} is not a player: + send "&c❌ Игрок &e%{_targetName}% &cне найден!" to player + stop + + # Проверяем, участвует ли целевой игрок в игре + set {_found} to false + loop {alive_players::*}: + if loop-value is {_target}: + set {_found} to true + stop loop + + if {_found} is false: + send "&c❌ Нельзя ставить на игрока, который не участвует в игре!" to player + stop + + # Запись ставки + remove {_amount} from player's balance + set {bet::%player's uuid%} to {_amount} + set {bet_target::%player's uuid%} to {_target} + add {_amount} to {bet_pool} + + send "&a✅ Вы поставили &e%{_amount}% монет &aна победу игрока &b%name of {_target}%!" to player + +# 📌 Обработка ставок по завершении игры +function process_bets(winner: player): + loop {bet::*}: + set {_uuid} to loop-index + set {_betAmount} to loop-value + set {_betTarget} to {bet_target::%{_uuid}%} + + # Поиск игрока, сделавшего ставку + loop all players: + if uuid of loop-player is {_uuid}: + set {_player} to loop-player + stop loop + + # Если игрок не найден, удаляем ставку + if {_player} is not set: + delete {bet::%{_uuid}%} + delete {bet_target::%{_uuid}%} + continue loop + + # Проверяем, выиграл ли тот, на кого ставил игрок + if {_betTarget} is {_winner}: + set {_winAmount} to {_betAmount} * 2 + add {_winAmount} to {_player}'s balance + send "&a🎉 Ваша ставка на &b%name of {_betTarget}% &aсыграла! Вы выиграли &e%{_winAmount}% монет!" to {_player} + else: + send "&c☠ Ваша ставка на &b%name of {_betTarget}% &cпроиграна. Удачи в следующем раунде!" to {_player} + + # Удаляем ставки после обработки + delete {bet::%{_uuid}%} + delete {bet_target::%{_uuid}%} + +#======================= +# 🎮 ИГРОВЫЕ СОБЫТИЯ +#======================= + +# ▸ Обработка смерти ▸ +on death of player: + set {_player} to victim + set {_killer} to attacker + + # Переводим убитого игрока в режим наблюдателя + execute console command "gamemode spectator %{_player}%" + wait 1 second + execute console command "tp %{_player}% 10 -50 13" + remove {_player} from {alive_players::*} + + # Сброс killstreak при смерти + set {killstreak::%{_player}%} to 0 + + # Если есть убийца, начисляем награды + if {_killer} is set: + # Рассчитываем множитель престижа + set {_multiplier} to get_prestige_multiplier(name of {_killer}) + + # Рассчитываем награды с учетом престижа + set {_rewardMoney} to round(25 * {_multiplier}) + set {_rewardElo} to round(10 * {_multiplier}) + set {_eloPenalty} to 5 # Убитому фиксированное снижение Elo + + add 1 to {kills::%{_killer}%} # Общие убийства + add 1 to {round_kills::%{_killer}%} # Убийства за раунд + add {_rewardElo} to {elo::%{_killer}%} # Elo за раунд + + execute console command "eco add %{_killer}% %{_rewardMoney}%" # Начисление монет + + message " " to {_killer} + message "&a⚔ Вы убили &e%{_player}%! (&e%{round_kills::%{_killer}%}%)" to {_killer} + message "&f💰 Награда: &a+%{_rewardMoney}% монет | Elo: &a+%{_rewardElo}%" to {_killer} + message " " to {_killer} + + # Если убитый игрок есть + if {_player} is set: + message "&c☠ Вы были убиты!" to {_player} + + # Проверяем, остался ли один игрок + set {_alive} to size of {alive_players::*} + if {_alive} = 1: + loop {alive_players::*}: + set {_winner} to loop-value + process_bets({_winner}) + + execute console command "border_set 1000" + + set {skypvp_winner} to {_winner} # Сохраняем объект игрока + add 1 to {wins::%{_winner}%} + + # Рассчитываем награды победителя с учетом престижа + set {_winMoney} to round(100 * get_prestige_multiplier(name of {_winner})) + + execute console command "eco add %{_winner}% %{_winMoney}%" + execute console command "elo give %{_winner}% 15" + + execute console command "clone 56 240 -46 -50 259 90 -50 -64 -46" # Клон + + # 🏆 Объявляем победителя красиво! + broadcast "&8━━━━━━━━━━━━━━━━━━━━━━━" + broadcast "&6🏆 ПОБЕДИТЕЛЬ &8➜ &a%name of {_winner}%!" + broadcast "&7Статистика за раунд:" + broadcast "&f⚔ Убийства: &e%{round_kills::%{_winner}%}% &7(Всего: %{kills::%{_winner}%}%)" + broadcast "&b🔷 Elo: &a+15 &7(Текущий: %{elo::%{_winner}%}%)" + broadcast "&f💰 Награда за победу: &a+%{_winMoney}% монет" + broadcast "&8━━━━━━━━━━━━━━━━━━━━━━━" + + # Телепортируем всех в лобби + loop all players: + execute console command "gamemode adventure %loop-player%" + execute console command "effect clear %loop-player%" + clear loop-player's inventory + set loop-player's health to 20 + set loop-player's food level to 20 + + execute console command "tp @a 269.5 118.0 135.5" + execute console command "random_effects off" + set {pvp_enabled} to false + wait 2 seconds + execute console command "setblock 249 133 142 minecraft:redstone_block" + +# ▸ Подсчет убийств, Killstreak и выдача наград ▸ +on death of player: + set {_killer} to attacker + if {_killer} is set: + set {_multiplier} to get_prestige_multiplier({_killer}) + + # Увеличиваем серию убийств + add 1 to {killstreak::%{_killer}%} + +function get_elo_rank(elo: integer) :: text: + if {_elo} >= 2500: + return "&6👑 Легенда" + if {_elo} >= 2200: + return "&c🔥 Грандмастер" + if {_elo} >= 1900: + return "&4💀 Мастер" + if {_elo} >= 1600: + return "&e⚔ Ветеран" + if {_elo} >= 1300: + return "&b🥇 Эксперт" + if {_elo} >= 1100: + return "&3🥈 Опытный" + if {_elo} >= 900: + return "&a🎖️ Боец" + if {_elo} >= 700: + return "&2🏹 Ученик" + if {_elo} >= 500: + return "&7🥉 Новичок" + return "&d🐍 Бездушный" + +#======================= +# 📜 ПОМОЩЬ +#======================= + +# Команда для игроков +command /help: + trigger: + send "&8━━━━━━━━━━━━━━━━━━━━━━━" + send "&6📖 SkyPvP | Помощь" + send "&7Здесь вы найдете основные команды и механику игры!" + send "&8━━━━━━━━━━━━━━━━━━━━━━━" + send "&a⚔ Основные команды:" + send "&7- &e/stats &8- &fВаша статистика (убийства, ELO, баланс)" + send "&7- &e/bet <сумма> [игрок] &8- &fСтавка на свою или чужую победу" + send "&7- &e/ranks &8- &fПосмотреть информацию по рангам" + send "&7- &e/msg <ник> <сообщение> &8- &fЛичное сообщение игроку" + send "&7- &e/report <ник> <причина> &8- &fПожаловаться на игрока" + send "&8━━━━━━━━━━━━━━━━━━━━━━━" + send "&a🛡 Механики игры:" + send "&7- &fЗа убийства вы получаете &6ELO &7и &eмонеты" + send "&7- &fСтавки удваиваются, если выбранный вами игрок победил" + send "&7- &fМожно ставить не только на себя, но и на других игроков!" + send "&7- &fПоследний выживший &aпобеждает &7и получает бонусы!" + send "&8━━━━━━━━━━━━━━━━━━━━━━━" + send "&b💡 Советы:" + send "&7- Проверяйте свой баланс командой &e/balance или в скорборде справа" + send "&7- Остерегайтесь ловушек и хитрых игроков!" + send "&8━━━━━━━━━━━━━━━━━━━━━━━" + +# Команда для администраторов +command /help-admin: + permission: skypvp.admin + trigger: + message "&8━━━━━━━━━━━━━━━━━━━━━━━" + message "&c⚙ SkyPvP | Админ-команды" + message "&7Команды для управления игрой, экономикой и игроками." + message "&8━━━━━━━━━━━━━━━━━━━━━━━" + + message "&c🎮 Управление игрой:" + message "&7- &e/startgame &8- &fЗапустить новую игру" + message "&7- &e/random_effects on/off &8- &fВключить/выключить хаотичные эффекты" + + message "&8━━━━━━━━━━━━━━━━━━━━━━━" + message "&c🌍 Управление границей:" + message "&7- &e/border_set <размер> &8- &fУстановить размер границы (в блоках)" + message "&7- &e/border_shrink <размер> <время> &8- &fСжать границу до указанного размера за указанное время (в секундах)" + message "&7- &e/border_stop &8- &fОстановить сужение границы" + message "&7- &e/border_reset &8- &fСбросить границу до стандартного размера (10000 блоков)" + + message "&8━━━━━━━━━━━━━━━━━━━━━━━" + message "&c📊 Управление статистикой:" + message "&7- &e/reset_all <игрок> &8- &fПолный сброс статистики игрока" + message "&7- &e/elo give/take <игрок> <сумма> &8- &fИзменить Elo игрока" + + message "&8━━━━━━━━━━━━━━━━━━━━━━━" + message "&c💰 Управление экономикой:" + message "&7- &e/eco give/take/set <игрок> <сумма> &8- &fВыдать, забрать или установить баланс" + message "&7- &e/shopitems_add <игрок> <предмет> &8- &fДобавить предмет игроку в магазин" + + message "&8━━━━━━━━━━━━━━━━━━━━━━━" + message "&c📌 Дополнительно:" + message "&7- &e/sk reload skypvp.sk &8- &fПерезагрузить скрипт SkyPvP" + message "&7- &e/checkplayer <игрок> &8- &fПроверить информацию об игроке" + + message "&8━━━━━━━━━━━━━━━━━━━━━━━" + message "&7⚠ &cБудьте осторожны при использовании админ-команд!" + message "&8━━━━━━━━━━━━━━━━━━━━━━━" + +#======================= +# 🌍 УПРАВЛЕНИЕ ГРАНИЦЕЙ +#======================= + +# Установка стандартных параметров границы +on script load: + if {border_radius} is not set: + set {border_radius} to 10000 + if {border_center} is not set: + set {border_center} to location(0, 64, 0) # Центр карты + +# Сброс границы (возвращение к стандартному размеру) +command /border_reset: + permission: skypvp.admin + trigger: + if {border_active} is not set: + message "&c🔴 Граница уже отключена!" to sender + stop + + delete {border_active} + set {border_radius} to 10000 + execute console command "worldborder set 10000" + message "&a✅ Граница сброшена! Установлен стандартный размер (10000 блоков)." to all players + +# Принудительная остановка сужения зоны +command /border_stop: + permission: skypvp.admin + trigger: + if {border_active} is not set: + message "&c⚠ Сужение зоны уже отключено!" to sender + stop + + delete {border_active} + execute console command "worldborder set %{border_radius}%" + message "&c⛔ Сужение зоны остановлено!" to all players + +# Установка границы вручную +command /border_set : + permission: skypvp.admin + trigger: + set {_new_radius} to argument 1 + + if {_new_radius} < 10: + message "&c⚠ Минимальный размер границы - 10 блоков!" to sender + stop + + set {border_radius} to {_new_radius} + execute console command "worldborder set %{border_radius}%" + message "&a🌍 Граница установлена на &e%{border_radius}% &aблоков!" to all players + +# Запуск автоматического сужения границы +command /border_shrink : + permission: skypvp.admin + trigger: + set {_new_radius} to argument 1 + set {_time} to argument 2 + + if {_new_radius} < 10: + message "&c⚠ Минимальный размер границы - 10 блоков!" to sender + stop + + if {_time} < 1: + message "&c⚠ Время сужения должно быть больше 1 секунды!" to sender + stop + + set {border_active} to true + message "&e⚠ Внимание! Граница начнёт сужаться до &c%{_new_radius}% &eблоков за &b%{_time}% секунд!" to all players + execute console command "worldborder set %{_new_radius}% %{_time}%" + wait {_time} * 20 ticks + delete {border_active} + message "&c⚠ Граница достигла нового размера!" to all players + +# Центр границы (по умолчанию 0,64,0) +on script load: + set {border_center} to location(9, -54, 12) # Замените на ваш центр + set {border_radius} to 10000 + +command /json_test: + trigger: + json("%player%", "&6✨ Нажми сюда! ||cmd:/ping ||ttp:&eПроверка JSON!") + +# 📌 Полный сброс статистики игрока +command /reset_all : + permission: skypvp.admin + trigger: + set {_target} to argument 1 + + # Проверяем, указан ли игрок + if {_target} is not set: + message "&c❌ Ошибка: укажите игрока!" to sender + stop + + # Сбрасываем всю статистику + set {kills::%{_target}%} to 0 + set {killstreak::%{_target}%} to 0 + set {elo::%{_target}%} to 100 + set {wins::%{_target}%} to 0 + set {losses::%{_target}%} to 0 + set {prestige::%{_target}%} to 0 + + # Сбрасываем достижения + delete {achievements::%{_target}%::*} + + # Обнуляем деньги через Vault + execute console command "eco set %{_target}% 0" + + # Сообщение об успешном сбросе + message "&a✔ Вся статистика и достижения игрока &e%{_target}% &aбыли сброшены!" to sender + message "&7⚠ Ваши данные и достижения были обнулены администратором!" to {_target} + +command /ranks: + trigger: + set {_elo} to {elo::%player%} + set {_rank} to get_elo_rank({_elo}) # Получаем текущий ранг игрока + + send "&8━━━━━━━━━━━━━━━━━━━━━━━" + send "&6🎖️ РАНГИ ИГРОКОВ:" + send "&6👑 Легенда &8➟ &7От 2500 Elo" + send "&c🔥 Грандмастер &8➟ &7От 2200 Elo" + send "&4💀 Мастер &8➟ &7От 1900 Elo" + send "&e⚔ Ветеран &8➟ &7От 1600 Elo" + send "&b🥇 Эксперт &8➟ &7От 1300 Elo" + send "&3🥈 Опытный &8➟ &7От 1100 Elo" + send "&a🎖️ Боец &8➟ &7От 900 Elo" + send "&2🏹 Ученик &8➟ &7От 700 Elo" + send "&7🥉 Новичок &8➟ &7От 500 Elo" + send "&d🐍 Бездушный &8➟ &7Менее 500 Elo" + send "&8━━━━━━━━━━━━━━━━━━━━━━━" + send "&fВаш текущий ранг: %{_rank}% &8(%{_elo}% Elo)" + +# ============================== +# 🏆 ДОСТИЖЕНИЯ +# ============================== + +import: + java.util.ArrayList + +# ✅ Завершение достижения +function complete_achievement(p: player, achievement: text): + if {achievements::%{_p}%::*} contains {_achievement}: + stop + add {_achievement} to {achievements::%{_p}%::*} + message "&a🎉 Вы завершили достижение: &e%{_achievement}%!" to {_p} + + # Выдача наград + set {_rewardMoney} to 150 + set {_rewardElo} to 10 + execute console command "eco add %{_p}% %{_rewardMoney}%" + add {_rewardElo} to {elo::%{_p}%} + + message "&6💰 +%{_rewardMoney}% монет | ⚡ +%{_rewardElo}% Elo" to {_p} + +# 🕵️‍♂️ Проверка и присвоение достижений +on death of player: + set {_killer} to attacker + if {_killer} is set: + # Первое убийство + if {kills::%{_killer}%} = 1: + complete_achievement({_killer}, "Первое убийство") + + # Серия из 5 убийств + if {killstreak::%{_killer}%} = 5: + complete_achievement({_killer}, "Серия из 5 убийств") + + # Killstreak x10 + if {killstreak::%{_killer}%} = 10: + complete_achievement({_killer}, "Серия из 10 убийств") + + # Проверка "Смертельный выстрел" (убийство стрелой) + if victim's last damage cause is projectile: + complete_achievement({_killer}, "Смертельный выстрел") + +on damage: + set {_attacker} to attacker + if {_attacker} is a player: + if {_attacker}'s health <= 2: # 4 HP = 2 сердца + wait 30 seconds + if {_attacker}'s health > 0: + complete_achievement({_attacker}, "Выживание с половиной сердца 30 сек.") + +# 📜 Команда для просмотра достижений +command /achievements []: # , чтобы передавать имя как строку + trigger: + if arg-1 is set: + set {_p} to arg-1 parsed as offlineplayer + if {_p} is not set: + send "&c⚠ Ошибка: Игрок &e%arg-1% &cне найден. &7Проверьте имя и попробуйте снова!" to sender + stop + else: + set {_p} to player + + set {_allAchievements::*} to define_achievements() + set {_completedAchievements::*} to {achievements::%{_p}%::*} + + set {_completed} to size of {_completedAchievements::*} + set {_total} to size of {_allAchievements::*} + set {_progress} to round({_completed} / {_total} * 100, 1) + + send "&8━━━━━━━━━━━━━━━━━━━━━━━" + send "&6🏆 Достижения игрока: &e%{_p}%" + send "&8━━━━━━━━━━━━━━━━━━━━━━━" + + loop {_allAchievements::*}: + set {_achievement} to loop-value + if {_completedAchievements::*} contains {_achievement}: + send "&a✔ &7%{_achievement}%" to sender + else: + send "&c✘ &7%{_achievement}%" to sender + + send "&8━━━━━━━━━━━━━━━━━━━━━━━" + +# Определение всех достижений +function define_achievements() :: texts: + return "Первое убийство", "Серия из 5 убийств", "Серия из 10 убийств", "Смертельный выстрел", "Выживание с половиной сердца 30 сек." + +# ============================== +# 🎖️ ПРЕСТИЖ-СИСТЕМА v3.0 +# ============================== + +# ▸ Функция получения множителя престижа ▸ +function get_prestige_multiplier(p: text) :: number: + set {_prestige} to {prestige::%{_p}%} if {prestige::%{_p}%} is set else 0 + set {_multiplier} to 1 + (0.1 * {_prestige}) + if {_multiplier} > 2: + set {_multiplier} to 2 # Ограничение на максимум x2 + return {_multiplier} + +function get_prestige_format(p: text) :: text: + set {_prestige} to {prestige::%{_p}%} if {prestige::%{_p}%} is set else 0 + set {_format} to "&e" + loop {_prestige} times: + set {_format} to "%{_format}%★" + return {_format} + +# ▸ Команда для перехода на престиж ▸ +command /prestige: + trigger: + if {prestige::%player%} is not set: + set {prestige::%player%} to 0 + + if {elo::%player%} < 2500: + message "&c❌ У вас недостаточно ELO для перехода на престиж! Минимум: &e2500 ELO." + stop + + if {prestige::%player%} >= 10: + message "&c❌ Вы уже находитесь на максимальном престиже (10)!" + stop + + if {prestige_confirm::%player%} is set: + message "&c⏳ Вы уже запрашивали переход! Подтвердите командой &e/prestige_confirm" + stop + + set {prestige_confirm::%player%} to true + set {_next_prestige} to {prestige::%player%} + 1 + set {_bonus} to {_next_prestige} * 10 + + message "&6⚡ Вы уверены, что хотите перейти на новый престиж? Это действие:" + message "&7 - &cСбросит ваши деньги, убийства и текущие достижения." + message "&7 - &aУвеличит ваш престиж &7(&e%{prestige::%player%}% ➝ %{_next_prestige}%&7 ★)." + message "&7 - &bДаст бонус к монетам: &e+%{_bonus}%." + message "&eЧтобы подтвердить, напишите: &a/prestige_confirm" + wait 30 seconds + delete {prestige_confirm::%player%} + message "&c❌ Время на подтверждение истекло!" to player + +# ▸ Подтверждение перехода ▸ +command /prestige_confirm: + trigger: + if {prestige_confirm::%player%} is not set: + message "&c❌ У вас нет активного запроса на переход на престиж!" + stop + + add 1 to {prestige::%player%} + set {elo::%player%} to 100 + set {kills::%player%} to 0 + set {losses::%player%} to 0 + set {killstreak::%player%} to 0 + clear {achievements::%player%::*} + execute console command "eco set %player% 0" + + set {_format} to get_prestige_format("%player%") + set {_bonus} to {prestige::%player%} * 10 + + broadcast "&6⚡ &e%player% &aперешёл на престиж &e%{prestige::%player%}% &7%{_format}%!" + message "&a🎉 Поздравляем! Ваш престиж теперь: &e%{prestige::%player%}% &7%{_format}%." + message "&7Теперь вы получаете &e+%{_bonus}% &7больше монет!" + delete {prestige_confirm::%player%} + +# ▸ Информация о престижах ▸ +command /prestige_info: + trigger: + set {_format} to get_prestige_format("%player%") + set {_multiplier} to get_prestige_multiplier("%player%") + + message "&8━━━━━━━━━━━━━━━━━━━━━━━" + message "&6🎖️ Ваш текущий престиж: &e%{prestige::%player%}% &7%{_format}%" + message "&7Бонус к монетам: &e+%{_multiplier}%" + message "&8━━━━━━━━━━━━━━━━━━━━━━━" \ No newline at end of file