remove github, add logger

This commit is contained in:
Reid 2023-08-10 03:43:05 -07:00
parent eee1861752
commit add6db3bb6
12 changed files with 99 additions and 116 deletions

View file

@ -1,6 +0,0 @@
version: 2
updates:
- package-ecosystem: "npm" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "daily"

View file

@ -1,42 +0,0 @@
name: Build
on:
pull_request:
paths:
- "./src"
- "./tests"
push:
paths:
- "./src"
- "./tests"
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v3
- name: Set Node.js 16.x
uses: actions/setup-node@v3
with:
node-version: 16.x
- name: Run install
uses: borales/actions-yarn@v4
with:
cmd: install # will run `yarn install` command
- name: Install aftman
uses: ok-nick/setup-aftman@v0.3.0
- name: Build
uses: borales/actions-yarn@v4
with:
cmd: build # will run `yarn build` command
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
name: goopler
path: build.rbxl

View file

@ -1,33 +0,0 @@
name: Lint
on:
pull_request:
paths:
- "./src"
- "./tests"
push:
paths:
- "./src"
- "./tests"
jobs:
build:
name: ESLint
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v3
- name: Set Node.js 16.x
uses: actions/setup-node@v3
with:
node-version: 16.x
- name: Run install
uses: borales/actions-yarn@v4
with:
cmd: install # will run `yarn install` command
- name: Lint
uses: borales/actions-yarn@v4
with:
cmd: lint # will run `yarn lint` command

View file

