From fea2cc6839ec3ee17940a2dea69622dc6f4deabf Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Wed, 16 Sep 2026 21:35:55 -0400 Subject: fix: unify crafting ingredient resolution; fix superheat alternatives, quantity gates, and dropped combine byproducts --- internal/admin/server.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'internal/admin/server.go') 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) { -- cgit v1.2.3