Compare commits

..

5 Commits

Author SHA1 Message Date
jakub 8f734eb1d1 - funkční region command 5 days ago
jakub 71f8b0eaf4 - funkční region command 1 week ago
jakub f355dcfa1e - licence 2 weeks ago
jakub e70e526d93 - Opravy DAO 3 weeks ago
jakub 87e7962028 -Odstraněn dao manager a funkce předány příslušným objektům 3 weeks ago
  1. 19
      LICENSE.txt
  2. 60
      src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java
  3. 89
      src/main/java/xyz/soukup/ecoCraftCore/database/DaoRegistry.java
  4. 213
      src/main/java/xyz/soukup/ecoCraftCore/database/objects/Region.java
  5. 65
      src/main/java/xyz/soukup/ecoCraftCore/database/objects/RegionMember.java
  6. 81
      src/main/java/xyz/soukup/ecoCraftCore/genericMenus/GroupSelector.java
  7. 67
      src/main/java/xyz/soukup/ecoCraftCore/genericMenus/PlayerSelector.java
  8. 36
      src/main/java/xyz/soukup/ecoCraftCore/genericMenus/TextInput.java
  9. 42
      src/main/java/xyz/soukup/ecoCraftCore/gui/GuiItemBuilder.java
  10. 13
      src/main/java/xyz/soukup/ecoCraftCore/islands/DatabaseIslandLoader.java
  11. 18
      src/main/java/xyz/soukup/ecoCraftCore/islands/IslandAdminCommand.java
  12. 16
      src/main/java/xyz/soukup/ecoCraftCore/islands/IslandManager.java
  13. 30
      src/main/java/xyz/soukup/ecoCraftCore/islands/IslandSelectorCommand.java
  14. 4
      src/main/java/xyz/soukup/ecoCraftCore/islands/UnloadIsland.java
  15. 75
      src/main/java/xyz/soukup/ecoCraftCore/messages/LangManager.java
  16. 4
      src/main/java/xyz/soukup/ecoCraftCore/messages/PHHM.java
  17. 23
      src/main/java/xyz/soukup/ecoCraftCore/messages/Replace.java
  18. 18
      src/main/java/xyz/soukup/ecoCraftCore/mines/MineCommand.java
  19. 2
      src/main/java/xyz/soukup/ecoCraftCore/mines/MineWorldManager.java
  20. 28
      src/main/java/xyz/soukup/ecoCraftCore/money/MoneyCommand.java
  21. 37
      src/main/java/xyz/soukup/ecoCraftCore/objects/Account.java
  22. 20
      src/main/java/xyz/soukup/ecoCraftCore/objects/ActiveServer.java
  23. 31
      src/main/java/xyz/soukup/ecoCraftCore/objects/Island.java
  24. 43
      src/main/java/xyz/soukup/ecoCraftCore/objects/Permission.java
  25. 228
      src/main/java/xyz/soukup/ecoCraftCore/objects/PermissionGroup.java
  26. 469
      src/main/java/xyz/soukup/ecoCraftCore/objects/Region.java
  27. 90
      src/main/java/xyz/soukup/ecoCraftCore/objects/RegionMember.java
  28. 20
      src/main/java/xyz/soukup/ecoCraftCore/objects/Shop.java
  29. 16
      src/main/java/xyz/soukup/ecoCraftCore/objects/Status.java
  30. 19
      src/main/java/xyz/soukup/ecoCraftCore/objects/TeleportRequest.java
  31. 18
      src/main/java/xyz/soukup/ecoCraftCore/objects/Transaction.java
  32. 26
      src/main/java/xyz/soukup/ecoCraftCore/objects/VirtualChest.java
  33. 2
      src/main/java/xyz/soukup/ecoCraftCore/player/PreparePlayer.java
  34. 7
      src/main/java/xyz/soukup/ecoCraftCore/player/TeleportRequestsHandler.java
  35. 4
      src/main/java/xyz/soukup/ecoCraftCore/positionMarker/MarkerCommand.java
  36. 10
      src/main/java/xyz/soukup/ecoCraftCore/positionMarker/MarkerEvent.java
  37. 19
      src/main/java/xyz/soukup/ecoCraftCore/regions/RegionAdminCommand.java
  38. 448
      src/main/java/xyz/soukup/ecoCraftCore/regions/RegionCommand.java
  39. 266
      src/main/java/xyz/soukup/ecoCraftCore/regions/RegionEvents.java
  40. 399
      src/main/java/xyz/soukup/ecoCraftCore/regions/RegionManager.java
  41. 185
      src/main/java/xyz/soukup/ecoCraftCore/regions/RegionMenu.java
  42. 16
      src/main/java/xyz/soukup/ecoCraftCore/shop/ShopCommand.java
  43. 64
      src/main/java/xyz/soukup/ecoCraftCore/shop/ShopLogic.java
  44. 28
      src/main/java/xyz/soukup/ecoCraftCore/sign/SignEditCommand.java
  45. 8
      src/main/java/xyz/soukup/ecoCraftCore/sit/LetMeSit.java
  46. 11
      src/main/java/xyz/soukup/ecoCraftCore/virtualChest/VirtualChestLogic.java
  47. 81
      src/main/resources/messages.yml

@ -0,0 +1,19 @@
Copyright (c) 2025-2026 Jakub Soukup, Erik Radovan and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, but NOT including the right to run, execute or use the
Software or any executable binaries built from the source code.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE

@ -1,3 +1,25 @@
/*
ECOCRAFT CORE
(c) 2025-2026 Jakub Soukup, Erik Radovan and contributors
This software is licensed under Passive Aggressive License
*/
package xyz.soukup.ecoCraftCore;
import com.github.retrooper.packetevents.event.EventManager;
@ -21,29 +43,24 @@ import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import xyz.soukup.ecoCraftCore.database.objects.*;
import xyz.soukup.ecoCraftCore.islands.IslandAdminCommand;
import xyz.soukup.ecoCraftCore.islands.IslandSelectorCommand;
import xyz.soukup.ecoCraftCore.messages.JoinLeaveMessageSupress;
import xyz.soukup.ecoCraftCore.mines.MineCommand;
import xyz.soukup.ecoCraftCore.mines.MineWorldManager;
import xyz.soukup.ecoCraftCore.money.MoneyCommand;
import xyz.soukup.ecoCraftCore.objects.*;
import xyz.soukup.ecoCraftCore.player.OnKill;
import xyz.soukup.ecoCraftCore.player.PreparePlayer;
import xyz.soukup.ecoCraftCore.player.TeleportRequestsHandler;
import xyz.soukup.ecoCraftCore.positionMarker.MarkerCommand;
import xyz.soukup.ecoCraftCore.regions.RegionAdminCommand;
import xyz.soukup.ecoCraftCore.regions.RegionCommand;
import xyz.soukup.ecoCraftCore.regions.RegionEvents;
import xyz.soukup.ecoCraftCore.shop.ShopCommand;
import xyz.soukup.ecoCraftCore.database.objects.Account;
import xyz.soukup.ecoCraftCore.database.objects.Island;
import xyz.soukup.ecoCraftCore.database.objects.Shop;
import xyz.soukup.ecoCraftCore.database.objects.Transaction;
import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents;
import xyz.soukup.ecoCraftCore.database.objects.VirtualChest;
import xyz.soukup.ecoCraftCore.positionMarker.MarkerEvent;
import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import xyz.soukup.ecoCraftCore.shop.ShopLogic;
import xyz.soukup.ecoCraftCore.sign.SignEditCommand;
import xyz.soukup.ecoCraftCore.sit.LetMeSit;
@ -83,7 +100,7 @@ public final class EcoCraftCore extends JavaPlugin {
try {
plugin.saveConfig();
saveIslandTemplates();
Messages.init();
LangManager.init();
prepareDatabase();
registerCommands();
registerEvents();
@ -158,7 +175,7 @@ public final class EcoCraftCore extends JavaPlugin {
Bukkit.unloadWorld(world, true);
getLogger().info("Unloading world " + world.getName() + " due to inactivity");
try {
UpdateBuilder<Island, Integer> updateBuilder = DaoRegistry.getIslandDao().updateBuilder();
UpdateBuilder<Island, Integer> updateBuilder = Island.getDao().updateBuilder();
updateBuilder.where().eq("uuid", world.getName());
updateBuilder.updateColumnValue("active_on", "");
updateBuilder.update();
@ -188,7 +205,7 @@ public final class EcoCraftCore extends JavaPlugin {
}
try {
UpdateBuilder<Island, Integer> updateBuilder = DaoRegistry.getIslandDao().updateBuilder();
UpdateBuilder<Island, Integer> updateBuilder = Island.getDao().updateBuilder();
updateBuilder.where().eq("active_on", config.getString("server.name"));
updateBuilder.updateColumnValue("active_on", "");
updateBuilder.update();
@ -238,16 +255,18 @@ public final class EcoCraftCore extends JavaPlugin {
TableUtils.createTableIfNotExists(connectionSource, TeleportRequest.class);
TableUtils.createTableIfNotExists(connectionSource, Region.class);
TableUtils.createTableIfNotExists(connectionSource, RegionMember.class);
TableUtils.createTableIfNotExists(connectionSource, PermissionGroup.class);
DaoRegistry.setActiveServerDao(DaoManager.createDao(connectionSource, ActiveServer.class));
DaoRegistry.setTransactionDao(DaoManager.createDao(connectionSource, Transaction.class));
DaoRegistry.setIslandDaoo(DaoManager.createDao(connectionSource, Island.class));
DaoRegistry.setShopDao(DaoManager.createDao(connectionSource, Shop.class));
DaoRegistry.setVirtualChestDao(DaoManager.createDao(connectionSource, VirtualChest.class));
DaoRegistry.setAccountDao(DaoManager.createDao(connectionSource, Account.class));
DaoRegistry.setTeleportRequestsDao(DaoManager.createDao(connectionSource, TeleportRequest.class));
DaoRegistry.setRegionDao(DaoManager.createDao(connectionSource, Region.class));
DaoRegistry.setRegionMemberDao(DaoManager.createDao(connectionSource, RegionMember.class));
ActiveServer.setDao(DaoManager.createDao(connectionSource, ActiveServer.class));
Transaction.setDao(DaoManager.createDao(connectionSource, Transaction.class));
Shop.setDao(DaoManager.createDao(connectionSource, Shop.class));
VirtualChest.setDao(DaoManager.createDao(connectionSource, VirtualChest.class));
Account.setDao(DaoManager.createDao(connectionSource, Account.class));
Island.setDao(DaoManager.createDao(connectionSource, Island.class));
TeleportRequest.setDao(DaoManager.createDao(connectionSource, TeleportRequest.class));
Region.setDao(DaoManager.createDao(connectionSource, Region.class));
RegionMember.setDao(DaoManager.createDao(connectionSource, RegionMember.class));
PermissionGroup.setDao(DaoManager.createDao(connectionSource, PermissionGroup.class));
ActiveServer activeServer = new ActiveServer(config.getString("server.name"));
@ -290,6 +309,7 @@ public final class EcoCraftCore extends JavaPlugin {
lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(MoneyCommand.getCommand().build()));
lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(MineCommand.createCommand().build()));
lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(SignEditCommand.getCommand().build()));
lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(RegionCommand.command().build()));
}
private void registerEvents(){

@ -1,89 +0,0 @@
package xyz.soukup.ecoCraftCore.database;
import com.j256.ormlite.dao.Dao;
import xyz.soukup.ecoCraftCore.database.objects.*;
import xyz.soukup.ecoCraftCore.database.objects.VirtualChest;
public class DaoRegistry {
private static Dao<Shop, Integer> shopDao;
private static Dao<Transaction, Integer> transactionDao;
private static Dao<VirtualChest, Integer> virtualChestDao;
private static Dao<Account, Integer> accountDao;
private static Dao<Island, Integer> islandDao;
private static Dao<TeleportRequest, Integer> teleportRequestsDao;
private static Dao<ActiveServer, Integer> activeServerDao;
private static Dao<Region, Integer> regionDao;
private static Dao<RegionMember, Integer> regionMemberDao;
public static Dao<RegionMember, Integer> getRegionMemberDao() {
return regionMemberDao;
}
public static void setRegionMemberDao(Dao<RegionMember, Integer> regionMemberDao) {
DaoRegistry.regionMemberDao = regionMemberDao;
}
public static Dao<Region, Integer> getRegionDao() {
return regionDao;
}
public static void setRegionDao(Dao<Region, Integer> regionDao) {
DaoRegistry.regionDao = regionDao;
}
public static Dao<TeleportRequest, Integer> getTeleportRequestsDao() {
return teleportRequestsDao;
}
public static void setTeleportRequestsDao(Dao<TeleportRequest, Integer> teleportRequestsDao) {
DaoRegistry.teleportRequestsDao = teleportRequestsDao;
}
public static Dao<ActiveServer, Integer> getActiveServerDao() {
return activeServerDao;
}
public static void setActiveServerDao(Dao<ActiveServer, Integer> activeServerDao) {
DaoRegistry.activeServerDao = activeServerDao;
}
public static Dao<Shop, Integer> getShopDao() {
return shopDao;
}
public static void setShopDao(Dao<Shop, Integer> shopDao) {
DaoRegistry.shopDao = shopDao;
}
public static Dao<Transaction, Integer> getTransactionDao() {
return transactionDao;
}
public static void setTransactionDao(Dao<Transaction, Integer> transactionDao) {
DaoRegistry.transactionDao = transactionDao;
}
public static Dao<VirtualChest, Integer> getVirtualChestDao() {
return virtualChestDao;
}
public static void setVirtualChestDao(Dao<VirtualChest, Integer> virtualChestDao) {
DaoRegistry.virtualChestDao = virtualChestDao;
}
public static Dao<Account, Integer> getAccountDao() {
return accountDao;
}
public static void setAccountDao(Dao<Account, Integer> accountDao) {
DaoRegistry.accountDao = accountDao;
}
public static Dao<Island, Integer> getIslandDao() {
return islandDao;
}
public static void setIslandDaoo(Dao<Island, Integer> islandDao) {
DaoRegistry.islandDao = islandDao;
}
}

@ -1,213 +0,0 @@
package xyz.soukup.ecoCraftCore.database.objects;
import com.j256.ormlite.dao.ForeignCollection;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.field.ForeignCollectionField;
import com.j256.ormlite.table.DatabaseTable;
import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import java.util.HashMap;
import java.util.List;
@DatabaseTable(tableName = "regions")
public class Region {
public static final HashMap<String, List<Region>> cache = new HashMap<>();
@DatabaseField(generatedId = true)
private int id;
@DatabaseField(canBeNull = false)
private String island;
@DatabaseField(columnName = "region_type", canBeNull = false)
private int regionType;
@DatabaseField(canBeNull = false)
private int x1;
@DatabaseField(canBeNull = false)
private int y1;
@DatabaseField(canBeNull = false)
private int z1;
@DatabaseField(canBeNull = false)
private int x2;
@DatabaseField(canBeNull = false)
private int y2;
@DatabaseField(canBeNull = false)
private int z2;
@ForeignCollectionField(eager = true)
private ForeignCollection<RegionMember> regionMembers;
@DatabaseField()
private Integer value;
public Region() {
}
public Region(String island, int regionType, int x1, int y1, int z1, int x2, int y2, int z2) {
this.island = island;
this.regionType = regionType;
this.x1 = Math.min(x1, x2);
this.y1 = Math.min(y1, y2);
this.x2 = Math.max(x1, x2);
this.y2 = Math.max(y1, y2);
this.z1 = Math.min(z1, z2);
this.z2 = Math.max(z1, z2);
}
public int getId() {
return id;
}
public int getRegionType() {
return regionType;
}
public int getX1() {
return x1;
}
public int getZ1() {
return z1;
}
public int getZ2() {
return z2;
}
public int getY1() {
return y1;
}
public int getX2() {
return x2;
}
public int getY2() {
return y2;
}
public ForeignCollection<RegionMember> getRegionMembers() {
return regionMembers;
}
public Integer getValue() {
return value;
}
public String getIsland() {
return island;
}
public void setRegionType(int regionType) {
this.regionType = regionType;
}
public void setValue(Integer value) {
this.value = value;
}
public void save(){
try {
DaoRegistry.getRegionDao().createOrUpdate(this);
List<Region> regions = cache.get(island);
if (regions == null) {
return;
}
regions.removeIf(region -> region.getId() == this.id);
regions.add(this);
} catch (Exception e) {
e.printStackTrace();
}
}
public void addRegionMember(String memberType, String member, String membershipType){
RegionMember regionMember = new RegionMember(this, memberType, member, membershipType);
regionMember.save();
Region updatedRegion = Region.findById(this.id);
List<Region> regions = cache.get(island);
if (regions == null) {
return;
}
regions.removeIf(region -> region.getId() == this.id);
regions.add(updatedRegion);
}
public boolean isInside(int x, int y, int z) {
return x >= this.x1 && x <= this.x2 && y >= this.y1 && y <= this.y2 && z >= this.z1 && z <= this.z2;
}
public static Region findById(int id) {
try {
return DaoRegistry.getRegionDao().queryForId(id);
} catch (Exception e) {
return null;
}
}
public static void cacheRegions(String island) {
try {
List<Region> regions = DaoRegistry.getRegionDao().queryBuilder()
.where()
.eq("island", island)
.query();
cache.put(island, regions);
} catch (Exception e) {
}
}
public static Region findRegion(int x, int y, int z, String island) {
Region region = null;
int highestType = -1;
if (!cache.containsKey(island)) {
cacheRegions(island);
}
for (Region cachedRegion : cache.get(island)) {
if (!cachedRegion.isInside(x, y, z)) {
continue;
}
if (highestType >= cachedRegion.getRegionType()){
continue;
}
region = cachedRegion;
}
return region;
}
public void changeBoundaries(int x1, int y1, int z1, int x2, int y2, int z2){
this.x1 = Math.min(x1, x2);
this.y1 = Math.min(y1, y2);
this.x2 = Math.max(x1, x2);
this.y2 = Math.max(y1, y2);
this.z1 = Math.min(z1, z2);
this.z2 = Math.max(z1, z2);
}
}

@ -1,65 +0,0 @@
package xyz.soukup.ecoCraftCore.database.objects;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import java.sql.SQLException;
@DatabaseTable(tableName = "region_members")
public class RegionMember {
@DatabaseField(generatedId = true)
private int id;
@DatabaseField(foreign = true, foreignAutoRefresh = true)
private Region region;
@DatabaseField(columnName = "member_type", canBeNull = false)
private String membertype;
@DatabaseField(columnName = "member_name", canBeNull = false)
private String memberName;
@DatabaseField(columnName = "membership_type", canBeNull = false)
private String membershipType;
public RegionMember(){
}
public RegionMember(Region region, String membertype, String memberName, String membershipType){
this.region = region;
this.membertype = membertype;
this.memberName = memberName;
this.membershipType = membershipType;
}
public Region getRegion() {
return region;
}
public String getMembertype() {
return membertype;
}
public String getName() {
return memberName;
}
public String getMembershipType() {
return membershipType;
}
public void setMembershipType(String membershipType) {
this.membershipType = membershipType;
}
public void save(){
try {
DaoRegistry.getRegionMemberDao().createOrUpdate(this);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}

@ -0,0 +1,81 @@
package xyz.soukup.ecoCraftCore.genericMenus;
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
import com.github.stefvanschie.inventoryframework.gui.type.ChestGui;
import com.github.stefvanschie.inventoryframework.pane.OutlinePane;
import com.github.stefvanschie.inventoryframework.pane.PaginatedPane;
import com.github.stefvanschie.inventoryframework.pane.component.PagingButtons;
import com.github.stefvanschie.inventoryframework.pane.util.Slot;
import com.j256.ormlite.stmt.QueryBuilder;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import xyz.soukup.ecoCraftCore.gui.GuiItemBuilder;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import xyz.soukup.ecoCraftCore.objects.PermissionGroup;
import xyz.soukup.ecoCraftCore.objects.Region;
import xyz.soukup.ecoCraftCore.objects.RegionMember;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class GroupSelector {
public static ChestGui selectGroup(Player viewer, Region region, Consumer<Player> selectAction){
ChestGui chestGui = new ChestGui(3, LangManager.getLegacyString("gui.player-selector.title"));
PaginatedPane pane = new PaginatedPane(0,0, 9, 2);
List<GuiItem> guiItems = new ArrayList<>();
chestGui.setOnGlobalClick(event -> event.setCancelled(true));
RegionMember regionMember = region.getRegionMember(viewer);
if (regionMember == null){
return null;
}
QueryBuilder<PermissionGroup, Integer> queryBuilder = PermissionGroup.getDao().queryBuilder();
try {
queryBuilder
.where()
.eq("region_id", region.getId())
.and()
.lt("weight", regionMember.getPermissionGroup().getWeight());
List<PermissionGroup> groups = queryBuilder.query();
for (PermissionGroup group : groups){
GuiItem guiItem = new GuiItemBuilder(group.getIcon(),
group.getName(),
group.getDescription(),
(event -> selectAction.accept(viewer))).build();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
pane.populateWithGuiItems(guiItems);
PagingButtons pagingButtons = new PagingButtons(Slot.fromXY(0, 2),9, pane);
chestGui.addPane(pane);
return chestGui;
}
public static ChestGui selectGroup(Player viewer, Region region, Consumer<Player> selectAction, Consumer<Player> backAction){
ChestGui chestGui = selectGroup(viewer, region, selectAction);
OutlinePane pane = new OutlinePane(4,2, 1, 1);
GuiItem backButton = new GuiItemBuilder(Material.REDSTONE,
"gui.player-selector.back-button.name",
"gui.player-selector.back-button.lore",
(event -> backAction.accept(viewer)))
.build();
pane.addItem(backButton);
chestGui.addPane(pane);
return chestGui;
}
}

@ -0,0 +1,67 @@
package xyz.soukup.ecoCraftCore.genericMenus;
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
import com.github.stefvanschie.inventoryframework.gui.type.ChestGui;
import com.github.stefvanschie.inventoryframework.pane.OutlinePane;
import com.github.stefvanschie.inventoryframework.pane.PaginatedPane;
import com.github.stefvanschie.inventoryframework.pane.component.PagingButtons;
import com.github.stefvanschie.inventoryframework.pane.util.Slot;
import net.kyori.adventure.text.Component;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.SkullMeta;
import xyz.soukup.ecoCraftCore.gui.GuiItemBuilder;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import xyz.soukup.ecoCraftCore.messages.Replace;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class PlayerSelector {
public static ChestGui selectPlayer(Player viewer, List<Player> players, Consumer<Player> selectAction){
ChestGui chestGui = new ChestGui(3, LangManager.getLegacyString("gui.player-selector.title"));
PaginatedPane pane = new PaginatedPane(0,0, 9, 2);
List<GuiItem> guiItems = new ArrayList<>();
chestGui.setOnGlobalClick(event -> event.setCancelled(true));
for (Player player : players){
ItemStack itemStack = new ItemStack(Material.PLAYER_HEAD);
SkullMeta skullMeta = (SkullMeta) itemStack.getItemMeta();
Component name = LangManager.get("gui.player-selector.name-format", new Replace("name", player.displayName()));
skullMeta.setOwningPlayer(player);
skullMeta.displayName(name);
itemStack.setItemMeta(skullMeta);
GuiItem guiItem = new GuiItem(itemStack);
guiItem.setAction(event -> selectAction.accept(viewer));
guiItems.add(guiItem);
}
pane.populateWithGuiItems(guiItems);
PagingButtons pagingButtons = new PagingButtons(Slot.fromXY(0, 2),9, pane);
chestGui.addPane(pane);
return chestGui;
}
public static ChestGui selectPlayer(Player viewer, List<Player> players, Consumer<Player> selectAction, Consumer<Player> backAction){
ChestGui chestGui = selectPlayer(viewer, players, selectAction);
OutlinePane pane = new OutlinePane(4,2, 1, 1);
GuiItem backButton = new GuiItemBuilder(Material.REDSTONE,
"gui.player-selector.back-button.name",
"gui.player-selector.back-button.lore",
(event -> backAction.accept(viewer)))
.build();
pane.addItem(backButton);
chestGui.addPane(pane);
return chestGui;
}
}

@ -0,0 +1,36 @@
package xyz.soukup.ecoCraftCore.genericMenus;
import io.papermc.paper.dialog.Dialog;
import io.papermc.paper.registry.data.dialog.ActionButton;
import io.papermc.paper.registry.data.dialog.DialogBase;
import io.papermc.paper.registry.data.dialog.action.DialogAction;
import io.papermc.paper.registry.data.dialog.input.DialogInput;
import io.papermc.paper.registry.data.dialog.type.DialogType;
import net.kyori.adventure.text.event.ClickCallback;
import org.bukkit.entity.Player;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import java.util.List;
import java.util.function.Consumer;
public class TextInput {
public static Dialog textInput(Player viewer, String titleKey, String fieldDesctriptionKey, String initial , Consumer<String> action){
DialogAction dialogAction = DialogAction.customClick(((response, audience) -> action.accept(response.getText("input"))), ClickCallback.Options.builder().build()));
return Dialog.create(builder -> builder.empty()
.base(DialogBase.builder(LangManager.get(titleKey))
.inputs(List.of(DialogInput.text("input", LangManager.get(fieldDesctriptionKey))
.initial(initial)
.maxLength(256)
.build()))
.build())
.type(DialogType.confirmation(
ActionButton.builder(LangManager.get("gui.text-input.confirm"))
.action(dialogAction)
.build(),
ActionButton.builder(LangManager.get("gui.text-input.cancel"))
.build()
)));
}
}

@ -4,21 +4,52 @@ import com.github.stefvanschie.inventoryframework.gui.GuiItem;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.Material;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.stream.Collectors;
public class GuiItemBuilder {
private final ItemStack itemStack;
private final ItemMeta itemMeta;
private Consumer<InventoryClickEvent> onClick;
public GuiItemBuilder(Material material){
this.itemStack = new ItemStack(material);
this.itemMeta = this.itemStack.getItemMeta();
}
public GuiItemBuilder(Material material, String nameKey, String loreKey, Consumer<InventoryClickEvent> onClick){
this.itemStack = new ItemStack(material);
this.itemMeta = this.itemStack.getItemMeta();
this.itemMeta.displayName(LangManager.get(nameKey));
this.itemMeta.lore(LangManager.getComponentList(loreKey));
this.onClick = onClick;
}
public GuiItemBuilder(Material material, String nameKey, String loreKey, Consumer<InventoryClickEvent> onClick, boolean toggle) {
this.itemStack = new ItemStack(material);
this.itemMeta = this.itemStack.getItemMeta();
this.itemMeta.displayName(LangManager.get(nameKey));
List<Component> lore = LangManager.getComponentList(loreKey);
if (toggle){
lore.add(LangManager.get("gui.toggle.on"));
}else {
lore.add(LangManager.get("gui.toggle.off"));
}
this.itemMeta.lore(lore);
this.onClick = onClick;
}
public GuiItemBuilder setName(Component component){
@ -33,7 +64,7 @@ public class GuiItemBuilder {
return this;
}
public GuiItemBuilder setRawLore(String rawLore){
public GuiItemBuilder setLoreFromString(String rawLore){
List<Component> lore = Arrays.stream(rawLore.split("\\R"))
.map(line -> MiniMessage.miniMessage().deserialize(line))
.collect(Collectors.toList());
@ -43,6 +74,13 @@ public class GuiItemBuilder {
public GuiItem build(){
this.itemStack.setItemMeta(this.itemMeta);
return new GuiItem(this.itemStack);
GuiItem guiItem = new GuiItem(this.itemStack);
if(this.onClick != null){
guiItem.setAction(this.onClick);
}
return guiItem;
}
}

@ -2,8 +2,7 @@ package xyz.soukup.ecoCraftCore.islands;
import com.infernalsuite.asp.api.exceptions.UnknownWorldException;
import com.infernalsuite.asp.api.loaders.SlimeLoader;
import com.j256.ormlite.stmt.DeleteBuilder;
import xyz.soukup.ecoCraftCore.database.objects.Island;
import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.objects.Island;
import java.io.IOException;
import java.sql.SQLException;
@ -19,7 +18,7 @@ public class DatabaseIslandLoader implements SlimeLoader {
Island island;
try {
island = DaoRegistry.getIslandDao().queryBuilder().where().eq("uuid", worldName).queryForFirst();
island = Island.getDao().queryBuilder().where().eq("uuid", worldName).queryForFirst();
} catch (SQLException e) {
throw new RuntimeException(e);
}
@ -34,7 +33,7 @@ public class DatabaseIslandLoader implements SlimeLoader {
@Override
public boolean worldExists(String worldName) throws IOException {
try {
long count = DaoRegistry.getIslandDao().queryBuilder()
long count = Island.getDao().queryBuilder()
.setCountOf(true)
.where()
.eq("uuid", worldName)
@ -52,7 +51,7 @@ public class DatabaseIslandLoader implements SlimeLoader {
@Override
public void saveWorld(String worldName, byte[] serializedWorld) throws IOException {
try {
Island island = DaoRegistry.getIslandDao().queryBuilder().where().eq("uuid", worldName).queryForFirst();
Island island = Island.getDao().queryBuilder().where().eq("uuid", worldName).queryForFirst();
if (island != null) {
island.setData(serializedWorld);
@ -68,7 +67,7 @@ public class DatabaseIslandLoader implements SlimeLoader {
@Override
public void deleteWorld(String worldName) throws IOException {
try {
DeleteBuilder<Island, Integer> deleteBuilder = DaoRegistry.getIslandDao().deleteBuilder();
DeleteBuilder<Island, Integer> deleteBuilder = Island.getDao().deleteBuilder();
deleteBuilder.where().eq("uuid", worldName);
deleteBuilder.delete();
@ -80,7 +79,7 @@ public class DatabaseIslandLoader implements SlimeLoader {
@Override
public List<String> listWorlds() throws IOException {
try {
return DaoRegistry.getIslandDao().queryBuilder()
return Island.getDao().queryBuilder()
.selectColumns("uuid") // Only fetch the ID column
.query() // This returns Island objects with ONLY the ID field populated
.stream()

@ -9,7 +9,6 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import io.papermc.paper.command.brigadier.CommandSourceStack;
import io.papermc.paper.command.brigadier.Commands;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.NamespacedKey;
import org.bukkit.Registry;
@ -17,9 +16,8 @@ import org.bukkit.block.Biome;
import org.bukkit.entity.Player;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.database.objects.Island;
import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.objects.Island;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import java.io.IOException;
import java.sql.SQLException;
@ -40,7 +38,7 @@ public class IslandAdminCommand {
.executes(IslandAdminCommand::teleport)
.suggests(((context, builder) -> {
try {
QueryBuilder<Island, Integer> queryBuilder = DaoRegistry.getIslandDao().queryBuilder();
QueryBuilder<Island, Integer> queryBuilder = Island.getDao().queryBuilder();
queryBuilder.selectColumns("uuid");
List<Island> islands = queryBuilder.query();
for (Island island : islands) {
@ -74,7 +72,7 @@ public class IslandAdminCommand {
.then(Commands.argument("uuid", StringArgumentType.word())
.suggests(((context, builder) -> {
try {
QueryBuilder<Island, Integer> queryBuilder = DaoRegistry.getIslandDao().queryBuilder();
QueryBuilder<Island, Integer> queryBuilder = Island.getDao().queryBuilder();
queryBuilder.selectColumns("uuid");
List<Island> islands = queryBuilder.query();
for (Island island : islands) {
@ -117,7 +115,7 @@ public class IslandAdminCommand {
.then(Commands.argument("uuid", StringArgumentType.word())
.suggests((context, builder) -> {
try {
QueryBuilder<Island, Integer> queryBuilder = DaoRegistry.getIslandDao().queryBuilder();
QueryBuilder<Island, Integer> queryBuilder = Island.getDao().queryBuilder();
queryBuilder.selectColumns("uuid");
List<Island> islands = queryBuilder.query();
for (Island island : islands) {
@ -200,7 +198,7 @@ public class IslandAdminCommand {
Location spawn = player.getLocation();
String uuid = player.getWorld().getName();
islandManager.changeSpawn(spawn, uuid);
Messages.send(player, "island.setSpawn.success");
LangManager.send(player, "island.setSpawn.success");
return 0;
}
@ -210,7 +208,7 @@ public class IslandAdminCommand {
IslandManager islandManager = new IslandManager();
String uuid = player.getWorld().getName();
islandManager.changeEnviroment(context.getArgument("environment", String.class), uuid);
Messages.send(player, "island.setEnvironment.success");
LangManager.send(player, "island.setEnvironment.success");
return 0;
}
@ -220,7 +218,7 @@ public class IslandAdminCommand {
IslandManager islandManager = new IslandManager();
String uuid = player.getWorld().getName();
islandManager.changeBiome(context.getArgument("biome", String.class), uuid);
Messages.send(player, "island.set-biome.success");
LangManager.send(player, "island.set-biome.success");
return 0;
}

@ -17,10 +17,10 @@ import com.j256.ormlite.stmt.UpdateBuilder;
import org.bukkit.*;
import org.bukkit.entity.Player;
import org.bukkit.persistence.PersistentDataType;
import xyz.soukup.ecoCraftCore.database.objects.Island;
import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.database.objects.Region;
import xyz.soukup.ecoCraftCore.database.objects.TeleportRequest;
import xyz.soukup.ecoCraftCore.objects.ActiveServer;
import xyz.soukup.ecoCraftCore.objects.Island;
import xyz.soukup.ecoCraftCore.objects.Region;
import xyz.soukup.ecoCraftCore.objects.TeleportRequest;
import xyz.soukup.ecoCraftCore.utilities.PDC;
import java.io.IOException;
@ -36,7 +36,7 @@ public class IslandManager {
private final AdvancedSlimePaperAPI asp = AdvancedSlimePaperAPI.instance();
private final DatabaseIslandLoader databaseLoader = new DatabaseIslandLoader();
public final FileIslandLoader fileLoader = new FileIslandLoader();
private final Dao<Island, Integer> dao = DaoRegistry.getIslandDao();
private final Dao<Island, Integer> dao = Island.getDao();
public void createIslandTemplate(String uuid, String templateName){
try {
@ -253,7 +253,7 @@ public class IslandManager {
Region region = new Region(uuid, -1, x1, y1, z1, x2, y2, z2);
region.save();
region.addRegionMember(ownerType, owner, "owner");
region.addRegionMember(ownerType, owner, region.getPermissionGroup("owner"));
}
public void changeSpawn(Location location, String uuid) {
@ -429,7 +429,7 @@ public class IslandManager {
PDC.setUniversal(world, "bordery1", z1, PersistentDataType.INTEGER);
PDC.setUniversal(world, "bordery2", z2, PersistentDataType.INTEGER);
QueryBuilder<Region, Integer> queryBuilder = DaoRegistry.getRegionDao().queryBuilder();
QueryBuilder<Region, Integer> queryBuilder = Region.getDao().queryBuilder();
try {
queryBuilder.where()
.eq("island", world.getName())
@ -455,7 +455,7 @@ public class IslandManager {
"LIMIT 1";
GenericRawResults<String[]> rawResults =
DaoRegistry.getActiveServerDao().queryRaw(query);
ActiveServer.getDao().queryRaw(query);
String[] firstResult = rawResults.getFirstResult();
rawResults.close();

@ -17,17 +17,15 @@ import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.database.objects.Island;
import xyz.soukup.ecoCraftCore.database.objects.Region;
import xyz.soukup.ecoCraftCore.database.objects.RegionMember;
import xyz.soukup.ecoCraftCore.objects.Island;
import xyz.soukup.ecoCraftCore.objects.Region;
import xyz.soukup.ecoCraftCore.objects.RegionMember;
import xyz.soukup.ecoCraftCore.gui.GuiItemBuilder;
import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class IslandSelectorCommand {
@ -37,7 +35,7 @@ public class IslandSelectorCommand {
}
private static int displayIslandListSelectorGui(CommandContext<CommandSourceStack> context) {
String title = LegacyComponentSerializer.legacySection().serialize(Messages.get("menu.island-selector.title"));
String title = LegacyComponentSerializer.legacySection().serialize(LangManager.get("menu.island-selector.title"));
HopperGui hopperGui = new HopperGui(title);
hopperGui.setOnGlobalClick(event -> event.setCancelled(true));
@ -59,7 +57,7 @@ public class IslandSelectorCommand {
}
private static List<Island> getAllIslands(){
QueryBuilder<Island, Integer> queryBuilder = DaoRegistry.getIslandDao().queryBuilder();
QueryBuilder<Island, Integer> queryBuilder = Island.getDao().queryBuilder();
queryBuilder.selectColumns("display_name", "uuid", "descritpion", "type");
try {
return queryBuilder.query();
@ -69,7 +67,7 @@ public class IslandSelectorCommand {
}
private static List<Island> getPublicIslands(){
QueryBuilder<Island, Integer> queryBuilder = DaoRegistry.getIslandDao().queryBuilder();
QueryBuilder<Island, Integer> queryBuilder = Island.getDao().queryBuilder();
queryBuilder.selectColumns("display_name", "uuid", "descritpion", "type");
try {
queryBuilder.where().eq("is_public", true);
@ -80,7 +78,7 @@ public class IslandSelectorCommand {
}
private static List<Island> getMyIslands(Player player){
QueryBuilder<Island, Integer> queryBuilder = DaoRegistry.getIslandDao().queryBuilder();
QueryBuilder<Island, Integer> queryBuilder = Island.getDao().queryBuilder();
queryBuilder.selectColumns("display_name", "uuid", "descritpion", "type");
try {
queryBuilder.where().eq("owner", player.getName()).and().eq("owner_type", "player");
@ -91,16 +89,16 @@ public class IslandSelectorCommand {
}
private static List<Island> getSharedIslands(Player player){
QueryBuilder<RegionMember, Integer> memberQb = DaoRegistry.getRegionMemberDao().queryBuilder();
QueryBuilder<RegionMember, Integer> memberQb = RegionMember.getDao().queryBuilder();
memberQb.selectColumns("region_id");
try {
memberQb.where().eq("member_name", player.getName()).and().eq("member_type", "player");
QueryBuilder<Region, Integer> regionQb = DaoRegistry.getRegionDao().queryBuilder();
QueryBuilder<Region, Integer> regionQb = Region.getDao().queryBuilder();
regionQb.selectColumns("island");
regionQb.where().in("id", memberQb);
return DaoRegistry.getIslandDao().queryBuilder()
return Island.getDao().queryBuilder()
.where()
.in("uuid", regionQb)
.query();
@ -112,7 +110,7 @@ public class IslandSelectorCommand {
public static GuiItem selectorItem(String key, Material material, List<Island> islands){
GuiItemBuilder guiItemBuilder = new GuiItemBuilder(material);
guiItemBuilder.setName(Messages.get(key));
guiItemBuilder.setName(LangManager.get(key));
GuiItem guiItem = guiItemBuilder.build();
guiItem.setAction(event -> openIslandListGui((Player) event.getWhoClicked(), islands));
return guiItem;
@ -120,7 +118,7 @@ public class IslandSelectorCommand {
private static void openIslandListGui(Player player, List<Island> islands){
String title = LegacyComponentSerializer.legacySection().serialize(Messages.get("menu.island-selector.title"));
String title = LegacyComponentSerializer.legacySection().serialize(LangManager.get("menu.island-selector.title"));
ChestGui chestGui = new ChestGui(4, title);
chestGui.setOnGlobalClick(event -> event.setCancelled(true));
@ -169,7 +167,7 @@ public class IslandSelectorCommand {
GuiItemBuilder guiItemBuilder = new GuiItemBuilder(material);
guiItemBuilder.setName(Component.text(island.getDisplayName(), color));
guiItemBuilder.setRawLore(island.getDescritpion());
guiItemBuilder.setLoreFromString(island.getDescritpion());
GuiItem guiItem = guiItemBuilder.build();
guiItem.setAction(event -> {

@ -1,4 +0,0 @@
package xyz.soukup.ecoCraftCore.islands;
public class UnloadIsland {
}

@ -10,14 +10,15 @@ import org.bukkit.configuration.file.YamlConfiguration;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import static xyz.soukup.ecoCraftCore.EcoCraftCore.plugin;
public class Messages {
public class LangManager {
private static YamlConfiguration messages;
private static final MiniMessage miniMessage = MiniMessage.miniMessage();
public static void init() throws IOException {
File messagesFile = new File(plugin.getDataFolder(), "messages.yml");
@ -36,11 +37,11 @@ public class Messages {
public static Component get(String key) {
String string = getString(key);
return MiniMessage.miniMessage().deserialize(string);
return miniMessage.deserialize(string);
}
public static String getAsString(String key){
return LegacyComponentSerializer.legacySection().serialize(Messages.get(key));
public static String getLegacyString(String key){
return LegacyComponentSerializer.legacySection().serialize(LangManager.get(key));
}
public static Component get(String key, HashMap<String, String> placeholders){
@ -49,6 +50,18 @@ public class Messages {
TagResolver.Builder resolverBuilder = TagResolver.builder();
placeholders.forEach((k, value) -> resolverBuilder.resolver(Placeholder.unparsed(k, value)));
return miniMessage.deserialize(string, resolverBuilder.build());
}
public static Component get(String key, Replace... replaces){
String string = getString(key);
TagResolver.Builder resolverBuilder = TagResolver.builder();
for (Replace replace: replaces){
string = replace.process(string);
}
return MiniMessage.miniMessage().deserialize(string, resolverBuilder.build());
}
@ -56,33 +69,43 @@ public class Messages {
public static void send(CommandSender sender, String key){
sender.sendMessage(get(key));
}
public static void send(CommandSender sender, String key, Replace... replaces){
sender.sendMessage(get(key, replaces));
}
public static void send(CommandSender sender, String key, HashMap<String, String> placeholders){
sender.sendMessage(get(key, placeholders));
}
private static String getString(String key){
StringBuilder string = new StringBuilder();
if (messages.isString(key)){
string = new StringBuilder(Objects.requireNonNull(messages.getString(key)));
} else if (messages.isList(key)) {
boolean isFirst = true;
List<String> list = messages.getStringList(key);
for (String s : list){
if (isFirst){
isFirst = false;
string.append(s);
}else {
string.append("\n").append(s);
}
}
}else {
string = new StringBuilder(key);
public static List<Component> getComponentList(String key){
List<Component> componentList = new ArrayList<>();
for (String string : messages.getStringList(key)){
Component component = miniMessage.deserialize(string);
componentList.add(component);
}
return string.toString();
return componentList;
}
public static List<String> getStringList(String key) {
if (!(messages.contains(key) && messages.isList(key))){
return List.of(key);
}
return messages.getStringList(key);
}
public static String getString(String key) {
if (messages.isList(key)) {
return String.join("\n", messages.getStringList(key));
}
if (messages.isString(key)) {
return messages.getString(key);
}
return key;
}
}

@ -2,8 +2,8 @@ package xyz.soukup.ecoCraftCore.messages;
import org.bukkit.Location;
import xyz.soukup.ecoCraftCore.database.objects.Account;
import xyz.soukup.ecoCraftCore.database.objects.Transaction;
import xyz.soukup.ecoCraftCore.objects.Account;
import xyz.soukup.ecoCraftCore.objects.Transaction;
import java.util.HashMap;

@ -0,0 +1,23 @@
package xyz.soukup.ecoCraftCore.messages;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
public class Replace {
private final String key;
private final String value;
public Replace(String key, Component value){
this.key = key;
this.value = MiniMessage.miniMessage().serialize(value);
}
public Replace(String key, String value) {
this.key = key;
this.value = value;
}
public String process(String input) {
return input.replace("<" + key + ">", value);
}
}

@ -8,7 +8,7 @@ import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.messages.LangManager;
@SuppressWarnings("UnstableApiUsage")
public class MineCommand {
@ -31,23 +31,23 @@ public class MineCommand {
World world = MineWorldManager.getWorld();
if (world == null) {
Messages.send(sender, "mine.error.no-world");
LangManager.send(sender, "mine.error.no-world");
return 0;
}
Messages.send(sender, "mine.regenerating");
LangManager.send(sender, "mine.regenerating");
for (Player player : world.getPlayers()) {
player.teleport(player.getServer().getWorlds().getFirst().getSpawnLocation());
Messages.send(player, "mine.teleported-out");
LangManager.send(player, "mine.teleported-out");
}
MineWorldManager.recreateWorld(newWorld -> {
boolean success = MineManager.regenerate(newWorld);
if (success) {
Messages.send(sender, "mine.regenerate-complete");
LangManager.send(sender, "mine.regenerate-complete");
} else {
Messages.send(sender, "mine.error.regenerate-failed");
LangManager.send(sender, "mine.error.regenerate-failed");
}
});
return 1;
@ -58,18 +58,18 @@ public class MineCommand {
World world = MineWorldManager.getWorld();
if (world == null) {
Messages.send(player, "mine.error.no-world");
LangManager.send(player, "mine.error.no-world");
return 0;
}
Location spawn = MineWorldManager.getSpawnLocation();
if (spawn == null) {
Messages.send(player, "mine.error.no-world");
LangManager.send(player, "mine.error.no-world");
return 0;
}
player.teleport(spawn);
Messages.send(player, "mine.teleporting");
LangManager.send(player, "mine.teleporting");
return 1;
}
}

@ -21,7 +21,7 @@ import org.bukkit.event.player.PlayerItemDamageEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import xyz.soukup.ecoCraftCore.database.objects.Island;
import xyz.soukup.ecoCraftCore.objects.Island;
import xyz.soukup.ecoCraftCore.islands.DatabaseIslandLoader;
import java.util.function.Consumer;

@ -11,9 +11,9 @@ import io.papermc.paper.command.brigadier.argument.ArgumentTypes;
import io.papermc.paper.command.brigadier.argument.resolvers.selector.PlayerSelectorArgumentResolver;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import xyz.soukup.ecoCraftCore.database.objects.Account;
import xyz.soukup.ecoCraftCore.database.objects.Transaction;
import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.objects.Account;
import xyz.soukup.ecoCraftCore.objects.Transaction;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import xyz.soukup.ecoCraftCore.messages.PHHM;
@ -70,11 +70,11 @@ public class MoneyCommand {
private static int getBalance(CommandContext<CommandSourceStack> context) {
CommandSender commandSender = context.getSource().getSender();
if (!(commandSender instanceof Player player)) {
Messages.send(commandSender, "generic.error.not-player");
LangManager.send(commandSender, "generic.error.not-player");
return 0;
}
Account account = Account.getOrCreate(player);
Messages.send(player, "money.balance.self", PHHM.get(account));
LangManager.send(player, "money.balance.self", PHHM.get(account));
return 1;
}
@ -88,15 +88,15 @@ public class MoneyCommand {
Account senderAccount = Account.getOrCreate(sender);
if (amount > senderAccount.getBalance()) {
Messages.send(sender, "generic.error.no-funds");
LangManager.send(sender, "generic.error.no-funds");
return 0;
}
Transaction transaction = new Transaction(amount, "player", sender .getName(), "player", receiver.getName(), "player");
transaction.process();
Messages.send(sender, "money.send.player", PHHM.get(transaction));
Messages.send(receiver, "money.receive.player", PHHM.get(transaction));
LangManager.send(sender, "money.send.player", PHHM.get(transaction));
LangManager.send(receiver, "money.receive.player", PHHM.get(transaction));
return 1;
}
@ -110,7 +110,7 @@ public class MoneyCommand {
Transaction transaction = new Transaction(amount, "admin", commandSender.getName(), "player", receiver.getName(), "admin");
transaction.process();
Messages.send(commandSender, "money.give.player", PHHM.get(transaction));
LangManager.send(commandSender, "money.give.player", PHHM.get(transaction));
return 1;
}
@ -121,7 +121,7 @@ public class MoneyCommand {
Transaction transaction = new Transaction(amount, "admin", player.getName(), "player", player.getName(), "admin");
transaction.process();
Messages.send(player, "money.give.self", PHHM.get(transaction));
LangManager.send(player, "money.give.self", PHHM.get(transaction));
return 1;
}
@ -134,7 +134,7 @@ public class MoneyCommand {
Transaction transaction = new Transaction(amount, "admin", commandSender.getName(), type, owner, "admin");
transaction.process();
Messages.send(commandSender, "money.give.other", PHHM.get(transaction));
LangManager.send(commandSender, "money.give.other", PHHM.get(transaction));
return 1;
}
@ -147,7 +147,7 @@ public class MoneyCommand {
Transaction transaction = new Transaction(amount, "player", sender.getName(), "admin", commandSender.getName(), "admin");
transaction.process();
Messages.send(commandSender, "money.remove.player", PHHM.get(transaction));
LangManager.send(commandSender, "money.remove.player", PHHM.get(transaction));
return 1;
}
@ -158,7 +158,7 @@ public class MoneyCommand {
Transaction transaction = new Transaction(amount, "player", player.getName(), "admin", player.getName(), "admin");
transaction.process();
Messages.send(player, "money.remove.self", PHHM.get(transaction));
LangManager.send(player, "money.remove.self", PHHM.get(transaction));
return 1;
}
@ -171,7 +171,7 @@ public class MoneyCommand {
Transaction transaction = new Transaction(amount, type, owner, "admin", commandSender.getName(), "admin");
transaction.process();
Messages.send(commandSender, "money.remove.other", PHHM.get(transaction));
LangManager.send(commandSender, "money.remove.other", PHHM.get(transaction));
return 1;
}
}

@ -1,5 +1,6 @@
package xyz.soukup.ecoCraftCore.database.objects;
package xyz.soukup.ecoCraftCore.objects;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.misc.TransactionManager;
import com.j256.ormlite.stmt.QueryBuilder;
@ -7,7 +8,6 @@ import com.j256.ormlite.stmt.UpdateBuilder;
import com.j256.ormlite.table.DatabaseTable;
import org.bukkit.entity.Player;
import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import java.sql.SQLException;
import java.util.HashMap;
@ -16,6 +16,19 @@ import static xyz.soukup.ecoCraftCore.EcoCraftCore.connectionSource;
@DatabaseTable(tableName = "accounts")
public class Account {
private static Dao<Account, Integer> dao;
public static Dao<Account, Integer> getDao() {
return dao;
}
public static void setDao(Dao<Account, Integer> dao) {
Account.dao = dao;
}
@DatabaseField(generatedId = true)
private int id;
@ -49,7 +62,7 @@ public class Account {
public float getBalance() {
try {
Account fresh = DaoRegistry.getAccountDao().queryBuilder()
Account fresh = getDao().queryBuilder()
.selectColumns("balance")
.where().eq("id", this.id)
.queryForFirst();
@ -69,7 +82,7 @@ public class Account {
public void deposit(float amount){
try {
TransactionManager.callInTransaction(connectionSource, () -> {
UpdateBuilder<Account, Integer> builder = DaoRegistry.getAccountDao().updateBuilder();
UpdateBuilder<Account, Integer> builder = getDao().updateBuilder();
builder.updateColumnExpression("balance", "balance + " + amount);
builder.where().idEq(this.id);
int updated = builder.update();
@ -83,7 +96,7 @@ public class Account {
public void withdraw(float amount){
try {
TransactionManager.callInTransaction(connectionSource, () -> {
UpdateBuilder<Account, Integer> builder = DaoRegistry.getAccountDao().updateBuilder();
UpdateBuilder<Account, Integer> builder = getDao().updateBuilder();
builder.updateColumnExpression("balance", "balance - " + amount);
builder.where().idEq(this.id);
return null;
@ -98,12 +111,12 @@ public class Account {
TransactionManager.callInTransaction(
connectionSource,
() -> {
UpdateBuilder<Account, Integer> withdrawBuilder = DaoRegistry.getAccountDao().updateBuilder();
UpdateBuilder<Account, Integer> withdrawBuilder = getDao().updateBuilder();
withdrawBuilder.updateColumnExpression("balance", "balance - " + amount);
withdrawBuilder.where().eq("id", from.getId());
withdrawBuilder.update();
UpdateBuilder<Account, Integer> depositBuilder = DaoRegistry.getAccountDao().updateBuilder();
UpdateBuilder<Account, Integer> depositBuilder = getDao().updateBuilder();
depositBuilder.updateColumnExpression("balance", "balance + " + amount);
depositBuilder.where().idEq(to.getId());
depositBuilder.update();
@ -124,14 +137,14 @@ public class Account {
return account;
}
QueryBuilder<Account, Integer> queryBuilder = DaoRegistry.getAccountDao().queryBuilder();
QueryBuilder<Account, Integer> queryBuilder = getDao().queryBuilder();
try {
queryBuilder.where()
.eq("type", type)
.and()
.eq("owner", owner);
account = DaoRegistry.getAccountDao().queryForFirst(queryBuilder.prepare());
account = getDao().queryForFirst(queryBuilder.prepare());
if (account == null){
account = new Account(owner, type);
@ -143,19 +156,19 @@ public class Account {
}
public static Account getOrCreate(Player player){
QueryBuilder<Account, Integer> queryBuilder = DaoRegistry.getAccountDao().queryBuilder();
QueryBuilder<Account, Integer> queryBuilder = getDao().queryBuilder();
try {
queryBuilder.where()
.eq("type", "player")
.and()
.eq("owner", player.getName());
Account account = DaoRegistry.getAccountDao().queryForFirst(queryBuilder.prepare());
Account account = getDao().queryForFirst(queryBuilder.prepare());
if (account == null){
account = new Account(player.getName(), "player");
try {
DaoRegistry.getAccountDao().createOrUpdate(account);
getDao().createOrUpdate(account);
} catch (SQLException e) {
throw new RuntimeException(e);
}

@ -1,14 +1,26 @@
package xyz.soukup.ecoCraftCore.database.objects;
package xyz.soukup.ecoCraftCore.objects;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import java.sql.SQLException;
@DatabaseTable(tableName = "active_servers")
public class ActiveServer {
private static Dao<ActiveServer, Integer> dao;
public static Dao<ActiveServer, Integer> getDao() {
return dao;
}
public static void setDao(Dao<ActiveServer, Integer> dao) {
ActiveServer.dao = dao;
}
@DatabaseField(unique = true, id = true)
private String name;
@ -21,11 +33,11 @@ public class ActiveServer {
}
public void save() throws SQLException {
DaoRegistry.getActiveServerDao().createIfNotExists(this);
getDao().createIfNotExists(this);
}
public void delete() throws SQLException {
DaoRegistry.getActiveServerDao().delete(this);
getDao().delete(this);
}
public String getName() {

@ -1,14 +1,25 @@
package xyz.soukup.ecoCraftCore.database.objects;
package xyz.soukup.ecoCraftCore.objects;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import java.sql.SQLException;
@DatabaseTable(tableName = "islands")
public class Island {
private static Dao<Island, Integer> dao;
public static Dao<Island, Integer> getDao() {
return dao;
}
public static void setDao(Dao<Island, Integer> dao) {
Island.dao = dao;
}
@DatabaseField(generatedId = true)
private int id;
@ -99,11 +110,21 @@ public class Island {
return activeOn;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public void setDescritpion(String descritpion) {
this.descritpion = descritpion;
}
public static Island findById(int id) {
try {
return DaoRegistry.getIslandDao().queryForId(id);
return getDao().queryForId(id);
} catch (SQLException e) {
return null;
}
@ -111,7 +132,7 @@ public class Island {
public static Island findByUuid(String uuid) {
try {
return DaoRegistry.getIslandDao().queryBuilder().where().eq("uuid", uuid).queryForFirst();
return getDao().queryBuilder().where().eq("uuid", uuid).queryForFirst();
} catch (SQLException e) {
return null;
}
@ -128,7 +149,7 @@ public class Island {
this.id = existing.id;
}
}
DaoRegistry.getIslandDao().createOrUpdate(this);
getDao().createOrUpdate(this);
} catch (SQLException e) {
throw new RuntimeException(e);
}

@ -0,0 +1,43 @@
package xyz.soukup.ecoCraftCore.objects;
public enum Permission {
PLACE(0),
BREAK(1),
INTERACT(2),
ENTITY_INTERACT(3),
OPEN_CHESTS(4),
ENTER(5),
EXIT(6),
MANAGE_MEMBERS(7),
MANAGE_GROUPS(8),
MANAGE_REGIONS(9),
TRANSFER_OWNERSHIP(10),
USE_HOPPER(11),
HARVEST(12),
PLANT(13),
PICKUP_ITEMS(14),
DROP_ITEMS(15),
REDSTONE_INTERACT(16),
SIT(17),
SHOP_INTERACT(18),
HARM_ENTITIES(19),
HARM_PLAYERS(20),
VEHICLE_RIDE(21),
VEHICLE_PLACE(22),
VEHICLE_BREAK(23),
VEHICLE_INTERACT(24),
BUCKET_USE(25),
MANAGE_INFO(26);
private final int mask;
Permission(int position) {
this.mask = 1 << position;
}
public int getMask() {
return mask;
}
}

@ -0,0 +1,228 @@
package xyz.soukup.ecoCraftCore.objects;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import java.sql.SQLException;
@DatabaseTable(tableName = "permission_groups")
public class PermissionGroup {
public static Dao<PermissionGroup, Integer> dao;
public static void setDao(Dao<PermissionGroup, Integer> dao) {
PermissionGroup.dao = dao;
}
public static Dao<PermissionGroup, Integer> getDao() {
return dao;
}
@DatabaseField(generatedId = true)
private int id;
@DatabaseField(foreign = true, foreignAutoRefresh = true, uniqueCombo = true)
private Region region;
@DatabaseField(canBeNull = false, uniqueCombo = true)
private String name;
@DatabaseField(canBeNull = false, columnName = "display_name")
private String displayName;
@DatabaseField()
private String description;
@DatabaseField(canBeNull = false)
private Material icon;
@DatabaseField(canBeNull = false, defaultValue = "0")
private int weight;
@DatabaseField(canBeNull = false, defaultValue = "true")
private Boolean editable;
@DatabaseField(canBeNull = false, defaultValue = "true")
private Boolean deletable;
@DatabaseField(canBeNull = false, defaultValue = "0", columnName = "permissions_number")
private int permissionsNumber;
public PermissionGroup(){
}
public PermissionGroup(int permissionsNumber){
this.permissionsNumber = permissionsNumber;
}
public PermissionGroup(Region region, String name, String displayName, String description, Material icon){
this.region = region;
this.name = name;
this.displayName = displayName;
this.description = description;
this.icon = icon;
this.editable = true;
this.deletable = true;
this.permissionsNumber = 0;
this.weight = 0;
}
public PermissionGroup(Region region, String name, String displayName, String description, Material icon, Boolean editable, Boolean deletable, int weight,int permissions){
this.region = region;
this.name = name;
this.displayName = displayName;
this.description = description;
this.icon = icon;
this.editable = editable;
this.deletable = deletable;
this.permissionsNumber = permissions;
this.weight = weight;
}
public PermissionGroup(Region region, String name, String displayName, String description, Material icon, Boolean editable, Boolean deletable, int weight, Permission... permissions) {
this.region = region;
this.name = name;
this.displayName = displayName;
this.description = description;
this.icon = icon;
this.editable = editable;
this.deletable = deletable;
this.permissionsNumber = 0;
this.weight = 0;
for (Permission permission : permissions) {
this.permissionsNumber |= permission.getMask();
}
}
public PermissionGroup copyTo(Region region) {
return new PermissionGroup(
region,
this.name,
this.displayName,
this.description,
this.icon,
this.editable,
this.deletable,
this.weight,
this.permissionsNumber
);
}
public boolean hasPermission(Permission permission) {
return (this.permissionsNumber & permission.getMask()) != 0;
}
public void addPermission(Permission... permissions) {
for (Permission permission : permissions){
this.permissionsNumber |= permission.getMask();
}
}
public void removePermission(Permission permission) {
this.permissionsNumber &= ~permission.getMask();
}
public int getPermissionsNumber() {
return permissionsNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public Material getIcon() {
return icon;
}
public void setIcon(Material icon) {
this.icon = icon;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public static Status changeGroupDisplayNameSafely(int id, String groupName, String displayName, Player senderPlayer){
Region region = Region.findById(id);
if (region == null){
return Status.NOT_EXIST;
}
PermissionGroup permissionGroup = region.getPermissionGroup(groupName);
if (permissionGroup == null){
return Status.NOT_EXIST_GROUP;
}
PermissionGroup senderGroup = region.getRegionMember(senderPlayer).getPermissionGroup();
if (!(region.hasPermission(senderPlayer, Permission.MANAGE_GROUPS) && senderGroup.getWeight() > permissionGroup.getWeight())){
return Status.NO_PERMISSION;
}
permissionGroup.setDisplayName(displayName);
permissionGroup.save();
return Status.OK;
}
public void setDescription(String description) {
this.description = description;
}
public void save(){
try {
getDao().createOrUpdate(this);
region.dropCache();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public static PermissionGroup getPermissionGroup(Region region, String name){
try {
return getDao().queryBuilder().where().eq("region_id", region.getId()).and().eq("name", name).queryForFirst();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public String getDescription() {
return description;
}
public void delete() {
Dao<RegionMember, Integer> memberDao = RegionMember.getDao();
try {
memberDao.delete(memberDao.queryBuilder().where().eq("permission_group", this.id).query());
getDao().delete(this);
} catch (SQLException e) {
throw new RuntimeException(e);
}
region.dropCache();
}
}

@ -0,0 +1,469 @@
package xyz.soukup.ecoCraftCore.objects;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.dao.ForeignCollection;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.field.ForeignCollectionField;
import com.j256.ormlite.stmt.DeleteBuilder;
import com.j256.ormlite.table.DatabaseTable;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import java.sql.SQLException;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@DatabaseTable(tableName = "regions")
public class Region {
public static Dao<Region, Integer> dao;
public static void setDao(Dao<Region, Integer> dao) {
Region.dao = dao;
}
public static Dao<Region, Integer> getDao() {
return dao;
}
public static final HashMap<String, List<Region>> cache = new HashMap<>();
@DatabaseField(generatedId = true)
private int id;
@DatabaseField(canBeNull = false)
private String island;
@DatabaseField(columnName = "region_level", canBeNull = false)
private int regionLevel;
@DatabaseField(canBeNull = false)
private int x1;
@DatabaseField(canBeNull = false)
private int y1;
@DatabaseField(canBeNull = false)
private int z1;
@DatabaseField(canBeNull = false)
private int x2;
@DatabaseField(canBeNull = false)
private int y2;
@DatabaseField(canBeNull = false)
private int z2;
@ForeignCollectionField(eager = true)
private ForeignCollection<RegionMember> regionMembers;
@DatabaseField()
private Integer value;
public Region() {
}
public Region(String island, int regionLevel, int x1, int y1, int z1, int x2, int y2, int z2) {
this.island = island;
this.regionLevel = regionLevel;
this.x1 = Math.min(x1, x2);
this.y1 = Math.min(y1, y2);
this.x2 = Math.max(x1, x2);
this.y2 = Math.max(y1, y2);
this.z1 = Math.min(z1, z2);
this.z2 = Math.max(z1, z2);
save();
createDefaultGroupsAndReturnOwner();
}
public PermissionGroup getPermissionGroup(String name){
return PermissionGroup.getPermissionGroup(this, name);
}
public Region(Region parentRegion, int x1, int y1, int z1, int x2, int y2, int z2) {
this.island = parentRegion.getIsland();
this.regionLevel = parentRegion.getLevel() + 1;
this.x1 = Math.min(x1, x2);
this.y1 = Math.min(y1, y2);
this.x2 = Math.max(x1, x2);
this.y2 = Math.max(y1, y2);
this.z1 = Math.min(z1, z2);
this.z2 = Math.max(z1, z2);
save();
copyDataFrom(parentRegion);
}
private void copyDataFrom(Region source) {
try {
Map<String, PermissionGroup> groupMapping = new HashMap<>();
List<PermissionGroup> sourceGroups = PermissionGroup.getDao().queryBuilder()
.where().eq("region_id", source.getId()).query();
for (PermissionGroup sourceGroup : sourceGroups) {
PermissionGroup clonedGroup = sourceGroup.copyTo(this);
clonedGroup.save();
groupMapping.put(clonedGroup.getName(), clonedGroup);
}
for (RegionMember sourceMember : source.getRegionMembers()) {
PermissionGroup targetGroup = groupMapping.get(sourceMember.getPermissionGroup().getName());
if (targetGroup != null) {
addRegionMember(sourceMember.getMemberType(), sourceMember.getName(), targetGroup);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public Region(String island, int regionType, int x1, int y1, int z1, int x2, int y2, int z2, Player owner) {
this.island = island;
this.regionLevel = regionType;
this.x1 = Math.min(x1, x2);
this.y1 = Math.min(y1, y2);
this.x2 = Math.max(x1, x2);
this.y2 = Math.max(y1, y2);
this.z1 = Math.min(z1, z2);
this.z2 = Math.max(z1, z2);
this.save();
PermissionGroup ownerGroup = this.createDefaultGroupsAndReturnOwner();
addRegionMember("player", owner.getName(), ownerGroup);
}
public int getId() {
return id;
}
public int getLevel() {
return regionLevel;
}
public int getX1() {
return x1;
}
public int getZ1() {
return z1;
}
public int getZ2() {
return z2;
}
public int getY1() {
return y1;
}
public int getX2() {
return x2;
}
public int getY2() {
return y2;
}
public ForeignCollection<RegionMember> getRegionMembers() {
return regionMembers;
}
public Integer getValue() {
return value;
}
public String getIsland() {
return island;
}
public void setRegionLevel(int regionLevel) {
this.regionLevel = regionLevel;
}
public void setValue(Integer value) {
this.value = value;
}
public void save(){
try {
getDao().createOrUpdate(this);
List<Region> regions = cache.get(island);
if (regions == null) {
return;
}
regions.removeIf(region -> region.getId() == this.id);
regions.add(this);
} catch (Exception e) {
e.printStackTrace();
}
}
public void dropCache(){
cache.remove(island);
}
public void addRegionMember(Player player, PermissionGroup group){
addRegionMember("player", player.getName(), group);
}
public void addRegionMember(String memberType, String member, PermissionGroup permissionGroup){
RegionMember regionMember = new RegionMember(this, memberType, member, permissionGroup);
regionMember.save();
List<Region> regions = cache.get(island);
if (regions == null) {
return;
}
regions.removeIf(region -> region.getId() == this.id);
regions.add(this);
}
public void removeRegionMember(Player player){
removeRegionMember("player", player.getName());
}
public void removeRegionMember(String memberType, String member){
try {
DeleteBuilder<RegionMember, Integer> deletion = RegionMember.getDao().deleteBuilder();
deletion.where().eq("region_id", this.id).and().eq("member_type", memberType).and().eq("member_name", member);
deletion.delete();
} catch (SQLException e) {
throw new RuntimeException(e);
}
dropCache();
}
public RegionMember getRegionMember(Player player){
return getRegionMember("player", player.getName());
}
public boolean hasPermission(Player player, Permission permission){
RegionMember regionMember = getRegionMember(player);
PermissionGroup permissionGroup;
if (regionMember == null) {
permissionGroup = getPermissionGroup("default");
}else {
permissionGroup = regionMember.getPermissionGroup();
}
return permissionGroup.hasPermission(permission);
}
public boolean hasPermission(String memberType, String memberName, Permission permission){
RegionMember regionMember = getRegionMember(memberType, memberName);
PermissionGroup permissionGroup;
if (regionMember == null) {
permissionGroup = getPermissionGroup("default");
}else {
permissionGroup = regionMember.getPermissionGroup();
}
return permissionGroup.hasPermission(permission);
}
public static List<Region> getOverlappingRegions(Location loc1, Location loc2) {
if (loc1.getWorld() != loc2.getWorld()){
return null;
}
String island = loc1.getWorld().getName();
List<Region> overlapping = new java.util.ArrayList<>();
if (!cache.containsKey(island)) {
cacheRegions(island);
}
int minX = Math.min(loc1.getBlockX(), loc2.getBlockX());
int maxX = Math.max(loc1.getBlockX(), loc2.getBlockX());
int minY = Math.min(loc1.getBlockY(), loc2.getBlockY());
int maxY = Math.max(loc1.getBlockY(), loc2.getBlockY());
int minZ = Math.min(loc1.getBlockZ(), loc2.getBlockZ());
int maxZ = Math.max(loc1.getBlockZ(), loc2.getBlockZ());
for (Region region : cache.get(island)) {
if ((region.getX1() <= maxX
&& region.getX2() >= minX) && (region.getY1() <= maxY
&& region.getY2() >= minY) && (region.getZ1() <= maxZ
&& region.getZ2() >= minZ)) {
overlapping.add(region);
}
}
return overlapping;
}
public static Region getHighestLevelRegion(Location loc1, Location loc2) {
List<Region> regions = getOverlappingRegions(loc1, loc2);
if (regions.isEmpty()) {
return null;
}
return regions.stream().max(Comparator.comparingInt(Region::getLevel)).orElse(null);
}
public RegionMember getRegionMember(String type, String name){
return this.regionMembers.stream().filter(regionMember -> regionMember.getMemberType().equals(type) && regionMember.getName().equals(name)).findFirst().orElse(null);
}
public boolean isInside(int x, int y, int z) {
return x >= this.x1 && x <= this.x2 && y >= this.y1 && y <= this.y2 && z >= this.z1 && z <= this.z2;
}
public boolean envelops(Location loc1, Location loc2) {
int minX = Math.min(loc1.getBlockX(), loc2.getBlockX());
int maxX = Math.max(loc1.getBlockX(), loc2.getBlockX());
int minY = Math.min(loc1.getBlockY(), loc2.getBlockY());
int maxY = Math.max(loc1.getBlockY(), loc2.getBlockY());
int minZ = Math.min(loc1.getBlockZ(), loc2.getBlockZ());
int maxZ = Math.max(loc1.getBlockZ(), loc2.getBlockZ());
return this.x1 <= minX && this.x2 >= maxX &&
this.y1 <= minY && this.y2 >= maxY &&
this.z1 <= minZ && this.z2 >= maxZ;
}
public static Region findById(int id) {
try {
return getDao().queryForId(id);
} catch (Exception e) {
return null;
}
}
public static void cacheRegions(String island) {
try {
List<Region> regions = getDao().queryBuilder()
.where()
.eq("island", island)
.query();
cache.put(island, regions);
} catch (Exception e) {
}
}
public static Region findRegion(Location location){
return findRegion(location.getBlockX(), location.getBlockY(), location.getBlockZ(), location.getWorld().getName());
}
public static Region findRegion(int x, int y, int z, String island) {
Region region = null;
int highestType = -2;
if (!cache.containsKey(island)) {
cacheRegions(island);
}
for (Region cachedRegion : cache.get(island)) {
if (!cachedRegion.isInside(x, y, z)) {
continue;
}
if (highestType >= cachedRegion.getLevel()){
continue;
}
region = cachedRegion;
}
return region;
}
public void changeBoundaries(int x1, int y1, int z1, int x2, int y2, int z2){
this.x1 = Math.min(x1, x2);
this.y1 = Math.min(y1, y2);
this.x2 = Math.max(x1, x2);
this.y2 = Math.max(y1, y2);
this.z1 = Math.min(z1, z2);
this.z2 = Math.max(z1, z2);
}
public PermissionGroup createDefaultGroupsAndReturnOwner(){
String ownerDisplayName = LangManager.getString("region.permission-groups.owner.name");
String ownerDescription = LangManager.getString("region.permission-groups.owner.description");
PermissionGroup owner = new PermissionGroup(this, "owner", ownerDisplayName, ownerDescription, Material.RED_CONCRETE, false, false, 101, 2147483647);
owner.save();
String adminDisplayName = LangManager.getString("region.permission-groups.admin.name");
String adminDescription = LangManager.getString("region.permission-groups.admin.description");
PermissionGroup admin = new PermissionGroup(this, "admin", adminDisplayName, adminDescription, Material.YELLOW_CONCRETE, true, true, 90, 2147482623);
admin.save();
String memberDisplayName = LangManager.getString("region.permission-groups.member.name");
String memberDescription = LangManager.getString("region.permission-groups.member.description");
PermissionGroup member = new PermissionGroup(this, "member", memberDisplayName, memberDescription, Material.GREEN_CONCRETE, true, true, 10, 2095231);
member.save();
String defaultDisplayName = LangManager.getString("region.permission-groups.default");
String defaultDescription = LangManager.getString("region.permission-groups.default.description");
PermissionGroup defaultGroup = new PermissionGroup(this, "default", defaultDisplayName, defaultDescription, Material.GRAY_CONCRETE, true, false, 0,96);
defaultGroup.save();
return owner;
}
public void delete() {
try {
getDao().delete(this);
cache.get(this.island).remove(this);
Dao<PermissionGroup, Integer> permissionGroupDao = PermissionGroup.getDao();
Dao<RegionMember, Integer> regionMemberDao = RegionMember.getDao();
DeleteBuilder<PermissionGroup, Integer> groupDeleteBuilder = permissionGroupDao.deleteBuilder();
groupDeleteBuilder.where().eq("region_id", this.id);
groupDeleteBuilder.delete();
DeleteBuilder<RegionMember, Integer> memberDeleteBuilder= regionMemberDao.deleteBuilder();
memberDeleteBuilder.where().eq("region_id", this.id);
memberDeleteBuilder.delete();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void addPermissionGroup(String name, int weight, Material icon, String displayName, String description, int permissionsNumber) {
PermissionGroup group = new PermissionGroup(this, name, displayName, description, icon, true, true, weight, permissionsNumber);
group.save();
}
public void transferOwnership(Player oldOwner, Player newOwner) {
removeRegionMember(oldOwner);
addRegionMember(newOwner, this.getPermissionGroup("owner"));
}
}

@ -0,0 +1,90 @@
package xyz.soukup.ecoCraftCore.objects;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import java.sql.SQLException;
@DatabaseTable(tableName = "region_members")
public class RegionMember {
public static Dao<RegionMember, Integer> dao;
public static void setDao(Dao<RegionMember, Integer> dao) {
RegionMember.dao = dao;
}
public static Dao<RegionMember, Integer> getDao() {
return dao;
}
@DatabaseField(generatedId = true)
private int id;
@DatabaseField(foreign = true, foreignAutoRefresh = true)
private Region region;
@DatabaseField(columnName = "member_type", canBeNull = false)
private String memberType;
@DatabaseField(columnName = "member_name", canBeNull = false)
private String memberName;
@DatabaseField(columnName = "permission_group", foreign = true, foreignAutoRefresh = true,canBeNull = false)
private PermissionGroup permissionGroup;
public RegionMember(){
}
public RegionMember(Region region, String membertype, String memberName, PermissionGroup permissionGroup){
this.region = region;
this.memberType = membertype;
this.memberName = memberName;
this.permissionGroup = permissionGroup;
}
public Region getRegion() {
return region;
}
public String getMemberType() {
return memberType;
}
public String getName() {
return memberName;
}
public PermissionGroup getPermissionGroup() {
return permissionGroup;
}
public void setPermissionGroup(PermissionGroup permissionGroup) {
this.permissionGroup = permissionGroup;
save();
}
public boolean hasPermission(Permission permission){
return getPermissionGroup().hasPermission(permission);
}
public void save(){
try {
getDao().createOrUpdate(this);
region.dropCache();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void delete(){
try {
getDao().delete(this);
region.dropCache();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}

@ -1,4 +1,5 @@
package xyz.soukup.ecoCraftCore.database.objects;
package xyz.soukup.ecoCraftCore.objects;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import net.kyori.adventure.text.Component;
@ -9,7 +10,6 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.persistence.PersistentDataType;
import org.jetbrains.annotations.NotNull;
import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.utilities.Converter;
import xyz.soukup.ecoCraftCore.utilities.PDC;
@ -20,6 +20,16 @@ import java.util.HashMap;
@DatabaseTable(tableName = "shops")
public class Shop {
private static Dao<Shop, Integer> dao;
public static Dao<Shop, Integer> getDao() {
return dao;
}
public static void setDao(Dao<Shop, Integer> dao) {
Shop.dao = dao;
}
@DatabaseField(generatedId = true)
private int id;
@ -112,7 +122,7 @@ public class Shop {
}
try {
return DaoRegistry.getShopDao().queryForId(id);
return getDao().queryForId(id);
} catch (SQLException e) {
return null;
}
@ -124,7 +134,7 @@ public class Shop {
public void save(){
try {
DaoRegistry.getShopDao().createOrUpdate(this);
getDao().createOrUpdate(this);
} catch (SQLException e) {
throw new RuntimeException(e);
}
@ -135,7 +145,7 @@ public class Shop {
public void delete(){
try {
cache.remove(this.id);
DaoRegistry.getShopDao().delete(this);
getDao().delete(this);
} catch (SQLException e) {
throw new RuntimeException(e);
}

@ -0,0 +1,16 @@
package xyz.soukup.ecoCraftCore.objects;
public enum Status {
OK,
INVALID_SELECTION,
NO_PERMISSION,
NO_SELECTION,
REGION_NOT_ENVELOPS,
NOT_EXIST,
PLAYER_NOT_ON_ISLAND,
NOT_EXIST_GROUP,
NOT_EXIST_PERMISSION,
ALREADY_MEMBER,
NOT_MEMBER, ALREADY_EXISTS,
}

@ -1,15 +1,24 @@
package xyz.soukup.ecoCraftCore.database.objects;
package xyz.soukup.ecoCraftCore.objects;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import org.bukkit.Location;
import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import java.sql.SQLException;
@DatabaseTable(tableName = "teleport_requests")
public class TeleportRequest {
public static Dao<TeleportRequest, Integer> dao;
public static void setDao(Dao<TeleportRequest, Integer> dao) {
TeleportRequest.dao = dao;
}
public static Dao<TeleportRequest, Integer> getDao() {
return dao;
}
@DatabaseField(unique = true, id = true)
private String player;
@ -87,10 +96,10 @@ public class TeleportRequest {
}
public void save() throws SQLException {
DaoRegistry.getTeleportRequestsDao().createOrUpdate(this);
getDao().createOrUpdate(this);
}
public void delete() throws SQLException {
DaoRegistry.getTeleportRequestsDao().delete(this);
getDao().delete(this);
}
}

@ -1,8 +1,8 @@
package xyz.soukup.ecoCraftCore.database.objects;
package xyz.soukup.ecoCraftCore.objects;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import java.sql.SQLException;
import java.sql.Timestamp;
@ -10,6 +10,16 @@ import java.sql.Timestamp;
@DatabaseTable(tableName = "transactions")
public class Transaction {
public static Dao<Transaction, Integer> dao;
public static void setDao(Dao<Transaction, Integer> dao) {
Transaction.dao = dao;
}
public static Dao<Transaction, Integer> getDao() {
return dao;
}
@DatabaseField(generatedId = true)
private long id;
@ -58,7 +68,7 @@ public class Transaction {
Account.transferFunds(Account.getOrCreate(this.senderType, this.sender), Account.getOrCreate(this.receiverType, this.receiver), this.amount);
try {
DaoRegistry.getTransactionDao().createOrUpdate(this);
getDao().createOrUpdate(this);
} catch (SQLException e) {
throw new RuntimeException(e);
}
@ -66,7 +76,7 @@ public class Transaction {
public static Transaction findById(int id) {
try {
return DaoRegistry.getTransactionDao().queryForId(id);
return getDao().queryForId(id);
} catch (SQLException e) {
return null;
}

@ -1,5 +1,6 @@
package xyz.soukup.ecoCraftCore.database.objects;
package xyz.soukup.ecoCraftCore.objects;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.stmt.DeleteBuilder;
@ -8,7 +9,6 @@ import com.j256.ormlite.table.DatabaseTable;
import org.bukkit.block.Chest;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.inventory.InventoryUtils;
import xyz.soukup.ecoCraftCore.utilities.Converter;
import xyz.soukup.ecoCraftCore.utilities.PDC;
@ -21,6 +21,16 @@ import java.util.List;
@DatabaseTable(tableName = "virtual_chests")
public class VirtualChest {
private static Dao<VirtualChest, Integer> dao;
public static Dao<VirtualChest, Integer> getDao() {
return dao;
}
public static void setDao(Dao<VirtualChest, Integer> dao) {
VirtualChest.dao = dao;
}
@DatabaseField(generatedId = true)
private int id;
@ -71,7 +81,7 @@ public class VirtualChest {
}
try {
return DaoRegistry.getVirtualChestDao().queryForId(id);
return getDao().queryForId(id);
} catch (SQLException e) {
return null;
}
@ -99,7 +109,7 @@ public class VirtualChest {
this.inventoryString = Converter.toString(this.inventory);
}
try {
DaoRegistry.getVirtualChestDao().createOrUpdate(this);
getDao().createOrUpdate(this);
} catch (SQLException e) {
throw new RuntimeException(e);
}
@ -110,15 +120,15 @@ public class VirtualChest {
public void delete(){
try {
DaoRegistry.getVirtualChestDao().delete(this);
getDao().delete(this);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void deleteSelfAndShops(){
QueryBuilder<Shop, Integer> queryBuilder = DaoRegistry.getShopDao().queryBuilder();
DeleteBuilder<Shop, Integer> deleteBuilder = DaoRegistry.getShopDao().deleteBuilder();
QueryBuilder<Shop, Integer> queryBuilder = Shop.getDao().queryBuilder();
DeleteBuilder<Shop, Integer> deleteBuilder = Shop.getDao().deleteBuilder();
try {
queryBuilder
.selectColumns("id")
@ -135,7 +145,7 @@ public class VirtualChest {
deleteBuilder.where().eq("virtualChestID", this.id);
deleteBuilder.delete();
DaoRegistry.getVirtualChestDao().delete(this);
getDao().delete(this);
} catch (SQLException e) {
throw new RuntimeException(e);
}

@ -3,7 +3,7 @@ package xyz.soukup.ecoCraftCore.player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import xyz.soukup.ecoCraftCore.database.objects.Account;
import xyz.soukup.ecoCraftCore.objects.Account;
public class PreparePlayer implements Listener {

@ -1,14 +1,11 @@
package xyz.soukup.ecoCraftCore.player;
import com.google.common.eventbus.DeadEvent;
import com.j256.ormlite.stmt.QueryBuilder;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.database.objects.TeleportRequest;
import xyz.soukup.ecoCraftCore.objects.TeleportRequest;
import xyz.soukup.ecoCraftCore.islands.IslandManager;
import java.sql.SQLException;
@ -22,7 +19,7 @@ public class TeleportRequestsHandler implements Listener {
try {
Player player = event.getPlayer();
QueryBuilder<TeleportRequest, Integer> queryBuilder = DaoRegistry.getTeleportRequestsDao().queryBuilder();
QueryBuilder<TeleportRequest, Integer> queryBuilder = TeleportRequest.getDao().queryBuilder();
queryBuilder.where().eq("player", player.getName());
TeleportRequest teleportRequest = queryBuilder.queryForFirst();

@ -8,7 +8,7 @@ import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import xyz.soukup.ecoCraftCore.utilities.PDC;
public class MarkerCommand {
@ -22,7 +22,7 @@ public class MarkerCommand {
CommandSender commandSender = context.getSource().getSender();
if (!(commandSender instanceof Player player)){
Messages.send(commandSender, "generic.error.not-player");
LangManager.send(commandSender, "generic.error.not-player");
return 0;
}

@ -10,7 +10,7 @@ import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import xyz.soukup.ecoCraftCore.utilities.PDC;
import xyz.soukup.ecoCraftCore.messages.PHHM;
@ -50,7 +50,7 @@ public class MarkerEvent implements Listener {
return;
}
chests.put(player, chest);
Messages.send(player, "marker.marked.chest", PHHM.get(chest.getLocation()));
LangManager.send(player, "marker.marked.chest", PHHM.get(chest.getLocation()));
return;
}
@ -60,7 +60,7 @@ public class MarkerEvent implements Listener {
return;
}
signs.put(player, sign);
Messages.send(player, "marker.marked.sign", PHHM.get(sign.getLocation()));
LangManager.send(player, "marker.marked.sign", PHHM.get(sign.getLocation()));
return;
}
@ -73,7 +73,7 @@ public class MarkerEvent implements Listener {
return;
}
primaryLocations.put(player, location);
Messages.send(player, "marker.marked.primary", PHHM.get(location));
LangManager.send(player, "marker.marked.primary", PHHM.get(location));
return;
}
case RIGHT_CLICK_BLOCK -> {
@ -82,7 +82,7 @@ public class MarkerEvent implements Listener {
return;
}
secondaryLocations.put(player, location);
Messages.send(player, "marker.marked.secondary", PHHM.get(location));
LangManager.send(player, "marker.marked.secondary", PHHM.get(location));
return;
}
}

@ -9,9 +9,8 @@ import io.papermc.paper.command.brigadier.CommandSourceStack;
import io.papermc.paper.command.brigadier.Commands;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.database.objects.Region;
import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.objects.Region;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import java.sql.SQLException;
import java.util.List;
@ -28,7 +27,7 @@ public class RegionAdminCommand {
.then(Commands.argument("id", IntegerArgumentType.integer())
.suggests((context, builder) -> {
try {
QueryBuilder<Region, Integer> queryBuilder = DaoRegistry.getRegionDao().queryBuilder();
QueryBuilder<Region, Integer> queryBuilder = Region.getDao().queryBuilder();
queryBuilder.selectColumns("id");
List<Region> regions = queryBuilder.query();
for (Region region : regions) {
@ -64,16 +63,16 @@ public class RegionAdminCommand {
private static int createRegion(CommandContext<CommandSourceStack> context) {
Integer type = context.getArgument("type", Integer.class);
if(!(context.getSource().getSender() instanceof Player player)){
Messages.send(context.getSource().getSender(), "generic.error.not-player");
LangManager.send(context.getSource().getSender(), "generic.error.not-player");
return 0;
};
int status = RegionManager.createRegion(player, type, player.getName(), "player");
switch (status){
case 0 -> Messages.send(player, "generic.success.created");
case 1 -> Messages.send(player, "region.error.not-marked");
case 2 -> Messages.send(player, "region.error.not-same-world");
case 0 -> LangManager.send(player, "generic.success.created");
case 1 -> LangManager.send(player, "region.error.not-marked");
case 2 -> LangManager.send(player, "region.error.not-same-world");
}
return 0;
@ -87,8 +86,8 @@ public class RegionAdminCommand {
int status = RegionManager.addMember(id, "player", player, membership);
switch (status){
case 0 -> Messages.send(commandSender, "generic.success.created");
case 1 -> Messages.send(commandSender, "region.error.not-exist");
case 0 -> LangManager.send(commandSender, "generic.success.created");
case 1 -> LangManager.send(commandSender, "region.error.not-exist");
}
return 0;
}

@ -0,0 +1,448 @@
package xyz.soukup.ecoCraftCore.regions;
import com.j256.ormlite.stmt.QueryBuilder;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.suggestion.Suggestions;
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
import io.papermc.paper.command.brigadier.CommandSourceStack;
import io.papermc.paper.command.brigadier.Commands;
import io.papermc.paper.command.brigadier.argument.ArgumentTypes;
import io.papermc.paper.command.brigadier.argument.resolvers.selector.PlayerSelectorArgumentResolver;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import xyz.soukup.ecoCraftCore.messages.Replace;
import xyz.soukup.ecoCraftCore.objects.Permission;
import xyz.soukup.ecoCraftCore.objects.PermissionGroup;
import xyz.soukup.ecoCraftCore.objects.Region;
import xyz.soukup.ecoCraftCore.objects.RegionMember;
import java.sql.SQLException;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public class RegionCommand {
public static LiteralArgumentBuilder<CommandSourceStack> command(){
LiteralArgumentBuilder<CommandSourceStack> confirm = Commands.literal("confirm");
RequiredArgumentBuilder<CommandSourceStack, PlayerSelectorArgumentResolver> playerArgument = Commands.argument("player", ArgumentTypes.player());
RequiredArgumentBuilder<CommandSourceStack, String> memberArgument = Commands.argument("member", StringArgumentType.word()).suggests(RegionCommand::memberSuggestions);
RequiredArgumentBuilder<CommandSourceStack, String> groupArgument = Commands.argument("group", StringArgumentType.word()).suggests(RegionCommand::memberGroupSuggestions);
RequiredArgumentBuilder<CommandSourceStack, String> nameArgument = Commands.argument("name", StringArgumentType.word());
RequiredArgumentBuilder<CommandSourceStack, Integer> weightArgument = Commands.argument("weight", IntegerArgumentType.integer());
RequiredArgumentBuilder<CommandSourceStack, ItemStack> iconArgument = Commands.argument("icon", ArgumentTypes.itemStack());
RequiredArgumentBuilder<CommandSourceStack, String> displayNameArgument = Commands.argument("display-name", StringArgumentType.string());
RequiredArgumentBuilder<CommandSourceStack, String> descriptionArgument = Commands.argument("description", StringArgumentType.greedyString());
RequiredArgumentBuilder<CommandSourceStack, String> permissionArgument = Commands.argument("permission", StringArgumentType.word()).suggests(RegionCommand::permissionSuggestions);
LiteralArgumentBuilder<CommandSourceStack> create = Commands.literal("create")
.executes(RegionCommand::create);
LiteralArgumentBuilder<CommandSourceStack> delete = Commands.literal("delete")
.executes(RegionCommand::delete)
.then(confirm.executes(RegionCommand::delete));
LiteralArgumentBuilder<CommandSourceStack> addMember = Commands.literal("add")
.then(playerArgument.then(groupArgument.executes(RegionCommand::addMember)));
LiteralArgumentBuilder<CommandSourceStack> removeMember = Commands.literal("remove")
.then(memberArgument.executes(RegionCommand::removeMember));
LiteralArgumentBuilder<CommandSourceStack> member = Commands.literal("member")
.then(addMember)
.then(removeMember);
LiteralArgumentBuilder<CommandSourceStack> groupCreate = Commands.literal("create")
.then(nameArgument
.then(weightArgument
.then(iconArgument
.then(displayNameArgument
.then(descriptionArgument
.executes(RegionCommand::createGroup))))));
LiteralArgumentBuilder<CommandSourceStack> groupRemove = Commands.literal("remove")
.executes(RegionCommand::removeGroup);
LiteralArgumentBuilder<CommandSourceStack> addPermission = Commands.literal("add-permission")
.then(permissionArgument.executes(RegionCommand::addPermission));
LiteralArgumentBuilder<CommandSourceStack> removePermission = Commands.literal("remove-permission")
.then(permissionArgument.executes(RegionCommand::removePermission));
Commands.literal("transfer-ownership").then(playerArgument
.executes(RegionCommand::transferOwnership)
.then(confirm.executes(RegionCommand::transferOwnership)));
LiteralArgumentBuilder<CommandSourceStack> changeIcon = Commands.literal("change-icon")
.then(iconArgument.executes(RegionCommand::changeIcon));
LiteralArgumentBuilder<CommandSourceStack> changeDisplayName = Commands.literal("change-display-name")
.then(displayNameArgument.executes(RegionCommand::changeDisplayName));
LiteralArgumentBuilder<CommandSourceStack> changeDescription = Commands.literal("change-description")
.then(descriptionArgument.executes(RegionCommand::changeDescription));
RequiredArgumentBuilder<CommandSourceStack, String> groupEdit = nameArgument.suggests(RegionCommand::memberGroupSuggestions)
.then(groupRemove)
.then(addPermission)
.then(removePermission)
.then(changeIcon)
.then(changeDisplayName)
.then(changeDescription);
LiteralArgumentBuilder<CommandSourceStack> group = Commands.literal("group")
.then(groupCreate)
.then(groupEdit);
RequiredArgumentBuilder<CommandSourceStack, Integer> regionEdits = Commands.argument("id", IntegerArgumentType.integer(1, 2147483647))
.suggests(RegionCommand::regionIdSuggestions)
.then(delete)
.then(member)
.then(group);
return Commands.literal("region")
.requires(c -> c.getSender() instanceof Player)
.then(regionEdits)
.then(create);
}
private static int changeIcon(CommandContext<CommandSourceStack> context) {
Player player = (Player) context.getSource().getSender();
int id = context.getArgument("id", Integer.class);
String name = context.getArgument("name", String.class);
ItemStack itemStack = context.getArgument("icon", ItemStack.class);
switch (RegionManager.changeGroupIconSafely(id, name, itemStack, player)){
case NOT_EXIST -> LangManager.send(player, "region.command.error.not-exist");
case NOT_EXIST_GROUP -> LangManager.send(player, "region.command.error.not-exist-group");
case NO_PERMISSION -> LangManager.send(player, "region.command.error.no-permission");
case OK -> LangManager.send(player, "region.command.icon-changed");
}
return 0;
}
private static int changeDescription(CommandContext<CommandSourceStack> context) {
Player player = (Player) context.getSource().getSender();
int id = context.getArgument("id", Integer.class);
String name = context.getArgument("name", String.class);
String description = context.getArgument("description", String.class);
switch (RegionManager.changeGroupDescriptionSafely(id, name, description, player)){
case NOT_EXIST -> LangManager.send(player, "region.command.error.not-exist");
case NOT_EXIST_GROUP -> LangManager.send(player, "region.command.error.not-exist-group");
case NO_PERMISSION -> LangManager.send(player, "region.command.error.no-permission");
case OK -> LangManager.send(player, "region.command.description-changed");
}
return 0;
}
private static int changeDisplayName(CommandContext<CommandSourceStack> context) {
Player player = (Player) context.getSource().getSender();
int id = context.getArgument("id", Integer.class);
String name = context.getArgument("name", String.class);
String displayName = context.getArgument("display-name", String.class);
switch (RegionManager.changeGroupDisplayNameSafely(id, name, displayName, player)){
case NOT_EXIST -> LangManager.send(player, "region.command.error.not-exist");
case NOT_EXIST_GROUP -> LangManager.send(player, "region.command.error.not-exist-group");
case NO_PERMISSION -> LangManager.send(player, "region.command.error.no-permission");
case OK -> LangManager.send(player, "region.command.display-name-changed");
}
return 0;
}
private static int transferOwnership(CommandContext<CommandSourceStack> context) {
Player player = (Player) context.getSource().getSender();
int id = context.getArgument("id", Integer.class);
PlayerSelectorArgumentResolver newOwnerResolver = context.getArgument("new-owner", PlayerSelectorArgumentResolver.class);
Player newOwner;
try {
newOwner = newOwnerResolver.resolve(context.getSource()).getFirst();
} catch (CommandSyntaxException e) {
LangManager.send(player, "region.command.error.not-exist");
return 1;
}
if (!context.getInput().endsWith("confirm")){
LangManager.send(player, "region.command.confirm-warning.transfer-ownership",
new Replace("id", String.valueOf(id)),
new Replace("name", newOwner.getName()));
return 1;
}
switch (RegionManager.transferOwnershipSafely(id, player, newOwner)){
case NO_PERMISSION -> LangManager.send(player, "region.command.error.no-permission");
case NOT_EXIST -> LangManager.send(player, "region.command.error.not-exist");
case OK -> LangManager.send(player, "region.command.transferred-ownership");
}
return 0;
}
private static int removePermission(CommandContext<CommandSourceStack> context) {
Player player = (Player) context.getSource().getSender();
int id = context.getArgument("id", Integer.class);
String name = context.getArgument("name", String.class);
String permission = context.getArgument("permission", String.class);
switch (RegionManager.removeGroupPermissionSafely(player, id, name, permission)){
case NOT_EXIST -> LangManager.send(player, "region.command.error.not-exist");
case NOT_EXIST_GROUP -> LangManager.send(player, "region.command.error.not-exist-group");
case NOT_EXIST_PERMISSION -> LangManager.send(player, "region.command.error.not-exist-permission");
case NO_PERMISSION -> LangManager.send(player, "region.command.error.no-permission");
case OK -> LangManager.send(player, "region.command.removed-permission");
}
return 0;
}
private static int addPermission(CommandContext<CommandSourceStack> context) {
Player player = (Player) context.getSource().getSender();
int id = context.getArgument("id", Integer.class);
String name = context.getArgument("name", String.class);
String permission = context.getArgument("permission", String.class);
switch (RegionManager.addGroupPermissionSafely(player, id, name, permission)){
case NOT_EXIST -> LangManager.send(player, "region.command.error.not-exist");
case NOT_EXIST_GROUP -> LangManager.send(player, "region.command.error.not-exist-group");
case NOT_EXIST_PERMISSION -> LangManager.send(player, "region.command.error.not-exist-permission");
case NO_PERMISSION -> LangManager.send(player, "region.command.error.no-permission");
case OK -> LangManager.send(player, "region.command.added-permission");
}
return 0;
}
private static int removeGroup(CommandContext<CommandSourceStack> context) {
Player player = (Player) context.getSource().getSender();
int id = context.getArgument("id", Integer.class);
String name = context.getArgument("name", String.class);
switch (RegionManager.removeRegionGroupSafely(id, player, name)){
case NOT_EXIST -> LangManager.send(player, "region.command.error.not-exist");
case NOT_EXIST_GROUP -> LangManager.send(player, "region.command.error.not-exist-group");
case NO_PERMISSION -> LangManager.send(player, "region.command.error.no-permission");
case OK -> LangManager.send(player, "region.command.deleted-group");
}
return 0;
}
private static int createGroup(CommandContext<CommandSourceStack> context) {
Player player = (Player) context.getSource().getSender();
int id = context.getArgument("id", Integer.class);
String name = context.getArgument("name", String.class);
int weight = context.getArgument("weight", Integer.class);
ItemStack icon = context.getArgument("icon", ItemStack.class);
String displayName = context.getArgument("display-name", String.class);
String description = context.getArgument("description", String.class);
switch (RegionManager.addRegionGroupSafely(id, player, name, weight, icon, displayName, description)){
case NOT_EXIST -> LangManager.send(player, "region.command.error.not-exist");
case NO_PERMISSION -> LangManager.send(player, "region.command.error.no-permission");
case ALREADY_EXISTS -> LangManager.send(player, "region.command.error.already-exist");
case OK -> LangManager.send(player, "region.command.created-group");
}
return 0;
}
private static CompletableFuture<Suggestions> permissionSuggestions(CommandContext<CommandSourceStack> context, SuggestionsBuilder builder){
Player player = (Player) context.getSource().getSender();
int id = context.getArgument("id", Integer.class);
Region region = Region.findById(id);
if (region == null){
return builder.buildFuture();
}
String remaining = builder.getRemaining().toUpperCase();
for (Permission permission : Permission.values()){
if (permission.name().contains(remaining) && region.hasPermission(player, permission)){
builder.suggest(permission.name());
}
}
return builder.buildFuture();
}
private static CompletableFuture<Suggestions> regionIdSuggestions(CommandContext<CommandSourceStack> context, SuggestionsBuilder builder) {
Player player = (Player) context.getSource().getSender();
Region region = Region.findRegion(player.getLocation());
if (region != null){
builder.suggest(region.getId());
}
return builder.buildFuture();
}
private static CompletableFuture<Suggestions> memberGroupSuggestions(CommandContext<CommandSourceStack> context, SuggestionsBuilder builder){
Player player = (Player) context.getSource().getSender();
int id = context.getArgument("id", Integer.class);
Region region = Region.findById(id);
if (region == null){
return builder.buildFuture();
}
if (!region.hasPermission(player, Permission.MANAGE_MEMBERS)){
return builder.buildFuture();
}
RegionMember regionMember = region.getRegionMember(player);
if (regionMember == null){
return builder.buildFuture();
}
PermissionGroup senderGroup = regionMember.getPermissionGroup();
if (senderGroup == null){
return builder.buildFuture();
}
QueryBuilder<PermissionGroup, Integer> queryBuilder = PermissionGroup.getDao().queryBuilder();
String remaining = builder.getRemaining().toUpperCase();
try {
queryBuilder.selectColumns("name");
queryBuilder.where().eq("region_id", id).and().lt("weight", senderGroup.getWeight());
List<PermissionGroup> permissionGroups = queryBuilder.query();
for (PermissionGroup permissionGroup : permissionGroups){
if (permissionGroup.getName().contains(remaining)){
builder.suggest(permissionGroup.getName());
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
return builder.buildFuture();
}
private static CompletableFuture<Suggestions> memberSuggestions(CommandContext<CommandSourceStack> context, SuggestionsBuilder builder){
Player player = (Player) context.getSource().getSender();
int id = context.getArgument("id", Integer.class);
Region region = Region.findById(id);
if (region == null){
return builder.buildFuture();
}
QueryBuilder<RegionMember, Integer> queryBuilder = RegionMember.getDao().queryBuilder();
String remaining = builder.getRemaining().toUpperCase();
try {
queryBuilder.selectColumns("member_name");
queryBuilder.where().eq("region_id", id);
List<RegionMember> regionMembers = queryBuilder.query();
for (RegionMember member : regionMembers){
if (member.getName().toUpperCase().contains(remaining)){
builder.suggest(member.getName());
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
return builder.buildFuture();
}
private static int removeMember(CommandContext<CommandSourceStack> context) {
int id = context.getArgument("id", Integer.class);
Player senderPlayer = (Player) context.getSource().getSender();
String memberToRemove = context.getArgument("member", String.class);
switch (RegionManager.removeMemberSafely(id, memberToRemove, senderPlayer)){
case OK -> LangManager.send(senderPlayer, "region.command.removed-member");
case NOT_EXIST -> LangManager.send(senderPlayer, "region.command.error.not-exist");
case NO_PERMISSION -> LangManager.send(senderPlayer, "region.command.error.no-permission");
case NOT_MEMBER -> LangManager.send(senderPlayer, "region.command.error.not-member");
}
return 0;
}
private static int addMember(CommandContext<CommandSourceStack> context){
int id = context.getArgument("id", Integer.class);
String groupName = context.getArgument("group", String.class);
Player senderPlayer = (Player) context.getSource().getSender();
PlayerSelectorArgumentResolver playerSelectorArgumentResolver = context.getArgument("player", PlayerSelectorArgumentResolver.class);
try {
Player playerToAdd = playerSelectorArgumentResolver.resolve(context.getSource()).getFirst();
switch (RegionManager.addMemberSafely(id, playerToAdd, senderPlayer, groupName)){
case OK -> LangManager.send(senderPlayer, "region.command.added-member");
case NOT_EXIST -> LangManager.send(senderPlayer, "region.command.error.not-exist");
case NO_PERMISSION -> LangManager.send(senderPlayer, "region.command.error.no-permission");
case NOT_EXIST_GROUP -> LangManager.send(senderPlayer, "region.command.error.not-exist-group");
case PLAYER_NOT_ON_ISLAND -> LangManager.send(senderPlayer, "region.command.error.player-not-on-island");
case ALREADY_MEMBER -> LangManager.send(senderPlayer, "region.command.error.already-member");
}
} catch (CommandSyntaxException e) {
throw new RuntimeException(e);
}
return 0;
}
private static int delete(CommandContext<CommandSourceStack> context) {
Player player = (Player) context.getSource().getSender();
int id = context.getArgument("id", Integer.class);
if (!context.getInput().endsWith("confirm")){
LangManager.send(player, "region.command.confirm-warning.delete", new Replace("id", String.valueOf(id)));
return 1;
}
switch (RegionManager.deleteRegionSafely(id, player)){
case OK -> LangManager.send(player, "region.command.deleted");
case NOT_EXIST -> LangManager.send(player, "region.command.error.not-exist");
case NO_PERMISSION -> LangManager.send(player, "region.command.error.no-permission");
}
return 0;
}
private static int create(CommandContext<CommandSourceStack> context) {
Player player = (Player) context.getSource().getSender();
switch (RegionManager.createRegionSafely(player)){
case OK -> LangManager.send(player, "region.command.created");
case NO_SELECTION -> LangManager.send(player, "region.command.error.no-selection");
case NO_PERMISSION -> LangManager.send(player, "region.command.error.no-permission");
case INVALID_SELECTION -> LangManager.send(player, "region.command.error.invalid-selection");
case REGION_NOT_ENVELOPS -> LangManager.send(player, "region.command.error.region-not-envelops");
}
return 0;
}
}

@ -1,11 +1,15 @@
package xyz.soukup.ecoCraftCore.regions;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.block.Barrel;
import org.bukkit.block.Block;
import org.bukkit.block.Chest;
import org.bukkit.block.DoubleChest;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Item;
import org.bukkit.entity.Minecart;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@ -13,14 +17,20 @@ import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityMountEvent;
import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.inventory.InventoryPickupItemEvent;
import org.bukkit.event.player.*;
import org.bukkit.event.vehicle.VehicleDestroyEvent;
import org.bukkit.event.vehicle.VehicleEntityCollisionEvent;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
import xyz.soukup.ecoCraftCore.database.objects.Region;
import xyz.soukup.ecoCraftCore.database.objects.RegionMember;
import org.bukkit.util.Vector;
import xyz.soukup.ecoCraftCore.objects.Permission;
import xyz.soukup.ecoCraftCore.objects.Region;
import static xyz.soukup.ecoCraftCore.EcoCraftCore.plugin;
@ -28,35 +38,31 @@ public class RegionEvents implements Listener {
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event){
switch (event.getAction()) {
case RIGHT_CLICK_BLOCK:
case LEFT_CLICK_BLOCK:
break;
default:
return;
}
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return;
Block block = event.getClickedBlock();
ItemStack item = event.getItem();
if (block == null) return;
if (item != null && item.getType().isBlock() && !block.getType().isInteractable()) {
ItemStack item = event.getItem();
Player player = event.getPlayer();
boolean interactable = block.getType().isInteractable();
if ((!interactable || player.isSneaking()) && item != null && item.getType().isBlock()) {
return;
}
boolean allowed = isAllowedToInteract(
block.getWorld().getName(),
event.getPlayer(),
block.getX(),
block.getY(),
block.getZ()
);
boolean harvestAllowed = RegionManager.hasPermission(player, block.getLocation(), Permission.HARVEST);
if (allowed){
if (isCrop(block.getType()) && harvestAllowed) {
return;
}
boolean interactAllowed = RegionManager.hasPermission(player, block.getLocation(), Permission.INTERACT);
if (interactAllowed) {
return;
}
event.setCancelled(true);
}
@ -69,13 +75,7 @@ public class RegionEvents implements Listener {
Player player = event.getPlayer();
Location location = player.getLocation();
boolean allowed = isAllowedToInteract(
location.getWorld().getName(),
player,
location.getBlockX(),
location.getBlockY(),
location.getBlockZ()
);
boolean allowed = RegionManager.hasPermission(player, location, Permission.REDSTONE_INTERACT);
if (allowed){
return;
@ -89,15 +89,15 @@ public class RegionEvents implements Listener {
public void onBlockPlace(BlockPlaceEvent event) {
Block block = event.getBlockPlaced();
boolean allowed = isAllowedToInteract(
block.getWorld().getName(),
event.getPlayer(),
block.getX(),
block.getY(),
block.getZ()
);
boolean placeAllowed = RegionManager.hasPermission(event.getPlayer(), block.getLocation(), Permission.PLACE);
if (allowed){
if (placeAllowed){
return;
}
boolean plantAllowed = RegionManager.hasPermission(event.getPlayer(), block.getLocation(), Permission.PLANT);
if (plantAllowed && isCrop(block.getType())){
return;
}
@ -109,15 +109,15 @@ public class RegionEvents implements Listener {
Block block = event.getBlock();
boolean allowed = isAllowedToInteract(
block.getWorld().getName(),
event.getPlayer(),
block.getX(),
block.getY(),
block.getZ()
);
boolean breakAllowed = RegionManager.hasPermission(event.getPlayer(), block.getLocation(), Permission.BREAK);
if (allowed){
if (breakAllowed){
return;
}
boolean harvestAllowed = RegionManager.hasPermission(event.getPlayer(), block.getLocation(), Permission.HARVEST);
if (isCrop(block.getType()) && harvestAllowed) {
return;
}
@ -128,13 +128,7 @@ public class RegionEvents implements Listener {
public void onBucketUse(PlayerBucketEmptyEvent event) {
Block clickedBlock = event.getBlockClicked();
boolean allowed = isAllowedToInteract(
clickedBlock.getWorld().getName(),
event.getPlayer(),
clickedBlock.getX(),
clickedBlock.getY(),
clickedBlock.getZ()
);
boolean allowed = RegionManager.hasPermission(event.getPlayer(), clickedBlock.getLocation(), Permission.BUCKET_USE);
if (allowed){
return;
@ -147,13 +141,7 @@ public class RegionEvents implements Listener {
public void onBucketUse(PlayerBucketFillEvent event) {
Block clickedBlock = event.getBlockClicked();
boolean allowed = isAllowedToInteract(
clickedBlock.getWorld().getName(),
event.getPlayer(),
clickedBlock.getX(),
clickedBlock.getY(),
clickedBlock.getZ()
);
boolean allowed = RegionManager.hasPermission(event.getPlayer(), clickedBlock.getLocation(), Permission.BUCKET_USE);
if (allowed){
return;
@ -168,12 +156,7 @@ public class RegionEvents implements Listener {
Location location = entity.getLocation();
boolean allowed = isAllowedToInteract(
location.getWorld().getName(),
event.getPlayer(),
location.getBlockX(),
location.getBlockY(),
location.getBlockZ());
boolean allowed = RegionManager.hasPermission(event.getPlayer(), location, Permission.ENTITY_INTERACT);
if (allowed){
return;
@ -192,12 +175,7 @@ public class RegionEvents implements Listener {
Entity entity = event.getEntity();
Location location = entity.getLocation();
boolean allowed = isAllowedToInteract(
location.getWorld().getName(),
player,
location.getBlockX(),
location.getBlockY(),
location.getBlockZ());
boolean allowed = RegionManager.hasPermission(player, location, Permission.HARM_ENTITIES);
if (allowed){
return;
@ -216,48 +194,74 @@ public class RegionEvents implements Listener {
Location location = event.getVehicle().getLocation();
boolean allowed = isAllowedToInteract(
location.getWorld().getName(),
player,
location.getBlockX(),
location.getBlockY(),
location.getBlockZ());
boolean allowed = RegionManager.hasPermission(player, location, Permission.VEHICLE_INTERACT);
if (allowed){
return;
}
event.setCancelled(true);
event.getVehicle().setVelocity(new Vector(0, 0, 0));
}
//Preventing hopper interaction :P
@EventHandler
public void onDrop(PlayerDropItemEvent event) {
Player player = event.getPlayer();
Location location = player.getLocation();
boolean allowed = isAllowedToInteract(
location.getWorld().getName(),
player,
location.getBlockX(),
location.getBlockY(),
location.getBlockZ());
boolean allowed = RegionManager.hasPermission(player, location, Permission.DROP_ITEMS);
if (allowed){
if (!allowed){
event.setCancelled(true);
return;
}
Item item = event.getItemDrop();
item.getPersistentDataContainer().set(new NamespacedKey(plugin, "hopper_stopper"), PersistentDataType.BYTE, (byte) 1);
item.getPersistentDataContainer().set(new NamespacedKey(plugin, "player-who-dropped"), PersistentDataType.BYTE, (byte) 1);
}
@EventHandler
public void onPickup(EntityPickupItemEvent event){
if (!(event.getEntity() instanceof Player player)){
return;
}
Location location = event.getItem().getLocation();
boolean allowed = RegionManager.hasPermission(player, location, Permission.PICKUP_ITEMS);
if (allowed) return;
event.setCancelled(true);
}
@EventHandler
public void onHopperPickup(InventoryPickupItemEvent event) {
Item item = event.getItem();
PersistentDataContainer dataContainer = item.getPersistentDataContainer();
if (!dataContainer.has(new NamespacedKey(plugin, "player-who-dropped"), PersistentDataType.STRING)) {
return;
}
String playerName = dataContainer.get(new NamespacedKey(plugin, "player-who-dropped"), PersistentDataType.STRING);
assert playerName != null;
Player player = Bukkit.getPlayer(playerName);
if (player == null){
event.setCancelled(true);
return;
}
boolean allowed = RegionManager.hasPermission(player, item.getLocation(), Permission.USE_HOPPER);
if (!item.getPersistentDataContainer().has(new NamespacedKey(plugin, "hopper_stopper"), PersistentDataType.BYTE)) {
if (allowed){
return;
}
@ -272,12 +276,7 @@ public class RegionEvents implements Listener {
Location location = event.getVehicle().getLocation();
boolean allowed = isAllowedToInteract(
location.getWorld().getName(),
player,
location.getBlockX(),
location.getBlockY(),
location.getBlockZ());
boolean allowed = RegionManager.hasPermission(player, location, Permission.VEHICLE_BREAK);
if (allowed){
return;
@ -286,34 +285,89 @@ public class RegionEvents implements Listener {
event.setCancelled(true);
}
@EventHandler
public void onOpenChest(InventoryOpenEvent event) {
InventoryHolder holder = event.getInventory().getHolder();
Player player = (Player) event.getPlayer();
Location location = player.getLocation();
if (!(holder instanceof Chest || holder instanceof DoubleChest || holder instanceof Barrel)){
return;
}
boolean allowed = RegionManager.hasPermission(player, location, Permission.OPEN_CHESTS);
if (allowed){
return;
}
event.setCancelled(true);
}
@EventHandler
public void onMove(PlayerMoveEvent event) {
if (event.getFrom().getBlockX() == event.getTo().getBlockX()
&& event.getFrom().getBlockY() == event.getTo().getBlockY()
&& event.getFrom().getBlockZ() == event.getTo().getBlockZ()) {
return;
}
Player player = event.getPlayer();
Location from = event.getFrom();
Location to = event.getTo();
Region fromRegion = Region.findRegion(from);
Region toRegion = Region.findRegion(to);
if (fromRegion == toRegion){
return;
}
private boolean isAllowedToInteract(String island, Player player, Location location){
return isAllowedToInteract(island, player, location.getBlockX(), location.getBlockY(), location.getBlockZ());
boolean allowedToEnter = RegionManager.hasPermission(player, toRegion, Permission.ENTER);
boolean allowedToExit = RegionManager.hasPermission(player, fromRegion, Permission.EXIT);
if (allowedToEnter && allowedToExit){
return;
}
event.setCancelled(true);
}
private boolean isAllowedToInteract(String island, Player player, int x, int y, int z){
if (player.isOp()){
return true;
@EventHandler
public void onMountVehicle(EntityMountEvent event) {
if (!(event.getEntity() instanceof Player player)){
return;
}
Region region = Region.findRegion(x, y, z, island);
Entity mount = event.getMount();
String entityType = mount.getType().name();
if (region == null){
return false;
if (!(entityType.contains("BOAT") || entityType.contains("MINECART"))){
return;
}
String name = player.getName();
Location location = mount.getLocation();
for (RegionMember regionMember : region.getRegionMembers()){
boolean allowed = RegionManager.hasPermission(player, location, Permission.VEHICLE_RIDE);
if (regionMember.getMembertype().equals("player") && regionMember.getName().equals(name)){
return true;
}
if (allowed){
return;
}
return false;
event.setCancelled(true);
}
private boolean isCrop(Material material) {
String name = material.name();
return name.endsWith("_SAPLING") || name.endsWith("_CROPS") ||
material == Material.WHEAT || material == Material.CARROTS ||
material == Material.POTATOES || material == Material.BEETROOTS ||
material == Material.NETHER_WART || material == Material.SWEET_BERRY_BUSH ||
material == Material.SUGAR_CANE || material == Material.CACTUS ||
material == Material.PUMPKIN_STEM || material == Material.MELON_STEM;
}
}

@ -1,13 +1,21 @@
package xyz.soukup.ecoCraftCore.regions;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import xyz.soukup.ecoCraftCore.database.objects.Region;
import xyz.soukup.ecoCraftCore.database.objects.RegionMember;
import org.bukkit.inventory.ItemStack;
import xyz.soukup.ecoCraftCore.objects.*;
import xyz.soukup.ecoCraftCore.positionMarker.MarkerEvent;
import java.security.InvalidParameterException;
import java.util.List;
public class RegionManager {
public static int createRegion(Player player, Integer type, String owner, String ownerType){
public static final PermissionGroup defaultPermissions = new PermissionGroup(409696);
public static final List<Permission> onlyAdmin = List.of(Permission.EXIT, Permission.TRANSFER_OWNERSHIP);
public static int createRegion(Player player, Integer level, String owner, String ownerType){
Location primaryLocation = MarkerEvent.primaryLocations.get(player);
Location secondaryLocation = MarkerEvent.secondaryLocations.get(player);
@ -27,22 +35,23 @@ public class RegionManager {
int y2 = secondaryLocation.getBlockY();
int z2 = secondaryLocation.getBlockZ();
Region region = new Region(worldName, type, x1, y1, z1, x2, y2, z2);
Region region = new Region(worldName, level, x1, y1, z1, x2, y2, z2);
region.save();
region.addRegionMember(ownerType, owner, "owner");
region.addRegionMember(ownerType, owner, region.getPermissionGroup("owner"));
return 0;
}
public static int addMember(int id, String memberType, String member, String membershipType){
public static int addMember(int id, String memberType, String member, String permissionGroup){
Region region = Region.findById(id);
if (region == null){
return 1;
}
region.addRegionMember(memberType, member, membershipType);
region.addRegionMember(memberType, member, region.getPermissionGroup(permissionGroup));
return 0;
}
@ -67,11 +76,385 @@ public class RegionManager {
for (RegionMember regionMember : region.getRegionMembers()){
if (regionMember.getMembertype().equals("player") && regionMember.getName().equals(name)){
if (regionMember.getMemberType().equals("player") && regionMember.getName().equals(name)){
return true;
}
}
return false;
}
public static boolean hasPermission(Player player, Location location, Permission permission){
if (player.hasPermission("ecocraftcore.region.bypass")){
return true;
}
int x = location.getBlockX();
int y = location.getBlockY();
int z = location.getBlockZ();
String island = location.getWorld().getName();
Region region = Region.findRegion(x, y, z, island);
return hasPermission(player, region, permission);
}
public static boolean hasPermission(Player player, Region region, Permission permission){
if (player.hasPermission("ecocraftcore.region.bypass")){
return true;
}
if (region == null){
player.sendMessage("Region not found");
return defaultPermissions.hasPermission(permission);
}
return region.hasPermission(player, permission);
}
public static boolean hasPermission(String memberType, String memberName, Location location, Permission permission){
int x = location.getBlockX();
int y = location.getBlockY();
int z = location.getBlockZ();
String island = location.getWorld().getName();
Region region = Region.findRegion(x, y, z, island);
return hasPermission(memberType, memberName, region, permission);
}
public static boolean hasPermission(String memberType, String memberName, Region region, Permission permission){
if (region == null){
return defaultPermissions.hasPermission(permission);
}
return region.hasPermission(memberType, memberName, permission);
}
public static Status deleteRegionSafely(int regionId, Player player){
Region region = Region.findById(regionId);
if (region == null){
return Status.NOT_EXIST;
}
if (!region.hasPermission(player, Permission.MANAGE_REGIONS)){
return Status.NO_PERMISSION;
}
region.delete();
return Status.OK;
}
public static Status createRegionSafely(Player player){
Location primaryLocation = MarkerEvent.primaryLocations.get(player);
Location secondaryLocation = MarkerEvent.secondaryLocations.get(player);
if (primaryLocation == null || secondaryLocation == null){
return Status.NO_SELECTION;
}
Region region = Region.getHighestLevelRegion(primaryLocation, secondaryLocation);
if (region == null){
return Status.INVALID_SELECTION;
}
if (!region.hasPermission(player, Permission.MANAGE_REGIONS)){
return Status.NO_PERMISSION;
}
if (!region.envelops(primaryLocation, secondaryLocation)){
return Status.REGION_NOT_ENVELOPS;
}
int x1 = primaryLocation.getBlockX();
int y1 = primaryLocation.getBlockY();
int z1 = primaryLocation.getBlockZ();
int x2 = secondaryLocation.getBlockX();
int y2 = secondaryLocation.getBlockY();
int z2 = secondaryLocation.getBlockZ();
new Region(region, x1, y1, z1, x2, y2, z2);
return Status.OK;
}
public static Status transferOwnershipSafely(int id, Player sender, Player newOwner){
Region region = Region.findById(id);
if (region == null){
return Status.NOT_EXIST;
}
RegionMember regionMember = region.getRegionMember(sender);
if (regionMember == null){
return Status.NO_PERMISSION;
}
if (!regionMember.getPermissionGroup().hasPermission(Permission.TRANSFER_OWNERSHIP)){
return Status.NO_PERMISSION;
}
region.transferOwnership(sender, newOwner);
return Status.OK;
}
public static Status addRegionGroupSafely(int regionId, Player senderPlayer, String name, int weight, ItemStack icon, String displayName, String description) {
Region region = Region.findById(regionId);
if (region == null){
return Status.NOT_EXIST;
}
PermissionGroup senderGroup = region.getRegionMember(senderPlayer).getPermissionGroup();
if (!(region.hasPermission(senderPlayer, Permission.MANAGE_GROUPS) && senderGroup.getWeight() > weight)){
return Status.NO_PERMISSION;
}
if (region.getPermissionGroup(name) != null){
return Status.ALREADY_EXISTS;
}
region.addPermissionGroup(name, weight, icon.getType(), displayName, description, defaultPermissions.getPermissionsNumber());
return Status.OK;
}
public static Status removeRegionGroupSafely(int regionId, Player senderPlayer, String name){
Region region = Region.findById(regionId);
if (region == null){
return Status.NOT_EXIST;
}
PermissionGroup senderGroup = region.getRegionMember(senderPlayer).getPermissionGroup();
PermissionGroup removeGroup = region.getPermissionGroup(name);
if (removeGroup == null){
return Status.NOT_EXIST_GROUP;
}
if (!(region.hasPermission(senderPlayer, Permission.MANAGE_GROUPS) && senderGroup.getWeight() > removeGroup.getWeight())){
return Status.NO_PERMISSION;
}
removeGroup.delete();
return Status.OK;
}
public static Status addGroupPermissionSafely(Player sender, int regionId, String name, String permissionName) {
Permission permission;
try {
permission = Permission.valueOf(permissionName.toUpperCase());
}catch (InvalidParameterException e){
return Status.NOT_EXIST_PERMISSION;
}
Region region = Region.findById(regionId);
if (region == null){
return Status.NOT_EXIST;
}
PermissionGroup group = region.getPermissionGroup(name);
if (group == null){
return Status.NOT_EXIST_GROUP;
}
PermissionGroup senderGroup = region.getRegionMember(sender).getPermissionGroup();
if (!(senderGroup.hasPermission(Permission.MANAGE_GROUPS) && senderGroup.hasPermission(permission) && senderGroup.getWeight() > group.getWeight())){
return Status.NO_PERMISSION;
}
group.addPermission(permission);
group.save();
return Status.OK;
}
public static Status removeGroupPermissionSafely(Player sender, int regionId, String name, String permissionName) {
Permission permission;
try {
permission = Permission.valueOf(permissionName.toUpperCase());
}catch (InvalidParameterException e){
return Status.NOT_EXIST_PERMISSION;
}
Region region = Region.findById(regionId);
if (region == null){
return Status.NOT_EXIST;
}
PermissionGroup group = region.getPermissionGroup(name);
if (group == null){
return Status.NOT_EXIST_GROUP;
}
PermissionGroup senderGroup = region.getRegionMember(sender).getPermissionGroup();
if (!(senderGroup.hasPermission(Permission.MANAGE_GROUPS) && senderGroup.hasPermission(permission) && senderGroup.getWeight() > group.getWeight())){
return Status.NO_PERMISSION;
}
group.removePermission(permission);
group.save();
return Status.OK;
}
public static Status addMemberSafely(int id, Player playerToAdd, Player senderPlayer, String permissionGroupName) {
Region region = Region.findById(id);
if (region == null){
return Status.NOT_EXIST;
}
PermissionGroup group = region.getPermissionGroup(permissionGroupName);
PermissionGroup senderGroup = region.getRegionMember(senderPlayer).getPermissionGroup();
if (group == null){
return Status.NOT_EXIST_GROUP;
}
if (!playerToAdd.getWorld().getName().equals(region.getIsland())){
return Status.PLAYER_NOT_ON_ISLAND;
}
if (!(region.hasPermission(senderPlayer, Permission.MANAGE_MEMBERS) && senderGroup.getWeight() > group.getWeight())){
return Status.NO_PERMISSION;
}
if (region.getRegionMember(playerToAdd) != null){
return Status.ALREADY_MEMBER;
}
region.addRegionMember(playerToAdd, group);
return Status.OK;
}
public static Status removeMemberSafely(int id, String memberToRemove, Player senderPlayer){
Region region = Region.findById(id);
if (region == null){
return Status.NOT_EXIST;
}
RegionMember regionMember = region.getRegionMember( "player", memberToRemove);
if (regionMember == null){
return Status.NOT_MEMBER;
}
PermissionGroup GroupOfRemoved = regionMember.getPermissionGroup();
RegionMember senderAsMember = region.getRegionMember(senderPlayer);
if (senderAsMember == null){
return Status.NO_PERMISSION;
}
PermissionGroup senderGroup = senderAsMember.getPermissionGroup();
if (!(region.hasPermission(senderPlayer, Permission.MANAGE_MEMBERS) && senderGroup.getWeight() > GroupOfRemoved.getWeight())){
return Status.NO_PERMISSION;
}
region.removeRegionMember("player", memberToRemove);
return Status.OK;
}
public static Status changeGroupIconSafely(int id, String groupName, ItemStack icon, Player senderPlayer){
Region region = Region.findById(id);
if (region == null){
return Status.NOT_EXIST;
}
PermissionGroup permissionGroup = region.getPermissionGroup(groupName);
if (permissionGroup == null){
return Status.NOT_EXIST_GROUP;
}
PermissionGroup senderGroup = region.getRegionMember(senderPlayer).getPermissionGroup();
if (!(region.hasPermission(senderPlayer, Permission.MANAGE_GROUPS) && senderGroup.getWeight() > permissionGroup.getWeight())){
return Status.NO_PERMISSION;
}
permissionGroup.setIcon(icon.getType());
permissionGroup.save();
return Status.OK;
}
public static Status changeGroupDisplayNameSafely(int id, String groupName, String displayName, Player senderPlayer){
Region region = Region.findById(id);
if (region == null){
return Status.NOT_EXIST;
}
PermissionGroup permissionGroup = region.getPermissionGroup(groupName);
if (permissionGroup == null){
return Status.NOT_EXIST_GROUP;
}
PermissionGroup senderGroup = region.getRegionMember(senderPlayer).getPermissionGroup();
if (!(region.hasPermission(senderPlayer, Permission.MANAGE_GROUPS) && senderGroup.getWeight() > permissionGroup.getWeight())){
return Status.NO_PERMISSION;
}
permissionGroup.setDisplayName(displayName);
permissionGroup.save();
return Status.OK;
}
public static Status changeGroupDescriptionSafely(int id, String groupName, String description, Player senderPlayer){
Region region = Region.findById(id);
if (region == null){
return Status.NOT_EXIST;
}
PermissionGroup permissionGroup = region.getPermissionGroup(groupName);
if (permissionGroup == null){
return Status.NOT_EXIST_GROUP;
}
PermissionGroup senderGroup = region.getRegionMember(senderPlayer).getPermissionGroup();
if (!(region.hasPermission(senderPlayer, Permission.MANAGE_GROUPS) && senderGroup.getWeight() > permissionGroup.getWeight())){
return Status.NO_PERMISSION;
}
permissionGroup.setDescription(description);
permissionGroup.save();
return Status.OK;
}
}

@ -0,0 +1,185 @@
package xyz.soukup.ecoCraftCore.regions;
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
import com.github.stefvanschie.inventoryframework.gui.type.ChestGui;
import com.github.stefvanschie.inventoryframework.pane.OutlinePane;
import com.github.stefvanschie.inventoryframework.pane.component.ToggleButton;
import io.papermc.paper.dialog.Dialog;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;
import xyz.soukup.ecoCraftCore.genericMenus.PlayerSelector;
import xyz.soukup.ecoCraftCore.genericMenus.TextInput;
import xyz.soukup.ecoCraftCore.gui.GuiItemBuilder;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import xyz.soukup.ecoCraftCore.objects.Island;
import xyz.soukup.ecoCraftCore.objects.Permission;
import xyz.soukup.ecoCraftCore.objects.Region;
import java.util.ArrayList;
import java.util.List;
public class RegionMenu {
public static ChestGui regionGui(Player player, Region region){
return buildGui(player, region);
}
private static ChestGui buildGui(Player player, Region region){
String title;
int regionLevel = region.getLevel();
if (regionLevel == -1){
title = LangManager.getLegacyString("gui.region.title-island");
} else {
title = LangManager.getLegacyString("gui.region.title");
}
ChestGui gui = new ChestGui(2, title);
OutlinePane outlinePane = new OutlinePane(0, 0, 9, 2);
addIslandSettings(outlinePane, player, region);
addMemberManagement(outlinePane, player, region);
gui.addPane(outlinePane);
return gui;
}
private static void addMemberManagement(OutlinePane pane, Player player, Region region){
if (!region.hasPermission(player, Permission.MANAGE_MEMBERS)){
return;
}
GuiItem addMemberButton = new GuiItemBuilder(Material.PLAYER_HEAD,
"gui.region.add-member.name",
"gui.region.add-member.description",
(event -> addMemberSelectPlayer(player, region)))
.build();
}
private static void addMemberSelectPlayer(Player player, Region region) {
World world = Bukkit.getWorld(region.getIsland());
if (world == null){
return;
}
List<Player> players = world.getPlayers();
List<Player> candidates = new ArrayList<>();
for(Player candidate : players){
if (region.getRegionMember(candidate) != null){
continue;
}
candidates.add(candidate);
}
ChestGui playerSelectGui = PlayerSelector.selectPlayer(player,
candidates,
(( selectedPlayer) -> addMemberSelectGroup(player, region, selectedPlayer)),
(event -> regionGui(player, region).show(player)));
playerSelectGui.show(player);
}
private static void addMemberSelectGroup(Player player, Region region, Player selectedPlayer){
}
private static void addIslandSettings(OutlinePane pane, Player player, Region region) {
if (region.getLevel() != -1){
return;
}
if (!region.hasPermission(player, Permission.MANAGE_INFO)){
return;
}
Island island = Island.findByUuid(region.getIsland());
if (island == null){
return;
}
ToggleButton toggleButton = new ToggleButton(1,1);
Dialog islandTitleDialog = TextInput.textInput(player,
"gui.region.name-island.name",
"gui.region.name-island.input",
island.getDisplayName(),
(s -> setIslandName(player, island, s)));
Dialog islandDescriptionDialog = TextInput.textInput(player,
"gui.region.description-island.name",
"gui.region.description-island.input",
island.getDescritpion(),
(s -> setIslandDescription(player, island, s)));
GuiItem visibilityToggle = new GuiItemBuilder(Material.ENDER_EYE,
"gui.region.visibility-island.name",
"gui.region.visibility-island.description",
(event -> toggleIslandPublic(player, island, event)),
island.getPublic()
).build();
GuiItem titleButton = new GuiItemBuilder(
Material.DARK_OAK_SIGN,
"gui.region.name-island.name",
"gui.region.name-island.description",
(event -> player.showDialog(islandTitleDialog))
).build();
GuiItem descriptionButton = new GuiItemBuilder(
Material.ACACIA_SIGN,
"gui.region.description-island.name",
"gui.region.description-island.description",
(event -> player.showDialog(islandDescriptionDialog))
).build();
pane.addItem(visibilityToggle);
pane.addItem(titleButton);
pane.addItem(descriptionButton);
}
private static void toggleIslandPublic(Player player, Island island, InventoryClickEvent event){
island.setPublic(!island.getPublic());
island.save();
ChestGui chestGui = (ChestGui) ChestGui.getGui(event.getInventory());
if (chestGui == null){
return;
}
OutlinePane pane = new OutlinePane(event.getSlot(), 1);
GuiItem visibilityToggle = new GuiItemBuilder(Material.ENDER_EYE,
"gui.region.visibility-island.name",
"gui.region.visibility-island.description",
(clickEvent -> toggleIslandPublic(player, island, event)),
island.getPublic()
).build();
pane.addItem(visibilityToggle);
chestGui.addPane(pane);
}
private static void setIslandDescription(Player player, Island island, String description) {
island.setDescritpion(description);
island.save();
LangManager.send(player, "island.changed.description");
}
private static void setIslandName(Player player, Island island, String name) {
island.setDisplayName(name);
island.save();
LangManager.send(player, "island.changed.name");
}
}

@ -10,10 +10,10 @@ import org.bukkit.block.Sign;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import xyz.soukup.ecoCraftCore.positionMarker.MarkerEvent;
import xyz.soukup.ecoCraftCore.database.objects.Shop;
import xyz.soukup.ecoCraftCore.database.objects.VirtualChest;
import xyz.soukup.ecoCraftCore.objects.Shop;
import xyz.soukup.ecoCraftCore.objects.VirtualChest;
import xyz.soukup.ecoCraftCore.inventory.InventoryUtils;
import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import xyz.soukup.ecoCraftCore.utilities.PDC;
public class ShopCommand {
@ -46,7 +46,7 @@ public class ShopCommand {
CommandSourceStack source = ctx.getSource();
if (!(source.getSender() instanceof Player player)) {
Messages.send(source.getSender(), "generic.error.not-player");
LangManager.send(source.getSender(), "generic.error.not-player");
return 0;
}
@ -55,20 +55,20 @@ public class ShopCommand {
Sign sign = MarkerEvent.signs.get(player);
if (sign == null || chest == null) {
Messages.send(player, "shop.error.not-marked");
LangManager.send(player, "shop.error.not-marked");
return 0;
}
// 2. Validate Item in Hand
ItemStack item = player.getInventory().getItemInMainHand();
if (item.isEmpty()) {
Messages.send(player, "shop.error.empty-hand");
LangManager.send(player, "shop.error.empty-hand");
return 0;
}
// 3. Check if already a shop
if (PDC.getInteger(sign, "shop") != null) {
Messages.send(player, "shop.error.already-shop");
LangManager.send(player, "shop.error.already-shop");
return 0;
}
@ -99,7 +99,7 @@ public class ShopCommand {
shop.save();
shop.writeIntoSign(sign);
Messages.send(player, "shop.created");
LangManager.send(player, "shop.created");
return 1;
}
}

@ -30,11 +30,11 @@ import org.bukkit.inventory.PlayerInventory;
import xyz.soukup.ecoCraftCore.virtualChest.VirtualChestLogic;
import xyz.soukup.ecoCraftCore.gui.GuiItemBuilder;
import xyz.soukup.ecoCraftCore.inventory.InventoryUtils;
import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.database.objects.Account;
import xyz.soukup.ecoCraftCore.database.objects.Shop;
import xyz.soukup.ecoCraftCore.database.objects.Transaction;
import xyz.soukup.ecoCraftCore.database.objects.VirtualChest;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import xyz.soukup.ecoCraftCore.objects.Account;
import xyz.soukup.ecoCraftCore.objects.Shop;
import xyz.soukup.ecoCraftCore.objects.Transaction;
import xyz.soukup.ecoCraftCore.objects.VirtualChest;
import xyz.soukup.ecoCraftCore.utilities.*;
import java.util.HashMap;
@ -75,7 +75,7 @@ public class ShopLogic implements Listener {
Player player = event.getPlayer();
if (VirtualChestLogic.openedChests.containsKey(shop.getVirtualChestID())){
Messages.send(player, "shop.error.chest-open");
LangManager.send(player, "shop.error.chest-open");
return;
}
@ -129,7 +129,7 @@ public class ShopLogic implements Listener {
public static ChestGui buildShopGui(Player player, Shop shop){
ChestGui gui = new ChestGui(1, Messages.getAsString("gui.shop.title"));
ChestGui gui = new ChestGui(1, LangManager.getLegacyString("gui.shop.title"));
gui.setOnGlobalClick(inventoryClickEvent -> {
inventoryClickEvent.setCancelled(true);
@ -148,7 +148,7 @@ public class ShopLogic implements Listener {
hashMap.put("price", String.format("%.2f", buyPrice));
GuiItem one = new GuiItemBuilder(Material.LIME_WOOL)
.setName(Messages.get("gui.shop.buy", hashMap))
.setName(LangManager.get("gui.shop.buy", hashMap))
.build();
one.setAction(event -> {
@ -160,7 +160,7 @@ public class ShopLogic implements Listener {
hashMap.put("price", String.format("%.2f", buyPrice*8));
GuiItem eight = new GuiItemBuilder(Material.LIME_WOOL)
.setName(Messages.get("gui.shop.buy", hashMap))
.setName(LangManager.get("gui.shop.buy", hashMap))
.build();
eight.setAction(event -> {
@ -181,7 +181,7 @@ public class ShopLogic implements Listener {
hashMap.put("price", String.format("%.2f", sellPrice));
GuiItem one = new GuiItemBuilder(Material.YELLOW_WOOL)
.setName(Messages.get("gui.shop.sell", hashMap))
.setName(LangManager.get("gui.shop.sell", hashMap))
.build();
one.setAction(event -> {
@ -194,7 +194,7 @@ public class ShopLogic implements Listener {
hashMap.put("price", String.format("%.2f", sellPrice*8));
GuiItem eight = new GuiItemBuilder(Material.YELLOW_WOOL)
.setName(Messages.get("gui.shop.sell", hashMap))
.setName(LangManager.get("gui.shop.sell", hashMap))
.build();
eight.setAction(event -> {
@ -217,24 +217,24 @@ public class ShopLogic implements Listener {
public static Dialog buildEditDialog(Shop shop){
return Dialog.create(builder -> builder.empty()
.base(DialogBase.builder(Messages.get("gui.shop-edit.title"))
.base(DialogBase.builder(LangManager.get("gui.shop-edit.title"))
.inputs(List.of(
DialogInput.text("count", Messages.get("gui.shop-edit.inputs.count"))
DialogInput.text("count", LangManager.get("gui.shop-edit.inputs.count"))
.initial(String.valueOf(shop.getAmount()))
.build(),
DialogInput.text("sellprice", Messages.get("gui.shop-edit.inputs.price-sell"))
DialogInput.text("sellprice", LangManager.get("gui.shop-edit.inputs.price-sell"))
.initial(String.valueOf(shop.getPriceSell()))
.build(),
DialogInput.text("buyprice", Messages.get("gui.shop-edit.inputs.price-buy"))
DialogInput.text("buyprice", LangManager.get("gui.shop-edit.inputs.price-buy"))
.initial(String.valueOf(shop.getPriceBuy()))
.build(),
DialogInput.bool("changeitem", Messages.get("gui.shop-edit.inputs.change-item"))
DialogInput.bool("changeitem", LangManager.get("gui.shop-edit.inputs.change-item"))
.build()
))
.build())
.type(DialogType.confirmation(
ActionButton.builder(Messages.get("gui.shop-edit.button.confirm"))
ActionButton.builder(LangManager.get("gui.shop-edit.button.confirm"))
.action(DialogAction.customClick(
(view, audience) -> {
changeShopParameters(view, audience, shop);
@ -244,7 +244,7 @@ public class ShopLogic implements Listener {
.build()
))
.build(),
ActionButton.builder(Messages.get("gui.shop-edit.button.cancel")).build()
ActionButton.builder(LangManager.get("gui.shop-edit.button.cancel")).build()
))
);
@ -253,7 +253,7 @@ public class ShopLogic implements Listener {
public static void buy(Shop shop, Player player, int multiplier){
if (VirtualChestLogic.openedChests.containsKey(shop.getVirtualChestID())){
Messages.send(player, "shop.error.chest-open");
LangManager.send(player, "shop.error.chest-open");
return;
}
@ -265,7 +265,7 @@ public class ShopLogic implements Listener {
Account account = Account.getOrCreate(player);
if (price > account.getBalance()){
Messages.send(player, "generic.error.no-money.self");
LangManager.send(player, "generic.error.no-money.self");
return;
}
@ -278,12 +278,12 @@ public class ShopLogic implements Listener {
Inventory playerInventory = player.getInventory();
if (InventoryUtils.getSpaceLeft(playerInventory, itemStack) < amount){
Messages.send(player, "generic.error.no-space.self");
LangManager.send(player, "generic.error.no-space.self");
return;
}
if (!virtualChest.removeItem(itemStack)){
Messages.send(player, "generic.error.no-item.shop");
LangManager.send(player, "generic.error.no-item.shop");
return;
}
@ -300,7 +300,7 @@ public class ShopLogic implements Listener {
hashMap.put("price", String.format("%.2f", price));
hashMap.put("item", PlainTextComponentSerializer.plainText().serialize(itemStack.displayName()));
Messages.send(player, "shop.buy", hashMap);
LangManager.send(player, "shop.buy", hashMap);
}
@ -328,7 +328,7 @@ public class ShopLogic implements Listener {
buyPrice = Float.parseFloat(Objects.requireNonNull(response.getText("buyprice")));
count = Integer.parseInt(Objects.requireNonNull(response.getText("count")));
} catch (NumberFormatException exception) {
Messages.send(player, "gui.error.invalid-input");
LangManager.send(player, "gui.error.invalid-input");
return;
}
@ -342,7 +342,7 @@ public class ShopLogic implements Listener {
public static void sell(Shop shop, Player player, int multiplier){
if (VirtualChestLogic.openedChests.containsKey(shop.getVirtualChestID())){
Messages.send(player, "shop.error.chest-open");
LangManager.send(player, "shop.error.chest-open");
return;
}
@ -354,7 +354,7 @@ public class ShopLogic implements Listener {
Account account = Account.getOrCreate(shop.getOwnerType(), shop.getOwner());
if (price > account.getBalance()){
Messages.send(player, "generic.error.no-money.self");
LangManager.send(player, "generic.error.no-money.self");
return;
}
@ -367,12 +367,12 @@ public class ShopLogic implements Listener {
Inventory playerInventory = player.getInventory();
if (InventoryUtils.getCount(playerInventory, itemStack) < amount){
Messages.send(player, "generic.error.no-item.self");
LangManager.send(player, "generic.error.no-item.self");
return;
}
if (!virtualChest.addItem(itemStack)){
Messages.send(player, "generic.error.no-space.shop");
LangManager.send(player, "generic.error.no-space.shop");
return;
}
@ -388,12 +388,12 @@ public class ShopLogic implements Listener {
hashMap.put("price", String.format("%.2f", price));
hashMap.put("item", PlainTextComponentSerializer.plainText().serialize(itemStack.displayName()));
Messages.send(player, "shop.sell", hashMap);
LangManager.send(player, "shop.sell", hashMap);
}
public static HopperGui confirmBreakGui(Block block, Shop shop){
HopperGui gui = new HopperGui(Messages.getAsString("menu.destroy-confirmation.title"));
HopperGui gui = new HopperGui(LangManager.getLegacyString("menu.destroy-confirmation.title"));
OutlinePane pane = new OutlinePane(0,0, 5, 1);
gui.setOnGlobalClick(inventoryClickEvent -> {
@ -401,11 +401,11 @@ public class ShopLogic implements Listener {
});
GuiItem confirmButton = new GuiItemBuilder(Material.LIME_WOOL)
.setName(Messages.get("menu.destroy-confirmation.confirm"))
.setName(LangManager.get("menu.destroy-confirmation.confirm"))
.build();
GuiItem cancelButton = new GuiItemBuilder(Material.RED_WOOL)
.setName(Messages.get("menu.destroy-confirmation.cancel"))
.setName(LangManager.get("menu.destroy-confirmation.cancel"))
.build();
cancelButton.setAction(event -> {

@ -23,12 +23,10 @@ import org.bukkit.block.sign.Side;
import org.bukkit.block.sign.SignSide;
import org.bukkit.entity.Player;
import org.bukkit.persistence.PersistentDataType;
import xyz.soukup.ecoCraftCore.database.objects.Shop;
import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import xyz.soukup.ecoCraftCore.regions.RegionManager;
import xyz.soukup.ecoCraftCore.utilities.PDC;
import javax.sound.sampled.Line;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -50,14 +48,14 @@ public class SignEditCommand {
BlockState blockState = block.getState();
if (!(blockState instanceof Sign sign)){
Messages.send(player, "sign-edit.error.not-sign");
LangManager.send(player, "sign-edit.error.not-sign");
return 1;
}
Location location = sign.getLocation();
if (!RegionManager.isAllowedToInteract(player, location)){
Messages.send(player, "region.error.not-allowed-to-interact");
LangManager.send(player, "region.error.not-allowed-to-interact");
return 1;
}
@ -80,16 +78,16 @@ public class SignEditCommand {
actionButtons.add(ActionButton.builder(Messages.get("gui.sign-edit.buttons.copy"))
actionButtons.add(ActionButton.builder(LangManager.get("gui.sign-edit.buttons.copy"))
.action(DialogAction.customClick((view, audience) -> copySignText(view, player, sign), ClickCallback.Options.builder().build()))
.build());
actionButtons.add(ActionButton.builder(Messages.get("gui.sign-edit.buttons.paste"))
actionButtons.add(ActionButton.builder(LangManager.get("gui.sign-edit.buttons.paste"))
.action(DialogAction.customClick((view, audience) -> pasteSignText(sign, player), ClickCallback.Options.builder().build()))
.build());
actionButtons.add(ActionButton.builder(Messages.get("gui.sign-edit.buttons.confirm"))
actionButtons.add(ActionButton.builder(LangManager.get("gui.sign-edit.buttons.confirm"))
.action(DialogAction.customClick((view, audience) -> editSign(view, sign, player), ClickCallback.Options.builder().build()))
.build());
actionButtons.add(ActionButton.builder(Messages.get("gui.sign-edit.buttons.cancel"))
actionButtons.add(ActionButton.builder(LangManager.get("gui.sign-edit.buttons.cancel"))
.action(DialogAction.customClick((view, audience) -> audience.closeDialog(), ClickCallback.Options.builder().build()))
.build());
@ -97,21 +95,21 @@ public class SignEditCommand {
List<String> finalLines = lines;
return Dialog.create(builder -> builder.empty()
.base(DialogBase.builder(Messages.get("gui.sign-edit.title"))
.base(DialogBase.builder(LangManager.get("gui.sign-edit.title"))
.inputs(List.of(
DialogInput.text("line1", Messages.get("gui.sign-edit.inputs.line1"))
DialogInput.text("line1", LangManager.get("gui.sign-edit.inputs.line1"))
.initial(finalLines.getFirst())
.maxLength(256)
.build(),
DialogInput.text("line2", Messages.get("gui.sign-edit.inputs.line2"))
DialogInput.text("line2", LangManager.get("gui.sign-edit.inputs.line2"))
.initial(finalLines.get(1))
.maxLength(256)
.build(),
DialogInput.text("line3", Messages.get("gui.sign-edit.inputs.line3"))
DialogInput.text("line3", LangManager.get("gui.sign-edit.inputs.line3"))
.initial(finalLines.get(2))
.maxLength(256)
.build(),
DialogInput.text("line4", Messages.get("gui.sign-edit.inputs.line4"))
DialogInput.text("line4", LangManager.get("gui.sign-edit.inputs.line4"))
.initial(finalLines.get(3))
.maxLength(256)
.build()
@ -150,7 +148,7 @@ public class SignEditCommand {
lines.add(view.getText("line4"));
clipBoard.put(player, lines);
Messages.send(player, "gui.sign-edit.success.copied");
LangManager.send(player, "gui.sign-edit.success.copied");
pasteSignText(sign, player);
}

@ -16,6 +16,8 @@ import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.event.vehicle.VehicleExitEvent;
import org.bukkit.persistence.PersistentDataType;
import xyz.soukup.ecoCraftCore.objects.Permission;
import xyz.soukup.ecoCraftCore.regions.RegionManager;
import xyz.soukup.ecoCraftCore.utilities.PDC;
@ -55,6 +57,12 @@ public class LetMeSit implements Listener {
return;
}
boolean allowed = RegionManager.hasPermission(player, block.getLocation(), Permission.SIT);
if (!allowed){
return;
}
float yaw = switch (stairs.getFacing()) {
case NORTH -> 0f;
case WEST -> -90f;

@ -15,10 +15,9 @@ import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import xyz.soukup.ecoCraftCore.database.objects.Shop;
import xyz.soukup.ecoCraftCore.gui.GuiItemBuilder;
import xyz.soukup.ecoCraftCore.database.objects.VirtualChest;
import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.objects.VirtualChest;
import xyz.soukup.ecoCraftCore.messages.LangManager;
import xyz.soukup.ecoCraftCore.utilities.PDC;
import java.util.HashMap;
@ -185,7 +184,7 @@ public class VirtualChestLogic implements Listener {
}
public static HopperGui confirmBreakGui(Block block, VirtualChest virtualChest){
HopperGui gui = new HopperGui(Messages.getAsString("menu.destroy-confirmation.title"));
HopperGui gui = new HopperGui(LangManager.getLegacyString("menu.destroy-confirmation.title"));
OutlinePane pane = new OutlinePane(0,0, 5, 1);
gui.setOnGlobalClick(inventoryClickEvent -> {
@ -193,11 +192,11 @@ public class VirtualChestLogic implements Listener {
});
GuiItem confirmButton = new GuiItemBuilder(Material.LIME_WOOL)
.setName(Messages.get("menu.destroy-confirmation.confirm"))
.setName(LangManager.get("menu.destroy-confirmation.confirm"))
.build();
GuiItem cancelButton = new GuiItemBuilder(Material.RED_WOOL)
.setName(Messages.get("menu.destroy-confirmation.cancel"))
.setName(LangManager.get("menu.destroy-confirmation.cancel"))
.build();
cancelButton.setAction(event -> {

@ -1,6 +1,6 @@
generic:
success:
creat ed: <green>Vytvořeno.
created: <green>Vytvořeno.
error:
not-player: "<red>Na tuto akci musíš být hráč"
no-funds:
@ -12,7 +12,53 @@ generic:
no-item:
self: "<red>Nemáš dostatek itemů"
shop: "<red>Obchod nemá dostatek itemů"
island:
changed:
name: "<green>Jméno ostrova změněno."
description: "<green>Popis ostrova změněn."
region:
command:
created: "<green>Úspěšně vytvořeno."
deleted: "<green>Úspěšně odstraněno."
created-region: "<green>Pozemek vytvořen."
deleted-region: "<green>Pozemek odsraněn."
created-group: "<green>Skupina vytvořena."
deleted-group: "<green>Skupina odstraněna."
added-member: "<green>Hráč přidán do pozemku."
removed-member: "<green>Hráč odebrán z pozemku."
added-permission: "<green>Oprávnění přidáno."
removed-permission: "<green>Oprávnění odebráno."
icon-changed: "<green>Ikona změněna."
display-name-changed: "<green>Display name změněno."
description-changed: "<green>Popis změněno."
confirm-warning:
delete: "<gold><b>!! </b>Chystáš se odstranit pozemek<b> !!</b><br>Pokud nemáš nadřadný pozemek přijdeš o území<br><red><bold><hover:show_text:'<red><bold>ODSTRANIT POZEMEK<br><dark_red>NELZE VRÁTIT ZPĚT'><click:run_command:'/region <id> delete confirm'>-> POTVRDIT A ODSTRANIT <-</click></hover>"
transfer-ownership: "<gold><b>!! </b>Chystáš se přenést vlastnictví pozemeku<b> !!</b><br>Nad pozemkem již nebudeš mít kontrolu<br><red><bold><hover:show_text:'<red><bold>PŘENÉST VLASTNICTVÍ<br><dark_red>NELZE VRÁTIT ZPĚT'><click:run_command:'/region <id> transfer-ownership <name> confirm'>-> POTVRDIT A PŘEVÉST <-</click></hover>"
error:
no-selection: "<red>Musíš označit pozice"
no-permission: "<red>Na toto nemáš dostatečné oprávnění"
invalid-selection: "<red>Neplatná pozice"
region-not-envelops: "<red>Podřadný pozemek musí být vytvořen na jednom stávajícím pozemku"
not-exist: "<red>Pozemek neexistuje"
not-exist-group: "<red>Daná skupina neexistuje."
not-exist-permission: "<red>Dané oprávnění neexistuje."
player-not-on-island: "<red>Hráš musí být na stejném ostrově jako pozemek"
already-member: "<red>Hráč je již členem tohoto pozemku"
already-exist: "<red>Již existuje."
not-member: "<red>Hráč není členem tohoto pozemku"
permission-groups:
owner:
name: "<red>Majitel"
description: "<gray>Může vše co admin a k tomu předat vlastnictví"
admin:
name: "<yellow>Správce"
description: "<gray>Může měnit veškerá nastavení pozemku"
member:
name: "<green>Člen"
description: "<gray>Může interagovat s pozemkem"
default:
name: "<gray>Výchozí"
description: "<gray>Oprávnění, které mají všichni"
error:
not-marked: "<red>Musíš nejprve označit pozice"
not-exist: "<red>Region neexistuje"
@ -68,6 +114,39 @@ menu:
buy: "<green>Koupit <amount>ks za <price>$"
sell: "<yellow>Prodat <amount>ks za <price>$"
gui:
toggle:
on: "<green>Povoleno"
off: "<red>Zakázáno"
text-input:
confirm: "<green>Potvrdit"
cancel: "<red>Zrušit"
player-selector:
title: "<aqua><bold>Vyber Hráče"
name-format: "<yellow><name>"
back-button:
name: "<yellow>Zpět"
lore : ""
region:
title: "<aqua><bold>Nastavení pozemku"
title-island: "<aqua><bold>Nastavení ostrovního pozemku"
add-member:
name: "<yellow><bold>Přidat člena"
description: "<gray>Přidej hráče, jenž dostane<br> další práva na pozemku"
remove-member:
name: "<yellow><bold>Odebrat člena"
description: "<gray>Odstranit člena<br>z pozemku"
name-island:
name: "<yellow><bold>Změnit název ostrova"
description: "<gray>Změní název jenž se<br>zobrauje ve výběru ostrovů"
input: "<yellow>Nový název"
description-island:
name: "<yellow><bold>Změnit popis ostrova"
description: "<gray>Změní popis jenž se<br>zobrauje ve výběru ostrovů"
input: "<yellow>Nový popis"
visibility-island:
name: "<yellow><bold>Veřejný ostrov"
description: "<gray>Pokud je povoleno mohou hráči<br>tvůj ostrov najít v seznamu ostrovů"
error:
invalid-input: "<red>Vámi zadané hodnoty nejsou platné."
all: "<green>Seznam guis: <yellow><1>, <2>"

Loading…
Cancel
Save