From 4cea1ca2116050e151407aae263a9b979b209979 Mon Sep 17 00:00:00 2001 From: Irtimaled Date: Thu, 14 Mar 2019 00:10:40 -0700 Subject: [PATCH] Switch back to old village processors --- .../bbor/common/BoundingBoxCache.java | 2 +- .../irtimaled/bbor/common/CommonProxy.java | 46 +++++++----------- .../bbor/common/VillageProcessor.java | 48 +++++++++++++++++++ .../events/{Tick.java => ServerTick.java} | 2 +- .../bbor/common/events/ServerWorldTick.java | 15 ++++++ ...illageUpdated.java => VillageRemoved.java} | 11 +++-- .../common/models/BoundingBoxVillage.java | 5 +- .../mixin/server/MixinMinecraftServer.java | 4 +- .../bbor/mixin/village/MixinVillage.java | 41 ---------------- .../bbor/mixin/world/MixinWorldServer.java | 18 +++++++ src/main/resources/mixins.bbor.json | 2 +- 11 files changed, 112 insertions(+), 82 deletions(-) create mode 100644 src/main/java/com/irtimaled/bbor/common/VillageProcessor.java rename src/main/java/com/irtimaled/bbor/common/events/{Tick.java => ServerTick.java} (63%) create mode 100644 src/main/java/com/irtimaled/bbor/common/events/ServerWorldTick.java rename src/main/java/com/irtimaled/bbor/common/events/{VillageUpdated.java => VillageRemoved.java} (56%) delete mode 100644 src/main/java/com/irtimaled/bbor/mixin/village/MixinVillage.java create mode 100644 src/main/java/com/irtimaled/bbor/mixin/world/MixinWorldServer.java diff --git a/src/main/java/com/irtimaled/bbor/common/BoundingBoxCache.java b/src/main/java/com/irtimaled/bbor/common/BoundingBoxCache.java index 6b76b9c..9d015d9 100644 --- a/src/main/java/com/irtimaled/bbor/common/BoundingBoxCache.java +++ b/src/main/java/com/irtimaled/bbor/common/BoundingBoxCache.java @@ -14,7 +14,7 @@ public class BoundingBoxCache { return cache; } - public void close() { + public void clear() { cache.clear(); } diff --git a/src/main/java/com/irtimaled/bbor/common/CommonProxy.java b/src/main/java/com/irtimaled/bbor/common/CommonProxy.java index 88d44c4..39400e7 100644 --- a/src/main/java/com/irtimaled/bbor/common/CommonProxy.java +++ b/src/main/java/com/irtimaled/bbor/common/CommonProxy.java @@ -11,15 +11,14 @@ import com.irtimaled.bbor.common.messages.InitializeClient; import com.irtimaled.bbor.common.messages.RemoveBoundingBox; import com.irtimaled.bbor.common.models.BoundingBox; import com.irtimaled.bbor.common.models.BoundingBoxMobSpawner; -import com.irtimaled.bbor.common.models.BoundingBoxVillage; import com.irtimaled.bbor.common.models.WorldData; -import com.irtimaled.bbor.config.ConfigManager; import io.netty.channel.local.LocalAddress; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.play.server.SPacketCustomPayload; import net.minecraft.util.math.BlockPos; -import net.minecraft.village.Village; +import net.minecraft.village.VillageCollection; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.dimension.DimensionType; @@ -35,7 +34,7 @@ import java.util.function.Consumer; public class CommonProxy { private Set players = new HashSet<>(); private Map> playerBoundingBoxesCache = new HashMap<>(); - private Map villageCache = new HashMap<>(); + private Map villageProcessors = new HashMap<>(); private Map chunkProcessors = new HashMap<>(); private WorldData worldData = null; private final Map dimensionCache = new ConcurrentHashMap<>(); @@ -47,10 +46,9 @@ public class CommonProxy { EventBus.subscribe(PlayerLoggedIn.class, e -> playerLoggedIn(e.getPlayer())); EventBus.subscribe(PlayerLoggedOut.class, e -> playerLoggedOut(e.getPlayer())); EventBus.subscribe(PlayerSubscribed.class, e -> sendBoundingBoxes(e.getPlayer())); - EventBus.subscribe(Tick.class, e -> tick()); - if (ConfigManager.drawVillages.get()) { - EventBus.subscribe(VillageUpdated.class, e -> villageUpdated(e.getDimensionType(), e.getVillage())); - } + EventBus.subscribe(ServerWorldTick.class, e -> serverWorldTick(e.getWorld())); + EventBus.subscribe(ServerTick.class, e -> serverTick()); + EventBus.subscribe(VillageRemoved.class, e -> sendRemoveBoundingBox(e.getDimensionType(), e.getVillage())); } protected void setWorldData(long seed, int spawnX, int spawnZ) { @@ -75,6 +73,7 @@ public class CommonProxy { } Logger.info("create world dimension: %s, %s (seed: %d)", dimensionType, world.getClass().toString(), world.getSeed()); chunkProcessors.put(dimensionType, chunkProcessor); + villageProcessors.put(dimensionType, new VillageProcessor(dimensionType, boundingBoxCache)); } } @@ -160,31 +159,19 @@ public class CommonProxy { sendRemoveBoundingBox(dimensionType, boundingBox); } - private void tick() { + private void serverTick() { for (EntityPlayerMP player : players) { DimensionType dimensionType = DimensionType.getById(player.dimension); sendToPlayer(player, getCache(dimensionType)); } } - private void villageUpdated(DimensionType dimensionType, Village village) { - BoundingBoxCache cache = getCache(dimensionType); - if (cache == null) return; + private void serverWorldTick(WorldServer world) { + DimensionType dimensionType = world.dimension.getType(); + VillageProcessor villageProcessor = villageProcessors.get(dimensionType); + if(villageProcessor == null) return; - int villageId = village.hashCode(); - BoundingBoxVillage oldVillage = villageCache.get(villageId); - if (oldVillage != null && !oldVillage.matches(village)) { - cache.removeBoundingBox(oldVillage); - sendRemoveBoundingBox(dimensionType, oldVillage); - oldVillage = null; - } - if (village.isAnnihilated()) { - villageCache.remove(villageId); - } else { - BoundingBoxVillage newVillage = oldVillage == null ? BoundingBoxVillage.from(village) : oldVillage; - cache.addBoundingBox(newVillage); - villageCache.put(villageId, newVillage); - } + villageProcessor.process(world.getVillageCollection()); } protected BoundingBoxCache getCache(DimensionType dimensionType) { @@ -200,9 +187,12 @@ public class CommonProxy { } protected void clearCaches() { - villageCache.clear(); + for(VillageProcessor villageProcessor : villageProcessors.values()) { + villageProcessor.clear(); + } + villageProcessors.clear(); for (BoundingBoxCache cache : dimensionCache.values()) { - cache.close(); + cache.clear(); } dimensionCache.clear(); } diff --git a/src/main/java/com/irtimaled/bbor/common/VillageProcessor.java b/src/main/java/com/irtimaled/bbor/common/VillageProcessor.java new file mode 100644 index 0000000..ab8241e --- /dev/null +++ b/src/main/java/com/irtimaled/bbor/common/VillageProcessor.java @@ -0,0 +1,48 @@ +package com.irtimaled.bbor.common; + +import com.irtimaled.bbor.common.events.VillageRemoved; +import com.irtimaled.bbor.common.models.BoundingBoxVillage; +import net.minecraft.village.Village; +import net.minecraft.village.VillageCollection; +import net.minecraft.world.dimension.DimensionType; + +import java.util.HashMap; +import java.util.Map; + +class VillageProcessor { + private final DimensionType dimensionType; + private final BoundingBoxCache boundingBoxCache; + + private Map villageCache = new HashMap<>(); + + VillageProcessor(DimensionType dimensionType, BoundingBoxCache boundingBoxCache) { + + this.dimensionType = dimensionType; + this.boundingBoxCache = boundingBoxCache; + } + + void process(VillageCollection villageCollection) { + Map oldVillages = new HashMap<>(villageCache); + Map newVillages = new HashMap<>(); + for (Village village : villageCollection.getVillageList()) { + int villageId = village.hashCode(); + BoundingBoxVillage newVillage = oldVillages.get(villageId); + if (newVillage != null && newVillage.matches(village)) { + oldVillages.remove(villageId); + } else { + newVillage = BoundingBoxVillage.from(village); + boundingBoxCache.addBoundingBox(newVillage); + } + newVillages.put(villageId, newVillage); + } + for (BoundingBoxVillage village : oldVillages.values()) { + boundingBoxCache.removeBoundingBox(village); + EventBus.publish(new VillageRemoved(dimensionType, village)); + } + villageCache = newVillages; + } + + void clear() { + villageCache.clear(); + } +} \ No newline at end of file diff --git a/src/main/java/com/irtimaled/bbor/common/events/Tick.java b/src/main/java/com/irtimaled/bbor/common/events/ServerTick.java similarity index 63% rename from src/main/java/com/irtimaled/bbor/common/events/Tick.java rename to src/main/java/com/irtimaled/bbor/common/events/ServerTick.java index 51232bf..068b19b 100644 --- a/src/main/java/com/irtimaled/bbor/common/events/Tick.java +++ b/src/main/java/com/irtimaled/bbor/common/events/ServerTick.java @@ -1,4 +1,4 @@ package com.irtimaled.bbor.common.events; -public class Tick { +public class ServerTick { } diff --git a/src/main/java/com/irtimaled/bbor/common/events/ServerWorldTick.java b/src/main/java/com/irtimaled/bbor/common/events/ServerWorldTick.java new file mode 100644 index 0000000..f3f317b --- /dev/null +++ b/src/main/java/com/irtimaled/bbor/common/events/ServerWorldTick.java @@ -0,0 +1,15 @@ +package com.irtimaled.bbor.common.events; + +import net.minecraft.world.WorldServer; + +public class ServerWorldTick { + private WorldServer world; + + public ServerWorldTick(WorldServer world) { + this.world = world; + } + + public WorldServer getWorld() { + return world; + } +} diff --git a/src/main/java/com/irtimaled/bbor/common/events/VillageUpdated.java b/src/main/java/com/irtimaled/bbor/common/events/VillageRemoved.java similarity index 56% rename from src/main/java/com/irtimaled/bbor/common/events/VillageUpdated.java rename to src/main/java/com/irtimaled/bbor/common/events/VillageRemoved.java index f5f9c6f..6efec62 100644 --- a/src/main/java/com/irtimaled/bbor/common/events/VillageUpdated.java +++ b/src/main/java/com/irtimaled/bbor/common/events/VillageRemoved.java @@ -1,13 +1,14 @@ package com.irtimaled.bbor.common.events; -import net.minecraft.village.Village; +import com.irtimaled.bbor.common.models.BoundingBoxVillage; import net.minecraft.world.dimension.DimensionType; -public class VillageUpdated { +public class VillageRemoved { private final DimensionType dimensionType; - private final Village village; + private final BoundingBoxVillage village; + + public VillageRemoved(DimensionType dimensionType, BoundingBoxVillage village) { - public VillageUpdated(DimensionType dimensionType, Village village) { this.dimensionType = dimensionType; this.village = village; } @@ -16,7 +17,7 @@ public class VillageUpdated { return dimensionType; } - public Village getVillage() { + public BoundingBoxVillage getVillage() { return village; } } diff --git a/src/main/java/com/irtimaled/bbor/common/models/BoundingBoxVillage.java b/src/main/java/com/irtimaled/bbor/common/models/BoundingBoxVillage.java index 25192cd..6c160f1 100644 --- a/src/main/java/com/irtimaled/bbor/common/models/BoundingBoxVillage.java +++ b/src/main/java/com/irtimaled/bbor/common/models/BoundingBoxVillage.java @@ -43,7 +43,7 @@ public class BoundingBoxVillage extends BoundingBox { } public static BoundingBoxVillage from(BlockPos center, Integer radius, int villageId, int population, Set doors) { - Boolean spawnsIronGolems = shouldSpawnIronGolems(population, doors.size()); + boolean spawnsIronGolems = shouldSpawnIronGolems(population, doors.size()); Color color = VillageColorCache.getColor(villageId); return from(center, radius, color, spawnsIronGolems, doors); } @@ -62,8 +62,7 @@ public class BoundingBoxVillage extends BoundingBox { private static Set getDoorsFromVillage(Village village) { Set doors = new HashSet<>(); List doorInfoList = village.getVillageDoorInfoList(); - for (int i = 0; i < doorInfoList.size(); i++) { - VillageDoorInfo doorInfo = doorInfoList.get(i); + for (VillageDoorInfo doorInfo : doorInfoList) { doors.add(doorInfo.getDoorBlockPos()); } return doors; diff --git a/src/main/java/com/irtimaled/bbor/mixin/server/MixinMinecraftServer.java b/src/main/java/com/irtimaled/bbor/mixin/server/MixinMinecraftServer.java index 0e78d21..73b7c61 100644 --- a/src/main/java/com/irtimaled/bbor/mixin/server/MixinMinecraftServer.java +++ b/src/main/java/com/irtimaled/bbor/mixin/server/MixinMinecraftServer.java @@ -1,7 +1,7 @@ package com.irtimaled.bbor.mixin.server; import com.irtimaled.bbor.common.EventBus; -import com.irtimaled.bbor.common.events.Tick; +import com.irtimaled.bbor.common.events.ServerTick; import com.irtimaled.bbor.common.events.WorldLoaded; import net.minecraft.server.MinecraftServer; import net.minecraft.world.World; @@ -26,6 +26,6 @@ public class MixinMinecraftServer { @Inject(method = "tick", at = @At("RETURN")) private void tick(CallbackInfo ci) { - EventBus.publish(new Tick()); + EventBus.publish(new ServerTick()); } } diff --git a/src/main/java/com/irtimaled/bbor/mixin/village/MixinVillage.java b/src/main/java/com/irtimaled/bbor/mixin/village/MixinVillage.java deleted file mode 100644 index 7d358f7..0000000 --- a/src/main/java/com/irtimaled/bbor/mixin/village/MixinVillage.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.irtimaled.bbor.mixin.village; - -import com.irtimaled.bbor.common.EventBus; -import com.irtimaled.bbor.common.events.VillageUpdated; -import net.minecraft.village.Village; -import net.minecraft.world.World; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(Village.class) -public abstract class MixinVillage { - @Shadow - protected abstract void updateVillagerCount(); - - @Shadow - private int villagerCount; - - @Shadow private World world; - - @Inject(method = "updateVillageRadiusAndCenter", at = @At("HEAD")) - private void updateVillageRadiusAndCenter(CallbackInfo ci) { - Village village = (Village) (Object) this; - publishVillageUpdated(village); - } - - private void publishVillageUpdated(Village village) { - EventBus.publish(new VillageUpdated(world.dimension.getType(), village)); - } - - @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/village/Village;updateVillagerCount()V")) - private void tick(Village village) { - int population = this.villagerCount; - this.updateVillagerCount(); - if (this.villagerCount != population) - publishVillageUpdated(village); - } -} diff --git a/src/main/java/com/irtimaled/bbor/mixin/world/MixinWorldServer.java b/src/main/java/com/irtimaled/bbor/mixin/world/MixinWorldServer.java new file mode 100644 index 0000000..ec2add5 --- /dev/null +++ b/src/main/java/com/irtimaled/bbor/mixin/world/MixinWorldServer.java @@ -0,0 +1,18 @@ +package com.irtimaled.bbor.mixin.world; + +import com.irtimaled.bbor.common.EventBus; +import com.irtimaled.bbor.common.events.ServerWorldTick; +import net.minecraft.world.WorldServer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(WorldServer.class) +public class MixinWorldServer { + @Inject(method = "tick", at=@At(value = "INVOKE", target = "Lnet/minecraft/village/VillageCollection;tick()V", shift = At.Shift.AFTER)) + private void afterVillageTick(CallbackInfo ci) { + EventBus.publish(new ServerWorldTick((WorldServer)(Object)this)); + } + +} diff --git a/src/main/resources/mixins.bbor.json b/src/main/resources/mixins.bbor.json index 0a4f8d4..acde935 100644 --- a/src/main/resources/mixins.bbor.json +++ b/src/main/resources/mixins.bbor.json @@ -7,8 +7,8 @@ "refmap": "mixins.bbor.refmap.json", "mixins": [ "world.chunk.MixinChunk", + "world.MixinWorldServer", "network.play.client.MixinCPacketCustomPayload", - "village.MixinVillage", "server.management.MixinPlayerList", "server.management.MixinPlayerInteractionManager", "server.MixinMinecraftServer" -- 2.44.0