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");