rooms

package
v0.0.1-test Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 13, 2025 License: GPL-3.0 Imports: 29 Imported by: 0

Documentation

Index

Constants

View Source
const (
	AffectsNone   = ""
	AffectsPlayer = "player" // Does it affect only the player who triggered it?
	AffectsRoom   = "room"   // Does it affect everyone in the room?

	// Useful for finding mobs/players
	FindCharmed        FindFlag = 0b00000000001 // charmed
	FindNeutral        FindFlag = 0b00000000010 // Not aggro, not charmed, not Hostile
	FindFightingPlayer FindFlag = 0b00000000100 // aggro vs. a player
	FindFightingMob    FindFlag = 0b00000001000 // aggro vs. a mob
	FindHostile        FindFlag = 0b00000010000 // will auto-attack players
	FindMerchant       FindFlag = 0b00000100000 // is a merchant
	FindDowned         FindFlag = 0b00001000000 // hp < 1
	FindBuffed         FindFlag = 0b00010000000 // has a buff
	FindHasLight       FindFlag = 0b00100000000 // has a light source
	FindHasPet         FindFlag = 0b01000000000 // has a pet
	FindNative         FindFlag = 0b10000000000 // spawns in this room

	// Combinatorial flags
	FindFighting          = FindFightingPlayer | FindFightingMob // Currently in combat (aggro)
	FindIdle              = FindCharmed | FindNeutral            // Not aggro or hostile
	FindAll      FindFlag = 0b111111111
	// Visitor types
	VisitorUser = "user"
	VisitorMob  = "mob"
)
View Source
const (
	StartRoomIdAlias = 0
)

Variables

View Source
var (
	AllBiomes = map[string]BiomeInfo{
		`city`: {
			// contains filtered or unexported fields
		},
		`fort`: {
			// contains filtered or unexported fields
		},
		`road`: {
			// contains filtered or unexported fields
		},
		`house`: {
			// contains filtered or unexported fields
		},
		`shore`: {
			// contains filtered or unexported fields
		},
		`water`: {
			// contains filtered or unexported fields
		},
		`forest`: {
			// contains filtered or unexported fields
		},
		`mountains`: {
			// contains filtered or unexported fields
		},
		`cliffs`: {
			// contains filtered or unexported fields
		},
		`swamp`: {
			// contains filtered or unexported fields
		},
		`snow`: {
			// contains filtered or unexported fields
		},
		`spiderweb`: {
			// contains filtered or unexported fields
		},
		`cave`: {
			// contains filtered or unexported fields
		},
		`desert`: {
			// contains filtered or unexported fields
		},
		`farmland`: {
			// contains filtered or unexported fields
		},
	}
)
View Source
var (
	MapSymbolOverrides = map[string]string{
		"*": defaultMapSymbol,
	}
)

Functions

func ClearRoomCache

func ClearRoomCache(roomId int) error

Deletes any knowledge of a room in memory. Loading this room after the fact will trigger full re-loading and caching of room data.

func ConnectRoom

func ConnectRoom(fromRoomId int, toRoomId int, exitName string, mapDirection ...string) error

#build exit north 1337 Build an exit in the current room that links to room by id You still need to visit that room and connect it the opposite way

func CreateEphemeralRoomIds

func CreateEphemeralRoomIds(roomIds ...int) (map[int]int, error)

accepts RoomId's as arguments, and creates ephemeral copies of them, returning the new ID's of the copies.

func CreateEphemeralZone

func CreateEphemeralZone(zoneName string) (map[int]int, error)

accepts RoomId's as arguments, and creates ephemeral copies of them, returning the new ID's of the copies.

func CreateZone

func CreateZone(zoneName string) (roomId int, err error)

#build zone The Arctic Build a zone, popualtes with an empty boring room

func EphemeralRoomMaintenance

func EphemeralRoomMaintenance() []int

All this does is unload chunks with no players in them.

func FindZoneName

func FindZoneName(zone string) string

func GetAllRoomIds

func GetAllRoomIds() []int

func GetAllZoneNames

func GetAllZoneNames() []string

func GetAllZoneRoomsIds

func GetAllZoneRoomsIds(zoneName string) []int

func GetChunkCount

func GetChunkCount() int

func GetMemoryUsage

func GetMemoryUsage() map[string]util.MemoryResult

