Structs Action Definitions

Version: 1.1.0 Category: actions Description: Complete catalog of all game actions/commands for AI agents


Action Categories

Category Actions
construction MsgStructBuild, MsgStructBuildInitiate, MsgStructBuildComplete
combat MsgStructAttack, MsgPlanetRaidComplete
resource MsgReactorInfuse, MsgReactorDefuse, MsgReactorBeginMigration, MsgReactorCancelDefusion, MsgAllocationCreate, MsgAllocationUpdate, MsgAllocationDelete, MsgAllocationTransfer, MsgSubstationAllocationConnect, MsgSubstationCreate, MsgSubstationPlayerConnect, MsgStructOreMinerComplete, MsgStructOreRefineryComplete
economic MsgProviderCreate, MsgAgreementOpen, MsgStructGeneratorInfuse
exploration MsgPlanetExplore
fleet MsgFleetMove
guild MsgGuildCreate, MsgGuildMembershipJoin, MsgGuildMembershipKick, MsgGuildMembershipJoinProxy, MsgGuildBankMint, MsgGuildBankRedeem
ugc MsgPlayerUpdateName, MsgPlayerUpdatePfp, MsgPlayerUpdatePfpClientRenderAttributes, MsgGuildUpdateName, MsgGuildUpdatePfp, MsgPlanetUpdateName, MsgSubstationUpdateName, MsgSubstationUpdatePfp
struct-management MsgStructActivate, MsgStructDeactivate, MsgStructDeactivateBatch, MsgStructTrash, MsgStructStealthActivate, MsgStructStealthDeactivate, MsgStructDefenseSet, MsgStructDefenseClear, MsgStructMove

Common Requirements

Requirement Description
playerOnline player must be online (capacity covers load)
sufficientResources Player must have sufficient resources
sufficientCharge Acting player must have sufficient charge (charge is a single per-player bar, not per-struct)
proofOfWork Action requires proof-of-work computation
validLocation Location must be valid and accessible
validTarget Target must be valid and attackable

Transaction Flow

  1. Build transaction with message(s)
  2. Sign transaction with player key
  3. Submit to POST /cosmos/tx/v1beta1/txs
  4. Transaction moves to ‘broadcast’ status
  5. On-chain validation occurs (checks requirements)
  6. Action succeeds OR fails based on validation
  7. Query game state to verify action actually occurred
  8. If action didn’t occur, check requirements and retry

IMPORTANT: Transaction status ‘broadcast’ does NOT mean action succeeded! Validation happens on-chain after broadcast. Always verify game state to confirm action occurred.

Common Validation Failures:

See patterns/validation-patterns.md for detailed validation patterns.


Construction Actions

MsgStructBuild

Required Fields: creator, structType, locationType, locationId Optional Fields: gridAttributes Follow-Up Action: MsgStructBuildComplete

Requirement Details
playerOnline true
sufficientResources true
validLocation true
commandShipOnline If building on planet: Command Ship must be built AND online in fleet. Check: query fleet for Command Ship struct, verify status is ‘online’.
fleetOnStation If building on planet: fleet must be ‘onStation’ (not ‘away’). Check: query fleet status.
sufficientPower Must have power capacity > struct passive draw. Check: query player power capacity vs struct requirements.

Transaction may broadcast but struct not created if requirements not met. Always verify game state after broadcast.

{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgStructBuild",
        "creator": "structs1...",
        "structType": "1",
        "locationType": 1,
        "locationId": "1-1"
      }
    ]
  }
}

MsgStructBuildInitiate

Required Fields: creator, playerId, structTypeId, operatingAmbit, slot Follow-Up Action: MsgStructBuildComplete

Requirement Details
playerOnline true
sufficientResources true
validLocation true
sufficientPower true
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgStructBuildInitiate",
        "creator": "structs1...",
        "playerId": "1-1",
        "structTypeId": "1",
        "operatingAmbit": 1,
        "slot": 1
      }
    ]
  }
}

MsgStructBuildComplete

Required Fields: creator, structId, hash, nonce

Requirement Details
playerOnline true
structInBuildingState true
proofOfWork true
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgStructBuildComplete",
        "creator": "structs1...",
        "structId": "1-1",
        "hash": "proof-of-work-hash",
        "nonce": "proof-of-work-nonce"
      }
    ]
  }
}

