Author SHA1 Message Date
redtea 61873f6dd7 1.0.3c SNAPSHOT HOTFIX
Color fix, confirm menu fix
2023-08-20 00:55:08 +03:00
redtea 44f3226838 1.0.3c SNAPSHOT HOTFIX
Color fix, confirm menu fix
2023-08-20 00:51:19 +03:00
redtea 71203206d1 1.0.3b SNAPSHOT HOTFIX
Fix dupe with enabled drop confirm
2023-08-11 01:59:02 +03:00
redtea d1dcc34708 Merge remote-tracking branch 'origin/main' 2023-08-10 16:18:41 +03:00
redtea ac8744c0f3 1.0.3a SNAPSHOT HOTFIX
Fixes for clear spigot
2023-08-10 14:06:53 +03:00
Denis Istratov 89af1d872c Update README.md 2023-08-09 23:32:25 +03:00
redtea c270c8b45d Update README.md 2023-08-09 23:29:32 +03:00
redtea 14556e7afa 1.0.3 SNAPSHOT 2023-08-09 23:24:49 +03:00
Denis Istratov c885fc87da Update README.md 2023-08-09 23:22:53 +03:00
redtea cdea9cfa7f Merge branch 'main' of https://github.com/iRedTea/NoDropX 2023-07-27 02:16:47 +03:00
redtea 05fbf78034 1.0.2b SNAPSHOT-HOTFIX
Fix on respawn
2023-07-27 02:16:44 +03:00
Denis Istratov 79a8f6a09f Update README.md 2023-07-26 15:01:02 +03:00
Denis Istratov 1640b45041 Update README.md 2023-07-26 15:00:48 +03:00
Denis Istratov 0b111d48bf Update README.md 2023-07-26 15:00:30 +03:00
47 changed files with 908 additions and 148 deletions

No files matched your search

