aboutsummaryrefslogtreecommitdiff
path: root/internal/admin/server.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/admin/server.go')
-rw-r--r--internal/admin/server.go18
1 files changed, 18 insertions, 0 deletions
diff --git a/internal/admin/server.go b/internal/admin/server.go
index 2c8681a..12d090d 100644
--- a/internal/admin/server.go
+++ b/internal/admin/server.go
@@ -720,6 +720,13 @@ func (s *AdminServer) rebuildAfterUndo(change *ChangeDesc) {
if s.mobStore != nil {
s.mobStore.RemoveMobsInRoom(id)
}
+ // The room no longer exists, so its cached casino games
+ // (tables/machines) must be evicted like the direct-delete
+ // API does: outstanding wagers are refunded through the
+ // wired game callback before the cache entries drop.
+ if s.evictRoom != nil {
+ s.evictRoom(id)
+ }
}
}
}
@@ -728,6 +735,17 @@ func (s *AdminServer) rebuildAfterUndo(change *ChangeDesc) {
for _, p := range changeFiles(change) {
s.invalidateEntityCacheForPath(p)
}
+
+ // Course definitions changed on disk (create/update/delete via undo or
+ // redo): the runtime course index must reload, exactly like the course
+ // API handlers do, or gameplay keeps traversing the stale course.
+ for _, p := range changeFiles(change) {
+ if rel, err := filepath.Rel(filepath.Join(s.dataDir, "courses"), p); err == nil &&
+ !strings.HasPrefix(rel, "..") && rel != "." {
+ s.reloadCoursesIfWired()
+ break
+ }
+ }
}
func (s *AdminServer) invalidateEntityCaches(entityType string) {