Prevents teleportation of players holding one or more creatures on a leash if handleLeashedCreatures is disabled

This commit is contained in:
Kristian Knarvik 2021-11-25 01:53:47 +01:00
parent 6ddc15eeef
commit bab51d76fd
4 changed files with 45 additions and 5 deletions

View File

@ -389,6 +389,11 @@ portalInfoServer=Server: %server%
# Changes # Changes
#### \[Version 0.9.2.2] EpicKnarvik97 fork
- Prevents teleportation of a player holding creatures on a leash when handleLeashedCreatures is disabled to prevent
players accidentally losing the creatures during teleportation
#### \[Version 0.9.2.1] EpicKnarvik97 fork #### \[Version 0.9.2.1] EpicKnarvik97 fork
- Makes sure to only reload whatever is necessary when config values are changed using commands, instead of reloading - Makes sure to only reload whatever is necessary when config values are changed using commands, instead of reloading

View File

@ -7,6 +7,7 @@ import net.knarcraft.stargate.portal.Portal;
import net.knarcraft.stargate.portal.PortalActivator; import net.knarcraft.stargate.portal.PortalActivator;
import net.knarcraft.stargate.portal.PortalHandler; import net.knarcraft.stargate.portal.PortalHandler;
import net.knarcraft.stargate.portal.teleporter.PlayerTeleporter; import net.knarcraft.stargate.portal.teleporter.PlayerTeleporter;
import net.knarcraft.stargate.portal.teleporter.Teleporter;
import net.knarcraft.stargate.portal.teleporter.VehicleTeleporter; import net.knarcraft.stargate.portal.teleporter.VehicleTeleporter;
import net.knarcraft.stargate.utility.BungeeHelper; import net.knarcraft.stargate.utility.BungeeHelper;
import net.knarcraft.stargate.utility.MaterialHelper; import net.knarcraft.stargate.utility.MaterialHelper;
@ -170,7 +171,9 @@ public class PlayerEventListener implements Listener {
} }
return false; return false;
} }
return true;
//Make sure to check if the player has any leashed creatures, even though leashed teleportation is disabled
return Teleporter.noLeashedCreaturesPreventTeleportation(player, entrancePortal.getOptions().isSilent());
} }
/** /**

View File

@ -3,6 +3,7 @@ package net.knarcraft.stargate.listener;
import net.knarcraft.stargate.Stargate; import net.knarcraft.stargate.Stargate;
import net.knarcraft.stargate.portal.Portal; import net.knarcraft.stargate.portal.Portal;
import net.knarcraft.stargate.portal.PortalHandler; import net.knarcraft.stargate.portal.PortalHandler;
import net.knarcraft.stargate.portal.teleporter.Teleporter;
import net.knarcraft.stargate.portal.teleporter.VehicleTeleporter; import net.knarcraft.stargate.portal.teleporter.VehicleTeleporter;
import net.knarcraft.stargate.utility.EconomyHelper; import net.knarcraft.stargate.utility.EconomyHelper;
import net.knarcraft.stargate.utility.EntityHelper; import net.knarcraft.stargate.utility.EntityHelper;
@ -166,10 +167,14 @@ public class VehicleEventListener implements Listener {
//Check if the player is able to afford the teleport fee //Check if the player is able to afford the teleport fee
int cost = EconomyHelper.getUseCost(player, entrancePortal, destinationPortal); int cost = EconomyHelper.getUseCost(player, entrancePortal, destinationPortal);
boolean canAffordFee = cost <= 0 || Stargate.getEconomyConfig().canAffordFee(player, cost); boolean canAffordFee = cost <= 0 || Stargate.getEconomyConfig().canAffordFee(player, cost);
if (!canAffordFee && !entrancePortal.getOptions().isSilent()) { if (!canAffordFee) {
Stargate.getMessageSender().sendErrorMessage(player, Stargate.getString("ecoInFunds")); if (!entrancePortal.getOptions().isSilent()) {
Stargate.getMessageSender().sendErrorMessage(player, Stargate.getString("ecoInFunds"));
}
return false;
} }
return canAffordFee;
return Teleporter.noLeashedCreaturesPreventTeleportation(player, entrancePortal.getOptions().isSilent());
} }
} }

View File

@ -250,9 +250,35 @@ public abstract class Teleporter {
return chunksToLoad; return chunksToLoad;
} }
/**
* Checks whether a player has leashed creatures that block the teleportation
*
* @param player <p>The player trying to teleport</p>
* @param silent <p>Whether the entrance portal is silent</p>
* @return <p>False if the player has leashed any creatures that cannot go through the portal</p>
*/
public static boolean noLeashedCreaturesPreventTeleportation(Player player, boolean silent) {
//Find any nearby leashed entities to teleport with the player
List<Creature> nearbyEntities = getLeashedCreatures(player);
//If this feature is disabled, just return
if (!Stargate.getGateConfig().handleLeashedCreatures()) {
boolean isAllowed = nearbyEntities.isEmpty();
if (!isAllowed && !silent) {
Stargate.getMessageSender().sendErrorMessage(player, "Leashed teleportation is disabled");
}
return isAllowed;
} else {
return true;
}
}
/** /**
* Teleports any creatures leashed by the player * Teleports any creatures leashed by the player
* *
* <p>Will return false if the teleportation should be aborted because the player has leashed creatures that
* aren't allowed to be teleported with the player.</p>
*
* @param player <p>The player which is teleported</p> * @param player <p>The player which is teleported</p>
* @param origin <p>The portal the player is teleporting from</p> * @param origin <p>The portal the player is teleporting from</p>
*/ */
@ -264,6 +290,7 @@ public abstract class Teleporter {
//Find any nearby leashed entities to teleport with the player //Find any nearby leashed entities to teleport with the player
List<Creature> nearbyEntities = getLeashedCreatures(player); List<Creature> nearbyEntities = getLeashedCreatures(player);
//Teleport all creatures leashed by the player to the portal the player is to exit from //Teleport all creatures leashed by the player to the portal the player is to exit from
for (Creature creature : nearbyEntities) { for (Creature creature : nearbyEntities) {
creature.setLeashHolder(null); creature.setLeashHolder(null);
@ -280,7 +307,7 @@ public abstract class Teleporter {
* @param player <p>The player to check</p> * @param player <p>The player to check</p>
* @return <p>A list of all creatures the player is holding in a leash (lead)</p> * @return <p>A list of all creatures the player is holding in a leash (lead)</p>
*/ */
protected List<Creature> getLeashedCreatures(Player player) { protected static List<Creature> getLeashedCreatures(Player player) {
List<Creature> leashedCreatures = new ArrayList<>(); List<Creature> leashedCreatures = new ArrayList<>();
//Find any nearby leashed entities to teleport with the player //Find any nearby leashed entities to teleport with the player
List<Entity> nearbyEntities = player.getNearbyEntities(15, 15, 15); List<Entity> nearbyEntities = player.getNearbyEntities(15, 15, 15);