Skip to content

Commit

Permalink
Fix optimizeEntityTicking
Browse files Browse the repository at this point in the history
* allow entity despawns
* don't optimize any ticking on client
  • Loading branch information
embeddedt committed Nov 6, 2022
1 parent 575e790 commit 36142c0
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 4 deletions.
3 changes: 2 additions & 1 deletion dependencies.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Add your dependencies here

dependencies {
compileOnly("it.unimi.dsi:fastutil:8.5.8")
compile("it.unimi.dsi:fastutil:8.5.8")
// Provides deobf support like in FG2
compileOnly('com.github.GTNewHorizons:CodeChickenLib:1.1.5.3:dev')
compileOnly('com.github.GTNewHorizons:CodeChickenCore:1.1.3:dev')
Expand Down Expand Up @@ -38,4 +38,5 @@ dependencies {
compileOnly(deobfMaven(curseMaven, "curse.maven:extrautils-225561:2264383"))
compileOnly(deobfMaven(curseMaven, "curse.maven:dynamiclights-227874:2337326"))
compileOnly(deobfMaven(curseMaven, "curse.maven:divinerpg-363543:2918948"))
runtimeOnly(deobfMaven(curseMaven, "curse.maven:xaerosminimap-263420:3876755"))
}
1 change: 1 addition & 0 deletions src/main/java/org/embeddedt/archaicfix/asm/Mixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
public enum Mixin implements IMixin {
// COMMON MIXINS
common_chickenchunks_MixinPlayerChunkViewerManager(Side.COMMON, require(TargetedMod.CHICKENCHUNKS), "chickenchunks.MixinPlayerChunkViewerManager"),
common_core_AccessorEntityLiving(Side.COMMON, always(), "core.AccessorEntityLiving"),
common_core_MixinEntityPlayerMP(Side.COMMON, always(), "core.MixinEntityPlayerMP"),
common_core_MixinWorldServer(Side.COMMON, always(), "core.MixinWorldServer"),
common_core_MixinMapGenStructure(Side.COMMON, always(), "core.MixinMapGenStructure"),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.embeddedt.archaicfix.mixins.common.core;

import net.minecraft.entity.EntityLiving;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;

@Mixin(EntityLiving.class)
public interface AccessorEntityLiving {
@Invoker
public boolean invokeCanDespawn();
@Invoker
public void invokeDespawnEntity();
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

import com.google.common.collect.ImmutableSet;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.ObfuscationReflectionHelper;
import it.unimi.dsi.fastutil.longs.LongCollection;
import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
Expand Down Expand Up @@ -98,20 +100,24 @@ else if (difficulty == EnumDifficulty.HARD)
private void skipUpdateIfOptimizing(Entity entity, boolean force, CallbackInfo ci, int chunkX, int chunkZ, boolean isInForcedChunk) {
if(!ArchaicConfig.optimizeEntityTicking)
return;
if (isRemote || isInForcedChunk || !(entity instanceof EntityLivingBase) || entity instanceof EntityPlayer || !entity.addedToChunk) {
return;
}
if(entityOptimizationIgnoreSet == null)
entityOptimizationIgnoreSet = ImmutableSet.copyOf(ArchaicConfig.optimizeEntityTickingIgnoreList);
if(entityOptimizationIgnoreSet.contains(EntityList.getEntityString(entity)))
return;
if (isInForcedChunk || !(entity instanceof EntityLivingBase) || entity instanceof EntityPlayer) {
return;
}
double finalDist = Double.MAX_VALUE;
for(EntityPlayer player : (List<EntityPlayer>)entity.worldObj.playerEntities) {
finalDist = Math.min(finalDist, player.getDistanceSq(entity.posX, entity.posY, entity.posZ));
if(finalDist <= ArchaicConfig.optimizeEntityTickingDistance)
break;
}
if(((EntityLivingBase)entity).deathTime <= 0 && finalDist > ArchaicConfig.optimizeEntityTickingDistance) {
if(entity instanceof EntityLiving && ((AccessorEntityLiving)entity).invokeCanDespawn()) {
/* Despawn even if outside the ticking range */
((AccessorEntityLiving)entity).invokeDespawnEntity();
}
ci.cancel();
}
}
Expand Down

0 comments on commit 36142c0

Please sign in to comment.