Blocking ticks + fix arrow bouncing

This commit is contained in:
Beaness 2022-08-04 14:43:36 +02:00
parent e351559ac9
commit 762263ebe8
7 changed files with 90 additions and 13 deletions

View File

@ -25,6 +25,13 @@ public class eSpigotConfig
return config.getBoolean( path, config.getBoolean( path ) );
}
private static float getFloat(String path, float def)
{
path = "espigot." + path;
config.addDefault( path, def );
return config.getFloat( path, config.getFloat( path ) );
}
private static double getDouble(String path, double def)
{
path = "espigot." + path;
@ -113,6 +120,18 @@ public class eSpigotConfig
slowerSaturationLoss = getBoolean( "settings.slower-saturation-loss", true );
}
public static int minBlockTicks;
private static void minBlockTicks()
{
minBlockTicks = getInt( "settings.minimum-blocking-ticks", 40 );
}
public static float underMinBlockTicksModifier;
private static void underMinBlockTicksModifier()
{
underMinBlockTicksModifier = (float) getDouble( "settings.under-minimum-blocking-ticks-modifier", 0.20 );
}
public static boolean fixBouncingArrows;
private static void fixBouncingArrows()
{

View File

@ -0,0 +1,31 @@
package com.elevatemc.spigot.util;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.LongAdder;
public class CachedSizeConcurrentLinkedQueue<E> extends ConcurrentLinkedQueue<E> {
private final LongAdder cachedSize = new LongAdder();
@Override
public boolean add(E e) {
boolean result = super.add(e);
if (result) {
cachedSize.increment();
}
return result;
}
@Override
public E poll() {
E result = super.poll();
if (result != null) {
cachedSize.decrement();
}
return result;
}
@Override
public int size() {
return cachedSize.intValue();
}
}

View File

@ -147,6 +147,8 @@ public class Chunk {
// CraftBukkit end
private final ChunkCoordIntPair chunkCoords; // PandaSpigot
private final BlockPosition blockPos;
private final BlockPosition cachedArea;
public Chunk(World world, int i, int j) {
this.sections = new ChunkSection[16];
@ -175,6 +177,8 @@ public class Chunk {
this.bukkitChunk = new org.bukkit.craftbukkit.CraftChunk(this);
}
this.chunkCoords = new ChunkCoordIntPair(this.locX, this.locZ); // PandaSpigot
this.blockPos = new BlockPosition(this.locX << 4, 0, this.locZ << 4);
this.cachedArea = new BlockPosition(this.locX * 16 + 8, 0, this.locZ * 16 + 8);
}
public org.bukkit.Chunk bukkitChunk;
@ -299,7 +303,7 @@ public class Chunk {
private void h(boolean flag) {
this.world.methodProfiler.a("recheckGaps");
if (this.world.areChunksLoaded(new BlockPosition(this.locX * 16 + 8, 0, this.locZ * 16 + 8), 16)) {
if (this.world.areChunksLoaded(this.cachedArea, 16)) {
for (int i = 0; i < 16; ++i) {
for (int j = 0; j < 16; ++j) {
if (this.g[i + j * 16]) {
@ -1375,8 +1379,6 @@ public class Chunk {
}
public void m() {
BlockPosition blockposition = new BlockPosition(this.locX << 4, 0, this.locZ << 4);
for (int i = 0; i < 8; ++i) {
if (this.v >= 4096) {
return;
@ -1389,7 +1391,7 @@ public class Chunk {
++this.v;
for (int i1 = 0; i1 < 16; ++i1) {
BlockPosition blockposition1 = blockposition.a(k, (j << 4) + i1, l);
BlockPosition blockposition1 = this.blockPos.a(k, (j << 4) + i1, l);
boolean flag = i1 == 0 || i1 == 15 || k == 0 || k == 15 || l == 0 || l == 15;
if (this.sections[j] == null && flag || this.sections[j] != null && this.sections[j].b(k, i1, l).getMaterial() == Material.AIR) {
@ -1414,10 +1416,9 @@ public class Chunk {
public void n() {
this.done = true;
this.lit = true;
BlockPosition blockposition = new BlockPosition(this.locX << 4, 0, this.locZ << 4);
if (!this.world.worldProvider.o()) {
if (this.world.areChunksLoadedBetween(blockposition.a(-1, 0, -1), blockposition.a(16, this.world.F(), 16))) {
if (this.world.areChunksLoadedBetween(this.blockPos.a(-1, 0, -1), this.blockPos.a(16, this.world.F(), 16))) {
label42:
for (int i = 0; i < 16; ++i) {
for (int j = 0; j < 16; ++j) {
@ -1433,7 +1434,7 @@ public class Chunk {
for (EnumDirection enumdirection : EnumDirection.EnumDirectionLimit.HORIZONTAL) {
int k = enumdirection.c() == EnumDirection.EnumAxisDirection.POSITIVE ? 16 : 1;
this.world.getChunkAtWorldCoords(blockposition.shift(enumdirection, k)).a(enumdirection.opposite());
this.world.getChunkAtWorldCoords(this.blockPos.shift(enumdirection, k)).a(enumdirection.opposite());
}
this.y();

View File

@ -1,5 +1,6 @@
package net.minecraft.server;
import com.elevatemc.spigot.config.eSpigotConfig;
import com.elevatemc.spigot.event.PlayerHealthChangeEvent;
import com.google.common.base.Charsets;
import com.google.common.collect.Lists;
@ -69,6 +70,9 @@ public abstract class EntityHuman extends EntityLiving {
private int i;
private final boolean bI = false;
// Beanes - blocking ticks
private int blockingTicks = 0;
public EntityHuman(World world, GameProfile gameprofile) {
super(world);
this.uniqueID = a(gameprofile);
@ -169,12 +173,24 @@ public abstract class EntityHuman extends EntityLiving {
return this.bS() && this.g.getItem().e(this.g) == EnumAnimation.BLOCK;
}
// Beanes - blocking ticks
public int getBlockingTicks() {
return blockingTicks;
}
public void t_() {
this.noclip = this.isSpectator();
if (this.isSpectator()) {
this.onGround = false;
}
// Beanes - blocking ticks
if (isBlocking()) {
++blockingTicks;
} else {
blockingTicks = 0;
}
if (this.g != null) {
ItemStack itemstack = this.inventory.getItemInHand();
@ -280,6 +296,7 @@ public abstract class EntityHuman extends EntityLiving {
this.setPosition(d4, this.locY, d5);
}
//
}
public int L() {

View File

@ -33,6 +33,7 @@ import org.bukkit.event.vehicle.VehicleExitEvent;
// PaperSpigot start
import org.bukkit.Bukkit;
import com.elevatemc.spigot.eSpigot;
import org.github.paperspigot.PaperSpigotWorldConfig;
import org.spigotmc.event.entity.EntityDismountEvent;
// PaperSpigot end
@ -792,7 +793,7 @@ public abstract class EntityLiving extends Entity {
}
// Beanes end
if ((float) this.noDamageTicks > (float) this.maxNoDamageTicks / 2.0F || isArrow) {
if ((float) this.noDamageTicks > (float) this.maxNoDamageTicks / 2.0F && !isArrow) {
if (f <= this.lastDamage) {
this.forceExplosionKnockback = true; // CraftBukkit - SPIGOT-949 - for vanilla consistency, cooldown does not prevent explosion knockback
return false;
@ -1121,7 +1122,14 @@ public abstract class EntityLiving extends Entity {
Function<Double, Double> blocking = f16 -> {
if (human) {
if (!damagesource.ignoresArmor() && ((EntityHuman) EntityLiving.this).isBlocking() && f16 > 0.0F) {
return -(f16 - ((1.0F + f16) * 0.5F));
float modifier;
if (((EntityHuman) EntityLiving.this).getBlockingTicks() >= eSpigotConfig.minBlockTicks) {
modifier = PaperSpigotWorldConfig.playerBlockingDamageMultiplier;
} else {
modifier = eSpigotConfig.underMinBlockTicksModifier;
}
return -(f16 - ((1.0F + f16) * modifier));
}
}
return -0.0;

View File

@ -4,6 +4,7 @@ import com.elevatemc.spigot.eSpigot;
import com.elevatemc.spigot.exception.CryptException;
import com.elevatemc.spigot.exception.ExploitException;
import com.elevatemc.spigot.handler.PacketHandler;
import com.elevatemc.spigot.util.CachedSizeConcurrentLinkedQueue;
import com.velocitypowered.natives.compression.VelocityCompressor; // Paper
import com.velocitypowered.natives.util.Natives; // Paper
import com.google.common.collect.Queues;
@ -43,7 +44,7 @@ public class NetworkManager extends SimpleChannelInboundHandler<Packet<?>> {
public static final AttributeKey<EnumProtocol> c = ATTRIBUTE_PROTOCOL;
private final EnumProtocolDirection h;
private final Queue<NetworkManager.QueuedPacket> i = Queues.newConcurrentLinkedQueue();
private final Queue<NetworkManager.QueuedPacket> i = new CachedSizeConcurrentLinkedQueue<>();
private final ReentrantReadWriteLock j = new ReentrantReadWriteLock();
public Channel channel;
// Spigot Start // PAIL

View File

@ -2338,12 +2338,12 @@ public abstract class World implements IBlockAccess {
return null;
} else {
// CraftBukkit start
if (capturedTileEntities.containsKey(blockposition)) {
return capturedTileEntities.get(blockposition);
TileEntity tileentity = null;
if (!capturedTileEntities.isEmpty() && (tileentity = capturedTileEntities.get(blockposition)) != null) {
return tileentity;
}
// CraftBukkit end
TileEntity tileentity = null;
int i;
TileEntity tileentity1;