Fixes #2219. Island homes were set incorrectly with a new island.

This commit is contained in:
tastybento 2023-11-04 10:29:28 -07:00
parent 4200fe4abb
commit 6d09a5a359
7 changed files with 1863 additions and 1835 deletions

View File

@ -17,6 +17,8 @@ import org.bukkit.inventory.ItemStack;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import world.bentobox.bentobox.api.panels.reader.ItemTemplateRecord.ActionRecords;
/**
* This Record contains all necessary information about Item Template that can be used to craft panel item.
*

View File

@ -15,6 +15,7 @@ import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import world.bentobox.bentobox.api.panels.Panel;
import world.bentobox.bentobox.api.panels.reader.PanelTemplateRecord.TemplateItem;
/**
* This is template object for the panel reader. It contains data that can exist in the panel.

View File

@ -22,6 +22,7 @@ import org.bukkit.World;
import org.bukkit.World.Environment;
import org.bukkit.entity.Player;
import org.bukkit.util.BoundingBox;
import org.bukkit.util.Vector;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
@ -1676,6 +1677,14 @@ public class Island implements DataObject, MetaDataAble {
* @since 1.16.0
*/
public void addHome(String name, Location location) {
if (location != null) {
Vector v = location.toVector();
if (!this.getBoundingBox().contains(v)) {
BentoBox.getInstance().logWarning("Tried to set a home location " + location + " outside of the island. This generally should not happen.");
BentoBox.getInstance().logWarning("Island is at " + this.getCenter() + ". The island file may need editing to remove this home.");
BentoBox.getInstance().logWarning("Please report this issue and logs around this item to BentoBox");
}
}
getHomes().put(name.toLowerCase(), location);
setChanged();
}

View File

@ -50,7 +50,7 @@ public class PrimaryIslandListener implements Listener {
private void setIsland(Player player, Location location) {
im.getIslandAt(location)
.filter(i -> i.getOwner() != null && i.getOwner().equals(player.getUniqueId()))
.filter(i -> player.getUniqueId().equals(i.getOwner()))
.ifPresent(i -> im.setPrimaryIsland(player.getUniqueId(), i));
}

View File

@ -198,7 +198,8 @@ public class NewIsland {
// Do nothing of other cases
}
}
// Set the player's primary island
plugin.getIslands().setPrimaryIsland(user.getUniqueId(), island);
// Run task to run after creating the island in one tick if island is not being pasted
if (noPaste) {
Bukkit.getScheduler().runTask(plugin, () -> postCreationTask(oldIsland));
@ -244,13 +245,11 @@ public class NewIsland {
/**
* Cleans up a user before moving them to a new island.
* Removes any old home locations. Sets the next home location. Resets deaths.
* Resets deaths.
* Checks range permissions and saves the player to the database.
* @param loc - the new island location
*/
private void cleanUpUser(Location loc) {
// Set home location
plugin.getIslands().setHomeLocation(user, new Location(loc.getWorld(), loc.getX() + 0.5D, loc.getY(), loc.getZ() + 0.5D));
// Reset deaths
if (plugin.getIWM().isDeathsResetOnNewIsland(world)) {
plugin.getPlayers().setDeaths(world, user.getUniqueId(), 0);

View File

@ -6,6 +6,9 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.IOException;
@ -21,6 +24,7 @@ import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.World.Environment;
import org.bukkit.block.Block;
import org.bukkit.util.Vector;
import org.eclipse.jdt.annotation.NonNull;
import org.junit.After;
import org.junit.Before;
@ -85,6 +89,7 @@ public class IslandTest {
// Location
when(location.clone()).thenReturn(location);
when(location.toVector()).thenReturn(new Vector(0,0,0));
when(world.getName()).thenReturn("bskyblock_world");
when(location.getWorld()).thenReturn(world);
when(world.getEnvironment()).thenReturn(Environment.NORMAL);
@ -1174,6 +1179,18 @@ public class IslandTest {
assertEquals(location, i.getHome("backyard"));
}
/**
* Test method for {@link world.bentobox.bentobox.database.objects.Island#addHome(java.lang.String, org.bukkit.Location)}.
*/
@Test
public void testAddHomeOutsideIsland() {
when(location.toVector()).thenReturn(new Vector(1000000, 0, 10000000));
i.addHome("backyard", location);
// Check there is a warning about this home being outside of the island
verify(plugin, times(3)).logWarning(anyString());
assertEquals(location, i.getHome("backyard"));
}
/**
* Test method for {@link world.bentobox.bentobox.database.objects.Island#removeHome(java.lang.String)}.
*/

View File

@ -198,7 +198,7 @@ public class NewIslandTest {
verify(bpb).getUniqueId();
verify(ice).getBlueprintBundle();
verify(pm).setDeaths(eq(world), eq(uuid), eq(0));
verify(im).setHomeLocation(eq(user), any());
verify(im, never()).setHomeLocation(eq(user), any());
verify(island).setProtectionRange(eq(20));
}
@ -218,7 +218,7 @@ public class NewIslandTest {
verify(ice, never()).getBlueprintBundle();
verify(ire).getBlueprintBundle();
verify(pm).setDeaths(eq(world), eq(uuid), eq(0));
verify(im).setHomeLocation(eq(user), any());
verify(im, never()).setHomeLocation(eq(user), any());
}
/**
@ -235,7 +235,7 @@ public class NewIslandTest {
verify(bpb).getUniqueId();
verify(ice).getBlueprintBundle();
verify(pm).setDeaths(eq(world), eq(uuid), eq(0));
verify(im).setHomeLocation(eq(user), any());
verify(im, never()).setHomeLocation(eq(user), any());
}
/**
@ -252,7 +252,7 @@ public class NewIslandTest {
verify(bpb).getUniqueId();
verify(ice).getBlueprintBundle();
verify(pm).setDeaths(eq(world), eq(uuid), eq(0));
verify(im).setHomeLocation(eq(user), any());
verify(im, never()).setHomeLocation(eq(user), any());
}
/**
@ -270,7 +270,7 @@ public class NewIslandTest {
verify(bpb).getUniqueId();
verify(ice).getBlueprintBundle();
verify(pm).setDeaths(eq(world), eq(uuid), eq(0));
verify(im).setHomeLocation(eq(user), any());
verify(im, never()).setHomeLocation(eq(user), any());
verify(island).setProtectionRange(eq(20));
verify(island).setReserved(eq(false));
}
@ -291,7 +291,7 @@ public class NewIslandTest {
verify(bpb).getUniqueId();
verify(ice).getBlueprintBundle();
verify(pm).setDeaths(eq(world), eq(uuid), eq(0));
verify(im).setHomeLocation(eq(user), any());
verify(im, never()).setHomeLocation(eq(user), any());
verify(island).setProtectionRange(eq(20));
verify(plugin).logError("New island for user tastybento was not reserved!");
}
@ -312,7 +312,7 @@ public class NewIslandTest {
verify(bpb).getUniqueId();
verify(ice).getBlueprintBundle();
verify(pm).setDeaths(eq(world), eq(uuid), eq(0));
verify(im).setHomeLocation(eq(user), any());
verify(im, never()).setHomeLocation(eq(user), any());
verify(island).setProtectionRange(eq(20));
verify(plugin).logError("New island for user tastybento was not reserved!");
}