]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/common/VillageProcessor.java
Switch to using EventBus instead of static class
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / common / VillageProcessor.java
1 package com.irtimaled.bbor.common;
2
3 import com.irtimaled.bbor.common.models.BoundingBoxVillage;
4 import net.minecraft.village.Village;
5 import net.minecraft.village.VillageCollection;
6 import net.minecraft.world.World;
7
8 import java.util.HashMap;
9 import java.util.List;
10 import java.util.Map;
11
12 public class VillageProcessor {
13     private World world;
14     private BoundingBoxCache boundingBoxCache;
15     private Map<Integer, BoundingBoxVillage> villageCache = new HashMap<>();
16     private boolean closed = false;
17
18     VillageProcessor(World world, BoundingBoxCache boundingBoxCache) {
19         this.world = world;
20         this.boundingBoxCache = boundingBoxCache;
21     }
22
23     synchronized void process() {
24         if (closed) return;
25
26         Map<Integer, BoundingBoxVillage> oldVillages = new HashMap<>(villageCache);
27         Map<Integer, BoundingBoxVillage> newVillages = new HashMap<>();
28         VillageCollection villageCollection = world.getVillageCollection();
29         if (villageCollection != null) {
30             List<Village> villages = villageCollection.getVillageList();
31             for (Village village : villages) {
32                 int villageId = village.hashCode();
33                 BoundingBoxVillage newVillage = oldVillages.get(villageId);
34                 if (newVillage != null && newVillage.matches(village)) {
35                     oldVillages.remove(villageId);
36                 } else {
37                     newVillage = BoundingBoxVillage.from(village);
38                 }
39                 newVillages.put(villageId, newVillage);
40             }
41
42         }
43         for (BoundingBoxVillage village : oldVillages.values()) {
44             boundingBoxCache.removeBoundingBox(village);
45         }
46         for (BoundingBoxVillage village : newVillages.values()) {
47             boundingBoxCache.addBoundingBox(village);
48         }
49         villageCache = newVillages;
50     }
51
52     public void close() {
53         closed = true;
54         world = null;
55         boundingBoxCache = null;
56         villageCache.clear();
57     }
58 }