func GetNextRoomId

func GetNextRoomId() int

func GetOriginalRoom

func GetOriginalRoom(roomId int) int

func GetRoomCount

func GetRoomCount(zoneName string) int

func GetRoomWithMostItems

func GetRoomWithMostItems(skipRecentlyVisited bool, minimumItemCt int, minimumGoldCt int) (roomId int, itemCt int)

skipRecentlyVisited means ignore rooms with recent visitors minimumItemCt is the minimum items in the room to care about it

func GetRoomsWithMobs

func GetRoomsWithMobs() []int

func GetRoomsWithPlayers

func GetRoomsWithPlayers() []int

func GetZoneBiome

func GetZoneBiome(zone string) string

func GetZoneRoot

func GetZoneRoot(zone string) (int, error)

func GetZonesWithMutators

func GetZonesWithMutators() ([]string, []int)

func IsEphemeralRoomId

func IsEphemeralRoomId(roomId int) bool

func IsRoomLoaded

func IsRoomLoaded(roomId int) bool

func LoadDataFiles

func LoadDataFiles()

func MoveToRoom

func MoveToRoom(userId int, toRoomId int, isSpawn ...bool) error

func MoveToZone

func MoveToZone(roomId int, newZoneName string) error

func RoomMaintenance

func RoomMaintenance() []int

func SaveAllRooms

func SaveAllRooms() error

func SaveRoomInstance

func SaveRoomInstance(r Room) error

See: D. SAVING ROOMS INSTANCES

func SaveRoomTemplate

func SaveRoomTemplate(roomTpl Room) error

See C. UPDATING EXISTING ROOM TEMPLATES

func SetNextRoomId

func SetNextRoomId(nextRoomId int)

func TryEphemeralCleanup

func TryEphemeralCleanup(ephemeralRoomId int) []int

func ValidateZoneName

func ValidateZoneName(zone string) error

func ZoneNameSanitize

func ZoneNameSanitize(zone string) string

func ZoneStats

func ZoneStats(zone string) (rootRoomId int, totalRooms int, err error)

func ZoneToFolder

func ZoneToFolder(zone string) string

Types

type BiomeInfo

type BiomeInfo struct {
	// contains filtered or unexported fields
}

func GetAllBiomes

func GetAllBiomes() []BiomeInfo

func GetBiome

func GetBiome(name string) (BiomeInfo, bool)

func (BiomeInfo) Burns

func (bi BiomeInfo) Burns() bool

func (BiomeInfo) Description

func (bi BiomeInfo) Description() string

func (BiomeInfo) IsDark

func (bi BiomeInfo) IsDark() bool

func (BiomeInfo) IsLit

func (bi BiomeInfo) IsLit() bool

func (BiomeInfo) Name

func (bi BiomeInfo) Name() string

func (BiomeInfo) RequiredItemId

func (bi BiomeInfo) RequiredItemId() int

func (BiomeInfo) Symbol

func (bi BiomeInfo) Symbol() rune

func (BiomeInfo) SymbolString

func (bi BiomeInfo) SymbolString() string

func (BiomeInfo) UsesItem

func (bi BiomeInfo) UsesItem() bool

type Container

type Container struct {
	Lock         gamelock.Lock `yaml:"lock,omitempty"`         // 0 - no lock. greater than zero = difficulty to unlock.
	Items        []items.Item  `yaml:"items,omitempty"`        // Save contents now, since players can put new items in there
	Gold         int           `yaml:"gold,omitempty"`         // Save contents now, since players can put new items in there
	DespawnRound uint64        `yaml:"despawnround,omitempty"` // If this is set, it's a chest that will disappear with time.
	Recipes      map[int][]int `yaml:"recipes,omitempty,flow"` // Item Id's (key) that are created when the recipe is present in the container (values) and it is "used"
}

func (*Container) AddItem

func (c *Container) AddItem(i items.Item)

func (*Container) Count

func (c *Container) Count(itemId int) int

func (*Container) FindItem

func (c *Container) FindItem(itemName string) (items.Item, bool)

func (*Container) FindItemById

func (c *Container) FindItemById(itemId int) (items.Item, bool)

func (Container) HasLock

func (c Container) HasLock() bool

func (*Container) RecipeReady

func (c *Container) RecipeReady() int

Returns an itemId if it can produce one based on contents + recipe

