package world import ( "gopkg.in/yaml.v3" ) type TriggerDef struct { ID string `yaml:"id"` OnPlayerFlag string `yaml:"on_player_flag"` OnGlobalFlag string `yaml:"on_global_flag"` Value any `yaml:"value"` Room int `yaml:"room"` Steps []TriggerStep `yaml:"steps"` } func (t *TriggerDef) IsPlayerFlagTrigger() bool { return t.OnPlayerFlag != "" } func (t *TriggerDef) IsGlobalFlagTrigger() bool { return t.OnGlobalFlag != "" } type TriggerStep struct { Delay int `yaml:"delay"` Message string `yaml:"message"` Broadcast string `yaml:"broadcast"` BroadcastGlobal string `yaml:"broadcast_global"` SetGlobalFlags map[string]any `yaml:"set_global_flags"` SetPlayerFlags map[string]any `yaml:"set_player_flags"` SpawnMob *SpawnMobConfig `yaml:"spawn_mob"` GiveItem string `yaml:"give_item"` TakeItem string `yaml:"take_item"` Teleport int `yaml:"teleport"` Heal int `yaml:"heal"` DespawnMob string `yaml:"despawn_mob"` } type SpawnMobConfig struct { ID string `yaml:"id"` OwnerOnly bool `yaml:"owner_only"` DespawnOnLeave bool `yaml:"despawn_on_leave"` DespawnRooms []int `yaml:"despawn_rooms"` DespawnTicks float64 `yaml:"despawn_ticks"` } func (s *SpawnMobConfig) UnmarshalYAML(value *yaml.Node) error { if value.Kind == yaml.ScalarNode { var id string if err := value.Decode(&id); err != nil { return err } s.ID = id return nil } type raw SpawnMobConfig return value.Decode((*raw)(s)) } func (t TriggerStep) IsTimed() bool { return t.Delay > 0 || len(t.SetGlobalFlags) > 0 || len(t.SetPlayerFlags) > 0 || t.Message != "" || t.Broadcast != "" || t.BroadcastGlobal != "" || t.SpawnMob != nil || t.GiveItem != "" || t.TakeItem != "" || t.Teleport != 0 || t.Heal != 0 || t.DespawnMob != "" }