First commit.
This commit is contained in:
commit
55370dcd53
61 changed files with 928 additions and 0 deletions
61
src/main/java/io/github/adrianvic/regions/Config.java
Normal file
61
src/main/java/io/github/adrianvic/regions/Config.java
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
package io.github.adrianvic.regions;
|
||||
|
||||
import io.github.adrianvic.regions.policy.LocationPolicy;
|
||||
import io.github.adrianvic.regions.policy.PermissionPolicy;
|
||||
import io.github.adrianvic.regions.policy.PlayerNamePolicy;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
|
||||
public class Config {
|
||||
private final static Config instance = new Config();
|
||||
private File file;
|
||||
private YamlConfiguration config;
|
||||
|
||||
private List<LocationPolicy> locationPolicies;
|
||||
private List<PermissionPolicy> permissionPolicies;
|
||||
private List<PlayerNamePolicy> playerNamePolicies;
|
||||
|
||||
private Config() {
|
||||
}
|
||||
|
||||
public void load() {
|
||||
file = new File(Regions.getInstance().getDataFolder(), "settings.yml");
|
||||
|
||||
if (!file.exists())
|
||||
Regions.getInstance().saveResource("settings.yml", false);
|
||||
|
||||
config = new YamlConfiguration();
|
||||
config.options().parseComments(true);
|
||||
|
||||
try {
|
||||
config.load(file);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
locationPolicies = LocationPolicy.parseLocationPolicy(config.getMapList("Policies.Location"));
|
||||
}
|
||||
|
||||
public void save() {
|
||||
try {
|
||||
config.save(file);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void set(String path, Object value) {
|
||||
config.set(path, value);
|
||||
save();
|
||||
}
|
||||
|
||||
public List<LocationPolicy> getLocationPolicies() {
|
||||
return locationPolicies;
|
||||
}
|
||||
|
||||
public static Config getInstance() {
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
package io.github.adrianvic.regions;
|
||||
|
||||
public class DataShifter {
|
||||
}
|
||||
33
src/main/java/io/github/adrianvic/regions/PlaceListener.java
Normal file
33
src/main/java/io/github/adrianvic/regions/PlaceListener.java
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
package io.github.adrianvic.regions;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.HumanEntity;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
|
||||
public class PlaceListener implements Listener {
|
||||
Validator val = new Validator();
|
||||
|
||||
@EventHandler
|
||||
public void onBlockBreak(BlockBreakEvent event) {
|
||||
event.setCancelled(!val.isHumanoidAbleToHarvest(event.getPlayer()));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onInteractionEvent(PlayerInteractEvent event) {
|
||||
if (event.getItem() != null) {
|
||||
event.setCancelled(!val.isItemValid(event.getItem().getType()));
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) {
|
||||
if (event.getDamager() instanceof HumanEntity player) {
|
||||
boolean canceled = !val.isHumanoidAbleToHit(player);
|
||||
event.setCancelled(canceled);
|
||||
}
|
||||
}
|
||||
}
|
||||
25
src/main/java/io/github/adrianvic/regions/Regions.java
Normal file
25
src/main/java/io/github/adrianvic/regions/Regions.java
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
package io.github.adrianvic.regions;
|
||||
|
||||
import io.github.adrianvic.regions.commands.ListPolicies;
|
||||
import io.github.adrianvic.regions.commands.PolicyInfo;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
public final class Regions extends JavaPlugin {
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
getServer().getPluginManager().registerEvents(new PlaceListener(), this);
|
||||
Config.getInstance().load();
|
||||
getCommand("mrlistpolicies").setExecutor(new ListPolicies());
|
||||
getCommand("mrpolicyinfo").setExecutor(new PolicyInfo());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
// Plugin shutdown logic
|
||||
}
|
||||
|
||||
public static Regions getInstance() {
|
||||
return getPlugin(Regions.class);
|
||||
}
|
||||
}
|
||||
38
src/main/java/io/github/adrianvic/regions/Validator.java
Normal file
38
src/main/java/io/github/adrianvic/regions/Validator.java
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
package io.github.adrianvic.regions;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.HumanEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
||||
public class Validator {
|
||||
ArrayList<Material> blacklistedItems = new ArrayList<Material>();
|
||||
|
||||
public Validator() {
|
||||
blacklistedItems.add(Material.COPPER_SWORD);
|
||||
blacklistedItems.add(Material.COPPER_AXE);
|
||||
blacklistedItems.add(Material.COPPER_HOE);
|
||||
blacklistedItems.add(Material.ROTTEN_FLESH);
|
||||
}
|
||||
|
||||
public boolean isHumanoidAbleToHit(HumanEntity damager) {
|
||||
return isItemValid(damager.getInventory().getItemInMainHand().getType());
|
||||
}
|
||||
|
||||
public boolean isHumanoidAbleToHarvest(HumanEntity harvester) {
|
||||
return isItemValid(harvester.getInventory().getItemInMainHand().getType());
|
||||
}
|
||||
|
||||
public boolean isItemValid(Material item) {
|
||||
return !blacklistedItems.contains(item);
|
||||
}
|
||||
|
||||
public void warnPlayer(Player player) {
|
||||
Location loc = player.getLocation();
|
||||
loc.getWorld().strikeLightningEffect(loc);
|
||||
player.sendMessage("Please note that you are not allowed to do this here!");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
package io.github.adrianvic.regions.commands;
|
||||
|
||||
import io.github.adrianvic.regions.Config;
|
||||
import io.github.adrianvic.regions.policy.LocationPolicy;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ListPolicies implements CommandExecutor, TabCompleter {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String @NotNull [] strings) {
|
||||
List<String> rstr = new ArrayList<>();
|
||||
for (LocationPolicy p : Config.getInstance().getLocationPolicies()) {
|
||||
rstr.add(p.name());
|
||||
}
|
||||
commandSender.sendMessage(String.join(", ", rstr) + ".");
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<String> onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String @NotNull [] strings) {
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
package io.github.adrianvic.regions.commands;
|
||||
|
||||
import io.github.adrianvic.regions.Config;
|
||||
import io.github.adrianvic.regions.policy.LocationPolicy;
|
||||
import io.github.adrianvic.regions.policy.PolicyNode;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class PolicyInfo implements CommandExecutor, TabCompleter {
|
||||
@Override
|
||||
public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String @NotNull [] strings) {
|
||||
List<LocationPolicy> policies = Config.getInstance().getLocationPolicies();
|
||||
for (LocationPolicy lp : policies) {
|
||||
if (lp.name().equals(strings[0])) {
|
||||
String locations = lp.locations().toString();
|
||||
|
||||
List<PolicyNode> nodes = lp.nodes();
|
||||
List<String> nodeNames = new ArrayList<>();
|
||||
for (PolicyNode n : nodes) {
|
||||
nodeNames.add(n.type());
|
||||
}
|
||||
String nodesStr = String.join(", ", nodeNames) + ".";
|
||||
|
||||
commandSender.sendMessage(String.format("""
|
||||
Showing info for policy "%s":
|
||||
Type: %s
|
||||
Locations: %s
|
||||
Nodes: %s
|
||||
%s
|
||||
""", lp.name(), "location", locations, nodesStr, lp.allowlist() ? "Is allowlist" : "Is blacklist"));
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<String> onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String @NotNull [] strings) {
|
||||
List<String> rstr = new ArrayList<>();
|
||||
for (LocationPolicy p : Config.getInstance().getLocationPolicies()) {
|
||||
rstr.add(p.name());
|
||||
}
|
||||
return rstr;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
package io.github.adrianvic.regions.policy;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.util.BoundingBox;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public record LocationPolicy(String name, List<ArrayList<BoundingBox>> locations, List<PolicyNode> nodes, boolean allowlist) {
|
||||
public static List<LocationPolicy> parseLocationPolicy(List<Map<?,?>> raw) {
|
||||
List<LocationPolicy> out = new ArrayList<>(raw.size());
|
||||
for (Map<?,?> m : raw) {
|
||||
String name = (String) m.get("name");
|
||||
boolean allowList = Boolean.TRUE.equals(m.get("allowList"));
|
||||
|
||||
// Nodes
|
||||
Object rawNodes = m.get("nodes");
|
||||
List<Map<String, Object>> nodeList = new ArrayList<>();
|
||||
if (rawNodes instanceof List<?> list) {
|
||||
for (Object o : list) {
|
||||
if (o instanceof Map<?, ?> map)
|
||||
nodeList.add((Map<String, Object>) map);
|
||||
}
|
||||
}
|
||||
|
||||
List<PolicyNode> nodes = PolicyNode.parseNodes(nodeList);
|
||||
|
||||
// Parsing locations
|
||||
List<ArrayList<BoundingBox>> locations = new ArrayList<>();
|
||||
Object rawGroups = m.get("locations");
|
||||
List<?> groups = rawGroups instanceof List ? (List<?>) rawGroups : List.of();
|
||||
|
||||
// Getting groups
|
||||
for (Object gObj : groups) {
|
||||
List<?> group = (List<?>) gObj;
|
||||
ArrayList<BoundingBox> boxes = new ArrayList<>(group.size());
|
||||
|
||||
// Now iterate over regions inside the group
|
||||
for (Object rObj : group) {
|
||||
Map<?,?> region = (Map<?, ?>) rObj;
|
||||
Map<?,?> c1 = (Map<?, ?>) region.get("corner1");
|
||||
Map<?,?> c2 = (Map<?, ?>) region.get("corner2");
|
||||
|
||||
double x1 = ((Number) c1.get("x")).doubleValue();
|
||||
double y1 = ((Number) c1.get("y")).doubleValue();
|
||||
double z1 = ((Number) c1.get("z")).doubleValue();
|
||||
|
||||
double x2 = ((Number) c2.get("x")).doubleValue();
|
||||
double y2 = ((Number) c2.get("y")).doubleValue();
|
||||
double z2 = ((Number) c2.get("z")).doubleValue();
|
||||
|
||||
Location loc1 = new Location(Bukkit.getWorlds().getFirst(), x1, y1, z1);
|
||||
Location loc2 = new Location(Bukkit.getWorlds().getFirst(), x2, y2, z2);
|
||||
|
||||
boxes.add(BoundingBox.of(loc1, loc2));
|
||||
}
|
||||
locations.add(boxes);
|
||||
}
|
||||
out.add(new LocationPolicy(name, locations, nodes, allowList));
|
||||
}
|
||||
return out;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package io.github.adrianvic.regions.policy;
|
||||
|
||||
import org.bukkit.permissions.Permission;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public record PermissionPolicy(String name, ArrayList<Permission> permissions, PolicyNode nodes, boolean allowlist) {}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package io.github.adrianvic.regions.policy;
|
||||
|
||||
import org.bukkit.permissions.Permission;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public record PlayerNamePolicy(String name, ArrayList<String> playerName, PolicyNode nodes, boolean allowlist) {}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
package io.github.adrianvic.regions.policy;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public record PolicyNode(String type, List<String> values) {
|
||||
public static List<PolicyNode> parseNodes(List<Map<String,Object>> raw) {
|
||||
List<PolicyNode> nodes = new ArrayList<>();
|
||||
|
||||
for (Map<String, Object> m : raw) {
|
||||
for (Map.Entry<String, Object> entry : m.entrySet()) {
|
||||
|
||||
String type = entry.getKey();
|
||||
List<String> values = new ArrayList<>();
|
||||
Object val = entry.getValue();
|
||||
|
||||
if (val instanceof String s) {
|
||||
values.add((s));
|
||||
} else if (val instanceof List<?> l) {
|
||||
for (Object o : l) {
|
||||
if (o instanceof String s) {
|
||||
values.add(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
nodes.add(new PolicyNode(type, values));
|
||||
}
|
||||
}
|
||||
return nodes;
|
||||
}
|
||||
}
|
||||
14
src/main/resources/plugin.yml
Normal file
14
src/main/resources/plugin.yml
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
name: regions
|
||||
version: '1.0-SNAPSHOT'
|
||||
main: io.github.adrianvic.regions.Regions
|
||||
api-version: '1.21'
|
||||
author: 'Adrian Victor'
|
||||
website: https://github.io/adrianvic
|
||||
description: Change what players can do based in custom criteria.
|
||||
commands:
|
||||
mrlistpolicies:
|
||||
description: "Lists all loaded policies"
|
||||
usage: "/mrlistpolicies"
|
||||
mrpolicyinfo:
|
||||
description: "Show info about a policy"
|
||||
usage: "/mrpolicyinfo"
|
||||
33
src/main/resources/settings.yml
Normal file
33
src/main/resources/settings.yml
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
Policies:
|
||||
Location:
|
||||
- name: "spawn-protection"
|
||||
allowlist: false
|
||||
nodes:
|
||||
# example PolicyNode fields — adapt to your actual structure
|
||||
canHit: false
|
||||
canHarvest: false
|
||||
message: "You cannot use tools here."
|
||||
locations:
|
||||
# first group (ArrayList<BoundingBox>)
|
||||
-
|
||||
# region 1 in group 1
|
||||
- corner1: { x: 100, y: 60, z: 100 }
|
||||
corner2: { x: 110, y: 70, z: 110 }
|
||||
# region 2 in group 1
|
||||
- corner1: { x: 120, y: 58, z: 95 }
|
||||
corner2: { x: 125, y: 64, z: 100 }
|
||||
# second group (another ArrayList<BoundingBox>)
|
||||
-
|
||||
- corner1: { x: -50, y: 50, z: -50 }
|
||||
corner2: { x: -40, y: 60, z: -40 }
|
||||
|
||||
- name: "farm-area"
|
||||
allowlist: true
|
||||
nodes:
|
||||
canHit: true
|
||||
canHarvest: true
|
||||
message: "Farming allowed."
|
||||
locations:
|
||||
-
|
||||
- corner1: { x: 200, y: 62, z: 200 }
|
||||
corner2: { x: 220, y: 66, z: 220 }
|
||||
Loading…
Add table
Add a link
Reference in a new issue