Combat Actions

MsgStructAttack

Required Fields: creator, structId, targetId

Requirement Details
structOnline true (the attacking struct, and its owner, must be online — the attacker’s Command Ship does not need to be online)
sufficientCharge true
validTarget true (the target must be a built struct; an unbuilt struct is rejected with unbuilt and a destroyed struct with destroyed. The target’s online status is irrelevant)
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgStructAttack",
        "creator": "structs1...",
        "structId": "1-1",
        "targetId": "2-1"
      }
    ]
  }
}

MsgPlanetRaidComplete

Required Fields: creator, fleetId, planetId, hash, nonce

Requirement Details
playerOnline true (the raider’s player must be online)
fleetAway true
fleetFirstInLine true
defenderShieldsVulnerable true (defender’s fleet off-station, or their Command Ship offline/destroyed/non-existent; otherwise rejected with shields_active)
raidClockStarted true (blockStartRaid != 0; otherwise raid_clock_unset)
proofOfWork true
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgPlanetRaidComplete",
        "creator": "structs1...",
        "fleetId": "1-1",
        "planetId": "2-1",
        "hash": "proof-of-work-hash",
        "nonce": "proof-of-work-nonce"
      }
    ]
  }
}

Resource Actions

MsgReactorInfuse

This action abstracts validation delegation. When used for staking, it delegates validation stake to a validator. Reactor staking is managed at the player level, not reactor level.

Required Fields: creator, reactorId, amount

Requirement Details
playerOnline true
reactorExists true
sufficientAlphaMatter true

Conversion Rate: 1 gram Alpha Matter (1,000,000 micrograms) = 1,000 watts energy (1,000,000 milliwatts). Code reference: x/structs/types/keys.go (ReactorFuelToEnergyConversion = 1).

{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgReactorInfuse",
        "creator": "structs1...",
        "reactorId": "1-1",
        "amount": "1000000"
      }
    ]
  }
}

MsgReactorDefuse

This action abstracts validation undelegation. Reactor staking is managed at the player level, not reactor level.

Required Fields: creator, reactorId, amount

Requirement Details
playerOnline true
reactorExists true
sufficientFuel true
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgReactorDefuse",
        "creator": "structs1...",
        "reactorId": "1-1",
        "amount": "1000000"
      }
    ]
  }
}

MsgReactorBeginMigration

Required Fields: creator, reactorId

Requirement Details
playerOnline true
reactorExists true
hasActiveDelegation true
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgReactorBeginMigration",
        "creator": "structs1...",
        "reactorId": "3-1"
      }
    ]
  }
}

MsgReactorCancelDefusion

Required Fields: creator, reactorId

Requirement Details
playerOnline true
reactorExists true
inUndelegationPeriod true
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgReactorCancelDefusion",
        "creator": "structs1...",
        "reactorId": "3-1"
      }
    ]
  }
}

MsgSubstationAllocationConnect

Required Fields: creator, allocationId, destinationId

Requirement Details
playerOnline true
validAllocation true
validDestination true
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgSubstationAllocationConnect",
        "creator": "structs1...",
        "allocationId": "6-1",
        "destinationId": "4-1"
      }
    ]
  }
}

MsgSubstationCreate

Required Fields: creator, planetId

Requirement Details
playerOnline true
planetOwned true
validLocation true
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgSubstationCreate",
        "creator": "structs1...",
        "planetId": "2-1"
      }
    ]
  }
}

MsgSubstationPlayerConnect

Required Fields: creator, substationId

Effects: Player gains capacitySecondary from the substation’s connectionCapacity.

Requirement Details
playerOnline true
substationExists true
validConnection true
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgSubstationPlayerConnect",
        "creator": "structs1...",
        "substationId": "1-1"
      }
    ]
  }
}

MsgStructOreMinerComplete

Required Fields: creator, structId, proof, nonce

Requirement Details
playerOnline true
structOnline true
planetHasOre true
sufficientCharge Charge >= structType.OreMiningCharge
proofOfWork HashBuildAndCheckDifficulty with OreMiningDifficulty (14000)