func (*Container) RemoveItem

func (c *Container) RemoveItem(i items.Item)

type Corpse

type Corpse struct {
	UserId       int
	MobId        int
	Character    characters.Character
	RoundCreated uint64
	Prunable     bool // Whether it can be removed
}

func (*Corpse) Update

func (c *Corpse) Update(roundNow uint64, decayRate string)

type FindFlag

type FindFlag uint16

type Room

type Room struct {
	//mutex
	RoomId            int                               `yaml:"roomid"`                               // a unique numeric index of the room. Also the filename.
	Zone              string                            `yaml:"zone"`                                 // zone is a way to partition rooms into groups. Also into folders.
	ZoneConfig        ZoneConfig                        `yaml:"zoneconfig,omitempty" instance:"skip"` // If non-null is a root room.
	MusicFile         string                            `yaml:"musicfile,omitempty"`                  // background music to play when in this room
	IsBank            bool                              `yaml:"isbank,omitempty"`                     // Is this a bank room? If so, players can deposit/withdraw gold here.
	IsStorage         bool                              `yaml:"isstorage,omitempty"`                  // Is this a storage room? If so, players can add/remove objects here.
	IsCharacterRoom   bool                              `yaml:"ischaracterroom,omitempty"`            // Is this a room where characters can create new characters to swap between them?
	Title             string                            `yaml:"title"`                                // Title shown to the user
	Description       string                            `yaml:"description"`                          // Description shown to the user
	MapSymbol         string                            `yaml:"mapsymbol,omitempty"`                  // The symbol to use when generating a map of the zone
	MapLegend         string                            `yaml:"maplegend,omitempty"`                  // The text to display in the legend for this room. Should be one word.
	Biome             string                            `yaml:"biome,omitempty"`                      // The biome of the room. Used for weather generation.
	Containers        map[string]Container              `yaml:"containers,omitempty"`                 // If this room has a chest, what is in it?
	Exits             map[string]exit.RoomExit          `yaml:"exits"`                                // Exits to other rooms
	ExitsTemp         map[string]exit.TemporaryRoomExit `yaml:"-"`                                    // Temporary exits that will be removed after a certain time. Don't bother saving on sever shutting down.
	Nouns             map[string]string                 `yaml:"nouns,omitempty"`                      // Interesting nouns to highlight in the room or reveal on succesful searches.
	Items             []items.Item                      `yaml:"items,omitempty"`                      // Items on the floor
	Stash             []items.Item                      `yaml:"stash,omitempty"`                      // list of items in the room that are not visible to players
	Corpses           []Corpse                          `yaml:"-"`                                    // Any corpses laying around from recent deaths
	Gold              int                               `yaml:"gold,omitempty"`                       // How much gold is on the ground?
	SpawnInfo         []SpawnInfo                       `yaml:"spawninfo,omitempty" instance:"skip"`  // key is creature ID, value is spawn chance
	SkillTraining     map[string]TrainingRange          `yaml:"skilltraining,omitempty"`              // list of skills that can be trained in this room
	Signs             []Sign                            `yaml:"sign,omitempty"`                       // list of scribbles in the room
	IdleMessages      []string                          `yaml:"idlemessages,omitempty" `              // list of messages that can be displayed to players in the room
	LastIdleMessage   uint8                             `yaml:"-"`                                    // index of the last idle message displayed
	LongTermDataStore map[string]any                    `yaml:"longtermdatastore,omitempty"`          // Long term data store for the room
	Mutators          mutators.MutatorList              `yaml:"mutators,omitempty"`                   // mutators this room spawns with.
	Pvp               bool                              `yaml:"pvp,omitempty"`                        // if config pvp is set to `limited`, uses this value
	// contains filtered or unexported fields
}

func BuildRoom

func BuildRoom(fromRoomId int, exitName string, mapDirection ...string) (room *Room, err error)

#build room north Build a room to a specific direction, and connect it by exit name You still need to visit that room and connect it the opposite way

func LoadRoom

func LoadRoom(roomId int) *Room

See: A. LOADING ROOMS BLINDLY

func LoadRoomInstance

func LoadRoomInstance(roomId int) *Room

See: B. LOADING ROOMS FROM FILES

func LoadRoomTemplate

func LoadRoomTemplate(roomId int) *Room

