cancle sale

This commit is contained in:
2025-07-21 22:48:36 +05:00
parent 0507d36933
commit 8e1f503e8e
9 changed files with 66 additions and 16 deletions

View File

@ -5,6 +5,7 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import java.io.IOException; import java.io.IOException;
@ -43,6 +44,7 @@ public final class popa extends JavaPlugin implements Listener {
private final Map<UUID, String> playerNames = new HashMap<>(); private final Map<UUID, String> playerNames = new HashMap<>();
private ScheduledExecutorService scheduler; private ScheduledExecutorService scheduler;
private Gson gson; private Gson gson;
private final Map<UUID, Long> lastActivityTimes = new HashMap<>();
@Override @Override
public void onEnable() { public void onEnable() {
@ -116,11 +118,22 @@ public final class popa extends JavaPlugin implements Listener {
} }
} }
@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
// Игнорируем микродвижения (изменение направления взгляда)
if (event.getFrom().getX() != event.getTo().getX() ||
event.getFrom().getY() != event.getTo().getY() ||
event.getFrom().getZ() != event.getTo().getZ()) {
lastActivityTimes.put(event.getPlayer().getUniqueId(), System.currentTimeMillis());
}
}
@EventHandler @EventHandler
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
UUID playerId = player.getUniqueId(); UUID playerId = player.getUniqueId();
String playerName = player.getName(); String playerName = player.getName();
lastActivityTimes.put(playerId, System.currentTimeMillis());
playerLoginTimes.put(playerId, System.currentTimeMillis()); playerLoginTimes.put(playerId, System.currentTimeMillis());
playerNames.put(playerId, playerName); playerNames.put(playerId, playerName);
@ -162,11 +175,27 @@ public final class popa extends JavaPlugin implements Listener {
private void sendOnlinePlayersUpdate() { private void sendOnlinePlayersUpdate() {
StringBuilder playersJson = new StringBuilder("["); StringBuilder playersJson = new StringBuilder("[");
boolean first = true; boolean first = true;
long currentTime = System.currentTimeMillis();
for (Map.Entry<UUID, Long> entry : playerLoginTimes.entrySet()) { for (Map.Entry<UUID, Long> entry : playerLoginTimes.entrySet()) {
UUID playerId = entry.getKey(); UUID playerId = entry.getKey();
String playerName = playerNames.get(playerId); String playerName = playerNames.get(playerId);
long onlineTime = (System.currentTimeMillis() - entry.getValue()) / 1000; Long lastActivity = lastActivityTimes.get(playerId);
// Если время последней активности не записано, пропускаем игрока
if (lastActivity == null) {
continue;
}
// Вычисляем, сколько секунд игрок неактивен
long inactiveSeconds = (currentTime - lastActivity) / 1000;
// Если игрок неактивен больше минуты (60 секунд), пропускаем его
if (inactiveSeconds > 60) {
continue;
}
long onlineTime = (currentTime - entry.getValue()) / 1000;
if (!first) playersJson.append(","); if (!first) playersJson.append(",");
first = false; first = false;
@ -501,6 +530,8 @@ public final class popa extends JavaPlugin implements Listener {
handleSellOperation(operation); handleSellOperation(operation);
} else if ("buy".equals(type)) { } else if ("buy".equals(type)) {
handleBuyOperation(operation); handleBuyOperation(operation);
} else if ("cancel_sale".equals(type)) {
handleCancelSaleOperation(operation);
} }
// Подтверждаем выполнение операции // Подтверждаем выполнение операции
@ -611,6 +642,40 @@ public final class popa extends JavaPlugin implements Listener {
player.sendMessage("§aВы купили предмет за " + price + " монет"); player.sendMessage("§aВы купили предмет за " + price + " монет");
} }
/**
* Обрабатывает операцию отмены продажи предмета
*/
private void handleCancelSaleOperation(JsonObject operation) {
String playerName = operation.get("player_name").getAsString();
JsonObject itemData = operation.getAsJsonObject("item_data");
Player player = Bukkit.getPlayer(playerName);
if (player == null || !player.isOnline()) {
sendOperationError(operation.get("id").getAsString(), "Игрок не в сети");
return;
}
// Создаем предмет из данных
ItemStack item = jsonToItemStack(itemData);
if (item == null) {
sendOperationError(operation.get("id").getAsString(), "Не удалось создать предмет");
return;
}
// Добавляем предмет в инвентарь
HashMap<Integer, ItemStack> leftItems = player.getInventory().addItem(item);
// Если предмет не поместился полностью, бросаем остаток на землю
if (!leftItems.isEmpty()) {
for (ItemStack leftItem : leftItems.values()) {
player.getWorld().dropItem(player.getLocation(), leftItem);
}
}
// Отправляем сообщение игроку
player.sendMessage("§aПредмет был снят с продажи и возвращен в инвентарь");
}
/** /**
* Создает ItemStack из JSON данных * Создает ItemStack из JSON данных
*/ */

View File

@ -1,6 +0,0 @@
# Настройки API
api-url: "http://localhost:8000/api/events"
commands-url: "http://localhost:8000/api/commands"
# IP сервера (оставьте пустым для автоматического определения)
server-ip: ""

View File

@ -1,4 +0,0 @@
name: popa-plugin
version: '1.0-SNAPSHOT'
main: popa.popa
api-version: '1.21'

Binary file not shown.

View File

@ -1,3 +0,0 @@
artifactId=popa
groupId=popa-popa.ru
version=1.0-SNAPSHOT

View File

@ -1 +0,0 @@
D:\Projects\Java\popa\src\main\java\popa\popa.java

Binary file not shown.