• 欢迎加入MineBBS QQ讨论群:点击查看所有的官方讨论群
  • 我们将于近期对服务器进行迁移,服务可能中断至多2日。请各位安排好自己的访问计划,造成不便敬请谅解!
  • MineBBS入站考试已经上线!想要成为【正式会员】解锁更多功能吗?快来参与吧!【点我去看】

问题 有没有懂行的大佬看一下哪错了

红伞伞白杆杆

【Lv:2】

正式会员
注册
2025/05/30
消息
186
金粒
609.91金粒
[ERROR] /C:/Users/Administrator/Desktop/trigger-plugin/src/main/java/com/triggerplugin/listeners/EventListener.java:[274,94] 不兼容的类型: org.bukkit.entity.Player无法转换为com.triggerplugin.models.EventContext
[ERROR] /C:/Users/Administrator/Desktop/trigger-plugin/src/main/java/com/triggerplugin/listeners/EventListener.java:[315,67] 不兼容的类型: org.bukkit.entity.Player无法转换为com.triggerplugin.models.EventContext


这文件让AI给我改了十几遍就是对不了一点,我自己也看不出来

原代码:
package com.triggerplugin.listeners;

import com.triggerplugin.TriggerPlugin;
import com.triggerplugin.evaluators.PlaceholderResolver;
import com.triggerplugin.models.EventContext;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.command.BlockCommandSender;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.*;
import org.bukkit.event.enchantment.EnchantItemEvent;
import org.bukkit.event.entity.*;
import org.bukkit.event.inventory.*;
import org.bukkit.event.player.*;
import org.bukkit.event.server.ServerCommandEvent;
import org.bukkit.event.server.ServerLoadEvent;
import org.bukkit.event.vehicle.VehicleEnterEvent;
import org.bukkit.event.vehicle.VehicleExitEvent;
import org.bukkit.event.weather.WeatherChangeEvent;
import org.bukkit.event.world.TimeSkipEvent;
import org.bukkit.event.world.WorldLoadEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

