896 lines
41 KiB
Plaintext
896 lines
41 KiB
Plaintext
# === 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 <text>:
|
||
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 <text> <player> <integer>:
|
||
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 <player> <text>:
|
||
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 <player> <text>:
|
||
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 [<player>]:
|
||
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 [<integer>] [<text>]:
|
||
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 <integer>:
|
||
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 <integer> <integer>:
|
||
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 <player>:
|
||
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 [<text>]: # <text>, чтобы передавать имя как строку
|
||
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━━━━━━━━━━━━━━━━━━━━━━━" |