read set perms from griefpreventiondata, add ability to list other peoples claims

This commit is contained in:
Flemmli97 2020-09-02 15:19:31 +02:00
parent fdab079aed
commit 0f8c813c71
7 changed files with 298 additions and 98 deletions

View File

@ -30,7 +30,6 @@ public class Claim {
private int minX, minZ, maxX, maxZ, minY; private int minX, minZ, maxX, maxZ, minY;
private UUID owner; private UUID owner;
private boolean adminClaim;
private UUID claimID; private UUID claimID;
private final EnumMap<EnumPermission, Boolean> globalPerm = Maps.newEnumMap(EnumPermission.class); private final EnumMap<EnumPermission, Boolean> globalPerm = Maps.newEnumMap(EnumPermission.class);
@ -66,7 +65,7 @@ public class Claim {
this.minY = Math.max(0, minY); this.minY = Math.max(0, minY);
this.owner = creator; this.owner = creator;
this.world = world; this.world = world;
this.setDirty(); this.setDirty(true);
} }
public static Claim fromJson(JsonObject obj, UUID owner, ServerWorld world) { public static Claim fromJson(JsonObject obj, UUID owner, ServerWorld world) {
@ -77,12 +76,12 @@ public class Claim {
public void setClaimID(UUID uuid) { public void setClaimID(UUID uuid) {
this.claimID = uuid; this.claimID = uuid;
this.setDirty(); this.setDirty(true);
} }
public void extendDownwards(BlockPos pos){ public void extendDownwards(BlockPos pos){
this.minY = pos.getY(); this.minY = pos.getY();
this.setDirty(); this.setDirty(true);
} }
public UUID getClaimID() { public UUID getClaimID() {
@ -110,17 +109,27 @@ public class Claim {
this.maxZ = claim.maxZ; this.maxZ = claim.maxZ;
this.minY = claim.minY; this.minY = claim.minY;
this.removed = false; this.removed = false;
this.setDirty(); this.setDirty(true);
} }
public void toggleAdminClaim(boolean flag) { public void toggleAdminClaim(ServerPlayerEntity player, boolean flag) {
this.adminClaim = flag; if(!flag)
this.subClaims.forEach(claim->claim.adminClaim = flag); this.transferOwner(player);
this.setDirty(); else {
this.owner = null;
this.subClaims.forEach(claim -> claim.owner = null);
}
this.setDirty(true);
} }
public boolean isAdminClaim(){ public boolean isAdminClaim(){
return this.adminClaim; return this.owner==null;
}
public void transferOwner(ServerPlayerEntity player){
this.owner = player.getUuid();
this.subClaims.forEach(claim->claim.owner = player.getUuid());
this.setDirty(true);
} }
public int getPlane() { public int getPlane() {
@ -175,7 +184,7 @@ public class Claim {
if (player.getUuid().equals(this.owner)) if (player.getUuid().equals(this.owner))
return true; return true;
PlayerClaimData data = PlayerClaimData.get(player); PlayerClaimData data = PlayerClaimData.get(player);
if ((this.adminClaim && player.hasPermissionLevel(2)) || data.isAdminIgnoreClaim()) if ((this.isAdminClaim() && player.hasPermissionLevel(2)) || data.isAdminIgnoreClaim())
return true; return true;
for (Claim claim : this.subClaims) { for (Claim claim : this.subClaims) {
if (claim.insideClaim(pos)) { if (claim.insideClaim(pos)) {
@ -238,7 +247,7 @@ public class Claim {
sub.parent = this.claimID; sub.parent = this.claimID;
sub.parentClaim = this; sub.parentClaim = this;
this.subClaims.add(sub); this.subClaims.add(sub);
this.setDirty(); this.setDirty(true);
} }
return conflicts; return conflicts;
} }
@ -248,7 +257,7 @@ public class Claim {
claim.parent = this.claimID; claim.parent = this.claimID;
claim.parentClaim = this; claim.parentClaim = this;
this.subClaims.add(claim); this.subClaims.add(claim);
this.setDirty(); this.setDirty(true);
} }
public Claim getSubClaim(BlockPos pos) { public Claim getSubClaim(BlockPos pos) {
@ -260,7 +269,7 @@ public class Claim {
public boolean deleteSubClaim(Claim claim) { public boolean deleteSubClaim(Claim claim) {
claim.remove(); claim.remove();
this.setDirty(); this.setDirty(true);
return this.subClaims.remove(claim); return this.subClaims.remove(claim);
} }
@ -278,22 +287,22 @@ public class Claim {
conflicts.add(other); conflicts.add(other);
if (conflicts.isEmpty()) { if (conflicts.isEmpty()) {
claim.copySizes(newClaim); claim.copySizes(newClaim);
this.setDirty(); this.setDirty(true);
} }
return conflicts; return conflicts;
} }
public boolean setPlayerGroup(UUID player, String group, boolean force) { public boolean setPlayerGroup(UUID player, String group, boolean force) {
if (this.owner.equals(player)) if (player.equals(this.owner))
return false; return false;
if (group == null) { if (group == null) {
this.playersGroups.remove(player); this.playersGroups.remove(player);
this.setDirty(); this.setDirty(true);
return true; return true;
} }
if (!this.playersGroups.containsKey(player) || force) { if (!this.playersGroups.containsKey(player) || force) {
this.playersGroups.put(player, group); this.playersGroups.put(player, group);
this.setDirty(); this.setDirty(true);
return true; return true;
} }
return false; return false;
@ -322,17 +331,22 @@ public class Claim {
this.globalPerm.remove(toggle); this.globalPerm.remove(toggle);
else else
this.globalPerm.put(toggle, mode == 1); this.globalPerm.put(toggle, mode == 1);
this.setDirty(); this.setDirty(true);
} }
public boolean editPerms(ServerPlayerEntity player, String group, EnumPermission perm, int mode) {
return this.editPerms(player, group, perm, mode, false);
}
/** /**
* Edit the permissions for a group. If not defined for the group creates a new default permission map for that group * Edit the permissions for a group. If not defined for the group creates a new default permission map for that group
* *
* @param mode -1 = makes it resort to the global perm, 0 = deny perm, 1 = allow perm * @param mode -1 = makes it resort to the global perm, 0 = deny perm, 1 = allow perm
* @return If editing was successful or not * @return If editing was successful or not
*/ */
public boolean editPerms(ServerPlayerEntity player, String group, EnumPermission perm, int mode) { public boolean editPerms(ServerPlayerEntity player, String group, EnumPermission perm, int mode, boolean griefPrevention) {
if (this.canInteract(player, EnumPermission.EDITPERMS, player.getBlockPos())) { if(perm.isAlwaysGlobalPerm())
return false;
if (griefPrevention || this.canInteract(player, EnumPermission.EDITPERMS, player.getBlockPos())) {
if (mode > 1) if (mode > 1)
mode = -1; mode = -1;
boolean has = this.permissions.containsKey(group); boolean has = this.permissions.containsKey(group);
@ -343,7 +357,7 @@ public class Claim {
perms.put(perm, mode == 1); perms.put(perm, mode == 1);
if (!has) if (!has)
this.permissions.put(group, perms); this.permissions.put(group, perms);
this.setDirty(); this.setDirty(true);
return true; return true;
} }
return false; return false;
@ -358,7 +372,7 @@ public class Claim {
toRemove.add(uuid); toRemove.add(uuid);
}); });
toRemove.forEach(this.playersGroups::remove); toRemove.forEach(this.playersGroups::remove);
this.setDirty(); this.setDirty(true);
return true; return true;
} }
return false; return false;
@ -379,11 +393,11 @@ public class Claim {
/** /**
* Only marks non sub claims * Only marks non sub claims
*/ */
public void setDirty() { public void setDirty(boolean flag) {
if(this.parentClaim()!=null) if(this.parentClaim()!=null)
this.parentClaim().setDirty(); this.parentClaim().setDirty(flag);
else else
this.dirty = true; this.dirty = flag;
} }
public boolean isDirty() { public boolean isDirty() {
@ -391,15 +405,17 @@ public class Claim {
} }
public void readJson(JsonObject obj, UUID uuid) { public void readJson(JsonObject obj, UUID uuid) {
this.claimID = UUID.fromString(obj.get("ID").getAsString());
JsonArray pos = obj.getAsJsonArray("PosxXzZY"); JsonArray pos = obj.getAsJsonArray("PosxXzZY");
this.minX = pos.get(0).getAsInt(); this.minX = pos.get(0).getAsInt();
this.maxX = pos.get(1).getAsInt(); this.maxX = pos.get(1).getAsInt();
this.minZ = pos.get(2).getAsInt(); this.minZ = pos.get(2).getAsInt();
this.maxZ = pos.get(3).getAsInt(); this.maxZ = pos.get(3).getAsInt();
this.minY = pos.get(4).getAsInt(); this.minY = pos.get(4).getAsInt();
this.owner = uuid; if(obj.has("AdminClaim")?obj.get("AdminClaim").getAsBoolean():false)
this.adminClaim = obj.has("AdminClaim")?obj.get("AdminClaim").getAsBoolean():false; this.owner = null;
this.claimID = UUID.fromString(obj.get("ID").getAsString()); else
this.owner = uuid;
this.globalPerm.clear(); this.globalPerm.clear();
this.permissions.clear(); this.permissions.clear();
this.subClaims.clear(); this.subClaims.clear();
@ -431,6 +447,7 @@ public class Claim {
} }
public JsonObject toJson(JsonObject obj) { public JsonObject toJson(JsonObject obj) {
obj.addProperty("ID", this.claimID.toString());
JsonArray pos = new JsonArray(); JsonArray pos = new JsonArray();
pos.add(this.minX); pos.add(this.minX);
pos.add(this.maxX); pos.add(this.maxX);
@ -438,8 +455,6 @@ public class Claim {
pos.add(this.maxZ); pos.add(this.maxZ);
pos.add(this.minY); pos.add(this.minY);
obj.add("PosxXzZY", pos); obj.add("PosxXzZY", pos);
obj.addProperty("ID", this.claimID.toString());
obj.addProperty("AdminClaim", this.adminClaim);
if (this.parent != null) if (this.parent != null)
obj.addProperty("Parent", this.parent.toString()); obj.addProperty("Parent", this.parent.toString());
if (!this.globalPerm.isEmpty()) { if (!this.globalPerm.isEmpty()) {
@ -499,7 +514,7 @@ public class Claim {
@Override @Override
public String toString() { public String toString() {
return String.format("Claim:[ID=%s, Owner=%s, from: x=%d; z=%d, to: x=%d, z=%d", this.claimID != null ? this.claimID.toString() : "null", this.owner.toString(), this.minX, this.minZ, this.maxX, this.maxZ); return String.format("Claim:[ID=%s, Owner=%s, from: x=%d; z=%d, to: x=%d, z=%d", this.claimID != null ? this.claimID.toString() : "null", this.owner!=null?this.owner.toString():"Admin", this.minX, this.minZ, this.maxX, this.maxZ);
} }
public String formattedClaim() { public String formattedClaim() {
@ -510,8 +525,8 @@ public class Claim {
boolean perms = this.canInteract(player, EnumPermission.EDITPERMS, player.getBlockPos()); boolean perms = this.canInteract(player, EnumPermission.EDITPERMS, player.getBlockPos());
List<Text> l = Lists.newArrayList(); List<Text> l = Lists.newArrayList();
l.add(PermHelper.simpleColoredText("=============================================", Formatting.GREEN)); l.add(PermHelper.simpleColoredText("=============================================", Formatting.GREEN));
GameProfile prof = player.getServer().getUserCache().getByUuid(this.owner); GameProfile prof = this.owner!=null?player.getServer().getUserCache().getByUuid(this.owner):null;
String ownerName = this.adminClaim ? "Admin" : prof != null ? prof.getName() : "<UNKNOWN>"; String ownerName = this.isAdminClaim() ? "Admin" : prof != null ? prof.getName() : "<UNKNOWN>";
if(this.parent==null) if(this.parent==null)
l.add(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBasicInfo, ownerName, this.minX, this.minZ, this.maxX, this.maxZ, this.subClaims.size()), Formatting.GOLD)); l.add(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBasicInfo, ownerName, this.minX, this.minZ, this.maxX, this.maxZ, this.subClaims.size()), Formatting.GOLD));
else else

View File

@ -1,5 +1,6 @@
package com.flemmli97.flan.claim; package com.flemmli97.flan.claim;
import com.flemmli97.flan.Flan;
import com.flemmli97.flan.IClaimData; import com.flemmli97.flan.IClaimData;
import com.flemmli97.flan.config.ConfigHandler; import com.flemmli97.flan.config.ConfigHandler;
import com.flemmli97.flan.player.EnumDisplayType; import com.flemmli97.flan.player.EnumDisplayType;
@ -14,8 +15,17 @@ import com.google.gson.JsonObject;
import com.ibm.icu.impl.Pair; import com.ibm.icu.impl.Pair;
import it.unimi.dsi.fastutil.longs.Long2ObjectArrayMap; import it.unimi.dsi.fastutil.longs.Long2ObjectArrayMap;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.command.LocateBiomeCommand;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.BaseText;
import net.minecraft.text.ClickEvent;
import net.minecraft.text.HoverEvent;
import net.minecraft.text.LiteralText;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Formatting; import net.minecraft.util.Formatting;
import net.minecraft.util.WorldSavePath; import net.minecraft.util.WorldSavePath;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@ -30,18 +40,21 @@ import java.io.FileReader;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.util.Collection; import java.util.Collection;
import java.util.EnumMap;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Level;
public class ClaimStorage { public class ClaimStorage {
public static final String adminClaimString = "!AdminClaims";
private final Long2ObjectArrayMap<List<Claim>> claims = new Long2ObjectArrayMap<>(); private final Long2ObjectArrayMap<List<Claim>> claims = new Long2ObjectArrayMap<>();
private final Map<UUID, Claim> claimUUIDMap = Maps.newHashMap(); private final Map<UUID, Claim> claimUUIDMap = Maps.newHashMap();
private final Map<UUID, Set<Claim>> playerClaimMap = Maps.newHashMap(); private final Map<UUID, Set<Claim>> playerClaimMap = Maps.newHashMap();
private final Set<UUID> dirty = Sets.newHashSet();
public static ClaimStorage get(ServerWorld world) { public static ClaimStorage get(ServerWorld world) {
return (ClaimStorage) ((IClaimData) world).getClaimData(); return (ClaimStorage) ((IClaimData) world).getClaimData();
} }
@ -118,9 +131,16 @@ public class ClaimStorage {
}); });
} }
this.playerClaimMap.getOrDefault(claim.getOwner(), Sets.newHashSet()).remove(claim); this.playerClaimMap.getOrDefault(claim.getOwner(), Sets.newHashSet()).remove(claim);
this.dirty.add(claim.getOwner());
return this.claimUUIDMap.remove(claim.getClaimID()) != null; return this.claimUUIDMap.remove(claim.getClaimID()) != null;
} }
public void toggleAdminClaim(ServerPlayerEntity player, Claim claim, boolean toggle){
this.deleteClaim(claim, false, EnumEditMode.DEFAULT, player.getServerWorld());
claim.toggleAdminClaim(player, toggle);
this.addClaim(claim);
}
public boolean resizeClaim(Claim claim, BlockPos from, BlockPos to, ServerPlayerEntity player) { public boolean resizeClaim(Claim claim, BlockPos from, BlockPos to, ServerPlayerEntity player) {
int[] dims = claim.getDimensions(); int[] dims = claim.getDimensions();
BlockPos opposite = new BlockPos(dims[0] == from.getX() ? dims[1] : dims[0], dims[4], dims[2] == from.getZ() ? dims[3] : dims[2]); BlockPos opposite = new BlockPos(dims[0] == from.getX() ? dims[1] : dims[0], dims[4], dims[2] == from.getZ() ? dims[3] : dims[2]);
@ -181,7 +201,7 @@ public class ClaimStorage {
} }
public Collection<Claim> getAdminClaims(){ public Collection<Claim> getAdminClaims(){
return ImmutableSet.copyOf(this.claimUUIDMap.values().stream().filter(claim->claim.isAdminClaim()).iterator()); return ImmutableSet.copyOf(this.playerClaimMap.get(null));
} }
public static int[] getChunkPos(Claim claim) { public static int[] getChunkPos(Claim claim) {
@ -201,7 +221,8 @@ public class ClaimStorage {
for (File file : dir.listFiles()) { for (File file : dir.listFiles()) {
if (!file.getName().endsWith(".json")) if (!file.getName().endsWith(".json"))
continue; continue;
UUID uuid = UUID.fromString(file.getName().replace(".json", "")); String realName = file.getName().replace(".json", "");
UUID uuid = realName.equals(adminClaimString)?null:UUID.fromString(file.getName().replace(".json", ""));
FileReader reader = new FileReader(file); FileReader reader = new FileReader(file);
JsonArray arr = ConfigHandler.GSON.fromJson(reader, JsonArray.class); JsonArray arr = ConfigHandler.GSON.fromJson(reader, JsonArray.class);
if (arr == null) if (arr == null)
@ -225,8 +246,8 @@ public class ClaimStorage {
dir.mkdir(); dir.mkdir();
try { try {
for (Map.Entry<UUID, Set<Claim>> e : this.playerClaimMap.entrySet()) { for (Map.Entry<UUID, Set<Claim>> e : this.playerClaimMap.entrySet()) {
String owner = e.getKey()==null?adminClaimString:e.getKey().toString();
File file = new File(dir, e.getKey().toString() + ".json"); File file = new File(dir, owner + ".json");
boolean dirty = false; boolean dirty = false;
if (!file.exists()) { if (!file.exists()) {
if (e.getValue().isEmpty()) if (e.getValue().isEmpty())
@ -234,11 +255,17 @@ public class ClaimStorage {
file.createNewFile(); file.createNewFile();
dirty = true; dirty = true;
} else { } else {
for (Claim claim : e.getValue()) if(this.dirty.contains(owner.equals(adminClaimString)?null:e.getKey())) {
if (claim.isDirty()) { dirty = true;
dirty = true; this.dirty.clear();
break; }
} else {
for (Claim claim : e.getValue())
if (claim.isDirty()) {
dirty = true;
claim.setDirty(false);
}
}
} }
if (dirty) { if (dirty) {
JsonArray arr = new JsonArray(); JsonArray arr = new JsonArray();
@ -253,11 +280,11 @@ public class ClaimStorage {
} }
} }
public static Set<String> readGriefPreventionData(MinecraftServer server) { public static void readGriefPreventionData(MinecraftServer server, ServerCommandSource src) {
Yaml yml = new Yaml(); Yaml yml = new Yaml();
File griefPrevention = server.getSavePath(WorldSavePath.ROOT).resolve("plugins/GriefPreventionData/ClaimData").toFile(); File griefPrevention = server.getSavePath(WorldSavePath.ROOT).resolve("plugins/GriefPreventionData/ClaimData").toFile();
if (!griefPrevention.exists()) if (!griefPrevention.exists())
return null; return;
Map<File, List<File>> subClaimMap = Maps.newHashMap(); Map<File, List<File>> subClaimMap = Maps.newHashMap();
Map<Integer, File> intFileMap = Maps.newHashMap(); Map<Integer, File> intFileMap = Maps.newHashMap();
@ -273,14 +300,14 @@ public class ClaimStorage {
EnumPermission.LECTERNTAKE, EnumPermission.ENDCRYSTALPLACE, EnumPermission.PROJECTILES, EnumPermission.TRAMPLE, EnumPermission.RAID, EnumPermission.LECTERNTAKE, EnumPermission.ENDCRYSTALPLACE, EnumPermission.PROJECTILES, EnumPermission.TRAMPLE, EnumPermission.RAID,
EnumPermission.BUCKET, EnumPermission.ANIMALINTERACT, EnumPermission.HURTANIMAL, EnumPermission.TRADING, EnumPermission.ARMORSTAND, EnumPermission.BUCKET, EnumPermission.ANIMALINTERACT, EnumPermission.HURTANIMAL, EnumPermission.TRADING, EnumPermission.ARMORSTAND,
EnumPermission.BREAKNONLIVING)); EnumPermission.BREAKNONLIVING));
System.out.println(managers); Map<String, EnumSet<EnumPermission>> perms = Maps.newHashMap();
System.out.println(builders); perms.put("managers", managers);
System.out.println(containers); perms.put("builders", builders);
System.out.println(accessors); perms.put("containers", containers);
perms.put("accessors", accessors);
try { try {
//Get all parent claims //Get all parent claims
Set<String> failedClaimsFile = Sets.newHashSet();
for (File f : griefPrevention.listFiles()) { for (File f : griefPrevention.listFiles()) {
if (f.getName().endsWith(".yml")) { if (f.getName().endsWith(".yml")) {
FileReader reader = new FileReader(f); FileReader reader = new FileReader(f);
@ -290,7 +317,7 @@ public class ClaimStorage {
intFileMap.put(Integer.valueOf(f.getName().replace(".yml", "")), f); intFileMap.put(Integer.valueOf(f.getName().replace(".yml", "")), f);
} }
catch (NumberFormatException e){ catch (NumberFormatException e){
failedClaimsFile.add(f.getName()); src.sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.errorFile, f.getName(), Formatting.RED)), false);
} }
} }
} }
@ -310,42 +337,114 @@ public class ClaimStorage {
} }
} }
for (File parent : intFileMap.values()) { for (File parent : intFileMap.values()) {
Pair<ServerWorld, Claim> parentClaim = parseFromYaml(parent, yml, server); try {
List<File> childs = subClaimMap.get(parent); Pair<ServerWorld, Claim> parentClaim = parseFromYaml(parent, yml, server, perms);
if (childs != null && !childs.isEmpty()) { List<File> childs = subClaimMap.get(parent);
for (File childF : childs) if (childs != null && !childs.isEmpty()) {
parentClaim.second.addSubClaimGriefprevention(parseFromYaml(childF, yml, server).second); for (File childF : childs)
parentClaim.second.addSubClaimGriefprevention(parseFromYaml(childF, yml, server, perms).second);
}
ClaimStorage storage = ClaimStorage.get(parentClaim.first);
Set<Claim> conflicts = storage.conflicts(parentClaim.second, null);
if (conflicts.isEmpty()) {
parentClaim.second.setClaimID(storage.generateUUID());
storage.addClaim(parentClaim.second);
} else {
src.sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.readConflict, parent.getName(), conflicts), Formatting.DARK_RED), false);
for(Claim claim : conflicts){
int[] dim = claim.getDimensions();
MutableText text = PermHelper.simpleColoredText(String.format("@[x=%d;z=%d]", dim[0], dim[2]), Formatting.RED);
text.setStyle(text.getStyle().withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/tp @s " + dim[0] + " ~ " + dim[2])).withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TranslatableText("chat.coordinates.tooltip"))));
src.sendFeedback(text, false);
}
}
} }
ClaimStorage storage = ClaimStorage.get(parentClaim.first); catch (Exception e){
if (storage.conflicts(parentClaim.second, null).isEmpty()) { src.sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.errorFile, parent.getName(), Formatting.RED)), false);
parentClaim.second.setClaimID(storage.generateUUID()); e.printStackTrace();
storage.addClaim(parentClaim.second);
} }
else
failedClaimsFile.add(parent.getName());
} }
if (!failedClaimsFile.isEmpty())
return failedClaimsFile;
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
return null;
} }
private static Pair<ServerWorld, Claim> parseFromYaml(File file, Yaml yml, MinecraftServer server) throws IOException { private static Pair<ServerWorld, Claim> parseFromYaml(File file, Yaml yml, MinecraftServer server,
Map<String, EnumSet<EnumPermission>> perms) throws IOException {
FileReader reader = new FileReader(file); FileReader reader = new FileReader(file);
Map<String, Object> values = yml.load(reader); Map<String, Object> values = yml.load(reader);
reader.close(); reader.close();
UUID owner = UUID.fromString(values.get("Owner").toString()); String ownerString = (String) values.get("Owner");
UUID owner = ownerString.isEmpty()?null:UUID.fromString(ownerString);
List<String> builders = readList(values, "Builders");
List<String> managers = readList(values, "Managers");
List<String> containers = readList(values, "Containers");
List<String> accessors = readList(values, "Accessors");
String[] lesserCorner = values.get("Lesser Boundary Corner").toString().split(";"); String[] lesserCorner = values.get("Lesser Boundary Corner").toString().split(";");
String[] greaterCorner = values.get("Greater Boundary Corner").toString().split(";"); String[] greaterCorner = values.get("Greater Boundary Corner").toString().split(";");
ServerWorld world = server.getWorld(worldRegFromString(lesserCorner[0])); ServerWorld world = server.getWorld(worldRegFromString(lesserCorner[0]));
Claim claim = new Claim(Integer.parseInt(lesserCorner[1]), Integer.parseInt(greaterCorner[1]), Claim claim = new Claim(Integer.parseInt(lesserCorner[1]), Integer.parseInt(greaterCorner[1]),
Integer.parseInt(lesserCorner[3]), Integer.parseInt(greaterCorner[3]), ConfigHandler.config.defaultClaimDepth == 255?0: Integer.parseInt(lesserCorner[3]), Integer.parseInt(greaterCorner[3]), ConfigHandler.config.defaultClaimDepth == 255?0:
Integer.parseInt(lesserCorner[2]), owner, world); Integer.parseInt(lesserCorner[2]), owner, world);
if(!builders.isEmpty() && !builders.contains(ownerString)) {
if(builders.contains("public")){
perms.get("builders").forEach(perm -> {
if(!perm.isAlwaysGlobalPerm())
claim.editGlobalPerms(perm, 1);
});
}
else {
perms.get("builders").forEach(perm -> claim.editPerms(null, "Builders", perm, 1, true));
builders.forEach(s -> claim.setPlayerGroup(UUID.fromString(s), "Builders", true));
}
}
if(!managers.isEmpty() && !managers.contains(ownerString)) {
if(managers.contains("public")){
perms.get("managers").forEach(perm -> {
if(!perm.isAlwaysGlobalPerm())
claim.editGlobalPerms(perm, 1);
});
}
else {
perms.get("managers").forEach(perm -> claim.editPerms(null, "Managers", perm, 1, true));
managers.forEach(s -> claim.setPlayerGroup(UUID.fromString(s), "Managers", true));
}
}
if(!containers.isEmpty() && !containers.contains(ownerString)) {
if(containers.contains("public")){
perms.get("containers").forEach(perm -> {
if(!perm.isAlwaysGlobalPerm())
claim.editGlobalPerms(perm, 1);
});
}
else {
perms.get("containers").forEach(perm -> claim.editPerms(null, "Containers", perm, 1, true));
containers.forEach(s -> claim.setPlayerGroup(UUID.fromString(s), "Containers", true));
}
}
if(!accessors.isEmpty() && !accessors.contains(ownerString)) {
if(accessors.contains("public")){
perms.get("accessors").forEach(perm -> {
if(!perm.isAlwaysGlobalPerm())
claim.editGlobalPerms(perm, 1);
});
}
else {
perms.get("accessors").forEach(perm -> claim.editPerms(null, "Accessors", perm, 1, true));
accessors.forEach(s -> claim.setPlayerGroup(UUID.fromString(s), "Accessors", true));
}
}
return Pair.of(world, claim); return Pair.of(world, claim);
} }
private static <T> List<T> readList(Map<String, Object> values, String key){
Object obj = values.get(key);
if(obj instanceof List)
return (List<T>) obj;
return Lists.newArrayList();
}
public static RegistryKey<World> worldRegFromString(String spigot) { public static RegistryKey<World> worldRegFromString(String spigot) {
if (spigot.equals("world_the_end")) if (spigot.equals("world_the_end"))
return World.END; return World.END;

View File

@ -3,6 +3,7 @@ package com.flemmli97.flan.claim;
import com.flemmli97.flan.config.ConfigHandler; import com.flemmli97.flan.config.ConfigHandler;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.LiteralText; import net.minecraft.text.LiteralText;
import net.minecraft.text.MutableText;
import net.minecraft.text.Style; import net.minecraft.text.Style;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Formatting; import net.minecraft.util.Formatting;
@ -42,7 +43,7 @@ public class PermHelper {
}); });
} }
public static Text simpleColoredText(String text, Formatting... formatting) { public static MutableText simpleColoredText(String text, Formatting... formatting) {
return new LiteralText(text).setStyle(formatting != null ? Style.EMPTY.withFormatting(formatting) : Style.EMPTY); return new LiteralText(text).setStyle(formatting != null ? Style.EMPTY.withFormatting(formatting) : Style.EMPTY);
} }
} }

View File

@ -8,6 +8,7 @@ import com.flemmli97.flan.config.ConfigHandler;
import com.flemmli97.flan.gui.ClaimMenuScreenHandler; import com.flemmli97.flan.gui.ClaimMenuScreenHandler;
import com.flemmli97.flan.player.EnumDisplayType; import com.flemmli97.flan.player.EnumDisplayType;
import com.flemmli97.flan.player.EnumEditMode; import com.flemmli97.flan.player.EnumEditMode;
import com.flemmli97.flan.player.OfflinePlayerData;
import com.flemmli97.flan.player.PlayerClaimData; import com.flemmli97.flan.player.PlayerClaimData;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
@ -25,6 +26,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.Suggestions;
import com.mojang.brigadier.suggestion.SuggestionsBuilder; import com.mojang.brigadier.suggestion.SuggestionsBuilder;
import net.minecraft.command.argument.GameProfileArgumentType; import net.minecraft.command.argument.GameProfileArgumentType;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.CommandManager;
import net.minecraft.server.command.CommandSource; import net.minecraft.server.command.CommandSource;
import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.command.ServerCommandSource;
@ -39,6 +41,7 @@ import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
public class CommandClaim { public class CommandClaim {
@ -52,7 +55,7 @@ public class CommandClaim {
CommandManager.literal("deleteAll").executes(CommandClaim::deleteAllClaim), CommandManager.literal("deleteAll").executes(CommandClaim::deleteAllClaim),
CommandManager.literal("deleteSubClaim").executes(CommandClaim::deleteSubClaim), CommandManager.literal("deleteSubClaim").executes(CommandClaim::deleteSubClaim),
CommandManager.literal("deleteAllSubClaims").executes(CommandClaim::deleteAllSubClaim), CommandManager.literal("deleteAllSubClaims").executes(CommandClaim::deleteAllSubClaim),
CommandManager.literal("list").executes(CommandClaim::listClaims), CommandManager.literal("list").executes(CommandClaim::listClaims).then(CommandManager.argument("player", GameProfileArgumentType.gameProfile()).requires(src -> src.hasPermissionLevel(2)).executes(cmd->listClaims(cmd, GameProfileArgumentType.getProfileArgument(cmd, "player")))),
CommandManager.literal("switchMode").executes(CommandClaim::switchClaimMode), CommandManager.literal("switchMode").executes(CommandClaim::switchClaimMode),
CommandManager.literal("adminMode").requires(src -> src.hasPermissionLevel(2)).executes(CommandClaim::switchAdminMode), CommandManager.literal("adminMode").requires(src -> src.hasPermissionLevel(2)).executes(CommandClaim::switchAdminMode),
CommandManager.literal("readGriefPrevention").requires(src -> src.hasPermissionLevel(2)).executes(CommandClaim::readGriefPreventionData), CommandManager.literal("readGriefPrevention").requires(src -> src.hasPermissionLevel(2)).executes(CommandClaim::readGriefPreventionData),
@ -218,18 +221,42 @@ public class CommandClaim {
private static int listClaims(CommandContext<ServerCommandSource> context) throws CommandSyntaxException { private static int listClaims(CommandContext<ServerCommandSource> context) throws CommandSyntaxException {
ServerPlayerEntity player = context.getSource().getPlayer(); ServerPlayerEntity player = context.getSource().getPlayer();
Map<World, Collection<Claim>> claims = Maps.newHashMap(); return listClaimsFromUUID(context, null);
for (ServerWorld world : player.getServer().getWorlds()) { }
ClaimStorage storage = ClaimStorage.get(world);
claims.put(world, storage.allClaimsFromPlayer(player.getUuid())); private static int listClaims(CommandContext<ServerCommandSource> context, Collection<GameProfile> profs) throws CommandSyntaxException {
if(profs.size()!=1) {
context.getSource().sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.onlyOnePlayer, Formatting.RED), false);
return 0;
} }
PlayerClaimData data = PlayerClaimData.get(player); GameProfile prof = profs.iterator().next();
player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBlocksFormat, if(prof == null || prof.getId()==null)
data.getClaimBlocks(), data.getAdditionalClaims(), data.usedClaimBlocks()), Formatting.GOLD), false); return 0;
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.listClaims, Formatting.GOLD), false); return listClaimsFromUUID(context, prof.getId());
}
private static int listClaimsFromUUID(CommandContext<ServerCommandSource> context, UUID of) throws CommandSyntaxException {
MinecraftServer server = context.getSource().getMinecraftServer();
ServerPlayerEntity player = of==null?context.getSource().getPlayer():server.getPlayerManager().getPlayer(of);
Map<World, Collection<Claim>> claims = Maps.newHashMap();
for (ServerWorld world : server.getWorlds()) {
ClaimStorage storage = ClaimStorage.get(world);
claims.put(world, storage.allClaimsFromPlayer(player!=null?player.getUuid():of));
}
if(player!=null) {
PlayerClaimData data = PlayerClaimData.get(player);
context.getSource().sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBlocksFormat,
data.getClaimBlocks(), data.getAdditionalClaims(), data.usedClaimBlocks()), Formatting.GOLD), false);
}
else {
OfflinePlayerData data = new OfflinePlayerData(server, of);
context.getSource().sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBlocksFormat,
data.claimBlocks, data.additionalClaimBlocks, data.getUsedClaimBlocks(server)), Formatting.GOLD), false);
}
context.getSource().sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.listClaims, Formatting.GOLD), false);
for (Map.Entry<World, Collection<Claim>> entry : claims.entrySet()) for (Map.Entry<World, Collection<Claim>> entry : claims.entrySet())
for (Claim claim : entry.getValue()) for (Claim claim : entry.getValue())
player.sendMessage(PermHelper.simpleColoredText( context.getSource().sendFeedback(PermHelper.simpleColoredText(
entry.getKey().getRegistryKey().getValue().toString() + " # " + claim.formattedClaim(), Formatting.YELLOW), false); entry.getKey().getRegistryKey().getValue().toString() + " # " + claim.formattedClaim(), Formatting.YELLOW), false);
return Command.SINGLE_SUCCESS; return Command.SINGLE_SUCCESS;
} }
@ -286,16 +313,16 @@ public class CommandClaim {
return Command.SINGLE_SUCCESS; return Command.SINGLE_SUCCESS;
} }
private static int toggleAdminClaim(CommandContext<ServerCommandSource> context) { private static int toggleAdminClaim(CommandContext<ServerCommandSource> context) throws CommandSyntaxException {
ServerCommandSource src = context.getSource(); ServerPlayerEntity player = context.getSource().getPlayer();
ClaimStorage storage = ClaimStorage.get(src.getWorld()); ClaimStorage storage = ClaimStorage.get(player.getServerWorld());
Claim claim = storage.getClaimAt(new BlockPos(src.getPosition())); Claim claim = storage.getClaimAt(player.getBlockPos());
if (claim == null) { if (claim == null) {
src.sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.noClaim, Formatting.RED), false); context.getSource().sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.noClaim, Formatting.RED), false);
return 0; return 0;
} }
claim.toggleAdminClaim(BoolArgumentType.getBool(context, "toggle")); storage.toggleAdminClaim(player, claim, BoolArgumentType.getBool(context, "toggle"));
src.sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.setAdminClaim, claim.isAdminClaim()), Formatting.GOLD), true); context.getSource().sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.setAdminClaim, claim.isAdminClaim()), Formatting.GOLD), true);
return Command.SINGLE_SUCCESS; return Command.SINGLE_SUCCESS;
} }
@ -311,12 +338,9 @@ public class CommandClaim {
private static int readGriefPreventionData(CommandContext<ServerCommandSource> context) { private static int readGriefPreventionData(CommandContext<ServerCommandSource> context) {
ServerCommandSource src = context.getSource(); ServerCommandSource src = context.getSource();
src.sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.readGriefpreventionData, Formatting.GOLD), true); src.sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.readGriefpreventionData, Formatting.GOLD), true);
Set<String> errors = ClaimStorage.readGriefPreventionData(src.getMinecraftServer()); ClaimStorage.readGriefPreventionData(src.getMinecraftServer(), src);
PlayerClaimData.readGriefPreventionPlayerData(src.getMinecraftServer()); PlayerClaimData.readGriefPreventionPlayerData(src.getMinecraftServer(), src);
if (errors == null) src.sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.readGriefpreventionDataSuccess, Formatting.GOLD), true);
src.sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.readGriefpreventionDataSuccess, Formatting.GOLD), true);
else
src.sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.readGriefpreventionDataFail, errors), Formatting.RED), true);
return Command.SINGLE_SUCCESS; return Command.SINGLE_SUCCESS;
} }

