{"id":"uxnknwn/planck","name":"planck","scope":"uxnknwn","platform":"roblox","description":"An Agnostic Scheduler for ECS","version":"0.1.0-rc.1","latest":"0.1.0-rc.1","versions":["0.1.0-rc.1"],"license":"MIT","licenseRating":"safe","licenseCaveats":[],"licenseVerified":true,"dependencies":{},"integrity":"d63844dea3bd242ec482dcfad2f46129ee07be385ef632664a176764d89b17bf","likes":0,"downloads":0,"install":"forest install uxnknwn/planck","url":"https://forest.dev/p/roblox/uxnknwn/planck","files":"https://api.forest.dev/ai/package/roblox/uxnknwn/planck/files","readme":"# Planck, an ECS Scheduler\n\n![GitHub License](https://img.shields.io/github/license/yetanotherclown/planck?style=flat-square)\n[![Documentation](https://img.shields.io/badge/Documentation-02B1E9?style=flat-square&logo=data:image/svg%2bxml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8dGl0bGU+TW9vbndhdmU8L3RpdGxlPgogIDxwYXRoIGQ9Ik0xMy43MzkgMTQwLjMzMWMuMjguNDkyLjQ2NSAxLjAwOC44NTEgMS40MzguODczLjk3MyAyLjE3MyAxLjAzMyAzLjI2NC4zOTcuOTg5IDIuMzc1IDMuNTg4IDIuOTgzIDUuODk5IDIuNTQ3LjUzNC0uMSAxLjkxOS0uMyAyLjEzMi0uODYyLTEuNDgzIDAtMy4xMDYuMTctNC4zNjMtLjgxOS0yLjE0Ny0xLjY4OS0uNzE1LTQuNiAxLjM4OC01LjQ3Ny0uMTM4LS40MjYtMS4xNTgtLjM5OC0xLjUzNy0uMzk2LTEuNzYyLjAwNy0yLjk0OCAxLjEwOC0zLjY2OCAyLjYyNy0uNjc1LTEuNzQ4LS4zNTQtMy4yOCAxLjE0LTQuNDg4LjM5Ny0uMzIxLjg0My0uNTM5IDEuMjg5LS43OC4xMTgtLjA2NC4zNDItLjE5Ni4xOC0uMzQxLS4xNjUtLjE0OC0uNTE2LS4xNy0uNzI1LS4yMjJhMTIuMjcyIDEyLjI3MiAwIDAgMC0yLjA4Mi0uMzJjLS44MTktLjA1OC0xLjYyNC0uMDQ0LTIuNDMuMTQ3LTMuMDcuNzI5LTQuMjc2IDMuNTg5LTUuNjM2IDYuMTAzLS41NjcgMS4wNS0xLjA1MSAyLjEyNi0xLjk5OCAyLjkwMi0xLjE1MS45NDQtMi42NzYgMS4xOC00LjExNSAxLS4zNjktLjA0Ni0uNzMtLjEyOC0xLjA5LS4yMTUtLjA4NC0uMDItLjMyNC0uMS0uMzUxLjA0My0uMDQ0LjIzNC43MzEuNDcuODk2LjU0MSAxLjA0NC40NDUgMi4xLjY4OSAzLjIyMi44MjEgMy4wNTkuMzYxIDYuNTMtMS44NTcgNy43MzQtNC42NDZ6IiBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDouMDQ5NTc0MyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEuODg1IC0xMjcuMzEpIi8+Cjwvc3ZnPg==)](https://yetanotherclown.github.io/planck)\n[![Wally Package](https://img.shields.io/badge/Wally-ad4646?style=flat-square&logoSize=auto&logo=data:image/svg%2bxml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+V2FsbHk8L3RpdGxlPjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0yMC4zMjUgMTguMTkxYy0xLjkxNSAyLjU5OS01LjEyNyA0LjI1NC04LjM1OCA0LjE4MS0uMjk2LS41MjgtLjc2My0xLjY3My4zNDgtMS4yOTcgMi4zNTUtLjA3NiA0Ljc3LTEuMDE0IDYuMzc1LTIuNzYxLjI5OS0uODUzLjgyLS45ODcgMS4zOC0uMzAxbC4xMjcuMDkuMTI4LjA4OHpNMTIuNzg1IDYuMmMtLjg5Mi4yNjQtLjEwNCAyLjY2LjQ1OSAxLjI3Mi0uMDc1LS40MDcuMjItMS4yODgtLjQ1OC0xLjI3MnptLS41OS0uMjQyYy0uNjY0LTEuMzM1IDEuOTY2LS4zNTMgMS44ODItLjIyOC0uMzI2LS44NTYtMi4zMDItMS4yNC0yLjI2My0uMTA4bC4xNzMuMTk3ek0xMS41NCAxOS4zOGMtLjI4LTEuMzY0IDEuOTY1LS45NTggMS45My0xLjgwMS0uOTkyLS4xNi0yLjM4Mi0uODMyLTEuMzQtMS45NjMgMS4wMjctMS4wMjIgMi41MzMtMS45NTYgMi40OTItMy42NDktLjI4NS42MTItLjkyIDEuOTMtMS44MzUgMi4zODctMS41NzMgMS4wOC00LjA5IDEuMTc5LTUuMjYtLjU1LS4zNDktLjQ2My0uNjg3LTEuNDkxLS40NC0uMzQyLjQ2Ni42NjguNiAxLjcwMi0uNTYxIDEuNDUzLTEuMjQ1LS40NDEtLjM2Mi0xLjc2NC0uNC0yLjY0Ni0uNi0xLjE0NCAxLjM3Ni0uNjA4IDEuNjIzLTEuNjk0QzguNjQgOS40MyA2LjcyIDguODMgNS44NDggOC45MWMtLjk5Ni4xNjUuODUxLS40OTUgMS4xOC0uNzkuNzczLS40NTMgMS41MDYtLjk5NiAyLjA5LTEuNjgyLS41NjIuNDgyLS43NjEuNTE2LS43NDktLjI4LTEuMTUyLS41Ny0uMTM3IDEuNjkzLTEuMzk3IDEuNjY4LS45MTIuNjA1LjYxOS0xLjE0NC4yMzItMS43ODctLjIxOS0xLjIzNCAxLjUtMS4zMjIgMS40My0uMjMuNzYyLS42MjQtLjYxNi0xLjAyMy0uNjE2LTEuMTczIDEuMzQ3LTEuMzA3IDMuNDEzLTEuMzk1IDUuMTItLjg3My45MTYuMjUgMS43MDQuODYyIDIuMDA2IDEuNzg2Ljg5NCAyLjA2NC40NzMgNC4zNTEuMjc4IDYuNTA0LS4xOCAxLjExNi40OTMgMi4wNzcgMS4zODEgMi40NjYuNDI2LjkxNyAxLjkxIDEuNzUyLjU3NSAyLjYwOC0xLjUzOSAxLjQ4OC0zLjY2MyAyLjQ3Ny01LjgzOCAyLjI1MnptOS4xMjMtMS42NjVjLTEuMjctLjQ3MS0xLjc3My0xLjc0Mi0yLjg4NC0yLjM2NS0uNTMzLS42MzgtLjk2LTEuMTU0LS4yOS0xLjc4My4yOTktMS4zNjggMS43OC0xLjg1MiAyLjQ1NC0yLjk4Ljc4Ny0uOTY4LjcwNC0yLjQzMS0uMjAyLTMuMjkxLS43OTctLjg2LTIuMDc2LTEuMjA2LTIuNTI3LTIuMzg1LTEuMjMtMS4wMi0zLjAyMS0xLjA1NS00LjQ5OS0xLjY3NS0xLjMyOC0uMTk0LTIuOTA1LS4yNjEtNC4wMjEuNjA2LTEuNDkyLjAzLTEuODA3IDEuNzc3LTIuNTk0IDIuNzI2LS43My42NDktMS42NTMgMS4yNjYtMS4xNTMgMi4zMzQtMS4wNDguNzE3LjE3OCAyLjAzNi42OTIgMi43NTQuMzA3IDEuMjAyLS45OTQgMy4xNzYuOTY4IDMuNTM4Ljc4NC4wMjYgMS4xNzMtLjg2OCAxLjc5Ni0uMDQzIDEuMzc1LjIyNSAxLjA5IDEuODk4IDEuMDE4IDIuOTM2LjA4Mi45MDItMS4wMiAxLjU2NS0uMzI5IDIuNS0uMTQuODc4LS4zMDMgMS42Ni0xLjI3Ni45MjMtMy45OTktMS43MTgtNi42NDktNi4xMy02LjE2Ny0xMC40NzMuMzM0LTQuMTIyIDMuMzc3LTcuODM0IDcuMzQ1LTguOTg4IDQuMDgtMS4zMSA4Ljg0Ny4yODggMTEuMzUzIDMuNzU1IDIuNTg0IDMuNDAxIDIuNzMxIDguMzguMzE2IDExLjkxWk0xMS43NjguMDAzQzYuODQ4LjAzOSAyLjE4NSAzLjQ0NS42NTIgOC4xMmMtMS40OTUgNC4xOC0uMzU4IDkuMTEzIDIuNzc2IDEyLjI0OSAzLjI1NiAzLjQ0IDguNjMzIDQuNTY5IDEzLjAxIDIuNzc0IDQuNjM2LTEuNzg5IDcuODMtNi42OTIgNy41NDItMTEuNjYtLjE1NS00LjY2My0zLjMtOS4wNC03LjY3MS0xMC42NzJhMTEuODcyIDExLjg3MiAwIDAgMC00LjU0LS44MVoiIHN0eWxlPSJmaWxsOiNGRkY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiLz48L3N2Zz4=)](https://wally.run/package/yetanotherclown/planck)\n\nAn Agnostic Scheduler, inspired by Bevy Schedules and Flecs Pipelines and Phases.\n\n> [!IMPORTANT]  \n> The Planck Scheduler and it's plugins are currently in development!\n> You can find a release candidate under `yetanotherclown/planck@0.1.0-rc.1`\n\n## Installation\n\nYou can install Planck with Wally\n\n```toml\n[dependencies]\nPlanck = \"yetanotherclown/planck@0.1.0-rc.1\"\n```\n\n## Basics\n\n### Phases\n\nA Phase is just a tag you can assign to your systems, it's a way to order systems as a group.\n\n```luau\nlocal myPhase = Phase.new(\"debugName\")\n\nscheduler\n    :insert(myPhase, RunService, \"Heartbeat\")\n    :addSystems(systemA, myPhase)\n```\n\n### Pipelines\n\nA Pipeline is a group of ordered phases. Each phase will run in the fixed order to which each Phase was passed to it.\n\n```luau\nlocal myPipeline = Pipeline.new()\n    :insert(phaseA)\n    :insert(phaseB)\n    :insert(phaseC)\n\nscheduler\n    :insert(myPipeline, RunService, \"Heartbeat\")\n```\n\n### Built-in Pipelines & Phases\n\n#### Startup\n\nSystems on these phases will run exactly once, before any other phase runs.\n\n- PreStartup\n- Startup\n- PostStartup\n\n```luau\nlocal Planck = require(\"@packages/Planck\")\nlocal Phase = Planck.Phase\n\nlocal PreStartup = Phase.PreStartup\nlocal Startup = Phase.Startup\nlocal PostStartup = Phase.PostStartup\n```\n\n#### Engine Events\n\nThese Phases are ran on Engine RunService Events,\nevents are ran in the order listed.\n\n| Event          | Phase          |\n| -------------- | -------------- |\n| PreRender      | PreRender      |\n| PreAnimation   | PreAnimation   |\n| PreSimulation  | PreSimulation  |\n| PostSimulation | PostSimulation |\n| Heartbeat      | Update         |\n\n```luau\nlocal Planck = require(\"@packages/Planck\")\nlocal Phase = Planck.Phase\n\nlocal PreRender = Phase.PreRender\nlocal PreAnimation = Phase.PreAnimation\nlocal PreSimulation = Phase.PreSimulation\nlocal PostSimulation = Phase.PostSimulation\nlocal Update = Phase.Update\n```\n\n#### Main\n\nThe Main Pipeline will run phases on the `RunService.Heartbeat` event.\n\n- First\n- PreUpdate\n- Update\n- PostUpdate\n- Last\n\n```luau\nlocal Planck = require(\"@packages/Planck\")\nlocal Phase = Planck.Phase\n\nlocal First = Phase.First\nlocal PreUpdate = Phase.PreUpdate\nlocal Update = Phase.Update\nlocal PostUpdate = Phase.PostUpdate\nlocal Last = Phase.Last\n```\n\n### Systems\n\nA system is just a function, or it could be a system table.\n\n```luau\nlocal systemA = {\n    phase = myPhase,\n    system = function()\n        -- ...\n    end,\n}\n\nlocal function systemB()\n    -- ...\nend\n\nscheduler\n    :addSystems(systemA)\n    :addSystems(systemB, myPhase)\n```\n\n### The Scheduler\n\nThe Scheduler is where you initialize all your Pipelines, Phases, and Systems.\n\n```luau\nlocal Planck = require(\"@packages/Planck\")\n\nlocal Phase = Planck.Phase\nlocal Pipeline = Planck.Pipeline\nlocal Scheduler = Planck.Scheduler\n\nlocal PreUpdate = Phase.new()\nlocal Update = Phase.new()\nlocal PostUpdate = Phase.new()\n\nlocal UpdatePipeline = Pipeline.new()\n\t:insert(PreUpdate)\n\t:insert(Update)\n\t:insert(PostUpdate)\n\nlocal Render = Phase.new()\n\nlocal scheduler = scheduler.new(world)\n    :insert(UpdatePipeline, RunService, \"Heartbeat\")\n    :insertAfter(Render, UpdatePipeline)\n    :addSystems(systems, Update)\n\nscheduler:removeSystem(systemA)\nscheduler:replaceSystem(systemA, systemB)\n\nscheduler:editSystem(systemA, newPhase)\nscheduler:editSystem(systemA)\n\nscheduler:setRunCondition(systemA, function(world)\n    return someCondition and true or false\nend)\n```\n\n### Plugins\n\nThe Planck Scheduler is pluggable, providing plugins to add\nsupport for Jabby and the Matter Hooks runtime.\n\nYou can learn more in the [Plugin Docs](https://yetanotherclown.github.io/planck/docs/plugins/).\n","readmeTruncated":false}