Skip to content

Commit 71d2e6e

Browse files
committed
implements fabric entity events api
1 parent 66788a9 commit 71d2e6e

12 files changed

Lines changed: 1395 additions & 2 deletions

File tree

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
--- a/net/minecraft/server/level/ServerPlayer.java
2+
+++ b/net/minecraft/server/level/ServerPlayer.java
3+
@@ -24,6 +_,12 @@
4+
import java.util.stream.Collectors;
5+
import javax.annotation.Nonnull;
6+
import javax.annotation.Nullable;
7+
+
8+
+import net.fabricmc.fabric.api.entity.event.v1.EntitySleepEvents;
9+
+import net.fabricmc.fabric.api.entity.event.v1.ServerEntityCombatEvents;
10+
+import net.fabricmc.fabric.api.entity.event.v1.ServerEntityLevelChangeEvents;
11+
+import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents;
12+
+import net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents;
13+
import net.minecraft.ChatFormatting;
14+
import net.minecraft.CrashReport;
15+
import net.minecraft.CrashReportCategory;
16+
@@ -115,6 +_,7 @@
17+
import net.minecraft.world.Container;
18+
import net.minecraft.world.Difficulty;
19+
import net.minecraft.world.InteractionHand;
20+
+import net.minecraft.world.InteractionResult;
21+
import net.minecraft.world.MenuProvider;
22+
import net.minecraft.world.damagesource.DamageSource;
23+
import net.minecraft.world.damagesource.DamageTypes;
24+
@@ -1231,6 +_,13 @@
25+
// CraftBukkit end
26+
27+
this.level().getCraftServer().getScoreboardManager().forAllObjectives(ObjectiveCriteria.DEATH_COUNT, this, ScoreAccess::increment); // CraftBukkit - Get our scores instead
28+
+ final Entity attacker = damageSource.getEntity();
29+
+
30+
+ // If the damage source that killed the player was an entity, then fire the event.
31+
+ if (attacker != null) {
32+
+ attacker.killedEntity(this.level(), (ServerPlayer) (Object) this, damageSource);
33+
+ ServerEntityCombatEvents.AFTER_KILLED_OTHER_ENTITY.invoker().afterKilledOtherEntity(this.level(), attacker, (ServerPlayer) (Object) this, damageSource);
34+
+ }
35+
LivingEntity killCredit = this.getKillCredit();
36+
if (killCredit != null) {
37+
this.awardStat(Stats.ENTITY_KILLED_BY.get(killCredit.getType()));
38+
@@ -1248,6 +_,7 @@
39+
this.getCombatTracker().recheckStatus();
40+
this.setLastDeathLocation(Optional.of(GlobalPos.of(this.level().dimension(), this.blockPosition())));
41+
this.setClientLoaded(false);
42+
+ ServerLivingEntityEvents.AFTER_DEATH.invoker().afterDeath((ServerPlayer) (Object) this, damageSource);
43+
}
44+
45+
private void tellNeutralMobsThatIDied() {
46+
@@ -1607,6 +_,7 @@
47+
if (maindimensionkey1 != Level.NETHER) { // CraftBukkit
48+
this.enteredNetherPosition = null;
49+
}
50+
+ ServerEntityLevelChangeEvents.AFTER_PLAYER_CHANGE_LEVEL.invoker().afterChangeLevel((ServerPlayer) (Object) this, level, this.level());
51+
}
52+
53+
@Override
54+
@@ -1634,7 +_,12 @@
55+
this.setRespawnPosition(
56+
new ServerPlayer.RespawnConfig(LevelData.RespawnData.of(this.level().dimension(), bedPos, this.getYRot(), this.getXRot()), false), true, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.BED // Paper - Add PlayerSetSpawnEvent
57+
);
58+
- if (this.level().isBrightOutside()) {
59+
+ boolean isDay = this.level().isBrightOutside();
60+
+ InteractionResult result = EntitySleepEvents.ALLOW_SLEEP_TIME.invoker().allowSleepTime(this, bedPos, !isDay);
61+
+ if (result != InteractionResult.PASS) {
62+
+ isDay = !result.consumesAction(); // true from the event = night-like conditions, so we have to invert
63+
+ }
64+
+ if (isDay) {
65+
return Either.left(Player.BedSleepingProblem.NOT_POSSIBLE_NOW);
66+
} else {
67+
if (!this.isCreative()) {
68+
@@ -1647,7 +_,10 @@
69+
new AABB(vec3.x() - 8.0, vec3.y() - 5.0, vec3.z() - 8.0, vec3.x() + 8.0, vec3.y() + 5.0, vec3.z() + 8.0),
70+
monster -> monster.isPreventingPlayerRest(this.level(), this)
71+
);
72+
- if (!entitiesOfClass.isEmpty()) {
73+
+ boolean vanillaResult = entitiesOfClass.isEmpty();
74+
+ InteractionResult monstersResult = EntitySleepEvents.ALLOW_NEARBY_MONSTERS.invoker().allowNearbyMonsters(this, bedPos, vanillaResult);
75+
+ vanillaResult = result != InteractionResult.PASS ? monstersResult.consumesAction() : vanillaResult;
76+
+ if (!vanillaResult) {
77+
return Either.left(Player.BedSleepingProblem.NOT_SAFE);
78+
}
79+
}
80+
@@ -1660,7 +_,12 @@
81+
82+
@Override
83+
public Either<net.minecraft.world.entity.player.Player.BedSleepingProblem, Unit> startSleepInBed(BlockPos bedPos, boolean force) {
84+
- Direction direction = this.level().getBlockState(bedPos).getValue(HorizontalDirectionalBlock.FACING);
85+
+ BlockState blockState = this.level().getBlockState(bedPos);
86+
+ Direction direction = (Direction) (blockState.hasProperty(HorizontalDirectionalBlock.FACING) ? blockState.getValue(HorizontalDirectionalBlock.FACING) : null);
87+
+ Direction dir = EntitySleepEvents.MODIFY_SLEEPING_DIRECTION.invoker().modifySleepDirection((LivingEntity) (Object) this, bedPos, direction);
88+
+ if (dir == null) {
89+
+ return Either.left(Player.BedSleepingProblem.OTHER_PROBLEM);
90+
+ }
91+
Either<net.minecraft.world.entity.player.Player.BedSleepingProblem, Unit> bedResult = this.getBedResult(bedPos, direction);
92+
93+
if (bedResult.left().orElse(null) == net.minecraft.world.entity.player.Player.BedSleepingProblem.OTHER_PROBLEM) {
94+
@@ -2157,6 +_,7 @@
95+
this.setShoulderEntityLeft(that.getShoulderEntityLeft());
96+
this.setShoulderEntityRight(that.getShoulderEntityRight());
97+
this.setLastDeathLocation(that.getLastDeathLocation());
98+
+ ServerPlayerEvents.COPY_FROM.invoker().copyFromPlayer(that, (ServerPlayer) (Object) this, keepEverything);
99+
}
100+
101+
@Override

tenet-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
--- a/net/minecraft/server/players/PlayerList.java
22
+++ b/net/minecraft/server/players/PlayerList.java
3-
@@ -19,6 +_,8 @@
3+
@@ -19,6 +_,10 @@
44
import java.util.function.Function;
55
import java.util.function.Predicate;
66
import javax.annotation.Nullable;
77
+
8+
+import net.fabricmc.fabric.api.entity.event.v1.ServerEntityLevelChangeEvents;
9+
+import net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents;
810
+import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
911
import net.minecraft.ChatFormatting;
1012
import net.minecraft.FileUtil;
@@ -41,6 +43,34 @@
4143
serverGamePacketListenerImpl.send(
4244
new ClientboundUpdateRecipesPacket(recipeManager.getSynchronizedItemProperties(), recipeManager.getSynchronizedStonecutterRecipes())
4345
);
46+
@@ -327,6 +_,7 @@
47+
);
48+
}
49+
// Paper end - Send empty chunk
50+
+ ServerPlayerEvents.JOIN.invoker().onJoin(player);
51+
}
52+
53+
public void updateEntireScoreboard(ServerScoreboard scoreboard, ServerPlayer player) {
54+
@@ -519,6 +_,7 @@
55+
// This removes the scoreboard (and player reference) for the specific player in the manager
56+
this.cserver.getScoreboardManager().removePlayer(player.getBukkitEntity());
57+
// CraftBukkit end
58+
+ ServerPlayerEvents.LEAVE.invoker().onLeave(player);
59+
return playerQuitEvent.quitMessage(); // Paper - Adventure
60+
}
61+
62+
@@ -698,6 +_,11 @@
63+
).callEvent();
64+
// Paper end
65+
66+
+ ServerPlayerEvents.AFTER_RESPAWN.invoker().afterRespawn(player, serverPlayer, keepInventory);
67+
+
68+
+ if (player.level() != serverPlayer.level()) {
69+
+ ServerEntityLevelChangeEvents.AFTER_PLAYER_CHANGE_LEVEL.invoker().afterChangeLevel(serverPlayer, player.level(), serverPlayer.level());
70+
+ }
71+
return serverPlayer;
72+
}
73+
4474
@@ -1262,6 +_,9 @@
4575
// Paper start - API for updating recipes on clients
4676
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--- a/net/minecraft/world/entity/Entity.java
2+
+++ b/net/minecraft/world/entity/Entity.java
3+
@@ -29,6 +_,8 @@
4+
import java.util.function.Predicate;
5+
import java.util.stream.Stream;
6+
import javax.annotation.Nullable;
7+
+
8+
+import net.fabricmc.fabric.api.entity.event.v1.ServerEntityLevelChangeEvents;
9+
import net.minecraft.BlockUtil;
10+
import net.minecraft.CrashReport;
11+
import net.minecraft.CrashReportCategory;
12+
@@ -4038,7 +_,11 @@
13+
this.stopRiding();
14+
}
15+
16+
- return flag ? this.teleportCrossDimension(serverLevel, level, teleportTransition) : this.teleportSameDimension(serverLevel, teleportTransition);
17+
+ Entity tpEntity = flag ? this.teleportCrossDimension(serverLevel, level, teleportTransition) : this.teleportSameDimension(serverLevel, teleportTransition);
18+
+ if (tpEntity != null) {
19+
+ ServerEntityLevelChangeEvents.AFTER_ENTITY_CHANGE_LEVEL.invoker().afterChangeLevel(this, tpEntity, (ServerLevel) this.level, (ServerLevel) tpEntity.level());
20+
+ }
21+
+ return tpEntity;
22+
} else {
23+
return null;
24+
}

0 commit comments

Comments
 (0)