package common import ( "encoding/json" "fmt" ) // FaceCamSettings is shared by the SDK and the game heartbeat. Distance is in // world units; changing this setting never changes the Freecam enabled state. type FaceCamSettings struct { Mode string `json:"mode"` Distance float64 `json:"distance"` } func ReadFaceCamSettings() (FaceCamSettings, error) { settings := FaceCamSettings{Mode: "freecam", Distance: 2} root, err := readCurrencyWarsPersistentRoot() if err != nil { return settings, err } if raw, ok := root["camera_settings"]; ok { if err := json.Unmarshal(raw, &settings); err != nil { return settings, err } } return settings, settings.Validate() } func (s FaceCamSettings) Validate() error { if (s.Mode != "freecam" && s.Mode != "facecam") || !(s.Distance >= 0.5 && s.Distance <= 5) { return fmt.Errorf("invalid camera mode or distance") } return nil } func SaveFaceCamSettings(settings FaceCamSettings) error { if err := settings.Validate(); err != nil { return err } persistentWriteMu.Lock() defer persistentWriteMu.Unlock() unlock, err := lockPersistentFile() if err != nil { return err } defer unlock() root, err := readCurrencyWarsPersistentRoot() if err != nil { return err } root["camera_settings"], err = json.Marshal(settings) if err != nil { return err } return writeJSONAtomic("persistent", root) }