diff --git a/pom.xml b/pom.xml
index 0851776..d9fce59 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,7 +18,7 @@
0.3.0
0.2.0
- 4.0.0
+ 4.7.0
2.4.0
diff --git a/src/main/java/net/tfminecraft/dowsing/managers/NodeManager.java b/src/main/java/net/tfminecraft/dowsing/managers/NodeManager.java
index d306a58..17d5502 100644
--- a/src/main/java/net/tfminecraft/dowsing/managers/NodeManager.java
+++ b/src/main/java/net/tfminecraft/dowsing/managers/NodeManager.java
@@ -103,7 +103,7 @@ public static boolean canPurchaseCapacity(Guild g) {
}
public static double getTotalUpkeep(Guild g) {
- if (g == null) return 0;
+ if (g == null || Node.held(g)) return 0;
double total = 0;
for (Node n : nodes) {
if (!n.getIsActive() || !n.hasGuild()) continue;
@@ -167,6 +167,8 @@ public void run()
try {
if(!n.getIsActive()) continue;
if(!n.hasGuild()) continue;
+ // A held realm's nodes pause until it is taken on.
+ if(Node.held(n.getGuild())) continue;
if(n.getLoc().getChunk().isForceLoaded() == false) {
n.getLoc().getChunk().setForceLoaded(true);
}
diff --git a/src/main/java/net/tfminecraft/dowsing/objects/Node.java b/src/main/java/net/tfminecraft/dowsing/objects/Node.java
index a4b3aaf..94ba5c8 100644
--- a/src/main/java/net/tfminecraft/dowsing/objects/Node.java
+++ b/src/main/java/net/tfminecraft/dowsing/objects/Node.java
@@ -279,6 +279,7 @@ Guild resolveGuild() {
public boolean canHold(Guild g){
if(g == null) return false;
+ if(held(g)) return true;
Player p = Members.player(g.getLeader());
if(p != null && p.isOnline() && Permissions.isAdmin(p)) return true;
if(g.getMembers().size() < Cache.minMembersForNode) return false;
@@ -286,6 +287,19 @@ public boolean canHold(Guild g){
return true;
}
+ /**
+ * A realm SimpleFactions holds after its last member died keeps its nodes, paused like its other
+ * upkeep, so they wait for its revived leader or will heir instead of going to whoever claims them
+ * first. A closed realm's guild is gone, which frees them. SimpleFactions before 4.7.0 has no held realms.
+ */
+ public static boolean held(Guild g) {
+ try {
+ return g != null && g.isHeld();
+ } catch (LinkageError olderSimpleFactions) {
+ return false;
+ }
+ }
+
public boolean canClaim(Player p, Guild g){
if(Permissions.isAdmin(p)) return true;
if(!isClaimable()) return false;
@@ -542,7 +556,8 @@ public void deActivate() {
}
public void growEfficiency() {
- if(resolveGuild() == null) return;
+ // A held realm has no members, which would cap its nodes' efficiency at 0 until it is taken on.
+ if(resolveGuild() == null || held(guild)) return;
int members = guild.getMembers().size();
double growth = Math.min(1.0, members*Cache.efficiencyGrowthPerMember);
updateEfficiency(growth);
diff --git a/src/test/java/net/tfminecraft/dowsing/managers/NodeManagerCyclesTest.java b/src/test/java/net/tfminecraft/dowsing/managers/NodeManagerCyclesTest.java
index dda1009..a8b9322 100644
--- a/src/test/java/net/tfminecraft/dowsing/managers/NodeManagerCyclesTest.java
+++ b/src/test/java/net/tfminecraft/dowsing/managers/NodeManagerCyclesTest.java
@@ -86,6 +86,21 @@ void countsCapacityAndUpkeepRespectOwnershipSpecialNodesAndPurchasedLimits() {
NodeManager.extraCapacityByGuild.put("guild", 2); assertEquals(4, NodeManager.getNodeCapacity(f.guild));
assertTrue(NodeManager.canPurchaseCapacity(f.guild)); NodeManager.extraCapacityByGuild.put("guild", 3);
assertFalse(NodeManager.canPurchaseCapacity(f.guild));
+ when(f.guild.isHeld()).thenReturn(true);
+ assertEquals(0, NodeManager.getTotalUpkeep(f.guild));
+ }
+
+ @Test
+ void aHeldRealmsNodesPauseInsteadOfProducing() {
+ Node held = f.nodeAt(f.location);
+ when(held.getIsActive()).thenReturn(true); when(held.getGuild()).thenReturn(f.guild);
+ when(f.guild.isHeld()).thenReturn(true);
+ NodeManager.nodes.add(held);
+ try (Cycles cycles = new Cycles(); var droppers = mockConstruction(ItemDropper.class)) {
+ f.manager.start(); cycles.tasks.get(1200L).run();
+ verify(held, never()).tickCycle(); verify(held, never()).tick(); assertTrue(droppers.constructed().isEmpty());
+ verify(f.chunk, never()).setForceLoaded(true);
+ }
}
@Test
diff --git a/src/test/java/net/tfminecraft/dowsing/objects/NodeBehaviorTest.java b/src/test/java/net/tfminecraft/dowsing/objects/NodeBehaviorTest.java
index e7dd114..9818a51 100644
--- a/src/test/java/net/tfminecraft/dowsing/objects/NodeBehaviorTest.java
+++ b/src/test/java/net/tfminecraft/dowsing/objects/NodeBehaviorTest.java
@@ -141,6 +141,33 @@ void invalidOwnershipNotifiesTheLeaderAndReleasesTheNode() {
node.setGuild(f.guild); node.check(); assertTrue(node.hasGuild());
}
+ @Test
+ void aHeldRealmKeepsItsNodeWithNoMembersAndLosesItOnceNoLongerHeld() {
+ Node node = f.owned();
+ when(f.guild.getMembers()).thenReturn(List.of());
+ when(f.guild.getLeader()).thenReturn("");
+ when(f.guild.isHeld()).thenReturn(true);
+ assertTrue(node.canHold(f.guild));
+ node.check();
+ assertSame(f.guild, node.getGuild()); assertFalse(node.isClaimable());
+ Node efficient = new Node(UUID.randomUUID(), f.block, f.location, f.guild, true, 1, 0, f.type, 60, 0, 25);
+ efficient.growEfficiency();
+ assertEquals(25, efficient.getEfficiency());
+ when(f.guild.isHeld()).thenReturn(false);
+ node.check();
+ assertTrue(node.isClaimable());
+ }
+
+ @Test
+ void simpleFactionsWithoutHeldRealmsFallsBackToTheMemberRule() {
+ when(f.guild.isHeld()).thenThrow(new NoSuchMethodError("isHeld"));
+ assertFalse(Node.held(f.guild)); assertFalse(Node.held(null));
+ Node node = f.owned();
+ assertTrue(node.canHold(f.guild));
+ when(f.guild.getMembers()).thenReturn(List.of());
+ assertFalse(node.canHold(f.guild));
+ }
+
@Test
void guildNoticesReachOnlyOnlineMembersOfTheOwningGuild() {
var leader = f.server.addPlayer("Leader");