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