Files
GaCy-GO/internal/common/facecam.go
T
2026-10-28 18:54:43 +07:00

57 lines
1.3 KiB
Go

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)
}