Skip to content

Commit 85b61a4

Browse files
fix: janitor errors and player removing lifecycle
1 parent f8c4fda commit 85b61a4

File tree

3 files changed

+27
-30
lines changed

3 files changed

+27
-30
lines changed

src/server/player/character/character-service.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export default class CharacterService implements OnStart, OnPlayerJoin {
5252

5353
janitor.Add(
5454
onCharacterAdded(player, character => {
55-
this.characterAdded(playerEntity, character).catch(err => {
55+
janitor.AddPromise(this.characterAdded(playerEntity, character)).catch(err => {
5656
this.logger.Fatal(`Could not get character rig because:\n${err}`);
5757
});
5858
}),
@@ -141,7 +141,7 @@ export default class CharacterService implements OnStart, OnPlayerJoin {
141141
private onRigLoaded(playerEntity: PlayerEntity, rig: CharacterRig): void {
142142
const { name, janitor, player } = playerEntity;
143143

144-
janitor.Add(addToCollisionGroup(rig, CollisionGroup.Character));
144+
janitor.Add(addToCollisionGroup(rig, CollisionGroup.Character, true), true);
145145
rig.AddTag(Tag.PlayerCharacter);
146146
this.characterRigs.set(player, rig);
147147

@@ -165,7 +165,7 @@ export default class CharacterService implements OnStart, OnPlayerJoin {
165165

166166
debug.profileend();
167167

168-
janitor.Add(this.characterAppearanceLoaded(player, rig)).catch(err => {
168+
janitor.AddPromise(this.characterAppearanceLoaded(player, rig)).catch(err => {
169169
this.logger.Info(`Character appearance did not load for`, player, err);
170170
});
171171
}

src/server/player/player-service.ts

+23-26
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ import KickCode from "types/enum/kick-reason";
1818
import type PlayerDataService from "./data/player-data-service";
1919
import type PlayerRemovalService from "./player-removal-service";
2020

21-
const MAX_REMOVING_TIMEOUT = 5;
22-
2321
export interface OnPlayerJoin {
2422
/**
2523
* Fires when a player joins the game and is fully initialized. The player
@@ -176,7 +174,7 @@ export default class PlayerService implements OnStart {
176174
{
177175
for (const { id, event } of this.playerJoinEvents) {
178176
janitor
179-
.Add(
177+
.AddPromise(
180178
Promise.defer(() => {
181179
debug.profilebegin(id);
182180
event.onPlayerJoin(playerEntity);
@@ -226,37 +224,36 @@ export default class PlayerService implements OnStart {
226224
debug.profilebegin("Lifecycle_Player_Leave");
227225
{
228226
for (const { id, event } of this.playerLeaveEvents) {
229-
promises.push(
230-
Promise.defer(() => {
231-
debug.profilebegin(id);
232-
return Promise.resolve(event.onPlayerLeave(playerEntity)).await();
233-
}),
234-
);
227+
const promiseEvent = Promise.defer<void>((resolve, reject) => {
228+
debug.profilebegin(id);
229+
try {
230+
const leaveEvent = async (): Promise<void> => {
231+
await event.onPlayerLeave(playerEntity);
232+
};
233+
234+
const [success, err] = leaveEvent().await();
235+
if (!success) {
236+
reject(err);
237+
return;
238+
}
239+
240+
resolve();
241+
} catch (err) {
242+
this.logger.Error(`Error in player lifecycle ${id}: ${err}`);
243+
}
244+
});
245+
246+
promises.push(promiseEvent);
235247
}
236248
}
237249

238250
debug.profileend();
239251

240252
// We ensure that all lifecycle events are called before we continue
241253
// since we may need to access player data in these events.
242-
const lifecycles = Promise.all(promises).catch(err => {
243-
this.logger.Error(`Error in player leave lifecycle event:\n${err}`);
254+
await Promise.all(promises).finally(() => {
255+
playerEntity.janitor.Destroy();
244256
});
245-
246-
// If we're in development, we want to warn if the lifecycle events take
247-
// too long to complete. This is to ensure that we don't have any
248-
// blocking code in these events.
249-
if ($NODE_ENV === "development") {
250-
lifecycles.timeout(MAX_REMOVING_TIMEOUT).catch(() => {
251-
this.logger.Fatal(
252-
`Player lifecycle events for ${playerEntity.userId} took too long. Please ` +
253-
`ensure that lifecycle events do not take too long to complete.`,
254-
);
255-
});
256-
}
257-
258-
await lifecycles;
259-
playerEntity.janitor.Destroy();
260257
}
261258

262259
private bindHoldServerOpen(): void {

src/shared/util/physics-util.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
export function addToCollisionGroup(
1313
object: Instance,
1414
group: string,
15-
trackNewDescendants?: true,
15+
trackNewDescendants: true,
1616
): () => void;
1717
export function addToCollisionGroup(
1818
object: Instance,

0 commit comments

Comments
 (0)