From a8b217d45e6b5c21cd524d94d15f38802b375588 Mon Sep 17 00:00:00 2001 From: reidlab Date: Sat, 12 Aug 2023 02:21:43 -0700 Subject: [PATCH 1/2] fix resetting, add comments --- readme.md | 1 - .../ecs/systems/client/customReset.ts | 18 +++++++++++++++ .../ecs/systems/server/customReset.ts | 23 +++++++++++++++++++ .../ecs/systems/server/healthRegenerates.ts | 2 +- .../server/playersArePlayerCharacters.ts | 2 +- .../systems/server/playersRagdollOnDeath.ts | 4 +++- 6 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 src/ReplicatedStorage/ecs/systems/client/customReset.ts create mode 100644 src/ServerScriptService/ecs/systems/server/customReset.ts diff --git a/readme.md b/readme.md index 7907ef1..6d48048 100644 --- a/readme.md +++ b/readme.md @@ -26,6 +26,5 @@ An in-dev game that I plan to make a shooter game out of. # Fixes ### 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 ##### Low priority \ No newline at end of file diff --git a/src/ReplicatedStorage/ecs/systems/client/customReset.ts b/src/ReplicatedStorage/ecs/systems/client/customReset.ts new file mode 100644 index 0000000..e4dcaeb --- /dev/null +++ b/src/ReplicatedStorage/ecs/systems/client/customReset.ts @@ -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 \ No newline at end of file diff --git a/src/ServerScriptService/ecs/systems/server/customReset.ts b/src/ServerScriptService/ecs/systems/server/customReset.ts new file mode 100644 index 0000000..ad8546a --- /dev/null +++ b/src/ServerScriptService/ecs/systems/server/customReset.ts @@ -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 \ No newline at end of file diff --git a/src/ServerScriptService/ecs/systems/server/healthRegenerates.ts b/src/ServerScriptService/ecs/systems/server/healthRegenerates.ts index d941ac0..047371d 100644 --- a/src/ServerScriptService/ecs/systems/server/healthRegenerates.ts +++ b/src/ServerScriptService/ecs/systems/server/healthRegenerates.ts @@ -2,7 +2,7 @@ import { useThrottle, World } from "@rbxts/matter" import { Health } from "ReplicatedStorage/ecs/components" /** - * @todo + * Health components regenerate health based on the regeneration value. */ function healthRegenerates(world: World): void { for (const [id, health] of world.query(Health)) { diff --git a/src/ServerScriptService/ecs/systems/server/playersArePlayerCharacters.ts b/src/ServerScriptService/ecs/systems/server/playersArePlayerCharacters.ts index 58c6fbd..8e3a5c2 100644 --- a/src/ServerScriptService/ecs/systems/server/playersArePlayerCharacters.ts +++ b/src/ServerScriptService/ecs/systems/server/playersArePlayerCharacters.ts @@ -4,7 +4,7 @@ import { Health, Model, PlayerCharacter } from "ReplicatedStorage/ecs/components 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 { Players.GetPlayers().forEach((player, _) => { diff --git a/src/ServerScriptService/ecs/systems/server/playersRagdollOnDeath.ts b/src/ServerScriptService/ecs/systems/server/playersRagdollOnDeath.ts index a6df6e0..87df53f 100644 --- a/src/ServerScriptService/ecs/systems/server/playersRagdollOnDeath.ts +++ b/src/ServerScriptService/ecs/systems/server/playersRagdollOnDeath.ts @@ -2,7 +2,9 @@ import { World, useEvent } from "@rbxts/matter" 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 { for (const [_, playerCharacter, model] of world.query(PlayerCharacter, Model)) { From 6b985497ba3f60af44ba0cf4b8cb931c2f22b611 Mon Sep 17 00:00:00 2001 From: reidlab Date: Sat, 12 Aug 2023 03:20:20 -0700 Subject: [PATCH 2/2] update ragdoll, add todo --- readme.md | 4 +++- src/ReplicatedStorage/ecs/systems/client/sprint.ts | 6 ++---- .../ecs/systems/server/playersArePlayerCharacters.ts | 2 ++ .../ecs/systems/server/playersRagdollOnDeath.ts | 5 ++++- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/readme.md b/readme.md index 6d48048..86842cc 100644 --- a/readme.md +++ b/readme.md @@ -13,6 +13,7 @@ An in-dev game that I plan to make a shooter game out of. # Todo ### High priority +* Add ingame output of the console * Add tests * Add guns. Try it in default roblox-ts and slowly reimplement it into our component system. #### Medium priority @@ -27,4 +28,5 @@ An in-dev game that I plan to make a shooter game out of. # Fixes ### High Priority #### Medium priority -##### Low priority \ No newline at end of file +##### 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 \ No newline at end of file diff --git a/src/ReplicatedStorage/ecs/systems/client/sprint.ts b/src/ReplicatedStorage/ecs/systems/client/sprint.ts index 14b1e39..4cf41b0 100644 --- a/src/ReplicatedStorage/ecs/systems/client/sprint.ts +++ b/src/ReplicatedStorage/ecs/systems/client/sprint.ts @@ -21,14 +21,12 @@ function sprint(_: World, client: clientState): void { }) } - if (client.isRunning && client.character) { + if (client.isRunning) { client.character.Humanoid.WalkSpeed = 24 return } - if (client.character) { - client.character.Humanoid.WalkSpeed = 16 - } + client.character.Humanoid.WalkSpeed = 16 } export = sprint \ No newline at end of file diff --git a/src/ServerScriptService/ecs/systems/server/playersArePlayerCharacters.ts b/src/ServerScriptService/ecs/systems/server/playersArePlayerCharacters.ts index 8e3a5c2..014d80f 100644 --- a/src/ServerScriptService/ecs/systems/server/playersArePlayerCharacters.ts +++ b/src/ServerScriptService/ecs/systems/server/playersArePlayerCharacters.ts @@ -14,6 +14,8 @@ function playersArePlayerCharacters(world: World): void { model: character }), PlayerCharacter({ + // I know this is kinda dumb, "why not the model component!!!" + // The model component doesnt retain types character: character as CharacterRigR6, player: Players.GetPlayerFromCharacter(character) as Player, humanoid: character.WaitForChild("Humanoid") as Humanoid diff --git a/src/ServerScriptService/ecs/systems/server/playersRagdollOnDeath.ts b/src/ServerScriptService/ecs/systems/server/playersRagdollOnDeath.ts index 87df53f..7d5fdde 100644 --- a/src/ServerScriptService/ecs/systems/server/playersRagdollOnDeath.ts +++ b/src/ServerScriptService/ecs/systems/server/playersRagdollOnDeath.ts @@ -8,7 +8,7 @@ import { Model, PlayerCharacter } from "ReplicatedStorage/ecs/components" */ function playersRagdollOnDeath(world: World): void { for (const [_, playerCharacter, model] of world.query(PlayerCharacter, Model)) { - if (!model.model) continue + if (!model.model || !playerCharacter.character) continue playerCharacter.humanoid.BreakJointsOnDeath = false @@ -32,6 +32,9 @@ function playersRagdollOnDeath(world: World): void { v.Destroy() } }) + + // Makes it so their head doesn't just dangle + playerCharacter.character.HumanoidRootPart.ApplyImpulse(Vector3.FromNormalId(Enum.NormalId.Back).mul(100)) } }