Fixes Stargate verification

This commit is contained in:
2025-07-27 20:26:25 +02:00
parent a861591fec
commit e971bd2cf5
6 changed files with 29 additions and 53 deletions

View File

@@ -75,10 +75,10 @@ public class PortalCreator {
}
//Get necessary information from the gate's sign
String portalName = PortalHandler.filterName(event.getLine(0));
String destinationName = PortalHandler.filterName(event.getLine(1));
String network = PortalHandler.filterName(event.getLine(2));
String options = PortalHandler.filterName(event.getLine(3)).toLowerCase();
@NotNull String portalName = PortalHandler.filterName(event.getLine(0));
@NotNull String destinationName = PortalHandler.filterName(event.getLine(1));
@NotNull String network = PortalHandler.filterName(event.getLine(2));
@NotNull String options = PortalHandler.filterName(event.getLine(3)).toLowerCase();
PortalStrings portalStrings = new PortalStrings(portalName, network, destinationName);
@@ -230,7 +230,7 @@ public class PortalCreator {
* @return <p>The portal or null if its creation was denied</p>
*/
@Nullable
public Portal validatePortal(@NotNull String denyMessage, String[] lines, boolean deny) {
public Portal validatePortal(@NotNull String denyMessage, @NotNull String[] lines, boolean deny) {
PortalLocation portalLocation = portal.getLocation();
Gate gate = portal.getStructure().getGate();
PortalOptions portalOptions = portal.getOptions();

View File

@@ -2,6 +2,7 @@ package net.knarcraft.stargate.portal;
import net.knarcraft.stargate.Stargate;
import net.knarcraft.stargate.config.Message;
import net.knarcraft.stargate.config.material.BukkitTagSpecifier;
import net.knarcraft.stargate.container.BlockLocation;
import net.knarcraft.stargate.container.RelativeBlockVector;
import net.knarcraft.stargate.portal.property.PortalLocation;
@@ -12,6 +13,7 @@ import net.knarcraft.stargate.portal.property.gate.GateHandler;
import net.knarcraft.stargate.utility.MaterialHelper;
import net.knarcraft.stargate.utility.PermissionHelper;
import org.bukkit.Location;
import org.bukkit.Tag;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
@@ -218,7 +220,7 @@ public class PortalHandler {
Portal origin = getByName(originName, portal.getCleanNetwork());
if (origin == null ||
!Portal.cleanString(origin.getDestinationName()).equals(portal.getCleanName()) ||
!origin.getStructure().isVerified()) {
!new BukkitTagSpecifier(Tag.WALL_SIGNS).asMaterials().contains(origin.getLocation().getSignLocation().getType())) {
continue;
}
//Update sign of fixed gates pointing at this gate
@@ -434,7 +436,18 @@ public class PortalHandler {
for (Portal portal : PortalRegistry.getAllPortals()) {
//Try and verify the portal. Invalidate it if it cannot be validated
PortalStructure structure = portal.getStructure();
if (!structure.wasVerified() && (!structure.isVerified() || !structure.checkIntegrity())) {
Stargate.debug("PortalHandler::verifyAllPortals", "Checking portal: " + portal.getName() + " | " + portal.getNetwork());
if (!portal.getOptions().hasNoSign() && !(new BukkitTagSpecifier(Tag.WALL_SIGNS).asMaterials().contains(
portal.getLocation().getSignLocation().getType()))) {
Stargate.debug("PortalHandler::verifyAllPortals", "Stargate is missing its sign");
invalidPortals.add(portal);
} else if (!portal.getOptions().isAlwaysOn() && portal.getLocation().getButtonVector() != null &&
!MaterialHelper.isButtonCompatible(portal.getBlockAt(portal.getLocation().getButtonVector().addOut(1)).getType())) {
Stargate.debug("PortalHandler::verifyAllPortals", "Stargate is missing a valid button");
invalidPortals.add(portal);
} else if (!structure.checkIntegrity()) {
Stargate.debug("PortalHandler::verifyAllPortals", "Stargate's border or entrance has invalid blocks");
invalidPortals.add(portal);
}
}
@@ -462,7 +475,7 @@ public class PortalHandler {
}
}
PortalRegistry.unregisterPortal(portal, false);
Stargate.logInfo(String.format("Destroying stargate at %s", portal));
Stargate.logInfo(String.format("Disabled stargate at %s", portal));
}
/**

View File

@@ -1,6 +1,7 @@
package net.knarcraft.stargate.portal;
import net.knarcraft.stargate.Stargate;
import net.knarcraft.stargate.config.material.BukkitTagSpecifier;
import net.knarcraft.stargate.container.BlockChangeRequest;
import net.knarcraft.stargate.container.BlockLocation;
import net.knarcraft.stargate.event.StargateCloseEvent;
@@ -10,6 +11,7 @@ import net.knarcraft.stargate.utility.ListHelper;
import net.knarcraft.stargate.utility.MaterialHelper;
import org.bukkit.Axis;
import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.block.data.Orientable;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@@ -144,8 +146,8 @@ public class PortalOpener {
//Set the destination portal to this opener's portal
destination.getPortalActivator().setDestination(portal);
//Update the destination's sign if it's verified
if (destination.getStructure().isVerified()) {
//Update the destination's sign if it exists
if (new BukkitTagSpecifier(Tag.WALL_SIGNS).asMaterials().contains(destination.getLocation().getSignLocation().getType())) {
destination.drawSign();
}
}

View File

@@ -2,8 +2,10 @@ package net.knarcraft.stargate.portal;
import net.knarcraft.stargate.Stargate;
import net.knarcraft.stargate.config.DynmapManager;
import net.knarcraft.stargate.config.material.BukkitTagSpecifier;
import net.knarcraft.stargate.container.BlockLocation;
import net.knarcraft.stargate.utility.PortalFileHelper;
import org.bukkit.Tag;
import org.bukkit.World;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -203,7 +205,7 @@ public class PortalRegistry {
for (String originName : allPortalNetworks.get(networkName)) {
Portal origin = PortalHandler.getByName(originName, portal.getCleanNetwork());
if (origin == null || !origin.getDestinationName().equalsIgnoreCase(portalName) ||
!origin.getStructure().isVerified()) {
!new BukkitTagSpecifier(Tag.WALL_SIGNS).asMaterials().contains(origin.getLocation().getSignLocation().getType())) {
continue;
}
//Update the portal's sign

View File

@@ -21,7 +21,6 @@ public class PortalStructure {
private BlockLocation button;
private BlockLocation[] frame;
private BlockLocation[] entrances;
private boolean verified;
/**
* Instantiates a new portal structure
@@ -33,7 +32,6 @@ public class PortalStructure {
public PortalStructure(@NotNull Portal portal, @NotNull Gate gate, @Nullable BlockLocation button) {
this.portal = portal;
this.gate = gate;
this.verified = false;
this.button = button;
}
@@ -66,35 +64,6 @@ public class PortalStructure {
this.button = button;
}
/**
* Verifies that all control blocks in this portal follows its gate template
*
* @return <p>True if all control blocks were verified</p>
*/
public boolean isVerified() {
boolean verified = true;
if (!Stargate.getGateConfig().verifyPortals()) {
return true;
}
for (RelativeBlockVector control : gate.getLayout().getControls()) {
verified = verified && gate.isValidControlBlock(portal.getBlockAt(control).getBlock().getType());
}
this.verified = verified;
return verified;
}
/**
* Gets the result of the last portal verification
*
* @return <p>True if this portal was verified</p>
*/
public boolean wasVerified() {
if (!Stargate.getGateConfig().verifyPortals()) {
return true;
}
return verified;
}
/**
* Checks if all blocks in a gate matches the gate template
*

View File

@@ -88,16 +88,6 @@ public class Gate {
return new HashMap<>(characterMaterialMap);
}
/**
* Checks whether the given material is valid for control blocks
*
* @param material <p>The material to check</p>
* @return <p>True if the material is valid for control blocks</p>
*/
public boolean isValidControlBlock(@NotNull Material material) {
return getControlBlockMaterials().contains(new BukkitMaterialSpecifier(material));
}
/**
* Gets the material type used for this gate's control blocks
*
@@ -233,7 +223,7 @@ public class Gate {
if (materialInLayout != null) {
if (!MaterialHelper.specifiersToMaterials(materialInLayout).contains(materialAtLocation)) {
Stargate.debug("Gate::Matches", String.format("Block Type Mismatch: %s != %s",
materialAtLocation, materialInLayout));
materialAtLocation, MaterialHelper.specifiersToMaterials(materialInLayout)));
return false;
}
} else {