跳转至

levilamina::event::names · 事件名

事件 id 常量。

事件 id 是字符串,拼错的代价是订阅悄悄成功,回调却一次都不触发。宿主会报告解析失败,并列出相近的 id(§5.3),这些常量把这一步提前到了编译期。

分两类。注册表里的事件总是用完整的名字 ll::event::<类名>,中间没有分类段。宿主也接受唯一的后缀,但上游一旦加了同名的事件,后缀就会有歧义。合成事件的名字只有一个单词,是 Pier 用原生钩子构造的,用来补上 LL 没有覆盖的点。

每一项都写明了能不能取消。对不能取消的事件调用 Event::cancel(),不会出错,也不起作用,还会留下「已经拦住了」的印象。

函数

event::names::is_cancellable

Rust
pub fn is_cancellable(id: &str) -> Option<bool>

这个事件能不能取消。

  • Some(true):能,Event::cancel() 会生效;
  • Some(false):不能,cancel() 会返回 Err,说明应该去拦哪个事件;
  • None:不在表里。第三方模组自己发出的事件,或者这些表还没跟上的上游新事件,都会落在这里。cancel() 照常写回,什么都拦不住,也无法替调用方确认任何事情。

  • 参数:

    • id : &str
  • 返回值类型:Option<bool>

event::names::why_not_cancellable

Rust
pub fn why_not_cancellable(id: &str) -> Option<&'static str>

只能观察的事件为什么不能取消,以及应该改去拦哪个事件。

  • 参数:
    • id : &str
  • 返回值类型:Option<&'static str>

常量

