Skip to content

Commit 31e2b90

Browse files
authored
Merge pull request #145 from BentoBoxWorld/prevent_title_changes
Update to prevent sign changing of the title
2 parents fea02de + 7e33acb commit 31e2b90

File tree

6 files changed

+307
-55
lines changed

6 files changed

+307
-55
lines changed

.github/workflows/build.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ jobs:
1414
- uses: actions/checkout@v3
1515
with:
1616
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
17-
- name: Set up JDK 17
17+
- name: Set up JDK 21
1818
uses: actions/setup-java@v3
1919
with:
2020
distribution: 'adopt'
21-
java-version: '17'
21+
java-version: '21'
2222
- name: Cache SonarCloud packages
2323
uses: actions/cache@v3
2424
with:

pom.xml

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,20 @@
5050
<properties>
5151
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
5252
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
53-
<java.version>17</java.version>
53+
<java.version>21</java.version>
5454
<!-- Non-minecraft related dependencies -->
5555
<powermock.version>2.0.9</powermock.version>
5656
<!-- More visible way how to change dependency versions -->
57-
<spigot.version>1.21.3-R0.1-SNAPSHOT</spigot.version>
57+
<spigot.version>1.21.8-R0.1-SNAPSHOT</spigot.version>
58+
<paper.version>1.21.8-R0.1-SNAPSHOT</paper.version>
5859
<bentobox.version>3.0.0-SNAPSHOT</bentobox.version>
5960
<level.version>2.7.0-SNAPSHOT</level.version>
6061
<!-- Revision variable removes warning about dynamic version -->
6162
<revision>${build.version}-SNAPSHOT</revision>
6263
<!-- Do not change unless you want different name for local builds. -->
6364
<build.number>-LOCAL</build.number>
6465
<!-- This allows to change between versions. -->
65-
<build.version>1.16.0</build.version>
66+
<build.version>1.17.0</build.version>
6667
<!-- Sonar Cloud -->
6768
<sonar.projectKey>BentoBoxWorld_Warps</sonar.projectKey>
6869
<sonar.organization>bentobox-world</sonar.organization>
@@ -112,6 +113,10 @@
112113
</profiles>
113114

114115
<repositories>
116+
<repository>
117+
<id>papermc</id>
118+
<url>https://repo.papermc.io/repository/maven-public/</url>
119+
</repository>
115120
<repository>
116121
<id>spigot-repo</id>
117122
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots</url>
@@ -131,6 +136,13 @@
131136
</repositories>
132137

133138
<dependencies>
139+
<!-- Paper API -->
140+
<dependency>
141+
<groupId>io.papermc.paper</groupId>
142+
<artifactId>paper-api</artifactId>
143+
<version>${paper.version}</version>
144+
<scope>provided</scope>
145+
</dependency>
134146
<!-- Spigot API -->
135147
<dependency>
136148
<groupId>org.spigotmc</groupId>
@@ -223,40 +235,36 @@
223235
<target>${java.version}</target>
224236
</configuration>
225237
</plugin>
226-
<plugin>
238+
<plugin>
227239
<groupId>org.apache.maven.plugins</groupId>
228240
<artifactId>maven-surefire-plugin</artifactId>
229-
<version>3.0.0-M5</version>
241+
<version>3.5.2</version>
242+
<!--suppress MavenModelInspection -->
230243
<configuration>
231244
<argLine>
232245
${argLine}
233246
--add-opens java.base/java.lang=ALL-UNNAMED
234247
--add-opens java.base/java.math=ALL-UNNAMED
235248
--add-opens java.base/java.io=ALL-UNNAMED
236249
--add-opens java.base/java.util=ALL-UNNAMED
237-
--add-opens
238-
java.base/java.util.stream=ALL-UNNAMED
250+
--add-opens java.base/java.util.stream=ALL-UNNAMED
239251
--add-opens java.base/java.text=ALL-UNNAMED
240-
--add-opens
241-
java.base/java.util.regex=ALL-UNNAMED
242-
--add-opens
243-
java.base/java.nio.channels.spi=ALL-UNNAMED
252+
--add-opens java.base/java.util.regex=ALL-UNNAMED
253+
--add-opens java.base/java.nio.channels.spi=ALL-UNNAMED
244254
--add-opens java.base/sun.nio.ch=ALL-UNNAMED
245255
--add-opens java.base/java.net=ALL-UNNAMED
246-
--add-opens
247-
java.base/java.util.concurrent=ALL-UNNAMED
256+
--add-opens java.base/java.util.concurrent=ALL-UNNAMED
248257
--add-opens java.base/sun.nio.fs=ALL-UNNAMED
249258
--add-opens java.base/sun.nio.cs=ALL-UNNAMED
250259
--add-opens java.base/java.nio.file=ALL-UNNAMED
251-
--add-opens
252-
java.base/java.nio.charset=ALL-UNNAMED
253-
--add-opens
254-
java.base/java.lang.reflect=ALL-UNNAMED
255-
--add-opens
256-
java.logging/java.util.logging=ALL-UNNAMED
260+
--add-opens java.base/java.nio.charset=ALL-UNNAMED
261+
--add-opens java.base/java.lang.reflect=ALL-UNNAMED
262+
--add-opens java.logging/java.util.logging=ALL-UNNAMED
257263
--add-opens java.base/java.lang.ref=ALL-UNNAMED
258264
--add-opens java.base/java.util.jar=ALL-UNNAMED
259265
--add-opens java.base/java.util.zip=ALL-UNNAMED
266+
--add-opens=java.base/java.security=ALL-UNNAMED
267+
--add-opens java.base/jdk.internal.misc=ALL-UNNAMED
260268
</argLine>
261269
</configuration>
262270
</plugin>

