Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement and Update More Events #74

Draft
wants to merge 14 commits into
base: main
Choose a base branch
from
Draft
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,21 @@ private void onActuallyHurt(ServerLevel serverLevel,
EntityEvents.INSTANCE.getDamageLivingEntity()
.invoke(new EntityEvents.EntityDamageEvent((LivingEntity) (Object) this, amount, damageSource));
}

@Inject(
method = "die",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/world/damagesource/DamageSource;getEntity()Lnet/minecraft/world/entity/Entity;",
shift = At.Shift.BEFORE
)
)
private void die(DamageSource damageSource, CallbackInfo ci) {
var event = new EntityEvents.EntityDeathEvent(
(LivingEntity) (Object) this,
damageSource
);

EntityEvents.INSTANCE.getOnDeath().invoke(event);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package net.silkmc.silk.core.mixin.player;

import com.llamalad7.mixinextras.sugar.Local;
import com.llamalad7.mixinextras.sugar.ref.LocalRef;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.damagesource.DamageSource;
import net.silkmc.silk.core.event.EventScopeProperty;
import net.silkmc.silk.core.event.PlayerEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(ServerPlayer.class)
public class MixinServerPlayer {

@Inject(
method = "die",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;send(Lnet/minecraft/network/protocol/Packet;Lnet/minecraft/network/PacketSendListener;)V",
shift = At.Shift.BEFORE
)
)
private void die(DamageSource damageSource, CallbackInfo ci, @Local LocalRef<Component> component) {
var event = new PlayerEvents.PlayerDeathEvent(
(ServerPlayer) (Object) this,
damageSource,
new EventScopeProperty<>(component.get()));

PlayerEvents.INSTANCE.getOnDeath().invoke(event);

component.set(event.getDeathMessage().get());
}

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package net.silkmc.silk.core.mixin.server;

import com.llamalad7.mixinextras.sugar.Local;
import com.llamalad7.mixinextras.sugar.ref.LocalRef;
import net.minecraft.network.Connection;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.CommonListenerCookie;
import net.minecraft.server.players.PlayerList;
import net.silkmc.silk.core.event.EventScopeProperty;
import net.silkmc.silk.core.event.PlayerEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
Expand All @@ -13,23 +17,28 @@
@Mixin(PlayerList.class)
public class MixinPlayerList {

@Inject(
method = "placeNewPlayer",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;<init>(Lnet/minecraft/server/MinecraftServer;Lnet/minecraft/network/Connection;Lnet/minecraft/server/level/ServerPlayer;Lnet/minecraft/server/network/CommonListenerCookie;)V",
shift = At.Shift.BEFORE
)
)
private void onPreLogin(Connection connection, ServerPlayer player, CommonListenerCookie commonListenerCookie, CallbackInfo ci) {
PlayerEvents.INSTANCE.getPreLogin().invoke(new PlayerEvents.PlayerEvent<>(player));
}
@Inject(
method = "placeNewPlayer",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;<init>(Lnet/minecraft/server/MinecraftServer;Lnet/minecraft/network/Connection;Lnet/minecraft/server/level/ServerPlayer;Lnet/minecraft/server/network/CommonListenerCookie;)V",
shift = At.Shift.BEFORE
)
)
private void onPreLogin(Connection connection, ServerPlayer player, CommonListenerCookie commonListenerCookie, CallbackInfo ci) {
PlayerEvents.INSTANCE.getPreLogin().invoke(new PlayerEvents.PlayerEvent<>(player));
}

