-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPlayerControllerManager.ts
90 lines (74 loc) · 2.8 KB
/
PlayerControllerManager.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/**
* Manages the local player control inputs, initializing them and managing ownership
*/
import * as hz from 'horizon/core';
import { Pool, } from 'GameUtils';
import { Events } from "Events";
export interface PlayerControllerManagerProps {
doubleJumpAmount: number,
boostJumpAmount: number,
boostJumpAngle: number
}
export class PlayerControllerManager extends hz.Component<typeof PlayerControllerManager> {
static propsDefinition = {
doubleJumpAmount: { type: hz.PropTypes.Number, default: 5 },
boostJumpAmount: { type: hz.PropTypes.Number, default: 12 },
boostJumpAngle: { type: hz.PropTypes.Number, default: 90 }
};
private ctrlPool: Pool<hz.Entity> = new Pool<hz.Entity>();
private playerCtrlMap: Map<number, hz.Entity> = new Map<number, hz.Entity>();
private static s_instance: PlayerControllerManager
public static getInstance(): PlayerControllerManager {
return PlayerControllerManager.s_instance;
}
constructor() {
super();
if (PlayerControllerManager.s_instance === undefined) {
PlayerControllerManager.s_instance = this;
}
else {
console.error(`There are two ${this.constructor.name} in the world!`)
return;
}
}
preStart() {
this.connectCodeBlockEvent(this.entity, hz.CodeBlockEvents.OnPlayerEnterWorld, (player: hz.Player) => {
this.handleOnPlayerEnterWorld(player);
});
this.connectCodeBlockEvent(this.entity, hz.CodeBlockEvents.OnPlayerExitWorld, (player: hz.Player) => {
this.handleOnPlayerExitWorld(player);
});
this.connectLocalBroadcastEvent(Events.onRegisterPlyrCtrl, (data) => { this.ctrlPool.addToPool(data.caller) })
this.connectNetworkBroadcastEvent(
Events.onGetPlyrCtrlData, (data) => {
this.sendNetworkEvent(
data.caller,
Events.onSetPlyrCtrlData,
{
doubleJumpAmount: this.props.doubleJumpAmount,
boostJumpAmount: this.props.boostJumpAmount,
boostJumpAngle: this.props.boostJumpAngle,
});
}
);
}
start() { };
private handleOnPlayerExitWorld(player: hz.Player): void {
const playerCtrl = this.playerCtrlMap.get(player.id);
if (playerCtrl) {
console.log(`${this.constructor.name} Removed Local Controller from ${player.name.get()}`);
playerCtrl.owner.set(this.world.getServerPlayer());
this.ctrlPool.addToPool(playerCtrl);
}
this.playerCtrlMap.delete(player.id);
};
private handleOnPlayerEnterWorld(player: hz.Player): void {
const availableCtrl = this.ctrlPool.getNextAvailable();
if (availableCtrl) {
console.log(`${this.constructor.name} Attached Local Controller to ${player.name.get()}`);
availableCtrl.owner.set(player);
this.playerCtrlMap.set(player.id, availableCtrl);
}
};
}
hz.Component.register(PlayerControllerManager);