View File

@ -20,6 +20,7 @@ public class LangConfig {
public String claimBlocksFormat = "Claim Blocks: %1$d + (Bonus) %2$d; Used: %3$d"; public String claimBlocksFormat = "Claim Blocks: %1$d + (Bonus) %2$d; Used: %3$d";
public String listClaims = "Listing all claims:"; public String listClaims = "Listing all claims:";
public String listAdminClaims = "Listing all admin-claims in %1:"; public String listAdminClaims = "Listing all admin-claims in %1:";
public String onlyOnePlayer = "Only one player can be used as argument";
public String noPermission = "You don't have the required permissions to do that here!"; public String noPermission = "You don't have the required permissions to do that here!";
public String noPermissionSimple = "Sorry you can't do that here!"; public String noPermissionSimple = "Sorry you can't do that here!";
@ -58,7 +59,8 @@ public class LangConfig {
public String setAdminClaim = "Adminclaim of this claim now: %s"; public String setAdminClaim = "Adminclaim of this claim now: %s";
public String readGriefpreventionData = "Reading data from GriefPrevention"; public String readGriefpreventionData = "Reading data from GriefPrevention";
public String readGriefpreventionDataSuccess = "Successfully read data"; public String readGriefpreventionDataSuccess = "Successfully read data";
public String readGriefpreventionDataFail = "Failed reading data for following claim files (Check the logs!): %s"; public String errorFile = "Error reading file %s";
public String readConflict = "%1$s conflicts with existing claims. Not added to world! Conflicts:";
public String giveClaimBlocks = "Gave following players %2$d claimblocks: %1$s"; public String giveClaimBlocks = "Gave following players %2$d claimblocks: %1$s";
public String claimBasicInfo = "Owner: %1$s, from: [x=%2$d,z=%3$d] to [x=%4$d,z=%5$d]; Subclaim-amount: %6$d"; public String claimBasicInfo = "Owner: %1$s, from: [x=%2$d,z=%3$d] to [x=%4$d,z=%5$d]; Subclaim-amount: %6$d";

View File

@ -0,0 +1,53 @@
package com.flemmli97.flan.player;
import com.flemmli97.flan.claim.Claim;
import com.flemmli97.flan.claim.ClaimStorage;
import com.flemmli97.flan.config.ConfigHandler;
import com.google.gson.JsonObject;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.WorldSavePath;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Collection;
import java.util.UUID;
public class OfflinePlayerData {
public final int claimBlocks, additionalClaimBlocks;
public final UUID owner;
public OfflinePlayerData(MinecraftServer server, UUID uuid){
File dir = new File(server.getSavePath(WorldSavePath.PLAYERDATA).toFile(), "/claimData/");
int claim = ConfigHandler.config.startingBlocks;
int add = 0;
this.owner = uuid;
if (dir.exists()) {
try {
File file = new File(dir, uuid + ".json");
if (file.exists()) {
FileReader reader = new FileReader(file);
JsonObject obj = ConfigHandler.GSON.fromJson(reader, JsonObject.class);
claim = obj.get("ClaimBlocks").getAsInt();
add = obj.get("AdditionalBlocks").getAsInt();
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
this.claimBlocks = claim;
this.additionalClaimBlocks = add;
}
public int getUsedClaimBlocks(MinecraftServer server){
int usedClaimsBlocks = 0;
for (ServerWorld world : server.getWorlds()) {
Collection<Claim> claims = ClaimStorage.get(world).allClaimsFromPlayer(this.owner);
if (claims != null)
usedClaimsBlocks += claims.stream().filter(claim->!claim.isAdminClaim()).mapToInt(Claim::getPlane).sum();
}
return usedClaimsBlocks;
}
}

View File

@ -4,6 +4,7 @@ import com.flemmli97.flan.IClaimData;
import com.flemmli97.flan.claim.Claim; import com.flemmli97.flan.claim.Claim;
import com.flemmli97.flan.claim.ClaimStorage; import com.flemmli97.flan.claim.ClaimStorage;
import com.flemmli97.flan.claim.ParticleIndicators; import com.flemmli97.flan.claim.ParticleIndicators;
import com.flemmli97.flan.claim.PermHelper;
import com.flemmli97.flan.config.ConfigHandler; import com.flemmli97.flan.config.ConfigHandler;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
@ -11,8 +12,10 @@ import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.packet.s2c.play.ParticleS2CPacket; import net.minecraft.network.packet.s2c.play.ParticleS2CPacket;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.Formatting;
import net.minecraft.util.WorldSavePath; import net.minecraft.util.WorldSavePath;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@ -267,12 +270,14 @@ public class PlayerClaimData {
return usedClaimsBlocks; return usedClaimsBlocks;
} }
public static void readGriefPreventionPlayerData(MinecraftServer server) { public static void readGriefPreventionPlayerData(MinecraftServer server, ServerCommandSource src) {
File griefPrevention = server.getSavePath(WorldSavePath.ROOT).resolve("plugins/GriefPreventionData/PlayerData").toFile(); File griefPrevention = server.getSavePath(WorldSavePath.ROOT).resolve("plugins/GriefPreventionData/PlayerData").toFile();
if (!griefPrevention.exists()) if (!griefPrevention.exists())
return; return;
try { for (File f : griefPrevention.listFiles()) {
for (File f : griefPrevention.listFiles()) { try {
if (f.getName().contains("."))
continue;
if (f.getName().startsWith("$")) { if (f.getName().startsWith("$")) {
} else { } else {
@ -301,8 +306,9 @@ public class PlayerClaimData {
reader.close(); reader.close();
} }
} }
} catch (IOException e) { catch (Exception e){
e.printStackTrace(); src.sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.errorFile, f.getName(), Formatting.RED)), false);
}
} }
} }
} }