mirror of
https://github.com/barkeser2002/CatServer.git
synced 2026-09-25 07:19:56 +03:00
290 lines
12 KiB
Diff
290 lines
12 KiB
Diff
--- ../src-base/minecraft/net/minecraft/entity/item/EntityItem.java
|
|
+++ ../src-work/minecraft/net/minecraft/entity/item/EntityItem.java
|
|
@@ -13,6 +13,7 @@
|
|
import net.minecraft.network.datasync.DataParameter;
|
|
import net.minecraft.network.datasync.DataSerializers;
|
|
import net.minecraft.network.datasync.EntityDataManager;
|
|
+import net.minecraft.server.MinecraftServer;
|
|
import net.minecraft.stats.StatList;
|
|
import net.minecraft.util.DamageSource;
|
|
import net.minecraft.util.datafix.DataFixer;
|
|
@@ -26,18 +27,27 @@
|
|
import net.minecraftforge.fml.relauncher.SideOnly;
|
|
import org.apache.logging.log4j.LogManager;
|
|
import org.apache.logging.log4j.Logger;
|
|
+import org.bukkit.event.entity.EntityPickupItemEvent;
|
|
+import org.bukkit.event.player.PlayerPickupItemEvent;
|
|
|
|
public class EntityItem extends Entity
|
|
{
|
|
private static final Logger LOGGER = LogManager.getLogger();
|
|
private static final DataParameter<ItemStack> ITEM = EntityDataManager.<ItemStack>createKey(EntityItem.class, DataSerializers.ITEM_STACK);
|
|
private int age;
|
|
- private int pickupDelay;
|
|
+ public int pickupDelay;
|
|
private int health;
|
|
private String thrower;
|
|
private String owner;
|
|
public float hoverStart;
|
|
|
|
+ /**
|
|
+ * The maximum age of this EntityItem. The item is expired once this is reached.
|
|
+ */
|
|
+ public int lifespan = 6000;
|
|
+
|
|
+ private int lastTick = catserver.server.CatServer.getCurrentTick() - 1; // CatServer - implement realtime
|
|
+
|
|
public EntityItem(World worldIn, double x, double y, double z)
|
|
{
|
|
super(worldIn);
|
|
@@ -55,6 +65,7 @@
|
|
{
|
|
this(worldIn, x, y, z);
|
|
this.setItem(stack);
|
|
+ this.lifespan = (stack.getItem() == null ? world.spigotConfig.itemDespawnRate : stack.getItem().getEntityLifespan(stack, worldIn)); // Spigot
|
|
}
|
|
|
|
protected boolean canTriggerWalking()
|
|
@@ -78,6 +89,7 @@
|
|
|
|
public void onUpdate()
|
|
{
|
|
+ if (getItem().getItem().onEntityItemUpdate(this)) return;
|
|
if (this.getItem().isEmpty())
|
|
{
|
|
this.setDead();
|
|
@@ -86,10 +98,15 @@
|
|
{
|
|
super.onUpdate();
|
|
|
|
- if (this.pickupDelay > 0 && this.pickupDelay != 32767)
|
|
- {
|
|
- --this.pickupDelay;
|
|
- }
|
|
+ // if (this.pickupDelay > 0 && this.pickupDelay != 32767){
|
|
+ // --this.pickupDelay;
|
|
+ // }
|
|
+ // CraftBukkit start - Use wall time for pickup and despawn timers
|
|
+ int elapsedTicks = catserver.server.CatServer.getCurrentTick() - this.lastTick; // CatServer - implement realtime
|
|
+ if (this.pickupDelay != 32767) this.pickupDelay -= elapsedTicks;
|
|
+ if (this.age != -32768) this.age += elapsedTicks;
|
|
+ this.lastTick = catserver.server.CatServer.getCurrentTick(); // CatServer - implement realtime
|
|
+ // CraftBukkit end
|
|
|
|
this.prevPosX = this.posX;
|
|
this.prevPosY = this.posY;
|
|
@@ -135,7 +152,9 @@
|
|
|
|
if (this.onGround)
|
|
{
|
|
- f = this.world.getBlockState(new BlockPos(MathHelper.floor(this.posX), MathHelper.floor(this.getEntityBoundingBox().minY) - 1, MathHelper.floor(this.posZ))).getBlock().slipperiness * 0.98F;
|
|
+ BlockPos underPos = new BlockPos(MathHelper.floor(this.posX), MathHelper.floor(this.getEntityBoundingBox().minY) - 1, MathHelper.floor(this.posZ));
|
|
+ net.minecraft.block.state.IBlockState underState = this.world.getBlockState(underPos);
|
|
+ f = underState.getBlock().getSlipperiness(underState, this.world, underPos, this) * 0.98F;
|
|
}
|
|
|
|
this.motionX *= (double)f;
|
|
@@ -147,10 +166,12 @@
|
|
this.motionY *= -0.5D;
|
|
}
|
|
|
|
+ /* Craftbukkit start - moved up
|
|
if (this.age != -32768)
|
|
{
|
|
++this.age;
|
|
}
|
|
+ */
|
|
|
|
this.handleWaterMovement();
|
|
|
|
@@ -167,16 +188,53 @@
|
|
}
|
|
}
|
|
|
|
- if (!this.world.isRemote && this.age >= 6000)
|
|
+ ItemStack item = this.getItem();
|
|
+
|
|
+ if (!this.world.isRemote && this.age >= lifespan)
|
|
{
|
|
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemDespawnEvent(this).isCancelled()) {
|
|
+ this.age = 0;
|
|
+ return;
|
|
+ }
|
|
+ int hook = net.minecraftforge.event.ForgeEventFactory.onItemExpire(this, item);
|
|
+ if (hook < 0) this.setDead();
|
|
+ else this.lifespan += hook;
|
|
+ }
|
|
+ if (item.isEmpty())
|
|
+ {
|
|
this.setDead();
|
|
}
|
|
}
|
|
}
|
|
|
|
+ // Spigot start - copied from above
|
|
+ @Override
|
|
+ public void inactiveTick() {
|
|
+ // CraftBukkit start - Use wall time for pickup and despawn timers
|
|
+ int elapsedTicks = catserver.server.CatServer.getCurrentTick() - this.lastTick; // CatServer - implement realtime
|
|
+ if (this.pickupDelay != 32767) this.pickupDelay -= elapsedTicks;
|
|
+ if (this.age != -32768) this.age += elapsedTicks;
|
|
+ this.lastTick = catserver.server.CatServer.getCurrentTick(); // CatServer - implement realtime
|
|
+ // CraftBukkit end
|
|
+
|
|
+ if (!this.world.isRemote && this.age >= world.spigotConfig.itemDespawnRate) { // Spigot
|
|
+ // CraftBukkit start - fire ItemDespawnEvent
|
|
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemDespawnEvent(this).isCancelled()) {
|
|
+ this.age = 0;
|
|
+ return;
|
|
+ }
|
|
+ // CraftBukkit end
|
|
+ this.setDead();
|
|
+ }
|
|
+ }
|
|
+ // Spigot end
|
|
+
|
|
private void searchForOtherItemsNearby()
|
|
{
|
|
- for (EntityItem entityitem : this.world.getEntitiesWithinAABB(EntityItem.class, this.getEntityBoundingBox().grow(0.5D, 0.0D, 0.5D)))
|
|
+ // Spigot start
|
|
+ double radius = world.spigotConfig.itemMerge;
|
|
+ for (EntityItem entityitem : this.world.getEntitiesWithinAABB(EntityItem.class, this.getEntityBoundingBox().grow(radius, radius, radius)))
|
|
+ // Spigot end
|
|
{
|
|
this.combineItems(entityitem);
|
|
}
|
|
@@ -225,13 +283,20 @@
|
|
{
|
|
return false;
|
|
}
|
|
+ else if (!itemstack.areCapsCompatible(itemstack1))
|
|
+ {
|
|
+ return false;
|
|
+ }
|
|
else
|
|
{
|
|
- itemstack1.grow(itemstack.getCount());
|
|
- other.pickupDelay = Math.max(other.pickupDelay, this.pickupDelay);
|
|
- other.age = Math.min(other.age, this.age);
|
|
- other.setItem(itemstack1);
|
|
- this.setDead();
|
|
+ // Spigot start
|
|
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemMergeEvent(other, this).isCancelled()) return false;
|
|
+ itemstack.grow(itemstack1.getCount());
|
|
+ this.pickupDelay = Math.max(other.pickupDelay, this.pickupDelay);
|
|
+ this.age = Math.min(other.age, this.age);
|
|
+ this.setItem(itemstack);
|
|
+ other.setDead();
|
|
+ // Spigot end
|
|
return true;
|
|
}
|
|
}
|
|
@@ -282,6 +347,7 @@
|
|
|
|
public boolean attackEntityFrom(DamageSource source, float amount)
|
|
{
|
|
+ if (this.world.isRemote || this.isDead) return false; //Forge: Fixes MC-53850
|
|
if (this.isEntityInvulnerable(source))
|
|
{
|
|
return false;
|
|
@@ -292,6 +358,9 @@
|
|
}
|
|
else
|
|
{
|
|
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, source, amount)) {
|
|
+ return false;
|
|
+ }
|
|
this.markVelocityChanged();
|
|
this.health = (int)((float)this.health - amount);
|
|
|
|
@@ -314,6 +383,7 @@
|
|
compound.setShort("Health", (short)this.health);
|
|
compound.setShort("Age", (short)this.age);
|
|
compound.setShort("PickupDelay", (short)this.pickupDelay);
|
|
+ compound.setInteger("Lifespan", lifespan);
|
|
|
|
if (this.getThrower() != null)
|
|
{
|
|
@@ -358,22 +428,59 @@
|
|
{
|
|
this.setDead();
|
|
}
|
|
+ if (compound.hasKey("Lifespan")) lifespan = compound.getInteger("Lifespan");
|
|
}
|
|
|
|
public void onCollideWithPlayer(EntityPlayer entityIn)
|
|
{
|
|
if (!this.world.isRemote)
|
|
{
|
|
+ if (this.pickupDelay > 0) return;
|
|
ItemStack itemstack = this.getItem();
|
|
Item item = itemstack.getItem();
|
|
int i = itemstack.getCount();
|
|
|
|
- if (this.pickupDelay == 0 && (this.owner == null || 6000 - this.age <= 200 || this.owner.equals(entityIn.getName())) && entityIn.inventory.addItemStackToInventory(itemstack))
|
|
+ // CraftBukkit start - fire PlayerPickupItemEvent
|
|
+ int canHold = entityIn.inventory.canHold(itemstack);
|
|
+ int remaining = i - canHold;
|
|
+
|
|
+ if (this.pickupDelay <= 0 && canHold > 0) {
|
|
+ itemstack.setCount(canHold);
|
|
+ // Call legacy event
|
|
+ PlayerPickupItemEvent playerEvent = new PlayerPickupItemEvent((org.bukkit.entity.Player) entityIn.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining);
|
|
+ playerEvent.setCancelled(!entityIn.canPickUpLoot);
|
|
+ this.world.getServer().getPluginManager().callEvent(playerEvent);
|
|
+ if (playerEvent.isCancelled()) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ // Call newer event afterwards
|
|
+ EntityPickupItemEvent entityEvent = new EntityPickupItemEvent((org.bukkit.entity.Player) entityIn.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining);
|
|
+ entityEvent.setCancelled(!entityIn.canPickUpLoot);
|
|
+ this.world.getServer().getPluginManager().callEvent(entityEvent);
|
|
+ if (entityEvent.isCancelled()) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ itemstack.setCount(canHold + remaining);
|
|
+
|
|
+ // Possibly < 0; fix here so we do not have to modify code below
|
|
+ this.pickupDelay = 0;
|
|
+ }
|
|
+ // CraftBukkit end
|
|
+
|
|
+ int hook = net.minecraftforge.event.ForgeEventFactory.onItemPickup(this, entityIn);
|
|
+ if (hook < 0) return;
|
|
+ ItemStack clone = itemstack.copy();
|
|
+
|
|
+ if (this.pickupDelay <= 0 && (this.owner == null || lifespan - this.age <= 200 || this.owner.equals(entityIn.getName())) && (hook == 1 || i <= 0 || entityIn.inventory.addItemStackToInventory(itemstack) || clone.getCount() > this.getItem().getCount()))
|
|
{
|
|
- entityIn.onItemPickup(this, i);
|
|
+ clone.setCount(clone.getCount() - this.getItem().getCount());
|
|
+ net.minecraftforge.fml.common.FMLCommonHandler.instance().firePlayerItemPickupEvent(entityIn, this, clone);
|
|
|
|
if (itemstack.isEmpty())
|
|
{
|
|
+ entityIn.onItemPickup(this, i);
|
|
this.setDead();
|
|
itemstack.setCount(i);
|
|
}
|
|
@@ -394,9 +501,9 @@
|
|
}
|
|
|
|
@Nullable
|
|
- public Entity changeDimension(int dimensionIn)
|
|
+ public Entity changeDimension(int dimensionIn, net.minecraftforge.common.util.ITeleporter teleporter)
|
|
{
|
|
- Entity entity = super.changeDimension(dimensionIn);
|
|
+ Entity entity = super.changeDimension(dimensionIn, teleporter);
|
|
|
|
if (!this.world.isRemote && entity instanceof EntityItem)
|
|
{
|
|
@@ -476,6 +583,6 @@
|
|
public void makeFakeItem()
|
|
{
|
|
this.setInfinitePickupDelay();
|
|
- this.age = 5999;
|
|
+ this.age = getItem().getItem().getEntityLifespan(getItem(), world) - 1;
|
|
}
|
|
}
|