add:bonus
This commit is contained in:
@ -29,6 +29,10 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import org.bukkit.inventory.PlayerInventory;
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import com.google.gson.Gson;
|
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 {
|
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 commandsUrl;
|
||||||
private String inventoryRequestsUrl;
|
private String inventoryRequestsUrl;
|
||||||
private String marketplaceUrl;
|
private String marketplaceUrl;
|
||||||
|
private String bonusesUrl;
|
||||||
private final Map<UUID, Long> playerLoginTimes = new HashMap<>();
|
private final Map<UUID, Long> playerLoginTimes = new HashMap<>();
|
||||||
private final Map<UUID, String> playerNames = new HashMap<>();
|
private final Map<UUID, String> playerNames = new HashMap<>();
|
||||||
private ScheduledExecutorService scheduler;
|
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";
|
marketplaceUrl = getConfig().getString("api-base", "http://localhost:8000") + "/api/marketplace";
|
||||||
scheduler.scheduleAtFixedRate(this::checkMarketplaceOperations, 3, 3, TimeUnit.SECONDS);
|
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("PopaPlugin has been enabled!");
|
||||||
getLogger().info("API URL: " + apiUrl);
|
getLogger().info("API URL: " + apiUrl);
|
||||||
getLogger().info("Commands URL: " + commandsUrl);
|
getLogger().info("Commands URL: " + commandsUrl);
|
||||||
@ -170,6 +178,9 @@ public final class popa extends JavaPlugin implements Listener {
|
|||||||
playerLoginTimes.remove(playerId);
|
playerLoginTimes.remove(playerId);
|
||||||
playerNames.remove(playerId);
|
playerNames.remove(playerId);
|
||||||
sendOnlinePlayersUpdate();
|
sendOnlinePlayersUpdate();
|
||||||
|
|
||||||
|
// Восстанавливаем базовые атрибуты
|
||||||
|
player.getAttribute(Attribute.MAX_HEALTH).setBaseValue(20.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendOnlinePlayersUpdate() {
|
private void sendOnlinePlayersUpdate() {
|
||||||
@ -882,4 +893,171 @@ public final class popa extends JavaPlugin implements Listener {
|
|||||||
|
|
||||||
return null;
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user