EventForge v1.0.3 is a major presentation, player choice, and API update.
This release adds optional TextEffect integration, manual event voting, scheduled hybrid voting, manual event queues, queue lobby countdowns, expanded PlaceholderAPI support, new public API services, new Bukkit events, stronger validation, and safer reload behaviour.
The classic EventForge experience is still the default. New premium systems are included, but they are opt-in unless you choose to enable them.
Highlights
Optional TextEffect integration
Manual event voting
Scheduled hybrid voting
Manual event queues / hype phase
Optional queue lobby teleporting
Queue bossbar countdowns
3, 2, 1, GO queue titles
Manual-only scoring protection
Voting PlaceholderAPI support
Scheduled voting PlaceholderAPI support
Queue PlaceholderAPI support
Voting public API
Scheduled voting public API
Queue public API
Voting Bukkit events
Scheduled voting Bukkit events
Queue Bukkit events
Improved TextEffect reload handling
Improved sound compatibility
Expanded /eventforge validate checks
Updated bundled templates
Version metadata updated to 1.0.3-release
Backwards-compatible defaults
v1.0.3 keeps new installs safe by default.
TextEffect integration: disabled by default
Manual voting: disabled by default
Scheduled voting: disabled by default
Global participation: AUTOMATIC by default
Queue bossbar visuals: disabled by default
Queue countdown titles: disabled by default
Bundled templates: participation.mode: GLOBAL
This means existing event setups continue to behave like normal EventForge events until you choose to enable the new systems.
Optional TextEffect integration
Purchasing EventForge makes you eligible to download TextEffect for FREE!
EventForge can now hook into the separate TextEffect plugin to render animated shader-powered text in supported EventForge displays.
Supported areas include:
GUI item names and lore
Event broadcast/chat messages
Start/end/result messages
Titles and subtitles
Actionbars
Main event bossbars
Mob invasion / wave bossbars
Manual queue bossbars
Manual queue countdown titles
Manual queue GO titles
TextEffect is optional. If it is not installed, or if the integration is disabled, EventForge safely falls back to normal text formatting.
Configure it in config.yml:
integrations:
texteffect:
enabled: false
mode: "DISABLED"
Available modes:
ALWAYS
SERVER_STATUS
DISABLED
Sidebar animation and dialogue text animation are intentionally skipped in v1.0.3 to keep the release stable across Spigot, Paper, and Purpur 1.21 - 1.21.11.
Manual event voting
Admins can now start an event vote and let players choose which event should run next.
/eventforge vote start <event1> <event2> [event3...]
/eventforge vote cancel
/eventforge vote status
/eventforge vote confirm
Players vote with:
/events vote <event>
When a vote starts, EventForge broadcasts clickable vote options in chat. Players can click an event name to vote automatically, or use the command manually.
Manual voting is configured in config.yml:
voting:
enabled: false
default-duration: 60s
min-options: 2
max-options: 5
allow-vote-change: true
start-winner-automatically: true
broadcast-result: true
The winning event starts through EventForge's normal event start flow, so regular start checks still apply.
If the winning event uses manual participation, EventForge opens a queue instead of starting the event instantly.
Scheduled hybrid voting
v1.0.3 adds scheduled voting from schedule_config.yml.
Instead of always scheduling a single event, servers can schedule a vote and let players choose from a configured pool of events.
scheduled-voting:
enabled: false
schedules:
hourly_vote:
enabled: false
type: INTERVAL
every: 1h
duration: 60s
options:
- mining_rush
- mob_hunt
- fishing_frenzy
randomize-options: false
randomize-amount: 3
start-winner-automatically: true
announce-before:
- 5m
- 1m
require-no-active-events: true
require-no-active-vote: true
Scheduled votes support:
interval scheduling
pre-vote announcements
option pools
randomized options
active-event skip rules
active-vote skip rules
safe validation against loaded event templates
/eventforge schedules now shows both normal event schedules and scheduled event votes.
Manual event queues / hype phase
EventForge now supports manual participation mode.
Manual events open a timed queue before the event starts. Players join the queue, optionally teleport to a waiting lobby, see countdown visuals, and only queued players can score once the event begins.
participation:
mode: MANUAL
queue-duration: 30s
min-players: 1
max-players: 0
allow-leave-before-start: true
lobby:
enabled: false
world: "world"
x: 0.5
y: 80.0
z: 0.5
yaw: 0
pitch: 0
Player commands:
/events join <event>
/events leave <event>
/events tp <event>
/events teleport <event>
/events join <event> is queue-first. If no queue exists and the active event has a teleport location, it still supports the old teleport behaviour as a legacy fallback.
Queue bossbar and countdown titles
Manual queues can show a bossbar while the queue is open.
participation:
queue-bossbar:
enabled: false
title: "&ePreparing for &f{event_display} &8| &f{time_left} &8| &7Joined: &f{players}&8/&f{max_players}"
color: YELLOW
style: SOLID
Manual queues can also show 3, 2, 1, GO title countdowns.
participation:
queue-countdown:
enabled: false
seconds:
- 3
- 2
- 1
title: "&e{seconds}"
subtitle: "&f{event_display} &7starts soon..."
go-title: "&aGO!"
go-subtitle: "&f{event_display} &7has begun!"
fade-in: 0
stay: 20
fade-out: 10
The GO title is only shown if the queued event actually starts.
Manual scoring protection
Manual events are protected by a central score gate.
For participation.mode: MANUAL:
Only queued players can score
Non-queued players are ignored by objective scoring
Non-queued players do not appear on the leaderboard
Non-queued players do not receive participation rewards
For participation.mode: AUTOMATIC, events behave like previous EventForge versions.
The protection is applied centrally, so it covers built-in objectives, custom objective sessions, admin score commands, and public API score methods.
PlaceholderAPI additions
v1.0.3 adds placeholders for votes, scheduled votes, and queues.
Vote placeholders include:
%eventforge_vote_enabled%
%eventforge_vote_active%
%eventforge_vote_time_left%
%eventforge_vote_total_votes%
%eventforge_vote_options%
%eventforge_vote_option_ids%
%eventforge_vote_winner%
%eventforge_vote_winner_display%
%eventforge_vote_count_<event_id>%
%eventforge_vote_option_<event_id>%
Scheduled vote placeholders include:
%eventforge_scheduled_vote_enabled%
%eventforge_scheduled_vote_count%
%eventforge_next_scheduled_vote%
%eventforge_next_scheduled_vote_time_left%
%eventforge_next_scheduled_vote_options%
%eventforge_next_scheduled_vote_option_ids%
%eventforge_scheduled_vote_time_left_<id>%
%eventforge_scheduled_vote_options_<id>%
%eventforge_scheduled_vote_option_ids_<id>%
Queue placeholders include:
%eventforge_queue_active%
%eventforge_queue_event%
%eventforge_queue_event_display%
%eventforge_queue_time_left%
%eventforge_queue_players%
%eventforge_queue_min_players%
%eventforge_queue_max_players%
%eventforge_queue_joined%
%eventforge_queue_<event_id>_active%
%eventforge_queue_<event_id>_time_left%
%eventforge_queue_<event_id>_players%
%eventforge_queue_<event_id>_joined%
Public API additions
The public API version now reports:
1.0.3-release
New API services include:
EventVoteService
ScheduledVoteService
EventQueueService
New immutable snapshot objects include:
EventVoteInfo
ScheduledVoteInfo
EventQueueInfo
These APIs are snapshot-based and do not expose internal runtime objects such as vote sessions, queue objects, scheduler tasks, or mutable maps.
Bukkit API events
v1.0.3 adds Bukkit events for voting, scheduled voting, and queues.
Manual vote events:
EventForgeVoteStartEvent
EventForgeVoteCastEvent
EventForgeVoteEndEvent
EventForgeVoteCancelEvent
Scheduled vote events:
EventForgeScheduledVoteStartEvent
EventForgeScheduledVoteSkipEvent
Queue events:
EventForgeQueueOpenEvent
EventForgeQueueJoinEvent
EventForgeQueueLeaveEvent
EventForgeQueueStartEvent
EventForgeQueueCancelEvent
Queue start events only fire when the queued event successfully starts.
Queue cancel events can report reasons such as:
NOT_ENOUGH_PLAYERS
START_FAILED
Validation improvements
/eventforge validate was expanded to check more runtime and config problems.
New validation coverage includes:
invalid TextEffect mode
scheduled voting config
scheduled vote intervals
scheduled vote durations
scheduled vote options
duplicate scheduled vote options
invalid scheduled vote randomize amount
scheduled vote announce-before values
participation default mode
queue bossbar color
queue bossbar style
queue countdown seconds
queue countdown title timing
event participation mode
queue duration
min/max queue player limits
lobby world
lobby height
lobby pitch
schedule_config.yml can also be checked directly:
/eventforge validate schedule_config.yml
Sound compatibility
Sound playback was updated to avoid risky enum lookups on older 1.21 builds.
Configs can use formats such as:
sound: ENTITY_PLAYER_LEVELUP
sound: entity.player.levelup
sound: minecraft:entity.player.levelup
Dialogue sounds use the same safer sound handling.
Template polish
Bundled templates were updated for v1.0.3.
They now include:
variables:
event_plain_name: "Example Event"
This gives server owners a clean text value to use inside optional TextEffect tags.
Templates also include updated participation comments, optional TextEffect notes, and metadata updated from 1.0.2 to 1.0.3.
Compatibility summary
EventForge v1.0.3 avoids risky version-specific systems.
This update does not add:
NMS
ProtocolLib
packet sidebar rendering
direct TextEffect internals
Sound enum lookup
Bukkit scoreboard JSON hacks
Supported platforms remain:
Spigot 1.21 - 1.21.11
Paper 1.21 - 1.21.11
Purpur 1.21 - 1.21.11
Java 21 is recommended.
Summary
EventForge v1.0.3 is a major premium event presentation and player-choice update.
It adds optional animated TextEffect display support, full manual and scheduled event voting, and a complete manual queue/hype phase system. Server owners can keep classic automatic participation or enable manual queue mode for more polished competitions.
The update also expands PlaceholderAPI, validation, and the public API with safe immutable snapshots and Bukkit events for voting, scheduled voting, and queues.
EventForge v1.0.2 is a large framework update focused on wider server support, better validation tools, more event visuals, new objective types, public API improvements, and updated addon examples.
This version also moves EventForge from a Paper-focused build to a Spigot-compatible build.
tip
v1.0.2 is a strong update for both server owners and addon developers. It adds more ready-to-play content while also making the public API much more useful.
Highlights
Spigot support
/eventforge validate
/eventforge errors
More PlaceholderAPI placeholders
Public VariableService
Public ActionService
Public TextEffectService
Animated titles
Animated actionbars
Animated bossbar text
CAPTURE_ZONE objective
VISIT_REGIONS objective
INTERACT_BLOCKS objective
Event milestones
Improved template installer
Mob Invasion empty-area wave pause
/events join <event>
Updated ready-to-play templates
Updated Simple Example addon
Updated Advanced Example addon
Updated Skript addon
Protected built-in API registrations
Spigot support
EventForge now supports:
Spigot 1.21 - 1.21.11
Paper 1.21 - 1.21.11
Purpur 1.21 - 1.21.11
This makes EventForge easier to use on more server setups.
New validation commands
v1.0.2 adds:
/eventforge validate
/eventforge validate <event>
Use this to check event files without starting them.
It helps catch:
YAML mistakes
missing objective sections
invalid materials
invalid particles
wrong configuration paths
bad template setup
New error report command
v1.0.2 adds:
/eventforge errors
/eventforge errors <event>
This shows the latest validation or reload problems without searching through console logs.
Message cleanup
More command output now comes from:
messages.yml
Improved areas include:
event lists
active events
leaderboards
schedules
dialogue command output
/events console output
validation messages
error report messages
template installer messages
join messages
PlaceholderAPI improvements
v1.0.2 adds more PlaceholderAPI placeholders for:
active events
next scheduled event
player stats
event status
event cooldowns
event metadata
player score
player rank
participant count
Examples:
%eventforge_active_names%
%eventforge_next_event%
%eventforge_next_event_time%
%eventforge_player_total_score%
%eventforge_player_events_played%
%eventforge_player_wins%
%eventforge_event_mining_rush_active%
%eventforge_event_mining_rush_time_left%
%eventforge_event_mining_rush_player_score%
%eventforge_event_mining_rush_player_rank%
Public VariableService
v1.0.2 adds:
EventForgeAPI.getVariableService()
Addon developers can now parse EventForge variables properly instead of duplicating {var:key} logic.
Example:
EventForgeAPI.getVariableService().parse(eventId, text);
EventForgeAPI.getVariableService().parse(eventId, player, text);
This is useful for addon messages, custom objectives, custom actions, and external integrations.
Public ActionService
v1.0.2 adds:
EventForgeAPI.getActionService()
Addon developers can now execute EventForge actions through the official action system.
Supported through the shared action system:
MESSAGE
BROADCAST
TITLE
ACTIONBAR
SOUND
COMMAND
EFFECT
PARTICLE
FIREWORK
WEBHOOK
ANIMATED_TITLE
ANIMATED_ACTIONBAR
This means addons can reuse the same action behaviour as normal EventForge event configs.
Public TextEffectService
v1.0.2 adds:
EventForgeAPI.getTextEffectService()
Text effects can be used by EventForge and addons through the same parser.
Supported effects include:
<rainbow>Text</rainbow>
<reverse-rainbow>Text</reverse-rainbow>
<gradient:#22d3ed:#ffffff>Text</gradient>
<alternate:#22d3ed:#ffffff>Text</alternate>
<striped:#22d3ed:#ffffff>Text</striped>
<pulse:#22d3ed:#ffffff>Text</pulse>
<blink:#ffffff:#555555>Text</blink>
<wave:#22d3ed:#ffffff>Text</wave>
<scan:#777777:#ffffff>Text</scan>
<shimmer:#22d3ed:#ffffff>Text</shimmer>
<wobble:#22d3ed:#ffffff>Text</wobble>
<jump:#22d3ed:#ffffff>Text</jump>
<solid:#22d3ed>Text</solid>
<fire>Text</fire>
<ocean>Text</ocean>
<ice>Text</ice>
<magic>Text</magic>
<toxic>Text</toxic>
<sunset>Text</sunset>
<stack:rainbow,wobble>Text</stack>
<effects:fire,jump>Text</effects>
Legacy colour codes inside effect tags are cleaned up safely, so display names like &aCollection Rush do not show raw &a inside gradients.
Animated titles
v1.0.2 adds:
ANIMATED_TITLE
Example:
- type: ANIMATED_TITLE
frames:
- title: "<stack:rainbow,wobble>{event_display}</stack>"
subtitle: "&7Starting..."
fade-in: 5
stay: 40
fade-out: 10
interval: 5
Animated titles support:
placeholders
variables
text effects
animation ticks
tracked cancellation
Animated actionbars
v1.0.2 adds:
ANIMATED_ACTIONBAR
Example:
- type: ANIMATED_ACTIONBAR
frames:
- message: "<pulse:#22d3ed:#ffffff>+{score_change} points</pulse> &8| &7Total: &f{new_score}"
duration: 30
interval: 5
Animated actionbars are useful for player score feedback, milestone progress, event warnings, and short event messages.
Tracked animation manager
Animated title and actionbar tasks are now tracked internally.
They are cancelled safely when:
event stops
event reloads
all events stop
plugin disables
This prevents delayed animation frames from continuing after an event has ended.
Animated bossbar text
Bossbars can now rotate through configurable frames.
Example:
bossbar:
enabled: true
text: "&e{event_display} &8| &f{time_left}"
color: YELLOW
style: SOLID
animated-text:
enabled: true
interval: 20
frames:
- "<stack:rainbow,wobble>{event_display}</stack> &8| &f{time_left}"
- "&eScore: &f{score} &8| &7Rank: &e#{rank}"
- "<pulse:#22d3ed:#ffffff>Keep going!</pulse>"
This lets bossbars feel more active without needing a resource pack.
New objective: CAPTURE_ZONE
CAPTURE_ZONE is a KOTH-style objective.
It supports:
score while standing in zones
points every X seconds
contested zone handling
team field
team placeholder
zone particle rendering
capture actions
contested actions
rich placeholders
Public API classes:
CaptureZoneInfo
CaptureZoneObjectiveData
ZoneRenderInfo
Example use cases:
King of the Hill
capture zones
server war events
team capture points
PvP events
New objective: VISIT_REGIONS
VISIT_REGIONS is an exploration/checkpoint objective.
It supports:
score when entering configured regions
once-per-player visits
cooldowns
region discovery messages
region discovery actionbars
region actions
rich placeholders
Public API classes:
VisitRegionInfo
VisitRegionsObjectiveData
Example use cases:
exploration hunt
spawn tour
easter egg hunt
checkpoint event
landmark discovery
New objective: INTERACT_BLOCKS
INTERACT_BLOCKS lets players score by right-clicking configured blocks.
It supports:
vanilla blocks
ItemsAdder custom block IDs
Oraxen custom block IDs
Nexo custom block IDs
fallback materials
per-location tracking
global tracking
cooldowns
once-per-player interactions
cancel-event
success actions
cooldown actions
rich placeholders
Public API classes:
InteractBlockInfo
InteractBlocksObjectiveData
Example use cases:
bell hunt
button hunt
crate hunt
hidden object hunt
custom block interaction event
Event milestones
Events can now define score milestones.
Example:
milestones:
enabled: true
thresholds:
50:
display-name: "&e50 Points"
once-per-player: true
actions:
- type: MESSAGE
message: "&aYou reached {milestone_display}!"
- type: SOUND
sound: ENTITY_PLAYER_LEVELUP
Milestones support:
per-player tracking
score threshold detection
milestone actions
milestone placeholders
public API event
Milestone placeholders include:
{milestone}
{milestone_display}
{milestone_threshold}
{old_score}
{new_score}
{score}
{score_change}
Public API:
EventMilestoneInfo
EventForgePlayerMilestoneEvent
Improved template installer
Template installation now supports overwrite confirmation.
/eventforge installtemplate <template>
/eventforge installtemplate <template> confirm
This makes updating bundled templates safer because EventForge will not overwrite an existing installed event unless you confirm it.
Mob Invasion polish
Mob Invasion now supports:
start-requirements:
require-player-nearby: true
radius: 50
empty-area:
pause-waves: true
radius: 50
join:
enabled: true
world: world
x: 0
y: 70
z: 0
yaw: 0
pitch: 0
New player command:
/events join <event>
This helps stop waves from spam-completing when nobody is near the invasion area.
Updated ready-to-play templates
New bundled templates:
capture_zone.yml
exploration_hunt.yml
interact_blocks_hunt.yml
Existing templates were also updated to showcase v1.0.2 features while staying vanilla-friendly.
Protected built-in API registrations
Built-in action and objective registrations are now protected.
Protected built-in objectives:
MINE_BLOCKS
KILL_MOBS
FISH_ITEMS
COLLECT_ITEMS
MOB_INVASION
CAPTURE_ZONE
VISIT_REGIONS
INTERACT_BLOCKS
Protected built-in actions include:
ANIMATED_TITLE
ANIMATED_ACTIONBAR
This prevents addons from accidentally unregistering EventForge core systems.
Updated EventForgeSkriptAddon
EventForgeSkriptAddon was updated for v1.0.2.
Added new Skript expressions:
eventforge text effects of %string%
eventforge text effects of %string% at tick %number%
eventforge parsed variables of %string% for event %string%
eventforge parsed variables of %string% for event %string% and player %player%
eventforge milestone count of event %string%
eventforge milestones of event %string%
eventforge milestone threshold %string% of event %string%
eventforge milestone display name %string% of event %string%
Added new Skript events:
on eventforge event start
on eventforge event stop
on eventforge event finish
on eventforge reload
on eventforge score change
on eventforge milestone
Added event-context expressions:
current eventforge event id
current eventforge event display name
eventforge event player
eventforge old score
eventforge new score
eventforge score change
eventforge milestone id
eventforge milestone display name
eventforge milestone threshold
eventforge reload loaded events
eventforge reload validation warnings
eventforge reload validation errors
eventforge reload scheduled events
eventforge reload registered objectives
New example script:
eventforge-v102-features.sk
Updated Simple Example addon
EventForgeSimpleExample was updated to demonstrate v1.0.2 API features.
Added command examples:
/efsimple texteffects <text>
/efsimple parse <event> <text>
/efsimple milestones <event>
It now demonstrates:
TextEffectService
VariableService
EventInfo#getMilestones()
EventMilestoneInfo
EventForgePlayerMilestoneEvent
Updated Advanced Example addon
EventForgeAdvancedExample was updated to demonstrate advanced v1.0.2 API usage.
It now showcases:
custom objective registration
custom action registration
VariableService
TextEffectService
animated title/actionbar/bossbar config
event milestones
milestone placeholders
dialogue integration
custom objective scoring
The bundled relic_hunt.yml example was updated to v1.0.2.
Summary
EventForge v1.0.2 adds a lot of practical value:
more supported server software
better admin debugging tools
more polished event visuals
more ready-to-play objectives
better Mob Invasion behaviour
more useful public API
updated addon examples
EventForge v1.0.1 expands the plugin into a more complete event framework update. View full changelog here
This release adds reusable event variables, chance rewards, event cooldowns, multi-objective events, the action/trigger system, webhook actions, configurable GUI titles, NPC-style dialogues, API improvements, updated addon examples, and a much larger Skript addon.
Highlights
Event variables
Chance rewards
Event cooldowns
Better API filtering
Start check reasons
Upcoming schedule API
Action and trigger system
Webhook action
Multi-objective events
GUI title customization
NPC-style dialogue system
Updated simple addon
Updated advanced addon
Updated Skript addon
Bundled Skript example scripts
API published to Maven Central
Event variables
Event configs can now define reusable variables:
variables:
event_color: "&b"
arena_name: "Spawn Mine"
reward_name: "Mining Tokens"
Use them with:
{var:key}
Example:
display-name: "{var:event_color}Mining Rush"
messages:
start:
- "{var:event_color}&lMining Rush has started!"
- "&7Mine blocks in &f{var:arena_name}&7."
Variables can be used in player-facing event text such as messages, rewards, bossbars, sidebars, titles, actions, dialogues, and webhooks.
Variable keys are normalised, so hyphens and underscores are treated consistently.
Chance rewards
Rewards now support optional chance-based bonus rewards.
rewards:
participation:
enabled: true
minimum-score: 1
commands:
- "eco give {player} 100"
chance-rewards:
bonus_key:
chance: 10.0
commands:
- "crate key give {player} event 1"
Chance rewards are supported under:
rewards.participation.chance-rewards
rewards.leaderboard.<position>.chance-rewards
Chance values are percentages.
5.0 = 5%
25.0 = 25%
100.0 = guaranteed
Chance rewards use the same reward command pipeline as normal rewards, so developer reward listeners still work.
Event cooldowns
Events can now have cooldowns.
cooldown:
enabled: true
duration: 1h
Cooldown behaviour:
natural event finish starts cooldown
forced stop does not start cooldown
reload/shutdown does not start cooldown
manual starts respect cooldown
scheduled starts respect cooldown
API starts respect cooldown
Skript addon starts respect cooldown through the API
cooldowns persist in cooldowns.yml
Cooldowns are stored in:
plugins/EventForge/cooldowns.yml
Better API filtering and start checks
The API now includes better event filtering and start validation.
New EventService methods include:
getEventsByCategory(String category);
getEventsWithTag(String tag);
getEventsByDifficulty(String difficulty);
getStartCheckResult(String eventId);
canStartEvent(String eventId);
EventStartCheckResult provides:
canStart();
hasPassed();
hasFailed();
getEventId();
getReason();
This is useful for:
custom GUIs
Discord bots
event browsers
admin dashboards
setup tools
start buttons
Upcoming schedule API
ScheduleService now includes:
getUpcomingEvents(int limit);
This lets addons and dashboards show several upcoming scheduled events instead of only the next one.
Action and trigger system
v1.0.1 expands the action and trigger system.
Supported triggers:
event-start
event-finish
event-stop
player-score
Built-in action types:
BROADCAST
MESSAGE
TITLE
ACTIONBAR
SOUND
COMMAND
EFFECT
PARTICLE
FIREWORK
WEBHOOK
Example:
triggers:
event-start:
actions:
- type: BROADCAST
message: "&b{event_display} has started!"
player-score:
actions:
- type: ACTIONBAR
message: "&a+{score_change} points &8| &f{new_score} total"
Webhook action
The new WEBHOOK action can send HTTP POST messages asynchronously.
triggers:
event-start:
actions:
- type: WEBHOOK
url: "https://discord.com/api/webhooks/..."
username: "EventForge"
message: "{event_display} has started!"
Webhook safety improvements include:
HTTPS-only URLs
async execution
main thread is not blocked
Discord message length cap
username length cap
webhook URL is not printed in logs
placeholder support
{var:key} support
warning
Do not share real webhook URLs in public configs, screenshots, template packs, or support messages.
Custom action API
Developers can now register custom actions.
EventForgeAPI.getActionRegistry().register("DISCORD_LOG", (action, context) -> {
String message = action.getString("message", "{event_display} started!");
String parsed = context.parsePlaceholders(message);
Bukkit.getLogger().info(parsed);
});
Server owners can use registered custom actions in event YAML:
triggers:
event-start:
actions:
- type: DISCORD_LOG
message: "{event_display} started!"
Custom action executor errors are caught safely so events continue running.
Multi-objective events
Events can now run multiple objectives at the same time.
objectives:
mining:
type: MINE_BLOCKS
weight: 1.0
mobs:
type: KILL_MOBS
weight: 1.5
fishing:
type: FISH_ITEMS
weight: 1.0
All objectives contribute to the same event score and leaderboard.
The old format still works:
objective:
type: MINE_BLOCKS
Objective weight acts like a score multiplier.
Player-facing displays should show:
Multiplier: x1.5
not:
Weight: 1.5
Multi-objective developer API
Custom objective developers now have access to:
EventObjectiveSession#getObjectiveId();
EventObjectiveSession#getObjectiveDisplayName();
EventObjectiveSession#getObjectiveWeight();
EventObjectiveSession#getWeightedScore(int amount);
EventInfo also exposes objective data:
EventInfo#getObjectives();
EventInfo#hasMultipleObjectives();
Custom objectives should use the public EventObjectiveSession API and should not cast sessions to internal classes.
GUI config updates
GUI title customization is now available in config.yml.
gui:
enabled: true
rows: 6
titles:
player-main: "&b&lEventForge"
player-active: "&b&lActive Events"
admin-main: "&c&lEventForge Admin"
Implemented in v1.0.1:
GUI titles can be customized
colour codes are supported
configured titles are respected by GUI listeners
GUI config reloads through EventForge reload
hardcoded title constants remain as fallbacks
Current limitation:
GUI layouts still use fixed 6-row menus.
gui.rows is reserved for a future layout update.
Dialogue system
v1.0.1 adds an NPC-style dialogue engine.
dialogues:
guide_intro:
npc-id: "guide"
display-name: "Guide Introduction"
cancel-existing: true
lines:
- speaker: "&eGuide"
text: "&fHello {player}."
title: "&eGuide"
subtitle: "&fWelcome."
sound: ENTITY_VILLAGER_AMBIENT
delay: 3
Simple line format is also supported:
dialogues:
guide_intro:
lines:
- "&eGuide: &fHello there!"
- "&eGuide: &fBring me 5 relics."
EventForge provides the dialogue engine. Addons, Skript, NPC plugins, or custom objectives decide when to start a dialogue.
Dialogue API
New public API:
DialogueLineInfo
DialogueSequenceInfo
DialogueSessionInfo
DialogueService
EventForgeAPI#getDialogueService()
Common usage:
EventForgeAPI.getDialogueService()
.startEventDialogue(player, "relic_hunt", "guide_intro")
.thenAccept(session -> {
if (session.isCompleted()) {
// Move player to next task.
}
});
New Bukkit events:
EventForgeDialogueCompleteEvent
EventForgeDialogueCancelEvent
PlaceholderAPI additions
v1.0.1 adds placeholders for variables, cooldowns, filtering, and start checks.
Examples:
%eventforge_event_variable_<event>_<variable>%
%eventforge_event_on_cooldown_<event>%
%eventforge_event_cooldown_<event>%
%eventforge_events_category_count_<category>%
%eventforge_events_tag_count_<tag>%
%eventforge_events_difficulty_count_<difficulty>%
%eventforge_event_can_start_<event>%
%eventforge_event_start_reason_<event>%
API published to Maven Central
The EventForge API is available from Maven Central.
<dependency>
<groupId>dev.hxze</groupId>
<artifactId>eventforge-api</artifactId>
<version>1.0.1-release</version>
<scope>provided</scope>
</dependency>
Simple addon update
The Simple Addon has been updated to v1.0.1.
It now demonstrates:
EventService cooldown checks
event start check reasons
category/tag/difficulty filtering
upcoming schedules
event variables
multi-objective inspection
registered action listing
dialogue Bukkit events
player-facing multiplier display
The package structure was cleaned into:
command
listener
util
Advanced addon update
The Advanced Relic Hunt addon has been updated to v1.0.1.
It now demonstrates:
custom RELIC_HUNT objective
custom RELIC_LOG action
multi-objective sessions
weighted score display
DialogueService usage
variables
cooldowns
triggers
built-in actions
custom actions
chance rewards
The package structure was cleaned into:
action
objective
model
util
Skript addon update
EventForgeSkriptAddon has been updated to v1.0.1.
New effects:
clear eventforge cooldown of event %string%
start eventforge dialogue %string% of event %string% for %player%
cancel eventforge dialogue for %player%
New expression groups:
cooldowns
start checks
event variables
metadata filtering
upcoming schedules
multi-objective info
dialogues
The addon now depends on:
dev.hxze:eventforge-api:1.0.1-release
Skript example scripts
The Skript addon now includes ready-to-use example scripts under:
example-scripts/
Included scripts:
eventforge-player-status.sk
eventforge-admin-tools.sk
eventforge-leaderboard.sk
eventforge-event-browser.sk
eventforge-upcoming-events.sk
eventforge-dialogues.sk
eventforge-custom-rewards.sk
eventforge-multi-objective.sk
README.txt
These can be copied into:
plugins/Skript/scripts/
Notes for upgrading
Existing v1.0.0 event files should continue to work.
You can keep using:
objective:
type: MINE_BLOCKS
or move to:
objectives:
mining:
type: MINE_BLOCKS
when you want multi-objective events.
Recommended upgrade steps:
Update EventForge jar
Restart the server
Check console for validation warnings
Add cooldowns only where needed
Add variables to simplify large configs
Move new events to objectives: format
Update addon examples to 1.0.1-release API
Update Skript addon if you use Skript integration
EventForge v1.0.0 is the first full release of EventForge, moving the plugin from beta into a more complete and polished release state.
Last updated 18/05/2026
This release focuses on:
Paper/Purpur compatibility
PlaceholderAPI support
expanded developer API
Skript support
event metadata
advanced conditions
better validation
better diagnostics
updated example addons
Compatibility
EventForge has been tested on:
Paper 1.21.x
Purpur 1.21.x
Tested Minecraft versions:
1.21
1.21.2
1.21.4
1.21.5
1.21.8
1.21.11
Required Java version:
Java 21
info
EventForge is designed for modern Paper and Purpur servers.
Added PlaceholderAPI Support
EventForge now includes optional PlaceholderAPI support.
PlaceholderAPI is not required for EventForge to run, but if it is installed, EventForge automatically registers its placeholders.
General placeholders
%eventforge_version%
%eventforge_api_version%
%eventforge_loaded_count%
%eventforge_active_count%
%eventforge_active_events%
Event placeholders
%eventforge_event_active_<event>%
%eventforge_event_loaded_<event>%
%eventforge_event_display_<event>%
%eventforge_event_time_left_<event>%
%eventforge_event_elapsed_<event>%
%eventforge_event_participants_<event>%
Player placeholders
%eventforge_player_score_<event>%
%eventforge_player_rank_<event>%
%eventforge_player_participating_<event>%
Leaderboard placeholders
%eventforge_top_player_<event>_1%
%eventforge_top_score_<event>_1%
Schedule placeholders
%eventforge_scheduled_count%
%eventforge_next_scheduled_event%
%eventforge_next_scheduled_time%
%eventforge_event_scheduled_<event>%
%eventforge_event_next_start_<event>%
Metadata placeholders
%eventforge_event_category_<event>%
%eventforge_event_difficulty_<event>%
%eventforge_event_author_<event>%
%eventforge_event_version_<event>%
%eventforge_event_tags_<event>%
%eventforge_event_description_<event>%
These placeholders can be used in supported scoreboard, TAB, hologram, menu, chat, and dashboard plugins.
Added Event Metadata
Events can now include optional metadata.
Example:
metadata:
category: "Mining"
tags:
- mining
- survival
- economy
difficulty: "Easy"
author: "HxZe"
version: "1.0.0"
description:
- "Mine configured blocks to earn points."
- "Compete for leaderboard rewards."
Metadata is useful for:
event browsers
custom GUIs
Discord embeds
dashboards
event pack tools
PlaceholderAPI
developer addons
Developers can access metadata through:
eventInfo.getMetadata()
Added Advanced Conditions
EventForge conditions have been expanded.
Events can now use:
minimum players
world restrictions
required permissions
blocked permissions
operator requirements
Minecraft time windows
weather restrictions
Example:
conditions:
minimum-players: 1
worlds:
- world
permissions: []
blocked-permissions: []
require-op: false
require-non-op: false
time:
enabled: false
min: 0
max: 23999
weather:
allowed: []
Permission conditions
permissions:
- "eventforge.event.mining"
Blocked permission conditions
blocked-permissions:
- "eventforge.event.blocked"
Time conditions
time:
enabled: true
min: 0
max: 13000
Weather conditions
weather:
allowed:
- CLEAR
- RAIN
- THUNDER
This gives server owners and event pack creators more control over when events can start.
Added Public API Services
The EventForge API has been expanded with several new services.
EventPackService
Added:
EventForgeAPI.getEventPackService()
Developers can now read:
pack IDs
pack display names
pack enabled state
pack authors
pack versions
pack event file counts
total pack count
enabled pack count
Useful for:
event pack browsers
custom GUIs
dashboards
Discord bots
pack management addons
StatsService
Added:
EventForgeAPI.getStatsService()
Developers can now read:
player stats
per-event player stats
all tracked player stats
event history
recent event history
tracked player count
history count
winner data
Useful for:
player profile menus
stats GUIs
Discord commands
web dashboards
holograms
analytics tools
ScheduleService
Added:
EventForgeAPI.getScheduleService()
Developers can now read:
scheduled event IDs
scheduled event info
next scheduled event
next start epoch second
seconds until next start
schedule type
interval seconds
announce-before timings
scheduled event count
Useful for:
scoreboards
TAB integrations
Discord countdowns
NPC displays
event dashboards
server websites
ObjectiveService
Added:
EventForgeAPI.getObjectiveService()
Developers can now read:
registered objective IDs
whether an objective is registered
registered objective count
Useful for:
diagnostics
setup GUIs
admin dashboards
custom objective addon checks
Added Bukkit Developer Events
EventForge now fires custom Bukkit events for addon developers.
Added:
EventForgeEventStartEvent
EventForgeEventStopEvent
EventForgeEventFinishEvent
EventForgePlayerScoreChangeEvent
EventForgeReloadEvent
EventForgeRewardExecuteEvent
Event start/stop/finish events
Developers can listen for:
EventForgeEventStartEvent
EventForgeEventStopEvent
EventForgeEventFinishEvent
Example:
EventHandler
public void onEventStart(EventForgeEventStartEvent event) {
Bukkit.broadcastMessage("Event started: " + event.getEventDisplayName());
}
Score change event
Added:
EventForgePlayerScoreChangeEvent
This event is cancellable and can modify the final score.
Example:
EventHandler
public void onScoreChange(EventForgePlayerScoreChangeEvent event) {
if (event.getPlayer().hasPermission("eventforge.booster.double")) {
event.setNewScore(event.getNewScore() * 2);
}
}
Reload event
Added:
EventForgeReloadEvent
This fires after EventForge reloads and includes reload summary information.
Useful for:
refreshing addon caches
refreshing menus
updating dashboards
logging validation status
Reward execution event
Added:
EventForgeRewardExecuteEvent
This event fires before EventForge executes a reward command.
It is cancellable and the command can be modified.
Example:
EventHandler
public void onReward(EventForgeRewardExecuteEvent event) {
event.setCommand(event.getCommand().replace("diamond", "emerald"));
}
Reward types:
PARTICIPATION
LEADERBOARD
Useful for:
reward logging
Discord logs
custom reward systems
anti-abuse checks
reward multipliers
external integrations
Added Helper API Improvements
Custom objective developers now have more helper methods.
EventObjectiveLoadContext
New helper methods include:
getLong(...)
getKeys(...)
isSection(...)
getCleanStringList(...)
requireString(...)
requirePositiveInt(...)
requirePositiveDouble(...)
getMaterial(...)
getEntityType(...)
getTimeSeconds(...)
requireTimeSeconds(...)
Example:
Material block = context.getMaterial("block", Material.STONE);
int points = context.requirePositiveInt("points");
long interval = context.getTimeSeconds("hint-interval", 30);
This makes custom objective config loading cleaner and safer.
EventObjectiveSession
New helper methods include:
isActive()
getParticipantCount()
isParticipating(player)
getTopScore()
hasScores()
getLeaderboard(limit)
Example:
for (EventScoreEntry entry : session.getLeaderboard(3)) {
Bukkit.broadcastMessage("#"
+ entry.getRank()
+ " "
+ entry.getPlayerName()
+ " - "
+ entry.getScore());
}
This gives custom objective developers more tools during active events.
Added Better Optional Provider Validation
EventForge now gives clearer validation warnings for optional custom content providers.
Covered providers:
ItemsAdder
Oraxen
Nexo
MMOItems
MythicMobs
Updated objectives:
Collection Rush
Fishing Frenzy
Mob Hunt
Mob Invasion
Example warning:
Custom item provider ITEMSADDER is used, but ItemsAdder is not installed or enabled.
Example warning:
Custom mob provider MYTHICMOBS is used, but MythicMobs is not installed or enabled.
This makes it easier to debug custom event packs and optional integrations.
Improved Load and Reload Diagnostics
EventForge now tracks and displays better reload information.
When running:
/eventforge reload
admins now see a summary like:
Loaded events: 5 | Warnings: 0 | Errors: 0
The console also logs:
Event load summary:
- Files scanned: 5
- Loaded events: 5
- Disabled files skipped: 0
- Failed files: 0
- Validation warnings: 0
- Validation errors: 0
- Scheduled events: 1
- Registered objectives: 5
This makes debugging event files, packs, and custom objectives much easier.
Added EventForge Skript Addon
A new optional companion addon is available for Skript users.
The Skript Addon allows scripts to:
start EventForge events
stop EventForge events
finish EventForge events
add EventForge points
set EventForge scores
check if events are active
check if events are loaded
read player scores
read player ranks
read top players
read top scores
read schedule information
read event metadata
Example:
command /eftest:
trigger:
start eventforge event "mining_rush"
command /efscoretest:
trigger:
add 10 eventforge points to player for "mining_rush"
send "&7Score: &f%eventforge score of player in \"mining_rush\"%"
The Skript Addon is optional and requires:
EventForge
Skript
EventForgeSkriptAddon
Updated Simple Example Addon
The Simple Addon has been updated to demonstrate the expanded EventForge API.
It now demonstrates:
EventService
EventPackService
StatsService
ScheduleService
ObjectiveService
Event metadata
Bukkit developer events
Reward execution events
Score change events
Commands:
/efsimple info
/efsimple events
/efsimple active
/efsimple leaderboard <event>
/efsimple packs
/efsimple schedules
/efsimple objectives
/efsimple stats <player>
/efsimple history
/efsimple metadata <event>
This addon is useful for developers learning how to use the EventForge API.
Updated Advanced Relic Hunt Addon
The Advanced Relic Hunt addon has been updated to demonstrate newer developer features.
It now demonstrates:
EventObjectiveLoadContext helper methods
EventObjectiveSession helper methods
metadata/tags in config
advanced conditions in config
readable time parsing
custom objective registration
custom scoring
custom leaderboards
Example:
metadata:
category: "Adventure"
tags:
- relic
- hunt
- exploration
- custom-objective
difficulty: "Medium"
Example:
hint-interval: 30s
The addon uses:
context.getTimeSeconds("hint-interval", 30);
session.getLeaderboard(3);
Improved Score Handling Safety
ActiveEvent#addScore now handles zero or negative final scores more safely.
If a score-change listener modifies the final score to 0 or below, EventForge removes the player's score/participant entry instead of storing an unwanted zero or negative score.
This keeps scoring behaviour consistent.
API Documentation Updated
Developer documentation has been expanded for:
Maven setup
API overview
EventPackService
StatsService
ScheduleService
ObjectiveService
Bukkit events
Custom objectives
Simple addon
Advanced addon
Skript addon
Migration Notes
From beta to release
If you are updating from the beta version, update your API dependency to:
<dependency>
<groupId>dev.hxze</groupId>
<artifactId>eventforge-api</artifactId>
<version>1.0.0-release</version>
<scope>provided</scope>
</dependency>
Do not install an API jar
Server owners should only install:
EventForge.jar
Addons use the API through Maven and depend on EventForge at runtime.
Example addons
If you are using the example addons, rebuild or download the updated versions designed for 1.0.0-release.
Existing event files
Existing event files should continue to work.
New optional config sections include:
metadata
advanced conditions
Safe condition defaults:
conditions:
minimum-players: 1
worlds:
- world
permissions: []
blocked-permissions: []
require-op: false
require-non-op: false
time:
enabled: false
min: 0
max: 23999
weather:
allowed: []
warning
Do not leave condition values blank.
Recommended Update Steps
/eventforge reload
- Stop your server.
- Back up your plugins/EventForge/ folder.
- Replace the old EventForge jar with the new release jar.
- Start the server.
- Check the console startup output.
- Run:
/eventforge list
- Check the reload summary.
- Run:
/eventforge schedules
/eventforge check <event_id>
Example:
- Test one event manually.
/eventforge start mining_rush
/eventforge points <player> mining_rush 10
/eventforge finish mining_rush
Summary
EventForge v1.0.0 Release is a major improvement over the beta version.
It adds:
PlaceholderAPI support
Skript support
Paper/Purpur testing
expanded Java API services
Bukkit developer events
reward execution event
event metadata/tags
advanced conditions
better validation
better reload diagnostics
updated example addons
custom objective helper APIs
This release makes EventForge stronger for:
server owners
event pack creators
Java addon developers
Skript users
Discord integrations
dashboard creators
custom objective developers