@ -33,6 +33,7 @@
}, },
"dependencies": { "dependencies": {
"@rbxts/character-promise": "^1.0.2", "@rbxts/character-promise": "^1.0.2",
"@rbxts/log": "^0.6.3",
"@rbxts/matter": "^0.6.2-ts.6", "@rbxts/matter": "^0.6.2-ts.6",
"@rbxts/plasma": "^0.4.1-ts.1", "@rbxts/plasma": "^0.4.1-ts.1",
"@rbxts/rewire": "^0.3.0", "@rbxts/rewire": "^0.3.0",

View file

@ -45,9 +45,9 @@ export function start<S extends object>(host: Host, state: S): [World, S] {
}) })
if (host === Host.All || host === Host.Server) { if (host === Host.All || host === Host.Server) {
const _ServerState = state as serverState const ServerState = state as serverState
startTags(world, tags) startTags(world, tags, ServerState)
} }
if (host === Host.All || host === Host.Client) { if (host === Host.All || host === Host.Client) {

View file

@ -6,27 +6,17 @@ import { clientState } from "./state"
type ComponentNames = keyof typeof Components type ComponentNames = keyof typeof Components
type ComponentConstructors = (typeof Components)[ComponentNames] type ComponentConstructors = (typeof Components)[ComponentNames]
const DEBUG_SPAWN = "Spawn %ds%d with %s"
const DEBUG_DESPAWN = "Despawn %ds%d"
const DEBUG_MODIFY = "Modify %ds%d adding %s, removing %s"
let connection: RBXScriptConnection | undefined let connection: RBXScriptConnection | undefined
/** /**
* Starts the replication receiver. * Starts the replication receiver.
* *
* @param world - The world to replicate components in * @param world - The world to replicate components in
* @param ClientState - The client state for the ECS * @param client - The client state for the ECS
*/ */
export function start(world: World, ClientState: clientState): void { export function start(world: World, client: clientState): void {
if (connection) return if (connection) return
function debugPrint(message: string, args: () => (string | number)[]): void {
if (ClientState.debugEnabled) {
print("ECS Replication>", string.format(message, ...args()))
}
}
const replicationEvent = waitForEvent("EcsReplication") const replicationEvent = waitForEvent("EcsReplication")
const serverToClientEntity = new Map<string, AnyEntity>() const serverToClientEntity = new Map<string, AnyEntity>()
@ -38,7 +28,11 @@ export function start(world: World, ClientState: clientState): void {
if (clientId !== undefined && next(componentMap)[0] === undefined) { if (clientId !== undefined && next(componentMap)[0] === undefined) {
world.despawn(clientId) world.despawn(clientId)
serverToClientEntity.delete(serverId) serverToClientEntity.delete(serverId)
debugPrint(DEBUG_DESPAWN, () => [clientId, serverId]) client.logger.Debug(
"ECS Replication> Despawn {@clientId}s{@serverId}",
clientId,
serverId
)
continue continue
} }
@ -72,7 +66,12 @@ export function start(world: World, ClientState: clientState): void {
if (clientId === undefined) { if (clientId === undefined) {
const clientId = world.spawn(...componentsToInsert) const clientId = world.spawn(...componentsToInsert)
serverToClientEntity.set(serverId, clientId) serverToClientEntity.set(serverId, clientId)
debugPrint(DEBUG_SPAWN, () => [clientId, serverId, insertNames.join(",")]) client.logger.Debug(
"ECS Replication> Spawn {@clientId}s{@serverId} with {@insertNames}",
clientId,
serverId,
insertNames.join(",")
)
} else { } else {
if (componentsToInsert.size() > 0) { if (componentsToInsert.size() > 0) {
world.insert(clientId, ...componentsToInsert) world.insert(clientId, ...componentsToInsert)
@ -82,12 +81,13 @@ export function start(world: World, ClientState: clientState): void {
world.remove(clientId, ...componentsToRemove) world.remove(clientId, ...componentsToRemove)
} }
debugPrint(DEBUG_MODIFY, () => [ client.logger.Debug(
"ECS Replication> Modify {@clientId}s{serverId} adding {@insertNames}, removing {@removeNames}",
clientId, clientId,
serverId, serverId,
insertNames.size() > 0 ? insertNames.join(", ") : "nothing", insertNames.size() > 0 ? insertNames.join(", ") : "nothing",
removeNames.size() > 0 ? removeNames.join(", ") : "nothing" removeNames.size() > 0 ? removeNames.join(", ") : "nothing"
]) )
} }
} }
} }

View file

@ -1,23 +1,54 @@
/* eslint-disable roblox-ts/no-private-identifier */ /* eslint-disable roblox-ts/no-private-identifier */
import { CharacterRigR6 } from "@rbxts/character-promise" import { CharacterRigR6 } from "@rbxts/character-promise"
import { Logger } from "@rbxts/log"
import { InputKind } from "ReplicatedStorage/inputKind" import { InputKind } from "ReplicatedStorage/inputKind"
/** /**
* The client ECS state. * The client ECS state.
*/ */
export class clientState { export class clientState {
[index: string]: unknown constructor(
character?: CharacterRigR6 player: Player,
player?: Player character: CharacterRigR6,
debugEnabled = false debugEnabled: boolean,
isRunning = false isRunning: boolean,
// lastProcessedCommand: Inputkind,
logger: Logger
) {
this.character = character
this.player = player
this.debugEnabled = debugEnabled
this.isRunning = isRunning
// this.lastProcessedCommand = lastProcessedCommand
this.logger = logger
}
player: Player
character: CharacterRigR6
debugEnabled: boolean
isRunning: boolean
lastProcessedCommand?: InputKind lastProcessedCommand?: InputKind
logger: Logger
} }
/** /**
* The server ECS state. * The server ECS state.
*/ */
export class serverState { export class serverState {
[index: string]: unknown constructor(
} logger: Logger
) {
this.logger = logger
}
logger: Logger
}
/**
* The shared ECS state.
*/
export type sharedState = serverState & clientState

View file

@ -2,6 +2,7 @@ import { AnyEntity, Component, World } from "@rbxts/matter"
import { CollectionService } from "@rbxts/services" import { CollectionService } from "@rbxts/services"
import { getIdAttribute } from "ReplicatedStorage/idAttribute" import { getIdAttribute } from "ReplicatedStorage/idAttribute"
import { Model, Transform } from "./components" import { Model, Transform } from "./components"
import { serverState } from "./state"
export type ComponentConstructor<T extends object> = () => Component<T> export type ComponentConstructor<T extends object> = () => Component<T>
@ -15,7 +16,8 @@ const connections: RBXScriptConnection[] = []
*/ */
export function start( export function start(
world: World, world: World,
bound: ReadonlyMap<string, ComponentConstructor<object>> bound: ReadonlyMap<string, ComponentConstructor<object>>,
server: serverState
): void { ): void {
function spawnBound<T extends object>( function spawnBound<T extends object>(
instance: Instance, instance: Instance,
@ -26,13 +28,13 @@ export function start(
if (instance.PrimaryPart) { if (instance.PrimaryPart) {
primaryPart = instance.PrimaryPart primaryPart = instance.PrimaryPart
} else { } else {
warn("Attempted to tag a model that has no primary part:", instance) server.logger.Warn("Attempted to tag a model that has no primary part: {@instance}", instance)
return return
} }
} else if (instance.IsA("BasePart")) { } else if (instance.IsA("BasePart")) {
primaryPart = instance primaryPart = instance
} else { } else {
warn("Attempted to tag an instance that is not a Model or BasePart:", instance) server.logger.Warn("Attempted to tag an instance that is not a Model or BasePart: {@instance}", instance)
return return
} }

View file

@ -1,6 +1,7 @@
import { useEvent, World } from "@rbxts/matter" import { useEvent, World } from "@rbxts/matter"
import { Players } from "@rbxts/services" import { Players } from "@rbxts/services"
import * as Components from "ReplicatedStorage/ecs/components" import * as Components from "ReplicatedStorage/ecs/components"
import { serverState } from "ReplicatedStorage/ecs/state"
import { getEvent } from "ReplicatedStorage/remotes" import { getEvent } from "ReplicatedStorage/remotes"
type ComponentName = keyof typeof Components type ComponentName = keyof typeof Components
@ -20,7 +21,7 @@ const replicatedComponents: ReadonlySet<ComponentConstructor> = REPLICATED_COMPO
getEvent("EcsReplication") getEvent("EcsReplication")
function replication(world: World): void { function replication(world: World, server: serverState): void {
const replicationEvent = getEvent("EcsReplication") const replicationEvent = getEvent("EcsReplication")
let payload: Map<string, Map<ComponentName, { data?: Components.GooplerComponent }>> | undefined let payload: Map<string, Map<ComponentName, { data?: Components.GooplerComponent }>> | undefined
@ -43,7 +44,7 @@ function replication(world: World): void {
} }
} }
print("Sending initial payload to", player) server.logger.Debug("Sending initial payload to {@player}", player)
replicationEvent.FireClient(player, payload) replicationEvent.FireClient(player, payload)
} }

View file

@ -1,3 +1,4 @@
import Log, { Logger } from "@rbxts/log"
import { start } from "ReplicatedStorage/ecs" import { start } from "ReplicatedStorage/ecs"
import { serverState } from "ReplicatedStorage/ecs/state" import { serverState } from "ReplicatedStorage/ecs/state"
import { Host } from "ReplicatedStorage/hosts" import { Host } from "ReplicatedStorage/hosts"
@ -6,7 +7,14 @@ import { getEvent } from "ReplicatedStorage/remotes"
const HOST = Host.Server const HOST = Host.Server
const ServerState = new serverState() const serverLogger = Logger.configure()
.EnrichWithProperty("Roblox-TS Version", _VERSION)
.WriteTo(Log.RobloxOutput())
.Create()
const ServerState = new serverState(
serverLogger
)
// We only do this here at the moment to create a dummy event for replication. // We only do this here at the moment to create a dummy event for replication.
// In the future this will be created by the replication system. // In the future this will be created by the replication system.

View file

@ -1,4 +1,5 @@
import { CharacterRigR6 } from "@rbxts/character-promise" import { CharacterRigR6 } from "@rbxts/character-promise"
import Log, { Logger } from "@rbxts/log"
import { Players } from "@rbxts/services" import { Players } from "@rbxts/services"
import { start } from "ReplicatedStorage/ecs" import { start } from "ReplicatedStorage/ecs"
import { clientState } from "ReplicatedStorage/ecs/state" import { clientState } from "ReplicatedStorage/ecs/state"
@ -7,11 +8,19 @@ import { setEnvironment } from "ReplicatedStorage/idAttribute"
const HOST = Host.Client const HOST = Host.Client
const ClientState = new clientState() const clientLogger = Logger.configure()
.EnrichWithProperty("Roblox-TS Version", _VERSION)
.WriteTo(Log.RobloxOutput())
.Create()
const player = Players.LocalPlayer const ClientState = new clientState(
ClientState.character = (player.Character || player.CharacterAdded.Wait()[0]) as CharacterRigR6 Players.LocalPlayer,
ClientState.player = player (Players.LocalPlayer.Character || Players.LocalPlayer.CharacterAdded.Wait()[0]) as CharacterRigR6,
false,
false,
clientLogger
)
setEnvironment(HOST) setEnvironment(HOST)
start(HOST, ClientState) start(HOST, ClientState)

View file

@ -91,11 +91,23 @@
resolved "https://registry.yarnpkg.com/@rbxts/compiler-types/-/compiler-types-2.1.1-types.0.tgz#a1f02b57402dffec474dd6656ec1d8a897b9756b" resolved "https://registry.yarnpkg.com/@rbxts/compiler-types/-/compiler-types-2.1.1-types.0.tgz#a1f02b57402dffec474dd6656ec1d8a897b9756b"
integrity sha512-wBRma9MgPbOxvCaQEUvraHLHAmLFGW9R6fT65+MBu3uCYM6vUNWj8l4dHRxgkUK8lnGYdGWxsr/sZFk8sdvwog== integrity sha512-wBRma9MgPbOxvCaQEUvraHLHAmLFGW9R6fT65+MBu3uCYM6vUNWj8l4dHRxgkUK8lnGYdGWxsr/sZFk8sdvwog==
"@rbxts/log@^0.6.3":
version "0.6.3"
resolved "https://registry.yarnpkg.com/@rbxts/log/-/log-0.6.3.tgz#65b51a897a2d646457db95b563ade3313e08d0be"
integrity sha512-YZpDvjL7yif9aYuNAkuM9vnegcwQmOwX0CfvGfWvrzCpmARY4Ey2pTMhoEgxKo36HcdPPi3aLxmcuvn0NHrPPg==
dependencies:
"@rbxts/message-templates" "^0.3.1"
"@rbxts/matter@^0.6.2-ts.6": "@rbxts/matter@^0.6.2-ts.6":
version "0.6.4" version "0.6.4"
resolved "https://registry.yarnpkg.com/@rbxts/matter/-/matter-0.6.4.tgz#49ff6ce56bada1ce7c5e2715a05daaa3fb7615e6" resolved "https://registry.yarnpkg.com/@rbxts/matter/-/matter-0.6.4.tgz#49ff6ce56bada1ce7c5e2715a05daaa3fb7615e6"
integrity sha512-84naXqNpUfb5aCEcKf99wdqNnNAuwXh4B73GMQBzrUGiF70m0EWTdmm0qHihdlghGPrCRBSFeYK5esMJvKs/SQ== integrity sha512-84naXqNpUfb5aCEcKf99wdqNnNAuwXh4B73GMQBzrUGiF70m0EWTdmm0qHihdlghGPrCRBSFeYK5esMJvKs/SQ==
"@rbxts/message-templates@^0.3.1":
version "0.3.2"
resolved "https://registry.yarnpkg.com/@rbxts/message-templates/-/message-templates-0.3.2.tgz#85169980cf73f659282aa9846290ceaf06967167"
integrity sha512-79onYskH3pgrBT73Zs+biQ31vAVvupKQaxGNWGjyGsxwNhO2YaN/qkut0bvOshaGa+ZzqAXApRVrN8ifIMPiMQ==
"@rbxts/plasma@^0.4.1-ts.1": "@rbxts/plasma@^0.4.1-ts.1":
version "0.4.1-ts.1" version "0.4.1-ts.1"
resolved "https://registry.yarnpkg.com/@rbxts/plasma/-/plasma-0.4.1-ts.1.tgz#3d8db367c3220e6b6953cdddbf8af9f087165392" resolved "https://registry.yarnpkg.com/@rbxts/plasma/-/plasma-0.4.1-ts.1.tgz#3d8db367c3220e6b6953cdddbf8af9f087165392"