Only loads the template data, ignores instance data.

func NewRoom

func NewRoom(zone string) *Room

func (*Room) ActiveMutators

func (r *Room) ActiveMutators(yield func(mutators.Mutator) bool)

func (*Room) AddCorpse

func (r *Room) AddCorpse(c Corpse)

func (*Room) AddItem

func (r *Room) AddItem(item items.Item, stash bool)

func (*Room) AddMob

func (r *Room) AddMob(mobInstanceId int)

func (*Room) AddPlayer

func (r *Room) AddPlayer(userId int) int

func (*Room) AddSign

func (r *Room) AddSign(displayText string, visibleUserId int, daysBeforeDecay int) bool

Returns true if a sign was replaced

func (*Room) AddTemporaryExit

func (r *Room) AddTemporaryExit(exitName string, t exit.TemporaryRoomExit) bool

Can't add twoof the same exitName Will return false if it already exists

func (*Room) ApplyBuffIdToMobs

func (r *Room) ApplyBuffIdToMobs(buffIds []int, source string)

applies buffs to any mobs in the room that don't already have it

func (*Room) ApplyBuffIdToNativeMobs

func (r *Room) ApplyBuffIdToNativeMobs(buffIds []int, source string)

applies buffs to any mobs in the room that don't already have it

func (*Room) ApplyBuffIdToPlayers

func (r *Room) ApplyBuffIdToPlayers(buffIds []int, source string)

applies buffs to any players in the room that don't already have it

func (*Room) AreMobsAttacking

func (r *Room) AreMobsAttacking(userId int) bool

func (*Room) ArePlayersAttacking

func (r *Room) ArePlayersAttacking(userId int) bool

func (*Room) CanPvp

func (r *Room) CanPvp(attUser *users.UserRecord, defUser *users.UserRecord) error

Returns an error with a reason why they cannot PVP, or nil

func (*Room) CleanupMobSpawns

func (r *Room) CleanupMobSpawns(noCooldown bool)

func (*Room) Filename

func (r *Room) Filename() string

func (*Room) Filepath

func (r *Room) Filepath() string

func (*Room) FindByName

func (r *Room) FindByName(searchName string, findTypes ...FindFlag) (playerId int, mobInstanceId int)

func (*Room) FindByPetName

func (r *Room) FindByPetName(searchName string) (playerId int)

func (*Room) FindContainerByName

func (r *Room) FindContainerByName(containerNameSearch string) string

func (*Room) FindCorpse

func (r *Room) FindCorpse(searchName string) (Corpse, bool)

func (*Room) FindExitByName

func (r *Room) FindExitByName(exitNameSearch string) (exitName string, exitRoomId int)

func (*Room) FindExitTo

func (r *Room) FindExitTo(roomId int) string

Returns exitName, RoomExit

func (*Room) FindNoun

func (r *Room) FindNoun(noun string) (foundNoun string, nounDescription string)

func (*Room) FindOnFloor

func (r *Room) FindOnFloor(itemName string, stash bool) (items.Item, bool)

func (*Room) FindTemporaryExitByUserId

func (r *Room) FindTemporaryExitByUserId(userId int) (exit.TemporaryRoomExit, bool)

func (*Room) GetAllFloorItems

func (r *Room) GetAllFloorItems(stash bool) []items.Item

func (*Room) GetBiome

func (r *Room) GetBiome() BiomeInfo

func (*Room) GetDescription

func (r *Room) GetDescription() string

func (*Room) GetDescriptionFormatted

func (r *Room) GetDescriptionFormatted(lineSplit int, highlightNouns bool) string

func (*Room) GetExitInfo

func (r *Room) GetExitInfo(exitName string) (exitInfo exit.RoomExit, ok bool)

func (*Room) GetLongTermData

func (r *Room) GetLongTermData(key string) any

func (*Room) GetMapSymbol

func (r *Room) GetMapSymbol() string

func (*Room) GetMobs

func (r *Room) GetMobs(findTypes ...FindFlag) []int

func (*Room) GetPlayers

func (r *Room) GetPlayers(findTypes ...FindFlag) []int

func (*Room) GetPrivateSigns

func (r *Room) GetPrivateSigns() []Sign

func (*Room) GetPublicSigns

func (r *Room) GetPublicSigns() []Sign

func (*Room) GetRandomExit