@Inject(
method = "placeNewPlayer",
at = @At("TAIL")
)
private void onPostLogin(Connection connection, ServerPlayer player, CommonListenerCookie commonListenerCookie, CallbackInfo ci) {
PlayerEvents.INSTANCE.getPostLogin().invoke(new PlayerEvents.PlayerEvent<>(player));
}
@Inject(
method = "placeNewPlayer",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/server/players/PlayerList;broadcastSystemMessage(Lnet/minecraft/network/chat/Component;Z)V",
shift = At.Shift.BEFORE)
)
private void onPostLogin(Connection connection, ServerPlayer player, CommonListenerCookie commonListenerCookie, CallbackInfo ci, @Local LocalRef<MutableComponent> mutableComponent) {
var event = new PlayerEvents.PostLoginEvent(player, new EventScopeProperty<>(mutableComponent.get()));
PlayerEvents.INSTANCE.getPostLogin().invoke(event);
mutableComponent.set(event.getJoinMessage().get().copy());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,14 @@ object EntityEvents {
* event, since Minecraft performs its checks more than one time
*/
val checkInvulnerability = Event.onlySync<EntityCheckInvulnerabilityEvent>()

open class EntityDeathEvent(
entity: LivingEntity,
val damageSource: DamageSource,
) : EntityEvent<LivingEntity>(entity)

/**
* Called when a [LivingEntity] dies.
*/
val onDeath = Event.syncAsync<EntityDeathEvent>()
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package net.silkmc.silk.core.event

import com.mojang.authlib.GameProfile
import net.minecraft.network.chat.Component
import net.minecraft.network.chat.MutableComponent
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.damagesource.DamageSource
import net.minecraft.world.entity.player.Player
import net.silkmc.silk.core.annotations.ExperimentalSilkApi

Expand All @@ -16,10 +18,15 @@ object PlayerEvents {
*/
val preLogin = Event.syncAsync<PlayerEvent<ServerPlayer>>()

open class PostLoginEvent(
player: ServerPlayer,
val joinMessage: EventScopeProperty<Component>
) : PlayerEvent<ServerPlayer>(player)

/**
* Called after a player has received all login information from the server.
*/
val postLogin = Event.syncAsync<PlayerEvent<ServerPlayer>>()
val postLogin = Event.syncAsync<PostLoginEvent>()

open class PlayerQuitEvent(
player: ServerPlayer,
Expand Down Expand Up @@ -60,4 +67,17 @@ object PlayerEvents {
* @see preQuit
*/
val quitDuringConfiguration = Event.syncAsync<PlayerQuitDuringLoginEvent>()

open class PlayerDeathEvent(
player: ServerPlayer,
val source: DamageSource,
var deathMessage: EventScopeProperty<Component>,
) : PlayerEvent<ServerPlayer>(player)

/**
* Called when a [ServerPlayer] dies.
*/
val onDeath = Event.syncAsync<PlayerDeathEvent>()


}
1 change: 1 addition & 0 deletions silk-core/src/main/resources/silk-core.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"block.AbstractBlockAccessor",
"entity.MixinEntity",
"entity.MixinLivingEntity",
"player.MixinServerPlayer",
"server.MixinMinecraftServer",
"server.MixinPlayerList",
"server.MixinServerConfigurationPacketListenerImpl",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ import net.minecraft.server.level.ServerEntity
import net.minecraft.server.level.ServerPlayer
import org.bukkit.Server
import org.bukkit.craftbukkit.CraftServer
import org.bukkit.craftbukkit.damage.CraftDamageSource
import org.bukkit.craftbukkit.entity.CraftEntity
import org.bukkit.craftbukkit.entity.CraftPlayer
import org.bukkit.damage.DamageSource
import org.bukkit.entity.Entity
import org.bukkit.entity.Player

Expand All @@ -29,3 +31,10 @@ val Player.mcPlayer: ServerPlayer
*/
val Entity.mcEntity: net.minecraft.world.entity.Entity
get() = (this as CraftEntity).handle

@Suppress("UnstableApiUsage")
/**
* Converts a Paper [DamageSource] to a native [net.minecraft.world.damagesource.DamageSource].
*/
val DamageSource.mcDamageSource: net.minecraft.world.damagesource.DamageSource
get() = (this as CraftDamageSource).handle
Original file line number Diff line number Diff line change
@@ -1,18 +1,26 @@
package net.silkmc.silk.paper.events.internal

import net.minecraft.core.Holder
import net.minecraft.world.damagesource.DamageEffects
import net.minecraft.world.damagesource.DamageScaling
import net.minecraft.world.damagesource.DamageSource
import net.minecraft.world.damagesource.DamageType
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.phys.Vec3
import net.silkmc.silk.core.event.EntityEvents
import net.silkmc.silk.core.event.EventScopeProperty
import net.silkmc.silk.paper.conversions.mcDamageSource
import net.silkmc.silk.paper.conversions.mcEntity
import net.silkmc.silk.paper.events.listenSilk
import org.bukkit.craftbukkit.damage.CraftDamageSource
import org.bukkit.event.entity.EntityDamageEvent
import org.bukkit.event.entity.PlayerDeathEvent

fun EntityEvents.setupPaper() {
listenSilk<EntityDamageEvent> { paperEvent ->
val mcEntity = paperEvent.entity.mcEntity
@Suppress("UnstableApiUsage")
val mcDamageSource = (paperEvent.damageSource as CraftDamageSource).handle
val mcDamageSource = paperEvent.damageSource.mcDamageSource

val checkEvent = EntityEvents.EntityCheckInvulnerabilityEvent(
entity = mcEntity,
Expand All @@ -30,4 +38,14 @@ fun EntityEvents.setupPaper() {
source = mcDamageSource))
}
}

listenSilk<PlayerDeathEvent> {
val pos = it.entity.location
val event = EntityEvents.EntityDeathEvent(
it.entity.mcEntity as LivingEntity,
@Suppress("UnstableApiUsage")
it.damageSource.mcDamageSource
)
onDeath.invoke(event)
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package net.silkmc.silk.paper.events.internal

import io.papermc.paper.adventure.AdventureComponent
import io.papermc.paper.adventure.PaperAdventure
import net.silkmc.silk.core.event.EventScopeProperty
import net.silkmc.silk.core.event.PlayerEvents
import net.silkmc.silk.paper.conversions.mcDamageSource
import net.silkmc.silk.paper.conversions.mcPlayer
import net.silkmc.silk.paper.events.listenSilk
import org.bukkit.event.entity.PlayerDeathEvent
import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.event.player.PlayerLoginEvent
import org.bukkit.event.player.PlayerQuitEvent
Expand All @@ -13,9 +17,27 @@ fun PlayerEvents.setupPaper() {
preLogin.invoke(PlayerEvents.PlayerEvent(it.player.mcPlayer))
}
listenSilk<PlayerJoinEvent> {
postLogin.invoke(PlayerEvents.PlayerEvent(it.player.mcPlayer))
val event = PlayerEvents.PostLoginEvent(
it.player.mcPlayer, EventScopeProperty(
AdventureComponent(it.joinMessage()).deepConverted()
)
)
postLogin.invoke(event)
it.joinMessage(PaperAdventure.asAdventure(event.joinMessage.get()))
}
listenSilk<PlayerQuitEvent> {
preQuit.invoke(PlayerEvents.PlayerQuitEvent(it.player.mcPlayer, AdventureComponent(it.quitMessage())))
}

listenSilk<PlayerDeathEvent> {
val pos = it.player.location
val event = PlayerEvents.PlayerDeathEvent(
it.player.mcPlayer,
@Suppress("UnstableApiUsage")
it.damageSource.mcDamageSource,
EventScopeProperty(AdventureComponent(it.deathMessage()))
)
onDeath.invoke(event)
it.deathMessage(PaperAdventure.asAdventure(event.deathMessage.get()))
}
}
5 changes: 5 additions & 0 deletions silk-testmod/src/main/kotlin/net/silkmc/silk/test/Manager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ import net.silkmc.silk.commands.ClientCommandSourceStack
import net.silkmc.silk.commands.LiteralCommandBuilder
import net.silkmc.silk.commands.clientCommand
import net.silkmc.silk.commands.command
import net.silkmc.silk.core.event.PlayerEvents
import net.silkmc.silk.test.commands.*
import net.silkmc.silk.test.events.EntityEventTest
import net.silkmc.silk.test.events.PlayerEventTest
import net.silkmc.silk.test.events.ServerEventTest
import net.silkmc.silk.test.network.NetworkTest

Expand All @@ -27,6 +30,8 @@ object Manager : ModInitializer, ClientModInitializer {
executeCommandTestCommand

ServerEventTest.init()
PlayerEventTest.init()
EntityEventTest.init()
NetworkTest.initServer()

command("testmod") {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package net.silkmc.silk.test.events

import net.silkmc.silk.core.annotations.ExperimentalSilkApi
import net.silkmc.silk.core.event.Entity
import net.silkmc.silk.core.event.Events
import net.silkmc.silk.core.logging.logInfo

@OptIn(ExperimentalSilkApi::class)
object EntityEventTest {
fun init() {
Events.Entity.onDeath.listen {
logInfo("received Entity.onDeath event")
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package net.silkmc.silk.test.events

import net.silkmc.silk.core.annotations.ExperimentalSilkApi
import net.silkmc.silk.core.event.Events
import net.silkmc.silk.core.event.Player
import net.silkmc.silk.core.logging.logInfo

@OptIn(ExperimentalSilkApi::class)
object PlayerEventTest {
fun init() {
Events.Player.onDeath.listen {
logInfo("received Player.onDeath event")
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package net.silkmc.silk.test.events

import net.silkmc.silk.core.Silk
import net.silkmc.silk.core.annotations.ExperimentalSilkApi
import net.silkmc.silk.core.event.Entity
import net.silkmc.silk.core.event.Events
import net.silkmc.silk.core.event.Player
import net.silkmc.silk.core.event.Server
import net.silkmc.silk.core.logging.logInfo
import net.silkmc.silk.core.text.broadcastText
import java.awt.Color

@OptIn(ExperimentalSilkApi::class)
object ServerEventTest {
Expand Down