44import top .ellan .mahjong .render .TableRenderSubject ;
55import top .ellan .mahjong .render .snapshot .TableRenderSnapshot ;
66import top .ellan .mahjong .render .snapshot .TableSeatRenderSnapshot ;
7- import java .util .Collections ;
87import java .util .Comparator ;
98import java .util .EnumMap ;
109import java .util .HashMap ;
10+ import java .util .HashSet ;
1111import java .util .List ;
1212import java .util .Map ;
1313import java .util .Objects ;
14+ import java .util .Set ;
1415import java .util .UUID ;
1516import org .bukkit .Location ;
1617import org .bukkit .entity .Player ;
1718
1819public final class TableRenderSnapshotFactory {
19- private static final Comparator <SerializedViewerId > SERIALIZED_VIEWER_ID_COMPARATOR =
20- Comparator .comparing (SerializedViewerId ::serializedId );
21-
2220 public TableRenderSnapshot create (TableRenderSubject session , long version , long cancellationNonce ) {
2321 Location tableCenter = session .center ();
2422 boolean started = session .isStarted ();
2523 List <SerializedViewerId > serializedOnlineViewerIds = session .viewers ().stream ()
2624 .map (Player ::getUniqueId )
2725 .distinct ()
2826 .map (viewerId -> new SerializedViewerId (viewerId , viewerId .toString ()))
29- .sorted (SERIALIZED_VIEWER_ID_COMPARATOR )
27+ .sorted (Comparator . comparing ( SerializedViewerId :: serializedId ) )
3028 .toList ();
3129 List <UUID > onlineViewerIds = serializedOnlineViewerIds .stream ()
3230 .map (SerializedViewerId ::id )
3331 .toList ();
34- Map <UUID , SerializedViewerId > serializedOnlineViewersById = new HashMap <>(
35- Math .max (16 , (int ) (serializedOnlineViewerIds .size () / 0.75F ) + 1 )
36- );
37- for (SerializedViewerId viewer : serializedOnlineViewerIds ) {
38- serializedOnlineViewersById .put (viewer .id (), viewer );
39- }
40- StringBuilder viewerMembershipBuffer = this .viewerMembershipBuffer (serializedOnlineViewerIds );
32+ Set <UUID > onlineViewerIdSet = new HashSet <>(onlineViewerIds );
4133 SeatWind [] seatWinds = SeatWind .values ();
4234 EnumMap <SeatWind , UUID > seatPlayerIds = new EnumMap <>(SeatWind .class );
4335 for (SeatWind wind : seatWinds ) {
@@ -46,28 +38,13 @@ public TableRenderSnapshot create(TableRenderSubject session, long version, long
4638 Map <UUID , String > viewerMembershipSignatures = new HashMap <>();
4739 Map <UUID , List <UUID >> viewerIdsExcluding = new HashMap <>();
4840 for (UUID playerId : seatPlayerIds .values ()) {
49- if (viewerMembershipSignatures .containsKey (playerId )) {
50- continue ;
51- }
52- SerializedViewerId excludedViewer = playerId == null
53- ? null
54- : serializedOnlineViewersById .get (playerId );
55- if (playerId != null && excludedViewer == null ) {
41+ if (viewerMembershipSignatures .containsKey (playerId )
42+ || playerId != null && !onlineViewerIdSet .contains (playerId )) {
5643 continue ;
5744 }
5845 viewerMembershipSignatures .put (
5946 playerId ,
60- excludedViewer == null
61- ? viewerMembershipBuffer .toString ()
62- : this .viewerMembershipSignature (
63- viewerMembershipBuffer ,
64- excludedViewer ,
65- Collections .binarySearch (
66- serializedOnlineViewerIds ,
67- excludedViewer ,
68- SERIALIZED_VIEWER_ID_COMPARATOR
69- )
70- )
47+ this .viewerMembershipSignature (serializedOnlineViewerIds , playerId )
7148 );
7249 viewerIdsExcluding .put (
7350 playerId ,
@@ -82,7 +59,7 @@ public TableRenderSnapshot create(TableRenderSubject session, long version, long
8259 session ,
8360 wind ,
8461 seatPlayerIds .get (wind ),
85- serializedOnlineViewersById ,
62+ onlineViewerIdSet ,
8663 viewerMembershipSignatures ,
8764 viewerIdsExcluding
8865 )
@@ -154,7 +131,7 @@ private TableSeatRenderSnapshot captureSeatSnapshot(
154131 TableRenderSubject session ,
155132 SeatWind wind ,
156133 UUID playerId ,
157- Map <UUID , SerializedViewerId > serializedOnlineViewersById ,
134+ Set <UUID > onlineViewerIdSet ,
158135 Map <UUID , String > viewerMembershipSignatures ,
159136 Map <UUID , List <UUID >> viewerIdsExcluding
160137 ) {
@@ -168,7 +145,7 @@ private TableSeatRenderSnapshot captureSeatSnapshot(
168145 occupied && session .isRiichi (playerId ),
169146 occupied && session .isReady (playerId ),
170147 occupied && session .isQueuedToLeave (playerId ),
171- occupied && serializedOnlineViewersById . containsKey (playerId ),
148+ occupied && onlineViewerIdSet . contains (playerId ),
172149 viewerMembershipSignatures .getOrDefault (playerId , "" ),
173150 occupied ? session .selectedHandTileIndex (playerId ) : -1 ,
174151 occupied ? session .selectedHandTileIndices (playerId ) : List .of (),
@@ -183,25 +160,14 @@ private TableSeatRenderSnapshot captureSeatSnapshot(
183160 );
184161 }
185162
186- private StringBuilder viewerMembershipBuffer (List <SerializedViewerId > onlineViewerIds ) {
163+ private String viewerMembershipSignature (List <SerializedViewerId > onlineViewerIds , UUID excludedPlayerId ) {
187164 StringBuilder builder = new StringBuilder (onlineViewerIds .size () * 36 );
188165 for (SerializedViewerId viewer : onlineViewerIds ) {
189- builder .append (viewer .serializedId ());
166+ if (!viewer .id ().equals (excludedPlayerId )) {
167+ builder .append (viewer .serializedId ());
168+ }
190169 }
191- return builder ;
192- }
193-
194- private String viewerMembershipSignature (
195- StringBuilder viewerMembershipBuffer ,
196- SerializedViewerId excludedViewer ,
197- int excludedViewerIndex
198- ) {
199- String serializedId = excludedViewer .serializedId ();
200- int start = excludedViewerIndex * serializedId .length ();
201- viewerMembershipBuffer .delete (start , start + serializedId .length ());
202- String signature = viewerMembershipBuffer .toString ();
203- viewerMembershipBuffer .insert (start , serializedId );
204- return signature ;
170+ return builder .toString ();
205171 }
206172
207173 private List <UUID > viewerIdsExcluding (List <UUID > onlineViewerIds , UUID excludedPlayerId ) {
0 commit comments