+2
View File
@@ -22,3 +22,5 @@ gradle-app.setting
run run
.idea .idea
.gradle
build
+9 -3
View File
@@ -1,4 +1,8 @@
<img src="https://i.imgur.com/AxYMos8.png)https://i.imgur.com/AxYMos8.png"></img> # NoDropX
Give no drop items!
=======
<img src="https://i.imgur.com/4KNCfzl.png"></img>
# NoDropX # NoDropX
**Give no drop items!** **Give no drop items!**
@@ -11,12 +15,14 @@ SpigotMC resource: https://www.spigotmc.org/resources/nodropx.111485/
**Features** **Features**
- Supports HEX Colors (MiniMessages and MD5 ChatColor) - Supports HEX Colors (MiniMessages and MD5 ChatColor)
- Supports all versions from 1.12.2 to 1.20.1 (Spigot/Paper) - Supports all versions from 1.12.2 to 1.20.1 (Spigot/Paper/Folia)
- No drop items storage: `/nodrop gui` - No drop items storage: `/nodrop gui`
- Fully customization - Fully customization
- Items that protect other slots from death - Items that protect other slots from death
- Developer API - Developer API
- Mods support (tested on Arclight 1.16.5) - Mods support (tested on Arclight 1.16.5)
- ItemsAdder support - ItemsAdder support
- Folia support
<img src="https://i.imgur.com/7DdnANr.png"></img>
This plugin uses <a href="https://github.com/iRedTea/CarcadeX">CarcadeX</a> library
+2 -1
View File
@@ -5,7 +5,7 @@ plugins {
} }
group = 'me.redtea' group = 'me.redtea'
version = '1.0.2a-SNAPSHOT-HOTFIX' version = '1.0.3c-SNAPSHOT'
repositories { repositories {
mavenCentral() mavenCentral()
@@ -42,6 +42,7 @@ dependencies {
implementation files("libs/MiniMessages.jar") implementation files("libs/MiniMessages.jar")
implementation "dev.triumphteam:triumph-gui:3.1.2" implementation "dev.triumphteam:triumph-gui:3.1.2"
compileOnly "com.github.LoneDev6:API-ItemsAdder:3.5.0b" compileOnly "com.github.LoneDev6:API-ItemsAdder:3.5.0b"
compileOnly files("libs/nodropxforgebridge-1.4.jar")
} }
def targetJavaVersion = 8 def targetJavaVersion = 8
Binary file not shown.
Binary file not shown.
+84 -57
View File
@@ -10,23 +10,35 @@ import me.redtea.nodropx.factory.item.impl.NoDropItemFactoryImpl;
import me.redtea.nodropx.factory.text.TextContext; import me.redtea.nodropx.factory.text.TextContext;
import me.redtea.nodropx.factory.text.TextServicesFactory; import me.redtea.nodropx.factory.text.TextServicesFactory;
import me.redtea.nodropx.factory.text.impl.TextServicesFactoryImpl; import me.redtea.nodropx.factory.text.impl.TextServicesFactoryImpl;
import me.redtea.nodropx.gui.facade.GuiFacade; import me.redtea.nodropx.folia.FoliaSupporter;
import me.redtea.nodropx.gui.facade.impl.GuiFacadeImpl;
import me.redtea.nodropx.gui.pages.StorageGui;
import me.redtea.nodropx.libs.bstats.Metrics; import me.redtea.nodropx.libs.bstats.Metrics;
import me.redtea.nodropx.libs.carcadex.repo.MutableRepo; import me.redtea.nodropx.libs.carcadex.repo.MutableRepo;
import me.redtea.nodropx.libs.carcadex.repo.Repo; import me.redtea.nodropx.libs.carcadex.repo.Repo;
import me.redtea.nodropx.libs.carcadex.repo.impl.yaml.YamlRepo;
import me.redtea.nodropx.libs.message.container.Messages; import me.redtea.nodropx.libs.message.container.Messages;
import me.redtea.nodropx.libs.message.verifier.impl.FileMessageVerifier; import me.redtea.nodropx.libs.message.verifier.impl.FileMessageVerifier;
import me.redtea.nodropx.listener.ConfirmDropHandler;
import me.redtea.nodropx.listener.InventoryHandler; import me.redtea.nodropx.listener.InventoryHandler;
import me.redtea.nodropx.listener.PlayerHandler; import me.redtea.nodropx.listener.PlayerHandler;
import me.redtea.nodropx.listener.menu.SinglePageGuiHandler;
import me.redtea.nodropx.menu.CachedMenu;
import me.redtea.nodropx.menu.Menu;
import me.redtea.nodropx.menu.dropconfirm.DropConfirmMFGui;
import me.redtea.nodropx.menu.facade.MenuFacade;
import me.redtea.nodropx.menu.facade.impl.MenuFacadeImpl;
import me.redtea.nodropx.menu.storage.pages.MFPageGui;
import me.redtea.nodropx.menu.storage.singlepage.SinglePageController;
import me.redtea.nodropx.menu.storage.singlepage.SinglePageGui;
import me.redtea.nodropx.model.cosmetic.impl.DisplayNameCosmetic; import me.redtea.nodropx.model.cosmetic.impl.DisplayNameCosmetic;
import me.redtea.nodropx.model.materialprovider.impl.ItemStackProviderDefault; import me.redtea.nodropx.model.materialprovider.impl.ItemStackProviderDefault;
import me.redtea.nodropx.model.materialprovider.impl.ItemsAdderProvider; import me.redtea.nodropx.model.materialprovider.impl.ItemsAdderProvider;
import me.redtea.nodropx.schema.ItemStackListSchema; import me.redtea.nodropx.schema.ItemStackListSchema;
import me.redtea.nodropx.service.capasity.CapacityService;
import me.redtea.nodropx.service.capasity.impl.CapacityServiceImpl;
import me.redtea.nodropx.service.cosmetic.CosmeticService; import me.redtea.nodropx.service.cosmetic.CosmeticService;
import me.redtea.nodropx.service.cosmetic.impl.CosmeticServiceImpl; import me.redtea.nodropx.service.cosmetic.impl.CosmeticServiceImpl;
import me.redtea.nodropx.service.dropconfirm.DropConfirmService;
import me.redtea.nodropx.service.dropconfirm.impl.DropConfirmNull;
import me.redtea.nodropx.service.dropconfirm.impl.DropConfirmServiceImpl;
import me.redtea.nodropx.service.event.EventService; import me.redtea.nodropx.service.event.EventService;
import me.redtea.nodropx.service.event.impl.EventServiceImpl; import me.redtea.nodropx.service.event.impl.EventServiceImpl;
import me.redtea.nodropx.service.material.ItemStackService; import me.redtea.nodropx.service.material.ItemStackService;
@@ -39,42 +51,47 @@ import me.redtea.nodropx.service.respawn.RespawnService;
import me.redtea.nodropx.service.respawn.impl.RespawnServiceImpl; import me.redtea.nodropx.service.respawn.impl.RespawnServiceImpl;
import me.redtea.nodropx.service.storage.StorageService; import me.redtea.nodropx.service.storage.StorageService;
import me.redtea.nodropx.service.storage.impl.StorageServiceImpl; import me.redtea.nodropx.service.storage.impl.StorageServiceImpl;
import me.redtea.nodropx.util.ConfigVerifier;
import me.redtea.nodropx.util.FoliaSupportedUtils;
import me.redtea.nodropx.util.UpdateChecker; import me.redtea.nodropx.util.UpdateChecker;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.ServicePriority; import org.bukkit.plugin.ServicePriority;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import java.io.File; import java.io.File;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
public final class NoDropX extends JavaPlugin { public final class NoDropX extends JavaPlugin {
private static NoDropAPI noDropAPIInstance; private static NoDropAPI noDropAPIInstance;
@Getter @Getter
private static NoDropX instance; private static NoDropX instance;
@Getter
private Messages messages; private Messages messages;
private CosmeticService cosmeticService; private CosmeticService noDropCosmeticService;
@Getter @Getter
private boolean supportHEX; private boolean supportHEX;
@Getter @Getter
private boolean supportKyoriLore; private boolean supportKyoriLore;
@Getter @Getter
private boolean supportItemsAdder; private boolean supportItemsAdder;
private MutableRepo<UUID, List<ItemStack>> pagesRepo; private MutableRepo<UUID, List<ItemStack>> personalStorageRepo;
private Repo<String, List<Integer>> capacity; private CapacityService capacityService;
private MenuFacade menuFacade;
private NoDropService noDropService;
private ItemStackService itemStackService;
private DropConfirmService dropConfirmService;
private FoliaSupportedUtils foliaSupportedUtils;
@Override @Override
public void onEnable() { public void onEnable() {
instance = this; instance = this;
saveDefaultConfig(); new ConfigVerifier().verifyDefaults(this);
foliaSupportedUtils = new FoliaSupportedUtils(this);
TextServicesFactory textServicesFactory = new TextServicesFactoryImpl(); TextServicesFactory textServicesFactory = new TextServicesFactoryImpl();
TextContext textContext = textServicesFactory.create(this); TextContext textContext = textServicesFactory.create(this);
@@ -83,51 +100,42 @@ public final class NoDropX extends JavaPlugin {
messages = supportKyoriLore ? Messages.of(textContext.getMessages()) : Messages.legacy(textContext.getMessages()); messages = supportKyoriLore ? Messages.of(textContext.getMessages()) : Messages.legacy(textContext.getMessages());
messages.setVerifier(new FileMessageVerifier(getResource(textContext.getPath()), YamlConfiguration.loadConfiguration(textContext.getMessages()), textContext.getMessages())); messages.setVerifier(new FileMessageVerifier(getResource(textContext.getPath()), YamlConfiguration.loadConfiguration(textContext.getMessages()), textContext.getMessages()));
cosmeticService = new CosmeticServiceImpl(); noDropCosmeticService = new CosmeticServiceImpl();
cosmeticService.add(new DisplayNameCosmetic()); noDropCosmeticService.add(new DisplayNameCosmetic());
cosmeticService.add(textContext.getLoreStrategy()); noDropCosmeticService.add(textContext.getLoreStrategy());
cosmeticService.load(YamlConfiguration.loadConfiguration(textContext.getCosmetics())); noDropCosmeticService.load(YamlConfiguration.loadConfiguration(textContext.getCosmetics()));
capacity = new YamlRepo<>(
new File(getDataFolder(), "capacity.yml").toPath(),
this,
conf -> conf.getKeys(false).stream().collect(Collectors.toMap(
value -> value,
conf::getIntegerList))
);
dropConfirmService = getConfig().getBoolean("confirmThrowNoDropItem") ? new DropConfirmServiceImpl() : new DropConfirmNull();
NBTService nbtService = new Tr7zwNBTServiceImpl(); NBTService nbtService = new Tr7zwNBTServiceImpl();
NoDropService noDropService = new NoDropServiceImpl(nbtService, cosmeticService); noDropService = new NoDropServiceImpl(nbtService, noDropCosmeticService);
NoDropItemFactory noDropItemFactory = new NoDropItemFactoryImpl(noDropService); NoDropItemFactory noDropItemFactory = new NoDropItemFactoryImpl(noDropService);
EventService eventService = new EventServiceImpl(noDropService); EventService eventService = new EventServiceImpl(noDropService);
RespawnService respawnService = new RespawnServiceImpl(noDropService, capacity); capacityService = new CapacityServiceImpl(this);
pagesRepo = Repo.<UUID, List<ItemStack>>builder() RespawnService respawnService = new RespawnServiceImpl(noDropService, capacityService);
//EXPERIMENTAL! Folia support!
FoliaSupporter foliaSupporter = new FoliaSupporter();
foliaSupporter.run(respawnService, this);
personalStorageRepo = Repo.<UUID, List<ItemStack>>builder()
.autoSave(1000 * 60 * 15L) .autoSave(1000 * 60 * 15L)
.schema(new ItemStackListSchema(new File(getDataFolder(), "storage"))) .schema(new ItemStackListSchema(new File(getDataFolder(), "storage")))
.plugin(this) .plugin(this)
.build(); .build();
ItemStackService itemStackService = initItemStackService(); itemStackService = initItemStackService();
GuiFacade guiFacade = new GuiFacadeImpl( menuFacade = initMenus();
new StorageGui(messages, pagesRepo, noDropService, this, itemStackService) StorageService storageService = new StorageServiceImpl(menuFacade, personalStorageRepo, noDropService);
);
StorageService storageService = new StorageServiceImpl(guiFacade, pagesRepo, noDropService);
NoDropAPI noDropAPI = new NoDropXFacade(noDropService, noDropItemFactory, storageService, capacityService, itemStackService);
NoDropAPI noDropAPI = new NoDropXFacade(noDropService, noDropItemFactory, storageService, capacity, itemStackService);
noDropAPIInstance = noDropAPI; noDropAPIInstance = noDropAPI;
Bukkit.getPluginManager().registerEvents( Bukkit.getPluginManager().registerEvents(new InventoryHandler(eventService, noDropService, dropConfirmService), this);
new InventoryHandler(eventService), Bukkit.getPluginManager().registerEvents(new PlayerHandler(respawnService, eventService, menuFacade), this);
this Bukkit.getPluginManager().registerEvents(new ConfirmDropHandler(dropConfirmService, menuFacade), this);
);
Bukkit.getPluginManager().registerEvents(
new PlayerHandler(respawnService, eventService, guiFacade),
this
);
Bukkit.getServicesManager().register(NoDropAPI.class, Bukkit.getServicesManager().register(NoDropAPI.class,
noDropAPI, this, ServicePriority.Normal); noDropAPI, this, ServicePriority.Normal);
@@ -138,12 +146,26 @@ public final class NoDropX extends JavaPlugin {
commandManager.getMessageHandler().register("cmd.no.exists", sender -> messages.get("noExists").send(sender)); commandManager.getMessageHandler().register("cmd.no.exists", sender -> messages.get("noExists").send(sender));
commandManager.getMessageHandler().register("cmd.wrong.usage", sender -> messages.get("usage").send(sender)); commandManager.getMessageHandler().register("cmd.wrong.usage", sender -> messages.get("usage").send(sender));
commandManager.getCompletionHandler().register("#materials", input -> itemStackService.allMaterials()); commandManager.getCompletionHandler().register("#materials", input -> itemStackService.allMaterials());
commandManager.register(new NoDropCommand(messages, noDropAPI, guiFacade, this, itemStackService)); commandManager.register(new NoDropCommand(messages, noDropAPI, menuFacade, this, itemStackService, dropConfirmService));
bStatsInit(); bStatsInit();
printCredits(); printCredits();
checkUpdates(); checkUpdates();
} }
private MenuFacade initMenus() {
CachedMenu personalStorageCachedMenu;
if (getConfig().getString("personalStorageType").equalsIgnoreCase("SINGLE_PAGE")) {
SinglePageGui singlePageGui = new SinglePageGui(messages, personalStorageRepo);
personalStorageCachedMenu = singlePageGui;
Bukkit.getPluginManager().registerEvents(new SinglePageGuiHandler(new SinglePageController(noDropService,
singlePageGui, personalStorageRepo, foliaSupportedUtils), singlePageGui), this);
} else
personalStorageCachedMenu = new MFPageGui(messages, personalStorageRepo, noDropService, itemStackService, this);
Menu confirmMenu = new DropConfirmMFGui(messages, dropConfirmService, this);
return new MenuFacadeImpl(personalStorageCachedMenu, confirmMenu);
}
private ItemStackService initItemStackService() { private ItemStackService initItemStackService() {
ItemStackService result = new ItemStackServiceImpl(); ItemStackService result = new ItemStackServiceImpl();
if (Bukkit.getPluginManager().getPlugin("ItemsAdder") != null) { if (Bukkit.getPluginManager().getPlugin("ItemsAdder") != null) {
@@ -156,10 +178,10 @@ public final class NoDropX extends JavaPlugin {
} }
private void checkUpdates() { private void checkUpdates() {
if(!(getConfig().contains("checkForUpdates") && getConfig().getBoolean("checkForUpdates"))) { if (!getConfig().getBoolean("checkForUpdates")) {
return; return;
} }
new UpdateChecker(this, 111485).getVersion(version -> { new UpdateChecker(this, 111485, foliaSupportedUtils).getVersion(version -> {
if (this.getDescription().getVersion().equals(version)) { if (this.getDescription().getVersion().equals(version)) {
getLogger().info("There is not a new update available."); getLogger().info("There is not a new update available.");
} else { } else {
@@ -177,25 +199,30 @@ public final class NoDropX extends JavaPlugin {
private void printCredits() { private void printCredits() {
Bukkit.getLogger().info(ChatColor.GREEN + "************************************************************"); printCreditLine("&a************************************************************");
Bukkit.getLogger().info(ChatColor.GREEN + "* " + ChatColor.YELLOW + "NoDropX version " + ChatColor.GOLD + getDescription().getVersion() + ChatColor.GRAY + " (uses CarcadeX v. 1.0.7)"); printCreditLine("&a* &eNoDropX version &6" + getDescription().getVersion() + "&7 (uses CarcadeX v. 1.0.7)");
Bukkit.getLogger().info(ChatColor.GREEN + "* " + ChatColor.YELLOW + "By " + ChatColor.RED + "itzRedTea"); printCreditLine("&a* &eBy &citzRedTea");
Bukkit.getLogger().info(ChatColor.GREEN + "* "+ ChatColor.YELLOW + "Detected bukkit version " + ChatColor.GOLD + Bukkit.getBukkitVersion()); printCreditLine("&a* &eDetected bukkit version &6" + Bukkit.getBukkitVersion());
Bukkit.getLogger().info(ChatColor.GREEN + "* "+ ChatColor.YELLOW + "support HEX colors " + (supportHEX ? ChatColor.DARK_GREEN + "YES" : ChatColor.DARK_RED + "NO")); printCreditLine("&a* &esupport HEX colors " + (supportHEX ? "&2YES" : "&4NO"));
Bukkit.getLogger().info(ChatColor.GREEN + "* "+ ChatColor.YELLOW + "support Kyori as lore " + (supportKyoriLore ? ChatColor.DARK_GREEN + "YES" : ChatColor.DARK_RED + "NO")); printCreditLine("&a* &esupport Kyori as lore " + (supportKyoriLore ? "&2YES" : "&4NO"));
Bukkit.getLogger().info(ChatColor.GREEN + "************************************************************"); printCreditLine("&a************************************************************");
}
private void printCreditLine(String s) {
Bukkit.getConsoleSender().sendMessage(ChatColor.translateAlternateColorCodes('&', s));
} }
public void onReload() { public void onReload() {
pagesRepo.saveAll(); personalStorageRepo.saveAll();
capacity.reload(); menuFacade.clearAllCache();
capacityService.reload();
messages.reload(YamlConfiguration.loadConfiguration(new File(getDataFolder(), "messages.yml"))); messages.reload(YamlConfiguration.loadConfiguration(new File(getDataFolder(), "messages.yml")));
cosmeticService.load(YamlConfiguration.loadConfiguration(new File(getDataFolder(), "cosmetics.yml"))); noDropCosmeticService.load(YamlConfiguration.loadConfiguration(new File(getDataFolder(), "cosmetics.yml")));
} }
@Override @Override
public void onDisable() { public void onDisable() {
pagesRepo.saveAll(); personalStorageRepo.saveAll();
} }
public static NoDropAPI getAPI() { public static NoDropAPI getAPI() {
@@ -2,7 +2,6 @@ package me.redtea.nodropx.api.facade;
import lombok.val; import lombok.val;
import me.redtea.nodropx.api.facade.manipulator.StorageManipulator; import me.redtea.nodropx.api.facade.manipulator.StorageManipulator;
import me.redtea.nodropx.util.MaterialUtils;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
@@ -78,6 +77,15 @@ public interface NoDropAPI {
*/ */
@NotNull StorageManipulator getStorageManipulator(@NotNull UUID playerUniqueId); @NotNull StorageManipulator getStorageManipulator(@NotNull UUID playerUniqueId);
/**
* returns the slot numbers that no drop item with this itemStack saves at death
* @param itemStack itemStack to check
* @return numbers of saved slots
* @author redtea
* @since 1.0.3
*/
@NotNull Collection<Integer> getCapacitySlots(ItemStack itemStack);
/** /**
* returns the slot numbers that no drop item with this material saves at death * returns the slot numbers that no drop item with this material saves at death
* @param material material to check * @param material material to check
@@ -5,6 +5,7 @@ import me.redtea.nodropx.api.facade.manipulator.StorageManipulator;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import me.redtea.nodropx.factory.item.NoDropItemFactory; import me.redtea.nodropx.factory.item.NoDropItemFactory;
import me.redtea.nodropx.libs.carcadex.repo.Repo; import me.redtea.nodropx.libs.carcadex.repo.Repo;
import me.redtea.nodropx.service.capasity.CapacityService;
import me.redtea.nodropx.service.material.ItemStackService; import me.redtea.nodropx.service.material.ItemStackService;
import me.redtea.nodropx.service.nodrop.NoDropService; import me.redtea.nodropx.service.nodrop.NoDropService;
import me.redtea.nodropx.service.storage.StorageService; import me.redtea.nodropx.service.storage.StorageService;
@@ -24,7 +25,7 @@ public class NoDropXFacade implements NoDropAPI {
private final NoDropService noDropService; private final NoDropService noDropService;
private final NoDropItemFactory itemFactory; private final NoDropItemFactory itemFactory;
private final StorageService storageService; private final StorageService storageService;
private final Repo<String, List<Integer>> capacity; private final CapacityService capacityService;
private final ItemStackService itemStackService; private final ItemStackService itemStackService;
@Override @Override
@@ -74,9 +75,14 @@ public class NoDropXFacade implements NoDropAPI {
}; };
} }
@Override
public @NotNull Collection<Integer> getCapacitySlots(ItemStack itemStack) {
return capacityService.get(itemStack);
}
@Override @Override
public @NotNull Collection<Integer> getCapacitySlots(Material material) { public @NotNull Collection<Integer> getCapacitySlots(Material material) {
return capacity.get(material.name()).orElse(new ArrayList<>()); return capacityService.get(material);
} }
@Override @Override
@@ -6,10 +6,12 @@ import me.mattstudios.mf.annotations.*;
import me.mattstudios.mf.base.CommandBase; import me.mattstudios.mf.base.CommandBase;
import me.redtea.nodropx.NoDropX; import me.redtea.nodropx.NoDropX;
import me.redtea.nodropx.api.facade.NoDropAPI; import me.redtea.nodropx.api.facade.NoDropAPI;
import me.redtea.nodropx.gui.facade.GuiFacade; import me.redtea.nodropx.menu.facade.MenuFacade;
import me.redtea.nodropx.libs.message.container.Messages; import me.redtea.nodropx.libs.message.container.Messages;
import me.redtea.nodropx.service.dropconfirm.DropConfirmService;
import me.redtea.nodropx.service.material.ItemStackService; import me.redtea.nodropx.service.material.ItemStackService;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -27,9 +29,10 @@ import java.util.Date;
public class NoDropCommand extends CommandBase { public class NoDropCommand extends CommandBase {
private final Messages messages; private final Messages messages;
private final NoDropAPI noDropAPI; private final NoDropAPI noDropAPI;
private final GuiFacade guiFacade; private final MenuFacade menuFacade;
private final NoDropX plugin; private final NoDropX plugin;
private final ItemStackService itemStackService; private final ItemStackService itemStackService;
private final DropConfirmService confirmService;
@Default @Default
public void onDefault(final CommandSender sender) { public void onDefault(final CommandSender sender) {
@@ -68,9 +71,9 @@ public class NoDropCommand extends CommandBase {
@Permission("nodropx.giveStorage") @Permission("nodropx.giveStorage")
@Completion({"#players", "#materials", "#range:1-64"}) @Completion({"#players", "#materials", "#range:1-64"})
public void onGiveStorage(final CommandSender sender, public void onGiveStorage(final CommandSender sender,
String playerName, final String playerName,
final String material, final String material,
@Optional Integer amount) { @Optional final Integer amount) {
try { try {
val item = noDropAPI.setNoDrop(itemStackService.get(material, amount == null || amount == 0 ? 1 : amount), true); val item = noDropAPI.setNoDrop(itemStackService.get(material, amount == null || amount == 0 ? 1 : amount), true);
val player = getOfflinePlayer(playerName); val player = getOfflinePlayer(playerName);
@@ -82,13 +85,68 @@ public class NoDropCommand extends CommandBase {
messages.get("giveToStorage.success") messages.get("giveToStorage.success")
.replaceAll("%item%", material) .replaceAll("%item%", material)
.replaceAll("%player%", playerName) .replaceAll("%player%", playerName)
.replaceAll("%amount%", amount == null ? "0" : amount.toString()) .replaceAll("%amount%", amount == null ? "1" : amount.toString())
.send(sender); .send(sender);
} catch (Throwable e) { } catch (Throwable e) {
messages.get("giveToStorage.fail").send(sender); messages.get("giveToStorage.fail").send(sender);
} }
} }
@SubCommand("ignoreConfirm")
@Permission("nodropx.ignoreConfirm")
public void onIgnoreConfirm(final CommandSender sender, @Optional Player target) {
if(target == null) {
if(!(sender instanceof Player)) {
sender.sendMessage("player only");
return;
} else {
confirmService.forceConfirm((Player) sender);
}
} else {
confirmService.forceConfirm(target);
}
}
@SubCommand("ignoreConfirmTimed")
@Permission("nodropx.ignoreConfirm.timed")
public void onIgnoreConfirmTimed(final CommandSender sender, Integer sec, @Optional Player target) {
if(target == null) {
if(!(sender instanceof Player)) {
sender.sendMessage("player only");
return;
} else {
confirmService.forceConfirm((Player) sender);
try {
Bukkit.getScheduler().runTaskLater(plugin,() -> confirmService.removeForceConfirm((Player) sender),20L*sec);
} catch (UnsupportedOperationException e) {
sender.sendMessage(ChatColor.RED + "This operation didn't supports on your environment");
}
}
} else {
confirmService.forceConfirm(target);
try {
Bukkit.getScheduler().runTaskLater(plugin,() -> confirmService.removeForceConfirm(target),20L*sec);
} catch (UnsupportedOperationException e) {
sender.sendMessage(ChatColor.RED + "This operation didn't supports on your environment");
}
}
}
@SubCommand("noIgnoreConfirm")
@Permission("nodropx.noIgnoreConfirm")
public void onNoIgnoreConfirm(final CommandSender sender, @Optional Player target) {
if(target == null) {
if(!(sender instanceof Player)) {
sender.sendMessage("player only");
return;
} else {
confirmService.removeForceConfirm((Player) sender);
}
} else {
confirmService.removeForceConfirm(target);
}
}
@SubCommand("applyHand") @SubCommand("applyHand")
@Permission("nodropx.applyhand") @Permission("nodropx.applyhand")
public void onApplyHand(final Player sender) { public void onApplyHand(final Player sender) {
@@ -101,13 +159,14 @@ public class NoDropCommand extends CommandBase {
} }
@SubCommand("gui") @SubCommand("gui")
@Alias("storage")
@Permission("nodropx.gui") @Permission("nodropx.gui")
public void onGui(final Player sender) { public void onGui(final Player sender) {
guiFacade.openNoDropStorage(sender); menuFacade.openPersonalStorage(sender);
} }
@Nullable @Nullable
private OfflinePlayer getOfflinePlayer(String name) { private OfflinePlayer getOfflinePlayer(final String name) {
for(OfflinePlayer player : Bukkit.getOfflinePlayers()) { for(OfflinePlayer player : Bukkit.getOfflinePlayers()) {
if(player.getName() != null && player.getName().equalsIgnoreCase(name)) return player; if(player.getName() != null && player.getName().equalsIgnoreCase(name)) return player;
} }
@@ -0,0 +1,76 @@
package me.redtea.nodropx.folia;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import lombok.Getter;
import lombok.SneakyThrows;
import me.redtea.nodropx.service.respawn.RespawnService;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.plugin.Plugin;
import java.io.FileReader;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
//Experimental. Must be refactored in the future.
public class FoliaSupporter {
private RespawnService respawnService;
@Getter
private static boolean runningOnFolia = false;
@SneakyThrows
public void run(RespawnService respawnService, Plugin plugin) {
try {
String version = ((JsonObject) new JsonParser().parse(new FileReader("version_history.json"))).get("currentVersion").getAsString();
if(!version.toLowerCase().contains("folia") && !plugin.getConfig().getBoolean("forceUseFoliaPatches")) {
return;
}
runningOnFolia = true;
plugin.getLogger().info("Found Folia! Applying patches for this...");
this.respawnService = respawnService;
Bukkit.getPluginManager().registerEvents(new FoliaDeathListener(), plugin);
plugin.getLogger().info("Patches for Folia successfully applied!");
} catch (Throwable ignored) {}
}
/*
temp fix when folia not called respawn event
*/
class FoliaDeathListener implements Listener {
private final Set<Player> toRespawn = new CopyOnWriteArraySet<>();
public FoliaDeathListener() {
new Thread(() -> {
while (true) {
for(Player player : toRespawn) {
if(!player.isDead()) {
onRespawn(player);
toRespawn.remove(player);
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}).start();
}
public void onRespawn(Player player) {
respawnService.giveSavedItems(player);
}
@EventHandler
public void onDeath(PlayerDeathEvent event) {
toRespawn.add(event.getEntity());
}
}
}
@@ -1,9 +0,0 @@
package me.redtea.nodropx.gui.facade;
import org.bukkit.entity.Player;
public interface GuiFacade {
void openNoDropStorage(Player player);
void clearCache(Player player);
void clearAllCache();
}
@@ -1,26 +0,0 @@
package me.redtea.nodropx.gui.facade.impl;
import lombok.RequiredArgsConstructor;
import me.redtea.nodropx.gui.facade.GuiFacade;
import me.redtea.nodropx.gui.pages.StorageGui;
import org.bukkit.entity.Player;
@RequiredArgsConstructor
public class GuiFacadeImpl implements GuiFacade {
private final StorageGui storageGui;
@Override
public void openNoDropStorage(Player player) {
storageGui.open(player);
}
@Override
public void clearCache(Player player) {
storageGui.clearCache(player);
}
@Override
public void clearAllCache() {
storageGui.clearAllCache();
}
}
@@ -10,10 +10,7 @@ import org.bukkit.configuration.file.YamlConfiguration;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.io.File; import java.io.File;
import java.util.HashMap; import java.util.*;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
public class MessagesImpl implements Messages { public class MessagesImpl implements Messages {
private Map<String, Message> messages; private Map<String, Message> messages;
@@ -53,9 +50,10 @@ public class MessagesImpl implements Messages {
public Message get(String key) { public Message get(String key) {
if(!has(key)) { if(!has(key)) {
if(verifier != null) { if(verifier != null) {
Optional<String> def = verifier.fromDefault(key); Optional<Object> def = verifier.fromDefault(key);
if(def.isPresent()) { if(def.isPresent()) {
messages.put(key, factory.message(def.get())); if(def.get() instanceof List) messages.put(key, factory.message((List<String>) def.get()));
else messages.put(key, factory.message((def.get().toString())));
return messages.get(key); return messages.get(key);
} }
return NULL_MESSAGE; return NULL_MESSAGE;
@@ -1,7 +1,9 @@
package me.redtea.nodropx.libs.message.model; package me.redtea.nodropx.libs.message.model;
import me.redtea.nodropx.util.MaterialUtils;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike; import net.kyori.adventure.text.ComponentLike;
import org.bukkit.Material;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -60,4 +62,8 @@ public interface Message extends ComponentLike {
default Message replaceAll(@NotNull Object from, @NotNull Object to) { default Message replaceAll(@NotNull Object from, @NotNull Object to) {
return replaceAll(String.valueOf(from), String.valueOf(to)); return replaceAll(String.valueOf(from), String.valueOf(to));
} }
default Material toMaterial() {
return Material.matchMaterial(asUnparsedString()) == null ? Material.STONE : Material.matchMaterial(asUnparsedString());
}
} }
@@ -3,5 +3,5 @@ package me.redtea.nodropx.libs.message.verifier;
import java.util.Optional; import java.util.Optional;
public interface MessageVerifier { public interface MessageVerifier {
Optional<String> fromDefault(String key); Optional<Object> fromDefault(String key);
} }
@@ -9,6 +9,7 @@ import org.bukkit.configuration.file.YamlConfiguration;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.List;
import java.util.Optional; import java.util.Optional;
public class FileMessageVerifier implements MessageVerifier { public class FileMessageVerifier implements MessageVerifier {
@@ -24,8 +25,8 @@ public class FileMessageVerifier implements MessageVerifier {
} }
@Override @Override
public Optional<String> fromDefault(String key) { public Optional<Object> fromDefault(String key) {
Optional<String> o = Optional.ofNullable(defaultSection.getString(key)); Optional<Object> o = Optional.ofNullable(defaultSection.get(key));
o.ifPresent(s -> saveToMain(key, s)); o.ifPresent(s -> saveToMain(key, s));
return o; return o;
} }
@@ -0,0 +1,22 @@
package me.redtea.nodropx.listener;
import lombok.RequiredArgsConstructor;
import me.redtea.nodropx.api.event.NoDropItemThrownEvent;
import me.redtea.nodropx.menu.facade.MenuFacade;
import me.redtea.nodropx.service.dropconfirm.DropConfirmService;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@RequiredArgsConstructor
public class ConfirmDropHandler implements Listener {
private final DropConfirmService confirmService;
private final MenuFacade menuFacade;
@EventHandler
public void onDrop(NoDropItemThrownEvent event) {
if(!confirmService.isConfirmed(event.getPlayer()) && event.getReason() == NoDropItemThrownEvent.Reason.DROP_BY_PLAYER) {
menuFacade.openConfirmDrop(event.getPlayer());
event.setCancelled(true);
} else confirmService.resetConfirm(event.getPlayer());
}
}
@@ -1,8 +1,12 @@
package me.redtea.nodropx.listener; package me.redtea.nodropx.listener;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import me.redtea.nodropx.api.event.NoDropItemThrownEvent; import me.redtea.nodropx.api.event.NoDropItemThrownEvent;
import me.redtea.nodropx.service.dropconfirm.DropConfirmService;
import me.redtea.nodropx.service.dropconfirm.impl.DropConfirmNull;
import me.redtea.nodropx.service.event.EventService; import me.redtea.nodropx.service.event.EventService;
import me.redtea.nodropx.service.nodrop.NoDropService;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@@ -10,22 +14,32 @@ import org.bukkit.event.inventory.InventoryAction;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.util.List;
import java.util.Optional; import java.util.Optional;
@RequiredArgsConstructor @RequiredArgsConstructor
public class InventoryHandler implements Listener { public class InventoryHandler implements Listener {
private final EventService eventService; private final EventService eventService;
private final NoDropService noDropService;
private final DropConfirmService dropConfirmService;
@EventHandler @EventHandler
public void onMove(InventoryClickEvent event) { public void onMove(InventoryClickEvent event) {
if(event.getAction().equals(InventoryAction.MOVE_TO_OTHER_INVENTORY)) { if(event.getAction().name().startsWith("DROP")
&& (noDropService.isNoDrop(event.getCursor()) || noDropService.isNoDrop(event.getCurrentItem()))
&& !(dropConfirmService instanceof DropConfirmNull)) {
event.setCancelled(true);
return;
}
if(event.getAction().equals(InventoryAction.MOVE_TO_OTHER_INVENTORY) && !event.getInventory().equals(event.getClickedInventory())) {
call(event, event.getCurrentItem()); call(event, event.getCurrentItem());
} else if(event.getAction().equals(InventoryAction.PLACE_ALL) } else if(event.getAction().equals(InventoryAction.PLACE_ALL)
|| event.getAction().equals(InventoryAction.PLACE_ONE) || event.getAction().equals(InventoryAction.PLACE_ONE)
|| event.getAction().equals(InventoryAction.PLACE_SOME)) { || event.getAction().equals(InventoryAction.PLACE_SOME)) {
call(event, event.getCursor()); call(event, event.getCursor());
} }
} }
private void call(InventoryClickEvent event, ItemStack item) { private void call(InventoryClickEvent event, ItemStack item) {
@@ -2,8 +2,10 @@ package me.redtea.nodropx.listener;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import me.redtea.nodropx.api.event.NoDropItemThrownEvent; import me.redtea.nodropx.api.event.NoDropItemThrownEvent;
import me.redtea.nodropx.gui.facade.GuiFacade; import me.redtea.nodropx.menu.facade.MenuFacade;
import me.redtea.nodropx.service.dropconfirm.DropConfirmService;
import me.redtea.nodropx.service.event.EventService; import me.redtea.nodropx.service.event.EventService;
import me.redtea.nodropx.service.nodrop.NoDropService;
import me.redtea.nodropx.service.respawn.RespawnService; import me.redtea.nodropx.service.respawn.RespawnService;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@@ -13,15 +15,17 @@ import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerRespawnEvent;
import java.util.HashSet;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
import java.util.UUID;
@RequiredArgsConstructor @RequiredArgsConstructor
public class PlayerHandler implements Listener { public class PlayerHandler implements Listener {
private final RespawnService respawnService; private final RespawnService respawnService;
private final EventService eventService; private final EventService eventService;
private final GuiFacade guiFacade; private final MenuFacade menuFacade;
//TODO check for armor
@EventHandler @EventHandler
public void onDrop(PlayerDropItemEvent event) { public void onDrop(PlayerDropItemEvent event) {
eventService.callThrownEvent( eventService.callThrownEvent(
@@ -44,7 +48,7 @@ public class PlayerHandler implements Listener {
@EventHandler @EventHandler
public void onQuit(PlayerQuitEvent event) { public void onQuit(PlayerQuitEvent event) {
guiFacade.clearCache(event.getPlayer()); menuFacade.clearCache(event.getPlayer());
} }
} }
@@ -0,0 +1,40 @@
package me.redtea.nodropx.listener.menu;
import me.redtea.nodropx.menu.storage.singlepage.SinglePageController;
import me.redtea.nodropx.menu.storage.singlepage.SinglePageGui;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryAction;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
public class SinglePageGuiHandler implements Listener {
private final SinglePageController controller;
private final SinglePageGui gui;
public SinglePageGuiHandler(SinglePageController controller, SinglePageGui gui) {
this.controller = controller;
this.gui = gui;
}
@EventHandler
public void onClick(InventoryClickEvent event) {
if(gui.isStorageGui(event.getInventory())) {
if(event.getAction() == InventoryAction.MOVE_TO_OTHER_INVENTORY) controller.onClick(event);
}
if(gui.isStorageGui(event.getClickedInventory()) && event.getWhoClicked() instanceof Player) {
controller.onClick(event);
}
}
@EventHandler
public void onClose(InventoryCloseEvent event) {
if(gui.isStorageGui(event.getInventory()) && event.getPlayer() instanceof Player) {
controller.onClose(event);
}
}
}
@@ -0,0 +1,8 @@
package me.redtea.nodropx.menu;
import org.bukkit.entity.Player;
public interface CachedMenu extends Menu {
void clearCache(Player player);
void clearAllCache();
}
@@ -0,0 +1,7 @@
package me.redtea.nodropx.menu;
import org.bukkit.entity.Player;
public interface Menu {
void open(Player player);
}
@@ -0,0 +1,64 @@
package me.redtea.nodropx.menu.dropconfirm;
import dev.triumphteam.gui.builder.item.ItemBuilder;
import dev.triumphteam.gui.guis.Gui;
import me.redtea.nodropx.libs.message.container.Messages;
import me.redtea.nodropx.menu.Menu;
import me.redtea.nodropx.service.dropconfirm.DropConfirmService;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
public class DropConfirmMFGui implements Menu {
private final Gui gui;
private final Set<UUID> inMenu = new HashSet<>();
private final DropConfirmService dropConfirmService;
private final Plugin plugin;
public DropConfirmMFGui(Messages messages, DropConfirmService dropConfirmService, Plugin plugin) {
gui = Gui.gui()
.rows(1)
.title(messages.get("gui.confirm.title").asComponent())
.disableAllInteractions()
.create();
this.plugin = plugin;
gui.setItem(1, ItemBuilder.from(messages.get("gui.confirm.yesButton.material").toMaterial())
.name(messages.get("gui.confirm.yesButton.name").asComponent())
.lore(messages.get("gui.confirm.yesButton.lore").asComponent())
.asGuiItem((event -> {
dropConfirmService.confirm((Player) event.getWhoClicked());
event.getWhoClicked().dropItem(true);
event.getWhoClicked().closeInventory();
})));
gui.setItem(7, ItemBuilder.from(messages.get("gui.confirm.noButton.material").toMaterial())
.name(messages.get("gui.confirm.noButton.name").asComponent())
.lore(messages.get("gui.confirm.noButton.lore").asComponent())
.asGuiItem((event -> event.getWhoClicked().closeInventory())));
gui.setCloseGuiAction((e) -> {
inMenu.remove(e.getPlayer().getUniqueId());
});
this.dropConfirmService = dropConfirmService;
}
@Override
public void open(Player player) {
if(inMenu.contains(player.getUniqueId())) {
dropConfirmService.forceConfirm(player);
player.closeInventory();
try {
Bukkit.getScheduler().runTaskLater(plugin,
() -> dropConfirmService.removeForceConfirm(player),
20*15L);
} catch (Throwable e) {
plugin.getLogger().severe("Can not start task. Maybe will bugs. Do you run on Folia?");
e.printStackTrace();
}
return;
}
inMenu.add(player.getUniqueId());
gui.open(player);
}
}
@@ -0,0 +1,12 @@
package me.redtea.nodropx.menu.facade;
import me.redtea.nodropx.menu.CachedMenu;
import org.bukkit.entity.Player;
public interface MenuFacade {
CachedMenu noDropStorage();
void openPersonalStorage(Player player);
void openConfirmDrop(Player player);
void clearCache(Player player);
void clearAllCache();
}
@@ -0,0 +1,38 @@
package me.redtea.nodropx.menu.facade.impl;
import lombok.RequiredArgsConstructor;
import me.redtea.nodropx.menu.CachedMenu;
import me.redtea.nodropx.menu.Menu;
import me.redtea.nodropx.menu.facade.MenuFacade;
import org.bukkit.entity.Player;
@RequiredArgsConstructor
public class MenuFacadeImpl implements MenuFacade {
private final CachedMenu personalStorageCachedMenu;
private final Menu confirmDropMenu;
@Override
public CachedMenu noDropStorage() {
return personalStorageCachedMenu;
}
@Override
public void openPersonalStorage(Player player) {
personalStorageCachedMenu.open(player);
}
@Override
public void openConfirmDrop(Player player) {
confirmDropMenu.open(player);
}
@Override
public void clearCache(Player player) {
personalStorageCachedMenu.clearCache(player);
}
@Override
public void clearAllCache() {
personalStorageCachedMenu.clearAllCache();
}
}
@@ -1,15 +1,16 @@
package me.redtea.nodropx.gui.pages; package me.redtea.nodropx.menu.storage.pages;
import dev.triumphteam.gui.builder.item.ItemBuilder; import dev.triumphteam.gui.builder.item.ItemBuilder;
import dev.triumphteam.gui.guis.Gui; import dev.triumphteam.gui.guis.Gui;
import dev.triumphteam.gui.guis.GuiItem; import dev.triumphteam.gui.guis.GuiItem;
import dev.triumphteam.gui.guis.ScrollingGui; import dev.triumphteam.gui.guis.ScrollingGui;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import me.redtea.nodropx.menu.CachedMenu;
import me.redtea.nodropx.libs.carcadex.repo.MutableRepo; import me.redtea.nodropx.libs.carcadex.repo.MutableRepo;
import me.redtea.nodropx.libs.message.container.Messages; import me.redtea.nodropx.libs.message.container.Messages;
import me.redtea.nodropx.service.material.ItemStackService; import me.redtea.nodropx.service.material.ItemStackService;
import me.redtea.nodropx.service.nodrop.NoDropService; import me.redtea.nodropx.service.nodrop.NoDropService;
import me.redtea.nodropx.util.MaterialUtils; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryAction;
@@ -22,13 +23,14 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@RequiredArgsConstructor @RequiredArgsConstructor
public class StorageGui { public class MFPageGui implements CachedMenu {
private final Map<UUID, ScrollingGui> cache = new HashMap<>();
private final Messages messages; private final Messages messages;
private final MutableRepo<UUID, List<ItemStack>> pagesRepo; private final MutableRepo<UUID, List<ItemStack>> personalStorageRepo;
private final NoDropService noDropService; private final NoDropService noDropService;
private final Plugin plugin;
private final ItemStackService itemStackService; private final ItemStackService itemStackService;
private final Plugin plugin;
private final Map<UUID, ScrollingGui> cache = new HashMap<>();
public void open(Player player) { public void open(Player player) {
if(cache.containsKey(player.getUniqueId())) { if(cache.containsKey(player.getUniqueId())) {
@@ -37,7 +39,7 @@ public class StorageGui {
} }
ScrollingGui gui = Gui.scrolling() ScrollingGui gui = Gui.scrolling()
.title(messages.get("gui.title").asComponent()) .title(messages.get("gui.personalStorage.title").asComponent())
.rows(6) .rows(6)
.pageSize(45) .pageSize(45)
.disableAllInteractions() .disableAllInteractions()
@@ -46,16 +48,16 @@ public class StorageGui {
setButtons(gui); setButtons(gui);
setAction(gui); setAction(gui);
setOnClose(gui); setOnClose(gui);
for(ItemStack item : pagesRepo.get(player.getUniqueId()).orElse(new ArrayList<>())) { for(ItemStack item : personalStorageRepo.get(player.getUniqueId()).orElse(new ArrayList<>())) {
gui.addItem(ItemBuilder.from(item).asGuiItem()); gui.addItem(ItemBuilder.from(item).asGuiItem());
} }
gui.open(player);
cache.put(player.getUniqueId(), gui); cache.put(player.getUniqueId(), gui);
gui.open(player);
} }
private void setOnClose(ScrollingGui gui) { private void setOnClose(ScrollingGui gui) {
gui.setCloseGuiAction(event -> pagesRepo.update(event.getPlayer().getUniqueId(), gui.getPageItems().stream() gui.setCloseGuiAction(event -> personalStorageRepo.update(event.getPlayer().getUniqueId(), gui.getPageItems().stream()
.map(GuiItem::getItemStack) .map(GuiItem::getItemStack)
.collect(Collectors.toList()))); .collect(Collectors.toList())));
} }
@@ -110,21 +112,21 @@ public class StorageGui {
private void setFrame(ScrollingGui gui) { private void setFrame(ScrollingGui gui) {
for(int i = 1; i < 10; ++i) { for(int i = 1; i < 10; ++i) {
gui.setItem(6, i, ItemBuilder.from( gui.setItem(6, i, ItemBuilder.from(
itemStackService.get(messages.get("gui.frame.material").asUnparsedString(), 1) itemStackService.get(messages.get("gui.personalStorage.frame.material").asUnparsedString(), 1)
).name(messages.get("gui.frame.name").asComponent()).asGuiItem(event -> event.setCancelled(true))); ).name(messages.get("gui.personalStorage.frame.name").asComponent()).asGuiItem(event -> event.setCancelled(true)));
} }
} }
private void setButtons(ScrollingGui gui) { private void setButtons(ScrollingGui gui) {
gui.setItem(6, 3, ItemBuilder.from( gui.setItem(6, 3, ItemBuilder.from(
itemStackService.get(messages.get("gui.prev.material").asUnparsedString(), 1) itemStackService.get(messages.get("gui.personalStorage.prev.material").asUnparsedString(), 1)
).name(messages.get("gui.prev.name").asComponent()).asGuiItem(event -> { ).name(messages.get("gui.personalStorage.prev.name").asComponent()).asGuiItem(event -> {
gui.previous(); gui.previous();
event.setCancelled(true); event.setCancelled(true);
})); }));
gui.setItem(6, 7, ItemBuilder.from( gui.setItem(6, 7, ItemBuilder.from(
itemStackService.get(messages.get("gui.next.material").asUnparsedString(), 1) itemStackService.get(messages.get("gui.personalStorage.next.material").asUnparsedString(), 1)
).name(messages.get("gui.next.name").asComponent()).asGuiItem(event -> { ).name(messages.get("gui.personalStorage.next.name").asComponent()).asGuiItem(event -> {
gui.next(); gui.next();
event.setCancelled(true); event.setCancelled(true);
})); }));
@@ -135,6 +137,10 @@ public class StorageGui {
} }
public void clearAllCache() { public void clearAllCache() {
cache.forEach((k, v) -> {
Player player = Bukkit.getPlayer(k);
if(player != null) v.close(player);
});
cache.clear(); cache.clear();
} }
@@ -0,0 +1,50 @@
package me.redtea.nodropx.menu.storage.singlepage;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import me.redtea.nodropx.libs.carcadex.repo.MutableRepo;
import me.redtea.nodropx.service.nodrop.NoDropService;
import me.redtea.nodropx.util.FoliaSupportedUtils;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryAction;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.inventory.ItemStack;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
@RequiredArgsConstructor
public class SinglePageController {
private final NoDropService noDropService;
private final SinglePageGui singlePageGui;
private final MutableRepo<UUID, List<ItemStack>> personalStorageRepo;
private final FoliaSupportedUtils foliaSupportedUtils;
private final List<InventoryAction> clickActions = Lists.newArrayList(InventoryAction.MOVE_TO_OTHER_INVENTORY, InventoryAction.PLACE_ALL, InventoryAction.PLACE_ONE, InventoryAction.PLACE_SOME,
InventoryAction.SWAP_WITH_CURSOR, InventoryAction.NOTHING, InventoryAction.COLLECT_TO_CURSOR, InventoryAction.HOTBAR_MOVE_AND_READD, InventoryAction.UNKNOWN);
public void onClick(InventoryClickEvent event) {
if(clickActions.contains(event.getAction()) && !(noDropService.isNoDrop(event.getCurrentItem()))) {
event.setCancelled(true);
}
foliaSupportedUtils.runTask(() -> {
for(ItemStack itemStack : event.getInventory()) {
if (itemStack != null && !noDropService.isNoDrop(itemStack)) {
event.getWhoClicked().getInventory().addItem(itemStack);
event.getInventory().remove(itemStack);
((Player) event.getWhoClicked()).updateInventory();
}
}
});
}
public void onClose(InventoryCloseEvent event) {
Player player = (Player) event.getPlayer();
personalStorageRepo.update(event.getPlayer().getUniqueId(),
Arrays.asList(singlePageGui.getCache().get(player.getUniqueId()).getContents()));
}
}
@@ -0,0 +1,47 @@
package me.redtea.nodropx.menu.storage.singlepage;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import me.redtea.nodropx.libs.carcadex.repo.MutableRepo;
import me.redtea.nodropx.libs.message.container.Messages;
import me.redtea.nodropx.menu.CachedMenu;
import me.redtea.nodropx.util.MD5ColorUtils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import java.util.*;
@RequiredArgsConstructor
public class SinglePageGui implements CachedMenu {
private final Messages messages;
private final MutableRepo<UUID, List<ItemStack>> personalStorageRepo;
@Getter
private final Map<UUID, Inventory> cache = new HashMap<>();
@Override
public void open(Player player) {
if(cache.containsKey(player.getUniqueId())) {
player.openInventory(cache.get(player.getUniqueId()));
return;
}
Inventory gui = Bukkit.createInventory(null, 54, MD5ColorUtils.translateHexColorCodes(messages.get("gui.personalStorage.title").asUnparsedString()));
for(ItemStack item : personalStorageRepo.get(player.getUniqueId()).orElse(new ArrayList<>())) if(item != null) gui.addItem(item);
cache.put(player.getUniqueId(), gui);
player.openInventory(gui);
}
public void clearCache(Player player) {
cache.remove(player.getUniqueId());
}
public void clearAllCache() {
cache.clear();
}
public boolean isStorageGui(Inventory inventory) {
return cache.containsValue(inventory);
}
}
@@ -0,0 +1,21 @@
package me.redtea.nodropx.service.capasity;
import me.redtea.nodropx.libs.carcadex.repo.Repo;
import me.redtea.nodropx.libs.carcadex.repo.impl.yaml.YamlRepo;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import java.io.File;
import java.util.List;
import java.util.stream.Collectors;
public interface CapacityService {
List<Integer> get(ItemStack item);
void reload();
default List<Integer> get(Material material) {
return get(new ItemStack(material));
}
}
@@ -0,0 +1,52 @@
package me.redtea.nodropx.service.capasity.impl;
import me.redtea.nodropx.libs.carcadex.repo.Repo;
import me.redtea.nodropx.libs.carcadex.repo.impl.yaml.YamlRepo;
import me.redtea.nodropx.service.capasity.CapacityService;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
public class CapacityServiceImpl implements CapacityService {
private final Repo<String, List<Integer>> capacityRepo;
private final Map<String, Integer> customModelDataRequired = new HashMap<>();
public CapacityServiceImpl(Plugin plugin) {
capacityRepo = new YamlRepo<>(
new File(plugin.getDataFolder(), "capacity.yml").toPath(),
plugin,
conf -> conf.getKeys(false).stream().collect(Collectors.toMap(
value -> {
if(value.contains("->")) {
String[] args = value.split("->");
customModelDataRequired.put(args[0], Integer.parseInt(args[1]));
return args[0];
} else return value;
},
conf::getIntegerList))
);
}
@Override
public List<Integer> get(ItemStack item) {
String key = item.getType().name();
Optional<List<Integer>> result = capacityRepo.get(key);
if(!result.isPresent()) {
return Collections.emptyList();
}
if(customModelDataRequired.containsKey(key)) {
int cmi = customModelDataRequired.get(key);
if(!item.getItemMeta().hasCustomModelData() || item.getItemMeta().getCustomModelData() != cmi) {
return Collections.emptyList();
}
}
return result.get();
}
@Override
public void reload() {
capacityRepo.reload();
}
}
@@ -0,0 +1,12 @@
package me.redtea.nodropx.service.dropconfirm;
import org.bukkit.entity.Player;
public interface DropConfirmService {
boolean isConfirmed(Player player);
void confirm(Player player);
void resetConfirm(Player player);
void forceConfirm(Player player);
void removeForceConfirm(Player player);
}
@@ -0,0 +1,31 @@
package me.redtea.nodropx.service.dropconfirm.impl;
import me.redtea.nodropx.service.dropconfirm.DropConfirmService;
import org.bukkit.entity.Player;
public class DropConfirmNull implements DropConfirmService {
@Override
public boolean isConfirmed(Player player) {
return true;
}
@Override
public void confirm(Player player) {
}
@Override
public void resetConfirm(Player player) {
}
@Override
public void forceConfirm(Player player) {
}
@Override
public void removeForceConfirm(Player player) {
}
}
@@ -0,0 +1,39 @@
package me.redtea.nodropx.service.dropconfirm.impl;
import me.redtea.nodropx.service.dropconfirm.DropConfirmService;
import org.bukkit.entity.Player;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
public class DropConfirmServiceImpl implements DropConfirmService {
private Set<UUID> confirmed = new HashSet<>();
private Set<UUID> force = new HashSet<>();
@Override
public boolean isConfirmed(Player player) {
if(force.contains(player.getUniqueId()) || player.isDead()) return true;
return confirmed.contains(player.getUniqueId());
}
@Override
public void confirm(Player player) {
confirmed.add(player.getUniqueId());
}
@Override
public void resetConfirm(Player player) {
confirmed.remove(player.getUniqueId());
}
@Override
public void forceConfirm(Player player) {
force.add(player.getUniqueId());
}
@Override
public void removeForceConfirm(Player player) {
force.remove(player.getUniqueId());
}
}
@@ -0,0 +1,17 @@
package me.redtea.nodropx.service.respawn.impl;
import me.redtea.nodropx.service.respawn.RespawnService;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.PlayerDeathEvent;
public class NullRespawnService implements RespawnService {
@Override
public void giveSavedItems(Player player) {
}
@Override
public void saveItemsBeforeDeath(PlayerDeathEvent event) {
}
}
@@ -1,9 +1,13 @@
package me.redtea.nodropx.service.respawn.impl; package me.redtea.nodropx.service.respawn.impl;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.ToString;
import me.redtea.nodropx.api.event.NoDropItemDropOnDeathEvent; import me.redtea.nodropx.api.event.NoDropItemDropOnDeathEvent;
import me.redtea.nodropx.libs.carcadex.repo.Repo; import me.redtea.nodropx.libs.carcadex.repo.Repo;
import me.redtea.nodropx.service.capasity.CapacityService;
import me.redtea.nodropx.service.dropconfirm.DropConfirmService;
import me.redtea.nodropx.service.nodrop.NoDropService; import me.redtea.nodropx.service.nodrop.NoDropService;
import me.redtea.nodropx.service.respawn.RespawnService; import me.redtea.nodropx.service.respawn.RespawnService;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@@ -12,12 +16,13 @@ import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
@RequiredArgsConstructor @RequiredArgsConstructor
public class RespawnServiceImpl implements RespawnService { public class RespawnServiceImpl implements RespawnService {
private final NoDropService noDropService; private final NoDropService noDropService;
private final Map<String, Pair[]> toRespawn = new HashMap<>(); private final Map<String, Pair[]> toRespawn = new HashMap<>();
private final Repo<String, List<Integer>> capacity; private final CapacityService capacityService;
@Override @Override
@@ -25,6 +30,7 @@ public class RespawnServiceImpl implements RespawnService {
if(toRespawn.containsKey(player.getName())) { if(toRespawn.containsKey(player.getName())) {
Pair[] pairs = toRespawn.get(player.getName()); Pair[] pairs = toRespawn.get(player.getName());
for(Pair pair : pairs) player.getInventory().setItem(pair.slot, pair.item); for(Pair pair : pairs) player.getInventory().setItem(pair.slot, pair.item);
toRespawn.remove(player.getName());
} }
} }
@@ -59,12 +65,13 @@ public class RespawnServiceImpl implements RespawnService {
} }
@AllArgsConstructor @AllArgsConstructor
@ToString
static class Pair { static class Pair {
int slot; int slot;
ItemStack item; ItemStack item;
} }
private List<Integer> getProtectedSlots(ItemStack i) { private List<Integer> getProtectedSlots(ItemStack i) {
return capacity.get(i.getType().name()).orElse(new ArrayList<>()); return capacityService.get(i);
} }
} }
@@ -1,7 +1,7 @@
package me.redtea.nodropx.service.storage.impl; package me.redtea.nodropx.service.storage.impl;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import me.redtea.nodropx.gui.facade.GuiFacade; import me.redtea.nodropx.menu.facade.MenuFacade;
import me.redtea.nodropx.libs.carcadex.repo.MutableRepo; import me.redtea.nodropx.libs.carcadex.repo.MutableRepo;
import me.redtea.nodropx.service.nodrop.NoDropService; import me.redtea.nodropx.service.nodrop.NoDropService;
import me.redtea.nodropx.service.storage.StorageService; import me.redtea.nodropx.service.storage.StorageService;
@@ -14,17 +14,17 @@ import java.util.UUID;
@RequiredArgsConstructor @RequiredArgsConstructor
public class StorageServiceImpl implements StorageService { public class StorageServiceImpl implements StorageService {
private final GuiFacade guiFacade; private final MenuFacade menuFacade;
private final MutableRepo<UUID, List<ItemStack>> pagesRepo; private final MutableRepo<UUID, List<ItemStack>> pagesRepo;
private final NoDropService noDropService; private final NoDropService noDropService;
@Override @Override
public void addItem(UUID playerId, ItemStack item) { public void addItem(UUID playerId, ItemStack item) {
List<ItemStack> items = pagesRepo.get(playerId).orElse(new ArrayList<>()); List<ItemStack> items = new ArrayList<>(pagesRepo.get(playerId).orElse(new ArrayList<>()));
if(!noDropService.isNoDrop(item)) throw new IllegalArgumentException("Item must be no drop!"); if(!noDropService.isNoDrop(item)) throw new IllegalArgumentException("Item must be no drop!");
items.add(item); items.add(item);
pagesRepo.update(playerId, items); pagesRepo.update(playerId, items);
guiFacade.clearCache(Bukkit.getPlayer(playerId)); menuFacade.clearCache(Bukkit.getPlayer(playerId));
} }
@Override @Override
@@ -33,7 +33,7 @@ public class StorageServiceImpl implements StorageService {
if(items == null) return; if(items == null) return;
items.remove(item); items.remove(item);
pagesRepo.update(playerId, items); pagesRepo.update(playerId, items);
guiFacade.clearCache(Bukkit.getPlayer(playerId)); menuFacade.clearCache(Bukkit.getPlayer(playerId));
} }
@Override @Override
@@ -0,0 +1,37 @@
package me.redtea.nodropx.util;
import org.bukkit.configuration.Configuration;
import org.bukkit.configuration.MemoryConfiguration;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.plugin.Plugin;
import java.util.HashMap;
import java.util.Map;
/*
Verify for versions:
- 1.0.2
- 1.0.3
*/
public class ConfigVerifier {
public void verifyDefaults(Plugin plugin) {
Map<String, Object> properties = new HashMap<String, Object>(){{
put("forceUseLegacy", false);
put("forceUseMD5Colors", false);
//1.0.3
put("checkForUpdates", true);
put("personalStorageType", "SINGLE_PAGE");
put("confirmThrowNoDropItem", true);
put("forceUseFoliaPatches", false);
}};
plugin.saveDefaultConfig();
FileConfiguration config = plugin.getConfig();
for(Map.Entry<String, Object> entry : properties.entrySet()) {
if(!config.contains(entry.getKey(), true))
plugin.getConfig().set(entry.getKey(), entry.getValue());
}
plugin.saveConfig();
}
}
@@ -0,0 +1,18 @@
package me.redtea.nodropx.util;
import lombok.RequiredArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
@RequiredArgsConstructor
public class FoliaSupportedUtils {
private final Plugin plugin;
public void runTask(Runnable runnable) {
try {
Bukkit.getScheduler().runTask(plugin, runnable);
} catch (UnsupportedOperationException e) {
new Thread(runnable).start();
}
}
}
@@ -7,7 +7,7 @@ import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class MaterialUtils { public class MaterialUtils {
public void remove(Inventory inventory, Material type, int amount) { public static void remove(Inventory inventory, Material type, int amount) {
if (amount <= 0) return; if (amount <= 0) return;
int size = inventory.getSize(); int size = inventory.getSize();
for (int slot = 0; slot < size; slot++) { for (int slot = 0; slot < size; slot++) {
@@ -1,6 +1,5 @@
package me.redtea.nodropx.util; package me.redtea.nodropx.util;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import java.io.IOException; import java.io.IOException;
@@ -12,14 +11,19 @@ import java.util.function.Consumer;
public class UpdateChecker { public class UpdateChecker {
private final JavaPlugin plugin; private final JavaPlugin plugin;
private final int resourceId; private final int resourceId;
private final FoliaSupportedUtils foliaSupportedUtils;
public UpdateChecker(JavaPlugin plugin, int resourceId) {
public UpdateChecker(JavaPlugin plugin, int resourceId, FoliaSupportedUtils foliaSupportedUtils) {
this.plugin = plugin; this.plugin = plugin;
this.resourceId = resourceId; this.resourceId = resourceId;
this.foliaSupportedUtils = foliaSupportedUtils;
} }
public void getVersion(final Consumer<String> consumer) { public void getVersion(final Consumer<String> consumer) {
Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> { foliaSupportedUtils.runTask(() -> {
try (InputStream is = new URL("https://api.spigotmc.org/legacy/update.php?resource=" + this.resourceId).openStream(); Scanner scann = new Scanner(is)) { try (InputStream is = new URL("https://api.spigotmc.org/legacy/update.php?resource=" + this.resourceId).openStream(); Scanner scann = new Scanner(is)) {
if (scann.hasNext()) { if (scann.hasNext()) {
consumer.accept(scann.next()); consumer.accept(scann.next());
@@ -28,5 +32,7 @@ public class UpdateChecker {
plugin.getLogger().info("Unable to check for updates: " + e.getMessage()); plugin.getLogger().info("Unable to check for updates: " + e.getMessage());
} }
}); });
} }
} }
+2
View File
@@ -1 +1,3 @@
CHAINMAIL_HELMET: [ 9, 10, 11, 12, 13, 14, 15, 16, 17 ] CHAINMAIL_HELMET: [ 9, 10, 11, 12, 13, 14, 15, 16, 17 ]
#MATERIAL->CUSTOM_MODEL_DATA
DIAMOND_HELMET->1000: [ 9, 10, 11, 12, 13, 14, 15, 16, 17 ]
+10
View File
@@ -1,3 +1,13 @@
forceUseLegacy: false forceUseLegacy: false
forceUseMD5Colors: false forceUseMD5Colors: false
forceUseFoliaPatches: false
checkForUpdates: true checkForUpdates: true
# Not recommended on Forge servers!
# Use it on your own risk
confirmThrowNoDropItem: false
#Single did not supports minimessages!
#Can be SINGLE_PAGE or MULTI_PAGES (Use MULTI_PAGES on your own risk)
personalStorageType: SINGLE_PAGE
+1
View File
@@ -6,6 +6,7 @@ description: Set no drop status to your items
author: itzRedTea author: itzRedTea
authors: [itzRedTea] authors: [itzRedTea]
softdepend: [ItemsAdder] softdepend: [ItemsAdder]
folia-supported: true
permissions: permissions:
nodropx.give: nodropx.give:
@@ -17,6 +17,19 @@ noConsole: "&4&l[!] &cOnly players can use it!"
noExists: "&4&l[!] &cThis player doesnt exists!" noExists: "&4&l[!] &cThis player doesnt exists!"
gui: gui:
confirm:
title: "&lConfirm drop"
yesButton:
name: "&aYES"
lore:
- "&7Confirm throw no drop item"
material: ARROW
noButton:
name: "&cNO"
lore:
- "&7Cancel throw no drop item"
material: ARROW
personalStorage:
title: "&lPersonal storage" title: "&lPersonal storage"
frame: frame:
name: "&7" name: "&7"
@@ -1,3 +1,4 @@
#name: "No drop" #name: "No drop"
lore: lore:
- "&7[&a✔&7] &#68cf0cN&#6cd41fo &#6fd932d&#73dd46r&#77e259o&#7be76cp &#7eec7fi&#82f192t&#86f5a6e&#89fab9m&#8dffcc!!" - "&7[&a✔&7] &#68cf0cN&#6cd41fo &#6fd932d&#73dd46r&#77e259o&#7be76cp &#7eec7fi&#82f192t&#86f5a6e&#89fab9m&#8dffcc!!"
+13
View File
@@ -17,6 +17,19 @@ noConsole: "&4&l[!] &cOnly players can use it!"
noExists: "&4&l[!] &cThis player doesnt exists!" noExists: "&4&l[!] &cThis player doesnt exists!"
gui: gui:
confirm:
title: "&lConfirm drop"
yesButton:
name: "&aYES"
lore:
- "&7Confirm throw no drop item"
material: GREEN_WOOL
noButton:
name: "&cNO"
lore:
- "&7Cancel throw no drop item"
material: RED_WOOL
personalStorage:
title: "&lPersonal storage" title: "&lPersonal storage"
frame: frame:
name: "&7" name: "&7"
+13
View File
@@ -17,6 +17,19 @@ noConsole: "<dark_red><bold>[!] <red>Only players can use it!"
noExists: "<dark_red><bold>[!] <red>This player doesnt exists!" noExists: "<dark_red><bold>[!] <red>This player doesnt exists!"
gui: gui:
confirm:
title: "<bold>Confirm throw"
yesButton:
name: "<green>YES"
lore:
- "<gray>Confirm throw no drop item"
material: GREEN_WOOL
noButton:
name: "<red>NO"
lore:
- "<gray>Cancel throw no drop item"
material: RED_WOOL
personalStorage:
title: "<bold>Personal storage" title: "<bold>Personal storage"
frame: frame:
name: "<gray>" name: "<gray>"