From 29541f3dc5d91b565804a519b7fbd96798efef61 Mon Sep 17 00:00:00 2001 From: reidlab Date: Sat, 19 Aug 2023 20:21:46 -0700 Subject: [PATCH 1/2] basic tool handling --- .../ecs/components/types.d.ts | 3 +- src/ReplicatedStorage/ecs/state.ts | 4 ++ .../ecs/systems/client/toolHandler.ts | 22 +++++++++++ .../server/playerCharacterToolIsTool.ts | 37 +++++++++++++++++++ .../ecs/systems/server/replication.ts | 3 +- .../ecs/systems/server/toolHandler.ts | 23 ++++++++++++ 6 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 src/ReplicatedStorage/ecs/systems/client/toolHandler.ts create mode 100644 src/ServerScriptService/ecs/systems/server/playerCharacterToolIsTool.ts create mode 100644 src/ServerScriptService/ecs/systems/server/toolHandler.ts diff --git a/src/ReplicatedStorage/ecs/components/types.d.ts b/src/ReplicatedStorage/ecs/components/types.d.ts index 106b881..31d724c 100644 --- a/src/ReplicatedStorage/ecs/components/types.d.ts +++ b/src/ReplicatedStorage/ecs/components/types.d.ts @@ -51,7 +51,8 @@ export interface Damage { export interface PlayerCharacter { character: CharacterRigR6, humanoid: Humanoid, - player: Player + player: Player, + equippedTool?: Tool } /** diff --git a/src/ReplicatedStorage/ecs/state.ts b/src/ReplicatedStorage/ecs/state.ts index f1a4d21..cc95063 100644 --- a/src/ReplicatedStorage/ecs/state.ts +++ b/src/ReplicatedStorage/ecs/state.ts @@ -14,6 +14,7 @@ export class ClientState { debugEnabled: boolean, isRunning: boolean, backpack: Backpack, + // equippedTool: Tool, // lastProcessedCommand: Inputkind, logger: Logger @@ -23,6 +24,7 @@ export class ClientState { this.debugEnabled = debugEnabled this.isRunning = isRunning this.backpack = backpack + // this.equippedTool = equippedTool // this.lastProcessedCommand = lastProcessedCommand this.logger = logger @@ -33,6 +35,8 @@ export class ClientState { debugEnabled: boolean isRunning: boolean backpack: Backpack + + equippedTool?: Tool lastProcessedCommand?: InputKind logger: Logger diff --git a/src/ReplicatedStorage/ecs/systems/client/toolHandler.ts b/src/ReplicatedStorage/ecs/systems/client/toolHandler.ts new file mode 100644 index 0000000..305fcd8 --- /dev/null +++ b/src/ReplicatedStorage/ecs/systems/client/toolHandler.ts @@ -0,0 +1,22 @@ +import { World, useEvent } from "@rbxts/matter" +import { PlayerCharacter } from "ReplicatedStorage/ecs/components" +import { getEvent } from "ReplicatedStorage/remotes" + +function toolHandler(world: World): void { + const activateToolEvent = getEvent("activateToolEvent") + const equipToolEvent = getEvent("equipToolEvent") + + for (const [_, character] of world.query(PlayerCharacter)) { + if (!character.equippedTool) continue + + for (const [_] of useEvent(character.equippedTool, "Activated")) { + activateToolEvent.FireServer() + } + + for (const [_, mouse] of useEvent(character.equippedTool, "Equipped")) { + equipToolEvent.FireServer(mouse) + } + } +} + +export = toolHandler \ No newline at end of file diff --git a/src/ServerScriptService/ecs/systems/server/playerCharacterToolIsTool.ts b/src/ServerScriptService/ecs/systems/server/playerCharacterToolIsTool.ts new file mode 100644 index 0000000..29eccb2 --- /dev/null +++ b/src/ServerScriptService/ecs/systems/server/playerCharacterToolIsTool.ts @@ -0,0 +1,37 @@ +import { None, useEvent, World } from "@rbxts/matter" +import { PlayerCharacter } from "ReplicatedStorage/ecs/components" + +/** + * Equipped tool is replicated into the ECS. + */ +function playerCharacterToolIsTool(world: World): void { + for (const [id, character] of world.query(PlayerCharacter)) { + for (const [_, toolInstance] of useEvent(character.character, "ChildAdded")) { + if (!classIs(toolInstance, "Tool")) continue + + world.insert( + id, + character.patch({ + equippedTool: toolInstance + }) + ) + } + + for (const [_, toolInstance] of useEvent(character.character, "ChildRemoved")) { + // classIs more like classWas + if (!classIs(toolInstance, "Tool")) continue + + // could also be swapping tools + const swappedTool = character.character.FindFirstChildOfClass("Tool") + + world.insert( + id, + character.patch({ + equippedTool: swappedTool ? swappedTool : None + }) + ) + } + } +} + +export = playerCharacterToolIsTool \ No newline at end of file diff --git a/src/ServerScriptService/ecs/systems/server/replication.ts b/src/ServerScriptService/ecs/systems/server/replication.ts index 08bdb15..2736cd8 100644 --- a/src/ServerScriptService/ecs/systems/server/replication.ts +++ b/src/ServerScriptService/ecs/systems/server/replication.ts @@ -9,7 +9,8 @@ type ComponentConstructor = (typeof Components)[ComponentName] const REPLICATED_COMPONENT_NAMES: readonly ComponentName[] = [ "Model", - "Transform" + "Transform", + "PlayerCharacter" ] const replicatedComponents: ReadonlySet = REPLICATED_COMPONENT_NAMES.reduce( diff --git a/src/ServerScriptService/ecs/systems/server/toolHandler.ts b/src/ServerScriptService/ecs/systems/server/toolHandler.ts new file mode 100644 index 0000000..7ec6803 --- /dev/null +++ b/src/ServerScriptService/ecs/systems/server/toolHandler.ts @@ -0,0 +1,23 @@ +import { World, useEvent } from "@rbxts/matter" +import { PlayerCharacter } from "ReplicatedStorage/ecs/components" +import { ServerState } from "ReplicatedStorage/ecs/state" +import { getEvent } from "ReplicatedStorage/remotes" + +function toolHandler(world: World, state: ServerState): void { + const activateToolEvent = getEvent("activateToolEvent") + const equipToolEvent = getEvent("equipToolEvent") + + for (const [_, character] of world.query(PlayerCharacter)) { + for (const [_, player] of useEvent(activateToolEvent, "OnServerEvent")) { + state.logger.Info("{@player} activated the tool {@tool}", player, character.equippedTool) + if (character.player !== player) continue + } + + for (const [_, player] of useEvent(equipToolEvent, "OnServerEvent")) { + state.logger.Info("{@player} equipped the tool {@tool}", player, character.equippedTool) + if (character.player !== player) continue + } + } +} + +export = toolHandler \ No newline at end of file From 3458a6e29ba31b7b18b63076d50f68f50c53c6ce Mon Sep 17 00:00:00 2001 From: reidlab Date: Sat, 19 Aug 2023 20:22:22 -0700 Subject: [PATCH 2/2] remove something extra from clientstate --- src/ReplicatedStorage/ecs/state.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ReplicatedStorage/ecs/state.ts b/src/ReplicatedStorage/ecs/state.ts index cc95063..a182ffa 100644 --- a/src/ReplicatedStorage/ecs/state.ts +++ b/src/ReplicatedStorage/ecs/state.ts @@ -36,7 +36,6 @@ export class ClientState { isRunning: boolean backpack: Backpack - equippedTool?: Tool lastProcessedCommand?: InputKind logger: Logger