diff --git a/src/main/java/net/minecraft/entity/Entity.java b/src/main/java/net/minecraft/entity/Entity.java index e0165d1..2f51940 100644 --- a/src/main/java/net/minecraft/entity/Entity.java +++ b/src/main/java/net/minecraft/entity/Entity.java @@ -11,6 +11,7 @@ import java.util.UUID; import java.util.concurrent.Callable; +import org.ultramine.server.EntityType; import org.ultramine.server.UMHooks; import org.ultramine.server.event.EntitySetFireEvent; @@ -2488,6 +2489,7 @@ /* ===================================== ULTRAMINE START =====================================*/ + private final EntityType cachedEntityType = computeEntityType(); private GameProfile owner; public final void setObjectOwner(GameProfile owner) @@ -2516,34 +2518,49 @@ return false; } - public boolean isEntityMonster() + protected EntityType computeEntityType() { - return this instanceof net.minecraft.entity.monster.IMob; + return + isCreatureType(EnumCreatureType.monster, false) ? EntityType.MONSTER : + isCreatureType(EnumCreatureType.creature, false) ? EntityType.ANIMAL : + isCreatureType(EnumCreatureType.ambient, false) ? EntityType.AMBIENT : + isCreatureType(EnumCreatureType.waterCreature, false) ? EntityType.WATER : + EntityType.OTHER; } - public boolean isEntityAnimal() + public final EntityType getEntityType() { - return false; + return cachedEntityType; } - public boolean isEntityAmbient() + public final boolean isEntityMonster() { - return false; + return getEntityType() == EntityType.MONSTER; } - public boolean isEntityWater() + public final boolean isEntityAnimal() { - return false; + return getEntityType() == EntityType.ANIMAL; } - public boolean isEntityItem() + public final boolean isEntityAmbient() { - return false; + return getEntityType() == EntityType.AMBIENT; } - public boolean isEntityXPOrb() + public final boolean isEntityWater() { - return false; + return getEntityType() == EntityType.WATER; + } + + public final boolean isEntityItem() + { + return getEntityType() == EntityType.ITEM; + } + + public final boolean isEntityXPOrb() + { + return getEntityType() == EntityType.XP_ORB; } public double getEntityDespawnDistance() @@ -2551,7 +2568,7 @@ return 9216d;//16384.0d; } - public void despawnInactive() + public void updateInactive() { } diff --git a/src/main/java/net/minecraft/entity/EntityLiving.java b/src/main/java/net/minecraft/entity/EntityLiving.java index 5ec7e06..3e6c3dd 100644 --- a/src/main/java/net/minecraft/entity/EntityLiving.java +++ b/src/main/java/net/minecraft/entity/EntityLiving.java @@ -1168,7 +1168,7 @@ } @Override - public void despawnInactive() + public void updateInactive() { if(!canDespawn() || ++entityAge <= 600) return; diff --git a/src/main/java/net/minecraft/entity/item/EntityItem.java b/src/main/java/net/minecraft/entity/item/EntityItem.java index c67da5c..339b22f 100644 --- a/src/main/java/net/minecraft/entity/item/EntityItem.java +++ b/src/main/java/net/minecraft/entity/item/EntityItem.java @@ -458,13 +458,13 @@ /*===================================== ULTRAMINE START =====================================*/ @Override - public boolean isEntityItem() + public org.ultramine.server.EntityType computeEntityType() { - return true; + return org.ultramine.server.EntityType.ITEM; } @Override - public void despawnInactive() + public void updateInactive() { if (++age >= lifespan) { diff --git a/src/main/java/net/minecraft/entity/item/EntityXPOrb.java b/src/main/java/net/minecraft/entity/item/EntityXPOrb.java index 820327e..e15db92 100644 --- a/src/main/java/net/minecraft/entity/item/EntityXPOrb.java +++ b/src/main/java/net/minecraft/entity/item/EntityXPOrb.java @@ -239,8 +239,9 @@ /*===================================== ULTRAMINE START =====================================*/ - public boolean isEntityXPOrb() + @Override + public org.ultramine.server.EntityType computeEntityType() { - return true; + return org.ultramine.server.EntityType.XP_ORB; } } \ No newline at end of file diff --git a/src/main/java/net/minecraft/entity/monster/EntityGolem.java b/src/main/java/net/minecraft/entity/monster/EntityGolem.java index 37fa059..1b6dd52 100644 --- a/src/main/java/net/minecraft/entity/monster/EntityGolem.java +++ b/src/main/java/net/minecraft/entity/monster/EntityGolem.java @@ -43,8 +43,8 @@ /*===================================== ULTRAMINE START =====================================*/ @Override - public boolean isEntityAnimal() + public org.ultramine.server.EntityType computeEntityType() { - return true; + return org.ultramine.server.EntityType.ANIMAL; } } \ No newline at end of file diff --git a/src/main/java/net/minecraft/entity/monster/EntityMob.java b/src/main/java/net/minecraft/entity/monster/EntityMob.java index 71d7c7e..d15ce5e 100644 --- a/src/main/java/net/minecraft/entity/monster/EntityMob.java +++ b/src/main/java/net/minecraft/entity/monster/EntityMob.java @@ -201,12 +201,4 @@ { return true; } - - /*===================================== ULTRAMINE START =====================================*/ - - @Override - public boolean isEntityMonster() - { - return true; - } } \ No newline at end of file diff --git a/src/main/java/net/minecraft/entity/passive/EntityAmbientCreature.java b/src/main/java/net/minecraft/entity/passive/EntityAmbientCreature.java index b1bfce0..ab08ee1 100644 --- a/src/main/java/net/minecraft/entity/passive/EntityAmbientCreature.java +++ b/src/main/java/net/minecraft/entity/passive/EntityAmbientCreature.java @@ -26,12 +26,6 @@ /*===================================== ULTRAMINE START =====================================*/ @Override - public boolean isEntityAmbient() - { - return true; - } - - @Override public double getEntityDespawnDistance() { return 4096d; //4 chunks square diff --git a/src/main/java/net/minecraft/entity/passive/EntityAnimal.java b/src/main/java/net/minecraft/entity/passive/EntityAnimal.java index 3beed01..cbea542 100644 --- a/src/main/java/net/minecraft/entity/passive/EntityAnimal.java +++ b/src/main/java/net/minecraft/entity/passive/EntityAnimal.java @@ -382,12 +382,4 @@ super.handleHealthUpdate(p_70103_1_); } } - - /*===================================== ULTRAMINE START =====================================*/ - - @Override - public boolean isEntityAnimal() - { - return true; - } } \ No newline at end of file diff --git a/src/main/java/net/minecraft/entity/passive/EntityVillager.java b/src/main/java/net/minecraft/entity/passive/EntityVillager.java index e0d4581..e10ff34 100644 --- a/src/main/java/net/minecraft/entity/passive/EntityVillager.java +++ b/src/main/java/net/minecraft/entity/passive/EntityVillager.java @@ -734,8 +734,8 @@ /*===================================== ULTRAMINE START =====================================*/ @Override - public boolean isEntityAnimal() + public org.ultramine.server.EntityType computeEntityType() { - return true; + return org.ultramine.server.EntityType.ANIMAL; } } \ No newline at end of file diff --git a/src/main/java/net/minecraft/entity/passive/EntityWaterMob.java b/src/main/java/net/minecraft/entity/passive/EntityWaterMob.java index a642a7a..5f17f7a 100644 --- a/src/main/java/net/minecraft/entity/passive/EntityWaterMob.java +++ b/src/main/java/net/minecraft/entity/passive/EntityWaterMob.java @@ -60,12 +60,4 @@ this.setAir(300); } } - - /*===================================== ULTRAMINE START =====================================*/ - - @Override - public boolean isEntityWater() - { - return true; - } } \ No newline at end of file diff --git a/src/main/java/net/minecraft/world/chunk/Chunk.java b/src/main/java/net/minecraft/world/chunk/Chunk.java index de039fd..23043ce 100644 --- a/src/main/java/net/minecraft/world/chunk/Chunk.java +++ b/src/main/java/net/minecraft/world/chunk/Chunk.java @@ -49,6 +49,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.ultramine.server.EntityType; import org.ultramine.server.chunk.ChunkBindState; import org.ultramine.server.chunk.ChunkHash; import org.ultramine.server.chunk.IChunkDependency; @@ -1707,33 +1708,35 @@ { wasActive = true; //Handling case where added entity to inactive chunk (wasActive && hasEntities) condition should be true if(e.isEntityLiving() && !e.isEntityPlayerMP()) - { entityLivingCount++; - if(e.isEntityMonster()) ++entityMonsterCount; - else if(e.isEntityAnimal()) ++entityAnimalCount; - else if(e.isEntityAmbient()) ++entityAmbientCount; - else if(e.isEntityWater()) ++entityWaterCount; + + switch(e.getEntityType()) + { + case MONSTER: ++entityMonsterCount; break; + case ANIMAL: ++entityAnimalCount; break; + case AMBIENT: ++entityAmbientCount; break; + case WATER: ++entityWaterCount; break; + case ITEM: ++entityItemCount; break; + case XP_ORB: ++entityXPOrbCount; break; + default: break; } - else if(e.isEntityItem()) - ++entityItemCount; - else if(e.isEntityXPOrb()) - ++entityXPOrbCount; } private void onEntityRemove(Entity e) { if(e.isEntityLiving() && !e.isEntityPlayerMP()) - { entityLivingCount--; - if(e.isEntityMonster()) --entityMonsterCount; - else if(e.isEntityAnimal()) --entityAnimalCount; - else if(e.isEntityAmbient()) --entityAmbientCount; - else if(e.isEntityWater()) --entityWaterCount; + + switch(e.getEntityType()) + { + case MONSTER: --entityMonsterCount; break; + case ANIMAL: --entityAnimalCount; break; + case AMBIENT: --entityAmbientCount; break; + case WATER: --entityWaterCount; break; + case ITEM: --entityItemCount; break; + case XP_ORB: --entityXPOrbCount; break; + default: break; } - else if(e.isEntityItem()) - --entityItemCount; - else if(e.isEntityXPOrb()) - --entityXPOrbCount; } private void resetEntityCounters() @@ -1769,16 +1772,23 @@ } } + public int getEntityCountByType(EntityType type) + { + switch(type) + { + case MONSTER: return entityMonsterCount; + case ANIMAL: return entityAnimalCount; + case AMBIENT: return entityAmbientCount; + case WATER: return entityWaterCount; + case ITEM: return entityItemCount; + case XP_ORB: return entityXPOrbCount; + default: return 0; + } + } + public int getEntityCountOfSameType(Entity e) { - if(e.isEntityMonster()) return entityMonsterCount; - else if(e.isEntityAnimal()) return entityAnimalCount; - else if(e.isEntityAmbient()) return entityAmbientCount; - else if(e.isEntityWater()) return entityWaterCount; - else if(e.isEntityItem()) return entityItemCount; - else if(e.isEntityXPOrb()) return entityXPOrbCount; - - return 0; + return getEntityCountByType(e.getEntityType()); } public void free() diff --git a/src/main/java/org/ultramine/server/EntityType.java b/src/main/java/org/ultramine/server/EntityType.java new file mode 100644 index 0000000..d2401ef --- /dev/null +++ b/src/main/java/org/ultramine/server/EntityType.java @@ -0,0 +1,6 @@ +package org.ultramine.server; + +public enum EntityType +{ + MONSTER, ANIMAL, AMBIENT, WATER, ITEM, XP_ORB, OTHER; +} diff --git a/src/main/java/org/ultramine/server/ServerLoadBalancer.java b/src/main/java/org/ultramine/server/ServerLoadBalancer.java index 7097d54..2e6fc13 100644 --- a/src/main/java/org/ultramine/server/ServerLoadBalancer.java +++ b/src/main/java/org/ultramine/server/ServerLoadBalancer.java @@ -1,6 +1,6 @@ package org.ultramine.server; -import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; import org.ultramine.server.WorldsConfig.WorldConfig.LoadBalancer.Limits; import org.ultramine.server.WorldsConfig.WorldConfig.LoadBalancer.Limits.PerChunkEntityLimits; @@ -19,7 +19,6 @@ private static final boolean isClient = FMLCommonHandler.instance().getSide().isClient(); private static final PerChunkEntityLimits clientLimits = new PerChunkEntityLimits(); private static final PerChunkEntityLimits infinityLimits = new PerChunkEntityLimits(); - private static final Random rng = new Random(); private final World world; private final TIntByteMap activeChunkSet; @@ -70,7 +69,7 @@ int prior = activeChunkSet.get(ChunkHash.chunkToKey(cx, cz)); if(prior == Byte.MAX_VALUE) { - ent.despawnInactive(); + ent.updateInactive(); return false; } @@ -91,10 +90,7 @@ if(count > lowerLimit) { - float rate = (float)lowerLimit / (float)count; - if(rng.nextFloat() < rate) - return true; - return false; + return ThreadLocalRandom.current().nextInt(count) < lowerLimit; } return true; @@ -106,13 +102,15 @@ return clientLimits; Limits limits = ((WorldServer)e.worldObj).getConfig().loadBalancer.limits; - if(e.isEntityMonster()) return limits.monsters; - else if(e.isEntityAnimal()) return limits.animals; - else if(e.isEntityAmbient()) return limits.ambient; - else if(e.isEntityWater()) return limits.water; - else if(e.isEntityItem()) return limits.items; - else if(e.isEntityXPOrb()) return limits.xpOrbs; - - return infinityLimits; + switch(e.getEntityType()) + { + case MONSTER: return limits.monsters; + case ANIMAL: return limits.animals; + case AMBIENT: return limits.ambient; + case WATER: return limits.water; + case ITEM: return limits.items; + case XP_ORB: return limits.xpOrbs; + default: return infinityLimits; + } } }