Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<argLine></argLine>
<denareconomy.version>0.3.0</denareconomy.version>
<magic.version>0.2.0</magic.version>
<simplefactions.version>4.0.0</simplefactions.version>
<simplefactions.version>4.7.0</simplefactions.version>
<tlibs.version>2.4.0</tlibs.version>
</properties>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
Expand Down
17 changes: 16 additions & 1 deletion src/main/java/net/tfminecraft/dowsing/objects/Node.java
Original file line number Diff line number Diff line change
Expand Up @@ -279,13 +279,27 @@ 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;
if(NodeManager.getNodeAmount(g)-NodeManager.getNodeCapacity(g) > 0) return false;
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;
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down