Effects: StoredOreIncrement(1) – fixed 1 ore per operation. Also resets blockStartOreMine to the current block — the cycle auto-restarts and the next mine begins immediately with no further action (re-entering the full difficulty decay).

{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgStructOreMinerComplete",
        "creator": "structs1...",
        "structId": "1-1",
        "proof": "proof-of-work-hash",
        "nonce": "proof-of-work-nonce"
      }
    ]
  }
}

MsgStructOreRefineryComplete

Required Fields: creator, structId, proof, nonce

Requirement Details
playerOnline true
structOnline true
hasStoredOre true
sufficientCharge Charge >= structType.OreRefiningCharge
proofOfWork HashBuildAndCheckDifficulty with OreRefiningDifficulty (28000)

Effects:

{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgStructOreRefineryComplete",
        "creator": "structs1...",
        "structId": "1-1",
        "proof": "proof-of-work-hash",
        "nonce": "proof-of-work-nonce"
      }
    ]
  }
}

Economic Actions

MsgProviderCreate

Required Fields: creator, rate, policy

Requirement Details
playerOnline true
validRate true
validPolicy true
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgProviderCreate",
        "creator": "structs1...",
        "rate": {},
        "policy": {}
      }
    ]
  }
}

MsgAgreementOpen

Required Fields: creator, providerId, duration, capacity

Requirement Details
playerOnline true
validProvider true
providerHasCapacity true
sufficientFunds Buyer holds rate × capacity × duration in the provider’s rate_denom

Escrow effect (x/structs/keeper/msg_server_agreement_open.go): the full cost rate × capacity × duration is debited in full at open (not metered per block) and moved to the provider’s collateral pool; it then drips to the provider’s earnings as blocks pass. The charge is denominated in the provider’s rate_denom, not alpha — if the provider prices in a guild token, a buyer holding only ualpha is rejected at broadcast with an insufficient-funds error keyed agreement_open (surface rawLog for the missing denom). Acquire the correct denom before opening.

{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgAgreementOpen",
        "creator": "structs1...",
        "providerId": "10-1",
        "duration": "100000",
        "capacity": "50000"
      }
    ]
  }
}

MsgStructGeneratorInfuse

Required Fields: creator, structId, infuseAmount

Requirement Details
playerOnline true
generatorOnline true
sufficientAlphaMatter true

Generator Types:

Generator Rate Formula
Field Generator 2 Energy (kW) = Alpha Matter (grams) x 2
Continental Power Plant 5 Energy (kW) = Alpha Matter (grams) x 5
World Engine 10 Energy (kW) = Alpha Matter (grams) x 10

Energy Properties: Energy is ephemeral – must be consumed immediately upon production, cannot be stored. Energy is shared across all Structs connected to the same power source.

{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgStructGeneratorInfuse",
        "creator": "structs1...",
        "structId": "20-1",
        "infuseAmount": "100000000ualpha"
      }
    ]
  }
}

Note: infuseAmount is a coin string in micrograms (100 grams = 100,000,000 micrograms). The ualpha denom is required — the handler parses the field with ParseCoinsNormalized and rejects a bare number.


Exploration Actions

MsgPlanetExplore

Required Fields: creator, playerId

Optional Fields: name — planet display name (validated before explore; same rules as MsgPlanetUpdateName)

Requirement Details
playerOnline true
currentPlanetEmpty Only enforced if the player already owns a planet — current planet must have 0 ore remaining (all ore mined). New players exploring for the first time are exempt.
fleetOnStation Only enforced if the player already owns a planet — fleet must be onStation at the current planet (not away). New players have no current planet, so this check is skipped. The chain rejects with fleet must be onStation to explore if violated.

Transaction may broadcast but planet ownership unchanged if requirements are not met. Always verify game state after broadcast.

Result:

Planet Starting Properties:

Property Value
maxOre 5
spaceSlots 4
airSlots 4
landSlots 4
waterSlots 4
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgPlanetExplore",
        "creator": "structs1...",
        "playerId": "1-42",
        "name": "MyPlanet"
      }
    ]
  }
}

Fleet Actions

MsgFleetMove

