Compare commits

..

2 commits

Author SHA1 Message Date
6b985497ba update ragdoll, add todo 2023-08-12 03:20:20 -07:00
a8b217d45e fix resetting, add comments 2023-08-12 02:21:43 -07:00
7 changed files with 57 additions and 10 deletions

View file

@ -13,6 +13,7 @@ An in-dev game that I plan to make a shooter game out of.
# Todo # Todo
### High priority ### High priority
* Add ingame output of the console
* Add tests * Add tests
* Add guns. Try it in default roblox-ts and slowly reimplement it into our component system. * Add guns. Try it in default roblox-ts and slowly reimplement it into our component system.
#### Medium priority #### Medium priority
@ -26,6 +27,6 @@ An in-dev game that I plan to make a shooter game out of.
# Fixes # Fixes
### High Priority ### High Priority
* Currently, when resetting, sometimes your health goes back up. This is due to the reconciliation of health. Simply put, your health is not being set to zero inside of our entity component system, due to us not having the reset event currently like that. See it here: [StarterGui.SetCore](https://create.roblox.com/docs/reference/engine/classes/StarterGui#SetCore) It uses BindableEvents.
#### Medium priority #### Medium priority
##### Low priority ##### Low priority
* Sometimes I get errors in [`./src/ReplicatedStorage/ecs/systems/client/sprint.ts`](./src/ReplicatedStorage/ecs/systems/client/sprint.ts) due to the character not being initialized yet, should probably fix that before it gets worse with other systems

View file

@ -0,0 +1,18 @@
import { World, useEvent } from "@rbxts/matter"
import { StarterGui } from "@rbxts/services"
import { clientState } from "ReplicatedStorage/ecs/state"
import { getEvent } from "ReplicatedStorage/remotes"
const resetButtonCallback = new Instance("BindableEvent")
StarterGui.SetCore("ResetButtonCallback", resetButtonCallback)
getEvent("resetButton")
function customReset(_: World, _client: clientState): void {
const resetButtonEvent = getEvent("resetButton")
for (const [,] of useEvent(resetButtonCallback, "Event")) {
resetButtonEvent.FireServer()
}
}
export = customReset

View file

@ -21,14 +21,12 @@ function sprint(_: World, client: clientState): void {
}) })
} }
if (client.isRunning && client.character) { if (client.isRunning) {
client.character.Humanoid.WalkSpeed = 24 client.character.Humanoid.WalkSpeed = 24
return return
} }
if (client.character) {
client.character.Humanoid.WalkSpeed = 16 client.character.Humanoid.WalkSpeed = 16
} }
}
export = sprint export = sprint

View file

@ -0,0 +1,23 @@
import { World, useEvent } from "@rbxts/matter"
import { Health, Model, PlayerCharacter } from "ReplicatedStorage/ecs/components"
import { getEvent } from "ReplicatedStorage/remotes"
getEvent("resetButton")
function customReset(world: World): void {
const resetButtonEvent = getEvent("resetButton")
for (const [, player] of useEvent(resetButtonEvent, "OnServerEvent")) {
for (const [id, playerCharacter, _model, health] of world.query(PlayerCharacter, Model, Health)) {
if (playerCharacter.player !== player) continue
world.insert(
id,
health.patch({
health: 0,
regeneration: 0
})
)
}
}
}
export = customReset

View file

@ -2,7 +2,7 @@ import { useThrottle, World } from "@rbxts/matter"
import { Health } from "ReplicatedStorage/ecs/components" import { Health } from "ReplicatedStorage/ecs/components"
/** /**
* @todo * Health components regenerate health based on the regeneration value.
*/ */
function healthRegenerates(world: World): void { function healthRegenerates(world: World): void {
for (const [id, health] of world.query(Health)) { for (const [id, health] of world.query(Health)) {

View file

@ -4,7 +4,7 @@ import { Health, Model, PlayerCharacter } from "ReplicatedStorage/ecs/components
import { CharacterRigR6 } from "@rbxts/character-promise" import { CharacterRigR6 } from "@rbxts/character-promise"
/** /**
* @todo * Player characters are marked with the "PlayerCharacter" component, "Health" component, and "Model" component.
*/ */
function playersArePlayerCharacters(world: World): void { function playersArePlayerCharacters(world: World): void {
Players.GetPlayers().forEach((player, _) => { Players.GetPlayers().forEach((player, _) => {
@ -14,6 +14,8 @@ function playersArePlayerCharacters(world: World): void {
model: character model: character
}), }),
PlayerCharacter({ PlayerCharacter({
// I know this is kinda dumb, "why not the model component!!!"
// The model component doesnt retain types
character: character as CharacterRigR6, character: character as CharacterRigR6,
player: Players.GetPlayerFromCharacter(character) as Player, player: Players.GetPlayerFromCharacter(character) as Player,
humanoid: character.WaitForChild("Humanoid") as Humanoid humanoid: character.WaitForChild("Humanoid") as Humanoid

View file

@ -2,11 +2,13 @@ import { World, useEvent } from "@rbxts/matter"
import { Model, PlayerCharacter } from "ReplicatedStorage/ecs/components" import { Model, PlayerCharacter } from "ReplicatedStorage/ecs/components"
/** /**
* @todo * When players die, disconnect all Motor6D instances.
*
* The Motor6D instances are replaced with BallSocketContraints.
*/ */
function playersRagdollOnDeath(world: World): void { function playersRagdollOnDeath(world: World): void {
for (const [_, playerCharacter, model] of world.query(PlayerCharacter, Model)) { for (const [_, playerCharacter, model] of world.query(PlayerCharacter, Model)) {
if (!model.model) continue if (!model.model || !playerCharacter.character) continue
playerCharacter.humanoid.BreakJointsOnDeath = false playerCharacter.humanoid.BreakJointsOnDeath = false
@ -30,6 +32,9 @@ function playersRagdollOnDeath(world: World): void {
v.Destroy() v.Destroy()
} }
}) })
// Makes it so their head doesn't just dangle
playerCharacter.character.HumanoidRootPart.ApplyImpulse(Vector3.FromNormalId(Enum.NormalId.Back).mul(100))
} }
} }