mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-03 23:07:40 +01:00
More more more more patches
This commit is contained in:
parent
8f5ec00c38
commit
8ab183d79e
@ -16,7 +16,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
import net.minecraft.world.phys.HitResult;
|
import net.minecraft.world.phys.HitResult;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
import net.minecraft.world.scores.PlayerTeam;
|
import net.minecraft.world.scores.PlayerTeam;
|
||||||
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity {
|
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
||||||
return level.clip(raytrace);
|
return level.clip(raytrace);
|
||||||
}
|
}
|
||||||
|
|
@ -37,7 +37,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ this.player.jumpFromGround();
|
+ this.player.jumpFromGround();
|
||||||
+ } else {
|
+ } else {
|
||||||
+ from = event.getFrom();
|
+ from = event.getFrom();
|
||||||
+ this.internalTeleport(from.getX(), from.getY(), from.getZ(), from.getYaw(), from.getPitch(), Collections.emptySet(), false);
|
+ this.internalTeleport(from.getX(), from.getY(), from.getZ(), from.getYaw(), from.getPitch(), Collections.emptySet());
|
||||||
+ return;
|
+ return;
|
||||||
+ }
|
+ }
|
||||||
+ // Paper end
|
+ // Paper end
|
||||||
|
@ -58,7 +58,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
}
|
}
|
||||||
+ // Paper start - Prevent moving into unloaded chunks
|
+ // Paper start - Prevent moving into unloaded chunks
|
||||||
+ if (player.level.paperConfig().chunks.preventMovingIntoUnloadedChunks && (this.player.getX() != toX || this.player.getZ() != toZ) && !worldserver.areChunksLoadedForMove(this.player.getBoundingBox().expandTowards(new Vec3(toX, toY, toZ).subtract(this.player.position())))) {
|
+ if (player.level.paperConfig().chunks.preventMovingIntoUnloadedChunks && (this.player.getX() != toX || this.player.getZ() != toZ) && !worldserver.areChunksLoadedForMove(this.player.getBoundingBox().expandTowards(new Vec3(toX, toY, toZ).subtract(this.player.position())))) {
|
||||||
+ this.internalTeleport(this.player.getX(), this.player.getY(), this.player.getZ(), this.player.getYRot(), this.player.getXRot(), Collections.emptySet(), true);
|
+ this.internalTeleport(this.player.getX(), this.player.getY(), this.player.getZ(), this.player.getYRot(), this.player.getXRot(), Collections.emptySet());
|
||||||
+ return;
|
+ return;
|
||||||
+ }
|
+ }
|
||||||
+ // Paper end
|
+ // Paper end
|
@ -8,7 +8,7 @@ diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/ma
|
|||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||||
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||||
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity {
|
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Paper start
|
// Paper start
|
@ -2190,6 +2190,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
import com.mojang.datafixers.util.Pair;
|
import com.mojang.datafixers.util.Pair;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
|
@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
|
||||||
|
private static final int NO_BLOCK_UPDATES_TO_ACK = -1;
|
||||||
|
private static final int TRACKED_MESSAGE_DISCONNECT_THRESHOLD = 4096;
|
||||||
|
private static final Component CHAT_VALIDATION_FAILED = Component.translatable("multiplayer.disconnect.chat_validation_failed");
|
||||||
|
- private final Connection connection;
|
||||||
|
+ public final Connection connection; // Paper
|
||||||
|
private final MinecraftServer server;
|
||||||
|
public ServerPlayer player;
|
||||||
|
private int tickCount;
|
||||||
@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
|
@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
|
||||||
return this.server.isSingleplayerOwner(this.player.getGameProfile());
|
return this.server.isSingleplayerOwner(this.player.getGameProfile());
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Caleb Bassham <caleb.bassham@gmail.com>
|
||||||
|
Date: Fri, 28 Sep 2018 02:32:19 -0500
|
||||||
|
Subject: [PATCH] Call player spectator target events and improve
|
||||||
|
implementation
|
||||||
|
|
||||||
|
Use a proper teleport for teleporting to entities in different
|
||||||
|
worlds.
|
||||||
|
|
||||||
|
Implementation improvements authored by Spottedleaf <Spottedleaf@users.noreply.github.com>
|
||||||
|
Validate that the target entity is valid and deny spectate
|
||||||
|
requests from frozen players.
|
||||||
|
|
||||||
|
Also, make sure the entity is spawned to the client before
|
||||||
|
sending the camera packet. If the entity isn't spawned clientside
|
||||||
|
when it receives the camera packet, then the client will not
|
||||||
|
spectate the target entity.
|
||||||
|
|
||||||
|
Co-authored-by: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
||||||
|
|
||||||
|
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||||
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
|
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||||
|
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||||
|
@@ -0,0 +0,0 @@ public class ServerPlayer extends Player {
|
||||||
|
|
||||||
|
this.camera = (Entity) (entity == null ? this : entity);
|
||||||
|
if (entity1 != this.camera) {
|
||||||
|
+ // Paper start - Add PlayerStartSpectatingEntityEvent and PlayerStopSpectatingEntity Event
|
||||||
|
+ if (this.camera == this) {
|
||||||
|
+ com.destroystokyo.paper.event.player.PlayerStopSpectatingEntityEvent playerStopSpectatingEntityEvent = new com.destroystokyo.paper.event.player.PlayerStopSpectatingEntityEvent(this.getBukkitEntity(), entity1.getBukkitEntity());
|
||||||
|
+ if (!playerStopSpectatingEntityEvent.callEvent()) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ com.destroystokyo.paper.event.player.PlayerStartSpectatingEntityEvent playerStartSpectatingEntityEvent = new com.destroystokyo.paper.event.player.PlayerStartSpectatingEntityEvent(this.getBukkitEntity(), entity1.getBukkitEntity(), entity.getBukkitEntity());
|
||||||
|
+ if (!playerStartSpectatingEntityEvent.callEvent()) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ // Paper end
|
||||||
|
Level world = this.camera.getLevel();
|
||||||
|
|
||||||
|
if (world instanceof ServerLevel) {
|
||||||
|
@@ -0,0 +0,0 @@ public class ServerPlayer extends Player {
|
||||||
|
this.connection.send(new ClientboundSetCameraPacket(this.camera));
|
||||||
|
this.connection.resetPosition();
|
||||||
|
}
|
||||||
|
-
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
@ -38,15 +38,6 @@ diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/jav
|
|||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
||||||
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||||
@@ -0,0 +0,0 @@ import net.minecraft.world.InteractionHand;
|
|
||||||
import net.minecraft.world.InteractionResult;
|
|
||||||
import net.minecraft.world.Nameable;
|
|
||||||
import net.minecraft.world.damagesource.DamageSource;
|
|
||||||
+import net.minecraft.world.entity.animal.AbstractFish;
|
|
||||||
+import net.minecraft.world.entity.animal.Animal;
|
|
||||||
import net.minecraft.world.entity.item.ItemEntity;
|
|
||||||
import net.minecraft.world.entity.player.Player;
|
|
||||||
import net.minecraft.world.entity.vehicle.Boat;
|
|
||||||
@@ -0,0 +0,0 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
|
@@ -0,0 +0,0 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -80,7 +71,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ if (spawnReason == null) {
|
+ if (spawnReason == null) {
|
||||||
+ if (spawnedViaMobSpawner) {
|
+ if (spawnedViaMobSpawner) {
|
||||||
+ spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER;
|
+ spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER;
|
||||||
+ } else if (this instanceof Mob && (this instanceof Animal || this instanceof AbstractFish) && !((Mob) this).removeWhenFarAway(0.0)) {
|
+ } else if (this instanceof Mob && (this instanceof net.minecraft.world.entity.animal.Animal || this instanceof net.minecraft.world.entity.animal.AbstractFish) && !((Mob) this).removeWhenFarAway(0.0)) {
|
||||||
+ if (!nbt.getBoolean("PersistenceRequired")) {
|
+ if (!nbt.getBoolean("PersistenceRequired")) {
|
||||||
+ spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NATURAL;
|
+ spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NATURAL;
|
||||||
+ }
|
+ }
|
@ -65,4 +65,4 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ // Paper end
|
+ // Paper end
|
||||||
}
|
}
|
||||||
|
|
||||||
public ItemStack assemble(CraftingContainer inventory) {
|
public ItemStack assemble(CraftingContainer inventory, RegistryAccess registryManager) {
|
@ -74,7 +74,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
blockEntity.cookingProgress = 0;
|
blockEntity.cookingProgress = 0;
|
||||||
- blockEntity.cookingTotalTime = AbstractFurnaceBlockEntity.getTotalCookTime(world, blockEntity);
|
- blockEntity.cookingTotalTime = AbstractFurnaceBlockEntity.getTotalCookTime(world, blockEntity);
|
||||||
+ blockEntity.cookingTotalTime = AbstractFurnaceBlockEntity.getTotalCookTime(world, blockEntity.recipeType, blockEntity, blockEntity.cookSpeedMultiplier); // Paper
|
+ blockEntity.cookingTotalTime = AbstractFurnaceBlockEntity.getTotalCookTime(world, blockEntity.recipeType, blockEntity, blockEntity.cookSpeedMultiplier); // Paper
|
||||||
if (AbstractFurnaceBlockEntity.burn(blockEntity.level, blockEntity.worldPosition, irecipe, blockEntity.items, i)) { // CraftBukkit
|
if (AbstractFurnaceBlockEntity.burn(blockEntity.level, blockEntity.worldPosition, world.registryAccess(), irecipe, blockEntity.items, i)) { // CraftBukkit
|
||||||
blockEntity.setRecipeUsed(irecipe);
|
blockEntity.setRecipeUsed(irecipe);
|
||||||
}
|
}
|
||||||
@@ -0,0 +0,0 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit
|
@@ -0,0 +0,0 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit
|
@ -42,9 +42,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
private static final int DEFAULT_MAX_THREADS = 255;
|
private static final int DEFAULT_MAX_THREADS = 255;
|
||||||
private static final String MAX_THREADS_SYSTEM_PROPERTY = "max.bg.threads";
|
private static final String MAX_THREADS_SYSTEM_PROPERTY = "max.bg.threads";
|
||||||
private static final AtomicInteger WORKER_COUNT = new AtomicInteger(1);
|
private static final AtomicInteger WORKER_COUNT = new AtomicInteger(1);
|
||||||
- private static final ExecutorService BOOTSTRAP_EXECUTOR = makeExecutor("Bootstrap");
|
|
||||||
- private static final ExecutorService BACKGROUND_EXECUTOR = makeExecutor("Main");
|
- private static final ExecutorService BACKGROUND_EXECUTOR = makeExecutor("Main");
|
||||||
+ private static final ExecutorService BOOTSTRAP_EXECUTOR = makeExecutor("Bootstrap", -2); // Paper - add -2 priority
|
|
||||||
+ private static final ExecutorService BACKGROUND_EXECUTOR = makeExecutor("Main", -1); // Paper - add -1 priority
|
+ private static final ExecutorService BACKGROUND_EXECUTOR = makeExecutor("Main", -1); // Paper - add -1 priority
|
||||||
// Paper start - don't submit BLOCKING PROFILE LOOKUPS to the world gen thread
|
// Paper start - don't submit BLOCKING PROFILE LOOKUPS to the world gen thread
|
||||||
public static final ExecutorService PROFILE_EXECUTOR = Executors.newFixedThreadPool(2, new java.util.concurrent.ThreadFactory() {
|
public static final ExecutorService PROFILE_EXECUTOR = Executors.newFixedThreadPool(2, new java.util.concurrent.ThreadFactory() {
|
@ -73,7 +73,7 @@ diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/ma
|
|||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||||
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||||
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity {
|
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
||||||
public Set<UUID> collidableExemptions = new HashSet<>();
|
public Set<UUID> collidableExemptions = new HashSet<>();
|
||||||
public boolean bukkitPickUpLoot;
|
public boolean bukkitPickUpLoot;
|
||||||
public org.bukkit.craftbukkit.entity.CraftLivingEntity getBukkitLivingEntity() { return (org.bukkit.craftbukkit.entity.CraftLivingEntity) super.getBukkitEntity(); } // Paper
|
public org.bukkit.craftbukkit.entity.CraftLivingEntity getBukkitLivingEntity() { return (org.bukkit.craftbukkit.entity.CraftLivingEntity) super.getBukkitEntity(); } // Paper
|
||||||
@ -81,7 +81,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getBukkitYaw() {
|
public float getBukkitYaw() {
|
||||||
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity {
|
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
||||||
if (knockbackCancelled) this.level.broadcastEntityEvent(this, (byte) 2); // Paper - Disable explosion knockback
|
if (knockbackCancelled) this.level.broadcastEntityEvent(this, (byte) 2); // Paper - Disable explosion knockback
|
||||||
if (this.isDeadOrDying()) {
|
if (this.isDeadOrDying()) {
|
||||||
if (!this.checkTotemDeathProtection(source)) {
|
if (!this.checkTotemDeathProtection(source)) {
|
||||||
@ -99,7 +99,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
}
|
}
|
||||||
} else if (flag1) {
|
} else if (flag1) {
|
||||||
this.playHurtSound(source);
|
this.playHurtSound(source);
|
||||||
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity {
|
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
||||||
if (!this.isRemoved() && !this.dead) {
|
if (!this.isRemoved() && !this.dead) {
|
||||||
Entity entity = damageSource.getEntity();
|
Entity entity = damageSource.getEntity();
|
||||||
LivingEntity entityliving = this.getKillCredit();
|
LivingEntity entityliving = this.getKillCredit();
|
||||||
@ -108,7 +108,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
if (this.deathScore >= 0 && entityliving != null) {
|
if (this.deathScore >= 0 && entityliving != null) {
|
||||||
entityliving.awardKillScore(this, this.deathScore, damageSource);
|
entityliving.awardKillScore(this, this.deathScore, damageSource);
|
||||||
}
|
}
|
||||||
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity {
|
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
||||||
if (!this.level.isClientSide && this.hasCustomName()) {
|
if (!this.level.isClientSide && this.hasCustomName()) {
|
||||||
if (org.spigotmc.SpigotConfig.logNamedDeaths) LivingEntity.LOGGER.info("Named entity {} died: {}", this, this.getCombatTracker().getDeathMessage().getString()); // Spigot
|
if (org.spigotmc.SpigotConfig.logNamedDeaths) LivingEntity.LOGGER.info("Named entity {} died: {}", this, this.getCombatTracker().getDeathMessage().getString()); // Spigot
|
||||||
}
|
}
|
||||||
@ -168,7 +168,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity {
|
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
||||||
if (!this.level.isClientSide) {
|
if (!this.level.isClientSide) {
|
||||||
boolean flag = false;
|
boolean flag = false;
|
||||||
|
|
||||||
@ -177,7 +177,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
if (this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
|
if (this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
|
||||||
BlockPos blockposition = this.blockPosition();
|
BlockPos blockposition = this.blockPosition();
|
||||||
BlockState iblockdata = Blocks.WITHER_ROSE.defaultBlockState();
|
BlockState iblockdata = Blocks.WITHER_ROSE.defaultBlockState();
|
||||||
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity {
|
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,7 +190,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
Entity entity = source.getEntity();
|
Entity entity = source.getEntity();
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity {
|
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
||||||
this.dropEquipment(); // CraftBukkit - from below
|
this.dropEquipment(); // CraftBukkit - from below
|
||||||
if (this.shouldDropLoot() && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
|
if (this.shouldDropLoot() && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
|
||||||
this.dropFromLootTable(source, flag);
|
this.dropFromLootTable(source, flag);
|
||||||
@ -223,7 +223,7 @@ diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/n
|
|||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/world/entity/Mob.java
|
--- a/src/main/java/net/minecraft/world/entity/Mob.java
|
||||||
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
|
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
|
||||||
@@ -0,0 +0,0 @@ public abstract class Mob extends LivingEntity {
|
@@ -0,0 +0,0 @@ public abstract class Mob extends LivingEntity implements Targeting {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.spawnAtLocation(itemstack);
|
this.spawnAtLocation(itemstack);
|
||||||
@ -300,24 +300,29 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
--- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java
|
--- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java
|
||||||
+++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java
|
+++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java
|
||||||
@@ -0,0 +0,0 @@ public class ArmorStand extends LivingEntity {
|
@@ -0,0 +0,0 @@ public class ArmorStand extends LivingEntity {
|
||||||
this.gameEvent(GameEvent.ENTITY_DAMAGE, source.getEntity());
|
this.gameEvent(GameEvent.ENTITY_DAMAGE, source.getEntity());
|
||||||
this.lastHit = i;
|
this.lastHit = i;
|
||||||
} else {
|
} else {
|
||||||
- this.brokenByPlayer(source);
|
- this.brokenByPlayer(source);
|
||||||
+ org.bukkit.event.entity.EntityDeathEvent event = this.brokenByPlayer(source); // Paper
|
+ org.bukkit.event.entity.EntityDeathEvent event = this.brokenByPlayer(source); // Paper
|
||||||
this.showBreakingParticles();
|
this.showBreakingParticles();
|
||||||
- this.discard(); // CraftBukkit - SPIGOT-4890: remain as this.die() since above damagesource method will call death event
|
+ if (!event.isCancelled()) // Paper
|
||||||
+ if (!event.isCancelled()) this.discard(); // CraftBukkit - SPIGOT-4890: remain as this.die() since above damagesource method will call death event // Paper
|
this.discard(); // CraftBukkit - SPIGOT-4890: remain as this.discard() since above damagesource method will call death event
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
@@ -0,0 +0,0 @@ public class ArmorStand extends LivingEntity {
|
@@ -0,0 +0,0 @@ public class ArmorStand extends LivingEntity {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- private void brokenByPlayer(DamageSource damageSource) {
|
- private void brokenByPlayer(DamageSource damageSource) {
|
||||||
+ private org.bukkit.event.entity.EntityDeathEvent brokenByPlayer(DamageSource damageSource) { // Paper
|
+ private org.bukkit.event.entity.EntityDeathEvent brokenByPlayer(DamageSource damageSource) { // Paper
|
||||||
drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(new ItemStack(Items.ARMOR_STAND))); // CraftBukkit - add to drops
|
ItemStack itemstack = new ItemStack(Items.ARMOR_STAND);
|
||||||
|
|
||||||
|
if (this.hasCustomName()) {
|
||||||
|
@@ -0,0 +0,0 @@ public class ArmorStand extends LivingEntity {
|
||||||
|
}
|
||||||
|
|
||||||
|
drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(itemstack)); // CraftBukkit - add to drops
|
||||||
- this.brokenByAnything(damageSource);
|
- this.brokenByAnything(damageSource);
|
||||||
+ return this.brokenByAnything(damageSource); // Paper
|
+ return this.brokenByAnything(damageSource); // Paper
|
||||||
}
|
}
|
@ -14,7 +14,7 @@ diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
|||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
||||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
+++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
||||||
@@ -0,0 +0,0 @@ public abstract class Projectile extends Entity {
|
@@ -0,0 +0,0 @@ public abstract class Projectile extends Entity implements TraceableEntity {
|
||||||
return this.cachedOwner;
|
return this.cachedOwner;
|
||||||
} else if (this.ownerUUID != null && this.level instanceof ServerLevel) {
|
} else if (this.ownerUUID != null && this.level instanceof ServerLevel) {
|
||||||
this.cachedOwner = ((ServerLevel) this.level).getEntity(this.ownerUUID);
|
this.cachedOwner = ((ServerLevel) this.level).getEntity(this.ownerUUID);
|
@ -48,8 +48,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
public void setProtocol(ConnectionProtocol state) {
|
public void setProtocol(ConnectionProtocol state) {
|
||||||
+ protocol = state; // Paper
|
+ protocol = state; // Paper
|
||||||
this.channel.attr(Connection.ATTRIBUTE_PROTOCOL).set(state);
|
this.channel.attr(Connection.ATTRIBUTE_PROTOCOL).set(state);
|
||||||
|
this.channel.attr(BundlerInfo.BUNDLER_PROVIDER).set(state);
|
||||||
this.channel.config().setAutoRead(true);
|
this.channel.config().setAutoRead(true);
|
||||||
Connection.LOGGER.debug("Enabled auto read");
|
|
||||||
@@ -0,0 +0,0 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
|
@@ -0,0 +0,0 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
|
||||||
Validate.notNull(listener, "packetListener", new Object[0]);
|
Validate.notNull(listener, "packetListener", new Object[0]);
|
||||||
this.packetListener = listener;
|
this.packetListener = listener;
|
||||||
@ -354,6 +354,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
}
|
}
|
||||||
|
|
||||||
+ if (!disableFlushConsolidation) channel.pipeline().addFirst(new io.netty.handler.flush.FlushConsolidationHandler()); // Paper
|
+ if (!disableFlushConsolidation) channel.pipeline().addFirst(new io.netty.handler.flush.FlushConsolidationHandler()); // Paper
|
||||||
channel.pipeline().addLast("timeout", new ReadTimeoutHandler(30)).addLast("legacy_query", new LegacyQueryHandler(ServerConnectionListener.this)).addLast("splitter", new Varint21FrameDecoder()).addLast("decoder", new PacketDecoder(PacketFlow.SERVERBOUND)).addLast("prepender", new Varint21LengthFieldPrepender()).addLast("encoder", new PacketEncoder(PacketFlow.CLIENTBOUND));
|
ChannelPipeline channelpipeline = channel.pipeline().addLast("timeout", new ReadTimeoutHandler(30)).addLast("legacy_query", new LegacyQueryHandler(ServerConnectionListener.this));
|
||||||
int j = ServerConnectionListener.this.server.getRateLimitPacketsPerSecond();
|
|
||||||
Object object = j > 0 ? new RateKickingConnection(j) : new Connection(PacketFlow.SERVERBOUND);
|
Connection.configureSerialization(channelpipeline, PacketFlow.SERVERBOUND);
|
@ -44,11 +44,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ com.destroystokyo.paper.event.entity.TurtleLayEggEvent layEggEvent = new com.destroystokyo.paper.event.entity.TurtleLayEggEvent((org.bukkit.entity.Turtle) this.turtle.getBukkitEntity(), io.papermc.paper.util.MCUtil.toLocation(this.turtle.level, this.blockPos.above()), eggCount);
|
+ com.destroystokyo.paper.event.entity.TurtleLayEggEvent layEggEvent = new com.destroystokyo.paper.event.entity.TurtleLayEggEvent((org.bukkit.entity.Turtle) this.turtle.getBukkitEntity(), io.papermc.paper.util.MCUtil.toLocation(this.turtle.level, this.blockPos.above()), eggCount);
|
||||||
+ if (layEggEvent.callEvent() && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.turtle, this.blockPos.above(), Blocks.TURTLE_EGG.defaultBlockState().setValue(TurtleEggBlock.EGGS, layEggEvent.getEggCount())).isCancelled()) {
|
+ if (layEggEvent.callEvent() && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.turtle, this.blockPos.above(), Blocks.TURTLE_EGG.defaultBlockState().setValue(TurtleEggBlock.EGGS, layEggEvent.getEggCount())).isCancelled()) {
|
||||||
world.playSound((Player) null, blockposition, SoundEvents.TURTLE_LAY_EGG, SoundSource.BLOCKS, 0.3F, 0.9F + world.random.nextFloat() * 0.2F);
|
world.playSound((Player) null, blockposition, SoundEvents.TURTLE_LAY_EGG, SoundSource.BLOCKS, 0.3F, 0.9F + world.random.nextFloat() * 0.2F);
|
||||||
- world.setBlock(this.blockPos.above(), (BlockState) Blocks.TURTLE_EGG.defaultBlockState().setValue(TurtleEggBlock.EGGS, this.turtle.random.nextInt(4) + 1), 3);
|
BlockPos blockposition1 = this.blockPos.above();
|
||||||
+ world.setBlock(this.blockPos.above(), (BlockState) Blocks.TURTLE_EGG.defaultBlockState().setValue(TurtleEggBlock.EGGS, layEggEvent.getEggCount()), 3);
|
- BlockState iblockdata = (BlockState) Blocks.TURTLE_EGG.defaultBlockState().setValue(TurtleEggBlock.EGGS, this.turtle.random.nextInt(4) + 1);
|
||||||
}
|
+ BlockState iblockdata = (BlockState) Blocks.TURTLE_EGG.defaultBlockState().setValue(TurtleEggBlock.EGGS, layEggEvent.getEggCount()); // Paper
|
||||||
// CraftBukkit end
|
|
||||||
this.turtle.setHasEgg(false);
|
world.setBlock(blockposition1, iblockdata, 3);
|
||||||
|
world.gameEvent(GameEvent.BLOCK_PLACE, blockposition1, GameEvent.Context.of(this.turtle, iblockdata));
|
||||||
@@ -0,0 +0,0 @@ public class Turtle extends Animal {
|
@@ -0,0 +0,0 @@ public class Turtle extends Animal {
|
||||||
|
|
||||||
@Override
|
@Override
|
@ -9,7 +9,7 @@ diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src
|
|||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
|
--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
|
||||||
+++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
|
+++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
|
||||||
@@ -0,0 +0,0 @@ public class ItemEntity extends Entity {
|
@@ -0,0 +0,0 @@ public class ItemEntity extends Entity implements TraceableEntity {
|
||||||
// CraftBukkit start - Use wall time for pickup and despawn timers
|
// CraftBukkit start - Use wall time for pickup and despawn timers
|
||||||
int elapsedTicks = MinecraftServer.currentTick - this.lastTick;
|
int elapsedTicks = MinecraftServer.currentTick - this.lastTick;
|
||||||
if (this.pickupDelay != 32767) this.pickupDelay -= elapsedTicks;
|
if (this.pickupDelay != 32767) this.pickupDelay -= elapsedTicks;
|
||||||
@ -17,7 +17,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
if (this.age != -32768) this.age += elapsedTicks;
|
if (this.age != -32768) this.age += elapsedTicks;
|
||||||
this.lastTick = MinecraftServer.currentTick;
|
this.lastTick = MinecraftServer.currentTick;
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
@@ -0,0 +0,0 @@ public class ItemEntity extends Entity {
|
@@ -0,0 +0,0 @@ public class ItemEntity extends Entity implements TraceableEntity {
|
||||||
// CraftBukkit start - Use wall time for pickup and despawn timers
|
// CraftBukkit start - Use wall time for pickup and despawn timers
|
||||||
int elapsedTicks = MinecraftServer.currentTick - this.lastTick;
|
int elapsedTicks = MinecraftServer.currentTick - this.lastTick;
|
||||||
if (this.pickupDelay != 32767) this.pickupDelay -= elapsedTicks;
|
if (this.pickupDelay != 32767) this.pickupDelay -= elapsedTicks;
|
@ -19,27 +19,6 @@ this is going to be the best soultion all around.
|
|||||||
|
|
||||||
Improvements/suggestions welcome!
|
Improvements/suggestions welcome!
|
||||||
|
|
||||||
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
||||||
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
||||||
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
||||||
@@ -0,0 +0,0 @@ public class ServerPlayer extends Player {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- @Override
|
|
||||||
- public void stopRiding() {
|
|
||||||
+ // Paper start
|
|
||||||
+ @Override public void stopRiding() { stopRiding(false); }
|
|
||||||
+ @Override public void stopRiding(boolean suppressCancellation) {
|
|
||||||
+ // Paper end
|
|
||||||
Entity entity = this.getVehicle();
|
|
||||||
|
|
||||||
- super.stopRiding();
|
|
||||||
+ super.stopRiding(suppressCancellation); // Paper
|
|
||||||
Entity entity1 = this.getVehicle();
|
|
||||||
|
|
||||||
if (entity1 != entity && this.connection != null) {
|
|
||||||
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
||||||
@ -96,7 +75,7 @@ diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/ma
|
|||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||||
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||||
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity {
|
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void stopRiding() {
|
public void stopRiding() {
|
@ -1,89 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Caleb Bassham <caleb.bassham@gmail.com>
|
|
||||||
Date: Fri, 28 Sep 2018 02:32:19 -0500
|
|
||||||
Subject: [PATCH] Call player spectator target events and improve
|
|
||||||
implementation
|
|
||||||
|
|
||||||
Use a proper teleport for teleporting to entities in different
|
|
||||||
worlds.
|
|
||||||
|
|
||||||
Implementation improvements authored by Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
||||||
Validate that the target entity is valid and deny spectate
|
|
||||||
requests from frozen players.
|
|
||||||
|
|
||||||
Also, make sure the entity is spawned to the client before
|
|
||||||
sending the camera packet. If the entity isn't spawned clientside
|
|
||||||
when it receives the camera packet, then the client will not
|
|
||||||
spectate the target entity.
|
|
||||||
|
|
||||||
Co-authored-by: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
||||||
|
|
||||||
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
||||||
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
||||||
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
||||||
@@ -0,0 +0,0 @@ public class ServerPlayer extends Player {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCamera(@Nullable Entity entity) {
|
|
||||||
+ // Paper start - Add PlayerStartSpectatingEntityEvent and PlayerStopSpectatingEntity Event and improve implementation
|
|
||||||
Entity entity1 = this.getCamera();
|
|
||||||
|
|
||||||
- this.camera = (Entity) (entity == null ? this : entity);
|
|
||||||
- if (entity1 != this.camera) {
|
|
||||||
- this.connection.send(new ClientboundSetCameraPacket(this.camera));
|
|
||||||
- this.connection.teleport(this.camera.getX(), this.camera.getY(), this.camera.getZ(), this.getYRot(), this.getXRot(), TeleportCause.SPECTATE); // CraftBukkit
|
|
||||||
- this.connection.resetPosition();
|
|
||||||
+ if (entity == null) {
|
|
||||||
+ entity = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (entity1 == entity) return; // new spec target is the current spec target
|
|
||||||
+
|
|
||||||
+ if (entity == this) {
|
|
||||||
+ com.destroystokyo.paper.event.player.PlayerStopSpectatingEntityEvent playerStopSpectatingEntityEvent = new com.destroystokyo.paper.event.player.PlayerStopSpectatingEntityEvent(this.getBukkitEntity(), entity1.getBukkitEntity());
|
|
||||||
+
|
|
||||||
+ if (!playerStopSpectatingEntityEvent.callEvent()) {
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ } else {
|
|
||||||
+ com.destroystokyo.paper.event.player.PlayerStartSpectatingEntityEvent playerStartSpectatingEntityEvent = new com.destroystokyo.paper.event.player.PlayerStartSpectatingEntityEvent(this.getBukkitEntity(), entity1.getBukkitEntity(), entity.getBukkitEntity());
|
|
||||||
+
|
|
||||||
+ if (!playerStartSpectatingEntityEvent.callEvent()) {
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ // Validate
|
|
||||||
+ if (entity != this) {
|
|
||||||
+ if (entity.isRemoved() || !entity.valid || entity.level == null) {
|
|
||||||
+ MinecraftServer.LOGGER.info("Blocking player " + this + " from spectating invalid entity " + entity);
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ if (this.isImmobile()) {
|
|
||||||
+ // use debug: clients might maliciously spam this
|
|
||||||
+ MinecraftServer.LOGGER.debug("Blocking frozen player " + this + " from spectating entity " + entity);
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ this.camera = entity; // only set after validating state
|
|
||||||
+
|
|
||||||
+ if (entity != this) {
|
|
||||||
+ // Make sure we're in the right place
|
|
||||||
+ this.ejectPassengers(); // teleport can fail if we have passengers...
|
|
||||||
+ this.getBukkitEntity().teleport(new Location(entity.getCommandSenderWorld().getWorld(), entity.getX(), entity.getY(), entity.getZ(), this.getYRot(), this.getXRot()), TeleportCause.SPECTATE); // Correctly handle cross-world entities from api calls by using CB teleport
|
|
||||||
+
|
|
||||||
+ // Make sure we're tracking the entity before sending
|
|
||||||
+ ChunkMap.TrackedEntity tracker = ((ServerLevel)entity.level).getChunkSource().chunkMap.entityMap.get(entity.getId());
|
|
||||||
+ if (tracker != null) { // dumb plugins...
|
|
||||||
+ tracker.updatePlayer(this);
|
|
||||||
+ }
|
|
||||||
+ } else {
|
|
||||||
+ this.connection.teleport(this.camera.getX(), this.camera.getY(), this.camera.getZ(), this.getYRot(), this.getXRot(), TeleportCause.SPECTATE); // CraftBukkit
|
|
||||||
+ }
|
|
||||||
+ this.connection.send(new ClientboundSetCameraPacket(entity));
|
|
||||||
+ this.connection.resetPosition();
|
|
||||||
+ // Paper end
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
Loading…
Reference in New Issue
Block a user