]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/common/VillageProcessor.java
ec90fb679c5cd3650a598167e98317b1cce73759
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / common / VillageProcessor.java
1 package com.irtimaled.bbor.common;
2
3 import com.irtimaled.bbor.common.events.VillageRemoved;
4 import com.irtimaled.bbor.common.models.BoundingBoxVillage;
5 import com.irtimaled.bbor.common.models.Coords;
6 import net.minecraft.village.Village;
7 import net.minecraft.village.VillageCollection;
8 import net.minecraft.village.VillageDoorInfo;
9
10 import java.util.*;
11
12 class VillageProcessor {
13     private final BoundingBoxCache boundingBoxCache;
14
15     private Map<Integer, BoundingBoxVillage> villageCache = new HashMap<>();
16     private int dimensionId;
17
18     VillageProcessor(int dimensionId, BoundingBoxCache boundingBoxCache) {
19         this.dimensionId = dimensionId;
20         this.boundingBoxCache = boundingBoxCache;
21     }
22
23     void process(VillageCollection villageCollection) {
24         Map<Integer, BoundingBoxVillage> oldVillages = new HashMap<>(villageCache);
25         Map<Integer, BoundingBoxVillage> newVillages = new HashMap<>();
26         for (Village village : villageCollection.getVillageList()) {
27             int villageId = village.hashCode();
28             BoundingBoxVillage newVillage = oldVillages.get(villageId);
29             if (areEquivalent(village, newVillage)) {
30                 oldVillages.remove(villageId);
31             } else {
32                 newVillage = buildBoundingBox(village);
33                 boundingBoxCache.addBoundingBox(newVillage);
34             }
35             newVillages.put(villageId, newVillage);
36         }
37         for (BoundingBoxVillage village : oldVillages.values()) {
38             boundingBoxCache.removeBoundingBox(village);
39             EventBus.publish(new VillageRemoved(dimensionId, village));
40         }
41         villageCache = newVillages;
42     }
43
44     private static Set<Coords> getDoorsFromVillage(Village village) {
45         Set<Coords> doors = new HashSet<>();
46         List<VillageDoorInfo> doorInfoList = village.getVillageDoorInfoList();
47         for (VillageDoorInfo doorInfo : doorInfoList) {
48             doors.add(new Coords(doorInfo.getDoorBlockPos()));
49         }
50         return doors;
51     }
52
53     private boolean areEquivalent(Village village, BoundingBoxVillage newVillage) {
54         if (newVillage == null) return false;
55         Coords center = new Coords(village.getCenter());
56         int radius = village.getVillageRadius();
57         boolean spawnsIronGolems = VillageHelper.shouldSpawnIronGolems(village.getNumVillagers(), village.getNumVillageDoors());
58         Set<Coords> doors = getDoorsFromVillage(village);
59         int villageHash = VillageHelper.computeHash(center, radius, spawnsIronGolems, doors);
60         return newVillage.getVillageHash() == villageHash;
61     }
62
63     private BoundingBoxVillage buildBoundingBox(Village village) {
64         Coords center = new Coords(village.getCenter());
65         int radius = village.getVillageRadius();
66         Set<Coords> doors = getDoorsFromVillage(village);
67         return BoundingBoxVillage.from(center, radius, village.hashCode(), village.getNumVillagers(), doors);
68     }
69
70     void clear() {
71         villageCache.clear();
72     }
73 }