-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmanager.go
122 lines (106 loc) · 3.32 KB
/
manager.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package worlds
import (
"errors"
"github.com/irmine/worlds/generation"
"os"
"sync"
)
// Manager is a struct managing all levels and provides helper functions.
type Manager struct {
serverPath string
generatorManager generation.Manager
defaultLevel *Level
mutex sync.RWMutex
levels map[string]*Level
}
// NewManager returns a new worlds manager.
// The manager will create its content inside of the `serverPath/worlds/` folder.
func NewManager(serverPath string) *Manager {
os.MkdirAll(serverPath+"/worlds", 0700)
return &Manager{serverPath, generation.NewManager(), nil, sync.RWMutex{}, make(map[string]*Level)}
}
// GetLoadedLevels returns all loaded levels of the manager in a name => level map.
func (manager *Manager) GetLevels() map[string]*Level {
return manager.levels
}
// GetGenerationManager returns the generator manager of the level manager.
func (manager *Manager) GetGenerationManager() generation.Manager {
return manager.generatorManager
}
// IsLevelLoaded checks if a level is loaded with the given name.
func (manager *Manager) IsLevelLoaded(levelName string) bool {
manager.mutex.RLock()
var _, ok = manager.levels[levelName]
manager.mutex.RUnlock()
return ok
}
// IsLevelGenerated checks if a level with the given name has been generated.
func (manager *Manager) IsLevelGenerated(levelName string) bool {
if manager.IsLevelLoaded(levelName) {
return true
}
var path = manager.serverPath + "worlds/" + levelName
var _, err = os.Stat(path)
if err != nil {
return false
}
return true
}
// LoadLevel loads a level with the given name, and returns a bool indicating success.
func (manager *Manager) LoadLevel(levelName string) bool {
if !manager.IsLevelGenerated(levelName) {
// manager.GenerateLevel(level) We need file writing for this. TODO.
}
if manager.IsLevelLoaded(levelName) {
return false
}
manager.mutex.Lock()
manager.levels[levelName] = NewLevel(levelName, manager.serverPath)
manager.mutex.Unlock()
return true
}
// GetDefaultLevel returns the default level of the manager.
func (manager *Manager) GetDefaultLevel() *Level {
return manager.defaultLevel
}
// SetDefaultLevel sets the given level as default, and adds it if needed.
func (manager *Manager) SetDefaultLevel(level *Level) {
manager.mutex.Lock()
manager.levels[level.GetName()] = level
manager.mutex.Unlock()
manager.defaultLevel = level
}
// GetLevel returns a level by its name, or an error if something went wrong.
func (manager *Manager) GetLevel(name string) (*Level, error) {
if !manager.IsLevelGenerated(name) {
return nil, errors.New("level with given name is not generated")
}
if !manager.IsLevelLoaded(name) {
return nil, errors.New("level with given name is not loaded")
}
manager.mutex.RLock()
defer manager.mutex.RUnlock()
return manager.levels[name], nil
}
// Tick ticks all levels managed by the Manager.
func (manager *Manager) Tick() {
for _, level := range manager.levels {
level.Tick()
}
}
// Close closes all levels and their dimensions.
func (manager *Manager) Close() {
for _, level := range manager.levels {
for _, dimension := range level.GetDimensions() {
dimension.Close(false)
}
}
}
// Save saves all levels and their dimensions.
func (manager *Manager) Save() {
for _, level := range manager.levels {
for _, dimension := range level.GetDimensions() {
dimension.Save()
}
}
}