Required Fields: creator, fleetId, destinationType, destinationId

Requirement Details
playerOnline true
commandShipOnline Command Ship must be online in fleet
validDestination Destination must exist and be accessible

Fleet Status:

Status Description Can Build Can Raid
onStation Fleet is at planet Yes No
away Fleet is away from planet No Yes
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgFleetMove",
        "creator": "structs1...",
        "fleetId": "1-1",
        "destinationType": 1,
        "destinationId": "2-1"
      }
    ]
  }
}

Guild Actions

MsgGuildCreate

Required Fields: creator, reactorId, endpoint, entrySubstationId

Requirement Details
playerOnline true
permReactorGuildCreate Requires PermReactorGuildCreate (524288) on the reactor
permSubstationConnection Also requires PermSubstationConnection (1024) on the entry substation
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgGuildCreate",
        "creator": "structs1..."
      }
    ]
  }
}

MsgGuildMembershipJoin

Required Fields: creator, guildId

Requirement Details
playerOnline true
notInGuild Player must not already be in a guild
guildExists Guild must exist. Check: query guild by ID.
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgGuildMembershipJoin",
        "creator": "structs1...",
        "guildId": "0-1"
      }
    ]
  }
}

MsgGuildMembershipJoinProxy

Required Fields: creator, address, proofPubKey, proofSignature Optional Fields: substationId (override the guild’s default entry substation), playerName (set new player’s name immediately), playerPfp (set new player’s pfp immediately)

Requirement Details
permGuildMembership Caller needs PermGuildMembership (512) on the guild
permSubstationConnection Also PermSubstationConnection (1024) on the substation if substationId is set
validProof proofPubKey and proofSignature must derive to address (secp256k1 sign-of-pubkey self-proof)
validPlayerName If playerName is set, must satisfy ValidatePlayerName (3-20 runes, ^[\p{L}0-9\-_]{3,20}$, NFC, no combining/bidi/object-id-shaped)
validPlayerPfp If playerPfp is set, must satisfy ValidatePfp (see UGC actions)

Self-proof construction: Sign the secp256k1 compressed pubkey bytes with the corresponding private key; submit the signature as proofSignature. The chain rederives the address from proofPubKey and rejects mismatches.

{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgGuildMembershipJoinProxy",
        "creator": "structs1moderator...",
        "address": "structs1newplayer...",
        "proofPubKey": "Aqg...base64...",
        "proofSignature": "MEU...base64...",
        "substationId": "4-3",
        "playerName": "Andromeda7",
        "playerPfp": "ipfs://bafy..."
      }
    ]
  }
}

MsgGuildMembershipKick

Required Fields: creator, guildId, playerId

Requirement Details
playerOnline true
inGuild The target player must be in the guild. Check: query player.guildId matches guildId.
permission Removing another member requires the appropriate guild rank permission on the guild.
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgGuildMembershipKick",
        "creator": "structs1...",
        "guildId": "0-1",
        "playerId": "1-11"
      }
    ]
  }
}

MsgGuildBankMint

Required Fields: creator, guildId, amount

Requirement Details
playerOnline true
inGuild Player must be in the guild
guildPermission Player must have permission to mint tokens. Trust-based system – no technical safeguards against revocation or inflation.
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgGuildBankMint",
        "creator": "structs1...",
        "guildId": "0-1",
        "amount": "1000000"
      }
    ]
  }
}

MsgGuildBankRedeem

Required Fields: creator, guildId, amount

Requirement Details
playerOnline true
inGuild Player must be in the guild
sufficientTokens Player must have sufficient guild tokens
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgGuildBankRedeem",
        "creator": "structs1...",
        "guildId": "0-1",
        "amount": "1000000"
      }
    ]
  }
}

MsgGuildUpdateEntryRank

Required Fields: creator, newEntryRank

Requirement Details
permUpdate Requires PermUpdate (4) on the guild
rankConstraint New entry rank must be >= caller’s own rank

MsgPlayerUpdateGuildRank

Required Fields: creator, playerId, guildRank

Requirement Details
permAdmin Requires PermAdmin (2) on the guild; falls back to rank-based authority (actor rank must be strictly better than target’s current rank)

MsgPlayerSend