func (r *Room) GetRandomExit() (exitName string, roomId int)

func (*Room) GetScript

func (r *Room) GetScript() string

func (*Room) GetScriptPath

func (r *Room) GetScriptPath() string

func (*Room) GetTempData

func (r *Room) GetTempData(key string) any

func (*Room) GetVisibility

func (r *Room) GetVisibility() int

0 = none (darkness). 1 = can see this room. 2 = can see this room and all exits

func (*Room) HasRecentVisitors

func (r *Room) HasRecentVisitors() bool

func (*Room) HasVisited

func (r *Room) HasVisited(id int, vType VisitorType) bool

func (*Room) Id

func (r *Room) Id() int

func (*Room) IsCalm

func (r *Room) IsCalm() bool

func (*Room) IsEphemeral

func (r *Room) IsEphemeral() bool

func (*Room) IsPvp

func (r *Room) IsPvp() bool

Returns true if Pvp is allowed in this room

func (*Room) MarkVisited

func (r *Room) MarkVisited(id int, vType VisitorType, subtrackTurns ...int)

func (*Room) MobCt

func (r *Room) MobCt() int

func (*Room) PlaySound

func (r *Room) PlaySound(soundId string, category string, excludeUserIds ...int)

func (*Room) PlayerCt

func (r *Room) PlayerCt() int

func (*Room) Prepare

func (r *Room) Prepare(checkAdjacentRooms bool)

The purpose of Prepare() is to ensure a room is properly setup before anyone looks into it or enters it That way if there should be anything in the room prior, it will already be there. For example, mobs shouldn't ENTER the room right as the player arrives, they should already be there.

func (*Room) PruneSigns

func (r *Room) PruneSigns() []Sign

func (*Room) PruneTemporaryExits

func (r *Room) PruneTemporaryExits() []exit.TemporaryRoomExit

func (*Room) PruneVisitors

func (r *Room) PruneVisitors() int

func (*Room) RemoveCorpse

func (r *Room) RemoveCorpse(c Corpse) bool

func (*Room) RemoveItem

func (r *Room) RemoveItem(i items.Item, stash bool)

func (*Room) RemoveMob

func (r *Room) RemoveMob(mobInstanceId int)

func (*Room) RemovePlayer

func (r *Room) RemovePlayer(userId int) (int, bool)

true if found

func (*Room) RemoveTemporaryExit

func (r *Room) RemoveTemporaryExit(t exit.TemporaryRoomExit) bool

func (*Room) RepeatSpawnItem

func (r *Room) RepeatSpawnItem(itemId int, roundFrequency int, containerName ...string) bool

Spawns an item in the room unless: 1. Item is already in the room 2. (optional) Item is currently held by someone in the room 3. item repeat-spawned too recently If containerName is provided, ony that container name will be considered

func (*Room) RoundTick

func (r *Room) RoundTick()

func (*Room) SendText

func (r *Room) SendText(txt string, excludeUserIds ...int)

func (*Room) SendTextCommunication

func (r *Room) SendTextCommunication(txt string, excludeUserIds ...int)

func (*Room) SendTextToExits

func (r *Room) SendTextToExits(txt string, isQuiet bool, excludeUserIds ...int)

func (*Room) SetExitLock

func (r *Room) SetExitLock(exitName string, locked bool)

func (*Room) SetLongTermData

func (r *Room) SetLongTermData(key string, value any)

func (*Room) SetTempData

func (r *Room) SetTempData(key string, value any)

func (*Room) SpawnTempContainer

func (r *Room) SpawnTempContainer(name string, duration string, lockDifficulty int, trapBuffIds ...int) string

func (*Room) UpdateCorpses

func (r *Room) UpdateCorpses(roundNow uint64)

func (*Room) Validate

func (r *Room) Validate() error

func (*Room) Visitors

func (r *Room) Visitors(vType VisitorType) map[int]float64

Returns a list of recent visitors and how cold the trail is getting

type RoomManager

type RoomManager struct {
	// contains filtered or unexported fields
}

func (*RoomManager) GetFilePath

func (r *RoomManager) GetFilePath(roomId int) string

type RoomTemplateDetails

