Files
benilla-octo/crates/benilla-protocol/src/bin/benilla-world/probes/mod.rs
T
SamandClaude Fable 5 94de741cb1 /target, /assist and /follow, and right click opens a clam
- /target and /assist find units by name like the original, and /follow walks you behind your target
- right click opens clams and lockboxes, and the tooltip promises it
- the freeze thaws clean, poses release instead of sticking, and you drop to neutral standing before it grips
- unit frame art layers over the bars like the original

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 18:02:44 +07:00

103 lines
3.8 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! The probe registry: one file per `--flag` scenario, each a self-contained [`Probe`] with a
//! uniform lifecycle. Registration order (in `main`) = today's stream-loop/verify block order, so
//! output and execution order are preserved.
use anyhow::Result;
use benilla_protocol::{SessionEvent, WorldSession};
use crate::world::World;
/// What a [`Probe`]'s lifecycle methods borrow: the live session (to send) + the shared [`World`].
pub(crate) struct Ctx<'a> {
pub session: &'a mut WorldSession,
pub world: &'a mut World,
}
/// One scripted wire-verification scenario. Registered from a `--flag`; the pump drives every
/// registered probe through this lifecycle in registration order.
pub(crate) trait Probe {
/// One-time pre-stream staging (GM teleports, cleanup commands).
fn stage(&mut self, cx: &mut Ctx) -> Result<()> {
let _ = cx;
Ok(())
}
/// Every pump iteration, before recv.
fn poll(&mut self, cx: &mut Ctx) -> Result<()> {
let _ = cx;
Ok(())
}
/// Every decoded event, AFTER [`World::on_event`] has processed it.
fn on_event(&mut self, ev: &SessionEvent, cx: &mut Ctx) -> Result<()> {
let _ = (ev, cx);
Ok(())
}
/// Post-stream: assertions + follow-up round trips (each block's bespoke drains move verbatim).
fn verify(&mut self, cx: &mut Ctx) -> Result<()> {
let _ = cx;
Ok(())
}
}
// Quest consts shared by more than one probe (put here rather than `pub(super)` in quest.rs
// because giverstatus/questlog re-use them and neither is quest.rs's child).
/// Marshal McBride's teleport spot — the `--quest` turn-in NPC, and the `--questlog`/`--giverstatus`
/// stage target (McBride is quest 7's giver *and* ender).
pub(crate) const QUEST_TURNIN_TP: &str = ".go xyz -8902.59 -162.606 82.0223"; // onto Marshal McBride
pub(crate) const QUEST_TURNIN_ENTRY: u32 = 197; // Marshal McBride — takes 783
/// `PLAYER_QUEST_LOG_1_1` UpdateField index for 1.12.1 (UNIT_END 188 + 0xA), 3 fields per slot ×
/// 20 slots (vmangos `UpdateFields_1_12_1.h:128`).
pub(crate) const FIELD_PLAYER_QUEST_LOG_1_1: u16 = 198;
/// The `--questlog` probe target: quest 7 "Kobold Camp Cleanup" — Marshal McBride (entry 197, the
/// same NPC [`QUEST_TURNIN_TP`]/[`QUEST_TURNIN_ENTRY`] already land on) is *both* giver and ender
/// (VERIFIED live against the running vmangos: `mangos.creature_questrelation` and
/// `creature_involvedrelation` each carry exactly one row for quest 7, both `197`). Its one
/// objective — kill 10 of creature entry 6 (Kobold) — is a real `required_count > 0` slot, unlike
/// 783's report-only "A Threat Within" the `--quest` probe turns in; a GM `.quest complete`
/// substitutes for the grind, same as `--quest`. Shared with `--giverstatus`, which `.quest remove`s
/// it in staging so McBride reads AVAILABLE for a fresh log.
pub(crate) const QUESTLOG_ID: u32 = 7;
mod attack;
mod aura;
mod charge;
mod death;
mod equip_pack_slot;
mod giverstatus;
mod groundfx;
mod loot;
mod open_item;
mod query_names;
mod quest;
mod quest_item;
mod questlog;
mod speed;
mod spells;
mod spirit;
mod swap_pack_slots;
mod use_pack_slot;
mod vendor;
mod worldstate;
pub(crate) use attack::Attack;
pub(crate) use aura::Aura;
pub(crate) use charge::Charge;
pub(crate) use death::Death;
pub(crate) use equip_pack_slot::EquipPackSlot;
pub(crate) use giverstatus::GiverStatus;
pub(crate) use groundfx::GroundFx;
pub(crate) use loot::Loot;
pub(crate) use open_item::OpenItem;
pub(crate) use query_names::QueryNames;
pub(crate) use quest::Quest;
pub(crate) use quest_item::QuestItem;
pub(crate) use questlog::QuestLog;
pub(crate) use speed::Speed;
pub(crate) use spells::Spells;
pub(crate) use spirit::Spirit;
pub(crate) use swap_pack_slots::SwapPackSlots;
pub(crate) use use_pack_slot::UsePackSlot;
pub(crate) use vendor::Vendor;
pub(crate) use worldstate::WorldState;