From 35c761e1e455f98cb79ba6a6360890f5f3ec6b75 Mon Sep 17 00:00:00 2001 From: "BT (calcastor/mame)" <43831917+calcastor@users.noreply.github.com> Date: Tue, 5 Aug 2025 18:37:13 -0700 Subject: [PATCH] Permit locking the flag to the flag carrier Signed-off-by: BT (calcastor/mame) <43831917+calcastor@users.noreply.github.com> --- .../java/tc/oc/pgm/flag/FlagDefinition.java | 9 +- .../main/java/tc/oc/pgm/flag/FlagParser.java | 95 +++++++++---------- .../java/tc/oc/pgm/flag/state/Carried.java | 9 +- 3 files changed, 62 insertions(+), 51 deletions(-) diff --git a/core/src/main/java/tc/oc/pgm/flag/FlagDefinition.java b/core/src/main/java/tc/oc/pgm/flag/FlagDefinition.java index 328e00d401..a728ab52b8 100644 --- a/core/src/main/java/tc/oc/pgm/flag/FlagDefinition.java +++ b/core/src/main/java/tc/oc/pgm/flag/FlagDefinition.java @@ -48,6 +48,7 @@ private static String makeName(@Nullable String name, @Nullable DyeColor color) private final boolean showBeam; private final boolean showRespawnOnPickup; // Display where the flag will respawn when it is picked up. + private final boolean lockFlag; // Lock the flag to prevent it being dropped public FlagDefinition( @Nullable String id, @@ -71,7 +72,8 @@ public FlagDefinition( boolean showBeam, @Nullable ProximityMetric flagProximityMetric, @Nullable ProximityMetric netProximityMetric, - boolean showRespawnOnPickup) { + boolean showRespawnOnPickup, + boolean lockFlag) { // We can't use the owner field in OwnedGoal because our owner // is a reference that can't be resolved until after parsing. @@ -100,6 +102,7 @@ public FlagDefinition( this.dropOnWater = dropOnWater; this.showBeam = showBeam; this.showRespawnOnPickup = showRespawnOnPickup; + this.lockFlag = lockFlag; } public @Nullable DyeColor getColor() { @@ -183,6 +186,10 @@ public boolean willShowRespawnOnPickup() { return showRespawnOnPickup; } + public boolean lockFlag() { + return lockFlag; + } + @Override public Flag getGoal(Match match) { return (Flag) super.getGoal(match); diff --git a/core/src/main/java/tc/oc/pgm/flag/FlagParser.java b/core/src/main/java/tc/oc/pgm/flag/FlagParser.java index c575a82988..61af244adf 100644 --- a/core/src/main/java/tc/oc/pgm/flag/FlagParser.java +++ b/core/src/main/java/tc/oc/pgm/flag/FlagParser.java @@ -121,9 +121,8 @@ private SinglePost parseSinglePost(Element el) throws InvalidXMLException { Filter respawnFilter = filterParser.parseFilterProperty(el, "respawn-filter", StaticFilter.ALLOW); - Duration recoverTime = - XMLUtils.parseDuration( - Node.fromAttr(el, "recover-time", "return-time"), PostDefinition.DEFAULT_RETURN_TIME); + Duration recoverTime = XMLUtils.parseDuration( + Node.fromAttr(el, "recover-time", "return-time"), PostDefinition.DEFAULT_RETURN_TIME); Duration respawnTime = XMLUtils.parseDuration(el.getAttribute("respawn-time"), null); Double respawnSpeed = XMLUtils.parseNumber(el.getAttribute("respawn-speed"), Double.class, (Double) null); @@ -220,22 +219,21 @@ public NetDefinition parseNet(Element el, @Nullable FlagDefinition parentFlag) returnableFlags = ImmutableSet.of(); } - NetDefinition net = - new NetDefinition( - id, - region, - captureFilter, - respawnFilter, - owner, - pointsPerCapture, - sticky, - denyMessage, - respawnMessage, - returnPost, - capturableFlags, - returnableFlags, - respawnTogether, - proximityLocation); + NetDefinition net = new NetDefinition( + id, + region, + captureFilter, + respawnFilter, + owner, + pointsPerCapture, + sticky, + denyMessage, + respawnMessage, + returnPost, + capturableFlags, + returnableFlags, + respawnTogether, + proximityLocation); nets.add(net); factory.getFeatures().addFeature(el, net); @@ -268,14 +266,13 @@ public FlagDefinition parseFlag(Element el) throws InvalidXMLException { Component carryMessage = XMLUtils.parseFormattedText(el, "carry-message"); boolean showRespawnOnPickup = XMLUtils.parseBoolean(el.getAttribute("show-respawn-on-pickup"), false); + boolean lockFlag = XMLUtils.parseBoolean(el.getAttribute("locked"), false); boolean dropOnWater = XMLUtils.parseBoolean(el.getAttribute("drop-on-water"), true); boolean showBeam = XMLUtils.parseBoolean(el.getAttribute("beam"), true); - ProximityMetric flagProximityMetric = - ProximityMetric.parse( - el, "flag", new ProximityMetric(ProximityMetric.Type.CLOSEST_KILL, false)); - ProximityMetric netProximityMetric = - ProximityMetric.parse( - el, "net", new ProximityMetric(ProximityMetric.Type.CLOSEST_PLAYER, false)); + ProximityMetric flagProximityMetric = ProximityMetric.parse( + el, "flag", new ProximityMetric(ProximityMetric.Type.CLOSEST_KILL, false)); + ProximityMetric netProximityMetric = ProximityMetric.parse( + el, "net", new ProximityMetric(ProximityMetric.Type.CLOSEST_PLAYER, false)); PostDefinition defaultPost; Element elPost = XMLUtils.getUniqueChild(el, "post", "posts"); @@ -289,30 +286,30 @@ public FlagDefinition parseFlag(Element el) throws InvalidXMLException { } } - FlagDefinition flag = - new FlagDefinition( - id, - name, - required, - options, - color, - defaultPost, - owner, - pointsPerCapture, - pointsPerSecond, - pickupFilter, - captureFilter, - dropFilter, - pickupKit, - dropKit, - carryKit, - multiCarrier, - carryMessage, - dropOnWater, - showBeam, - flagProximityMetric, - netProximityMetric, - showRespawnOnPickup); + FlagDefinition flag = new FlagDefinition( + id, + name, + required, + options, + color, + defaultPost, + owner, + pointsPerCapture, + pointsPerSecond, + pickupFilter, + captureFilter, + dropFilter, + pickupKit, + dropKit, + carryKit, + multiCarrier, + carryMessage, + dropOnWater, + showBeam, + flagProximityMetric, + netProximityMetric, + showRespawnOnPickup, + lockFlag); flags.add(flag); factory.getFeatures().addFeature(el, flag); diff --git a/core/src/main/java/tc/oc/pgm/flag/state/Carried.java b/core/src/main/java/tc/oc/pgm/flag/state/Carried.java index ef38864e9f..73eee9ffea 100644 --- a/core/src/main/java/tc/oc/pgm/flag/state/Carried.java +++ b/core/src/main/java/tc/oc/pgm/flag/state/Carried.java @@ -43,6 +43,7 @@ import tc.oc.pgm.flag.event.FlagStateChangeEvent; import tc.oc.pgm.goals.events.GoalEvent; import tc.oc.pgm.kits.Kit; +import tc.oc.pgm.kits.tag.ItemTags; import tc.oc.pgm.score.ScoreCause; import tc.oc.pgm.score.ScoreMatchModule; import tc.oc.pgm.scoreboard.SidebarMatchModule; @@ -110,7 +111,13 @@ public void enterState() { if (kit != null) carrier.applyKit(kit, false); this.helmetItem = this.carrier.getBukkit().getInventory().getHelmet(); - this.carrier.getBukkit().getInventory().setHelmet(this.flag.getBannerItem().clone()); + ItemStack bannerItem = this.flag.getBannerItem().clone(); + + if (this.flag.getDefinition().lockFlag()) { + ItemTags.LOCKED.set(bannerItem, true); + } + + this.carrier.getBukkit().getInventory().setHelmet(bannerItem); PGM.get() .getExecutor()