src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java

Lines changed: 52 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package world.bentobox.warps.listeners;
22

3-
import java.util.*;
3+
import java.util.HashMap;
4+
import java.util.Iterator;
5+
import java.util.Map;
6+
import java.util.Objects;
7+
import java.util.Optional;
8+
import java.util.UUID;
49
import java.util.stream.Collectors;
510

611
import org.bukkit.Bukkit;
@@ -10,6 +15,8 @@
1015
import org.bukkit.World;
1116
import org.bukkit.block.Block;
1217
import org.bukkit.block.Sign;
18+
import org.bukkit.block.sign.Side;
19+
import org.bukkit.block.sign.SignSide;
1320
import org.bukkit.entity.Player;
1421
import org.bukkit.event.EventHandler;
1522
import org.bukkit.event.EventPriority;
@@ -18,7 +25,6 @@
1825
import org.bukkit.event.block.SignChangeEvent;
1926
import org.bukkit.event.world.ChunkLoadEvent;
2027
import org.bukkit.scheduler.BukkitRunnable;
21-
import org.eclipse.jdt.annotation.Nullable;
2228

2329
import world.bentobox.bentobox.BentoBox;
2430
import world.bentobox.bentobox.api.events.addon.AddonEvent;
@@ -28,9 +34,9 @@
2834
import world.bentobox.bentobox.api.user.User;
2935
import world.bentobox.bentobox.database.objects.Island;
3036
import world.bentobox.bentobox.util.Util;
31-
import world.bentobox.warps.objects.PlayerWarp;
3237
import world.bentobox.warps.Warp;
3338
import world.bentobox.warps.event.WarpRemoveEvent;
39+
import world.bentobox.warps.objects.PlayerWarp;
3440

3541
/**
3642
* Handles warping. Players can add one sign
@@ -106,7 +112,6 @@ public void onSignBreak(BlockBreakEvent e) {
106112
Block b = e.getBlock();
107113
boolean inWorld = addon.getPlugin().getIWM().inWorld(b.getWorld());
108114
// Signs only
109-
// FIXME: When we drop support for 1.13, switch to Tag.SIGNS
110115
if (!b.getType().name().contains("SIGN")
111116
|| (inWorld && !addon.inRegisteredWorld(b.getWorld()))
112117
|| (!inWorld && !addon.getSettings().isAllowInOtherWorlds())
@@ -125,6 +130,13 @@ public void onSignBreak(BlockBreakEvent e) {
125130
}
126131
}
127132

133+
/**
134+
* Check if this block is a registered warp sign owned by player so that it can be acted on
135+
* @param player - player trying to do something to the sign
136+
* @param b - sign block
137+
* @param inWorld - true if this is a BentoBox game world
138+
* @return true if this player is op, has mod bypass permission, or is the sign owner
139+
*/
128140
private boolean isPlayersSign(Player player, Block b, boolean inWorld) {
129141
// Welcome sign detected - check to see if it is this player's sign
130142
Map<UUID, PlayerWarp> list = addon.getWarpSignsManager().getWarpMap(b.getWorld());
@@ -133,10 +145,19 @@ private boolean isPlayersSign(Player player, Block b, boolean inWorld) {
133145
|| player.isOp() || player.hasPermission(reqPerm));
134146
}
135147

148+
/**
149+
* Checks if this block is a warp sign. Requires it to have the correct title and be registered as a warp sign
150+
* @param b warp sign block
151+
* @return true if it is a valid warp sign
152+
*/
136153
private boolean isWarpSign(Block b) {
137-
Sign s = (Sign) b.getState();
138-
return s.getLine(0).equalsIgnoreCase(ChatColor.GREEN + addon.getSettings().getWelcomeLine())
139-
&& addon.getWarpSignsManager().getWarpMap(b.getWorld()).values().stream().anyMatch(playerWarp -> playerWarp.getLocation().equals(s.getLocation()));
154+
if (b.getState() instanceof Sign s) {
155+
SignSide side = s.getSide(Side.FRONT);
156+
return side.getLine(0).equalsIgnoreCase(ChatColor.GREEN + addon.getSettings().getWelcomeLine())
157+
&& addon.getWarpSignsManager().getWarpMap(b.getWorld()).values().stream()
158+
.anyMatch(playerWarp -> playerWarp.getLocation().equals(s.getLocation()));
159+
}
160+
return false;
140161
}
141162

142163
/**
@@ -146,24 +167,27 @@ private boolean isWarpSign(Block b) {
146167
*/
147168
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
148169
public void onSignWarpCreate(SignChangeEvent e) {
170+
User user = Objects.requireNonNull(User.getInstance(e.getPlayer()));
149171
Block b = e.getBlock();
172+
Location loc = b.getLocation();
150173
boolean inWorld = addon.getPlugin().getIWM().inWorld(b.getWorld());
151174
if ((inWorld && !addon.inRegisteredWorld(b.getWorld())) || (!inWorld && !addon.getSettings().isAllowInOtherWorlds()) ) {
152175
return;
153176
}
154177
String title = e.getLine(0);
155-
User user = Objects.requireNonNull(User.getInstance(e.getPlayer()));
178+
if (title != null && !title.equalsIgnoreCase(addon.getSettings().getWelcomeLine()) && addon.getWarpSignsManager().isWarpAt(loc)) {
179+
UUID owner = addon.getWarpSignsManager().getWarpOwnerUUID(loc).orElse(null);
180+
addon.getWarpSignsManager().removeWarp(loc);
181+
Bukkit.getPluginManager().callEvent(new WarpRemoveEvent(loc, user.getUniqueId(), owner));
182+
return;
183+
}
156184
// Check if someone is changing their own sign
157185
if (title != null && title.equalsIgnoreCase(addon.getSettings().getWelcomeLine())) {
158186
// Welcome sign detected - check permissions
159187
if (noPerms(user, b.getWorld(), inWorld)) {
160188
return;
161189
}
162-
// TODO: These checks are useless if the sign is placed outside a BSB world.
163-
// This will mean level and rank requirements are nil in the case of allow-in-other-worlds: true.
164-
// I'm not sure if there is a better way around this without adding new API checking for primary
165-
// or last island accessed with relevant permissions.
166-
// ignored.
190+
167191
if (inWorld && noLevelOrIsland(user, b.getWorld())) {
168192
e.setLine(0, ChatColor.RED + addon.getSettings().getWelcomeLine());
169193
return;
@@ -182,25 +206,32 @@ public void onSignWarpCreate(SignChangeEvent e) {
182206
// so,
183207
// deactivate it
184208
Block oldSignBlock = oldSignLoc.getBlock();
185-
// FIXME: When we drop support for 1.13, switch to Tag.SIGNS
186-
if (oldSignBlock.getType().name().contains("SIGN")) {
209+
if (oldSignBlock.getState() instanceof Sign oldSign) {
187210
// The block is still a sign
188-
Sign oldSign = (Sign) oldSignBlock.getState();
189-
if (oldSign.getLine(0).equalsIgnoreCase(ChatColor.GREEN + addon.getSettings().getWelcomeLine())) {
190-
oldSign.setLine(0, ChatColor.RED + addon.getSettings().getWelcomeLine());
211+
SignSide front = oldSign.getSide(Side.FRONT);
212+
SignSide back = oldSign.getSide(Side.BACK);
213+
String welcome = ChatColor.GREEN + addon.getSettings().getWelcomeLine();
214+
String disabled = ChatColor.RED + addon.getSettings().getWelcomeLine();
215+
boolean remove = false;
216+
if (front.getLine(0).equalsIgnoreCase(welcome)) {
217+
front.setLine(0, disabled);
218+
remove = true;
219+
} else if (back.getLine(0).equalsIgnoreCase(welcome)) {
220+
back.setLine(0, disabled);
221+
remove = true;
222+
}
223+
if (remove) {
191224
oldSign.update(true, false);
192225
user.sendMessage(WARPS_DEACTIVATE);
193-
addon.getWarpSignsManager().removeWarp(oldSignBlock.getWorld(), user.getUniqueId());
194-
@Nullable
195226
UUID owner = addon.getWarpSignsManager().getWarpOwnerUUID(oldSignLoc).orElse(null);
227+
addon.getWarpSignsManager().removeWarp(oldSignBlock.getWorld(), user.getUniqueId());
196228
Bukkit.getPluginManager().callEvent(new WarpRemoveEvent(oldSign.getLocation(), user.getUniqueId(), owner));
197229
}
198230
}
199231
// Set up the new warp sign
200232
}
201233
addSign(e, user, b);
202234
}
203-
204235
}
205236

206237
private boolean hasCorrectIslandRank(Block b, User user) {

src/main/java/world/bentobox/warps/managers/WarpSignsManager.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,15 @@ public Optional<UUID> getWarpOwnerUUID(Location location) {
152152
return getWarpMap(location.getWorld()).entrySet().stream().filter(en -> en.getValue().getLocation().equals(location))
153153
.findFirst().map(Map.Entry::getKey);
154154
}
155+
156+
/**
157+
* Check if there is a warp sign at this location
158+
* @param location location to check
159+
* @return true if there is a warp sign at this location
160+
*/
161+
public boolean isWarpAt(Location location) {
162+
return getWarpMap(location.getWorld()).entrySet().stream().map(en -> en.getValue().getLocation().equals(location)).findFirst().isPresent();
163+
}
155164

156165
/**
157166
* Get sorted list of warps with most recent players listed first

0 commit comments

Comments
 (0)