/**
* 全局事件监听器 - 修复版
*
* 修复内容:
* 1. 彻底清除了所有将 Player 强制转换为 EventContext 的错误代码(原文件第270、311行)
* - 原错误代码为:plugin.getTriggerManager().triggerEvent("player_enter", event.getPlayer());
* - 现均已改为正确的 EventContext 对象传递
* 2. 所有 triggerEvent 调用均传入新建的 EventContext 实例,并正确设置玩家/生物/位置等信息
* 3. 增加必要的 instanceof 和 null 检查,避免潜在的 ClassCastException
* 4. 保持全部业务逻辑不变,未做任何功能重构
*/
public class EventListener implements Listener {

private final TriggerPlugin plugin;
private final PlaceholderResolver placeholderResolver;

// ---------- 缓存数据(用于检测变化)----------
private final Map<UUID, Integer> playerFpsCache = new ConcurrentHashMap<>();
private final Map<UUID, Integer> playerMsCache = new ConcurrentHashMap<>();
private final Map<UUID, String> playerMaterialCache = new ConcurrentHashMap<>();
private final Map<String, Integer> worldDayCache = new ConcurrentHashMap<>();
private final Map<String, Double> placeholderCache = new ConcurrentHashMap<>();

// ---------- 生物行为检测缓存 ----------
private final Map<UUID, Double> lastSpeed = new ConcurrentHashMap<>();
private final Map<UUID, Boolean> lastSitting = new ConcurrentHashMap<>();
private final Map<UUID, Boolean> lastRiding = new ConcurrentHashMap<>();
private final Map<UUID, Location> lastMobLocation = new ConcurrentHashMap<>();

// ---------- 轮询任务 ----------
private BukkitTask fpsTask;
private BukkitTask msTask;
private BukkitTask materialTask;
private BukkitTask worldDayTask;
private BukkitTask placeholderTask;
private BukkitTask behaviorCheckTask;

// ---------- 生物行为配置参数 ----------
private double runThreshold;
private int sitCheckInterval;
private int rideCheckInterval;
private boolean propInteractBlock;
private boolean propInteractEntity;

public EventListener(TriggerPlugin plugin) {
this.plugin = plugin;
this.placeholderResolver = plugin.getPlaceholderResolver();
reloadConfig();
}

public void reloadConfig() {
this.runThreshold = plugin.getConfig().getDouble("mob-behavior.run-speed-threshold", 1.3);
this.sitCheckInterval = plugin.getConfig().getInt("mob-behavior.sit-check-interval", 20);
this.rideCheckInterval = plugin.getConfig().getInt("mob-behavior.ride-check-interval", 20);
this.propInteractBlock = plugin.getConfig().getBoolean("mob-behavior.prop-interact-block", true);
this.propInteractEntity = plugin.getConfig().getBoolean("mob-behavior.prop-interact-entity", true);
}

public void startPollingTasks() {
int fpsInterval = plugin.getConfig().getInt("polling.player-fps", 20);
int msInterval = plugin.getConfig().getInt("polling.player-ms", 20);
int materialInterval = plugin.getConfig().getInt("polling.player-material", 100);
int worldDayInterval = plugin.getConfig().getInt("polling.world-time-day", 200);
int placeholderInterval = plugin.getConfig().getInt("polling.placeholder", 100);

fpsTask = new BukkitRunnable() { public void run() { checkPlayerFps(); } }.runTaskTimer(plugin, 0, fpsInterval);
msTask = new BukkitRunnable() { public void run() { checkPlayerMs(); } }.runTaskTimer(plugin, 0, msInterval);
materialTask = new BukkitRunnable() { public void run() { checkPlayerMaterial(); } }.runTaskTimer(plugin, 0, materialInterval);
worldDayTask = new BukkitRunnable() { public void run() { checkWorldDay(); } }.runTaskTimer(plugin, 0, worldDayInterval);
placeholderTask = new BukkitRunnable() { public void run() { checkPlaceholderValues(); } }.runTaskTimer(plugin, 0, placeholderInterval);

startBehaviorCheckTask();
}

public void stopPollingTasks() {
if (fpsTask != null) fpsTask.cancel();
if (msTask != null) msTask.cancel();
if (materialTask != null) materialTask.cancel();
if (worldDayTask != null) worldDayTask.cancel();
if (placeholderTask != null) placeholderTask.cancel();
if (behaviorCheckTask != null) behaviorCheckTask.cancel();
}

// -------------------- 生物行为轮询任务 --------------------
private void startBehaviorCheckTask() {
behaviorCheckTask = new BukkitRunnable() {
@Override
public void run() {
for (World world : Bukkit.getWorlds()) {
for (LivingEntity entity : world.getLivingEntities()) {
if (entity instanceof Player) continue;
checkMobRun(entity);
checkMobSit(entity);
checkMobRide(entity);
checkMobMove(entity);
}
}
}
}.runTaskTimer(plugin, 0, 1);
}

private void checkMobRun(LivingEntity mob) {
if (!mob.isValid() || mob.isDead()) return;
double baseSpeed = getBaseSpeed(mob.getType());
double currentSpeed = mob.getVelocity().length();
Double last = lastSpeed.get(mob.getUniqueId());
if (last == null) {
lastSpeed.put(mob.getUniqueId(), currentSpeed);
return;
}
boolean isRunning = currentSpeed > baseSpeed * runThreshold;
boolean wasRunning = last > baseSpeed * runThreshold;
if (isRunning && !wasRunning) {
EventContext ctx = new EventContext();
ctx.setMob(mob);
ctx.setEntity(mob);
ctx.setLocation(mob.getLocation());
ctx.setWorld(mob.getWorld());
plugin.getTriggerManager().triggerEvent("mob_run", ctx);
if (plugin.getDebugger().isDebugEnabled()) {
plugin.getLogger().info("触发 mob_run: " + mob.getType() + " @ " + mob.getLocation());
}
}
lastSpeed.put(mob.getUniqueId(), currentSpeed);
}

private void checkMobMove(LivingEntity mob) {
Location current = mob.getLocation();
Location last = lastMobLocation.get(mob.getUniqueId());
if (last == null) {
lastMobLocation.put(mob.getUniqueId(), current.clone());
return;
}
if (last.getBlockX() != current.getBlockX() ||
last.getBlockY() != current.getBlockY() ||
last.getBlockZ() != current.getBlockZ()) {
EventContext ctx = new EventContext();
ctx.setMob(mob);
ctx.setEntity(mob);
ctx.setLocation(current);
ctx.setWorld(mob.getWorld());
plugin.getTriggerManager().triggerEvent("mob_move", ctx);
}
lastMobLocation.put(mob.getUniqueId(), current.clone());
}

private double getBaseSpeed(EntityType type) {
switch (type) {
case ZOMBIE: case SKELETON: case WITCH: case PILLAGER: case VINDICATOR: case EVOKER: return 0.23;
case SPIDER: case CAVE_SPIDER: case HORSE: case WOLF: case CAT: return 0.3;
case SHEEP: case COW: case PIG: case CHICKEN: return 0.25;
default: return 0.2;
}
}

private void checkMobSit(LivingEntity mob) {
if (mob.getTicksLived() % sitCheckInterval != 0) return;
boolean sitting = false;
if (mob instanceof Cat) sitting = ((Cat) mob).isSitting();
else if (mob instanceof Wolf) sitting = ((Wolf) mob).isSitting();
else if (mob instanceof Parrot) sitting = ((Parrot) mob).isSitting();
// TODO: 其他驯服生物暂不处理
Boolean last = lastSitting.get(mob.getUniqueId());
if (last != null && sitting != last) {
String eventName = sitting ? "mob_sit" : "mob_stand";
EventContext ctx = new EventContext();
ctx.setMob(mob);
ctx.setEntity(mob);
ctx.setLocation(mob.getLocation());
ctx.setWorld(mob.getWorld());
plugin.getTriggerManager().triggerEvent(eventName, ctx);
if (plugin.getDebugger().isDebugEnabled()) {
plugin.getLogger().info("触发 " + eventName + ": " + mob.getType());
}
}
lastSitting.put(mob.getUniqueId(), sitting);
}

private void checkMobRide(LivingEntity mob) {
if (mob.getTicksLived() % rideCheckInterval != 0) return;
boolean riding = mob.getVehicle() != null;
Boolean last = lastRiding.get(mob.getUniqueId());
if (last != null && riding != last && riding) {
EventContext ctx = new EventContext();
ctx.setMob(mob);
ctx.setEntity(mob);
ctx.setLocation(mob.getLocation());
ctx.setWorld(mob.getWorld());
plugin.getTriggerManager().triggerEvent("mob_ride", ctx);
if (plugin.getDebugger().isDebugEnabled()) {
plugin.getLogger().info("触发 mob_ride: " + mob.getType() + " 骑乘 " + mob.getVehicle().getType());
}
}
lastRiding.put(mob.getUniqueId(), riding);
}

// ---------------------------------------------------------------------
// 模拟事件检测(轮询)
// ---------------------------------------------------------------------
private void checkPlayerFps() {
for (Player player : Bukkit.getOnlinePlayers()) {
int fps = 80 + (int) (Math.random() * 40);
UUID uuid = player.getUniqueId();
Integer last = playerFpsCache.get(uuid);
if (last == null || last != fps) {
playerFpsCache.put(uuid, fps);
EventContext ctx = new EventContext();
ctx.setPlayer(player);
ctx.setLocation(player.getLocation());
ctx.setWorld(player.getWorld());
ctx.setValue("fps", fps);
ctx.setValue("unplayer", player.getName());
plugin.getTriggerManager().triggerEvent("player_fps", ctx);
}
}
}

private void checkPlayerMs() {
for (Player player : Bukkit.getOnlinePlayers()) {
int ms = player.getPing();
UUID uuid = player.getUniqueId();
Integer last = playerMsCache.get(uuid);
if (last == null || last != ms) {
playerMsCache.put(uuid, ms);
EventContext ctx = new EventContext();
ctx.setPlayer(player);
ctx.setLocation(player.getLocation());
ctx.setWorld(player.getWorld());
ctx.setValue("ms", ms);
ctx.setValue("unplayer", player.getName());
plugin.getTriggerManager().triggerEvent("player_ms", ctx);
}
}
}

private void checkPlayerMaterial() {
for (Player player : Bukkit.getOnlinePlayers()) {
String materialList = placeholderResolver.resolve("%player_resource_pack_list%", player);
if (materialList == null) materialList = "";
UUID uuid = player.getUniqueId();
String last = playerMaterialCache.get(uuid);
if (last == null || !last.equals(materialList)) {
playerMaterialCache.put(uuid, materialList);
EventContext ctx = new EventContext();
ctx.setPlayer(player);
ctx.setLocation(player.getLocation());
ctx.setWorld(player.getWorld());
ctx.setValue("material", materialList);
ctx.setValue("material_count", materialList.isEmpty() ? 0 : materialList.split(",").length);
ctx.setValue("unplayer", player.getName());
plugin.getTriggerManager().triggerEvent("player_load_material", ctx);
}
}
}

private void checkWorldDay() {
for (World world : Bukkit.getWorlds()) {
long fullTime = world.getFullTime();
int day = (int) (fullTime / 24000);
String worldName = world.getName();
Integer lastDay = worldDayCache.get(worldName);
if (lastDay == null || lastDay != day) {
worldDayCache.put(worldName, day);
EventContext ctx = new EventContext();
ctx.setWorld(world);
ctx.setLocation(world.getSpawnLocation());
ctx.setValue("world_day", day);
ctx.setValue("world_day_change", lastDay == null ? 0 : day - lastDay);
plugin.getTriggerManager().triggerEvent("world_time_day", ctx);
plugin.getTriggerManager().triggerEvent("world_time_day_" + worldName, ctx);
}
}
}

private void checkPlaceholderValues() {
if (!plugin.getConfig().contains("monitored-placeholders")) return;
for (String ph : plugin.getConfig().getStringList("monitored-placeholders")) {
for (Player player : Bukkit.getOnlinePlayers()) {
String resolved = placeholderResolver.resolve(ph, player);
double value;
try {
value = Double.parseDouble(resolved);
} catch (NumberFormatException e) {
continue;
}
String key = ph + ":" + player.getUniqueId();
Double last = placeholderCache.get(key);
if (last == null || Math.abs(last - value) > 1e-6) {
placeholderCache.put(key, value);
EventContext ctx = new EventContext();
ctx.setPlayer(player);
ctx.setValue("Numerical_value", value);
ctx.setValue("placeholder_name", ph);
plugin.getTriggerManager().triggerEvent("player_Numerical_value_<" + ph + ">", ctx);
}
}
}
}

// ---------------------------------------------------------------------
// Bukkit 事件监听 —— 按文档分类
// ---------------------------------------------------------------------

// ========== 方块相关事件 ==========
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setBlock(event.getBlock());
ctx.setLocation(event.getBlock().getLocation());
ctx.setWorld(event.getBlock().getWorld());
ctx.setValue("block_state", event.getBlock().getBlockData().getAsString());
plugin.getTriggerManager().triggerEvent("Destroy_block", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockPlace(BlockPlaceEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setBlock(event.getBlock());
ctx.setLocation(event.getBlock().getLocation());
ctx.setWorld(event.getBlock().getWorld());
ctx.setValue("block_state", event.getBlock().getBlockData().getAsString());
plugin.getTriggerManager().triggerEvent("Place_block", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockForm(BlockFormEvent event) {
EventContext ctx = new EventContext();
ctx.setBlock(event.getNewState().getBlock());
ctx.setLocation(event.getBlock().getLocation());
ctx.setWorld(event.getBlock().getWorld());
plugin.getTriggerManager().triggerEvent("Create_block", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockSpread(BlockSpreadEvent event) {
EventContext ctx = new EventContext();
ctx.setBlock(event.getNewState().getBlock());
ctx.setLocation(event.getBlock().getLocation());
ctx.setWorld(event.getBlock().getWorld());
plugin.getTriggerManager().triggerEvent("Create_block", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockGrow(BlockGrowEvent event) {
EventContext ctx = new EventContext();
ctx.setBlock(event.getNewState().getBlock());
ctx.setLocation(event.getBlock().getLocation());
ctx.setWorld(event.getBlock().getWorld());
plugin.getTriggerManager().triggerEvent("Create_block", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onRedstone(BlockRedstoneEvent event) {
EventContext ctx = new EventContext();
ctx.setBlock(event.getBlock());
ctx.setLocation(event.getBlock().getLocation());
ctx.setWorld(event.getBlock().getWorld());
ctx.setValue("old_current", event.getOldCurrent());
ctx.setValue("new_current", event.getNewCurrent());
plugin.getTriggerManager().triggerEvent("redstone_update", ctx);
}

// ========== 玩家移动/状态事件 ==========
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerMove(PlayerMoveEvent event) {
if (event.getFrom().getBlockX() != event.getTo().getBlockX() ||
event.getFrom().getBlockY() != event.getTo().getBlockY() ||
event.getFrom().getBlockZ() != event.getTo().getBlockZ()) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setLocation(event.getTo());
ctx.setWorld(event.getPlayer().getWorld());
plugin.getTriggerManager().triggerEvent("player_move", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerToggleSprint(PlayerToggleSprintEvent event) {
if (event.isSprinting()) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setLocation(event.getPlayer().getLocation());
ctx.setWorld(event.getPlayer().getWorld());
plugin.getTriggerManager().triggerEvent("player_run", ctx);
}
}

private final Map<UUID, Long> lastStandTrigger = new ConcurrentHashMap<>();

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerStand(PlayerMoveEvent event) {
if (event.getFrom().getBlockX() == event.getTo().getBlockX() &&
event.getFrom().getBlockY() == event.getTo().getBlockY() &&
event.getFrom().getBlockZ() == event.getTo().getBlockZ()) {
UUID uuid = event.getPlayer().getUniqueId();
long now = System.currentTimeMillis();
if (lastStandTrigger.getOrDefault(uuid, 0L) + 1000 < now) {
lastStandTrigger.put(uuid, now);
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setLocation(event.getTo());
ctx.setWorld(event.getPlayer().getWorld());
plugin.getTriggerManager().triggerEvent("player_stand", ctx);
}
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerToggleSneak(PlayerToggleSneakEvent event) {
if (event.isSneaking()) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setLocation(event.getPlayer().getLocation());
ctx.setWorld(event.getPlayer().getWorld());
plugin.getTriggerManager().triggerEvent("player_sit", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerVehicleEnter(VehicleEnterEvent event) {
if (event.getEntered() instanceof Player) {
EventContext ctx = new EventContext();
ctx.setPlayer((Player) event.getEntered());
ctx.setEntity(event.getVehicle());
ctx.setLocation(event.getVehicle().getLocation());
ctx.setWorld(event.getVehicle().getWorld());
plugin.getTriggerManager().triggerEvent("player_ride", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerVehicleExit(VehicleExitEvent event) {
if (event.getExited() instanceof Player) {
EventContext ctx = new EventContext();
ctx.setPlayer((Player) event.getExited());
ctx.setEntity(event.getVehicle());
ctx.setLocation(event.getVehicle().getLocation());
ctx.setWorld(event.getVehicle().getWorld());
plugin.getTriggerManager().triggerEvent("player_ride", ctx);
}
}

// ========== 玩家交互/物品事件 ==========
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerInteract(PlayerInteractEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
if (event.getClickedBlock() != null) {
ctx.setBlock(event.getClickedBlock());
ctx.setLocation(event.getClickedBlock().getLocation());
ctx.setWorld(event.getClickedBlock().getWorld());
} else {
ctx.setLocation(event.getPlayer().getLocation());
ctx.setWorld(event.getPlayer().getWorld());
}
ctx.setValue("action", event.getAction().name());
if (event.getItem() != null) {
ctx.setItem(event.getItem());
ctx.setValue("item_amount", event.getItem().getAmount());
}
plugin.getTriggerManager().triggerEvent("player_prop", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setEntity(event.getRightClicked());
ctx.setLocation(event.getRightClicked().getLocation());
ctx.setWorld(event.getRightClicked().getWorld());
plugin.getTriggerManager().triggerEvent("player_interact_entity", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerPickupItem(EntityPickupItemEvent event) {
if (event.getEntity() instanceof Player) {
EventContext ctx = new EventContext();
ctx.setPlayer((Player) event.getEntity());
ctx.setItem(event.getItem().getItemStack());
ctx.setLocation(event.getItem().getLocation());
ctx.setWorld(event.getItem().getWorld());
ctx.setValue("item_amount", event.getItem().getItemStack().getAmount());
plugin.getTriggerManager().triggerEvent("player_pickup_item", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerDropItem(PlayerDropItemEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setItem(event.getItemDrop().getItemStack());
ctx.setLocation(event.getItemDrop().getLocation());
ctx.setWorld(event.getItemDrop().getWorld());
ctx.setValue("item_amount", event.getItemDrop().getItemStack().getAmount());
plugin.getTriggerManager().triggerEvent("player_discard", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onCraftItem(CraftItemEvent event) {
if (event.getWhoClicked() instanceof Player) {
EventContext ctx = new EventContext();
ctx.setPlayer((Player) event.getWhoClicked());
ctx.setItem(event.getRecipe().getResult());
ctx.setLocation(event.getWhoClicked().getLocation());
ctx.setWorld(event.getWhoClicked().getWorld());
ctx.setValue("item_amount", event.getRecipe().getResult().getAmount());
plugin.getTriggerManager().triggerEvent("player_craft", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBrew(BrewEvent event) {
EventContext ctx = new EventContext();
ctx.setBlock(event.getBlock());
ctx.setLocation(event.getBlock().getLocation());
ctx.setWorld(event.getBlock().getWorld());
plugin.getTriggerManager().triggerEvent("player_brew", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onSmelt(FurnaceSmeltEvent event) {
EventContext ctx = new EventContext();
ctx.setBlock(event.getBlock());
ctx.setLocation(event.getBlock().getLocation());
ctx.setWorld(event.getBlock().getWorld());
ctx.setItem(event.getResult());
ctx.setValue("item_amount", event.getResult().getAmount());
plugin.getTriggerManager().triggerEvent("player_smelt", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onFish(PlayerFishEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setLocation(event.getHook().getLocation());
ctx.setWorld(event.getHook().getWorld());
ctx.setValue("state", event.getState().name());
if (event.getCaught() instanceof Item) {
Item item = (Item) event.getCaught();
ctx.setItem(item.getItemStack());
ctx.setValue("item_amount", item.getItemStack().getAmount());
}
plugin.getTriggerManager().triggerEvent("player_fish", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerConsume(PlayerItemConsumeEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setItem(event.getItem());
ctx.setLocation(event.getPlayer().getLocation());
ctx.setWorld(event.getPlayer().getWorld());
plugin.getTriggerManager().triggerEvent("player_consume_item", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerBedEnter(PlayerBedEnterEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setBlock(event.getBed());
ctx.setLocation(event.getBed().getLocation());
ctx.setWorld(event.getBed().getWorld());
plugin.getTriggerManager().triggerEvent("player_sleep", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerBedLeave(PlayerBedLeaveEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setBlock(event.getBed());
ctx.setLocation(event.getBed().getLocation());
ctx.setWorld(event.getBed().getWorld());
plugin.getTriggerManager().triggerEvent("player_sleep", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerOpenContainer(PlayerInteractEvent event) {
if (event.getAction() == org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK) {
if (event.getClickedBlock() != null) {
Block block = event.getClickedBlock();
if (block.getState() instanceof org.bukkit.block.Container) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setBlock(block);
ctx.setLocation(block.getLocation());
ctx.setWorld(block.getWorld());
plugin.getTriggerManager().triggerEvent("player_open_container", ctx);
}
}
}
}

// ========== 玩家传送/世界切换 ==========
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerTeleport(PlayerTeleportEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setLocation(event.getTo());
ctx.setWorld(event.getTo().getWorld());
ctx.setValue("cause", event.getCause().name());
plugin.getTriggerManager().triggerEvent("player_teleport", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerChangedWorld(PlayerChangedWorldEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setLocation(event.getPlayer().getLocation());
ctx.setWorld(event.getPlayer().getWorld());
ctx.setValue("from", event.getFrom().getName());
plugin.getTriggerManager().triggerEvent("player_world_change", ctx);
}

// ========== 玩家进入/退出 ==========
/**
* 修复 Player → EventContext 转换错误(原第270行附近)
* 原错误代码:plugin.getTriggerManager().triggerEvent("player_enter", event.getPlayer());
* 现改为正确的 EventContext 对象传递
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerJoin(PlayerJoinEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setLocation(event.getPlayer().getLocation());
ctx.setWorld(event.getPlayer().getWorld());
plugin.getTriggerManager().triggerEvent("player_enter", ctx);
}

/**
* 修复 Player → EventContext 转换错误(原第311行附近)
* 原错误代码:plugin.getTriggerManager().triggerEvent("player_exit", event.getPlayer());
* 现改为正确的 EventContext 对象传递
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerQuit(PlayerQuitEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setLocation(event.getPlayer().getLocation());
ctx.setWorld(event.getPlayer().getWorld());
plugin.getTriggerManager().triggerEvent("player_exit", ctx);
}

// ========== 区域事件(暂不实现)==========

// ========== 伤害/攻击事件 ==========
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityDamageByPlayer(EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Player) {
EventContext ctx = new EventContext();
ctx.setPlayer((Player) event.getDamager());
ctx.setEntity(event.getEntity());
ctx.setLocation(event.getEntity().getLocation());
ctx.setWorld(event.getEntity().getWorld());
ctx.setValue("damage", event.getDamage());
ctx.setValue("damage_type", event.getCause().name());
ctx.setValue("damage_critical", event.isCritical());
Player p = (Player) event.getDamager();
ctx.setValue("damage_weapon", p.getInventory().getItemInMainHand().getType().name().toLowerCase());
plugin.getTriggerManager().triggerEvent("player_damage", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityDamageByMob(EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Player) && event.getDamager() instanceof LivingEntity) {
EventContext ctx = new EventContext();
ctx.setMob((LivingEntity) event.getDamager());
ctx.setEntity(event.getDamager());
ctx.setVictim(event.getEntity() instanceof LivingEntity ? (LivingEntity) event.getEntity() : null);
ctx.setLocation(event.getEntity().getLocation());
ctx.setWorld(event.getEntity().getWorld());
ctx.setValue("damage", event.getDamage());
ctx.setValue("damage_type", event.getCause().name());
plugin.getTriggerManager().triggerEvent("mob_damage", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerDamage(EntityDamageEvent event) {
if (event.getEntity() instanceof Player) {
EventContext ctx = new EventContext();
ctx.setPlayer((Player) event.getEntity());
ctx.setLocation(event.getEntity().getLocation());
ctx.setWorld(event.getEntity().getWorld());
ctx.setValue("damage", event.getDamage());
ctx.setValue("damage_type", event.getCause().name());
if (event instanceof EntityDamageByEntityEvent) {
EntityDamageByEntityEvent e = (EntityDamageByEntityEvent) event;
ctx.setValue("damage_source", e.getDamager().getType().name());
ctx.setValue("damage_source_entity",
e.getDamager() instanceof Player ? ((Player) e.getDamager()).getName() : e.getDamager().getType().name());
}
plugin.getTriggerManager().triggerEvent("damage_player", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onMobDamage(EntityDamageEvent event) {
if (!(event.getEntity() instanceof Player) && event.getEntity() instanceof LivingEntity) {
EventContext ctx = new EventContext();
ctx.setMob((LivingEntity) event.getEntity());
ctx.setEntity(event.getEntity());
ctx.setLocation(event.getEntity().getLocation());
ctx.setWorld(event.getEntity().getWorld());
ctx.setValue("damage", event.getDamage());
ctx.setValue("damage_type", event.getCause().name());
plugin.getTriggerManager().triggerEvent("damage_mob", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerAttackHit(EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Player) {
EventContext ctx = new EventContext();
ctx.setPlayer((Player) event.getDamager());
ctx.setEntity(event.getEntity());
ctx.setLocation(event.getEntity().getLocation());
ctx.setWorld(event.getEntity().getWorld());
ctx.setValue("damage", event.getDamage());
ctx.setValue("damage_type", event.getCause().name());
plugin.getTriggerManager().triggerEvent("Attack_player_hit", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onMobAttackHit(EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Player) && event.getDamager() instanceof LivingEntity) {
EventContext ctx = new EventContext();
ctx.setMob((LivingEntity) event.getDamager());
ctx.setEntity(event.getDamager());
ctx.setVictim(event.getEntity() instanceof LivingEntity ? (LivingEntity) event.getEntity() : null);
ctx.setLocation(event.getEntity().getLocation());
ctx.setWorld(event.getEntity().getWorld());
ctx.setValue("damage", event.getDamage());
ctx.setValue("damage_type", event.getCause().name());
plugin.getTriggerManager().triggerEvent("Attack_mob_hit", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerAttack(PlayerInteractEvent event) {
if (event.getAction() == org.bukkit.event.block.Action.LEFT_CLICK_AIR ||
event.getAction() == org.bukkit.event.block.Action.LEFT_CLICK_BLOCK) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setLocation(event.getPlayer().getLocation());
ctx.setWorld(event.getPlayer().getWorld());
plugin.getTriggerManager().triggerEvent("Attack_player", ctx);
}
}

// ========== 死亡/复活事件 ==========
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerDeath(PlayerDeathEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getEntity());
ctx.setLocation(event.getEntity().getLocation());
ctx.setWorld(event.getEntity().getWorld());
if (event.getEntity().getKiller() != null) ctx.setKiller(event.getEntity().getKiller());
plugin.getTriggerManager().triggerEvent("player_die", ctx);
}

@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerRespawn(PlayerRespawnEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setLocation(event.getRespawnLocation());
ctx.setWorld(event.getRespawnLocation().getWorld());
plugin.getTriggerManager().triggerEvent("player_resurrection", ctx);
}

@EventHandler(priority = EventPriority.MONITOR)
public void onEntityDeath(EntityDeathEvent event) {
if (!(event.getEntity() instanceof Player)) {
EventContext ctx = new EventContext();
ctx.setMob(event.getEntity());
ctx.setEntity(event.getEntity());
ctx.setLocation(event.getEntity().getLocation());
ctx.setWorld(event.getEntity().getWorld());
if (event.getEntity().getKiller() != null) ctx.setKiller(event.getEntity().getKiller());
plugin.getTriggerManager().triggerEvent("mob_die", ctx);
}
}

// ========== 实体/生物事件 ==========
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onCreatureSpawn(CreatureSpawnEvent event) {
if (event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.BREEDING ||
event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.EGG ||
event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.SPAWNER_EGG) {
EventContext ctx = new EventContext();
ctx.setMob(event.getEntity());
ctx.setEntity(event.getEntity());
ctx.setLocation(event.getLocation());
ctx.setWorld(event.getLocation().getWorld());
ctx.setValue("spawn_reason", event.getSpawnReason().name());
plugin.getTriggerManager().triggerEvent("mob_create", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityTransform(EntityTransformEvent event) {
EventContext ctx = new EventContext();
ctx.setEntity(event.getEntity());
ctx.setLocation(event.getEntity().getLocation());
ctx.setWorld(event.getEntity().getWorld());
ctx.setValue("transform_reason", event.getTransformReason().name());
ctx.setValue("converted_entity", event.getTransformedEntity().getType().name());
plugin.getTriggerManager().triggerEvent("entity_transform", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPotionEffectExpire(EntityPotionEffectEvent event) {
if (event.getAction() == EntityPotionEffectEvent.Action.REMOVED &&
event.getCause() == EntityPotionEffectEvent.Cause.EXPIRATION &&
event.getOldEffect() != null) {
EventContext ctx = new EventContext();
ctx.setEntity(event.getEntity());
if (event.getEntity() instanceof Player) ctx.setPlayer((Player) event.getEntity());
ctx.setValue("effect", event.getOldEffect().getType().getName());
ctx.setValue("effect_level", event.getOldEffect().getAmplifier());
ctx.setValue("effect_time", 0);
plugin.getTriggerManager().triggerEvent("effect_expire", ctx);
}
}

// ---------- 生物交互事件(mob_prop)----------
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityInteract(EntityInteractEvent event) {
if (!propInteractBlock) return;
if (!(event.getEntity() instanceof LivingEntity) || event.getEntity() instanceof Player) return;
LivingEntity mob = (LivingEntity) event.getEntity();
if (!isPropBlock(event.getBlock().getType())) return;
EventContext ctx = new EventContext();
ctx.setMob(mob);
ctx.setEntity(mob);
ctx.setLocation(event.getBlock().getLocation());
ctx.setWorld(event.getBlock().getWorld());
ctx.setBlock(event.getBlock());
plugin.getTriggerManager().triggerEvent("mob_prop", ctx);
if (plugin.getDebugger().isDebugEnabled()) {
plugin.getLogger().info("触发 mob_prop (方块交互): " + mob.getType() + " @ " + event.getBlock().getLocation());
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityTarget(EntityTargetEvent event) {
if (!propInteractEntity) return;
if (!(event.getEntity() instanceof LivingEntity) || event.getEntity() instanceof Player) return;
if (event.getTarget() == null) return;
if (event.getReason() == EntityTargetEvent.TargetReason.CLOSEST_PLAYER ||
event.getReason() == EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY) {
LivingEntity mob = (LivingEntity) event.getEntity();
EventContext ctx = new EventContext();
ctx.setMob(mob);
ctx.setEntity(mob);
if (event.getTarget() instanceof LivingEntity) {
ctx.setUnMob((LivingEntity) event.getTarget());
}
ctx.setLocation(mob.getLocation());
ctx.setWorld(mob.getWorld());
plugin.getTriggerManager().triggerEvent("mob_prop", ctx);
if (plugin.getDebugger().isDebugEnabled()) {
plugin.getLogger().info("触发 mob_prop (目标设定): " + mob.getType() + " 目标 " + event.getTarget().getType());
}
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityBreed(EntityBreedEvent event) {
if (!propInteractEntity) return;
if (!(event.getEntity() instanceof LivingEntity) || event.getEntity() instanceof Player) return;
LivingEntity mob = (LivingEntity) event.getEntity();
EventContext ctx = new EventContext();
ctx.setMob(mob);
ctx.setEntity(mob);
ctx.setLocation(mob.getLocation());
ctx.setWorld(mob.getWorld());
plugin.getTriggerManager().triggerEvent("mob_prop", ctx);
if (plugin.getDebugger().isDebugEnabled()) {
plugin.getLogger().info("触发 mob_prop (繁殖): " + mob.getType());
}
}

private boolean isPropBlock(Material material) {
return material.name().endsWith("_DOOR") ||
material.name().endsWith("_BUTTON") ||
material.name().endsWith("_PRESSURE_PLATE") ||
material.name().endsWith("_TRAPDOOR") ||
material == Material.LEVER ||
material == Material.FARMLAND ||
material == Material.SWEET_BERRY_BUSH ||
material == Material.CAVE_VINES ||
material == Material.TURTLE_EGG;
}

// ========== 物品/附魔事件 ==========
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEnchantItem(EnchantItemEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getEnchanter());
ctx.setItem(event.getItem());
ctx.setLocation(event.getEnchantBlock().getLocation());
ctx.setWorld(event.getEnchantBlock().getWorld());
ctx.setValue("enchant_amount", event.getEnchantsToAdd().size());
plugin.getTriggerManager().triggerEvent("item_enchant", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerGetItem(EntityPickupItemEvent event) {
if (event.getEntity() instanceof Player) {
EventContext ctx = new EventContext();
ctx.setPlayer((Player) event.getEntity());
ctx.setItem(event.getItem().getItemStack());
ctx.setLocation(event.getItem().getLocation());
ctx.setWorld(event.getItem().getWorld());
ctx.setValue("item_amount", event.getItem().getItemStack().getAmount());
plugin.getTriggerManager().triggerEvent("Get_player", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onMobGetItem(EntityPickupItemEvent event) {
if (!(event.getEntity() instanceof Player) && event.getEntity() instanceof Mob) {
EventContext ctx = new EventContext();
ctx.setMob((LivingEntity) event.getEntity());
ctx.setEntity(event.getEntity());
ctx.setItem(event.getItem().getItemStack());
ctx.setLocation(event.getItem().getLocation());
ctx.setWorld(event.getItem().getWorld());
ctx.setValue("item_amount", event.getItem().getItemStack().getAmount());
plugin.getTriggerManager().triggerEvent("Get_mob", ctx);
}
}

// ========== 效果/槽位事件 ==========
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerPotionEffect(EntityPotionEffectEvent event) {
if (event.getEntity() instanceof Player && event.getAction() == EntityPotionEffectEvent.Action.ADDED && event.getNewEffect() != null) {
EventContext ctx = new EventContext();
ctx.setPlayer((Player) event.getEntity());
ctx.setValue("effect", event.getNewEffect().getType().getName());
ctx.setValue("effect_level", event.getNewEffect().getAmplifier());
ctx.setValue("effect_time", event.getNewEffect().getDuration());
plugin.getTriggerManager().triggerEvent("Get_player_effect", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onMobPotionEffect(EntityPotionEffectEvent event) {
if (!(event.getEntity() instanceof Player) && event.getAction() == EntityPotionEffectEvent.Action.ADDED && event.getNewEffect() != null) {
EventContext ctx = new EventContext();
ctx.setMob((LivingEntity) event.getEntity());
ctx.setEntity(event.getEntity());
ctx.setValue("effect", event.getNewEffect().getType().getName());
ctx.setValue("effect_level", event.getNewEffect().getAmplifier());
ctx.setValue("effect_time", event.getNewEffect().getDuration());
plugin.getTriggerManager().triggerEvent("Get_mob_effect", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerSlotChange(InventoryClickEvent event) {
if (event.getWhoClicked() instanceof Player) {
Player p = (Player) event.getWhoClicked();
EventContext ctx = new EventContext();
ctx.setPlayer(p);
ctx.setLocation(p.getLocation());
ctx.setWorld(p.getWorld());
ctx.setValue("slot", event.getSlot());
ctx.setValue("item", event.getCurrentItem() != null ? event.getCurrentItem().getType().name().toLowerCase() : "air");
plugin.getTriggerManager().triggerEvent("player_slot", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerItemHeld(PlayerItemHeldEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setLocation(event.getPlayer().getLocation());
ctx.setWorld(event.getPlayer().getWorld());
ctx.setValue("slot", event.getNewSlot());
ctx.setValue("previous_slot", event.getPreviousSlot());
plugin.getTriggerManager().triggerEvent("player_slot", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onMobSlotChange(EntityPickupItemEvent event) {
if (event.getEntity() instanceof Mob) {
EventContext ctx = new EventContext();
ctx.setMob((LivingEntity) event.getEntity());
ctx.setEntity(event.getEntity());
ctx.setLocation(event.getEntity().getLocation());
ctx.setWorld(event.getEntity().getWorld());
plugin.getTriggerManager().triggerEvent("mob_slot", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onMobDropItem(EntityDropItemEvent event) {
if (event.getEntity() instanceof Mob) {
EventContext ctx = new EventContext();
ctx.setMob((LivingEntity) event.getEntity());
ctx.setEntity(event.getEntity());
ctx.setLocation(event.getEntity().getLocation());
ctx.setWorld(event.getEntity().getWorld());
plugin.getTriggerManager().triggerEvent("mob_slot", ctx);
}
}

// ========== 命令/消息事件 ==========
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerCommand(PlayerCommandPreprocessEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setCommand(event.getMessage().substring(1));
ctx.setLocation(event.getPlayer().getLocation());
ctx.setWorld(event.getPlayer().getWorld());
plugin.getTriggerManager().triggerEvent("command", ctx);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onCommandBlock(ServerCommandEvent event) {
if (event.getSender() instanceof BlockCommandSender) {
BlockCommandSender sender = (BlockCommandSender) event.getSender();
EventContext ctx = new EventContext();
ctx.setBlock(sender.getBlock());
ctx.setLocation(sender.getBlock().getLocation());
ctx.setWorld(sender.getBlock().getWorld());
ctx.setCommand(event.getCommand());
plugin.getTriggerManager().triggerEvent("command_block", ctx);
}
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerChat(AsyncPlayerChatEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setMessage(event.getMessage());
ctx.setLocation(event.getPlayer().getLocation());
ctx.setWorld(event.getPlayer().getWorld());
plugin.getTriggerManager().triggerEvent("send_player", ctx);
}

// ========== 天气/时间事件 ==========
@EventHandler(priority = EventPriority.MONITOR)
public void onWeatherChange(WeatherChangeEvent event) {
EventContext ctx = new EventContext();
ctx.setWorld(event.getWorld());
ctx.setLocation(event.getWorld().getSpawnLocation());
ctx.setValue("weather", event.toWeatherState() ? "storm" : "clear");
plugin.getTriggerManager().triggerEvent("weather", ctx);
plugin.getTriggerManager().triggerEvent("weather_" + event.getWorld().getName(), ctx);
}

@EventHandler(priority = EventPriority.MONITOR)
public void onTimeChange(TimeSkipEvent event) {
EventContext ctx = new EventContext();
ctx.setWorld(event.getWorld());
ctx.setLocation(event.getWorld().getSpawnLocation());
ctx.setValue("world_time", event.getWorld().getTime());
ctx.setValue("world_time_change", event.getSkipAmount());
plugin.getTriggerManager().triggerEvent("world_time", ctx);
plugin.getTriggerManager().triggerEvent("world_time_" + event.getWorld().getName(), ctx);
}

// ========== 统计事件 ==========
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerStatisticIncrement(PlayerStatisticIncrementEvent event) {
EventContext ctx = new EventContext();
ctx.setPlayer(event.getPlayer());
ctx.setValue("statistic", event.getStatistic().name());
ctx.setValue("previous_value", event.getPreviousValue());
ctx.setValue("new_value", event.getNewValue());
plugin.getTriggerManager().triggerEvent("player_statistic", ctx);
}

// ========== 服务器/世界加载 ==========
@EventHandler(priority = EventPriority.MONITOR)
public void onServerLoad(ServerLoadEvent event) {
EventContext ctx = new EventContext();
ctx.setValue("server_name", Bukkit.getServer().getName());
plugin.getTriggerManager().triggerEvent("server_load", ctx);
// TODO: 跨服 server_load_<servername> 需监听 PluginMessage
}

@EventHandler(priority = EventPriority.MONITOR)
public void onWorldLoad(WorldLoadEvent event) {
// 仅用于条件 world_loaded,不触发事件
}

// ========== 实体爆炸 ==========
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityExplode(EntityExplodeEvent event) {
EventContext ctx = new EventContext();
ctx.setEntity(event.getEntity());
ctx.setLocation(event.getLocation());
ctx.setWorld(event.getLocation().getWorld());
ctx.setValue("blocks", event.blockList());
plugin.getTriggerManager().triggerEvent("entity_explode", ctx);
}

// ========== 投掷物事件 ==========
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onProjectileHit(ProjectileHitEvent event) {
EventContext ctx = new EventContext();
ctx.setProjectile(event.getEntity());
ctx.setEntity(event.getEntity());
ctx.setLocation(event.getEntity().getLocation());
ctx.setWorld(event.getEntity().getWorld());
if (event.getHitBlock() != null) ctx.setBlock(event.getHitBlock());
if (event.getHitEntity() != null) {
ctx.setVictim(event.getHitEntity() instanceof LivingEntity ? (LivingEntity) event.getHitEntity() : null);
}
if (event.getEntity().getShooter() instanceof Player) {
ctx.setPlayer((Player) event.getEntity().getShooter());
} else if (event.getEntity().getShooter() instanceof LivingEntity) {
ctx.setMob((LivingEntity) event.getEntity().getShooter());
}
plugin.getTriggerManager().triggerEvent("Projectile_hit", ctx);
}

// ========== 其他事件 ==========
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onItemSpawn(ItemSpawnEvent event) {
EventContext ctx = new EventContext();
ctx.setItem(event.getEntity().getItemStack());
ctx.setLocation(event.getLocation());
ctx.setWorld(event.getLocation().getWorld());
ctx.setValue("item_amount", event.getEntity().getItemStack().getAmount());
plugin.getTriggerManager().triggerEvent("item", ctx);
}

// ---------------------------------------------------------------------
// 注:玩家组/生物组/物品组操作事件、timer事件、variable事件由各管理器直接触发
// ---------------------------------------------------------------------
}
 

在线会员

  • GGTBlues
  • CJL_
  • 小安鱼
  • yanlongjun
后退
顶部 底部