Skip to content

API Events

MKI edited this page Oct 17, 2026 · 1 revision

Events – PartyLinkEvents

com.mki.partylink.api.PartyLinkEvents holds all server events. Register listeners once during mod initialization:

PartyLinkEvents.MEMBER_JOINED.register((party, memberId) -> {
    LOGGER.info("{} joined {}", memberId, party.name());
});

All events fire on the server thread. The party argument is a snapshot (PartyView) taken at the time of the event.

On Fabric the eight API 1 events are Fabric Events; every other event (and all events on Forge/NeoForge) is a PartyLinkEvent. Both have the same register(...) / invoker() methods, so your code is the same on every loader.

Cancellable events (since 2)

Return false to stop the action. The player gets the message "This action was blocked by another mod." (except for chat and pings, which are dropped silently). The first listener that returns false wins; later listeners are not called.

Event Callback Fires before
ALLOW_INVITE boolean allowInvite(ServerPlayer inviter, ServerPlayer target) an invite is sent
ALLOW_JOIN boolean allowJoin(PartyView party, ServerPlayer player) a player joins (invite, /party join, API). party is null when a new party would be created
ALLOW_LEAVE boolean allowLeave(PartyView party, ServerPlayer player) a player leaves voluntarily
ALLOW_KICK boolean allowKick(PartyView party, UUID actorId, UUID targetId) a member is kicked (actorId is null for API kicks)
ALLOW_CHAT boolean allowChat(PartyView party, ServerPlayer sender, String message) a party chat message is delivered
ALLOW_TELEPORT boolean allowTeleport(ServerPlayer player, ServerPlayer target) a teleport request is created and again right before teleporting
ALLOW_PING boolean allowPing(PartyView party, PartyPing ping) a ping (also death markers) is sent

Changing results

Event Callback Description
PARTY_DAMAGE PartyDamageDecision onPartyDamage(PartyView party, ServerPlayer attacker, ServerPlayer victim) Fires when a player hurts a member of the same party. Return ALLOW, DENY or DEFAULT (let the party PvP rule decide). The first non-DEFAULT answer wins
MODIFY_SHARED_XP int modifySharedXp(PartyView party, ServerPlayer source, int amount) Fires before shared XP is split. Listeners are chained. Return 0 or less to cancel sharing (the collector keeps the orb as in vanilla)
// No party PvP inside arenas, ever
PartyLinkEvents.PARTY_DAMAGE.register((party, attacker, victim) ->
        Arena.contains(victim) ? PartyDamageDecision.DENY : PartyDamageDecision.DEFAULT);

// +50% shared XP for parties of 4 or more
PartyLinkEvents.MODIFY_SHARED_XP.register((party, source, amount) ->
        party.size() >= 4 ? amount * 3 / 2 : amount);

// No teleports during a boss fight
PartyLinkEvents.ALLOW_TELEPORT.register((player, target) -> !BossFight.isActive(player));

Notifications

Event Callback Since
PARTY_CREATED onPartyCreated(PartyView party) 1
PARTY_DISBANDED onPartyDisbanded(PartyView party) – last state before disbanding 1
MEMBER_JOINED onMemberJoined(PartyView party, UUID memberId) 1
MEMBER_LEFT onMemberLeft(PartyView party, UUID memberId) 1
MEMBER_KICKED onMemberKicked(PartyView party, UUID actorId, UUID memberId) 1
ROLE_CHANGED onRoleChanged(PartyView party, UUID memberId, PartyRole role) 1
SETTINGS_CHANGED onSettingsChanged(PartyView party) – party rules changed 1
SHARED_EXPERIENCE onSharedExperience(PartyXpShareContext context) – source, total, targets 1
OWNER_CHANGED onOwnerChanged(PartyView party, UUID oldOwnerId, UUID newOwnerId) 2
PARTY_RENAMED onPartyRenamed(PartyView party, String oldName, String newName) 2
VISIBILITY_CHANGED onVisibilityChanged(PartyView party, boolean isPublic) 2
CHAT_MESSAGE onChatMessage(PartyView party, ServerPlayer sender, String message) 2
PING_SENT onPingSent(PartyView party, PartyPing ping) 2
MEMBER_TELEPORTED onMemberTeleported(PartyView party, UUID playerId, UUID targetId) 2
DATA_CHANGED onDataChanged(PartyView party, String key, String value) – value is null when removed 2

OWNER_CHANGED fires for transfers and when the owner leaves or is removed and the party continues.

PartyPing

Field Description
senderId, senderName Who pinged (for DEATH: who died)
type NORMAL, DANGER, TARGET, LOOT, DEATH
x, y, z Marker position
dimension Dimension id, e.g. minecraft:overworld
durationSeconds How long clients show it

Clone this wiki locally