Developer API Documentation
Hook your own plugins into SG Reborn matches, stats, seasons, boosters, maps, placeholders and UI.
[/CENTER]
Getting Started
Accessing the API — the public static helpers live in dev.bytecore.sgreborn.api.SGRebornAPI . java // Static helpers (no service manager needed) String stateName = SGRebornAPI.getSegment(); String mapName = SGRebornAPI.getMapName(); int aliveCount = SGRebornAPI.getAlivePlayerCount();
Optional helper APIs: dev.bytecore.sgreborn.api.AchievementAPI dev.bytecore.sgreborn.api.ChallengesAPI dev.bytecore.sgreborn.api.achievements.AbstractAchievementAPI dev.bytecore.sgreborn.api.challenges.AbstractChallenge
SGRebornAPI — Static Helper Methods
(Package: dev.bytecore.sgreborn.api )
Game / Segment
String getSegment() — Current segment name (e.g. Lobby, Grace, In-Game, Deathmatch)
int getDuration() — Elapsed seconds since match start
String getFormattedDuration() — Formatted elapsed time (e.g. 07:31)
int getGraceDuration() — Configured grace period length (sec)
int getTimeLeft() — Contextual time left for current segment (sec)
Map / Deathmatch
String getMapName() — Selected map name (or “Not chosen yet”)
String getMapFormattedName() — Display/formatted map name
java.util.List<org.bukkit.Location> getDeathmatchSpawns() — DM spawn locations (specific DM)
java.util.List<String> getCommonDeathmatchSpawns() — Common DM labeled spawns
String getCommonDeathmatchCenter() — Center (“x, y, z”) for common DM
int getCommonDeathmatchRadius() — Radius for common DM
Players & Teams
java.util.List<java.util.UUID> getAlivePlayers()
int getAlivePlayerCount()
java.util.List<java.util.UUID> getSpectators()
int getSpectatorCount()
java.util.List<java.util.UUID> getPlayersPlayed() — All who participated this match
dev.bytecore.sgreborn.teams.Team getWinner() — Winning team (null if not decided)
java.util.UUID getMVP() , double getMVPDamage() — MVP candidate + total damage
java.util.UUID getWorstPlayer() , double getWorstPlayerDamage() — “worst” metric
int getTeamCount()
java.util.List<dev.bytecore.sgreborn.teams.Team> getTeams()
Air Drops
boolean isAirDropActive()
org.bukkit.Location getRecentAirDropLocation()
boolean hasAirDropFallen(org.bukkit.Location loc)
int getAirDropProgress(org.bukkit.Location loc) — 0..100 progress
int getTimeUntilNextAirDrop() — seconds
int getAirDropClickThreshold()
Rules / Toggles
int getChestRefillStatus() — 0..100 or status enum mapped to int
int getHealthStatus() — 0..100 (health HUD helper)
boolean isFnsEnabled() — Flint&Steel toggle
boolean isHungerEnabled()
Profiles
dev.bytecore.sgreborn.profile.Profile getProfile(org.bukkit.entity.Player player)
Achievements API
(Packages: dev.bytecore.sgreborn.api , dev.bytecore.sgreborn.api.achievements )
Register + Complete java // 1) Define your achievement (extend AbstractAchievementAPI) public final class Kill100Achievement extends AbstractAchievementAPI { public Kill100Achievement() { super( "Mass Slayer", "kill_100", java.util.Arrays.asList("&7Get &e100 &7kills in total."), "Reach 100 total kills", 250 /exp/, 150 /points/ ); } [USER=32110]@Override[/USER] public void registerEvents(org.bukkit.plugin.Plugin plugin) { org.bukkit.Bukkit.getPluginManager().registerEvents(this, plugin); } @org.bukkit.event.EventHandler public void onKill(org.bukkit.event.entity.PlayerDeathEvent e) { // check killer’s stat and call complete when ready if (/ stat >= 100 /) SGAchievementAPI.completeAchievement(e.getEntity().getKiller(), this); } } // 2) Register somewhere during onEnable(): SGAchievementAPI.registerAchievement(new Kill100Achievement());
Lookup — Achievement SGAchievementAPI.getAchievementByID(String id)
Challenges API
(Packages: dev.bytecore.sgreborn.api , dev.bytecore.sgreborn.api.challenges )
Define a challenge java public final class Open50Chests extends AbstractChallenge { public Open50Chests() { super( "Loot Goblin", java.util.Arrays.asList("&7Open &e50 &7chests."), dev.bytecore.sgreborn.challenges.ChallengeType.DAILY, 50, // target 150, 100, 0,// exp, points, tokens 243600L // time limit (sec) ); } [USER=32110]@Override[/USER] public void listen(org.bukkit.event.Event event) { // increment based on your event logic } } // Register: SGChallengesAPI.registerChallenge(new Open50Chests());
Control & Data
void SGChallengesAPI.startChallenge(org.bukkit.entity.Player)
void SGChallengesAPI.finishChallenge(org.bukkit.entity.Player)
void SGChallengesAPI.failChallenge(org.bukkit.entity.Player)
dev.bytecore.sgreborn.challenges.ChallengeData SGChallengesAPI.getChallengeData(java.util.UUID)
Public Events (listen with @EventHandler)
(Package: dev.bytecore.sgreborn.api.events )
AchievementCompletionEvent — when a player completes an achievement.
Fields: Player player , Achievement achievement , boolean cancelled
Cancelable to delay downstream reward logic.
AirDropOpenEvent — fired when a player opens an air drop crate.
Fields: Player player , Location location (cloned), UUID dropId
ArmorEquipEvent — universal armor equip/unequip detector (drag, shift, hotbar, dispenser, break, death…).
Fields: Player player , CustomEventManager.ArmorType type , EquipMethod equipType , ItemStack oldArmor , ItemStack newArmor
Cancelable (prevent the equip).
BossDeathEvent — custom event boss died.
Fields: Entity boss , Player killer , java.util.Map<Player,Double> damageMap , java.util.List<Player> participants
BountyPlaceEvent — player places a bounty on a target.
Fields: Player player , Player target , int amount , int total , boolean cancelled
Cancelable (deny placement).
BountyClaimEvent — (stubbed) emitted when a bounty is claimed (class exists for forward compatibility).
WinBountyEvent — when a winner claims bounty points on match end.
Fields: Player winner , Profile winnerProfile , int bounty , String reason , boolean resetBounty , boolean cancelled
Cancelable and bounty fields are mutable.
ChallengeStartEvent / ChallengeIncrementEvent / ChallengeCheckCompletionEvent / ChallengeCompletionEvent / ChallengeFailEvent / ChallengeResetEvent
Common fields: Player player , Challenge challenge
Extras: int progress (Increment), boolean completed (CheckCompletion)
Only Completion is cancelable if you need to gate the reward flow.
ChestLootEvent — a player loots a chest tier.
Fields: Player player , org.bukkit.block.Block chestBlock , ChestManager.ChestTier chestTier , boolean cancelled
Cancelable to block tier loot.
QuestAssignEvent — quest assigned to a player.
Fields: Player player , QuestProgress quest
QuestCompleteEvent — quest progress reaches goal.
Fields: Player player , QuestProgress quest
QuestClaimEvent — quest rewards claimed.
Fields: Player player , QuestProgress quest
QuestStartEvent — (stubbed) placeholder class for future extensions.
GameStartEvent — match transitions to In-Game .
Fields: Player player (context source), boolean cancelled
Cancelable if you must delay the start.
PlayerGameStartEvent — per-player game start event.
Fields: Player player , boolean cancelled
GameEndEvent — match ends (winners decided).
Fields: java.util.List<Player> players (context — winners/participants depending on mode), boolean cancelled
GameDeathmatchEvent — deathmatch phase started.
Fields: Player player (context), boolean cancelled
GameStateChangeEvent — segment changes (Lobby/Starting/Pregame/Grace/In-Game/PreDM/DM/End).
Fields: Segment oldState , Segment newState , boolean cancelled
Cancelable for advanced control.
GameEliminationEvent — a victim is eliminated.
Fields: Player killer , Player victim , boolean cancelled
GameWinEvent — a player (or team representative) wins.
Fields: Player winner , boolean cancelled
KitUnlockEvent — player unlocks a kit.
Fields: Player player , ItemManager.KitsItem kit , Source source (COINS, PERMISSION, GRANT, OTHER ), int pricePaid
PlayerGainExpEvent — EXP added to player (points system).
Fields: Player player , Type type (gain reason), int amount
Cancelable (stop the gain).
PlayerGlobalBoostEvent — marker for global boost changes (class present; used internally for future extensions).
PlayerJumpEvent — normalized “jump” event (based on statistic increment).
Fields: Player player , PlayerStatisticIncrementEvent cause
Cancelable (prevents the base statistic increment).
PlayerLevelUpEvent — SG level changed.
Fields: Player player , int newLevel , int currentXP , int xpToNextLevel , int xpGained
PlayerSettingChangeEvent — user setting toggled via standard UI.
Fields: Player player , Settings setting , boolean newValue
SettingChangeEvent — low-level setting change (includes cause).
Fields: Player player , Profile profile , Settings setting , boolean oldValue , boolean newValue , Cause cause (COMMAND, MENU, API, LOAD, OTHER )
Async-allowed (handlers should resync if needed).
PlayerVoteEvent — player voted or changed vote (map/DM).
Fields: Player player , Vote vote (vote topic), VoteArg newChoice , [USER=241773]@Nullable[/USER] VoteArg oldChoice , int weight
Cancelable (block vote).
PlaytimeEvent — time-based progression tick (class present; used internally for playtime tracking).
[*]
SeasonAdvanceEvent — season id changes.
Fields: int oldSeasonId , int newSeasonId
[*]
SponsorPlayerEvent — a sponsor action gives an item to target.
Fields: Player sponsor , Player target , ItemStack item , int points
[/LIST]
Example: Listening to Events
Code (Java):
public
final
class MyAddon
extends JavaPlugin
implements Listener
{
[ USER
=
32110
] @Override
[
/ USER
]
public
void onEnable
(
)
{
Bukkit.
getPluginManager
(
) .
registerEvents
(
this ,
this
)
;
}
@EventHandler
public
void onState
( GameStateChangeEvent e
)
{
getLogger
(
) .
info
(
"SG state: "
+ e.
getOldState
(
)
+
" -> "
+ e.
getNewState
(
)
)
;
}
@EventHandler
( ignoreCancelled
=
true
)
public
void onVote
( PlayerVoteEvent e
)
{
if
( e.
getNewChoice
(
) .
name
(
) .
contains
(
"FORBIDDEN"
)
) e.
setCancelled
(
true
)
;
}
@EventHandler
public
void onTierLoot
( ChestLootEvent e
)
{
if
( e.
getChestTier
(
) .
name
(
) .
equalsIgnoreCase
(
"TIER_3"
)
)
{
e.
setCancelled
(
true
)
;
// block OP tier in your hub
}
}
}
Placeholders Documentation
This section was aligned to the current codebase (PAPIHook , BuiltInPlaceholders , ScoreboardDataUtil ).
PAPI PLACEHOLDERS (PlaceholderAPI)
Spoiler: Placeholders
General rule: PAPI identifiers use the form %sgreborn_identifier% . Example: %sgreborn_game_state% .
Important correction: the current generic stat/tempstat placeholders in code use player_stat<stat> and player_tempstat<tempstat> without an extra underscore after stat / tempstat .
Game / Match / Map
%sgreborn_game_state% ,
%sgreborn_game_matchid%
%sgreborn_game_duration_raw% ,
%sgreborn_game_duration_formatted%
%sgreborn_game_map% ,
%sgreborn_map_name% ,
%sgreborn_map_author% ,
%sgreborn_map_link% ,
%sgreborn_world_name%
%sgreborn_game_alive_players_int% ,
%sgreborn_game_spectator_players_int% ,
%sgreborn_game_spectator_players_list%
%sgreborn_match_mode% ,
%sgreborn_segment_name% ,
%sgreborn_alive% ,
%sgreborn_spectators% ,
%sgreborn_total_players% ,
%sgreborn_required_players%
Team / Tournament Context
%sgreborn_team_name% ,
%sgreborn_player_team_name% ,
%sgreborn_team_color%
%sgreborn_team_alive% ,
%sgreborn_team_members_total% ,
%sgreborn_team_members_alive_list% ,
%sgreborn_team_points%
%sgreborn_enemy_team_name% ,
%sgreborn_enemy_team_alive%
%sgreborn_round% ,
%sgreborn_max_rounds% ,
%sgreborn_alive_teams% ,
%sgreborn_online_teams%
Player / Profile
%sgreborn_player% ,
%sgreborn_player_name% ,
%sgreborn_player_displayname% ,
%sgreborn_uuid%
%sgreborn_player_level% ,
%sgreborn_player_level_display% ,
%sgreborn_player_level_display_nice%
%sgreborn_player_current_kit% ,
%sgreborn_player_mmr_rank% ,
%sgreborn_player_total_kdr% ,
%sgreborn_player_real_displayname%
%sgreborn_player_damage_amount% ,
%sgreborn_player_winrate% ,
%sgreborn_player_chests%
%sgreborn_player_team% ,
%sgreborn_player_team_color% ,
%sgreborn_player_team_fakecolor%
Built-in mirrored player stats (via PAPI too)
%sgreborn_wins% ,
%sgreborn_sg_wins% ,
%sgreborn_played% ,
%sgreborn_sg_played%
%sgreborn_kills% ,
%sgreborn_deaths% ,
%sgreborn_assists% ,
%sgreborn_points% ,
%sgreborn_mmr% ,
%sgreborn_experience%
%sgreborn_bounty% ,
%sgreborn_lives% ,
%sgreborn_tribute_number% ,
%sgreborn_current_kills% ,
%sgreborn_current_assists% ,
%sgreborn_current_chests% ,
%sgreborn_tournament_credits% ,
%sgreborn_kdr%
Dynamic stat / tempstat / setting syntaxes
%sgreborn_player_stat<stats_enum_lowercase>%
Examples:
%sgreborn_player_statkills% ,
%sgreborn_player_statsg_wins% ,
%sgreborn_player_statdamage_given% ,
%sgreborn_player_statmmr%
%sgreborn_player_tempstat<tempstats_enum_lowercase>%
Examples:
%sgreborn_player_tempstatkills% ,
%sgreborn_player_tempstatchests% ,
%sgreborn_player_tempstatheadshots%
%sgreborn_player_setting_<settings_enum_lowercase>%
Current settings enum values:
scoreboard ,
join_quit_messages ,
spectator_nightvision ,
spectator_showspectators ,
spectator_speed ,
boss_bar
Quests / Challenge / Scenario
%sgreborn_quest_primary_name% ,
%sgreborn_quest_primary_progress% ,
%sgreborn_quest_primary_goal% ,
%sgreborn_quest_primary_percent% ,
%sgreborn_quest_primary_state%
%sgreborn_quests_daily_remaining% ,
%sgreborn_quests_weekly_remaining%
%sgreborn_quests_daily_completed% ,
%sgreborn_quests_weekly_completed% ,
%sgreborn_quests_daily_total% ,
%sgreborn_quests_weekly_total% ,
%sgreborn_quests_active_total% ,
%sgreborn_quests_completed_total%
%sgreborn_quests_progress_<id>% ,
%sgreborn_quests_goal_<id>%
%sgreborn_challenge% ,
%sgreborn_challenges% ,
%sgreborn_challenge_name% ,
%sgreborn_challenges_name%
%sgreborn_challenge_progress% ,
%sgreborn_challenges_progress% ,
%sgreborn_challenge_goal% ,
%sgreborn_challenges_goal% ,
%sgreborn_challenge_percent% ,
%sgreborn_challenge_remaining% ,
%sgreborn_challenge_time_left% ,
%sgreborn_challenges_time_left% ,
%sgreborn_challenge_active%
%sgreborn_scenario% ,
%sgreborn_scenarios% ,
%sgreborn_scenarios_active_list% ,
%sgreborn_scenario_count% ,
%sgreborn_scenarios_active_count%
Event Systems / Runtime
%sgreborn_dm_radius%
%sgreborn_airdrop_active% ,
%sgreborn_airdrop_count% ,
%sgreborn_airdrop_location% ,
%sgreborn_airdrop_progress% ,
%sgreborn_airdrop_progress_percent% ,
%sgreborn_airdrop_clicks_needed% ,
%sgreborn_airdrop_status% ,
%sgreborn_airdrop_fallen%
%sgreborn_boss_active% ,
%sgreborn_boss_name% ,
%sgreborn_boss_health% ,
%sgreborn_boss_max_health% ,
%sgreborn_boss_health_percent% ,
%sgreborn_boss_location% ,
%sgreborn_boss_rage%
%sgreborn_gulag_enabled% ,
%sgreborn_gulag_in_gulag% ,
%sgreborn_gulag_waiting% ,
%sgreborn_gulag_wait_count% ,
%sgreborn_gulag_enter_countdown% ,
%sgreborn_gulag_duel_active% ,
%sgreborn_gulag_opponent% ,
%sgreborn_gulag_duel_countdown% ,
%sgreborn_gulag_lives_left%
%sgreborn_cooldown_active% ,
%sgreborn_cooldown_label% ,
%sgreborn_cooldown_remaining_ms% ,
%sgreborn_cooldown_remaining_s% ,
%sgreborn_cooldown_progress% ,
%sgreborn_cooldown_bar%
Leaderboards
%sgreborn_leaderboard_<stat>_<rank>%
This currently returns
"playerName: value" , not just the name.
Rank: 1..10 only (enforced in code)
Stat key: must match a valid
Stats enum key such as
kills ,
deaths ,
sg_wins ,
points ,
experience ,
mmr ,
damage_given ,
damage_taken ,
playtime , etc.
Boosters
%sgreborn_boosters_total_active% ,
%sgreborn_boosters_points_total_boost% ,
%sgreborn_boosters_exp_total_boost% ,
%sgreborn_boosters_players_list% ,
%sgreborn_boosters_active_summary%
%sgreborn_boosters_expire_time_<index>% — remaining time for active global booster slot
%sgreborn_player_credit_booster_amount% ,
%sgreborn_player_credit_booster_time% ,
%sgreborn_player_exp_booster_amount% ,
%sgreborn_player_exp_booster_time%
BUILT-IN PLACEHOLDERS (no PAPI needed)
Spoiler: Placeholders
Built-in placeholders use the same identifiers without the sgreborn_ prefix. Example: %sgreborn_game_state% in PAPI corresponds to built-in %game_state% .
The current built-in sources are BuiltInPlaceholders and ScoreboardDataUtil , so the runtime, team, quest, boss, gulag, scenario, booster and player placeholders above are also usable directly in plugin-owned renderers such as messages , scoreboards , menus , titles , actionbars , bossbars , and similar internal UI.
Common built-in families
Match / map:
%game_state% ,
%game_matchid% ,
%game_duration_formatted% ,
%game_map% ,
%map_name% ,
%map_author% ,
%map_link% ,
%world_name%
Counts:
%alive% ,
%spectators% ,
%total_players% ,
%required_players% ,
%needed_players% ,
%alive_teams% ,
%max_players%
Player / team:
%player_name% ,
%player_displayname% ,
%wins% ,
%kills% ,
%assists% ,
%deaths% ,
%mmr% ,
%experience% ,
%level_display% ,
%team_name% ,
%team_color% ,
%team_alive% ,
%team_members_alive_list%
Systems:
%airdrop_*% ,
%boss_*% ,
%gulag_*% ,
%challenge_*% ,
%quest_primary_*% ,
%quests_*% ,
%cooldown_*% ,
%chunkloading_*% ,
%scenario% ,
%scenarios_active_count% ,
%boosters_total_active%
Utility:
%date% ,
%time% ,
%datetime% ,
%server_ip% ,
%mode_label% ,
%mode_short% ,
%winner_name% ,
%view_mode%
Special internal expander