Approval Request
The consent step for the three diplomatic changes that bind two factions — war, alliance, and vassalisation.
Some actions inside a Faction cannot be taken by one player alone. An approval request is the pending state between a proposal and its acceptance.
Exactly three types
WAR, ALLY, VASSALIZE — and each is a Faction Relationship transition. That the enum has no fourth member is the point: every action that binds two independent groups of players goes through this mechanism, and everything else in the plugin is unilateral.
Why war needs approval
Alliance and vassalisation obviously require the other side's consent. War is the interesting case, and the design treats it as a mutual state rather than something one faction inflicts on another. A faction cannot be dragged into a war it has not accepted — which is what makes the neutral Faction Flag and the pvp.warRequiredForPlayersOfDifferentFactions setting meaningful rather than trivially bypassable.
Localised by construction
Each type carries a languageKey rather than a display string. The pattern appears throughout the plugin: domain enums know their language key, and the language file supplies the words. It keeps translations out of the domain model and means adding a locale never touches Kotlin.
Related
The request itself is short-lived state held by MfApprovalRequestService and addressed through an Value Class Identifier, like every other record in the plugin.