Talking to people: what the menus actually are

The menu is a table, not a state

An interaction menu is built from a per-character table of rows, filtered by two conditions in a fixed order (RoleInteract.GetNpcInteracts):

So "he wrote to me and there is nothing here" is always one of three things: no row of that kind on that character, a hide-condition that is currently true, or a show-condition that is not. The game never says which, and the rows carry a 锁 description for some of the third case.

The two second layers

The three or four buttons you first see — 交谈, 交互, 交易, 行为 — are a row of buttons. Choosing one opens a different kind of thing:

Both are reversed by the same call — RoleInteract.ActivateInteracts(true) — which is what the form's own backdrop is wired to on a first press. Anything that reverses only one of them will appear to work until you take the other route.

Choosing 交谈 closes the menu

InteractWithNpc keeps the interaction alive for a short list of types — 赠送, 传送, 情分索要, 厨事, 巧取, 谈论, 地会 — and calls DisableInteract for everything else, 交谈 included. So after a chat there is no menu behind it to step back to: the game took it down when you chose.

The gift picker is a separate view, and its exit leaves

The picker is InteractOther, and its 容我再想想 calls RoleInteract.DisableInteract — it leaves the conversation outright rather than stepping back a layer. The pane describing the item you hover is a third view again, held by a field on the picker, which is why hiding the picker alone can leave a page of item text standing over the world.

Where the interaction menu lives

Not in a panel of its own: it is drawn inside the world HUD's form. Anything that reasons about "the top form" will conclude that no panel is open while you are standing in a conversation.