{"id":21971412,"url":"https://github.com/oldstuffs/scoreboard","last_synced_at":"2025-07-22T17:32:59.425Z","repository":{"id":49243365,"uuid":"287800920","full_name":"oldstuffs/scoreboard","owner":"oldstuffs","description":"Moved to https://github.com/Infumia/InfumiaLib","archived":true,"fork":false,"pushed_at":"2021-06-22T07:14:31.000Z","size":142,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-07-11T02:08:32.298Z","etag":null,"topics":["scoreboard"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oldstuffs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-08-15T18:14:57.000Z","updated_at":"2025-05-21T23:35:17.000Z","dependencies_parsed_at":"2022-09-14T19:53:26.083Z","dependency_job_id":null,"html_url":"https://github.com/oldstuffs/scoreboard","commit_stats":null,"previous_names":["portlek/scoreboard"],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/oldstuffs/scoreboard","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oldstuffs%2Fscoreboard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oldstuffs%2Fscoreboard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oldstuffs%2Fscoreboard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oldstuffs%2Fscoreboard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oldstuffs","download_url":"https://codeload.github.com/oldstuffs/scoreboard/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oldstuffs%2Fscoreboard/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264915633,"owners_count":23682931,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["scoreboard"],"created_at":"2024-11-29T14:50:24.664Z","updated_at":"2025-07-22T17:32:59.152Z","avatar_url":"https://github.com/oldstuffs.png","language":"Java","funding_links":[],"categories":["Java"],"sub_categories":[],"readme":"[![idea](https://www.elegantobjects.org/intellij-idea.svg)](https://www.jetbrains.com/idea/)\n\n![master](https://github.com/portlek/scoreboard/workflows/build/badge.svg)\n[![Release](https://jitpack.io/v/portlek/scoreboard.svg)](https://jitpack.io/#portlek/scoreboard)\n\n## How to Use\n\n### Maven\n\n```xml\n\u003cbuilds\u003e\n  \u003cplugins\u003e\n    \u003cplugin\u003e\n      \u003cgroupId\u003eorg.apache.maven.plugins\u003c/groupId\u003e\n      \u003cartifactId\u003emaven-shade-plugin\u003c/artifactId\u003e\n      \u003cversion\u003e3.2.4\u003c/version\u003e\n      \u003cexecutions\u003e\n        \u003cexecution\u003e\n          \u003cphase\u003epackage\u003c/phase\u003e\n          \u003cgoals\u003e\n            \u003cgoal\u003eshade\u003c/goal\u003e\n          \u003c/goals\u003e\n          \u003cconfiguration\u003e\n            \u003cminimizeJar\u003etrue\u003c/minimizeJar\u003e\n            \u003ccreateDependencyReducedPom\u003efalse\u003c/createDependencyReducedPom\u003e\n            \u003c!-- Relocations(Optional)\n            \u003crelocations\u003e\n              \u003crelocation\u003e\n                \u003cpattern\u003eio.github.portlek.scoreboard\u003c/pattern\u003e\n                \u003cshadedPattern\u003e[YOUR_PLUGIN_PACKAGE].shade\u003c/shadedPattern\u003e\n              \u003c/relocation\u003e\n            \u003c/relocations\u003e\n            --\u003e\n          \u003c/configuration\u003e\n        \u003c/execution\u003e\n      \u003c/executions\u003e\n    \u003c/plugin\u003e\n  \u003c/plugins\u003e\n\u003c/builds\u003e\n```\n\n```xml\n\u003crepositories\u003e\n  \u003crepository\u003e\n    \u003cid\u003ejitpack\u003c/id\u003e\n    \u003curl\u003ehttps://jitpack.io/\u003c/url\u003e\n  \u003c/repository\u003e\n\u003c/repositories\u003e\n```\n\n```xml\n\u003cdependencies\u003e\n  \u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.portlek.scoreboard\u003c/groupId\u003e\n    \u003cartifactId\u003escoreboard-bukkit\u003c/artifactId\u003e\n    \u003cversion\u003e${version}\u003c/version\u003e\n  \u003c/dependency\u003e\n\u003c/dependencies\u003e\n```\n\n### Gradle\n\n```groovy\nplugins {\n  id \"com.github.johnrengelman.shadow\" version \"7.0.0\"\n}\n```\n\n```groovy\nrepositories {\n  maven {\n    url \"https://jitpack.io\"\n  }\n}\n```\n\n```groovy\ndependencies {\n  implementation(\"com.github.portlek.scoreboard:scoreboard-bukkit:${version}\")\n}\n```\n\n## Example of Usage\n\n```java\nimport io.github.portlek.scoreboard.Board;\nimport io.github.portlek.scoreboard.BoardType;\nimport io.github.portlek.scoreboard.bukkit.BukkitScoreboard;\nimport io.github.portlek.scoreboard.line.AnimatedLine;\nimport io.github.portlek.scoreboard.line.Line;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.concurrent.Executors;\nimport lombok.RequiredArgsConstructor;\nimport org.bukkit.Bukkit;\nimport org.bukkit.entity.Player;\nimport org.bukkit.plugin.java.JavaPlugin;\nimport org.jetbrains.annotations.NotNull;\n\n// A simple class to show how to create boards.\n@RequiredArgsConstructor\npublic final class TestScoreboard {\n\n  private final Player player = null;\n\n  // The Bukkit scoreboard dependency.\n  @NotNull\n  private final BukkitScoreboard scoreboard;\n\n  // Creates the board and send it to observers.\n  public void createScoreboard() {\n    // This observer class is like viewer of the scoreboard in Bukkit cases, It should be Player class.\n    final var board = Board.newBuilder(Player.class)\n      // This id is for Board#getBoardById(\"id\") Board#getBoardById(ObserverClass.class \"id\")\n      // getBoardById methods are static methods so, you can use it everywhere.\n      .setId(\"test-scoreboard\")\n      // Sets the title line of the scoreboard.\n      // You can write what you want as a Line instance.\n      // You can also put animated lines in it.\n      .setTitleLine(\n        Line.dynamic(observer -\u003e \"Observer based title line\"))\n      // This tick is different from the BukkitScoreboard.create(this, TickAsLong)\n      // This is basically tick time period to send the board to the player.\n      // Animations are calculating in terms of this tick too.\n      // It's async so, don't worry about it.\n      .setTick(5L)\n      // Scoreboard sender is basically how you want to send your scoreboards to observers.\n      // It's built in code, but you can also write your own scoreboard sender.\n      .setScoreboardSender(this.scoreboard.getSender())\n      // It's basically a start delay to wait for the sending scoreboard first time.\n      // It's like runTaskTimer(plugin, () -\u003e {}, startDelay, tick) in Bukkit.\n      .setStartDelay(100L)\n      // The board type is like how you want to calculate your scoreboard's score.\n      // It's MODERN, which means high score is on the top, as default.\n      .setType(BoardType.MODERN)\n      // Sets the async scheduler which calculates and sends the scoreboard lines to the player.\n      .setAsyncScheduler(Executors.newScheduledThreadPool(4))\n      // Usage example for adding and setting the dynamic observer list.\n      .setDynamicObserverList(() -\u003e Bukkit.getOnlinePlayers())\n      .setDynamicObserverList(Bukkit::getOnlinePlayers)\n      .setDynamicObserverList(Set.of(() -\u003e Bukkit.getOnlinePlayers(), () -\u003e Bukkit.getOnlinePlayers()))\n      .setDynamicObserverList(Set.of(Bukkit::getOnlinePlayers, Bukkit::getOnlinePlayers))\n      .addDynamicObserverList(() -\u003e Bukkit.getOnlinePlayers(), Bukkit::getOnlinePlayers)\n      // Usage example for adding and setting the dynamic observers.\n      // Dynamic observers are calculating every tick asynchronously.\n      .setDynamicObservers(() -\u003e this.player, () -\u003e this.player)\n      .setDynamicObservers(Set.of(() -\u003e this.player, () -\u003e this.player))\n      .addDynamicObservers(() -\u003e this.player, () -\u003e this.player)\n      // Usage example for adding and settings static observers.\n      .addStaticObservers(this.player, this.player)\n      .setStaticObservers(this.player, this.player)\n      .setStaticObservers(Set.of(this.player, this.player))\n      // Usage example for adding and setting filters.\n      // Filters are basically if the predicate of each observer can't pass the filter,\n      // don't send the scoreboard for him.\n      .addFilters(\n        observer -\u003e observer.getName().startsWith(\"filt\"),\n        observer -\u003e observer.getName().equals(\"filtered\"))\n      .setFilters(Set.of(\n        observer -\u003e observer.getName().startsWith(\"filt\"),\n        observer -\u003e observer.getName().equals(\"filtered\")))\n      // Usage example for adding and setting lines.\n      // A line represents each score's value on the scoreboard.\n      .addLines(\n        Line.immutable(\"Immutable line which won't calculate twice, because it's immutable.\"),\n        Line.dynamic(observer -\u003e \"Observer based lines which will calculate every tick of scoreboard.\"),\n        Line.merged(\n          Line.immutable(\"Merged lines are basically contains lines and merges them into 1 line\"),\n          Line.dynamic(observer -\u003e \"Observer based line.\"),\n          // You can also merge animated lines with other lines.\n          AnimatedLine.framed(\"test\", \"tes\", \"te\", \"t\", \"t\", \"te\", \"tes\", \"test\")),\n        Line.merged(List.of(\n          Line.immutable(\"Merged lines are basically contains lines and merges them into 1 line\"),\n          Line.dynamic(observer -\u003e \"Observer based line.\"),\n          AnimatedLine.framed(\"test\", \"tes\", \"te\", \"t\", \"t\", \"te\", \"tes\", \"test\"))))\n      .setLines(List.of(\n        Line.immutable(\"Immutable line which won't calculate twice, because it's immutable.\")))\n      // The remove if method is basically remove the observer from the mutable board so,\n      // the scoreboard won't send to the observer anymore.\n      // But the dynamic observers are calculating every time so the observer will be added\n      // in the observer list again. This feature is for static observers which you want\n      // to remove after a certain time or how you want.\n      // In this case, remove the observer which has `willremove` name.\n      .addRemoveIf(\n        observer -\u003e observer.getName().equals(\"willremove\"))\n      .setRemoveIf(Set.of(\n        observer -\u003e observer.getName().equals(\"willremove\")))\n      // Usage example of the run after.\n      // This methods will run after scoreboard send.\n      .addRunAfter(\n        observer -\u003e observer.sendMessage(\"Scoreboard sent.\"))\n      .setRunAfter(Set.of(\n        observer -\u003e observer.sendMessage(\"Scoreboard sent.\")))\n      // Usage example of the run before.\n      // This methods will run before scoreboard send.\n      .addRunBefore(\n        observer -\u003e observer.sendMessage(\"Scoreboard is sending.\"))\n      .setRunBefore(Set.of(\n        observer -\u003e observer.sendMessage(\"Scoreboard is sending.\")))\n      .build();\n    // Send the board for once.\n    board.send();\n    // Start the scoreboard scheduler which waits for the start delay then runs send method every tick.\n    board.start();\n  }\n\n  // A standard bukkit plugin's main class.\n  public static final class BukkitPlugin extends JavaPlugin {\n\n    // This just creates an instance nothing happens here.\n    public final BukkitScoreboard scoreboard = BukkitScoreboard.create(\n      // The plugin main class's instance.\n      this,\n      // The tick time settings to calculate lines and set the scoreboard of the player.\n      // It's async so, don't worry about it.\n      1L);\n\n    @Override\n    public void onEnable() {\n      // Setups the scoreboard, It does not matter where you setup it, just don't setup twice :D\n      this.scoreboard.setup();\n      // This is example code to show how you can use scoreboard.\n      // It's called Dependency Injection.\n      new TestScoreboard(this.scoreboard)\n        .createScoreboard();\n    }\n  }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foldstuffs%2Fscoreboard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foldstuffs%2Fscoreboard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foldstuffs%2Fscoreboard/lists"}