Required Fields: creator, fromAddress, toAddress, amount

Requirement Details
permTokenTransfer Requires PermTokenTransfer (16) on the player

MsgPermissionGuildRankSet

Required Fields: creator, objectId, guildId, permission, rank

Requirement Details
callerHasPermission Caller must already have the specified permission on the object

MsgPermissionGuildRankRevoke

Required Fields: creator, objectId, guildId, permission

Requirement Details
callerHasPermission Caller must already have the specified permission on the object

UGC Actions

User-generated content (name and pfp) updates. All seven messages are part of the free-gas Structs path. The Update*Name and Update*Pfp messages on player, planet, and substation route through UGCPermissionCheck (self-service via PermUpdate on the target, OR guild moderation via PermGuildUGCUpdate on the target owner’s guild). Guild rename/repfp uses the standard PermissionCheck with PermUpdate on the guild itself. Validation is enforced by types.ValidatePlayerName / ValidateEntityName / ValidatePlanetName / ValidatePfp (see schemas/validation.md and knowledge/mechanics/ugc-moderation.md). When the actor is not the target’s owner, the chain emits a ugc_moderated event.

MsgPlayerUpdateName

Required Fields: creator, playerId, name

Requirement Details
permission PermUpdate (4) on the player OR PermGuildUGCUpdate (16777216) on the player’s guild
validName Must satisfy ValidatePlayerName (3-20 runes after NFC, ^[\p{L}0-9\-_]{3,20}$, no spaces, apostrophes, combining marks, bidi/zero-width, or object-id-shaped strings)

MsgPlayerUpdatePfp

Required Fields: creator, playerId, pfp

Requirement Details
permission PermUpdate (4) on the player OR PermGuildUGCUpdate (16777216) on the player’s guild
validPfp Must satisfy ValidatePfp (empty string clears; otherwise <=256 runes, no control/bidi/whitespace/<>"\\ chars; no : -> ^[A-Za-z0-9._/\-]{1,256}$; with : -> scheme in {https, http, ipfs, ipns, ar} and parses cleanly)

MsgPlayerUpdatePfpClientRenderAttributes

Required Fields: creator, playerId, pfpClientRenderAttributes

Requirement Details
permission PermUpdate (4) on the player (self-service only; does not route through UGCPermissionCheck)
validAttributes Must satisfy ValidatePfpClientRenderAttributes (empty string clears; otherwise a JSON object <=512 bytes, stored compacted; arrays/scalars/malformed JSON rejected)

MsgGuildUpdateName

Required Fields: creator, guildId, name

Requirement Details
permission PermUpdate (4) on the guild
validName Must satisfy ValidateEntityName (3-20 runes after NFC, ^[\p{L}0-9\-_' ]{3,20}$, no leading/trailing spaces, no double space, no combining marks, no bidi/zero-width, not object-id-shaped)
uniqueness Names must be unique under NormalizeName (NFC + lowercase + trim) — chain rejects duplicates

MsgGuildUpdatePfp

Required Fields: creator, guildId, pfp

Requirement Details
permission PermUpdate (4) on the guild
validPfp Must satisfy ValidatePfp (see player-update-pfp)

MsgGuildUpdatePrimaryReactor

Required Fields: creator, guildId, reactorId

Requirement Details
permission PermAdmin (2) on the guild
validator Target reactor’s validator must exist and not be jailed

MsgPlanetUpdateName

Required Fields: creator, planetId, name

Requirement Details
permission PermUpdate (4) on the planet OR PermGuildUGCUpdate (16777216) on the planet owner’s guild
validName Must satisfy ValidatePlanetName (3-25 runes after NFC, ^[\p{L}0-9\-_' ]{3,25}$, no leading/trailing spaces, no double space, no combining marks, no bidi/zero-width, not object-id-shaped)

MsgSubstationUpdateName

Required Fields: creator, substationId, name

Requirement Details
permission PermUpdate (4) on the substation OR PermGuildUGCUpdate (16777216) on the substation owner’s guild
validName Must satisfy ValidateEntityName

MsgSubstationUpdatePfp

Required Fields: creator, substationId, pfp

Requirement Details
permission PermUpdate (4) on the substation OR PermGuildUGCUpdate (16777216) on the substation owner’s guild
validPfp Must satisfy ValidatePfp

Struct Management Actions

MsgStructActivate

Required Fields: creator, structId

Requirement Details
playerOnline true
structBuilt true
structOffline true
sufficientCharge Charge >= structType.ActivateCharge
sufficientPower Available capacity >= structType.PassiveDraw

Effects:

{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgStructActivate",
        "creator": "structs1...",
        "structId": "1-1"
      }
    ]
  }
}

MsgStructDeactivate

Required Fields: creator, structId

Requirement Details
permission Caller holds PermPlay on the struct (owner passes automatically)
structBuilt true
structOnline true

Deactivate does not require the player to be online and costs no charge — it is a recovery action, so an overloaded (offline) player can always deactivate structs to get back under capacity.

Effects:

{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgStructDeactivate",
        "creator": "structs1...",
        "structId": "1-1"
      }
    ]
  }
}

