1414import io .github .legendaryforge .legendary .core .internal .event .SimpleEventBus ;
1515import io .github .legendaryforge .legendary .core .internal .legendary .arena .ArenaInvariantBridge ;
1616import io .github .legendaryforge .legendary .core .internal .legendary .arena .ArenaInvariantRegistry ;
17- import io .github .legendaryforge .legendary .core .internal .legendary .arena .PhaseGateInvariant ;
17+ import io .github .legendaryforge .legendary .core .internal .legendary .arena .ArenaRevocationTracker ;
1818import io .github .legendaryforge .legendary .core .internal .legendary .arena .BoundsInvariant ;
19+ import io .github .legendaryforge .legendary .core .internal .legendary .arena .LegendaryInstanceTrackingEncounterManager ;
20+ import io .github .legendaryforge .legendary .core .internal .legendary .arena .LegendaryRevokedRejoinEnforcingEncounterManager ;
21+ import io .github .legendaryforge .legendary .core .internal .legendary .arena .PhaseGateInvariant ;
1922import io .github .legendaryforge .legendary .core .internal .legendary .manager .LegendaryAccessEnforcingEncounterManager ;
2023import io .github .legendaryforge .legendary .core .internal .legendary .penalty .NoopLegendaryPenaltyStatus ;
2124import io .github .legendaryforge .legendary .core .internal .legendary .start .DefaultLegendaryStartPolicy ;
2427import io .github .legendaryforge .legendary .core .internal .lifecycle .DefaultServiceRegistry ;
2528import io .github .legendaryforge .legendary .core .internal .registry .DefaultRegistryAccess ;
2629import java .time .Clock ;
27- import java .util .concurrent .ConcurrentHashMap ;
28- import java .util .Set ;
29- import io .github .legendaryforge .legendary .core .internal .legendary .arena .LegendaryInstanceTrackingEncounterManager ;
30- import io .github .legendaryforge .legendary .core .api .id .ResourceId ;
3130import java .util .Objects ;
3231import java .util .Optional ;
32+ import java .util .Set ;
33+ import java .util .concurrent .ConcurrentHashMap ;
3334
3435/**
3536 * Default internal wiring of LegendaryCore runtime components.
@@ -86,7 +87,7 @@ public DefaultCoreRuntime(Optional<PlayerDirectory> players, Optional<PartyDirec
8687 io .github .legendaryforge .legendary .core .api .encounter .event .EncounterEndedEvent .class ,
8788 durationTelemetry ::onEnded );
8889
89- Set <java .util .UUID > legendaryInstanceIds = ConcurrentHashMap .newKeySet ();
90+ Set <java .util .UUID > legendaryInstanceIds = ConcurrentHashMap .newKeySet ();
9091 PhaseGateInvariant phaseGate = new PhaseGateInvariant ();
9192 BoundsInvariant bounds = new BoundsInvariant (bus );
9293
@@ -97,11 +98,20 @@ public DefaultCoreRuntime(Optional<PlayerDirectory> players, Optional<PartyDirec
9798
9899 ArenaInvariantBridge .bind (bus , arenaRegistry , legendaryInstanceIds ::contains , legendaryInstanceIds ::remove );
99100
101+ ArenaRevocationTracker revocations = new ArenaRevocationTracker ();
102+
103+ bus .subscribe (
104+ io .github .legendaryforge .legendary .core .api .encounter .event .EncounterEndedEvent .class ,
105+ e -> revocations .clearInstance (e .instanceId ()));
106+
100107 EncounterManager base = new DefaultEncounterManager (players , parties , Optional .of (bus ));
101108 EncounterManager startGated = new LegendaryStartGatingEncounterManager (
102109 base , new DefaultLegendaryStartPolicy (), new NoopLegendaryPenaltyStatus ());
103- EncounterManager enforced = new LegendaryAccessEnforcingEncounterManager (startGated , new DefaultLegendaryAccessPolicy ());
104- this .encounters = new LegendaryInstanceTrackingEncounterManager (enforced , legendaryInstanceIds );
110+ EncounterManager enforced =
111+ new LegendaryAccessEnforcingEncounterManager (startGated , new DefaultLegendaryAccessPolicy ());
112+ EncounterManager revokedRejoinEnforced = new LegendaryRevokedRejoinEnforcingEncounterManager (
113+ enforced , legendaryInstanceIds ::contains , phaseGate , revocations );
114+ this .encounters = new LegendaryInstanceTrackingEncounterManager (revokedRejoinEnforced , legendaryInstanceIds );
105115
106116 this .players = Objects .requireNonNull (players , "players" );
107117 this .parties = Objects .requireNonNull (parties , "parties" );
0 commit comments