mirror of
https://github.com/Zrips/Jobs.git
synced 2024-11-25 20:16:13 +01:00
parent
cf55d7fbd7
commit
9c0787c03d
11
pom.xml
11
pom.xml
@ -52,7 +52,7 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
<!-- Vault -->
|
<!-- Vault -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>net.milkbowl.vault</groupId>
|
<groupId>com.github.MilkBowl</groupId>
|
||||||
<artifactId>VaultAPI</artifactId>
|
<artifactId>VaultAPI</artifactId>
|
||||||
<version>1.7</version>
|
<version>1.7</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
@ -206,11 +206,6 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<repositories>
|
<repositories>
|
||||||
<!-- Vault -->
|
|
||||||
<repository>
|
|
||||||
<id>vault-repo</id>
|
|
||||||
<url>http://nexus.hc.to/content/repositories/pub_releases/</url>
|
|
||||||
</repository>
|
|
||||||
<!-- MythicMobs -->
|
<!-- MythicMobs -->
|
||||||
<repository>
|
<repository>
|
||||||
<id>nexus</id>
|
<id>nexus</id>
|
||||||
@ -220,7 +215,7 @@
|
|||||||
<!-- WorldGuard & WorldEdit -->
|
<!-- WorldGuard & WorldEdit -->
|
||||||
<repository>
|
<repository>
|
||||||
<id>sk89q-repo</id>
|
<id>sk89q-repo</id>
|
||||||
<url>http://maven.sk89q.com/repo/</url>
|
<url>https://maven.enginehub.org/repo/</url>
|
||||||
</repository>
|
</repository>
|
||||||
<repository>
|
<repository>
|
||||||
<id>jitpack.io</id>
|
<id>jitpack.io</id>
|
||||||
@ -234,7 +229,7 @@
|
|||||||
<!-- PlaceholderAPI -->
|
<!-- PlaceholderAPI -->
|
||||||
<repository>
|
<repository>
|
||||||
<id>placeholderapi</id>
|
<id>placeholderapi</id>
|
||||||
<url>http://repo.extendedclip.com/content/repositories/placeholderapi/</url>
|
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
|
||||||
</repository>
|
</repository>
|
||||||
<!-- MyPet -->
|
<!-- MyPet -->
|
||||||
<!--<repository>
|
<!--<repository>
|
||||||
|
@ -74,7 +74,7 @@ public enum CMIEnchantment {
|
|||||||
}
|
}
|
||||||
} catch (Exception | Error e) {
|
} catch (Exception | Error e) {
|
||||||
try {
|
try {
|
||||||
if (one.getKey().toString().split(":")[1].toLowerCase().replace("_", "").equalsIgnoreCase(temp)) {
|
if (one.getKey().toString().split(":", 2)[1].toLowerCase().replace("_", "").equalsIgnoreCase(temp)) {
|
||||||
enchantment = one;
|
enchantment = one;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -104,7 +104,7 @@ public enum CMIEnchantment {
|
|||||||
}
|
}
|
||||||
} catch (Exception | Error e) {
|
} catch (Exception | Error e) {
|
||||||
try {
|
try {
|
||||||
if (one.getKey().toString().split(":")[1].toLowerCase().replace("_", "").equalsIgnoreCase(temp)) {
|
if (one.getKey().toString().split(":", 2)[1].toLowerCase().replace("_", "").equalsIgnoreCase(temp)) {
|
||||||
enchantment = one;
|
enchantment = one;
|
||||||
break en;
|
break en;
|
||||||
}
|
}
|
||||||
@ -160,7 +160,7 @@ public enum CMIEnchantment {
|
|||||||
if (map.isEmpty())
|
if (map.isEmpty())
|
||||||
fillUpMap();
|
fillUpMap();
|
||||||
|
|
||||||
name = name.contains(":") ? name.split(":")[0] : name.contains("-") ? name.split("-")[0] : name;
|
name = name.contains(":") ? name.split(":", 2)[0] : name.contains("-") ? name.split("-", 2)[0] : name;
|
||||||
name = name.toLowerCase().replace("_", "");
|
name = name.toLowerCase().replace("_", "");
|
||||||
return map.get(name);
|
return map.get(name);
|
||||||
}
|
}
|
||||||
@ -168,7 +168,7 @@ public enum CMIEnchantment {
|
|||||||
public static Enchantment getEnchantment(String name) {
|
public static Enchantment getEnchantment(String name) {
|
||||||
if (map.isEmpty())
|
if (map.isEmpty())
|
||||||
fillUpMap();
|
fillUpMap();
|
||||||
name = name.contains(":") ? name.split(":")[0] : name.contains("-") ? name.split("-")[0] : name;
|
name = name.contains(":") ? name.split(":", 2)[0] : name.contains("-") ? name.split("-", 2)[0] : name;
|
||||||
name = name.toLowerCase().replace("_", "");
|
name = name.toLowerCase().replace("_", "");
|
||||||
|
|
||||||
CMIEnchantment ec = map.get(name);
|
CMIEnchantment ec = map.get(name);
|
||||||
|
@ -1366,9 +1366,10 @@ public enum CMIMaterial {
|
|||||||
id = id.replaceAll("_| |minecraft:", "").toLowerCase();
|
id = id.replaceAll("_| |minecraft:", "").toLowerCase();
|
||||||
|
|
||||||
if (id.contains(":")) {
|
if (id.contains(":")) {
|
||||||
|
String[] split = id.split(":", 2);
|
||||||
try {
|
try {
|
||||||
Integer ids = Integer.parseInt(id.split(":")[0]);
|
Integer ids = Integer.parseInt(split[0]);
|
||||||
Integer data = Integer.parseInt(id.split(":")[1]);
|
Integer data = Integer.parseInt(split[1]);
|
||||||
if (ids <= 0)
|
if (ids <= 0)
|
||||||
return CMIMaterial.NONE;
|
return CMIMaterial.NONE;
|
||||||
return get(ids, data);
|
return get(ids, data);
|
||||||
@ -1376,8 +1377,8 @@ public enum CMIMaterial {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Integer data = Integer.parseInt(id.split(":")[1]);
|
Integer data = Integer.parseInt(split[1]);
|
||||||
id = id.split(":")[0];
|
id = split[0];
|
||||||
CMIMaterial mat = ItemManager.byName.get(id + ":" + data);
|
CMIMaterial mat = ItemManager.byName.get(id + ":" + data);
|
||||||
if (mat != null) {
|
if (mat != null) {
|
||||||
return mat;
|
return mat;
|
||||||
|
@ -726,7 +726,7 @@ public class Jobs extends JavaPlugin {
|
|||||||
|
|
||||||
boolean kyoriSupported = false;
|
boolean kyoriSupported = false;
|
||||||
try {
|
try {
|
||||||
Class.forName("net.kyori.adventure.text.Component");
|
Class.forName("net.kyori.adventure.text.serializer.plain.PlainComponentSerializer");
|
||||||
kyoriSupported = true;
|
kyoriSupported = true;
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
}
|
}
|
||||||
@ -980,8 +980,8 @@ public class Jobs extends JavaPlugin {
|
|||||||
if (jobinfo == null)
|
if (jobinfo == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Double income = jobinfo.getIncome(1, numjobs, jPlayer.maxJobsEquation);
|
double income = jobinfo.getIncome(1, numjobs, jPlayer.maxJobsEquation);
|
||||||
Double pointAmount = jobinfo.getPoints(1, numjobs, jPlayer.maxJobsEquation);
|
double pointAmount = jobinfo.getPoints(1, numjobs, jPlayer.maxJobsEquation);
|
||||||
|
|
||||||
if (income == 0D && pointAmount == 0D)
|
if (income == 0D && pointAmount == 0D)
|
||||||
return;
|
return;
|
||||||
|
@ -230,12 +230,15 @@ public class PermissionHandler {
|
|||||||
public void registerPermissions() {
|
public void registerPermissions() {
|
||||||
PluginManager pm = plugin.getServer().getPluginManager();
|
PluginManager pm = plugin.getServer().getPluginManager();
|
||||||
for (World world : plugin.getServer().getWorlds()) {
|
for (World world : plugin.getServer().getWorlds()) {
|
||||||
if (pm.getPermission("jobs.world." + world.getName().toLowerCase()) == null)
|
String worldName = world.getName().toLowerCase();
|
||||||
pm.addPermission(new Permission("jobs.world." + world.getName().toLowerCase(), PermissionDefault.TRUE));
|
if (pm.getPermission("jobs.world." + worldName) == null)
|
||||||
|
pm.addPermission(new Permission("jobs.world." + worldName, PermissionDefault.TRUE));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Job job : Jobs.getJobs()) {
|
for (Job job : Jobs.getJobs()) {
|
||||||
if (pm.getPermission("jobs.join." + job.getName().toLowerCase()) == null)
|
String jobName = job.getName().toLowerCase();
|
||||||
pm.addPermission(new Permission("jobs.join." + job.getName().toLowerCase(), PermissionDefault.TRUE));
|
if (pm.getPermission("jobs.join." + jobName) == null)
|
||||||
|
pm.addPermission(new Permission("jobs.join." + jobName, PermissionDefault.TRUE));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1146,7 +1146,7 @@ public class PlayerManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void autoJoinJobs(final Player player) {
|
public void autoJoinJobs(final Player player) {
|
||||||
if (player == null || player.isOp() || !Jobs.getGCManager().AutoJobJoinUse)
|
if (!Jobs.getGCManager().AutoJobJoinUse || player == null || player.isOp())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Bukkit.getServer().getScheduler().runTaskLater(plugin, new Runnable() {
|
Bukkit.getServer().getScheduler().runTaskLater(plugin, new Runnable() {
|
||||||
@ -1160,14 +1160,15 @@ public class PlayerManager {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
int confMaxJobs = Jobs.getGCManager().getMaxJobs();
|
int confMaxJobs = Jobs.getGCManager().getMaxJobs();
|
||||||
|
short playerMaxJobs = (short) jPlayer.getJobProgression().size();
|
||||||
|
|
||||||
|
if (confMaxJobs > 0 && playerMaxJobs >= confMaxJobs && !getJobsLimit(jPlayer, playerMaxJobs))
|
||||||
|
return;
|
||||||
|
|
||||||
for (Job one : Jobs.getJobs()) {
|
for (Job one : Jobs.getJobs()) {
|
||||||
if (one.getMaxSlots() != null && Jobs.getUsedSlots(one) >= one.getMaxSlots())
|
if (one.getMaxSlots() != null && Jobs.getUsedSlots(one) >= one.getMaxSlots())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
short playerMaxJobs = (short) jPlayer.getJobProgression().size();
|
|
||||||
if (confMaxJobs > 0 && playerMaxJobs >= confMaxJobs && !getJobsLimit(jPlayer, playerMaxJobs))
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (!jPlayer.isInJob(one) && player.hasPermission("jobs.autojoin." + one.getName().toLowerCase()))
|
if (!jPlayer.isInJob(one) && player.hasPermission("jobs.autojoin." + one.getName().toLowerCase()))
|
||||||
joinJob(jPlayer, one);
|
joinJob(jPlayer, one);
|
||||||
}
|
}
|
||||||
|
@ -64,21 +64,22 @@ public class ExploreManager {
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ExploreRespond ChunkRespond(Player player, Chunk chunk) {
|
public ExploreRespond chunkRespond(Player player, Chunk chunk) {
|
||||||
return ChunkRespond(Jobs.getPlayerManager().getJobsPlayer(player).getUserId(), chunk.getWorld().getName(), chunk.getX(), chunk.getZ());
|
return chunkRespond(Jobs.getPlayerManager().getJobsPlayer(player).getUserId(), chunk.getWorld().getName(), chunk.getX(), chunk.getZ());
|
||||||
}
|
}
|
||||||
|
|
||||||
public ExploreRespond ChunkRespond(int playerId, Chunk chunk) {
|
public ExploreRespond chunkRespond(int playerId, Chunk chunk) {
|
||||||
return ChunkRespond(playerId, chunk.getWorld().getName(), chunk.getX(), chunk.getZ());
|
return chunkRespond(playerId, chunk.getWorld().getName(), chunk.getX(), chunk.getZ());
|
||||||
}
|
}
|
||||||
|
|
||||||
public ExploreRespond ChunkRespond(int playerId, String world, int x, int z) {
|
public ExploreRespond chunkRespond(int playerId, String world, int x, int z) {
|
||||||
ExploreRegion eRegions = worlds.get(world);
|
ExploreRegion eRegions = worlds.get(world);
|
||||||
if (eRegions == null) {
|
if (eRegions == null) {
|
||||||
int RegionX = (int) Math.floor(x / 32D);
|
int RegionX = (int) Math.floor(x / 32D);
|
||||||
int RegionZ = (int) Math.floor(z / 32D);
|
int RegionZ = (int) Math.floor(z / 32D);
|
||||||
eRegions = new ExploreRegion(RegionX, RegionZ);
|
eRegions = new ExploreRegion(RegionX, RegionZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
ExploreChunk chunk = eRegions.getChunk(x, z);
|
ExploreChunk chunk = eRegions.getChunk(x, z);
|
||||||
if (chunk == null)
|
if (chunk == null)
|
||||||
chunk = new ExploreChunk();
|
chunk = new ExploreChunk();
|
||||||
|
@ -108,10 +108,6 @@ public class ShopManager {
|
|||||||
gui.setInvSize(guiSize);
|
gui.setInvSize(guiSize);
|
||||||
gui.setTitle(Jobs.getLanguage().getMessage("command.shop.info.title"));
|
gui.setTitle(Jobs.getLanguage().getMessage("command.shop.info.title"));
|
||||||
|
|
||||||
// String title = Jobs.getLanguage().getMessage("command.shop.info.title");
|
|
||||||
// if (title.length() > 32)
|
|
||||||
// title = title.substring(0, 30) + "..";
|
|
||||||
|
|
||||||
JobsPlayer jPlayer = Jobs.getPlayerManager().getJobsPlayer(player);
|
JobsPlayer jPlayer = Jobs.getPlayerManager().getJobsPlayer(player);
|
||||||
|
|
||||||
PlayerPoints pointsInfo = jPlayer.getPointsData();
|
PlayerPoints pointsInfo = jPlayer.getPointsData();
|
||||||
@ -119,8 +115,6 @@ public class ShopManager {
|
|||||||
if (pointsInfo != null)
|
if (pointsInfo != null)
|
||||||
points = (int) (pointsInfo.getCurrentPoints() * 100.0) / 100.0;
|
points = (int) (pointsInfo.getCurrentPoints() * 100.0) / 100.0;
|
||||||
|
|
||||||
// Inventory GuiInv = Bukkit.createInventory(null, GuiSize, title);
|
|
||||||
|
|
||||||
for (int i = 0; i < ls.size(); i++) {
|
for (int i = 0; i < ls.size(); i++) {
|
||||||
ShopItem item = ls.get(i);
|
ShopItem item = ls.get(i);
|
||||||
List<String> lore = new ArrayList<>();
|
List<String> lore = new ArrayList<>();
|
||||||
|
@ -167,7 +167,7 @@ public class Job {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isSame(Job job) {
|
public boolean isSame(Job job) {
|
||||||
return job != null && (fullName.equalsIgnoreCase(job.getName()) || id == job.getId());
|
return job != null && (id == job.getId() || fullName.equalsIgnoreCase(job.getName()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getTotalPlayers() {
|
public int getTotalPlayers() {
|
||||||
@ -200,8 +200,10 @@ public class Job {
|
|||||||
double now = eq.getValue();
|
double now = eq.getValue();
|
||||||
if (now > Jobs.getGCManager().DynamicPaymentMaxBonus)
|
if (now > Jobs.getGCManager().DynamicPaymentMaxBonus)
|
||||||
now = Jobs.getGCManager().DynamicPaymentMaxBonus;
|
now = Jobs.getGCManager().DynamicPaymentMaxBonus;
|
||||||
if (now < Jobs.getGCManager().DynamicPaymentMaxPenalty * -1)
|
|
||||||
now = Jobs.getGCManager().DynamicPaymentMaxPenalty * -1;
|
double maxPenalty = Jobs.getGCManager().DynamicPaymentMaxPenalty * -1;
|
||||||
|
if (now < maxPenalty)
|
||||||
|
now = maxPenalty;
|
||||||
|
|
||||||
this.bonus = (now / 100D);
|
this.bonus = (now / 100D);
|
||||||
}
|
}
|
||||||
@ -258,8 +260,8 @@ public class Job {
|
|||||||
public JobInfo getJobInfo(ActionInfo action, int level) {
|
public JobInfo getJobInfo(ActionInfo action, int level) {
|
||||||
BiPredicate<JobInfo, ActionInfo> condition = (jobInfo, actionInfo) -> {
|
BiPredicate<JobInfo, ActionInfo> condition = (jobInfo, actionInfo) -> {
|
||||||
if (actionInfo instanceof PotionItemActionInfo) {
|
if (actionInfo instanceof PotionItemActionInfo) {
|
||||||
return jobInfo.getName().equalsIgnoreCase(((PotionItemActionInfo) action).getNameWithSub()) ||
|
String subName = ((PotionItemActionInfo) action).getNameWithSub();
|
||||||
(jobInfo.getName() + ":" + jobInfo.getMeta()).equalsIgnoreCase(((PotionItemActionInfo) action).getNameWithSub());
|
return jobInfo.getName().equalsIgnoreCase(subName) || (jobInfo.getName() + ":" + jobInfo.getMeta()).equalsIgnoreCase(subName);
|
||||||
}
|
}
|
||||||
|
|
||||||
return jobInfo.getName().equalsIgnoreCase(action.getNameWithSub()) ||
|
return jobInfo.getName().equalsIgnoreCase(action.getNameWithSub()) ||
|
||||||
|
@ -1183,21 +1183,21 @@ public class JobsPlayer {
|
|||||||
|
|
||||||
for (String one : qprog.split(";:;")) {
|
for (String one : qprog.split(";:;")) {
|
||||||
try {
|
try {
|
||||||
String jname = one.split(":")[0];
|
String jname = one.split(":", 2)[0];
|
||||||
Job job = Jobs.getJob(jname);
|
Job job = Jobs.getJob(jname);
|
||||||
if (job == null)
|
if (job == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
one = one.substring(jname.length() + 1);
|
one = one.substring(jname.length() + 1);
|
||||||
|
|
||||||
String qname = one.split(":")[0];
|
String qname = one.split(":", 2)[0];
|
||||||
Quest quest = job.getQuest(qname);
|
Quest quest = job.getQuest(qname);
|
||||||
if (quest == null)
|
if (quest == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
one = one.substring(qname.length() + 1);
|
one = one.substring(qname.length() + 1);
|
||||||
|
|
||||||
String longS = one.split(":")[0];
|
String longS = one.split(":", 2)[0];
|
||||||
long validUntil = Long.parseLong(longS);
|
long validUntil = Long.parseLong(longS);
|
||||||
one = one.substring(longS.length() + 1);
|
one = one.substring(longS.length() + 1);
|
||||||
|
|
||||||
@ -1216,7 +1216,7 @@ public class JobsPlayer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (String oneA : one.split(":;:")) {
|
for (String oneA : one.split(":;:")) {
|
||||||
String prog = oneA.split(";")[0];
|
String prog = oneA.split(";", 2)[0];
|
||||||
ActionType action = ActionType.getByName(prog);
|
ActionType action = ActionType.getByName(prog);
|
||||||
if (action == null || oneA.length() < prog.length() + 1)
|
if (action == null || oneA.length() < prog.length() + 1)
|
||||||
continue;
|
continue;
|
||||||
@ -1227,14 +1227,14 @@ public class JobsPlayer {
|
|||||||
|
|
||||||
oneA = oneA.substring(prog.length() + 1);
|
oneA = oneA.substring(prog.length() + 1);
|
||||||
|
|
||||||
String target = oneA.split(";")[0];
|
String target = oneA.split(";", 2)[0];
|
||||||
QuestObjective obj = old.get(target);
|
QuestObjective obj = old.get(target);
|
||||||
if (obj == null)
|
if (obj == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
oneA = oneA.substring(target.length() + 1);
|
oneA = oneA.substring(target.length() + 1);
|
||||||
|
|
||||||
qp.setAmountDone(obj, Integer.parseInt(oneA.split(";")[0]));
|
qp.setAmountDone(obj, Integer.parseInt(oneA.split(";", 2)[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qp.isCompleted())
|
if (qp.isCompleted())
|
||||||
|
@ -533,19 +533,18 @@ public class JobsListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void playerInteractEvent(PlayerInteractEvent event) {
|
public void playerInteractEvent(PlayerInteractEvent event) {
|
||||||
Action action = event.getAction();
|
if (event.getAction() == Action.PHYSICAL)
|
||||||
if (action == Action.PHYSICAL)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (action != Action.RIGHT_CLICK_AIR && action != Action.RIGHT_CLICK_BLOCK)
|
if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ArmorTypes newArmorType = ArmorTypes.matchType(event.getItem());
|
ArmorTypes newArmorType = ArmorTypes.matchType(event.getItem());
|
||||||
if (newArmorType == null)
|
if (newArmorType == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Player player = event.getPlayer();
|
PlayerInventory inv = event.getPlayer().getInventory();
|
||||||
PlayerInventory inv = player.getInventory();
|
|
||||||
if (newArmorType == ArmorTypes.HELMET &&
|
if (newArmorType == ArmorTypes.HELMET &&
|
||||||
inv.getHelmet() == null ||
|
inv.getHelmet() == null ||
|
||||||
(newArmorType == ArmorTypes.CHESTPLATE || newArmorType == ArmorTypes.ELYTRA) &&
|
(newArmorType == ArmorTypes.CHESTPLATE || newArmorType == ArmorTypes.ELYTRA) &&
|
||||||
@ -554,15 +553,14 @@ public class JobsListener implements Listener {
|
|||||||
inv.getLeggings() == null ||
|
inv.getLeggings() == null ||
|
||||||
newArmorType == ArmorTypes.BOOTS &&
|
newArmorType == ArmorTypes.BOOTS &&
|
||||||
inv.getBoots() == null) {
|
inv.getBoots() == null) {
|
||||||
JobsArmorChangeEvent armorEquipEvent = new JobsArmorChangeEvent(player, EquipMethod.HOTBAR, ArmorTypes.matchType(event.getItem()), null, event
|
JobsArmorChangeEvent armorEquipEvent = new JobsArmorChangeEvent(event.getPlayer(), EquipMethod.HOTBAR, ArmorTypes.matchType(event.getItem()), null, event
|
||||||
.getItem());
|
.getItem());
|
||||||
plugin.getServer().getPluginManager().callEvent(armorEquipEvent);
|
plugin.getServer().getPluginManager().callEvent(armorEquipEvent);
|
||||||
if (armorEquipEvent.isCancelled()) {
|
if (armorEquipEvent.isCancelled()) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
player.updateInventory();
|
event.getPlayer().updateInventory();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
@ -379,14 +379,14 @@ public class JobsPaymentListener implements Listener {
|
|||||||
if (!player.isOnline())
|
if (!player.isOnline())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// check if in creative
|
|
||||||
if (!payIfCreative(player))
|
|
||||||
return;
|
|
||||||
|
|
||||||
// check if player is riding
|
// check if player is riding
|
||||||
if (Jobs.getGCManager().disablePaymentIfRiding && player.isInsideVehicle())
|
if (Jobs.getGCManager().disablePaymentIfRiding && player.isInsideVehicle())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// check if in creative
|
||||||
|
if (!payIfCreative(player))
|
||||||
|
return;
|
||||||
|
|
||||||
// Remove block owner ships
|
// Remove block owner ships
|
||||||
plugin.getBlockOwnerShips().forEach(os -> os.remove(block));
|
plugin.getBlockOwnerShips().forEach(os -> os.remove(block));
|
||||||
|
|
||||||
@ -408,14 +408,12 @@ public class JobsPaymentListener implements Listener {
|
|||||||
if (!payForItemDurabilityLoss(player))
|
if (!payForItemDurabilityLoss(player))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Protection for block break with silktouch
|
||||||
ItemStack item = Jobs.getNms().getItemInMainHand(player);
|
ItemStack item = Jobs.getNms().getItemInMainHand(player);
|
||||||
if (item.getType() != Material.AIR) {
|
if (Jobs.getGCManager().useSilkTouchProtection && item.getType() != Material.AIR) {
|
||||||
// Protection for block break with silktouch
|
for (Enchantment one : item.getEnchantments().keySet()) {
|
||||||
if (Jobs.getGCManager().useSilkTouchProtection) {
|
if (CMIEnchantment.get(one) == CMIEnchantment.SILK_TOUCH && Jobs.getBpManager().isInBp(block)) {
|
||||||
for (Enchantment one : item.getEnchantments().keySet()) {
|
return;
|
||||||
if (CMIEnchantment.get(one) == CMIEnchantment.SILK_TOUCH && Jobs.getBpManager().isInBp(block)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -434,12 +432,16 @@ public class JobsPaymentListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
public void onBlockPlace(BlockPlaceEvent event) {
|
public void onBlockPlace(BlockPlaceEvent event) {
|
||||||
|
// check to make sure you can build
|
||||||
|
if (!event.canBuild())
|
||||||
|
return;
|
||||||
|
|
||||||
// A tool should not trigger a BlockPlaceEvent (fixes stripping logs bug #940)
|
// A tool should not trigger a BlockPlaceEvent (fixes stripping logs bug #940)
|
||||||
if (CMIMaterial.get(event.getItemInHand().getType()).isTool())
|
if (CMIMaterial.get(event.getItemInHand().getType()).isTool())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// check to make sure you can build
|
Player player = event.getPlayer();
|
||||||
if (!event.canBuild())
|
if (!player.isOnline())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Block block = event.getBlock();
|
Block block = event.getBlock();
|
||||||
@ -447,14 +449,14 @@ public class JobsPaymentListener implements Listener {
|
|||||||
if (!Jobs.getGCManager().canPerformActionInWorld(block.getWorld()))
|
if (!Jobs.getGCManager().canPerformActionInWorld(block.getWorld()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
if (!player.isOnline())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (Version.isCurrentEqualOrLower(Version.v1_12_R1)
|
if (Version.isCurrentEqualOrLower(Version.v1_12_R1)
|
||||||
&& ItemManager.getItem(event.getItemInHand()).isSimilar(CMIMaterial.BONE_MEAL.newCMIItemStack()))
|
&& ItemManager.getItem(event.getItemInHand()).isSimilar(CMIMaterial.BONE_MEAL.newCMIItemStack()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// check if player is riding
|
||||||
|
if (Jobs.getGCManager().disablePaymentIfRiding && player.isInsideVehicle())
|
||||||
|
return;
|
||||||
|
|
||||||
// check if in creative
|
// check if in creative
|
||||||
if (!payIfCreative(player))
|
if (!payIfCreative(player))
|
||||||
return;
|
return;
|
||||||
@ -462,10 +464,6 @@ public class JobsPaymentListener implements Listener {
|
|||||||
if (!Jobs.getPermissionHandler().hasWorldPermission(player, player.getLocation().getWorld().getName()))
|
if (!Jobs.getPermissionHandler().hasWorldPermission(player, player.getLocation().getWorld().getName()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// check if player is riding
|
|
||||||
if (Jobs.getGCManager().disablePaymentIfRiding && player.isInsideVehicle())
|
|
||||||
return;
|
|
||||||
|
|
||||||
Jobs.action(Jobs.getPlayerManager().getJobsPlayer(player), new BlockActionInfo(block, ActionType.PLACE), block);
|
Jobs.action(Jobs.getPlayerManager().getJobsPlayer(player), new BlockActionInfo(block, ActionType.PLACE), block);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -566,9 +564,6 @@ public class JobsPaymentListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
public void onInventoryCraft(CraftItemEvent event) {
|
public void onInventoryCraft(CraftItemEvent event) {
|
||||||
if (!Jobs.getGCManager().canPerformActionInWorld(event.getWhoClicked().getWorld()))
|
|
||||||
return;
|
|
||||||
|
|
||||||
// If event is nothing or place, do nothing
|
// If event is nothing or place, do nothing
|
||||||
switch (event.getAction()) {
|
switch (event.getAction()) {
|
||||||
case NOTHING:
|
case NOTHING:
|
||||||
@ -583,6 +578,12 @@ public class JobsPaymentListener implements Listener {
|
|||||||
if (event.getSlotType() != SlotType.RESULT)
|
if (event.getSlotType() != SlotType.RESULT)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!event.isLeftClick() && !event.isRightClick())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!Jobs.getGCManager().canPerformActionInWorld(event.getWhoClicked().getWorld()))
|
||||||
|
return;
|
||||||
|
|
||||||
ItemStack resultStack = event.getRecipe().getResult();
|
ItemStack resultStack = event.getRecipe().getResult();
|
||||||
|
|
||||||
if (!(event.getWhoClicked() instanceof Player))
|
if (!(event.getWhoClicked() instanceof Player))
|
||||||
@ -603,9 +604,6 @@ public class JobsPaymentListener implements Listener {
|
|||||||
if (Jobs.getGCManager().disablePaymentIfRiding && player.isInsideVehicle())
|
if (Jobs.getGCManager().disablePaymentIfRiding && player.isInsideVehicle())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!event.isLeftClick() && !event.isRightClick())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// check if in creative
|
// check if in creative
|
||||||
if (!payIfCreative(player))
|
if (!payIfCreative(player))
|
||||||
return;
|
return;
|
||||||
@ -1083,7 +1081,7 @@ public class JobsPaymentListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||||
public void onEntityDamageByPlayer(EntityDamageEvent event) {
|
public void onEntityDamageByPlayer(EntityDamageEvent event) {
|
||||||
if (!Jobs.getGCManager().canPerformActionInWorld(event.getEntity().getWorld()) || !Jobs.getGCManager().MonsterDamageUse)
|
if (!Jobs.getGCManager().MonsterDamageUse || !Jobs.getGCManager().canPerformActionInWorld(event.getEntity().getWorld()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Entity ent = event.getEntity();
|
Entity ent = event.getEntity();
|
||||||
@ -1098,14 +1096,12 @@ public class JobsPaymentListener implements Listener {
|
|||||||
if (damage > s)
|
if (damage > s)
|
||||||
damage = s;
|
damage = s;
|
||||||
|
|
||||||
if (Jobs.getGCManager().MonsterDamageUse) {
|
UUID entUUID = ent.getUniqueId();
|
||||||
UUID entUUID = ent.getUniqueId();
|
Double damageDealt = damageDealtByPlayers.getIfPresent(entUUID);
|
||||||
Double damageDealt = damageDealtByPlayers.getIfPresent(entUUID);
|
if (damageDealt != null) {
|
||||||
if (damageDealt != null) {
|
damageDealtByPlayers.put(entUUID, damageDealt + damage);
|
||||||
damageDealtByPlayers.put(entUUID, damageDealt + damage);
|
} else {
|
||||||
} else {
|
damageDealtByPlayers.put(entUUID, damage);
|
||||||
damageDealtByPlayers.put(entUUID, 0.0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1116,13 +1112,12 @@ public class JobsPaymentListener implements Listener {
|
|||||||
|
|
||||||
Entity ent = event.getEntity();
|
Entity ent = event.getEntity();
|
||||||
UUID entUUID = ent.getUniqueId();
|
UUID entUUID = ent.getUniqueId();
|
||||||
Entity damager = event.getDamager();
|
if (ent instanceof org.bukkit.entity.EnderCrystal && event.getDamager() instanceof Player) {
|
||||||
if (ent instanceof org.bukkit.entity.EnderCrystal && damager instanceof Player) {
|
|
||||||
punchedEndCrystals.put(entUUID, ent);
|
punchedEndCrystals.put(entUUID, ent);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(damager instanceof Projectile) || !(ent instanceof Damageable))
|
if (!Jobs.getGCManager().MonsterDamageUse || !(event.getDamager() instanceof Projectile) || !(ent instanceof Damageable))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
double damage = event.getFinalDamage();
|
double damage = event.getFinalDamage();
|
||||||
@ -1131,12 +1126,12 @@ public class JobsPaymentListener implements Listener {
|
|||||||
if (damage > s)
|
if (damage > s)
|
||||||
damage = s;
|
damage = s;
|
||||||
|
|
||||||
if (Jobs.getGCManager().MonsterDamageUse && ((Projectile) damager).getShooter() instanceof Player) {
|
if (((Projectile) event.getDamager()).getShooter() instanceof Player) {
|
||||||
Double damageDealt = damageDealtByPlayers.getIfPresent(entUUID);
|
Double damageDealt = damageDealtByPlayers.getIfPresent(entUUID);
|
||||||
if (damageDealt != null) {
|
if (damageDealt != null) {
|
||||||
damageDealtByPlayers.put(entUUID, damageDealt + damage);
|
damageDealtByPlayers.put(entUUID, damageDealt + damage);
|
||||||
} else {
|
} else {
|
||||||
damageDealtByPlayers.put(entUUID, 0.0);
|
damageDealtByPlayers.put(entUUID, damage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1278,12 +1273,9 @@ public class JobsPaymentListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
public void onCreatureSpawn(CreatureSpawnEvent event) {
|
public void onCreatureSpawn(CreatureSpawnEvent event) {
|
||||||
if (!Jobs.getGCManager().canPerformActionInWorld(event.getEntity().getWorld()))
|
if ((event.getSpawnReason() == SpawnReason.SPAWNER || event.getSpawnReason() == SpawnReason.SPAWNER_EGG)
|
||||||
return;
|
&& Jobs.getGCManager().canPerformActionInWorld(event.getEntity().getWorld())) {
|
||||||
|
event.getEntity().setMetadata(Jobs.getPlayerManager().getMobSpawnerMetadata(), new FixedMetadataValue(plugin, true));
|
||||||
if (event.getSpawnReason() == SpawnReason.SPAWNER || event.getSpawnReason() == SpawnReason.SPAWNER_EGG) {
|
|
||||||
LivingEntity creature = event.getEntity();
|
|
||||||
creature.setMetadata(Jobs.getPlayerManager().getMobSpawnerMetadata(), new FixedMetadataValue(plugin, true));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1437,11 +1429,10 @@ public class JobsPaymentListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
public void onCreatureBreed(CreatureSpawnEvent event) {
|
public void onCreatureBreed(CreatureSpawnEvent event) {
|
||||||
if (!Jobs.getGCManager().canPerformActionInWorld(event.getEntity().getWorld()) || !Jobs.getGCManager().useBreederFinder)
|
if (!Jobs.getGCManager().useBreederFinder || !Jobs.getGCManager().canPerformActionInWorld(event.getEntity().getWorld()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SpawnReason reason = event.getSpawnReason();
|
if (!event.getSpawnReason().toString().equalsIgnoreCase("BREEDING") && !event.getSpawnReason().toString().equalsIgnoreCase("EGG"))
|
||||||
if (!reason.toString().equalsIgnoreCase("BREEDING") && !reason.toString().equalsIgnoreCase("EGG"))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LivingEntity animal = event.getEntity();
|
LivingEntity animal = event.getEntity();
|
||||||
@ -1478,15 +1469,12 @@ public class JobsPaymentListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
public void onPlayerEat(FoodLevelChangeEvent event) {
|
public void onPlayerEat(FoodLevelChangeEvent event) {
|
||||||
if (!Jobs.getGCManager().canPerformActionInWorld(event.getEntity().getWorld()))
|
if (!(event.getEntity() instanceof Player) || !Jobs.getGCManager().canPerformActionInWorld(event.getEntity().getWorld())
|
||||||
return;
|
|| event.getEntity().hasMetadata("NPC"))
|
||||||
|
|
||||||
if (!(event.getEntity() instanceof Player) || event.getEntity().hasMetadata("NPC")
|
|
||||||
|| event.getFoodLevel() <= ((Player) event.getEntity()).getFoodLevel())
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Player player = (Player) event.getEntity();
|
Player player = (Player) event.getEntity();
|
||||||
if (!player.isOnline())
|
if (!player.isOnline() || event.getFoodLevel() <= player.getFoodLevel())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// check if in creative
|
// check if in creative
|
||||||
@ -1703,11 +1691,11 @@ public class JobsPaymentListener implements Listener {
|
|||||||
if (jPlayer == null)
|
if (jPlayer == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ExploreRespond respond = Jobs.getExplore().ChunkRespond(jPlayer.getUserId(), event.getNewChunk());
|
ExploreRespond respond = Jobs.getExplore().chunkRespond(jPlayer.getUserId(), event.getNewChunk());
|
||||||
if (!respond.isNewChunk())
|
if (!respond.isNewChunk())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Jobs.action(jPlayer, new ExploreActionInfo(String.valueOf(respond.getCount()), ActionType.EXPLORE));
|
Jobs.action(jPlayer, new ExploreActionInfo(Integer.toString(respond.getCount()), ActionType.EXPLORE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOWEST)
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
@ -1743,7 +1731,8 @@ public class JobsPaymentListener implements Listener {
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
for (Entry<Enchantment, Integer> oneG : got.entrySet()) {
|
for (Entry<Enchantment, Integer> oneG : got.entrySet()) {
|
||||||
if (!hand.getEnchantments().containsKey(oneG.getKey()) || hand.getEnchantments().get(oneG.getKey()).equals(oneG.getValue()))
|
Map<Enchantment, Integer> map = hand.getEnchantments();
|
||||||
|
if (!map.containsKey(oneG.getKey()) || map.get(oneG.getKey()).equals(oneG.getValue()))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,8 +17,8 @@ public class PistonProtectionListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
public void onBlockMove(BlockPistonExtendEvent event) {
|
public void onBlockMove(BlockPistonExtendEvent event) {
|
||||||
if (event.isCancelled() || !Jobs.getGCManager().canPerformActionInWorld(event.getBlock().getWorld())
|
if (!Jobs.getGCManager().useBlockProtection || event.isCancelled()
|
||||||
|| !Jobs.getGCManager().useBlockProtection)
|
|| !Jobs.getGCManager().canPerformActionInWorld(event.getBlock().getWorld()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
BlockFace dir = event.getDirection();
|
BlockFace dir = event.getDirection();
|
||||||
@ -39,8 +39,8 @@ public class PistonProtectionListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
public void onBlockRetractMove(BlockPistonRetractEvent event) {
|
public void onBlockRetractMove(BlockPistonRetractEvent event) {
|
||||||
if (event.isCancelled() || !Jobs.getGCManager().canPerformActionInWorld(event.getBlock().getWorld())
|
if (!Jobs.getGCManager().useBlockProtection || event.isCancelled()
|
||||||
|| !Jobs.getGCManager().useBlockProtection)
|
|| !Jobs.getGCManager().canPerformActionInWorld(event.getBlock().getWorld()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
BlockFace dir = event.getDirection();
|
BlockFace dir = event.getDirection();
|
||||||
|
@ -27,8 +27,9 @@ public class ToggleBarHandling {
|
|||||||
|
|
||||||
if (section != null) {
|
if (section != null) {
|
||||||
for (String one : section.getKeys(false)) {
|
for (String one : section.getKeys(false)) {
|
||||||
if (!section.getBoolean(one)) {
|
boolean boo = section.getBoolean(one);
|
||||||
bossBarToggle.put(one, section.getBoolean(one));
|
if (!boo) {
|
||||||
|
bossBarToggle.put(one, boo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -39,8 +40,9 @@ public class ToggleBarHandling {
|
|||||||
|
|
||||||
if (section != null) {
|
if (section != null) {
|
||||||
for (String one : section.getKeys(false)) {
|
for (String one : section.getKeys(false)) {
|
||||||
if (!section.getBoolean(one)) {
|
boolean boo = section.getBoolean(one);
|
||||||
actionBarToggle.put(one, section.getBoolean(one));
|
if (!boo) {
|
||||||
|
actionBarToggle.put(one, boo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ import com.gamingmesh.jobs.container.JobsPlayer;
|
|||||||
import com.gamingmesh.jobs.stuff.Util;
|
import com.gamingmesh.jobs.stuff.Util;
|
||||||
|
|
||||||
import io.papermc.paper.event.player.AsyncChatEvent;
|
import io.papermc.paper.event.player.AsyncChatEvent;
|
||||||
|
import net.kyori.adventure.text.TextReplacementConfig;
|
||||||
|
|
||||||
public final class KyoriChatEvent extends Complement2 implements Listener {
|
public final class KyoriChatEvent extends Complement2 implements Listener {
|
||||||
|
|
||||||
@ -48,11 +49,10 @@ public final class KyoriChatEvent extends Complement2 implements Listener {
|
|||||||
// chat plugins, like Essentials
|
// chat plugins, like Essentials
|
||||||
// Now there is a parameter "player", so literally we need to add 800+ chat plugins
|
// Now there is a parameter "player", so literally we need to add 800+ chat plugins
|
||||||
// to this plugin as dependency?
|
// to this plugin as dependency?
|
||||||
event.composer((player, displayName, msg) -> {
|
// 3rd attempt: now we tried to use text replacement config builder to match the variable
|
||||||
String newMessage = serialize(msg);
|
// result: instead of replacing the variable, now the chat message never been sent
|
||||||
newMessage = newMessage.replace("{jobs}", h);
|
event.composer((player, displayName, msg) -> msg
|
||||||
return deserialize(newMessage);
|
.replaceText(TextReplacementConfig.builder().match("{jobs}").once().replacement(h).build()));
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Changing chat prefix variable to job name
|
// Changing chat prefix variable to job name
|
||||||
@ -73,10 +73,7 @@ public final class KyoriChatEvent extends Complement2 implements Listener {
|
|||||||
honorific = "";
|
honorific = "";
|
||||||
|
|
||||||
final String h = honorific;
|
final String h = honorific;
|
||||||
event.composer((player, displayName, msg) -> {
|
event.composer((player, displayName, msg) -> msg
|
||||||
String newMessage = serialize(msg);
|
.replaceText(TextReplacementConfig.builder().match("{jobs}").once().replacement(h).build()));
|
||||||
newMessage = newMessage.replace("{jobs}", h);
|
|
||||||
return deserialize(newMessage);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user