read set perms from griefpreventiondata, add ability to list other peoples claims
This commit is contained in:
parent
fdab079aed
commit
0f8c813c71
@ -30,7 +30,6 @@ public class Claim {
|
||||
private int minX, minZ, maxX, maxZ, minY;
|
||||
|
||||
private UUID owner;
|
||||
private boolean adminClaim;
|
||||
|
||||
private UUID claimID;
|
||||
private final EnumMap<EnumPermission, Boolean> globalPerm = Maps.newEnumMap(EnumPermission.class);
|
||||
@ -66,7 +65,7 @@ public class Claim {
|
||||
this.minY = Math.max(0, minY);
|
||||
this.owner = creator;
|
||||
this.world = world;
|
||||
this.setDirty();
|
||||
this.setDirty(true);
|
||||
}
|
||||
|
||||
public static Claim fromJson(JsonObject obj, UUID owner, ServerWorld world) {
|
||||
@ -77,12 +76,12 @@ public class Claim {
|
||||
|
||||
public void setClaimID(UUID uuid) {
|
||||
this.claimID = uuid;
|
||||
this.setDirty();
|
||||
this.setDirty(true);
|
||||
}
|
||||
|
||||
public void extendDownwards(BlockPos pos){
|
||||
this.minY = pos.getY();
|
||||
this.setDirty();
|
||||
this.setDirty(true);
|
||||
}
|
||||
|
||||
public UUID getClaimID() {
|
||||
@ -110,17 +109,27 @@ public class Claim {
|
||||
this.maxZ = claim.maxZ;
|
||||
this.minY = claim.minY;
|
||||
this.removed = false;
|
||||
this.setDirty();
|
||||
this.setDirty(true);
|
||||
}
|
||||
|
||||
public void toggleAdminClaim(boolean flag) {
|
||||
this.adminClaim = flag;
|
||||
this.subClaims.forEach(claim->claim.adminClaim = flag);
|
||||
this.setDirty();
|
||||
public void toggleAdminClaim(ServerPlayerEntity player, boolean flag) {
|
||||
if(!flag)
|
||||
this.transferOwner(player);
|
||||
else {
|
||||
this.owner = null;
|
||||
this.subClaims.forEach(claim -> claim.owner = null);
|
||||
}
|
||||
this.setDirty(true);
|
||||
}
|
||||
|
||||
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() {
|
||||
@ -175,7 +184,7 @@ public class Claim {
|
||||
if (player.getUuid().equals(this.owner))
|
||||
return true;
|
||||
PlayerClaimData data = PlayerClaimData.get(player);
|
||||
if ((this.adminClaim && player.hasPermissionLevel(2)) || data.isAdminIgnoreClaim())
|
||||
if ((this.isAdminClaim() && player.hasPermissionLevel(2)) || data.isAdminIgnoreClaim())
|
||||
return true;
|
||||
for (Claim claim : this.subClaims) {
|
||||
if (claim.insideClaim(pos)) {
|
||||
@ -238,7 +247,7 @@ public class Claim {
|
||||
sub.parent = this.claimID;
|
||||
sub.parentClaim = this;
|
||||
this.subClaims.add(sub);
|
||||
this.setDirty();
|
||||
this.setDirty(true);
|
||||
}
|
||||
return conflicts;
|
||||
}
|
||||
@ -248,7 +257,7 @@ public class Claim {
|
||||
claim.parent = this.claimID;
|
||||
claim.parentClaim = this;
|
||||
this.subClaims.add(claim);
|
||||
this.setDirty();
|
||||
this.setDirty(true);
|
||||
}
|
||||
|
||||
public Claim getSubClaim(BlockPos pos) {
|
||||
@ -260,7 +269,7 @@ public class Claim {
|
||||
|
||||
public boolean deleteSubClaim(Claim claim) {
|
||||
claim.remove();
|
||||
this.setDirty();
|
||||
this.setDirty(true);
|
||||
return this.subClaims.remove(claim);
|
||||
}
|
||||
|
||||
@ -278,22 +287,22 @@ public class Claim {
|
||||
conflicts.add(other);
|
||||
if (conflicts.isEmpty()) {
|
||||
claim.copySizes(newClaim);
|
||||
this.setDirty();
|
||||
this.setDirty(true);
|
||||
}
|
||||
return conflicts;
|
||||
}
|
||||
|
||||
public boolean setPlayerGroup(UUID player, String group, boolean force) {
|
||||
if (this.owner.equals(player))
|
||||
if (player.equals(this.owner))
|
||||
return false;
|
||||
if (group == null) {
|
||||
this.playersGroups.remove(player);
|
||||
this.setDirty();
|
||||
this.setDirty(true);
|
||||
return true;
|
||||
}
|
||||
if (!this.playersGroups.containsKey(player) || force) {
|
||||
this.playersGroups.put(player, group);
|
||||
this.setDirty();
|
||||
this.setDirty(true);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -322,17 +331,22 @@ public class Claim {
|
||||
this.globalPerm.remove(toggle);
|
||||
else
|
||||
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
|
||||
*
|
||||
* @param mode -1 = makes it resort to the global perm, 0 = deny perm, 1 = allow perm
|
||||
* @return If editing was successful or not
|
||||
*/
|
||||
public boolean editPerms(ServerPlayerEntity player, String group, EnumPermission perm, int mode) {
|
||||
if (this.canInteract(player, EnumPermission.EDITPERMS, player.getBlockPos())) {
|
||||
public boolean editPerms(ServerPlayerEntity player, String group, EnumPermission perm, int mode, boolean griefPrevention) {
|
||||
if(perm.isAlwaysGlobalPerm())
|
||||
return false;
|
||||
if (griefPrevention || this.canInteract(player, EnumPermission.EDITPERMS, player.getBlockPos())) {
|
||||
if (mode > 1)
|
||||
mode = -1;
|
||||
boolean has = this.permissions.containsKey(group);
|
||||
@ -343,7 +357,7 @@ public class Claim {
|
||||
perms.put(perm, mode == 1);
|
||||
if (!has)
|
||||
this.permissions.put(group, perms);
|
||||
this.setDirty();
|
||||
this.setDirty(true);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -358,7 +372,7 @@ public class Claim {
|
||||
toRemove.add(uuid);
|
||||
});
|
||||
toRemove.forEach(this.playersGroups::remove);
|
||||
this.setDirty();
|
||||
this.setDirty(true);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -379,11 +393,11 @@ public class Claim {
|
||||
/**
|
||||
* Only marks non sub claims
|
||||
*/
|
||||
public void setDirty() {
|
||||
public void setDirty(boolean flag) {
|
||||
if(this.parentClaim()!=null)
|
||||
this.parentClaim().setDirty();
|
||||
this.parentClaim().setDirty(flag);
|
||||
else
|
||||
this.dirty = true;
|
||||
this.dirty = flag;
|
||||
}
|
||||
|
||||
public boolean isDirty() {
|
||||
@ -391,15 +405,17 @@ public class Claim {
|
||||
}
|
||||
|
||||
public void readJson(JsonObject obj, UUID uuid) {
|
||||
this.claimID = UUID.fromString(obj.get("ID").getAsString());
|
||||
JsonArray pos = obj.getAsJsonArray("PosxXzZY");
|
||||
this.minX = pos.get(0).getAsInt();
|
||||
this.maxX = pos.get(1).getAsInt();
|
||||
this.minZ = pos.get(2).getAsInt();
|
||||
this.maxZ = pos.get(3).getAsInt();
|
||||
this.minY = pos.get(4).getAsInt();
|
||||
this.owner = uuid;
|
||||
this.adminClaim = obj.has("AdminClaim")?obj.get("AdminClaim").getAsBoolean():false;
|
||||
this.claimID = UUID.fromString(obj.get("ID").getAsString());
|
||||
if(obj.has("AdminClaim")?obj.get("AdminClaim").getAsBoolean():false)
|
||||
this.owner = null;
|
||||
else
|
||||
this.owner = uuid;
|
||||
this.globalPerm.clear();
|
||||
this.permissions.clear();
|
||||
this.subClaims.clear();
|
||||
@ -431,6 +447,7 @@ public class Claim {
|
||||
}
|
||||
|
||||
public JsonObject toJson(JsonObject obj) {
|
||||
obj.addProperty("ID", this.claimID.toString());
|
||||
JsonArray pos = new JsonArray();
|
||||
pos.add(this.minX);
|
||||
pos.add(this.maxX);
|
||||
@ -438,8 +455,6 @@ public class Claim {
|
||||
pos.add(this.maxZ);
|
||||
pos.add(this.minY);
|
||||
obj.add("PosxXzZY", pos);
|
||||
obj.addProperty("ID", this.claimID.toString());
|
||||
obj.addProperty("AdminClaim", this.adminClaim);
|
||||
if (this.parent != null)
|
||||
obj.addProperty("Parent", this.parent.toString());
|
||||
if (!this.globalPerm.isEmpty()) {
|
||||
@ -499,7 +514,7 @@ public class Claim {
|
||||
|
||||
@Override
|
||||
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() {
|
||||
@ -510,8 +525,8 @@ public class Claim {
|
||||
boolean perms = this.canInteract(player, EnumPermission.EDITPERMS, player.getBlockPos());
|
||||
List<Text> l = Lists.newArrayList();
|
||||
l.add(PermHelper.simpleColoredText("=============================================", Formatting.GREEN));
|
||||
GameProfile prof = player.getServer().getUserCache().getByUuid(this.owner);
|
||||
String ownerName = this.adminClaim ? "Admin" : prof != null ? prof.getName() : "<UNKNOWN>";
|
||||
GameProfile prof = this.owner!=null?player.getServer().getUserCache().getByUuid(this.owner):null;
|
||||
String ownerName = this.isAdminClaim() ? "Admin" : prof != null ? prof.getName() : "<UNKNOWN>";
|
||||
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));
|
||||
else
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.flemmli97.flan.claim;
|
||||
|
||||
import com.flemmli97.flan.Flan;
|
||||
import com.flemmli97.flan.IClaimData;
|
||||
import com.flemmli97.flan.config.ConfigHandler;
|
||||
import com.flemmli97.flan.player.EnumDisplayType;
|
||||
@ -14,8 +15,17 @@ import com.google.gson.JsonObject;
|
||||
import com.ibm.icu.impl.Pair;
|
||||
import it.unimi.dsi.fastutil.longs.Long2ObjectArrayMap;
|
||||
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.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.WorldSavePath;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
@ -30,18 +40,21 @@ import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.EnumMap;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class ClaimStorage {
|
||||
|
||||
public static final String adminClaimString = "!AdminClaims";
|
||||
private final Long2ObjectArrayMap<List<Claim>> claims = new Long2ObjectArrayMap<>();
|
||||
private final Map<UUID, Claim> claimUUIDMap = Maps.newHashMap();
|
||||
private final Map<UUID, Set<Claim>> playerClaimMap = Maps.newHashMap();
|
||||
|
||||
private final Set<UUID> dirty = Sets.newHashSet();
|
||||
public static ClaimStorage get(ServerWorld world) {
|
||||
return (ClaimStorage) ((IClaimData) world).getClaimData();
|
||||
}
|
||||
@ -118,9 +131,16 @@ public class ClaimStorage {
|
||||
});
|
||||
}
|
||||
this.playerClaimMap.getOrDefault(claim.getOwner(), Sets.newHashSet()).remove(claim);
|
||||
this.dirty.add(claim.getOwner());
|
||||
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) {
|
||||
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]);
|
||||
@ -181,7 +201,7 @@ public class ClaimStorage {
|
||||
}
|
||||
|
||||
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) {
|
||||
@ -201,7 +221,8 @@ public class ClaimStorage {
|
||||
for (File file : dir.listFiles()) {
|
||||
if (!file.getName().endsWith(".json"))
|
||||
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);
|
||||
JsonArray arr = ConfigHandler.GSON.fromJson(reader, JsonArray.class);
|
||||
if (arr == null)
|
||||
@ -225,8 +246,8 @@ public class ClaimStorage {
|
||||
dir.mkdir();
|
||||
try {
|
||||
for (Map.Entry<UUID, Set<Claim>> e : this.playerClaimMap.entrySet()) {
|
||||
|
||||
File file = new File(dir, e.getKey().toString() + ".json");
|
||||
String owner = e.getKey()==null?adminClaimString:e.getKey().toString();
|
||||
File file = new File(dir, owner + ".json");
|
||||
boolean dirty = false;
|
||||
if (!file.exists()) {
|
||||
if (e.getValue().isEmpty())
|
||||
@ -234,11 +255,17 @@ public class ClaimStorage {
|
||||
file.createNewFile();
|
||||
dirty = true;
|
||||
} else {
|
||||
for (Claim claim : e.getValue())
|
||||
if (claim.isDirty()) {
|
||||
dirty = true;
|
||||
break;
|
||||
}
|
||||
if(this.dirty.contains(owner.equals(adminClaimString)?null:e.getKey())) {
|
||||
dirty = true;
|
||||
this.dirty.clear();
|
||||
}
|
||||
else {
|
||||
for (Claim claim : e.getValue())
|
||||
if (claim.isDirty()) {
|
||||
dirty = true;
|
||||
claim.setDirty(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (dirty) {
|
||||
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();
|
||||
File griefPrevention = server.getSavePath(WorldSavePath.ROOT).resolve("plugins/GriefPreventionData/ClaimData").toFile();
|
||||
if (!griefPrevention.exists())
|
||||
return null;
|
||||
return;
|
||||
Map<File, List<File>> subClaimMap = 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.BUCKET, EnumPermission.ANIMALINTERACT, EnumPermission.HURTANIMAL, EnumPermission.TRADING, EnumPermission.ARMORSTAND,
|
||||
EnumPermission.BREAKNONLIVING));
|
||||
System.out.println(managers);
|
||||
System.out.println(builders);
|
||||
System.out.println(containers);
|
||||
System.out.println(accessors);
|
||||
Map<String, EnumSet<EnumPermission>> perms = Maps.newHashMap();
|
||||
perms.put("managers", managers);
|
||||
perms.put("builders", builders);
|
||||
perms.put("containers", containers);
|
||||
perms.put("accessors", accessors);
|
||||
|
||||
try {
|
||||
//Get all parent claims
|
||||
Set<String> failedClaimsFile = Sets.newHashSet();
|
||||
for (File f : griefPrevention.listFiles()) {
|
||||
if (f.getName().endsWith(".yml")) {
|
||||
FileReader reader = new FileReader(f);
|
||||
@ -290,7 +317,7 @@ public class ClaimStorage {
|
||||
intFileMap.put(Integer.valueOf(f.getName().replace(".yml", "")), f);
|
||||
}
|
||||
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()) {
|
||||
Pair<ServerWorld, Claim> parentClaim = parseFromYaml(parent, yml, server);
|
||||
List<File> childs = subClaimMap.get(parent);
|
||||
if (childs != null && !childs.isEmpty()) {
|
||||
for (File childF : childs)
|
||||
parentClaim.second.addSubClaimGriefprevention(parseFromYaml(childF, yml, server).second);
|
||||
try {
|
||||
Pair<ServerWorld, Claim> parentClaim = parseFromYaml(parent, yml, server, perms);
|
||||
List<File> childs = subClaimMap.get(parent);
|
||||
if (childs != null && !childs.isEmpty()) {
|
||||
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);
|
||||
if (storage.conflicts(parentClaim.second, null).isEmpty()) {
|
||||
parentClaim.second.setClaimID(storage.generateUUID());
|
||||
storage.addClaim(parentClaim.second);
|
||||
catch (Exception e){
|
||||
src.sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.errorFile, parent.getName(), Formatting.RED)), false);
|
||||
e.printStackTrace();
|
||||
}
|
||||
else
|
||||
failedClaimsFile.add(parent.getName());
|
||||
}
|
||||
if (!failedClaimsFile.isEmpty())
|
||||
return failedClaimsFile;
|
||||
} catch (IOException e) {
|
||||
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);
|
||||
Map<String, Object> values = yml.load(reader);
|
||||
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[] greaterCorner = values.get("Greater Boundary Corner").toString().split(";");
|
||||
ServerWorld world = server.getWorld(worldRegFromString(lesserCorner[0]));
|
||||
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[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);
|
||||
}
|
||||
|
||||
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) {
|
||||
if (spigot.equals("world_the_end"))
|
||||
return World.END;
|
||||
|
@ -3,6 +3,7 @@ package com.flemmli97.flan.claim;
|
||||
import com.flemmli97.flan.config.ConfigHandler;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.text.LiteralText;
|
||||
import net.minecraft.text.MutableText;
|
||||
import net.minecraft.text.Style;
|
||||
import net.minecraft.text.Text;
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ import com.flemmli97.flan.config.ConfigHandler;
|
||||
import com.flemmli97.flan.gui.ClaimMenuScreenHandler;
|
||||
import com.flemmli97.flan.player.EnumDisplayType;
|
||||
import com.flemmli97.flan.player.EnumEditMode;
|
||||
import com.flemmli97.flan.player.OfflinePlayerData;
|
||||
import com.flemmli97.flan.player.PlayerClaimData;
|
||||
import com.google.common.collect.Lists;
|
||||
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.SuggestionsBuilder;
|
||||
import net.minecraft.command.argument.GameProfileArgumentType;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.command.CommandManager;
|
||||
import net.minecraft.server.command.CommandSource;
|
||||
import net.minecraft.server.command.ServerCommandSource;
|
||||
@ -39,6 +41,7 @@ import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
public class CommandClaim {
|
||||
@ -52,7 +55,7 @@ public class CommandClaim {
|
||||
CommandManager.literal("deleteAll").executes(CommandClaim::deleteAllClaim),
|
||||
CommandManager.literal("deleteSubClaim").executes(CommandClaim::deleteSubClaim),
|
||||
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("adminMode").requires(src -> src.hasPermissionLevel(2)).executes(CommandClaim::switchAdminMode),
|
||||
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 {
|
||||
ServerPlayerEntity player = context.getSource().getPlayer();
|
||||
Map<World, Collection<Claim>> claims = Maps.newHashMap();
|
||||
for (ServerWorld world : player.getServer().getWorlds()) {
|
||||
ClaimStorage storage = ClaimStorage.get(world);
|
||||
claims.put(world, storage.allClaimsFromPlayer(player.getUuid()));
|
||||
return listClaimsFromUUID(context, null);
|
||||
}
|
||||
|
||||
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);
|
||||
player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.claimBlocksFormat,
|
||||
data.getClaimBlocks(), data.getAdditionalClaims(), data.usedClaimBlocks()), Formatting.GOLD), false);
|
||||
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.listClaims, Formatting.GOLD), false);
|
||||
GameProfile prof = profs.iterator().next();
|
||||
if(prof == null || prof.getId()==null)
|
||||
return 0;
|
||||
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 (Claim claim : entry.getValue())
|
||||
player.sendMessage(PermHelper.simpleColoredText(
|
||||
context.getSource().sendFeedback(PermHelper.simpleColoredText(
|
||||
entry.getKey().getRegistryKey().getValue().toString() + " # " + claim.formattedClaim(), Formatting.YELLOW), false);
|
||||
return Command.SINGLE_SUCCESS;
|
||||
}
|
||||
@ -286,16 +313,16 @@ public class CommandClaim {
|
||||
return Command.SINGLE_SUCCESS;
|
||||
}
|
||||
|
||||
private static int toggleAdminClaim(CommandContext<ServerCommandSource> context) {
|
||||
ServerCommandSource src = context.getSource();
|
||||
ClaimStorage storage = ClaimStorage.get(src.getWorld());
|
||||
Claim claim = storage.getClaimAt(new BlockPos(src.getPosition()));
|
||||
private static int toggleAdminClaim(CommandContext<ServerCommandSource> context) throws CommandSyntaxException {
|
||||
ServerPlayerEntity player = context.getSource().getPlayer();
|
||||
ClaimStorage storage = ClaimStorage.get(player.getServerWorld());
|
||||
Claim claim = storage.getClaimAt(player.getBlockPos());
|
||||
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;
|
||||
}
|
||||
claim.toggleAdminClaim(BoolArgumentType.getBool(context, "toggle"));
|
||||
src.sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.setAdminClaim, claim.isAdminClaim()), Formatting.GOLD), true);
|
||||
storage.toggleAdminClaim(player, claim, BoolArgumentType.getBool(context, "toggle"));
|
||||
context.getSource().sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.setAdminClaim, claim.isAdminClaim()), Formatting.GOLD), true);
|
||||
return Command.SINGLE_SUCCESS;
|
||||
}
|
||||
|
||||
@ -311,12 +338,9 @@ public class CommandClaim {
|
||||
private static int readGriefPreventionData(CommandContext<ServerCommandSource> context) {
|
||||
ServerCommandSource src = context.getSource();
|
||||
src.sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.readGriefpreventionData, Formatting.GOLD), true);
|
||||
Set<String> errors = ClaimStorage.readGriefPreventionData(src.getMinecraftServer());
|
||||
PlayerClaimData.readGriefPreventionPlayerData(src.getMinecraftServer());
|
||||
if (errors == null)
|
||||
src.sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.readGriefpreventionDataSuccess, Formatting.GOLD), true);
|
||||
else
|
||||
src.sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.readGriefpreventionDataFail, errors), Formatting.RED), true);
|
||||
ClaimStorage.readGriefPreventionData(src.getMinecraftServer(), src);
|
||||
PlayerClaimData.readGriefPreventionPlayerData(src.getMinecraftServer(), src);
|
||||
src.sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.readGriefpreventionDataSuccess, Formatting.GOLD), true);
|
||||
return Command.SINGLE_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -20,6 +20,7 @@ public class LangConfig {
|
||||
public String claimBlocksFormat = "Claim Blocks: %1$d + (Bonus) %2$d; Used: %3$d";
|
||||
public String listClaims = "Listing all claims:";
|
||||
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 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 readGriefpreventionData = "Reading data from GriefPrevention";
|
||||
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 claimBasicInfo = "Owner: %1$s, from: [x=%2$d,z=%3$d] to [x=%4$d,z=%5$d]; Subclaim-amount: %6$d";
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -4,6 +4,7 @@ import com.flemmli97.flan.IClaimData;
|
||||
import com.flemmli97.flan.claim.Claim;
|
||||
import com.flemmli97.flan.claim.ClaimStorage;
|
||||
import com.flemmli97.flan.claim.ParticleIndicators;
|
||||
import com.flemmli97.flan.claim.PermHelper;
|
||||
import com.flemmli97.flan.config.ConfigHandler;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.gson.JsonObject;
|
||||
@ -11,8 +12,10 @@ import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.network.packet.s2c.play.ParticleS2CPacket;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.command.ServerCommandSource;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.server.world.ServerWorld;
|
||||
import net.minecraft.util.Formatting;
|
||||
import net.minecraft.util.WorldSavePath;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
@ -267,12 +270,14 @@ public class PlayerClaimData {
|
||||
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();
|
||||
if (!griefPrevention.exists())
|
||||
return;
|
||||
try {
|
||||
for (File f : griefPrevention.listFiles()) {
|
||||
for (File f : griefPrevention.listFiles()) {
|
||||
try {
|
||||
if (f.getName().contains("."))
|
||||
continue;
|
||||
if (f.getName().startsWith("$")) {
|
||||
|
||||
} else {
|
||||
@ -301,8 +306,9 @@ public class PlayerClaimData {
|
||||
reader.close();
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
catch (Exception e){
|
||||
src.sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.errorFile, f.getName(), Formatting.RED)), false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user