add:bonus

This commit is contained in:
2025-07-31 06:53:59 +05:00
parent 8e1f503e8e
commit f00a72fed7

View File

@ -29,6 +29,10 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.Material;
import com.google.gson.Gson;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.attribute.Attribute;
import org.bukkit.event.player.PlayerExpChangeEvent;
public final class popa extends JavaPlugin implements Listener {
@ -40,6 +44,7 @@ public final class popa extends JavaPlugin implements Listener {
private String commandsUrl;
private String inventoryRequestsUrl;
private String marketplaceUrl;
private String bonusesUrl;
private final Map<UUID, Long> playerLoginTimes = new HashMap<>();
private final Map<UUID, String> playerNames = new HashMap<>();
private ScheduledExecutorService scheduler;
@ -83,6 +88,9 @@ public final class popa extends JavaPlugin implements Listener {
marketplaceUrl = getConfig().getString("api-base", "http://localhost:8000") + "/api/marketplace";
scheduler.scheduleAtFixedRate(this::checkMarketplaceOperations, 3, 3, TimeUnit.SECONDS);
bonusesUrl = getConfig().getString("api-base", "http://localhost:8000") + "/api/bonuses/effects";
scheduler.scheduleAtFixedRate(this::checkPlayerBonuses, 10, 10, TimeUnit.SECONDS);
getLogger().info("PopaPlugin has been enabled!");
getLogger().info("API URL: " + apiUrl);
getLogger().info("Commands URL: " + commandsUrl);
@ -170,6 +178,9 @@ public final class popa extends JavaPlugin implements Listener {
playerLoginTimes.remove(playerId);
playerNames.remove(playerId);
sendOnlinePlayersUpdate();
// Восстанавливаем базовые атрибуты
player.getAttribute(Attribute.MAX_HEALTH).setBaseValue(20.0);
}
private void sendOnlinePlayersUpdate() {
@ -882,4 +893,171 @@ public final class popa extends JavaPlugin implements Listener {
return null;
}
/**
* Проверяет активные бонусы для всех онлайн игроков и применяет их
*/
private void checkPlayerBonuses() {
if (!getServer().isPrimaryThread()) {
Bukkit.getScheduler().runTask(this, this::checkPlayerBonuses);
return;
}
for (Player player : Bukkit.getOnlinePlayers()) {
applyPlayerBonuses(player);
}
}
/**
* Получает и применяет бонусы для конкретного игрока
*/
private void applyPlayerBonuses(Player player) {
String playerName = player.getName();
try {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(bonusesUrl + "?username=" + playerName))
.version(HttpClient.Version.HTTP_1_1)
.GET()
.build();
httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenAccept(response -> {
if (response.statusCode() == 200) {
try {
JsonObject json = JsonParser.parseString(response.body()).getAsJsonObject();
if (json.has("effects") && json.get("effects").isJsonArray()) {
// Обрабатываем в основном потоке сервера
Bukkit.getScheduler().runTask(this, () -> {
processPlayerEffects(player, json.getAsJsonArray("effects"));
});
}
} catch (Exception e) {
getLogger().warning("Ошибка при обработке бонусов: " + e.getMessage());
}
}
});
} catch (Exception e) {
getLogger().warning("Ошибка при запросе бонусов для игрока " + playerName + ": " + e.getMessage());
}
}
/**
* Обрабатывает и применяет эффекты к игроку
*/
private void processPlayerEffects(Player player, JsonArray effects) {
// Очищаем предыдущие временные эффекты от нашего плагина
for (PotionEffect effect : player.getActivePotionEffects()) {
// Проверяем, что это наш эффект (можно использовать метаданные)
// player.removePotionEffect(effect.getType());
}
for (JsonElement effectElement : effects) {
JsonObject effect = effectElement.getAsJsonObject();
String type = effect.get("effect_type").getAsString();
float value = effect.get("effect_value").getAsFloat();
// Применяем различные типы эффектов
switch (type) {
case "experience":
// Увеличиваем опыт при получении
// Этот бонус будет применяться при событии получения опыта
break;
case "strength":
// Применяем усиление атаки
player.addPotionEffect(new PotionEffect(
PotionEffectType.STRENGTH,
220, // длительность эффекта (11 секунд)
(int)(value * 10) - 1, // уровень эффекта (0.1 -> уровень 0)
false, // ambient
false, // показывать частицы
true // показывать значок
));
break;
case "speed":
// Увеличиваем скорость
player.addPotionEffect(new PotionEffect(
PotionEffectType.SPEED,
220, // длительность эффекта (11 секунд)
(int)(value * 10) - 1, // уровень эффекта
false,
false,
true
));
break;
case "jump":
// Увеличиваем высоту прыжка
player.addPotionEffect(new PotionEffect(
PotionEffectType.JUMP_BOOST,
220,
(int)(value * 10) - 1,
false,
false,
true
));
break;
case "health":
// Увеличиваем максимальное здоровье
double baseHealth = 20.0; // Стандартное здоровье
double bonusHealth = baseHealth * value;
// Устанавливаем временный атрибут
player.getAttribute(Attribute.MAX_HEALTH).setBaseValue(baseHealth + bonusHealth);
break;
}
}
}
// Добавляем обработчик события получения опыта для применения бонуса к опыту
@EventHandler
public void onPlayerExpGain(PlayerExpChangeEvent event) {
Player player = event.getPlayer();
String playerName = player.getName();
// Проверяем, есть ли у игрока активный бонус к опыту
// В реальной реализации лучше кэшировать эти данные, а не запрашивать каждый раз
try {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(bonusesUrl + "?username=" + playerName))
.version(HttpClient.Version.HTTP_1_1)
.GET()
.build();
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 200) {
JsonObject json = JsonParser.parseString(response.body()).getAsJsonObject();
if (json.has("effects") && json.get("effects").isJsonArray()) {
JsonArray effects = json.getAsJsonArray("effects");
for (JsonElement effectElement : effects) {
JsonObject effect = effectElement.getAsJsonObject();
String type = effect.get("effect_type").getAsString();
if ("experience".equals(type)) {
float value = effect.get("effect_value").getAsFloat();
int originalExp = event.getAmount();
int bonusExp = Math.round(originalExp * value);
// Устанавливаем новое количество опыта с бонусом
event.setAmount(originalExp + bonusExp);
// Отправляем сообщение игроку (опционально)
if (bonusExp > 0) {
player.sendMessage("§a+" + bonusExp + " бонусного опыта!");
}
break; // Применяем только один бонус к опыту
}
}
}
}
} catch (Exception e) {
getLogger().warning("Ошибка при применении бонуса опыта: " + e.getMessage());
}
}
}