mirror of
https://github.com/BentoBoxWorld/BentoBox.git
synced 2024-11-24 03:35:11 +01:00
Fixes island coords that are not on the grid.
https://github.com/BentoBoxWorld/BentoBox/issues/549
This commit is contained in:
parent
30e3dbf269
commit
160ef002e4
@ -713,6 +713,8 @@ public class IslandsManager {
|
|||||||
// Add to quarantine cache
|
// Add to quarantine cache
|
||||||
quarantineCache.computeIfAbsent(island.getOwner(), k -> new ArrayList<>()).add(island);
|
quarantineCache.computeIfAbsent(island.getOwner(), k -> new ArrayList<>()).add(island);
|
||||||
} else {
|
} else {
|
||||||
|
// Fix island center if it is off
|
||||||
|
fixIslandCenter(island);
|
||||||
if (!islandCache.addIsland(island)) {
|
if (!islandCache.addIsland(island)) {
|
||||||
// Quarantine the offending island
|
// Quarantine the offending island
|
||||||
toQuarantine.add(island);
|
toQuarantine.add(island);
|
||||||
@ -731,6 +733,27 @@ public class IslandsManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Island coordinates should always be a multiple of the island distance x 2. If they are not, this method
|
||||||
|
* realigns the grid coordinates.
|
||||||
|
* @param island - island
|
||||||
|
*/
|
||||||
|
public void fixIslandCenter(Island island) {
|
||||||
|
World world = island.getWorld();
|
||||||
|
if (world == null || island.getCenter() == null || !plugin.getIWM().inWorld(world)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int distance = island.getRange() * 2;
|
||||||
|
long x = island.getCenter().getBlockX() - plugin.getIWM().getIslandXOffset(world);
|
||||||
|
long z = island.getCenter().getBlockZ() - plugin.getIWM().getIslandZOffset(world);
|
||||||
|
if (x % distance != 0 || z % distance != 0) {
|
||||||
|
// Island is off grid
|
||||||
|
x = Math.round((double) x / distance) * distance + plugin.getIWM().getIslandXOffset(world);
|
||||||
|
z = Math.round((double) z / distance) * distance + plugin.getIWM().getIslandZOffset(world);
|
||||||
|
}
|
||||||
|
island.setCenter(new Location(world, x, island.getCenter().getBlockY(), z));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if a specific location is within the protected range of an island
|
* Checks if a specific location is within the protected range of an island
|
||||||
* that the player is a member of (owner or member)
|
* that the player is a member of (owner or member)
|
||||||
|
@ -1115,4 +1115,79 @@ public class IslandsManagerTest {
|
|||||||
im.setIslandCache(islandCache);
|
im.setIslandCache(islandCache);
|
||||||
assertEquals(island, im.getIslandById(uuid).get());
|
assertEquals(island, im.getIslandById(uuid).get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test method for {@link IslandsManager#fixIslandCenter(Island)}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testFixIslandCenter() {
|
||||||
|
// Setup
|
||||||
|
when(iwm.inWorld(Mockito.any(World.class))).thenReturn(true);
|
||||||
|
when(iwm.getIslandXOffset(Mockito.any())).thenReturn(0);
|
||||||
|
when(iwm.getIslandZOffset(Mockito.any())).thenReturn(0);
|
||||||
|
Island island = mock(Island.class);
|
||||||
|
Location center = mock(Location.class);
|
||||||
|
when(center.getWorld()).thenReturn(world);
|
||||||
|
when(center.getBlockX()).thenReturn(129);
|
||||||
|
when(center.getBlockY()).thenReturn(120);
|
||||||
|
when(center.getBlockZ()).thenReturn(127);
|
||||||
|
when(island.getCenter()).thenReturn(center);
|
||||||
|
when(island.getRange()).thenReturn(64);
|
||||||
|
when(island.getWorld()).thenReturn(world);
|
||||||
|
// Test
|
||||||
|
IslandsManager im = new IslandsManager(plugin);
|
||||||
|
im.fixIslandCenter(island);
|
||||||
|
Location loc = new Location(world, 128, 120, 128);
|
||||||
|
Mockito.verify(island).setCenter(Mockito.eq(loc));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test method for {@link IslandsManager#fixIslandCenter(Island)}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testFixIslandCenterOffsets() {
|
||||||
|
// Setup
|
||||||
|
when(iwm.inWorld(Mockito.any(World.class))).thenReturn(true);
|
||||||
|
when(iwm.getIslandXOffset(Mockito.any())).thenReturn(10);
|
||||||
|
when(iwm.getIslandZOffset(Mockito.any())).thenReturn(10);
|
||||||
|
Island island = mock(Island.class);
|
||||||
|
Location center = mock(Location.class);
|
||||||
|
when(center.getWorld()).thenReturn(world);
|
||||||
|
when(center.getBlockX()).thenReturn(1295);
|
||||||
|
when(center.getBlockY()).thenReturn(120);
|
||||||
|
when(center.getBlockZ()).thenReturn(1295);
|
||||||
|
when(island.getCenter()).thenReturn(center);
|
||||||
|
when(island.getRange()).thenReturn(64);
|
||||||
|
when(island.getWorld()).thenReturn(world);
|
||||||
|
// Test
|
||||||
|
IslandsManager im = new IslandsManager(plugin);
|
||||||
|
im.fixIslandCenter(island);
|
||||||
|
Location loc = new Location(world, 1290, 120, 1290);
|
||||||
|
Mockito.verify(island).setCenter(Mockito.eq(loc));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test method for {@link IslandsManager#fixIslandCenter(Island)}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testFixIslandCenterOffsetsNegatives() {
|
||||||
|
// Setup
|
||||||
|
when(iwm.inWorld(Mockito.any(World.class))).thenReturn(true);
|
||||||
|
when(iwm.getIslandXOffset(Mockito.any())).thenReturn(0);
|
||||||
|
when(iwm.getIslandZOffset(Mockito.any())).thenReturn(0);
|
||||||
|
Island island = mock(Island.class);
|
||||||
|
Location center = mock(Location.class);
|
||||||
|
when(center.getWorld()).thenReturn(world);
|
||||||
|
when(center.getBlockX()).thenReturn(-1295);
|
||||||
|
when(center.getBlockY()).thenReturn(120);
|
||||||
|
when(center.getBlockZ()).thenReturn(-1287);
|
||||||
|
when(island.getCenter()).thenReturn(center);
|
||||||
|
when(island.getRange()).thenReturn(64);
|
||||||
|
when(island.getWorld()).thenReturn(world);
|
||||||
|
// Test
|
||||||
|
IslandsManager im = new IslandsManager(plugin);
|
||||||
|
im.fixIslandCenter(island);
|
||||||
|
Location loc = new Location(world, -1280, 120, -1280);
|
||||||
|
Mockito.verify(island).setCenter(Mockito.eq(loc));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user