-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCharacterController.luau
More file actions
121 lines (99 loc) · 3.46 KB
/
CharacterController.luau
File metadata and controls
121 lines (99 loc) · 3.46 KB
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
local RunService = game:GetService("RunService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local TypeDefinitions = require(ReplicatedStorage.Common.TypeDefinitions)
local Log = require(ReplicatedStorage.Common.Log)
local ClientNetwork = require(ReplicatedStorage.Client.Modules.ClientNetwork)
local Raycast = require(ReplicatedStorage.Common.Raycast)
local InputController = require(ReplicatedStorage.Client.Controllers.InputController)
local WeaponController = require(ReplicatedStorage.Client.Controllers.WeaponController)
local CharacterStates = require(ReplicatedStorage.Client.Modules.Atoms.CharacterStates)
local Charm = require(ReplicatedStorage.Packages.Charm)
local CharacterStateController = require(ReplicatedStorage.Client.Controllers.CharacterStateController)
local ClientAtom = require(ReplicatedStorage.Client.Modules.Atoms.ClientAtoms)
local CameraAtoms = require(ReplicatedStorage.Client.Modules.Atoms.CameraAtoms)
local FLOOR_HEIGHT = 3.5
type Controller = TypeDefinitions.Controller
local CharacterController = {
trackedCharacter = nil,
ragdolled = nil,
runService = nil,
} :: Controller & {
runService: RBXScriptConnection?,
ragdolled: any?,
trackedCharacter: Model,
onStart: () -> (),
onCharacterAdded: (character: Model) -> (),
}
local function checkFloor(character: Model)
if not character then
return
end
if not character.PrimaryPart then
return
end
local rayOrigin = character.PrimaryPart.Position
local rayDirection = Vector3.new(0, -1, 0) * FLOOR_HEIGHT
local hit = Raycast.raycast(rayOrigin, rayDirection, FLOOR_HEIGHT, { character }, true)
if hit then
-- for later
end
end
function CharacterController.onStart()
if CharacterController.runService then
CharacterController.runService:Disconnect()
end
if CharacterController.ragdolled then
CharacterController.ragdolled:Disconnect()
end
ClientNetwork.CharacterAdded.on(function(character)
CharacterController.trackedCharacter = character
CameraAtoms.cameraSubject(character:WaitForChild("Humanoid"))
CharacterController.trackCharacter(CharacterController.trackedCharacter)
end)
CharacterController.ragdolled = Charm.subscribe(CharacterStates.ragdolled.value, function(isRagdolled)
if not CharacterController.trackedCharacter then
return
end
if not isRagdolled then
CharacterController.ragdoll(false)
else
CharacterController.ragdoll(true)
end
end)
CharacterController.runService = RunService.Heartbeat:Connect(function()
if CharacterController.trackedCharacter then
checkFloor(CharacterController.trackedCharacter)
end
end)
end
function CharacterController.ragdoll(state: boolean)
if CharacterController.trackedCharacter then
local humanoid = CharacterController.trackedCharacter:FindFirstChildOfClass("Humanoid")
if not humanoid then
return
end
if state then
for _, v in pairs(humanoid:GetPlayingAnimationTracks()) do
v:Stop(0)
end
end
CharacterController.trackedCharacter.Animate.Disabled = state
humanoid:ChangeState(state and Enum.HumanoidStateType.Physics or Enum.HumanoidStateType.GettingUp)
ClientNetwork.RagdollCharacter.fire(state)
end
end
function CharacterController.trackCharacter(character: Model)
character.ChildAdded:Connect(function(child)
if child:IsA("Tool") then
ClientAtom.tool(child)
WeaponController.equip(child)
end
end)
character.ChildRemoved:Connect(function(child)
if child:IsA("Tool") then
ClientAtom.tool(nil)
WeaponController.unequip()
end
end)
end
return CharacterController