名称 值 说明
PLAYER_JOIN "ll::event::PlayerJoinEvent" 可以取消,类型是 Cancellable<ServerPlayerEvent>。取消就是拒绝加入。
PLAYER_CONNECT "ll::event::PlayerConnectEvent" 可以取消。
PLAYER_DISCONNECT "ll::event::PlayerDisconnectEvent" 只能观察;玩家已经在离开,拦不住。
PLAYER_DIE "ll::event::PlayerDieEvent" 只能观察。
PLAYER_RESPAWN "ll::event::PlayerRespawnEvent" 只能观察。
PLAYER_CHAT "ll::event::PlayerChatEvent" 可以取消。载荷里有 message,修改它就改写了说的话。
PLAYER_DESTROY_BLOCK "ll::event::PlayerDestroyBlockEvent" 可以取消。玩家挖掉了一个方块。
PLAYER_PLACING_BLOCK "ll::event::PlayerPlacingBlockEvent" 可以取消。PlayerPlacingBlockEvent 是即将放置,Placed 是已经放好。
PLAYER_PLACED_BLOCK "ll::event::PlayerPlacedBlockEvent" 只能观察;已经放好了。要拦请用 PLAYER_PLACING_BLOCK。
PLAYER_INTERACT_BLOCK "ll::event::PlayerInteractBlockEvent" 可以取消。右键点方块:开箱子、按按钮、使用工具。
PLAYER_USE_ITEM "ll::event::PlayerUseItemEvent" 可以取消。禁止某种食物或药水要在这里拦,不要在 PLAYER_USE_ITEM_COMPLETE 拦。
PLAYER_PICK_UP_ITEM "ll::event::PlayerPickUpItemEvent" 可以取消。
PLAYER_ATTACK "ll::event::PlayerAttackEvent" 可以取消。注意它分不清攻击的是玩家还是生物;要区分得用 PLAYER_ATTACK_TARGET,那是一个合成事件,载荷里带着 targetIsPlayer。
PLAYER_SWING "ll::event::PlayerSwingEvent" 只能观察。
PLAYER_JUMP "ll::event::PlayerJumpEvent" 只能观察。
PLAYER_SNEAKING "ll::event::PlayerSneakingEvent" 可以取消,因为基类 PlayerSneakEvent 是 Cancellable<>。
PLAYER_SNEAKED "ll::event::PlayerSneakedEvent" 可以取消,同上。
PLAYER_SPRINTING "ll::event::PlayerSprintingEvent" 只能观察:和潜行不同,PlayerSprintEvent 不是 Cancellable。
PLAYER_SPRINTED "ll::event::PlayerSprintedEvent" 只能观察,同上。
PLAYER_ADD_EXPERIENCE "ll::event::PlayerAddExperienceEvent" 可以取消。
PLAYER_CHANGE_PERM "ll::event::PlayerChangePermEvent" 可以取消。
PLAYER_LEFT_CLICK "ll::event::PlayerLeftClickEvent" 只能观察。它是 PlayerAttackEvent 和 PlayerDestroyBlockEvent 的基类;要拦具体的动作,请订阅那两个。
PLAYER_RIGHT_CLICK "ll::event::PlayerRightClickEvent" 只能观察;同样是基类。
ACTOR_HURT "ll::event::ActorHurtEvent" 可以取消。
MOB_DIE "ll::event::MobDieEvent" 只能观察:MobEvent 不是 Cancellable。
SPAWNING_MOB "ll::event::SpawningMobEvent" 可以取消。
SPAWNED_MOB "ll::event::SpawnedMobEvent" 只能观察;已经发生了。
BLOCK_CHANGED "ll::event::BlockChangedEvent" 只能观察。方块的变化要通过 PLAYER_PLACING_BLOCK、PLAYER_DESTROY_BLOCK 或 BLOCK_DESTROY 来拦,最后一个覆盖非玩家的来源。
FIRE_SPREAD "ll::event::FireSpreadEvent" 可以取消。
SERVER_STARTED "ll::event::ServerStartedEvent" 只能观察。
SERVER_STOPPING "ll::event::ServerStoppingEvent" 只能观察。
SERVER_LEVEL_TICK "ll::event::ServerLevelTickEvent" 只能观察,每刻一次,所以判断必须很快,或者改用 Host::schedule。
EXECUTING_COMMAND "ll::event::ExecutingCommandEvent" 可以取消。命令白名单或者审计就挂在这里。
EXECUTED_COMMAND "ll::event::ExecutedCommandEvent" 只能观察;已经发生了。
BLOCK_DESTROY "BlockDestroyEvent" 可以取消。有东西移除了这一格,不问是谁。 它补上了最大的一块空缺:末影人搬走草方块、凋灵撞碎墙、苦力怕炸出的坑、蠹虫钻进石头、/setblock ... destroy、另一个插件调用 destroyBlock。以前这些都不触发任何事件,地皮保护只能看着方块消失。 载荷:x y z dim dropResources block。注意里面没有「是谁」:引擎在这一层已经丢掉了来源,编一个出来只会误导人。
EXPLOSION "ExplosionEvent" 可以取消。取消就是这次爆炸完全不发生,伤害和方块都不受影响。 载荷:x y z dim radius maxResistance fire breaksBlocks underwater sourceIsPlayer sourceId source。
LIQUID_FLOW "LiquidFlowEvent" 可以取消。水或岩浆即将流进一格。用来拦这种情况:邻居在自己的地上倒水,水却流过了边界;倒水本身是合法的,流过去的那一步才越界。 载荷:目标格 x y z dim,来源格 fromX fromY fromZ,以及 direction 和 liquid。 这是热路径:液体每刻都在扩散,所以判断必须很快。
FARMLAND_DECAY "FarmlandDecayEvent" 可以取消。有东西从高处落下,把耕地踩回了泥土,不需要任何权限,也不留任何日志。 载荷:x y z dim fallDistance byPlayer actor,是玩家时还有 _player。
PISTON_PUSH "PistonPushEvent" 可以取消。活塞即将推动或拉回一组方块。用来拦跨地皮的活塞机器。 载荷:活塞的 x y z dim,facing:[x,y,z] 和 attached:[[x,y,z],...]。
CHEST_PAIR "ChestPairEvent" 可以取消。两个箱子即将合成一个大箱子。 贴着边界放的箱子会和邻居的箱子合并,打开靠自己这边的一半,就能看到对方那边的所有东西。容器保护按你点的那一格做判断,而那一格确实属于放箱子的人。 载荷:x y z dim otherX otherY otherZ。
SPAWN_ITEM_ACTOR "SpawnItemActorEvent" 可以取消。取消就是不生成这个掉落物,物品直接消失,不会躺在地上。 用于防刷和掉落物归属。载荷:x y z dim item count throwTime sourceIsPlayer source。
WEATHER_CHANGE "WeatherChangeEvent" 只能观察。天气变化。载荷:rainLevel rainTime lightningLevel lightningTime。
PLAYER_SLEEP "PlayerSleepEvent" 可以取消,取消时用引擎自己的 NotPossibleHere,所以客户端显示的是原版的提示。 用于别人的床、不能跳过夜晚的玩法,以及床会爆炸的维度。
PLAYER_CHANGE_SLOT "PlayerChangeSlotEvent" 只能观察:返回值是新槽位里那个物品的引用,取消就意味着凭空编出一个物品。 载荷:from to item dim _player。
PLAYER_USE_ITEM_COMPLETE "PlayerUseItemCompleteEvent" 只能观察:在这里取消,玩家会一直拿着这个物品放不下来。吃完、喝完,或者放下望远镜时触发。 禁止某种食物,要在 PLAYER_USE_ITEM 拦住使用的开始。
ARMOR_STAND_SWAP_ITEM "ArmorStandSwapItemEvent" 可以取消。玩家和盔甲架交换装备;盔甲架既不是容器也不是方块,两种保护都看不到它。
PLAYER_ATTACK_ITEM_FRAME "PlayerAttackItemFrameEvent" 可以取消。左键点物品展示框取出物品:展示框还在,所以不算破坏方块;展示框是方块,所以也不算攻击实体。
PLAYER_OPERATED_ITEM_FRAME "PlayerOperatedItemFrameEvent" 可以取消。旋转展示框里的物品,是展示框这一对事件的另一半,攻击的那一半是 PLAYER_ATTACK_ITEM_FRAME。两者都不是放方块,也不是攻击实体,所以别的事件都看不到。
PLAYER_EDIT_SIGN "PlayerEditSignEvent" 可以取消。修改一块已经放好的告示牌上的文字。放告示牌属于放方块,早就覆盖了;改文字既不是放置也不是交互。
PLAYER_REQUEST_ITEM_ACTION "PlayerRequestItemActionEvent" 这个宿主不会触发它。保留这个名字,是为了已经订阅它的模组;is_cancellable 对它回答 Some(false),免得有模组把它当成关卡。它没有列在 ALL_SYNTHETIC 里,那里只列宿主注册的事件。
PLAYER_ATTACK_TARGET "PlayerAttackTargetEvent" 可以取消。玩家攻击一个目标。载荷里有 targetIsPlayer,pvp 开关靠它区分攻击玩家和攻击生物;还有 targetKnown:目标读不出来时它为 0,同时 targetIsPlayer 为 1,于是 pvp 规则会拒绝。
PLAYER_CHANGE_GAME_MODE "PlayerChangeGameModeEvent" 可以取消。玩家切换游戏模式,包括通过 /gamemode 和其他插件的调用。
PLAYER_DROP_ITEM "PlayerDropItemEvent" 可以取消。丢出物品,手动丢弃和从物品栏界面拖出去都算。
PLAYER_INTERACT_ENTITY "PlayerInteractEntityEvent" 可以取消。右键点实体:和村民交易、喂动物、剪羊毛。
PLAYER_STEP_ON_PRESSURE_PLATE "PlayerStepOnPressurePlateEvent" 可以取消。玩家踩上压力板或绊线。内部按(玩家,位置)节流,每 250 毫秒最多触发一次。
ACTOR_STEP_ON_PRESSURE_PLATE "ActorStepOnPressurePlateEvent" 可以取消。同上,但针对非玩家的实体,用的是另一张节流表。
PLAYER_SPAWN_PROJECTILE "PlayerSpawnProjectileEvent" 可以取消。玩家发射一个弹射物:雪球、末影珍珠、箭、三叉戟、弩射出的烟花。
PLAYER_PUSH_ENTITY "PlayerPushEntityEvent" 可以取消。玩家推动一个实体。内部有节流。
PLAYER_RIDE "PlayerRideEvent" 可以取消。玩家骑上一个载具。
ACTOR_RIDE "ActorRideEvent" 可以取消。非玩家的实体骑上一个载具,比如村民坐船、猪坐矿车。 载荷用 passenger 和 passengerId,没有 _player。
PLAYER_TAKE_ENTITY "PlayerTakeEntityEvent" 可以取消。玩家捡起一个弹射物实体,比如箭或三叉戟。
PLAYER_OPEN_CONTAINER "PlayerOpenContainerEvent" 可以取消。玩家打开一个容器。
PLAYER_START_DESTROY_BLOCK "PlayerStartDestroyBlockEvent" 只能观察,在原函数之前发出,用于记录是谁开始挖哪一格。
PLAYER_CHANGE_DIMENSION "PlayerChangeDimensionEvent" 可以取消,目标也可以改写。玩家切换维度,任何原因都算:传送门、传送、/execute in、重生。 载荷:from to to_x to_y to_z use_portal respawn _player。use_portal 用来区分走进传送门和被传送,把两者一视同仁的规则,会让写它的人吃惊。 回答 to,或者同时回答 to_x to_y to_z 三个,就能给这次转移改道,之后由引擎自己完成。如果改为在回调里传送,玩家还站在传送门里时会再次进入这个事件,每刻都重复一遍。
PORTAL_CREATE "PortalCreateEvent" 可以取消。一个框架即将变成下界传送门。 它在引擎量好框架、找到火之后触发,所以使用方不需要自己做任何几何计算。载荷:dim x y z。 里面没有玩家:火可以来自发射器、闪电和蔓延,按玩家判断的规则会漏掉这些情况。
HOPPER_TRANSFER "HopperTransferEvent" 只能观察。漏斗转移了一个物品。载荷:x y z slot item count old_item old_count。
PLAYER_USE_ITEM_ON "PlayerUseItemOnEvent" 可以取消。玩家对一个方块使用物品,放置它,或者拿着它右键。
ALL_SYNTHETIC &[ BLOCK_DESTROY, EXPLOSION, LIQUID_FLOW, FARMLAND_DECAY, PISTON_PUSH, CHEST_PAIR, SPAWN_ITEM_ACTOR, WEATHER_CHANGE, PLAYER_SLEEP, PLAYER_CHANGE_SLOT, PLAYER_USE_ITEM_COMPLETE, ARMOR_STAND_SWAP_ITEM, PLAYER_ATTACK_ITEM_FRAME, PLAYER_OPERATED_ITEM_FRAME, PLAYER_EDIT_SIGN, PLAYER_ATTACK_TARGET, PLAYER_CHANGE_GAME_MODE, PLAYER_DROP_ITEM, PLAYER_INTERACT_ENTITY, PLAYER_STEP_ON_PRESSURE_PLATE, ACTOR_STEP_ON_PRESSURE_PLATE, PLAYER_SPAWN_PROJECTILE, PLAYER_PUSH_ENTITY, PLAYER_RIDE, ACTOR_RIDE, PLAYER_TAKE_ENTITY, PLAYER_OPEN_CONTAINER, PLAYER_START_DESTROY_BLOCK, PLAYER_CHANGE_DIMENSION, PORTAL_CREATE, HOPPER_TRANSFER, PLAYER_USE_ITEM_ON, ] 所有合成事件的 id。启动时拿它和 super::list() 对比,就能看出这个宿主编入了哪些能力包。