type RoomTemplateDetails struct {
	VisiblePlayers []string
	VisibleMobs    []string
	VisibleCorpses []string
	VisibleExits   map[string]exit.RoomExit
	TemporaryExits map[string]exit.TemporaryRoomExit
	UserId         int
	Character      *characters.Character
	RoomSymbol     string
	RoomLegend     string
	Nouns          []string
	Zone           string
	Title          string
	Description    string
	IsDark         bool
	IsNight        bool
	TrackingString string
	RoomAlerts     []string // Messages to show below room description as a special alert
	ShowPvp        bool     // Whether to display that the room is PVP
}

func GetDetails

func GetDetails(r *Room, user *users.UserRecord, tinymap ...[]string) RoomTemplateDetails

type SaveEqualityChecker

type SaveEqualityChecker interface {
	SkipInstanceSave(other any) bool // Should we skip due to everything looking the same?
}

type Sign

type Sign struct {
	VisibleUserId int       // What user can see it? If 0, then everyone can see it.
	DisplayText   string    // What text to display
	Expires       time.Time // When this sign expires.
}

type SpawnInfo

type SpawnInfo struct {
	MobId        int      `yaml:"mobid,omitempty"`           // Mob template Id to spawn
	InstanceId   int      `yaml:"-"`                         // Mob instance Id that was spawned (tracks whether exists currently)
	Container    string   `yaml:"container,omitempty"`       // If set, any item or gold spawned will go into the container.
	ItemId       int      `yaml:"itemid,omitempty"`          // Item template Id to spawn on the floor
	Gold         int      `yaml:"gold,omitempty"`            // How much gold to spawn on the floor
	Message      string   `yaml:"message,omitempty"`         // (optional) message to display to the room when this creature spawns, instead of a default
	Name         string   `yaml:"name,omitempty"`            // (optional) if set, will override the mob's name
	ForceHostile bool     `yaml:"forcehostile,omitempty"`    // (optional) if true, forces the mob to be hostile.
	MaxWander    int      `yaml:"maxwander,omitempty"`       // (optional) if set, will override the mob's max wander distance
	IdleCommands []string `yaml:"idlecommands,omitempty"`    // (optional) list of commands to override the default of the mob. Useful when you need a mob to be more unique.
	ScriptTag    string   `yaml:"scripttag,omitempty"`       // (optional) if set, will override the mob's script tag
	QuestFlags   []string `yaml:"questflags,omitempty,flow"` // (optional) list of quest flags to set on the mob
	BuffIds      []int    `yaml:"buffids,omitempty,flow"`    // (optional) list of buffs the mob always has active
	Level        int      `yaml:"level,omitempty"`           // (optional) force this mob to a specific level
	LevelMod     int      `yaml:"levelmod,omitempty"`        // (optional) modify this mobs level by this amount
	// spawn tracking and rate
	DespawnedRound uint64 `yaml:"-"`                     // When this mob was last despawned (killed)
	RespawnRate    string `yaml:"respawnrate,omitempty"` // How long until it respawns when not present?
}

type TrainingRange

type TrainingRange struct {
	Min int
	Max int
}

type VisitorType

type VisitorType string

type ZoneConfig

type ZoneConfig struct {
	RoomId       int `yaml:"roomid,omitempty"`
	MobAutoScale struct {
		Minimum int `yaml:"minimum,omitempty"` // level scaling minimum
		Maximum int `yaml:"maximum,omitempty"` // level scaling maximum
	} `yaml:"autoscale,omitempty"` // level scaling range if any
	Mutators     mutators.MutatorList `yaml:"mutators,omitempty"`     // mutators defined here apply to entire zone
	IdleMessages []string             `yaml:"idlemessages,omitempty"` // list of messages that can be displayed to players in the zone, assuming a room has none defined
	MusicFile    string               `yaml:"musicfile,omitempty"`    // background music to play when in this zone
}

func GetZoneConfig

func GetZoneConfig(zone string) *ZoneConfig

func (*ZoneConfig) GenerateRandomLevel

func (z *ZoneConfig) GenerateRandomLevel() int

Generates a random number between min and max

func (*ZoneConfig) Validate

func (z *ZoneConfig) Validate()

type ZoneInfo

type ZoneInfo struct {
	RootRoomId      int
	DefaultBiome    string // city, swamp etc. see biomes.go
	HasZoneMutators bool   // does it have any zone mutators assigned?
	RoomIds         map[int]struct{}
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL