forked from clone/WorldGuardWrapper
		
	Implement session handlers (v6+), region sets, bump version
This commit is contained in:
		
							parent
							
								
									ef4204a426
								
							
						
					
					
						commit
						c9c6d343bd
					
				|  | @ -7,7 +7,7 @@ | |||
|     <parent> | ||||
|         <groupId>org.codemc.worldguardwrapper</groupId> | ||||
|         <artifactId>worldguardwrapper-parent</artifactId> | ||||
|         <version>1.1.9-SNAPSHOT</version> | ||||
|         <version>1.2.0-SNAPSHOT</version> | ||||
|     </parent> | ||||
| 
 | ||||
|     <artifactId>worldguardwrapper-api</artifactId> | ||||
|  |  | |||
|  | @ -0,0 +1,32 @@ | |||
| package org.codemc.worldguardwrapper.handler; | ||||
| 
 | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.codemc.worldguardwrapper.flag.WrappedState; | ||||
| import org.codemc.worldguardwrapper.region.IWrappedRegion; | ||||
| import org.codemc.worldguardwrapper.region.IWrappedRegionSet; | ||||
| 
 | ||||
| import java.util.Set; | ||||
| 
 | ||||
| public interface IHandler { | ||||
| 
 | ||||
|     default void initialize(Player player, Location current, IWrappedRegionSet regionSet) { | ||||
|     } | ||||
| 
 | ||||
|     default boolean testMoveTo(Player player, Location from, Location to, IWrappedRegionSet regionSet, String moveType) { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     default boolean onCrossBoundary(Player player, Location from, Location to, IWrappedRegionSet toSet, | ||||
|                                     Set<IWrappedRegion> entered, Set<IWrappedRegion> exited, String moveType) { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     default void tick(Player player, IWrappedRegionSet regionSet) { | ||||
|     } | ||||
| 
 | ||||
|     default WrappedState getInvincibility(Player player) { | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | @ -6,12 +6,15 @@ import org.bukkit.World; | |||
| import org.bukkit.entity.Player; | ||||
| import org.bukkit.plugin.java.JavaPlugin; | ||||
| import org.codemc.worldguardwrapper.flag.IWrappedFlag; | ||||
| import org.codemc.worldguardwrapper.handler.IHandler; | ||||
| import org.codemc.worldguardwrapper.region.IWrappedRegion; | ||||
| import org.codemc.worldguardwrapper.region.IWrappedRegionSet; | ||||
| import org.codemc.worldguardwrapper.selection.ICuboidSelection; | ||||
| import org.codemc.worldguardwrapper.selection.IPolygonalSelection; | ||||
| import org.codemc.worldguardwrapper.selection.ISelection; | ||||
| 
 | ||||
| import java.util.*; | ||||
| import java.util.function.Supplier; | ||||
| 
 | ||||
| public interface IWorldGuardImplementation { | ||||
| 
 | ||||
|  | @ -29,6 +32,8 @@ public interface IWorldGuardImplementation { | |||
|      */ | ||||
|     int getApiVersion(); | ||||
| 
 | ||||
|     void registerHandler(Supplier<IHandler> factory); | ||||
| 
 | ||||
|     /** | ||||
|      * Query a flag's value for a given player at a given location. | ||||
|      * | ||||
|  | @ -117,6 +122,14 @@ public interface IWorldGuardImplementation { | |||
|      */ | ||||
|     Set<IWrappedRegion> getRegions(@NonNull Location minimum, @NonNull Location maximum); | ||||
| 
 | ||||
|     /** | ||||
|      * Get the applicable region set at the given location- | ||||
|      * | ||||
|      * @param location The location | ||||
|      * @return The region set | ||||
|      */ | ||||
|     Optional<IWrappedRegionSet> getRegionSet(@NonNull Location location); | ||||
| 
 | ||||
|     /** | ||||
|      * Add a region. If only two points are given, a cuboid region will be created. | ||||
|      * | ||||
|  |  | |||
|  | @ -0,0 +1,26 @@ | |||
| package org.codemc.worldguardwrapper.region; | ||||
| 
 | ||||
| import org.bukkit.OfflinePlayer; | ||||
| import org.codemc.worldguardwrapper.flag.IWrappedFlag; | ||||
| 
 | ||||
| import java.util.Collection; | ||||
| import java.util.Optional; | ||||
| import java.util.Set; | ||||
| 
 | ||||
| public interface IWrappedRegionSet extends Iterable<IWrappedRegion> { | ||||
| 
 | ||||
|     boolean isVirtual(); | ||||
| 
 | ||||
|     <V> Optional<V> queryValue(OfflinePlayer subject, IWrappedFlag<V> flag); | ||||
| 
 | ||||
|     <V> Collection<V> queryAllValues(OfflinePlayer subject, IWrappedFlag<V> flag); | ||||
| 
 | ||||
|     boolean isOwnerOfAll(OfflinePlayer player); | ||||
| 
 | ||||
|     boolean isMemberOfAll(OfflinePlayer player); | ||||
| 
 | ||||
|     int size(); | ||||
| 
 | ||||
|     Set<IWrappedRegion> getRegions(); | ||||
| 
 | ||||
| } | ||||
|  | @ -7,7 +7,7 @@ | |||
|     <parent> | ||||
|         <groupId>org.codemc.worldguardwrapper</groupId> | ||||
|         <artifactId>worldguardwrapper-implementation</artifactId> | ||||
|         <version>1.1.9-SNAPSHOT</version> | ||||
|         <version>1.2.0-SNAPSHOT</version> | ||||
|     </parent> | ||||
| 
 | ||||
|     <artifactId>worldguardwrapper-implementation-legacy</artifactId> | ||||
|  | @ -28,7 +28,7 @@ | |||
|         <dependency> | ||||
|             <groupId>${project.groupId}</groupId> | ||||
|             <artifactId>worldguardwrapper-api</artifactId> | ||||
|             <version>1.1.9-SNAPSHOT</version> | ||||
|             <version>1.2.0-SNAPSHOT</version> | ||||
|             <scope>provided</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| package org.codemc.worldguardwrapper.implementation.legacy; | ||||
| 
 | ||||
| import com.google.common.collect.Iterators; | ||||
| import com.sk89q.minecraft.util.commands.CommandException; | ||||
| import com.sk89q.worldedit.BlockVector; | ||||
| import com.sk89q.worldedit.bukkit.WorldEditPlugin; | ||||
|  | @ -16,21 +17,25 @@ import com.sk89q.worldguard.protection.regions.ProtectedPolygonalRegion; | |||
| import com.sk89q.worldguard.protection.regions.ProtectedRegion; | ||||
| import lombok.NonNull; | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.OfflinePlayer; | ||||
| import org.bukkit.World; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.bukkit.plugin.java.JavaPlugin; | ||||
| import org.codemc.worldguardwrapper.flag.IWrappedFlag; | ||||
| import org.codemc.worldguardwrapper.handler.IHandler; | ||||
| import org.codemc.worldguardwrapper.implementation.IWorldGuardImplementation; | ||||
| import org.codemc.worldguardwrapper.implementation.legacy.flag.AbstractWrappedFlag; | ||||
| import org.codemc.worldguardwrapper.implementation.legacy.region.WrappedRegion; | ||||
| import org.codemc.worldguardwrapper.implementation.legacy.utility.WorldGuardFlagUtilities; | ||||
| import org.codemc.worldguardwrapper.implementation.legacy.utility.WorldGuardVectorUtilities; | ||||
| import org.codemc.worldguardwrapper.region.IWrappedRegion; | ||||
| import org.codemc.worldguardwrapper.region.IWrappedRegionSet; | ||||
| import org.codemc.worldguardwrapper.selection.ICuboidSelection; | ||||
| import org.codemc.worldguardwrapper.selection.IPolygonalSelection; | ||||
| import org.codemc.worldguardwrapper.selection.ISelection; | ||||
| 
 | ||||
| import java.util.*; | ||||
| import java.util.function.Supplier; | ||||
| import java.util.stream.Collectors; | ||||
| 
 | ||||
| public class WorldGuardImplementation implements IWorldGuardImplementation { | ||||
|  | @ -47,8 +52,9 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private Optional<LocalPlayer> wrapPlayer(Player player) { | ||||
|         return Optional.ofNullable(player).map(bukkitPlayer -> worldGuardPlugin.wrapPlayer(player)); | ||||
|     private Optional<LocalPlayer> wrapPlayer(OfflinePlayer player) { | ||||
|         return Optional.ofNullable(player).map(bukkitPlayer -> bukkitPlayer.isOnline() ? | ||||
|                 worldGuardPlugin.wrapPlayer((Player) bukkitPlayer) : worldGuardPlugin.wrapOfflinePlayer(bukkitPlayer)); | ||||
|     } | ||||
| 
 | ||||
|     private Optional<RegionManager> getWorldManager(@NonNull World world) { | ||||
|  | @ -69,6 +75,64 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|                 .orElse(null), flag)); | ||||
|     } | ||||
| 
 | ||||
|     private IWrappedRegionSet wrapRegionSet(@NonNull World world, @NonNull ApplicableRegionSet regionSet) { | ||||
|         return new IWrappedRegionSet() { | ||||
| 
 | ||||
|             @SuppressWarnings("NullableProblems") | ||||
|             @Override | ||||
|             public Iterator<IWrappedRegion> iterator() { | ||||
|                 return Iterators.transform(regionSet.iterator(), region -> new WrappedRegion(world, region)); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public boolean isVirtual() { | ||||
|                 return regionSet.isVirtual(); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public <V> Optional<V> queryValue(OfflinePlayer subject, IWrappedFlag<V> flag) { | ||||
|                 LocalPlayer subjectHandle = wrapPlayer(subject).orElse(null); | ||||
|                 AbstractWrappedFlag<V> wrappedFlag = (AbstractWrappedFlag<V>) flag; | ||||
|                 return Optional.ofNullable(regionSet.queryValue(subjectHandle, wrappedFlag.getHandle())) | ||||
|                         .flatMap(wrappedFlag::fromWGValue); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public <V> Collection<V> queryAllValues(OfflinePlayer subject, IWrappedFlag<V> flag) { | ||||
|                 LocalPlayer subjectHandle = wrapPlayer(subject).orElse(null); | ||||
|                 AbstractWrappedFlag<V> wrappedFlag = (AbstractWrappedFlag<V>) flag; | ||||
|                 return regionSet.queryAllValues(subjectHandle, wrappedFlag.getHandle()).stream() | ||||
|                         .map(wrappedFlag::fromWGValue) | ||||
|                         .filter(Optional::isPresent) | ||||
|                         .map(Optional::get) | ||||
|                         .collect(Collectors.toList()); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public boolean isOwnerOfAll(OfflinePlayer player) { | ||||
|                 LocalPlayer playerHandle = wrapPlayer(player).orElse(null); | ||||
|                 return regionSet.isOwnerOfAll(playerHandle); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public boolean isMemberOfAll(OfflinePlayer player) { | ||||
|                 LocalPlayer playerHandle = wrapPlayer(player).orElse(null); | ||||
|                 return regionSet.isMemberOfAll(playerHandle); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public int size() { | ||||
|                 return regionSet.size(); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public Set<IWrappedRegion> getRegions() { | ||||
|                 return regionSet.getRegions().stream() | ||||
|                         .map(region -> new WrappedRegion(world, region)).collect(Collectors.toSet()); | ||||
|             } | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public JavaPlugin getWorldGuardPlugin() { | ||||
|         return WorldGuardPlugin.inst(); | ||||
|  | @ -79,6 +143,11 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|         return -6; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void registerHandler(Supplier<IHandler> factory) { | ||||
|         throw new UnsupportedOperationException("Custom flag handlers aren't supported in this version of WorldGuard!"); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public <T> Optional<IWrappedFlag<T>> getFlag(String name, Class<T> type) { | ||||
|         for (Flag<?> currentFlag : DefaultFlag.getFlags()) { | ||||
|  | @ -92,7 +161,8 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|     @Override | ||||
|     public <T> Optional<T> queryFlag(Player player, Location location, IWrappedFlag<T> flag) { | ||||
|         AbstractWrappedFlag<T> wrappedFlag = (AbstractWrappedFlag<T>) flag; | ||||
|         return queryValue(player, location, wrappedFlag.getHandle()).flatMap(value -> wrappedFlag.fromWGValue(value)); | ||||
| 
 | ||||
|         return queryValue(player, location, wrappedFlag.getHandle()).flatMap(wrappedFlag::fromWGValue); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|  | @ -118,7 +188,7 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|                         Map.Entry<IWrappedFlag<?>, Object> wrapped = WorldGuardFlagUtilities.wrap(flag, value); | ||||
|                         flags.put(wrapped.getKey(), wrapped.getValue()); | ||||
|                     } catch (IllegalArgumentException e) { | ||||
|                         continue; // Unsupported flag type | ||||
|                         // Unsupported flag type | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | @ -176,6 +246,11 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|         return set; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Optional<IWrappedRegionSet> getRegionSet(@NonNull Location location) { | ||||
|         return getApplicableRegions(location).map(regionSet -> wrapRegionSet(location.getWorld(), regionSet)); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Optional<IWrappedRegion> addRegion(String id, List<Location> points, int minY, int maxY) { | ||||
|         ProtectedRegion region; | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
|     <parent> | ||||
|         <groupId>org.codemc.worldguardwrapper</groupId> | ||||
|         <artifactId>worldguardwrapper-parent</artifactId> | ||||
|         <version>1.1.9-SNAPSHOT</version> | ||||
|         <version>1.2.0-SNAPSHOT</version> | ||||
|     </parent> | ||||
| 
 | ||||
|     <artifactId>worldguardwrapper-implementation</artifactId> | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
|     <parent> | ||||
|         <groupId>org.codemc.worldguardwrapper</groupId> | ||||
|         <artifactId>worldguardwrapper-implementation</artifactId> | ||||
|         <version>1.1.9-SNAPSHOT</version> | ||||
|         <version>1.2.0-SNAPSHOT</version> | ||||
|     </parent> | ||||
| 
 | ||||
|     <artifactId>worldguardwrapper-implementation-v6</artifactId> | ||||
|  | @ -28,7 +28,7 @@ | |||
|         <dependency> | ||||
|             <groupId>${project.groupId}</groupId> | ||||
|             <artifactId>worldguardwrapper-api</artifactId> | ||||
|             <version>1.1.9-SNAPSHOT</version> | ||||
|             <version>1.2.0-SNAPSHOT</version> | ||||
|             <scope>provided</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|  |  | |||
|  | @ -1,5 +1,8 @@ | |||
| package org.codemc.worldguardwrapper.implementation.v6; | ||||
| 
 | ||||
| import com.google.common.collect.Collections2; | ||||
| import com.google.common.collect.ImmutableSet; | ||||
| import com.google.common.collect.Iterators; | ||||
| import com.sk89q.minecraft.util.commands.CommandException; | ||||
| import com.sk89q.worldedit.BlockVector; | ||||
| import com.sk89q.worldedit.bukkit.WorldEditPlugin; | ||||
|  | @ -15,25 +18,33 @@ import com.sk89q.worldguard.protection.managers.RegionManager; | |||
| import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; | ||||
| import com.sk89q.worldguard.protection.regions.ProtectedPolygonalRegion; | ||||
| import com.sk89q.worldguard.protection.regions.ProtectedRegion; | ||||
| import com.sk89q.worldguard.session.MoveType; | ||||
| import com.sk89q.worldguard.session.Session; | ||||
| import com.sk89q.worldguard.session.handler.Handler; | ||||
| import lombok.NonNull; | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.OfflinePlayer; | ||||
| import org.bukkit.World; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.bukkit.plugin.java.JavaPlugin; | ||||
| import org.bukkit.util.Vector; | ||||
| import org.codemc.worldguardwrapper.flag.IWrappedFlag; | ||||
| import org.codemc.worldguardwrapper.flag.WrappedState; | ||||
| import org.codemc.worldguardwrapper.handler.IHandler; | ||||
| import org.codemc.worldguardwrapper.implementation.IWorldGuardImplementation; | ||||
| import org.codemc.worldguardwrapper.implementation.v6.flag.AbstractWrappedFlag; | ||||
| import org.codemc.worldguardwrapper.implementation.v6.region.WrappedRegion; | ||||
| import org.codemc.worldguardwrapper.implementation.v6.utility.WorldGuardFlagUtilities; | ||||
| import org.codemc.worldguardwrapper.implementation.v6.utility.WorldGuardVectorUtilities; | ||||
| import org.codemc.worldguardwrapper.region.IWrappedRegion; | ||||
| import org.codemc.worldguardwrapper.region.IWrappedRegionSet; | ||||
| import org.codemc.worldguardwrapper.selection.ICuboidSelection; | ||||
| import org.codemc.worldguardwrapper.selection.IPolygonalSelection; | ||||
| import org.codemc.worldguardwrapper.selection.ISelection; | ||||
| 
 | ||||
| import javax.annotation.Nullable; | ||||
| import java.util.*; | ||||
| import java.util.function.Supplier; | ||||
| import java.util.stream.Collectors; | ||||
| 
 | ||||
| public class WorldGuardImplementation implements IWorldGuardImplementation { | ||||
|  | @ -52,8 +63,9 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|         flagRegistry = worldGuardPlugin.getFlagRegistry(); | ||||
|     } | ||||
| 
 | ||||
|     private Optional<LocalPlayer> wrapPlayer(Player player) { | ||||
|         return Optional.ofNullable(player).map(bukkitPlayer -> worldGuardPlugin.wrapPlayer(player)); | ||||
|     private Optional<LocalPlayer> wrapPlayer(OfflinePlayer player) { | ||||
|         return Optional.ofNullable(player).map(bukkitPlayer -> bukkitPlayer.isOnline() ? | ||||
|                 worldGuardPlugin.wrapPlayer((Player) bukkitPlayer) : worldGuardPlugin.wrapOfflinePlayer(bukkitPlayer)); | ||||
|     } | ||||
| 
 | ||||
|     private Optional<RegionManager> getWorldManager(@NonNull World world) { | ||||
|  | @ -74,6 +86,64 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|                 .orElse(null), flag)); | ||||
|     } | ||||
| 
 | ||||
|     private IWrappedRegionSet wrapRegionSet(@NonNull World world, @NonNull ApplicableRegionSet regionSet) { | ||||
|         return new IWrappedRegionSet() { | ||||
| 
 | ||||
|             @SuppressWarnings("NullableProblems") | ||||
|             @Override | ||||
|             public Iterator<IWrappedRegion> iterator() { | ||||
|                 return Iterators.transform(regionSet.iterator(), region -> new WrappedRegion(world, region)); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public boolean isVirtual() { | ||||
|                 return regionSet.isVirtual(); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public <V> Optional<V> queryValue(OfflinePlayer subject, IWrappedFlag<V> flag) { | ||||
|                 LocalPlayer subjectHandle = wrapPlayer(subject).orElse(null); | ||||
|                 AbstractWrappedFlag<V> wrappedFlag = (AbstractWrappedFlag<V>) flag; | ||||
|                 return Optional.ofNullable(regionSet.queryValue(subjectHandle, wrappedFlag.getHandle())) | ||||
|                         .flatMap(wrappedFlag::fromWGValue); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public <V> Collection<V> queryAllValues(OfflinePlayer subject, IWrappedFlag<V> flag) { | ||||
|                 LocalPlayer subjectHandle = wrapPlayer(subject).orElse(null); | ||||
|                 AbstractWrappedFlag<V> wrappedFlag = (AbstractWrappedFlag<V>) flag; | ||||
|                 return regionSet.queryAllValues(subjectHandle, wrappedFlag.getHandle()).stream() | ||||
|                         .map(wrappedFlag::fromWGValue) | ||||
|                         .filter(Optional::isPresent) | ||||
|                         .map(Optional::get) | ||||
|                         .collect(Collectors.toList()); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public boolean isOwnerOfAll(OfflinePlayer player) { | ||||
|                 LocalPlayer playerHandle = wrapPlayer(player).orElse(null); | ||||
|                 return regionSet.isOwnerOfAll(playerHandle); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public boolean isMemberOfAll(OfflinePlayer player) { | ||||
|                 LocalPlayer playerHandle = wrapPlayer(player).orElse(null); | ||||
|                 return regionSet.isMemberOfAll(playerHandle); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public int size() { | ||||
|                 return regionSet.size(); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public Set<IWrappedRegion> getRegions() { | ||||
|                 return regionSet.getRegions().stream() | ||||
|                         .map(region -> new WrappedRegion(world, region)).collect(Collectors.toSet()); | ||||
|             } | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public JavaPlugin getWorldGuardPlugin() { | ||||
|         return WorldGuardPlugin.inst(); | ||||
|  | @ -84,6 +154,49 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|         return 6; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void registerHandler(Supplier<IHandler> factory) { | ||||
|         worldGuardPlugin.getSessionManager().registerHandler(new Handler.Factory<Handler>() { | ||||
|             @Override | ||||
|             public Handler create(Session session) { | ||||
|                 IHandler handler = factory.get(); | ||||
|                 return new Handler(session) { | ||||
|                     @Override | ||||
|                     public void initialize(Player player, Location current, ApplicableRegionSet set) { | ||||
|                         handler.initialize(player, current, wrapRegionSet(current.getWorld(), set)); | ||||
|                     } | ||||
| 
 | ||||
|                     @Override | ||||
|                     public boolean testMoveTo(Player player, Location from, Location to, ApplicableRegionSet toSet, MoveType moveType) { | ||||
|                         return handler.testMoveTo(player, from, to, wrapRegionSet(to.getWorld(), toSet), moveType.name()); | ||||
|                     } | ||||
| 
 | ||||
|                     @Override | ||||
|                     public boolean onCrossBoundary(Player player, Location from, Location to, ApplicableRegionSet toSet, Set<ProtectedRegion> entered, Set<ProtectedRegion> exited, MoveType moveType) { | ||||
|                         Set<IWrappedRegion> mappedEntered = ImmutableSet.copyOf(Collections2.transform(entered, region -> new WrappedRegion(to.getWorld(), region))); | ||||
|                         Set<IWrappedRegion> mappedExited = ImmutableSet.copyOf(Collections2.transform(exited, region -> new WrappedRegion(from.getWorld(), region))); | ||||
|                         return handler.onCrossBoundary(player, from, to, wrapRegionSet(to.getWorld(), toSet), mappedEntered, mappedExited, moveType.name()); | ||||
|                     } | ||||
| 
 | ||||
|                     @Override | ||||
|                     public void tick(Player player, ApplicableRegionSet set) { | ||||
|                         handler.tick(player, wrapRegionSet(player.getWorld(), set)); | ||||
|                     } | ||||
| 
 | ||||
|                     @Nullable | ||||
|                     @Override | ||||
|                     public StateFlag.State getInvincibility(Player player) { | ||||
|                         WrappedState state = handler.getInvincibility(player); | ||||
|                         if (state == null) { | ||||
|                             return null; | ||||
|                         } | ||||
|                         return state == WrappedState.ALLOW ? StateFlag.State.ALLOW : StateFlag.State.DENY; | ||||
|                     } | ||||
|                 }; | ||||
|             } | ||||
|         }, null); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public <T> Optional<IWrappedFlag<T>> getFlag(String name, Class<T> type) { | ||||
|         return Optional.ofNullable(flagRegistry.get(name)) | ||||
|  | @ -93,7 +206,7 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|     @Override | ||||
|     public <T> Optional<T> queryFlag(Player player, Location location, IWrappedFlag<T> flag) { | ||||
|         AbstractWrappedFlag<T> wrappedFlag = (AbstractWrappedFlag<T>) flag; | ||||
|         return queryValue(player, location, wrappedFlag.getHandle()).flatMap(value -> wrappedFlag.fromWGValue(value)); | ||||
|         return queryValue(player, location, wrappedFlag.getHandle()).flatMap(wrappedFlag::fromWGValue); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|  | @ -119,7 +232,7 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|                         Map.Entry<IWrappedFlag<?>, Object> wrapped = WorldGuardFlagUtilities.wrap(flag, value); | ||||
|                         flags.put(wrapped.getKey(), wrapped.getValue()); | ||||
|                     } catch (IllegalArgumentException e) { | ||||
|                         continue; // Unsupported flag type | ||||
|                         // Unsupported flag type | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | @ -128,7 +241,7 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|         return flags; | ||||
|     } | ||||
| 
 | ||||
|     @SuppressWarnings("unchecked") | ||||
|     @SuppressWarnings({"unchecked", "rawtypes"}) | ||||
|     @Override | ||||
|     public <T> Optional<IWrappedFlag<T>> registerFlag(String name, Class<T> type, T defaultValue) { | ||||
|         final Flag<?> flag; | ||||
|  | @ -203,6 +316,11 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|         return set; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Optional<IWrappedRegionSet> getRegionSet(@NonNull Location location) { | ||||
|         return getApplicableRegions(location).map(regionSet -> wrapRegionSet(location.getWorld(), regionSet)); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Optional<IWrappedRegion> addRegion(String id, List<Location> points, int minY, int maxY) { | ||||
|         ProtectedRegion region; | ||||
|  |  | |||
|  | @ -65,6 +65,7 @@ public class WorldGuardFlagUtilities { | |||
| 
 | ||||
|     public Map.Entry<IWrappedFlag<?>, Object> wrap(Flag<?> flag, Object value) { | ||||
|         IWrappedFlag<?> wrappedFlag = wrapFixType(flag, value.getClass()); | ||||
|         //noinspection OptionalGetWithoutIsPresent | ||||
|         Object wrappedValue = ((AbstractWrappedFlag<?>) wrappedFlag).fromWGValue(value).get(); // value is non-null | ||||
|         return Maps.immutableEntry(wrappedFlag, wrappedValue); | ||||
|     } | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
|     <parent> | ||||
|         <groupId>org.codemc.worldguardwrapper</groupId> | ||||
|         <artifactId>worldguardwrapper-implementation</artifactId> | ||||
|         <version>1.1.9-SNAPSHOT</version> | ||||
|         <version>1.2.0-SNAPSHOT</version> | ||||
|     </parent> | ||||
| 
 | ||||
|     <artifactId>worldguardwrapper-implementation-v7</artifactId> | ||||
|  | @ -28,7 +28,7 @@ | |||
|         <dependency> | ||||
|             <groupId>${project.groupId}</groupId> | ||||
|             <artifactId>worldguardwrapper-api</artifactId> | ||||
|             <version>1.1.9-SNAPSHOT</version> | ||||
|             <version>1.2.0-SNAPSHOT</version> | ||||
|             <scope>provided</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|  |  | |||
|  | @ -1,5 +1,8 @@ | |||
| package org.codemc.worldguardwrapper.implementation.v7; | ||||
| 
 | ||||
| import com.google.common.collect.Collections2; | ||||
| import com.google.common.collect.ImmutableSet; | ||||
| import com.google.common.collect.Iterators; | ||||
| import com.sk89q.minecraft.util.commands.CommandException; | ||||
| import com.sk89q.worldedit.IncompleteRegionException; | ||||
| import com.sk89q.worldedit.bukkit.BukkitAdapter; | ||||
|  | @ -20,24 +23,32 @@ import com.sk89q.worldguard.protection.managers.RegionManager; | |||
| import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; | ||||
| import com.sk89q.worldguard.protection.regions.ProtectedPolygonalRegion; | ||||
| import com.sk89q.worldguard.protection.regions.ProtectedRegion; | ||||
| import com.sk89q.worldguard.session.MoveType; | ||||
| import com.sk89q.worldguard.session.Session; | ||||
| import com.sk89q.worldguard.session.handler.Handler; | ||||
| import lombok.NonNull; | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.OfflinePlayer; | ||||
| import org.bukkit.World; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.bukkit.plugin.java.JavaPlugin; | ||||
| import org.bukkit.util.Vector; | ||||
| import org.codemc.worldguardwrapper.flag.IWrappedFlag; | ||||
| import org.codemc.worldguardwrapper.flag.WrappedState; | ||||
| import org.codemc.worldguardwrapper.handler.IHandler; | ||||
| import org.codemc.worldguardwrapper.implementation.IWorldGuardImplementation; | ||||
| import org.codemc.worldguardwrapper.implementation.v7.flag.AbstractWrappedFlag; | ||||
| import org.codemc.worldguardwrapper.implementation.v7.region.WrappedRegion; | ||||
| import org.codemc.worldguardwrapper.implementation.v7.utility.WorldGuardFlagUtilities; | ||||
| import org.codemc.worldguardwrapper.region.IWrappedRegion; | ||||
| import org.codemc.worldguardwrapper.region.IWrappedRegionSet; | ||||
| import org.codemc.worldguardwrapper.selection.ICuboidSelection; | ||||
| import org.codemc.worldguardwrapper.selection.IPolygonalSelection; | ||||
| import org.codemc.worldguardwrapper.selection.ISelection; | ||||
| 
 | ||||
| import javax.annotation.Nullable; | ||||
| import java.util.*; | ||||
| import java.util.function.Supplier; | ||||
| import java.util.stream.Collectors; | ||||
| 
 | ||||
| public class WorldGuardImplementation implements IWorldGuardImplementation { | ||||
|  | @ -58,8 +69,9 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private Optional<LocalPlayer> wrapPlayer(Player player) { | ||||
|         return Optional.ofNullable(player).map(bukkitPlayer -> worldGuardPlugin.wrapPlayer(player)); | ||||
|     private Optional<LocalPlayer> wrapPlayer(OfflinePlayer player) { | ||||
|         return Optional.ofNullable(player).map(bukkitPlayer -> bukkitPlayer.isOnline() ? | ||||
|                 worldGuardPlugin.wrapPlayer((Player) bukkitPlayer) : worldGuardPlugin.wrapOfflinePlayer(bukkitPlayer)); | ||||
|     } | ||||
| 
 | ||||
|     private Optional<RegionManager> getWorldManager(@NonNull World world) { | ||||
|  | @ -80,6 +92,64 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|                 .orElse(null), flag)); | ||||
|     } | ||||
| 
 | ||||
|     private IWrappedRegionSet wrapRegionSet(@NonNull World world, @NonNull ApplicableRegionSet regionSet) { | ||||
|         return new IWrappedRegionSet() { | ||||
| 
 | ||||
|             @SuppressWarnings("NullableProblems") | ||||
|             @Override | ||||
|             public Iterator<IWrappedRegion> iterator() { | ||||
|                 return Iterators.transform(regionSet.iterator(), region -> new WrappedRegion(world, region)); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public boolean isVirtual() { | ||||
|                 return regionSet.isVirtual(); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public <V> Optional<V> queryValue(OfflinePlayer subject, IWrappedFlag<V> flag) { | ||||
|                 LocalPlayer subjectHandle = wrapPlayer(subject).orElse(null); | ||||
|                 AbstractWrappedFlag<V> wrappedFlag = (AbstractWrappedFlag<V>) flag; | ||||
|                 return Optional.ofNullable(regionSet.queryValue(subjectHandle, wrappedFlag.getHandle())) | ||||
|                         .flatMap(wrappedFlag::fromWGValue); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public <V> Collection<V> queryAllValues(OfflinePlayer subject, IWrappedFlag<V> flag) { | ||||
|                 LocalPlayer subjectHandle = wrapPlayer(subject).orElse(null); | ||||
|                 AbstractWrappedFlag<V> wrappedFlag = (AbstractWrappedFlag<V>) flag; | ||||
|                 return regionSet.queryAllValues(subjectHandle, wrappedFlag.getHandle()).stream() | ||||
|                         .map(wrappedFlag::fromWGValue) | ||||
|                         .filter(Optional::isPresent) | ||||
|                         .map(Optional::get) | ||||
|                         .collect(Collectors.toList()); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public boolean isOwnerOfAll(OfflinePlayer player) { | ||||
|                 LocalPlayer playerHandle = wrapPlayer(player).orElse(null); | ||||
|                 return regionSet.isOwnerOfAll(playerHandle); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public boolean isMemberOfAll(OfflinePlayer player) { | ||||
|                 LocalPlayer playerHandle = wrapPlayer(player).orElse(null); | ||||
|                 return regionSet.isMemberOfAll(playerHandle); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public int size() { | ||||
|                 return regionSet.size(); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public Set<IWrappedRegion> getRegions() { | ||||
|                 return regionSet.getRegions().stream() | ||||
|                         .map(region -> new WrappedRegion(world, region)).collect(Collectors.toSet()); | ||||
|             } | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public JavaPlugin getWorldGuardPlugin() { | ||||
|         return WorldGuardPlugin.inst(); | ||||
|  | @ -90,6 +160,59 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|         return 7; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void registerHandler(Supplier<IHandler> factory) { | ||||
|         core.getPlatform().getSessionManager().registerHandler(new Handler.Factory<Handler>() { | ||||
|             @Override | ||||
|             public Handler create(Session session) { | ||||
|                 IHandler handler = factory.get(); | ||||
|                 return new Handler(session) { | ||||
|                     @Override | ||||
|                     public void initialize(LocalPlayer player, com.sk89q.worldedit.util.Location current, ApplicableRegionSet set) { | ||||
|                         Player bukkitPlayer = BukkitAdapter.adapt(player); | ||||
|                         Location bukkitLocation = BukkitAdapter.adapt(current); | ||||
|                         handler.initialize(bukkitPlayer, bukkitLocation, wrapRegionSet(bukkitLocation.getWorld(), set)); | ||||
|                     } | ||||
| 
 | ||||
|                     @Override | ||||
|                     public boolean testMoveTo(LocalPlayer player, com.sk89q.worldedit.util.Location from, com.sk89q.worldedit.util.Location to, ApplicableRegionSet toSet, MoveType moveType) { | ||||
|                         Player bukkitPlayer = BukkitAdapter.adapt(player); | ||||
|                         Location bukkitFrom = BukkitAdapter.adapt(from); | ||||
|                         Location bukkitTo = BukkitAdapter.adapt(to); | ||||
|                         return handler.testMoveTo(bukkitPlayer, bukkitFrom, bukkitTo, wrapRegionSet(bukkitTo.getWorld(), toSet), moveType.name()); | ||||
|                     } | ||||
| 
 | ||||
|                     @Override | ||||
|                     public boolean onCrossBoundary(LocalPlayer player, com.sk89q.worldedit.util.Location from, com.sk89q.worldedit.util.Location to, ApplicableRegionSet toSet, Set<ProtectedRegion> entered, Set<ProtectedRegion> exited, MoveType moveType) { | ||||
|                         Player bukkitPlayer = BukkitAdapter.adapt(player); | ||||
|                         Location bukkitFrom = BukkitAdapter.adapt(from); | ||||
|                         Location bukkitTo = BukkitAdapter.adapt(to); | ||||
|                         Set<IWrappedRegion> mappedEntered = ImmutableSet.copyOf(Collections2.transform(entered, region -> new WrappedRegion(bukkitTo.getWorld(), region))); | ||||
|                         Set<IWrappedRegion> mappedExited = ImmutableSet.copyOf(Collections2.transform(exited, region -> new WrappedRegion(bukkitFrom.getWorld(), region))); | ||||
|                         return handler.onCrossBoundary(bukkitPlayer, bukkitFrom, bukkitTo, wrapRegionSet(bukkitTo.getWorld(), toSet), mappedEntered, mappedExited, moveType.name()); | ||||
|                     } | ||||
| 
 | ||||
|                     @Override | ||||
|                     public void tick(LocalPlayer player, ApplicableRegionSet set) { | ||||
|                         Player bukkitPlayer = BukkitAdapter.adapt(player); | ||||
|                         handler.tick(bukkitPlayer, wrapRegionSet(bukkitPlayer.getWorld(), set)); | ||||
|                     } | ||||
| 
 | ||||
|                     @Nullable | ||||
|                     @Override | ||||
|                     public StateFlag.State getInvincibility(LocalPlayer player) { | ||||
|                         Player bukkitPlayer = BukkitAdapter.adapt(player); | ||||
|                         WrappedState state = handler.getInvincibility(bukkitPlayer); | ||||
|                         if (state == null) { | ||||
|                             return null; | ||||
|                         } | ||||
|                         return state == WrappedState.ALLOW ? StateFlag.State.ALLOW : StateFlag.State.DENY; | ||||
|                     } | ||||
|                 }; | ||||
|             } | ||||
|         }, null); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public <T> Optional<IWrappedFlag<T>> getFlag(String name, Class<T> type) { | ||||
|         return Optional.ofNullable(flagRegistry.get(name)) | ||||
|  | @ -99,7 +222,7 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|     @Override | ||||
|     public <T> Optional<T> queryFlag(Player player, Location location, IWrappedFlag<T> flag) { | ||||
|         AbstractWrappedFlag<T> wrappedFlag = (AbstractWrappedFlag<T>) flag; | ||||
|         return queryValue(player, location, wrappedFlag.getHandle()).flatMap(value -> wrappedFlag.fromWGValue(value)); | ||||
|         return queryValue(player, location, wrappedFlag.getHandle()).flatMap(wrappedFlag::fromWGValue); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|  | @ -125,7 +248,7 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|                         Map.Entry<IWrappedFlag<?>, Object> wrapped = WorldGuardFlagUtilities.wrap(flag, value); | ||||
|                         flags.put(wrapped.getKey(), wrapped.getValue()); | ||||
|                     } catch (IllegalArgumentException e) { | ||||
|                         continue; // Unsupported flag type | ||||
|                         // Unsupported flag type | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | @ -134,7 +257,7 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|         return flags; | ||||
|     } | ||||
| 
 | ||||
|     @SuppressWarnings("unchecked") | ||||
|     @SuppressWarnings({"unchecked", "rawtypes"}) | ||||
|     @Override | ||||
|     public <T> Optional<IWrappedFlag<T>> registerFlag(String name, Class<T> type, T defaultValue) { | ||||
|         final Flag<?> flag; | ||||
|  | @ -209,6 +332,11 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { | |||
|                 .collect(Collectors.toSet()); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Optional<IWrappedRegionSet> getRegionSet(@NonNull Location location) { | ||||
|         return Optional.empty(); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Optional<IWrappedRegion> addRegion(String id, List<Location> points, int minY, int maxY) { | ||||
|         ProtectedRegion region; | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ import com.google.common.collect.Maps; | |||
| import com.sk89q.worldedit.math.Vector3; | ||||
| import com.sk89q.worldguard.protection.flags.Flag; | ||||
| import com.sk89q.worldguard.protection.flags.StateFlag; | ||||
| 
 | ||||
| import lombok.experimental.UtilityClass; | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.util.Vector; | ||||
| import org.codemc.worldguardwrapper.flag.IWrappedFlag; | ||||
|  | @ -13,10 +13,7 @@ import org.codemc.worldguardwrapper.implementation.v7.flag.AbstractWrappedFlag; | |||
| import org.codemc.worldguardwrapper.implementation.v7.flag.WrappedPrimitiveFlag; | ||||
| import org.codemc.worldguardwrapper.implementation.v7.flag.WrappedStatusFlag; | ||||
| 
 | ||||
| import lombok.experimental.UtilityClass; | ||||
| 
 | ||||
| import java.util.Map; | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| @UtilityClass | ||||
| public class WorldGuardFlagUtilities { | ||||
|  | @ -65,6 +62,7 @@ public class WorldGuardFlagUtilities { | |||
| 
 | ||||
|     public Map.Entry<IWrappedFlag<?>, Object> wrap(Flag<?> flag, Object value) { | ||||
|         IWrappedFlag<?> wrappedFlag = wrapFixType(flag, value.getClass()); | ||||
|         //noinspection OptionalGetWithoutIsPresent | ||||
|         Object wrappedValue = ((AbstractWrappedFlag<?>) wrappedFlag).fromWGValue(value).get(); // value is non-null | ||||
|         return Maps.immutableEntry(wrappedFlag, wrappedValue); | ||||
|     } | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
|     <parent> | ||||
|         <groupId>org.codemc.worldguardwrapper</groupId> | ||||
|         <artifactId>worldguardwrapper-parent</artifactId> | ||||
|         <version>1.1.9-SNAPSHOT</version> | ||||
|         <version>1.2.0-SNAPSHOT</version> | ||||
|     </parent> | ||||
| 
 | ||||
|     <artifactId>worldguardwrapper</artifactId> | ||||
|  | @ -18,22 +18,22 @@ | |||
|         <dependency> | ||||
|             <groupId>${project.groupId}</groupId> | ||||
|             <artifactId>worldguardwrapper-api</artifactId> | ||||
|             <version>1.1.9-SNAPSHOT</version> | ||||
|             <version>1.2.0-SNAPSHOT</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>${project.groupId}</groupId> | ||||
|             <artifactId>worldguardwrapper-implementation-legacy</artifactId> | ||||
|             <version>1.1.9-SNAPSHOT</version> | ||||
|             <version>1.2.0-SNAPSHOT</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>${project.groupId}</groupId> | ||||
|             <artifactId>worldguardwrapper-implementation-v6</artifactId> | ||||
|             <version>1.1.9-SNAPSHOT</version> | ||||
|             <version>1.2.0-SNAPSHOT</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>${project.groupId}</groupId> | ||||
|             <artifactId>worldguardwrapper-implementation-v7</artifactId> | ||||
|             <version>1.1.9-SNAPSHOT</version> | ||||
|             <version>1.2.0-SNAPSHOT</version> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										6
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								pom.xml
									
									
									
									
									
								
							|  | @ -6,7 +6,7 @@ | |||
| 
 | ||||
|     <groupId>org.codemc.worldguardwrapper</groupId> | ||||
|     <artifactId>worldguardwrapper-parent</artifactId> | ||||
|     <version>1.1.9-SNAPSHOT</version> | ||||
|     <version>1.2.0-SNAPSHOT</version> | ||||
|     <packaging>pom</packaging> | ||||
| 
 | ||||
|     <modules> | ||||
|  | @ -51,7 +51,7 @@ | |||
|         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||
|         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | ||||
|         <java.version>1.8</java.version> | ||||
|         <spigot-api.version>1.15.2-R0.1-SNAPSHOT</spigot-api.version> | ||||
|         <spigot-api.version>1.16.3-R0.1-SNAPSHOT</spigot-api.version> | ||||
|     </properties> | ||||
| 
 | ||||
|     <repositories> | ||||
|  | @ -89,7 +89,7 @@ | |||
|         <dependency> | ||||
|             <groupId>org.projectlombok</groupId> | ||||
|             <artifactId>lombok</artifactId> | ||||
|             <version>1.18.12</version> | ||||
|             <version>1.18.16</version> | ||||
|             <scope>provided</scope> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user