@@ -119,6 +119,27 @@ function GM:TTTPlayerColor(model)
119119end
120120
121121local plySelectedModels
122+ local plyUsedModels
123+
124+ local function RandomUniqueModel ()
125+ plyUsedModels = plyUsedModels or {}
126+ local pm = nil
127+
128+ -- select a playermodel which hasn't been used before
129+ local i = # playermodels .GetSelectedModels () -- i means we only attempt at #playermodels times, before figuring there are no remaining options
130+ while i > 0 and (not pm or plyUsedModels [pm ]) do
131+ pm = playermodels .GetRandomPlayerModel ()
132+ i = i - 1
133+ end
134+
135+ if not pm or i == 0 then
136+ -- we reached the iteration limit; likely all models are used, so start reusing
137+ plyUsedModels = {}
138+ return RandomUniqueModel ()
139+ end
140+
141+ return pm
142+ end
122143
123144---
124145-- Called to get the default player display information (model/color) for this map.
@@ -159,7 +180,7 @@ function GM:TTT2GetDefaultPlayerDisplayForRound()
159180 continue
160181 end
161182
162- plySelectedModels [plys [i ]] = playermodels . GetRandomPlayerModel ()
183+ plySelectedModels [plys [i ]] = RandomUniqueModel ()
163184 end
164185 end
165186 end
@@ -192,6 +213,9 @@ function GM:PlayerSetModel(ply)
192213 return
193214 end
194215
216+ -- We need to clear subrole models at some point; we'll do it here
217+ ply :SetSubRoleModel (nil )
218+
195219 local pm = plySelectedModels and plySelectedModels [ply ]
196220
197221 if
@@ -201,7 +225,7 @@ function GM:PlayerSetModel(ply)
201225 then
202226 -- plySelectedModels doesn't have this player's model, but a unique one was requested for
203227 -- each round. Compute it now.
204- pm = playermodels . GetRandomPlayerModel ()
228+ pm = RandomUniqueModel ()
205229 plySelectedModels = plySelectedModels or {}
206230 plySelectedModels [ply ] = pm
207231 end
0 commit comments