MsgStructDeactivateBatch

Required Fields: creator, structId (a list of struct IDs)

Requirement Details
batchSize 1..=65 (MaxStructDeactivateBatchSize); empty or duplicate IDs are rejected
perStruct Each struct must pass the same checks as MsgStructDeactivate (PermPlay, built, online)

The batch is validated in full before any struct is deactivated — if any struct is ineligible the whole transaction fails and nothing changes. Same effects as MsgStructDeactivate, applied to each struct. No charge cost, no player-online requirement.

{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgStructDeactivateBatch",
        "creator": "structs1...",
        "structId": ["1-1", "1-2", "1-3"]
      }
    ]
  }
}

MsgStructTrash

Required Fields: creator, structId

Requirement Details
permission Caller holds PermPlay on the struct (owner passes automatically)
structNotDestroyed The struct must not already be destroyed
sufficientCharge Owner charge >= structType.BuildCharge (trashing costs the same charge as building)

Effects:

Use this to reclaim a slot occupied by an unwanted built struct. To abort an unfinished build instead, use MsgStructBuildCancel.

{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgStructTrash",
        "creator": "structs1...",
        "structId": "1-1"
      }
    ]
  }
}

MsgStructStealthActivate

Required Fields: creator, structId

Requirement Details
playerOnline true
structCommandable true
structNotHidden true
hasStealthSystem Struct must have stealth system
sufficientCharge Charge >= structType.StealthActivateCharge

Effects:

{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgStructStealthActivate",
        "creator": "structs1...",
        "structId": "1-1"
      }
    ]
  }
}

MsgStructStealthDeactivate

Required Fields: creator, structId

Requirement Details
playerOnline true
structCommandable true
structHidden true
hasStealthSystem true

Effects: Removes hidden status from struct.

{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgStructStealthDeactivate",
        "creator": "structs1...",
        "structId": "1-1"
      }
    ]
  }
}

MsgStructDefenseSet

Required Fields: creator, defenderStructId, protectedStructId

Requirement Details
playerOnline true
defenderExists true
protectedExists true
sameAmbit Defender and protected must be in same ambit for full blocking
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgStructDefenseSet",
        "creator": "structs1...",
        "defenderStructId": "1-1",
        "protectedStructId": "2-1"
      }
    ]
  }
}

MsgStructDefenseClear

Required Fields: creator, defenderStructId

Requirement Details
playerOnline true
defenderExists true
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgStructDefenseClear",
        "creator": "structs1...",
        "defenderStructId": "1-1"
      }
    ]
  }
}

MsgStructMove

Required Fields: creator, structId, locationType, ambit, slot

Requirement Details
playerOnline true
structBuilt true
validLocation true
{
  "body": {
    "messages": [
      {
        "@type": "/structs.structs.MsgStructMove",
        "creator": "structs1...",
        "structId": "1-1",
        "locationType": 1,
        "ambit": 1,
        "slot": 1
      }
    ]
  }
}

Verification

Field Value
Verified true
Verified By GameCodeAnalyst
Verified Date 2025-01-XX
Method code-analysis
Confidence high
Total Actions 30
Verified Actions 30
Percentage 100%
Note All documented actions verified against codebase. Additional actions exist in proto file but not yet documented.