├── src └── main │ ├── java │ └── eu │ │ └── athelion │ │ └── dailyrewards │ │ ├── manager │ │ ├── backend │ │ │ └── BackendType.java │ │ ├── reward │ │ │ ├── task │ │ │ │ ├── Task.java │ │ │ │ ├── AutoClaimTask.java │ │ │ │ └── JoinNotificationTask.java │ │ │ ├── action │ │ │ │ ├── response │ │ │ │ │ ├── ResetActionResponse.java │ │ │ │ │ ├── ActionResponse.java │ │ │ │ │ └── ClaimActionResponse.java │ │ │ │ ├── checker │ │ │ │ │ ├── Checker.java │ │ │ │ │ ├── AvailableSlotsInInventoryChecker.java │ │ │ │ │ ├── DisabledWorldCheck.java │ │ │ │ │ └── EnoughPlayTimeChecker.java │ │ │ │ ├── RewardAction.java │ │ │ │ ├── ResetAction.java │ │ │ │ ├── AutoClaimAction.java │ │ │ │ └── ClaimAction.java │ │ │ ├── ActionType.java │ │ │ ├── RewardAction.java │ │ │ ├── RewardType.java │ │ │ ├── ActionsExecutor.java │ │ │ ├── RewardManager.java │ │ │ └── Reward.java │ │ ├── Setting.java │ │ └── cooldown │ │ │ ├── CooldownManager.java │ │ │ └── Cooldown.java │ │ ├── data │ │ ├── FindOneCallback.java │ │ ├── PlayerData.java │ │ └── DataManager.java │ │ ├── commandmanager │ │ ├── ArgumentMatcher.java │ │ ├── SubCommand.java │ │ ├── argumentmatcher │ │ │ └── StartingWithStringArgumentMatcher.java │ │ ├── subcommand │ │ │ ├── ImportCommand.java │ │ │ ├── ReloadCommand.java │ │ │ ├── SettingsCommand.java │ │ │ ├── ResetCommand.java │ │ │ ├── ClaimCommand.java │ │ │ ├── ToggleCommand.java │ │ │ └── HelpCommand.java │ │ ├── command │ │ │ ├── RewardMainCommand.java │ │ │ └── RewardsMainCommand.java │ │ └── MainCommand.java │ │ ├── hook │ │ ├── register │ │ │ ├── LoginListener.java │ │ │ ├── OraxenHook.java │ │ │ ├── BStatsHook.java │ │ │ ├── PlaceholderApiHook.java │ │ │ ├── ItemsAdderHook.java │ │ │ └── AuthMeHook.java │ │ ├── papiresolver │ │ │ ├── PlaceholderResolver.java │ │ │ ├── AvailableRewardsResolver.java │ │ │ ├── PAPIRegister.java │ │ │ └── RewardRemainingTimeResolver.java │ │ ├── Hook.java │ │ └── HookManager.java │ │ ├── configuration │ │ ├── TextModifier.java │ │ ├── ColorTextModifier.java │ │ ├── PlaceholderColorTextModifier.java │ │ ├── YamlFile.java │ │ └── file │ │ │ ├── Lang.java │ │ │ └── Config.java │ │ ├── api │ │ └── event │ │ │ ├── PlayerClaimRewardEvent.java │ │ │ ├── AutoClaimEvent.java │ │ │ ├── ReminderReceiveEvent.java │ │ │ └── PlayerPreClaimRewardEvent.java │ │ ├── updatechecker │ │ ├── UpdateChecker.java │ │ └── UpdateNotificator.java │ │ ├── util │ │ ├── VersionUtil.java │ │ ├── PermissionUtil.java │ │ ├── ItemBuilder.java │ │ ├── PlayerUtil.java │ │ └── builder │ │ │ └── CustomFireworkBuilder.java │ │ └── user │ │ ├── User.java │ │ └── UserHandler.java │ └── resources │ ├── plugin.yml │ ├── lang │ ├── Chinese.yml │ ├── Turkish.yml │ ├── Czech.yml │ ├── Russian.yml │ ├── Ukrainian.yml │ ├── Polish.yml │ ├── Romanian.yml │ └── Finnish.yml │ └── config.yml ├── README.md ├── LICENSE └── .gitignore /src/main/java/eu/athelion/dailyrewards/manager/backend/BackendType.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.backend; 2 | 3 | public enum BackendType { 4 | SQLITE, MYSQL, MARIADB, POSTGRESQL 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/data/FindOneCallback.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.data; 2 | 3 | import java.util.Map; 4 | 5 | public interface FindOneCallback { 6 | void onQueryDone(Map time); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/task/Task.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward.task; 2 | 3 | import org.bukkit.scheduler.BukkitRunnable; 4 | 5 | public interface Task { 6 | BukkitRunnable get(); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/action/response/ResetActionResponse.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward.action.response; 2 | 3 | public enum ResetActionResponse implements ActionResponse { 4 | INCOMPLETE_REWARD_RESET 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/commandmanager/ArgumentMatcher.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.commandmanager; 2 | 3 | import java.util.List; 4 | 5 | public interface ArgumentMatcher { 6 | List filter(List tabCompletions, String argument); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/hook/register/LoginListener.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.hook.register; 2 | 3 | import org.bukkit.event.Listener; 4 | 5 | public abstract class LoginListener implements Listener { 6 | @SuppressWarnings("unused") 7 | protected abstract void onLogin(T event); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/ActionType.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward; 2 | 3 | public enum ActionType { 4 | CONSOLE, 5 | PLAYER, 6 | MESSAGE, 7 | TITLE, 8 | SUBTITLE, 9 | ACTIONBAR, 10 | BOSSBAR, 11 | FIREWORK, 12 | SOUND 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/hook/papiresolver/PlaceholderResolver.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.hook.papiresolver; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | public interface PlaceholderResolver { 6 | boolean canResolve(String rawPlaceholder); 7 | String resolve(Player p, String rawPlaceholder); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/configuration/TextModifier.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.configuration; 2 | 3 | import org.bukkit.OfflinePlayer; 4 | 5 | import java.util.List; 6 | 7 | public interface TextModifier { 8 | String modifyText(OfflinePlayer player, String text); 9 | 10 | List modifyList(OfflinePlayer player, List list); 11 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/action/response/ActionResponse.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward.action.response; 2 | 3 | public interface ActionResponse { 4 | 5 | static boolean isProceeded(ActionResponse response) { 6 | return response == Type.PROCEEDED; 7 | } 8 | 9 | enum Type implements ActionResponse { 10 | PROCEEDED, 11 | NO_PERMISSION, 12 | UNAVAILABLE_PLAYER, 13 | UNAVAILABLE_REWARD 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # DailyRewards 3 | 4 | https://www.spigotmc.org/resources/%E2%9A%A1-daily-weekly-monthly-rewards-mysql-oraxen-support-1-8-8-1-19-3.81780/ 5 | 6 | 7 | 8 | ![MIT License](https://img.shields.io/badge/License-MIT-green.svg) 9 | 10 | [![codefactor](https://www.codefactor.io/Content/badges/A.svg)](https://www.codefactor.io/repository/github/revivalo/dailyrewards) 11 | 12 | ## Feedback 13 | 14 | If you have any feedback or questions, please reach out to us at https://discord.com/invite/TfUC8uJ 15 | 16 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/action/checker/Checker.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward.action.checker; 2 | 3 | import eu.athelion.dailyrewards.manager.reward.action.response.ActionResponse; 4 | import eu.athelion.dailyrewards.util.PermissionUtil; 5 | import org.bukkit.entity.Player; 6 | 7 | public interface Checker { 8 | boolean check(Player player); 9 | 10 | String getFailedCheckMessage(); 11 | 12 | ActionResponse getClaimActionResponse(); 13 | 14 | PermissionUtil.Permission getBypassPermission(); 15 | } -------------------------------------------------------------------------------- /src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | name: DailyRewards 2 | version: ${project.version} 3 | 4 | authors: [Revivalo, ChimpGamer] 5 | description: Reward system for players 6 | website: https://discord.athelion.eu/ 7 | folia-supported: true 8 | 9 | main: eu.athelion.dailyrewards.DailyRewardsPlugin 10 | api-version: 1.13 11 | softdepend: 12 | - PlaceholderAPI 13 | - Oraxen 14 | - ItemsAdder 15 | 16 | commands: 17 | reward: 18 | aliases: [rw] 19 | rewards: 20 | aliases: [rws] 21 | dailyreward: 22 | aliases: [dreward] 23 | dailyrewards: 24 | aliases: [drewards] 25 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/commandmanager/SubCommand.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.commandmanager; 2 | 3 | import eu.athelion.dailyrewards.configuration.file.Lang; 4 | import org.bukkit.command.CommandSender; 5 | 6 | import java.util.List; 7 | 8 | public interface SubCommand { 9 | String getName(); 10 | 11 | Lang getDescription(); 12 | 13 | String getSyntax(); 14 | 15 | String getPermission(); 16 | 17 | List getTabCompletion(CommandSender sender, int index, String[] args); 18 | 19 | void perform(CommandSender sender, String[] args); 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/configuration/ColorTextModifier.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.configuration; 2 | 3 | import eu.athelion.dailyrewards.util.TextUtil; 4 | import org.bukkit.OfflinePlayer; 5 | 6 | import java.util.List; 7 | 8 | public class ColorTextModifier implements TextModifier { 9 | @Override 10 | public String modifyText(OfflinePlayer player, String text) { 11 | return TextUtil.colorize(text); 12 | } 13 | 14 | @Override 15 | public List modifyList(OfflinePlayer player, List list) { 16 | return TextUtil.colorize(list); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/hook/Hook.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.hook; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import org.jetbrains.annotations.Nullable; 5 | 6 | import java.util.logging.Level; 7 | 8 | public interface Hook { 9 | default void preRegister() { 10 | register(); 11 | if (isOn()) { 12 | DailyRewardsPlugin.get().getLogger().log(Level.INFO, this.getClass().getSimpleName() + " has been registered."); 13 | } 14 | } 15 | 16 | void register(); 17 | boolean isOn(); 18 | 19 | @Nullable 20 | T getApi(); 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/Setting.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager; 2 | 3 | import eu.athelion.dailyrewards.configuration.file.Lang; 4 | 5 | public enum Setting { 6 | JOIN_NOTIFICATION("joinNotification", Lang.JOIN_AUTO_CLAIM_SETTING_NAME), 7 | AUTO_CLAIM("autoClaim", Lang.JOIN_AUTO_CLAIM_SETTING_NAME); 8 | 9 | private final String tag; 10 | private final Lang name; 11 | Setting(String tag, Lang name) { 12 | this.tag = tag; 13 | this.name = name; 14 | } 15 | 16 | public String getTag() { 17 | return tag; 18 | } 19 | 20 | public Lang getName() { 21 | return name; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/cooldown/CooldownManager.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.cooldown; 2 | 3 | import eu.athelion.dailyrewards.data.DataManager; 4 | import eu.athelion.dailyrewards.manager.reward.Reward; 5 | import eu.athelion.dailyrewards.user.User; 6 | 7 | import java.util.HashMap; 8 | 9 | public class CooldownManager { 10 | 11 | public static void setCooldown(final User user, Reward reward) { 12 | DataManager.updateValues( 13 | user.getPlayer().getUniqueId(), 14 | user, 15 | new HashMap() {{ 16 | put(reward.getName(), System.currentTimeMillis() + reward.getCooldown()); 17 | }} 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/hook/register/OraxenHook.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.hook.register; 2 | 3 | import eu.athelion.dailyrewards.hook.Hook; 4 | import eu.athelion.dailyrewards.util.VersionUtil; 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | public class OraxenHook implements Hook { 8 | 9 | private boolean isHooked; 10 | 11 | @Override 12 | public void register() { 13 | isHooked = VersionUtil.isLoaded("Oraxen"); 14 | } 15 | 16 | @Override 17 | public boolean isOn() { 18 | return isHooked; 19 | } 20 | 21 | @Override 22 | public @Nullable Void getApi() { 23 | return null; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/commandmanager/argumentmatcher/StartingWithStringArgumentMatcher.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.commandmanager.argumentmatcher; 2 | 3 | import eu.athelion.dailyrewards.commandmanager.ArgumentMatcher; 4 | import org.bukkit.util.StringUtil; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | public class StartingWithStringArgumentMatcher implements ArgumentMatcher { 10 | @Override 11 | public List filter (List tabCompletions, String argument) { 12 | List result = new ArrayList<>(); 13 | 14 | StringUtil.copyPartialMatches(argument, tabCompletions, result); 15 | 16 | return result; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/hook/register/BStatsHook.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.hook.register; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import eu.athelion.dailyrewards.hook.Hook; 5 | import org.bstats.bukkit.Metrics; 6 | import org.jetbrains.annotations.Nullable; 7 | 8 | public class BStatsHook implements Hook { 9 | 10 | @Override 11 | public void register() { 12 | int pluginId = 12070; 13 | new Metrics(DailyRewardsPlugin.get(), pluginId); 14 | } 15 | 16 | @Override 17 | public boolean isOn() { 18 | return true; 19 | } 20 | 21 | @Nullable 22 | @Override 23 | public Void getApi() { 24 | return null; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/configuration/PlaceholderColorTextModifier.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.configuration; 2 | 3 | import eu.athelion.dailyrewards.util.TextUtil; 4 | import me.clip.placeholderapi.PlaceholderAPI; 5 | import org.bukkit.OfflinePlayer; 6 | 7 | import java.util.List; 8 | 9 | public class PlaceholderColorTextModifier implements TextModifier { 10 | @Override 11 | public String modifyText(OfflinePlayer player, String text) { 12 | return PlaceholderAPI.setPlaceholders(player, TextUtil.colorize(text)); 13 | } 14 | 15 | @Override 16 | public List modifyList(OfflinePlayer player, List list) { 17 | return PlaceholderAPI.setPlaceholders(player, TextUtil.colorize(list)); 18 | } 19 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/cooldown/Cooldown.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.cooldown; 2 | 3 | import eu.athelion.dailyrewards.util.TextUtil; 4 | 5 | import java.util.concurrent.atomic.AtomicLong; 6 | 7 | public class Cooldown { 8 | private final AtomicLong timeLeftInMillis; 9 | 10 | public Cooldown(long timeLeftInMillis) { 11 | this.timeLeftInMillis = new AtomicLong(timeLeftInMillis); 12 | } 13 | 14 | public boolean isClaimable() { 15 | return getTimeLeftInMillis() <= 0; 16 | } 17 | 18 | public long getTimeLeftInMillis() { 19 | return timeLeftInMillis.get() - System.currentTimeMillis(); 20 | } 21 | 22 | public String getFormat(String format) { 23 | return TextUtil.formatTime(format, getTimeLeftInMillis()); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/hook/papiresolver/AvailableRewardsResolver.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.hook.papiresolver; 2 | 3 | import eu.athelion.dailyrewards.configuration.file.Lang; 4 | import eu.athelion.dailyrewards.user.UserHandler; 5 | import org.bukkit.entity.Player; 6 | 7 | import java.util.Optional; 8 | 9 | public class AvailableRewardsResolver implements PlaceholderResolver { 10 | @Override 11 | public boolean canResolve(String rawPlaceholder) { 12 | return rawPlaceholder.startsWith("available"); 13 | } 14 | 15 | @Override 16 | public String resolve(Player player, String rawPlaceholder) { 17 | return Optional.ofNullable(UserHandler.getUser(player.getUniqueId())).map(value -> String.valueOf(value.getAvailableRewards().size())).orElse(Lang.LOADING.asColoredString(player)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/action/response/ClaimActionResponse.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward.action.response; 2 | 3 | import eu.athelion.dailyrewards.configuration.file.Lang; 4 | 5 | public enum ClaimActionResponse implements ActionResponse { 6 | UNAVAILABLE_REWARD(Lang.UNAVAILABLE_REWARD), 7 | UNKNOWN(null), 8 | INSUFFICIENT_PERMISSIONS(Lang.INSUFFICIENT_PERMISSIONS), 9 | INSUFFICIENT_PLAY_TIME(Lang.INSUFFICIENT_PLAY_TIME), 10 | LOCATED_IN_DISABLED_WORLD(Lang.LOCATED_IN_RESTRICTED_WORLD), 11 | NOT_ENOUGH_REQUIRED_INVENTORY_SLOTS(Lang.NOT_ENOUGH_FREE_INVENTORY_SLOTS); 12 | 13 | private final Lang message; 14 | 15 | ClaimActionResponse(Lang message) { 16 | this.message = message; 17 | } 18 | 19 | public String getMessage() { 20 | return message.asColoredString(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/hook/register/PlaceholderApiHook.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.hook.register; 2 | 3 | import eu.athelion.dailyrewards.hook.Hook; 4 | import eu.athelion.dailyrewards.hook.papiresolver.PAPIRegister; 5 | import eu.athelion.dailyrewards.util.VersionUtil; 6 | import org.jetbrains.annotations.Nullable; 7 | 8 | public class PlaceholderApiHook implements Hook { 9 | private boolean isHooked = false; 10 | 11 | @Override 12 | public void register() { 13 | if (VersionUtil.isLoaded("PlaceholderAPI")) { 14 | new PAPIRegister().register(); 15 | isHooked = true; 16 | } 17 | } 18 | 19 | @Override 20 | public boolean isOn() { 21 | return isHooked; 22 | } 23 | 24 | @Nullable 25 | @Override 26 | public PlaceholderApiHook getApi() { 27 | return isHooked ? this : null; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Revivalo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/hook/register/ItemsAdderHook.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.hook.register; 2 | 3 | import dev.lone.itemsadder.api.Events.ItemsAdderLoadDataEvent; 4 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 5 | import eu.athelion.dailyrewards.hook.Hook; 6 | import eu.athelion.dailyrewards.util.VersionUtil; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.Listener; 9 | import org.jetbrains.annotations.Nullable; 10 | 11 | public class ItemsAdderHook implements Hook, Listener { 12 | private boolean isHooked; 13 | 14 | private boolean hook(){ 15 | return VersionUtil.isLoaded("ItemsAdder"); 16 | } 17 | 18 | @Override 19 | public void register() { 20 | isHooked = hook(); 21 | if (isHooked) { 22 | DailyRewardsPlugin.get().registerListeners(this); 23 | } 24 | } 25 | 26 | @Override 27 | public boolean isOn() { 28 | return isHooked; 29 | } 30 | 31 | @Override 32 | public @Nullable Void getApi() { 33 | return null; 34 | } 35 | 36 | @EventHandler 37 | public void onItemsAdderLoad(final ItemsAdderLoadDataEvent event){ 38 | DailyRewardsPlugin.get().reloadPlugin(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/api/event/PlayerClaimRewardEvent.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.api.event; 2 | 3 | import eu.athelion.dailyrewards.manager.reward.RewardType; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.Event; 6 | import org.bukkit.event.HandlerList; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class PlayerClaimRewardEvent extends Event { 10 | private static final HandlerList HANDLER_LIST = new HandlerList(); 11 | private final Player claimer; 12 | private final RewardType claimedReward; 13 | 14 | public PlayerClaimRewardEvent(Player claimer, RewardType claimedReward) { 15 | this.claimer = claimer; 16 | this.claimedReward = claimedReward; 17 | } 18 | 19 | @NotNull 20 | @Override 21 | public HandlerList getHandlers() { 22 | return HANDLER_LIST; 23 | } 24 | 25 | @SuppressWarnings("unused") 26 | @NotNull 27 | public static HandlerList getHandlerList() { 28 | return HANDLER_LIST; 29 | } 30 | 31 | 32 | @SuppressWarnings("unused") 33 | public Player getClaimer() { 34 | return claimer; 35 | } 36 | 37 | @SuppressWarnings("unused") 38 | public RewardType getClaimedReward() { 39 | return claimedReward; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/commandmanager/subcommand/ImportCommand.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.commandmanager.subcommand; 2 | 3 | import eu.athelion.dailyrewards.commandmanager.SubCommand; 4 | import eu.athelion.dailyrewards.data.DataManager; 5 | import eu.athelion.dailyrewards.configuration.file.Lang; 6 | import eu.athelion.dailyrewards.util.PermissionUtil; 7 | import org.bukkit.command.CommandSender; 8 | 9 | import java.util.List; 10 | 11 | public class ImportCommand implements SubCommand { 12 | @Override 13 | public String getName() { 14 | return "import"; 15 | } 16 | 17 | @Override 18 | public Lang getDescription() { 19 | return Lang.IMPORT_COMMAND_DESCRIPTION; 20 | } 21 | 22 | @Override 23 | public String getSyntax() { 24 | return "/reward import"; 25 | } 26 | 27 | @Override 28 | public String getPermission() { 29 | return PermissionUtil.Permission.ADMIN_PERMISSION.get(); 30 | } 31 | 32 | @Override 33 | public List getTabCompletion(CommandSender sender, int index, String[] args) { 34 | return null; 35 | } 36 | 37 | @Override 38 | public void perform(CommandSender sender, String[] args) { 39 | DataManager.importToDatabase(sender); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/commandmanager/command/RewardMainCommand.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.commandmanager.command; 2 | 3 | import eu.athelion.dailyrewards.commandmanager.MainCommand; 4 | import eu.athelion.dailyrewards.commandmanager.argumentmatcher.StartingWithStringArgumentMatcher; 5 | import eu.athelion.dailyrewards.commandmanager.subcommand.*; 6 | import eu.athelion.dailyrewards.configuration.file.Lang; 7 | import org.bukkit.command.CommandSender; 8 | 9 | public class RewardMainCommand extends MainCommand { 10 | public RewardMainCommand() { 11 | super(Lang.INSUFFICIENT_PERMISSION, new StartingWithStringArgumentMatcher()); 12 | } 13 | 14 | @Override 15 | protected void registerSubCommands() { 16 | subCommands.add(new ClaimCommand()); 17 | subCommands.add(new ResetCommand()); 18 | subCommands.add(new SettingsCommand()); 19 | subCommands.add(new ToggleCommand()); 20 | subCommands.add(new ImportCommand()); 21 | subCommands.add(new ReloadCommand()); 22 | subCommands.add(new HelpCommand(this)); 23 | } 24 | 25 | @Override 26 | protected void perform(CommandSender sender) { 27 | //TextUtil.sendListToPlayer(sender, Lang.HELP_MESSAGE.asReplacedList(Collections.emptyMap())); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/RewardAction.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward; 2 | 3 | public class RewardAction { 4 | private final String statement; 5 | private final ActionType actionType; 6 | 7 | RewardAction(String statement, ActionType actionType) { 8 | this.statement = statement; 9 | this.actionType = actionType; 10 | } 11 | 12 | public static RewardActionBuilder builder() { 13 | return new RewardActionBuilder(); 14 | } 15 | 16 | public String getStatement() { 17 | return this.statement; 18 | } 19 | 20 | public ActionType getActionType() { 21 | return this.actionType; 22 | } 23 | 24 | public static class RewardActionBuilder { 25 | private String executedCommand; 26 | private ActionType actionType; 27 | 28 | public RewardActionBuilder setExecutedCommand(String executedCommand) { 29 | this.executedCommand = executedCommand; 30 | return this; 31 | } 32 | 33 | public RewardActionBuilder setActionType(ActionType actionType) { 34 | this.actionType = actionType; 35 | return this; 36 | } 37 | 38 | public RewardAction build() { 39 | return new RewardAction(executedCommand, actionType); 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/commandmanager/subcommand/ReloadCommand.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.commandmanager.subcommand; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import eu.athelion.dailyrewards.commandmanager.SubCommand; 5 | import eu.athelion.dailyrewards.configuration.file.Lang; 6 | import eu.athelion.dailyrewards.util.PermissionUtil; 7 | import org.bukkit.command.CommandSender; 8 | 9 | import java.util.List; 10 | 11 | public class ReloadCommand implements SubCommand { 12 | @Override 13 | public String getName() { 14 | return "reload"; 15 | } 16 | 17 | @Override 18 | public Lang getDescription() { 19 | return Lang.RELOAD_COMMAND_DESCRIPTION; 20 | } 21 | 22 | @Override 23 | public String getSyntax() { 24 | return "/reward reload"; 25 | } 26 | 27 | @Override 28 | public String getPermission() { 29 | return PermissionUtil.Permission.RELOAD_PLUGIN.get(); 30 | } 31 | 32 | @Override 33 | public List getTabCompletion(CommandSender commandSender, int index, String[] args) { 34 | return null; 35 | } 36 | 37 | @Override 38 | public void perform(CommandSender sender, String[] args) { 39 | DailyRewardsPlugin.get().reloadPlugin(); 40 | 41 | sender.sendMessage(Lang.RELOAD_MSG.asColoredString()); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/action/checker/AvailableSlotsInInventoryChecker.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward.action.checker; 2 | 3 | import eu.athelion.dailyrewards.configuration.file.Lang; 4 | import eu.athelion.dailyrewards.manager.reward.action.response.ActionResponse; 5 | import eu.athelion.dailyrewards.manager.reward.action.response.ClaimActionResponse; 6 | import eu.athelion.dailyrewards.util.PermissionUtil; 7 | import org.bukkit.entity.Player; 8 | 9 | public class AvailableSlotsInInventoryChecker implements Checker { 10 | 11 | private String failedCheckMessage; 12 | 13 | @Override 14 | public boolean check(Player player) { 15 | if (player.getInventory().firstEmpty() == -1) { 16 | failedCheckMessage = Lang.FULL_INVENTORY_MESSAGE.asColoredString(player); 17 | return false; 18 | } 19 | 20 | return true; 21 | } 22 | 23 | @Override 24 | public String getFailedCheckMessage() { 25 | return failedCheckMessage; 26 | } 27 | 28 | @Override 29 | public ActionResponse getClaimActionResponse() { 30 | return ClaimActionResponse.NOT_ENOUGH_REQUIRED_INVENTORY_SLOTS; 31 | } 32 | 33 | @Override 34 | public PermissionUtil.Permission getBypassPermission() { 35 | return PermissionUtil.Permission.REQUIRED_FREE_SLOTS_BYPASS; 36 | } 37 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/updatechecker/UpdateChecker.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.updatechecker; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import org.bukkit.Bukkit; 5 | 6 | import java.io.IOException; 7 | import java.io.InputStream; 8 | import java.net.URL; 9 | import java.util.Scanner; 10 | import java.util.function.Consumer; 11 | 12 | public class UpdateChecker { 13 | private final int RESOURCE_ID; 14 | 15 | public UpdateChecker(int RESOURCE_ID) { 16 | this.RESOURCE_ID = RESOURCE_ID; 17 | } 18 | 19 | public void getVersion(final Consumer consumer) { 20 | final String link = String.format("https://api.spigotmc.org/legacy/update.php?resource=%d", this.RESOURCE_ID); 21 | Runnable runnable = () -> { 22 | try (final InputStream inputStream = new URL(link).openStream(); 23 | final Scanner scanner = new Scanner(inputStream)) { 24 | 25 | if (!scanner.hasNext()) return; 26 | consumer.accept(scanner.next()); 27 | 28 | } catch (IOException exception) { 29 | DailyRewardsPlugin.get() 30 | .getLogger() 31 | .info(String.format("Can't look for updates: %s", exception.getMessage())); 32 | } 33 | }; 34 | if (DailyRewardsPlugin.getFoliaLib().isFolia()) { 35 | DailyRewardsPlugin.getFoliaLib().getScheduler().runAsync(wrappedTask -> runnable.run()); 36 | } else Bukkit.getScheduler().runTaskAsynchronously(DailyRewardsPlugin.get(), runnable); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/api/event/AutoClaimEvent.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.api.event; 2 | 3 | import eu.athelion.dailyrewards.manager.reward.RewardType; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.Cancellable; 6 | import org.bukkit.event.Event; 7 | import org.bukkit.event.HandlerList; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | import java.util.Set; 11 | 12 | public class AutoClaimEvent extends Event implements Cancellable { 13 | private static final HandlerList HANDLER_LIST = new HandlerList(); 14 | private final Player claimer; 15 | private final Set claimedRewards; 16 | private boolean cancelled = false; 17 | 18 | public AutoClaimEvent(Player claimer, Set claimedRewards) { 19 | this.claimer = claimer; 20 | this.claimedRewards = claimedRewards; 21 | } 22 | 23 | @Override 24 | public boolean isCancelled() { 25 | return cancelled; 26 | } 27 | 28 | @Override 29 | public void setCancelled(boolean cancel) { 30 | this.cancelled = cancel; 31 | } 32 | 33 | @NotNull 34 | @Override 35 | public HandlerList getHandlers() { 36 | return HANDLER_LIST; 37 | } 38 | 39 | @SuppressWarnings("unused") 40 | public Player getClaimer() { 41 | return claimer; 42 | } 43 | 44 | @SuppressWarnings("unused") 45 | public Set getClaimedRewards() { 46 | return claimedRewards; 47 | } 48 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/api/event/ReminderReceiveEvent.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.api.event; 2 | 3 | import eu.athelion.dailyrewards.manager.reward.RewardType; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.Cancellable; 6 | import org.bukkit.event.Event; 7 | import org.bukkit.event.HandlerList; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | import java.util.Set; 11 | 12 | public class ReminderReceiveEvent extends Event implements Cancellable { 13 | private static final HandlerList HANDLER_LIST = new HandlerList(); 14 | private final Player receiver; 15 | private final Set availableRewards; 16 | private boolean cancelled = false; 17 | 18 | public ReminderReceiveEvent(Player receiver, Set availableRewards) { 19 | this.receiver = receiver; 20 | this.availableRewards = availableRewards; 21 | } 22 | 23 | @Override 24 | public boolean isCancelled() { 25 | return cancelled; 26 | } 27 | 28 | @Override 29 | public void setCancelled(boolean cancel) { 30 | this.cancelled = cancel; 31 | } 32 | 33 | @NotNull 34 | @Override 35 | public HandlerList getHandlers() { 36 | return HANDLER_LIST; 37 | } 38 | 39 | @SuppressWarnings("unused") 40 | public Player getReceiver() { 41 | return receiver; 42 | } 43 | 44 | @SuppressWarnings("unused") 45 | public Set getAvailableRewards() { 46 | return availableRewards; 47 | } 48 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/util/VersionUtil.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.util; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import io.github.g00fy2.versioncompare.Version; 5 | import org.bukkit.Bukkit; 6 | 7 | public class VersionUtil { 8 | private static boolean oldVersion; 9 | private static boolean legacyVersion; 10 | public static boolean latestVersion; 11 | 12 | static { 13 | final String serverVersion = Bukkit.getBukkitVersion(); 14 | Version version = new Version(serverVersion); 15 | setOldVersion(version.isLowerThan("1.9")); 16 | setLegacyVersion(version.isLowerThan("1.13")); 17 | } 18 | 19 | public static boolean isLoaded(String pluginName){ 20 | return DailyRewardsPlugin.get().getPluginManager().getPlugin(pluginName) != null; 21 | } 22 | 23 | public static boolean isOldVersion() { 24 | return oldVersion; 25 | } 26 | 27 | public static void setOldVersion(boolean oldVersion) { 28 | VersionUtil.oldVersion = oldVersion; 29 | } 30 | 31 | public static boolean isLegacyVersion() { 32 | return legacyVersion; 33 | } 34 | 35 | public static void setLegacyVersion(boolean legacyVersion) { 36 | VersionUtil.legacyVersion = legacyVersion; 37 | } 38 | 39 | public static void setLatestVersion(boolean latestVersion) { 40 | VersionUtil.latestVersion = latestVersion; 41 | } 42 | 43 | public static boolean isLatestVersion() { 44 | return latestVersion; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/commandmanager/subcommand/SettingsCommand.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.commandmanager.subcommand; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import eu.athelion.dailyrewards.commandmanager.SubCommand; 5 | import eu.athelion.dailyrewards.configuration.file.Lang; 6 | import eu.athelion.dailyrewards.util.PermissionUtil; 7 | import org.bukkit.command.CommandSender; 8 | import org.bukkit.entity.Player; 9 | 10 | import java.util.List; 11 | 12 | public class SettingsCommand implements SubCommand { 13 | @Override 14 | public String getName() { 15 | return "settings"; 16 | } 17 | 18 | @Override 19 | public Lang getDescription() { 20 | return Lang.SETTINGS_COMMAND_DESCRIPTION; 21 | } 22 | 23 | @Override 24 | public String getSyntax() { 25 | return "/reward settings"; 26 | } 27 | 28 | @Override 29 | public String getPermission() { 30 | return PermissionUtil.Permission.SETTINGS_MENU.get(); 31 | } 32 | 33 | @Override 34 | public List getTabCompletion(CommandSender sender, int index, String[] args) { 35 | return null; 36 | } 37 | 38 | @Override 39 | public void perform(CommandSender sender, String[] args) { 40 | if (!(sender instanceof Player)) { 41 | sender.sendMessage("Only in-game command!"); 42 | return; 43 | } 44 | 45 | final Player player = (Player) sender; 46 | 47 | DailyRewardsPlugin.getMenuManager().openSettings(player); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/RewardType.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward; 2 | 3 | import eu.athelion.dailyrewards.configuration.file.Config; 4 | import eu.athelion.dailyrewards.configuration.file.Lang; 5 | 6 | import java.util.Arrays; 7 | 8 | 9 | public enum RewardType { 10 | DAILY("dailyreward.daily", Lang.DAILY_NAME, Config.DAILY_PLACEHOLDER, Config.DAILY_ENABLED), 11 | WEEKLY("dailyreward.weekly", Lang.WEEKLY_NAME, Config.WEEKLY_PLACEHOLDER, Config.WEEKLY_ENABLED), 12 | MONTHLY("dailyreward.monthly", Lang.MONTHLY_NAME, Config.MONTHLY_PLACEHOLDER, Config.MONTHLY_ENABLED); 13 | 14 | private final String permission; 15 | private final Lang name; 16 | private final Config placeholder; 17 | private final Config enabled; 18 | 19 | RewardType(String permission, Lang name, Config placeholder, Config enabled) { 20 | this.permission = permission; 21 | this.name = name; 22 | this.placeholder = placeholder; 23 | this.enabled = enabled; 24 | } 25 | 26 | public static RewardType findByName(String name) { 27 | return Arrays.stream(RewardType.values()) 28 | .filter(value -> value.name().equalsIgnoreCase(name)).findFirst() 29 | .orElse(null); 30 | } 31 | 32 | @Override 33 | public String toString() { 34 | return this.name().toLowerCase(); 35 | } 36 | 37 | public String getName() { 38 | return name.asColoredString(); 39 | } 40 | 41 | public String getPlaceholder() { 42 | return placeholder.asString(); 43 | } 44 | 45 | public String getPermission() { 46 | return permission; 47 | } 48 | 49 | public boolean isEnabled() {return enabled.asBoolean();} 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/commandmanager/command/RewardsMainCommand.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.commandmanager.command; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import eu.athelion.dailyrewards.commandmanager.MainCommand; 5 | import eu.athelion.dailyrewards.commandmanager.argumentmatcher.StartingWithStringArgumentMatcher; 6 | import eu.athelion.dailyrewards.configuration.file.Lang; 7 | import eu.athelion.dailyrewards.util.PermissionUtil; 8 | import org.bukkit.command.CommandSender; 9 | import org.bukkit.entity.Player; 10 | 11 | public class RewardsMainCommand extends MainCommand { 12 | public RewardsMainCommand() { 13 | super(Lang.INSUFFICIENT_PERMISSION, new StartingWithStringArgumentMatcher()); 14 | } 15 | 16 | @Override 17 | protected void registerSubCommands() { 18 | // Command hasn't any subcommands 19 | } 20 | 21 | @Override 22 | protected void perform(CommandSender sender) { 23 | if (!(sender instanceof Player)) { 24 | sender.sendMessage("[DailyRewards] This command is only executable in-game!"); 25 | return; 26 | } 27 | 28 | final Player player = (Player) sender; 29 | 30 | if (!PermissionUtil.hasPermission(player, PermissionUtil.Permission.OPENS_MAIN_REWARD_MENU)) { 31 | sender.sendMessage(Lang.INSUFFICIENT_PERMISSION.asColoredString(player) 32 | .replace("%permission%", PermissionUtil.Permission.OPENS_MAIN_REWARD_MENU.get())); 33 | return; 34 | } 35 | 36 | DailyRewardsPlugin.getMenuManager().openRewardsMenu((Player) sender); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/action/checker/DisabledWorldCheck.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward.action.checker; 2 | 3 | import eu.athelion.dailyrewards.configuration.file.Lang; 4 | import eu.athelion.dailyrewards.manager.reward.action.response.ActionResponse; 5 | import eu.athelion.dailyrewards.manager.reward.action.response.ClaimActionResponse; 6 | import eu.athelion.dailyrewards.util.PermissionUtil; 7 | import org.bukkit.entity.Player; 8 | 9 | import java.util.List; 10 | 11 | public class DisabledWorldCheck implements Checker { 12 | private String failedCheckMessage; 13 | private final List disabledWorlds; 14 | 15 | public DisabledWorldCheck(List disabledWorlds) { 16 | this.disabledWorlds = disabledWorlds; 17 | } 18 | 19 | @Override 20 | public boolean check(Player player) { 21 | final String playerWorldName = player.getWorld().getName(); 22 | if (disabledWorlds.stream().anyMatch(worldName -> worldName.equalsIgnoreCase(playerWorldName))) { 23 | failedCheckMessage = Lang.CLAIMING_IN_DISABLED_WORLD.asColoredString(player).replace("%world%", playerWorldName); 24 | return false; 25 | } 26 | return true; 27 | } 28 | 29 | @Override 30 | public String getFailedCheckMessage() { 31 | return failedCheckMessage; 32 | } 33 | 34 | @Override 35 | public ActionResponse getClaimActionResponse() { 36 | return ClaimActionResponse.LOCATED_IN_DISABLED_WORLD; 37 | } 38 | 39 | @Override 40 | public PermissionUtil.Permission getBypassPermission() { 41 | return PermissionUtil.Permission.DISABLED_WORLDS_BYPASS; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/hook/register/AuthMeHook.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.hook.register; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import eu.athelion.dailyrewards.hook.Hook; 5 | import eu.athelion.dailyrewards.hook.HookManager; 6 | import eu.athelion.dailyrewards.user.User; 7 | import eu.athelion.dailyrewards.user.UserHandler; 8 | import eu.athelion.dailyrewards.util.VersionUtil; 9 | import fr.xephi.authme.events.LoginEvent; 10 | import org.bukkit.event.EventHandler; 11 | import org.jetbrains.annotations.Nullable; 12 | 13 | public class AuthMeHook implements Hook { 14 | private boolean isHooked; 15 | 16 | private boolean hook(){ 17 | return VersionUtil.isLoaded("AuthMe"); 18 | } 19 | 20 | @Override 21 | public void register() { 22 | isHooked = hook(); 23 | if (isHooked) { 24 | DailyRewardsPlugin.get().registerListeners(new AuthMeLoginListener()); 25 | HookManager.setAuthUsed(true); 26 | } 27 | } 28 | 29 | @Override 30 | public boolean isOn() { 31 | return isHooked; 32 | } 33 | 34 | @Override 35 | public @Nullable Void getApi() { 36 | return null; 37 | } 38 | 39 | private static class AuthMeLoginListener extends LoginListener { 40 | @Override 41 | @EventHandler 42 | public void onLogin(final LoginEvent event) { 43 | UserHandler.runWhenReady(event.getPlayer(), (user) -> { 44 | DailyRewardsPlugin.getUserHandler().getAutoClaimTask().addUser(user); 45 | DailyRewardsPlugin.getUserHandler().getJoinNotificationTask().addUser(user); 46 | }); 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/hook/papiresolver/PAPIRegister.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.hook.papiresolver; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import me.clip.placeholderapi.expansion.PlaceholderExpansion; 5 | import org.bukkit.entity.Player; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | import java.util.HashSet; 9 | 10 | public class PAPIRegister extends PlaceholderExpansion { 11 | private final HashSet resolvers = new HashSet<>(); 12 | public PAPIRegister() { 13 | registerDefaultResolvers(); 14 | } 15 | 16 | private void registerDefaultResolvers() { 17 | registerResolver(new AvailableRewardsResolver()); 18 | registerResolver(new RewardRemainingTimeResolver()); 19 | } 20 | 21 | public void registerResolver(PlaceholderResolver resolver) { 22 | resolvers.add(resolver); 23 | } 24 | 25 | @Override 26 | public String getIdentifier() { 27 | return "dailyrewards"; 28 | } 29 | 30 | @Override 31 | public String getAuthor() { 32 | return DailyRewardsPlugin.get().getDescription().getAuthors().toString(); 33 | } 34 | 35 | @Override 36 | public String getVersion() { 37 | return DailyRewardsPlugin.get().getDescription().getVersion(); 38 | } 39 | 40 | @Override 41 | public String onPlaceholderRequest(Player player, @NotNull String identifier) { 42 | String resolvedStr = null; 43 | 44 | for (PlaceholderResolver resolver : resolvers) { 45 | if (resolver.canResolve(identifier)) { 46 | resolvedStr = resolver.resolve(player, identifier); 47 | break; 48 | } 49 | } 50 | 51 | return resolvedStr; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/api/event/PlayerPreClaimRewardEvent.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.api.event; 2 | 3 | import eu.athelion.dailyrewards.manager.reward.RewardType; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.Cancellable; 6 | import org.bukkit.event.Event; 7 | import org.bukkit.event.HandlerList; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | import java.util.List; 11 | 12 | public class PlayerPreClaimRewardEvent extends Event implements Cancellable { 13 | private static final HandlerList HANDLER_LIST = new HandlerList(); 14 | private final Player claimer; 15 | private final RewardType claimedReward; 16 | private final List executedCommands; 17 | private boolean cancelled = false; 18 | 19 | public PlayerPreClaimRewardEvent(Player claimer, RewardType claimedReward, List executedCommands) { 20 | this.claimer = claimer; 21 | this.claimedReward = claimedReward; 22 | this.executedCommands = executedCommands; 23 | } 24 | 25 | @NotNull 26 | @Override 27 | public HandlerList getHandlers() { 28 | return HANDLER_LIST; 29 | } 30 | 31 | @NotNull 32 | public static HandlerList getHandlerList() { 33 | return HANDLER_LIST; 34 | } 35 | 36 | @Override 37 | public boolean isCancelled() { 38 | return cancelled; 39 | } 40 | 41 | @Override 42 | public void setCancelled(boolean cancel) { 43 | this.cancelled = cancel; 44 | } 45 | 46 | @SuppressWarnings("unused") 47 | public List getExecutedCommands() {return executedCommands;} 48 | 49 | @SuppressWarnings("unused") 50 | public RewardType getClaimedReward() { 51 | return claimedReward; 52 | } 53 | 54 | @SuppressWarnings("unused") 55 | public Player getClaimer() { 56 | return claimer; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/action/RewardAction.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward.action; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import eu.athelion.dailyrewards.configuration.file.Config; 5 | import eu.athelion.dailyrewards.configuration.file.Lang; 6 | import eu.athelion.dailyrewards.manager.reward.action.checker.Checker; 7 | import eu.athelion.dailyrewards.manager.reward.action.response.ActionResponse; 8 | import eu.athelion.dailyrewards.util.PermissionUtil; 9 | import org.bukkit.OfflinePlayer; 10 | import org.bukkit.command.CommandSender; 11 | import org.bukkit.entity.Player; 12 | 13 | import java.util.List; 14 | 15 | public interface RewardAction { 16 | default ActionResponse preCheck(OfflinePlayer player, T extra) { 17 | if (player == null) { 18 | getExecutor().sendMessage(Lang.UNAVAILABLE_PLAYER.asColoredString().replace("%player%", "null")); 19 | return ActionResponse.Type.UNAVAILABLE_PLAYER; 20 | } 21 | if (!PermissionUtil.hasPermission(getExecutor(), getPermission())) { 22 | getExecutor().sendMessage(Lang.INSUFFICIENT_PERMISSION.asColoredString((Player) getExecutor()) 23 | .replace("%permission%", getPermission().get())); 24 | return ActionResponse.Type.NO_PERMISSION; 25 | } 26 | 27 | ActionResponse response = execute(player, extra); 28 | 29 | if (menuShouldOpen() && Config.OPEN_MENU_AFTER_CLAIMING.asBoolean()) { 30 | DailyRewardsPlugin.getMenuManager().openRewardsMenu(player.getPlayer()); 31 | } 32 | 33 | return response; 34 | } 35 | 36 | ActionResponse execute(OfflinePlayer player, T extra); 37 | 38 | boolean menuShouldOpen(); 39 | 40 | CommandSender getExecutor(); 41 | 42 | PermissionUtil.Permission getPermission(); 43 | 44 | List getCheckers(); 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/hook/HookManager.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.hook; 2 | 3 | import eu.athelion.dailyrewards.hook.register.*; 4 | 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | 8 | public class HookManager { 9 | private static boolean authUsed = false; 10 | 11 | private static final Map> hooks = new HashMap<>(); 12 | 13 | public static void hook() { 14 | hooks.put(HookName.PLACEHOLDER_API, new PlaceholderApiHook()); 15 | hooks.put(HookName.ORAXEN, new OraxenHook()); 16 | hooks.put(HookName.ITEMS_ADDER, new ItemsAdderHook()); 17 | hooks.put(HookName.AUTH_ME, new AuthMeHook()); 18 | hooks.put(HookName.BSTATS, new BStatsHook()); 19 | 20 | for (Hook hook : hooks.values()) { 21 | hook.preRegister(); 22 | } 23 | } 24 | 25 | public static boolean isHookEnabled(Hook hook) { 26 | return hook != null && hook.isOn(); 27 | } 28 | 29 | public static boolean isAuthUsed() { 30 | return authUsed; 31 | } 32 | 33 | public static void setAuthUsed(boolean authUsed) { 34 | HookManager.authUsed = authUsed; 35 | } 36 | 37 | public static PlaceholderApiHook getPlaceholderApiHook() { 38 | return (PlaceholderApiHook) hooks.get(HookName.PLACEHOLDER_API); 39 | } 40 | 41 | public static BStatsHook getBstatsHook() { 42 | return (BStatsHook) hooks.get(HookName.BSTATS); 43 | } 44 | 45 | public static OraxenHook getOraxenHook() { 46 | return (OraxenHook) hooks.get(HookName.ORAXEN); 47 | } 48 | 49 | public static ItemsAdderHook getItemsAdderHook() { 50 | return (ItemsAdderHook) hooks.get(HookName.ITEMS_ADDER); 51 | } 52 | 53 | public static AuthMeHook getAuthMeHook() { 54 | return (AuthMeHook) hooks.get(HookName.AUTH_ME); 55 | } 56 | 57 | private enum HookName { 58 | PLACEHOLDER_API, 59 | ORAXEN, 60 | ITEMS_ADDER, 61 | AUTH_ME, 62 | NEX_AUTH, 63 | BSTATS; 64 | } 65 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/hook/papiresolver/RewardRemainingTimeResolver.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.hook.papiresolver; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import eu.athelion.dailyrewards.configuration.file.Config; 5 | import eu.athelion.dailyrewards.configuration.file.Lang; 6 | import eu.athelion.dailyrewards.manager.cooldown.Cooldown; 7 | import eu.athelion.dailyrewards.manager.reward.Reward; 8 | import eu.athelion.dailyrewards.manager.reward.RewardType; 9 | import eu.athelion.dailyrewards.user.User; 10 | import eu.athelion.dailyrewards.user.UserHandler; 11 | import eu.athelion.dailyrewards.util.TextUtil; 12 | import org.bukkit.entity.Player; 13 | 14 | import java.util.Optional; 15 | import java.util.regex.Matcher; 16 | import java.util.regex.Pattern; 17 | 18 | public class RewardRemainingTimeResolver implements PlaceholderResolver { 19 | private static final Pattern pattern = Pattern.compile("cooldown_(.*)"); 20 | 21 | @Override 22 | public boolean canResolve(String rawPlaceholder) { 23 | return pattern.matcher(rawPlaceholder).find(); 24 | } 25 | 26 | @Override 27 | public String resolve(Player p, String rawPlaceholder) { 28 | Matcher matcher = pattern.matcher(rawPlaceholder); 29 | if (!matcher.find()) 30 | return null; 31 | 32 | RewardType rewardType = RewardType.findByName(matcher.group(1)); 33 | Optional rewardOptional = DailyRewardsPlugin.getRewardManager().getRewards().stream().filter(reward -> reward.getType() == rewardType).findAny(); 34 | if (!rewardOptional.isPresent()) { 35 | return "Invalid type!"; 36 | } 37 | 38 | User user = UserHandler.getUser(p); 39 | if (user != null) { 40 | Cooldown cooldown = user.getCooldown(rewardType); 41 | if (cooldown.isClaimable()) return Lang.AVAILABLE.asColoredString(); 42 | else return TextUtil.formatTime(Config.valueOf(rewardType.name() + "_COOLDOWN_FORMAT").asString(), cooldown.getTimeLeftInMillis()); 43 | } 44 | 45 | return Lang.LOADING.asColoredString(); 46 | } 47 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/task/AutoClaimTask.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward.task; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import eu.athelion.dailyrewards.configuration.file.Config; 5 | import eu.athelion.dailyrewards.manager.Setting; 6 | import eu.athelion.dailyrewards.user.User; 7 | import eu.athelion.dailyrewards.util.PermissionUtil; 8 | import org.bukkit.scheduler.BukkitRunnable; 9 | 10 | import java.util.Map; 11 | import java.util.UUID; 12 | import java.util.concurrent.ConcurrentHashMap; 13 | 14 | public class AutoClaimTask implements Task{ 15 | private final Map playerRewardCheckTimes = new ConcurrentHashMap<>(); 16 | private final Map usersHashMap; 17 | 18 | public AutoClaimTask(Map usersHashMap) { 19 | this.usersHashMap = usersHashMap; 20 | } 21 | 22 | public void addUser(User user) { 23 | if (!PermissionUtil.hasPermission(user.getPlayer(), PermissionUtil.Permission.AUTO_CLAIM_SETTING)) { 24 | return; 25 | } 26 | 27 | if (!user.hasSettingEnabled(Setting.AUTO_CLAIM)) { 28 | return; 29 | } 30 | 31 | long checkTime = System.currentTimeMillis() + (Config.JOIN_NOTIFICATION_DELAY.asInt() * 1000L); 32 | 33 | playerRewardCheckTimes.put(user, checkTime); 34 | } 35 | 36 | @Override 37 | public BukkitRunnable get() { 38 | return new BukkitRunnable() { 39 | @Override 40 | public void run() { 41 | long currentTime = System.currentTimeMillis(); 42 | 43 | for (User user : usersHashMap.values()) { 44 | if (!playerRewardCheckTimes.containsKey(user)) continue; 45 | 46 | long checkTime = playerRewardCheckTimes.get(user); 47 | if (currentTime >= checkTime) { 48 | DailyRewardsPlugin.get().runSync(() -> DailyRewardsPlugin.getRewardManager().processAutoClaimForUser(user)); 49 | playerRewardCheckTimes.remove(user); 50 | } 51 | } 52 | } 53 | }; 54 | } 55 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/util/PermissionUtil.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.util; 2 | 3 | import eu.athelion.dailyrewards.manager.reward.RewardType; 4 | import org.bukkit.command.CommandSender; 5 | import org.bukkit.entity.Player; 6 | 7 | public class PermissionUtil { 8 | public static boolean hasPermission(CommandSender commandSender, String permission) { 9 | if (permission == null || commandSender == null) { 10 | return true; 11 | } 12 | 13 | if (commandSender.isOp()) { 14 | return true; 15 | } 16 | 17 | else if (commandSender.hasPermission(Permission.ADMIN_PERMISSION.get())) { 18 | return true; 19 | } 20 | 21 | else { 22 | return commandSender.hasPermission(permission); 23 | } 24 | } 25 | 26 | public static boolean hasPermission(CommandSender commandSender, Permission permission){ 27 | return hasPermission(commandSender, permission == null ? null : permission.get()); 28 | } 29 | 30 | public static boolean hasPremium(final Player player, final RewardType type) { 31 | return hasPermission(player, String.format("dailyreward.%s.premium", type)); 32 | } 33 | 34 | public enum Permission { 35 | ADMIN_PERMISSION("dailyreward.admin"), 36 | RELOAD_PLUGIN("dailyreward.reload"), 37 | OPENS_MAIN_REWARD_MENU("dailyreward.use"), 38 | SETTINGS_MENU("dailyreward.settings"), 39 | JOIN_NOTIFICATION_SETTING("dailyreward.settings.joinNotification"), 40 | AUTO_CLAIM_SETTING("dailyreward.settings.autoClaim"), 41 | REQUIRED_PLAYTIME_BYPASS("dailyreward.requiredPlaytime.bypass"), 42 | REQUIRED_FREE_SLOTS_BYPASS("dailyreward.requiredFreeSlots.bypass"), 43 | DISABLED_WORLDS_BYPASS("dailyreward.disabledWorlds.bypass"), 44 | RESET_FOR_OTHERS("dailyreward.manage"), 45 | HELP("dailyreward.help"); 46 | 47 | private final String permission; 48 | Permission(String permission) { 49 | this.permission = permission; 50 | } 51 | 52 | public String get() { 53 | return permission; 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # User-specific stuff 2 | .idea/ 3 | 4 | *.iml 5 | *.ipr 6 | *.iws 7 | 8 | # IntelliJ 9 | out/ 10 | 11 | # Compiled class file 12 | *.class 13 | 14 | # Log file 15 | *.log 16 | 17 | # BlueJ files 18 | *.ctxt 19 | 20 | # Package Files # 21 | *.jar 22 | *.war 23 | *.nar 24 | *.ear 25 | *.zip 26 | *.tar.gz 27 | *.rar 28 | 29 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 30 | hs_err_pid* 31 | 32 | *~ 33 | 34 | # temporary files which can be created if a process still has a handle open of a deleted file 35 | .fuse_hidden* 36 | 37 | # KDE directory preferences 38 | .directory 39 | 40 | # Linux trash folder which might appear on any partition or disk 41 | .Trash-* 42 | 43 | # .nfs files are created when an open file is removed but is still being accessed 44 | .nfs* 45 | 46 | # General 47 | .DS_Store 48 | .AppleDouble 49 | .LSOverride 50 | 51 | # Icon must end with two \r 52 | Icon 53 | 54 | # Thumbnails 55 | ._* 56 | 57 | # Files that might appear in the root of a volume 58 | .DocumentRevisions-V100 59 | .fseventsd 60 | .Spotlight-V100 61 | .TemporaryItems 62 | .Trashes 63 | .VolumeIcon.icns 64 | .com.apple.timemachine.donotpresent 65 | 66 | # Directories potentially created on remote AFP share 67 | .AppleDB 68 | .AppleDesktop 69 | Network Trash Folder 70 | Temporary Items 71 | .apdisk 72 | 73 | # Windows thumbnail cache files 74 | Thumbs.db 75 | Thumbs.db:encryptable 76 | ehthumbs.db 77 | ehthumbs_vista.db 78 | 79 | # Dump file 80 | *.stackdump 81 | 82 | # Folder config file 83 | [Dd]esktop.ini 84 | 85 | # Recycle Bin used on file shares 86 | $RECYCLE.BIN/ 87 | 88 | # Windows Installer files 89 | *.cab 90 | *.msi 91 | *.msix 92 | *.msm 93 | *.msp 94 | 95 | # Windows shortcuts 96 | *.lnk 97 | 98 | target/ 99 | 100 | pom.xml.tag 101 | pom.xml.releaseBackup 102 | pom.xml.versionsBackup 103 | pom.xml.next 104 | 105 | release.properties 106 | dependency-reduced-pom.xml 107 | buildNumber.properties 108 | .mvn/timing.properties 109 | .mvn/wrapper/maven-wrapper.jar 110 | .flattened-pom.xml 111 | 112 | # Common working directory 113 | run/ 114 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/action/checker/EnoughPlayTimeChecker.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward.action.checker; 2 | 3 | import eu.athelion.dailyrewards.configuration.file.Config; 4 | import eu.athelion.dailyrewards.configuration.file.Lang; 5 | import eu.athelion.dailyrewards.manager.reward.action.response.ActionResponse; 6 | import eu.athelion.dailyrewards.manager.reward.action.response.ClaimActionResponse; 7 | import eu.athelion.dailyrewards.util.PermissionUtil; 8 | import eu.athelion.dailyrewards.util.PlayerUtil; 9 | import org.bukkit.entity.Player; 10 | 11 | import java.util.HashMap; 12 | 13 | public class EnoughPlayTimeChecker implements Checker { 14 | private String failedCheckMessage; 15 | 16 | @Override 17 | public boolean check(Player player) { 18 | final int requiredPlayTimeInMinutes = Config.FIRST_TIME_JOIN_REQUIRED_PLAY_TIME.asInt(); 19 | if (requiredPlayTimeInMinutes != 0) { 20 | final float actualPlayTimeInMinutes = PlayerUtil.getPlayersPlayTimeInMinutes(player); 21 | if (actualPlayTimeInMinutes < requiredPlayTimeInMinutes) { 22 | failedCheckMessage = 23 | Lang.NOT_ENOUGH_REQUIRED_TIME_TO_CLAIM.asReplacedString( 24 | player, new HashMap() {{ 25 | put("%requiredMinutes%", String.valueOf(requiredPlayTimeInMinutes)); 26 | put("%minutes%", String.valueOf(Math.round(requiredPlayTimeInMinutes - actualPlayTimeInMinutes))); 27 | }} 28 | ); 29 | return false; 30 | } 31 | } 32 | 33 | return true; 34 | } 35 | 36 | @Override 37 | public String getFailedCheckMessage() { 38 | return failedCheckMessage; 39 | } 40 | 41 | @Override 42 | public ActionResponse getClaimActionResponse() { 43 | return ClaimActionResponse.INSUFFICIENT_PLAY_TIME; 44 | } 45 | 46 | @Override 47 | public PermissionUtil.Permission getBypassPermission() { 48 | return PermissionUtil.Permission.REQUIRED_PLAYTIME_BYPASS; 49 | } 50 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/commandmanager/subcommand/ResetCommand.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.commandmanager.subcommand; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import eu.athelion.dailyrewards.commandmanager.SubCommand; 5 | import eu.athelion.dailyrewards.configuration.file.Lang; 6 | import eu.athelion.dailyrewards.manager.reward.Reward; 7 | import eu.athelion.dailyrewards.manager.reward.action.ResetAction; 8 | import eu.athelion.dailyrewards.util.PermissionUtil; 9 | import org.bukkit.Bukkit; 10 | import org.bukkit.command.CommandSender; 11 | import org.bukkit.entity.HumanEntity; 12 | 13 | import java.util.List; 14 | import java.util.stream.Collectors; 15 | import java.util.stream.Stream; 16 | 17 | public class ResetCommand implements SubCommand { 18 | @Override 19 | public String getName() { 20 | return "reset"; 21 | } 22 | 23 | @Override 24 | public Lang getDescription() { 25 | return Lang.RESET_COMMAND_DESCRIPTION; 26 | } 27 | 28 | @Override 29 | public String getSyntax() { 30 | return "/reward reset "; 31 | } 32 | 33 | @Override 34 | public String getPermission() { 35 | return PermissionUtil.Permission.RESET_FOR_OTHERS.get(); 36 | } 37 | 38 | @Override 39 | public List getTabCompletion(CommandSender sender, int index, String[] args) { 40 | switch (index){ 41 | case 0: return Bukkit.getOnlinePlayers().stream().map(HumanEntity::getName).collect(Collectors.toList()); 42 | case 1: return Stream.concat(DailyRewardsPlugin.getRewardManager().getRewards().stream().map(Reward::getName), Stream.of("all")) 43 | .collect(Collectors.toList()); 44 | 45 | } 46 | return null; 47 | } 48 | 49 | @Override 50 | public void perform(CommandSender sender, String[] args) { 51 | if (args.length != 2){ 52 | sender.sendMessage(Lang.COMMAND_USAGE.asColoredString().replace("%usage%", getSyntax())); 53 | return; 54 | } 55 | 56 | final String playerName = args[0]; 57 | 58 | DailyRewardsPlugin.get().runAsync(() -> new ResetAction(sender).preCheck(DailyRewardsPlugin.get().getServer().getOfflinePlayer(playerName), args[1])); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/util/ItemBuilder.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.util; 2 | 3 | import org.bukkit.Material; 4 | import org.bukkit.enchantments.Enchantment; 5 | import org.bukkit.inventory.ItemFlag; 6 | import org.bukkit.inventory.ItemStack; 7 | import org.bukkit.inventory.meta.ItemMeta; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | import java.util.List; 11 | import java.util.Objects; 12 | 13 | public class ItemBuilder { 14 | public static ItemBuilderBuilder from(@NotNull ItemStack itemStack) { 15 | return new ItemBuilderBuilder(itemStack); 16 | } 17 | 18 | public static class ItemBuilderBuilder { 19 | private final ItemStack itemStack; 20 | private final ItemMeta meta; 21 | 22 | 23 | ItemBuilderBuilder(ItemStack itemStack) { 24 | this.itemStack = itemStack; 25 | this.meta = itemStack.getItemMeta(); 26 | } 27 | 28 | public ItemBuilderBuilder setName(final String name) { 29 | this.meta.setDisplayName(name); 30 | return this; 31 | } 32 | 33 | public ItemBuilderBuilder setItemFlags(ItemFlag... itemFlags) { 34 | this.meta.addItemFlags(itemFlags); 35 | return this; 36 | } 37 | 38 | public ItemBuilderBuilder setGlow(final boolean glow) { 39 | if (glow) { 40 | Objects.requireNonNull(this.meta).addEnchant(Enchantment.LURE, 1, false); 41 | this.meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); 42 | } else { 43 | this.meta.getEnchants().forEach((enchant, level) -> this.meta.removeEnchant(enchant)); 44 | } 45 | return this; 46 | } 47 | 48 | public ItemBuilderBuilder setLore(final List lore) { 49 | this.meta.setLore(lore); 50 | return this; 51 | } 52 | 53 | public ItemStack build() { 54 | this.itemStack.setItemMeta(this.meta); 55 | return this.itemStack; 56 | } 57 | 58 | public String toString() { 59 | return "ItemBuilder.ItemBuilderBuilder(itemStack=" + this.itemStack + ", meta=" + this.meta + ")"; 60 | } 61 | 62 | public Material getType() { 63 | return this.itemStack.getType(); 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/util/PlayerUtil.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.util; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import org.bukkit.*; 5 | import org.bukkit.entity.EntityType; 6 | import org.bukkit.entity.Firework; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.inventory.meta.FireworkMeta; 9 | import org.bukkit.metadata.FixedMetadataValue; 10 | 11 | import java.util.Locale; 12 | import java.util.UUID; 13 | import java.util.concurrent.CompletableFuture; 14 | 15 | public class PlayerUtil { 16 | 17 | public static float getPlayersPlayTimeInMinutes(final Player player) { 18 | return (float) (player.getStatistic(Statistic.valueOf(VersionUtil.isLegacyVersion() ? "PLAY_ONE_TICK" : "PLAY_ONE_MINUTE")) / 20.0 / 60.0); 19 | } 20 | 21 | public static void playSound(Player player, String sound){ 22 | Sound soundToPlay; 23 | try { 24 | sound = sound.toUpperCase(Locale.ENGLISH); 25 | soundToPlay = Sound.valueOf(sound); 26 | } catch (IllegalArgumentException | NullPointerException ex){ 27 | soundToPlay = VersionUtil.isOldVersion() ? Sound.valueOf("NOTE_PLING") : VersionUtil.isLegacyVersion() ? Sound.valueOf("BLOCK_NOTE_PLING") : Sound.valueOf("BLOCK_NOTE_BLOCK_HARP"); 28 | } 29 | player.playSound(player.getLocation(), soundToPlay, 1f, 1f); 30 | } 31 | 32 | public static CompletableFuture getOfflinePlayer(final UUID uuid) { 33 | return DailyRewardsPlugin.get().completableFuture(() -> Bukkit.getOfflinePlayer(uuid)); 34 | } 35 | 36 | public static CompletableFuture getOfflinePlayer(final String playerName) { 37 | return DailyRewardsPlugin.get().completableFuture(() -> Bukkit.getOfflinePlayer(playerName)); 38 | } 39 | 40 | public static void spawnFirework(Location location){ 41 | Firework fw = (Firework) location.getWorld().spawnEntity(location, EntityType.FIREWORK); 42 | fw.setMetadata("nodamage", new FixedMetadataValue(DailyRewardsPlugin.get(), true)); 43 | FireworkMeta meta = fw.getFireworkMeta(); 44 | meta.addEffect(FireworkEffect.builder().withColor(Color.ORANGE, Color.YELLOW).withFade(Color.WHITE).with(FireworkEffect.Type.BALL).build()); 45 | meta.setPower(1); 46 | fw.setFireworkMeta(meta); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/data/PlayerData.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.data; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import org.bukkit.configuration.InvalidConfigurationException; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | 7 | import java.io.File; 8 | import java.io.IOException; 9 | import java.util.*; 10 | 11 | public class PlayerData extends YamlConfiguration { 12 | 13 | private static final Map configurations = new HashMap<>(); 14 | private static final File userDataFolder = new File(DailyRewardsPlugin.get().getDataFolder(), "userdata"); 15 | 16 | private final UUID uuid; 17 | private final File file; 18 | 19 | public PlayerData(UUID uniqueId) { 20 | super(); 21 | this.uuid = uniqueId; 22 | this.file = new File(userDataFolder, String.format("%s.yml", uniqueId)); 23 | if (file.exists()) this.reload(); 24 | } 25 | 26 | public static boolean exists(UUID id) { return new File(DailyRewardsPlugin.get().getDataFolder(), "userdata" + File.separator + id.toString() + ".yml").exists();} 27 | 28 | public static PlayerData getConfig(UUID uniqueId) { 29 | synchronized (configurations) { 30 | if (configurations.containsKey(uniqueId)) return configurations.get(uniqueId); 31 | final PlayerData dataConfig = new PlayerData(uniqueId); 32 | 33 | configurations.put(uniqueId, dataConfig); 34 | return dataConfig; 35 | } 36 | } 37 | 38 | public static List getFiles() { 39 | return Arrays.asList(userDataFolder.listFiles()); 40 | } 41 | 42 | public static void removeConfigs() { 43 | final Collection oldConfigurations = new ArrayList<>(configurations.values()); 44 | synchronized (configurations) { 45 | oldConfigurations.forEach(PlayerData::discard); 46 | } 47 | } 48 | 49 | private void reload() { 50 | synchronized (this) { 51 | try { 52 | this.load(file); 53 | } catch (IOException | InvalidConfigurationException e) { 54 | throw new RuntimeException(e); 55 | } 56 | } 57 | } 58 | 59 | 60 | public void save() { 61 | synchronized (this) { 62 | try { 63 | this.save(file); 64 | } catch (IOException e) { 65 | throw new RuntimeException(e); 66 | } 67 | } 68 | } 69 | 70 | public void discard(boolean save) { 71 | if (save) this.save(); 72 | synchronized (configurations) { 73 | configurations.remove(uuid); 74 | } 75 | } 76 | 77 | public void discard() { 78 | this.discard(false); 79 | } 80 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/user/User.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.user; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import eu.athelion.dailyrewards.data.DataManager; 5 | import eu.athelion.dailyrewards.manager.Setting; 6 | import eu.athelion.dailyrewards.manager.cooldown.Cooldown; 7 | import eu.athelion.dailyrewards.manager.reward.RewardType; 8 | import org.bukkit.entity.Player; 9 | 10 | import java.util.HashMap; 11 | import java.util.HashSet; 12 | import java.util.Map; 13 | import java.util.Set; 14 | 15 | public class User { 16 | private final Player player; 17 | private Map data; 18 | 19 | public User(Player player, Map data) { 20 | this.player = player; 21 | this.data = data; 22 | } 23 | 24 | public Cooldown getCooldown(RewardType rewardType) { 25 | return new Cooldown(Long.parseLong(String.valueOf(data.get(rewardType.toString())))); 26 | } 27 | 28 | public Set getAvailableRewards(){ 29 | Set availableRewards = new HashSet<>(); 30 | for (Map.Entry entry : data.entrySet()) { 31 | final RewardType rewardType = RewardType.findByName(entry.getKey()); 32 | if (rewardType == null) continue; 33 | if (!rewardType.isEnabled()) continue; 34 | if (new Cooldown(Long.parseLong(String.valueOf(entry.getValue()))).isClaimable()) availableRewards.add(RewardType.findByName(entry.getKey())); 35 | } 36 | return availableRewards; 37 | } 38 | 39 | public boolean isOnline() { 40 | return player.isOnline(); 41 | } 42 | 43 | /** 44 | * 45 | * @return True if the setting was enabled 46 | */ 47 | public boolean toggleSetting(Setting setting, boolean set) { 48 | data.put(setting.getTag(), set ? "1" : "0"); 49 | 50 | DailyRewardsPlugin.get().runAsync(() -> { 51 | DataManager.updateValues( 52 | player.getUniqueId(), 53 | this, 54 | new HashMap() {{ 55 | put(setting.getTag(), hasSettingEnabled(setting) ? 1L : 0); 56 | }} 57 | ); 58 | }); 59 | 60 | return set; 61 | } 62 | 63 | public boolean hasSettingEnabled(Setting setting) { 64 | return 1 == Long.parseLong(String.valueOf(data.get(setting.getTag()))); 65 | } 66 | 67 | public void updateData(Map changes) { 68 | data.putAll(changes); 69 | } 70 | 71 | public Player getPlayer() { 72 | return player; 73 | } 74 | 75 | public Map getData() { 76 | return data; 77 | } 78 | 79 | public void setData(Map data) { 80 | this.data = data; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/commandmanager/subcommand/ClaimCommand.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.commandmanager.subcommand; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import eu.athelion.dailyrewards.commandmanager.SubCommand; 5 | import eu.athelion.dailyrewards.configuration.file.Lang; 6 | import eu.athelion.dailyrewards.manager.reward.Reward; 7 | import eu.athelion.dailyrewards.manager.reward.RewardType; 8 | import eu.athelion.dailyrewards.manager.reward.action.ClaimAction; 9 | import org.bukkit.Bukkit; 10 | import org.bukkit.command.CommandSender; 11 | import org.bukkit.entity.Player; 12 | 13 | import java.util.Collections; 14 | import java.util.List; 15 | import java.util.Locale; 16 | import java.util.stream.Collectors; 17 | 18 | public class ClaimCommand implements SubCommand { 19 | @Override 20 | public String getName() { 21 | return "claim"; 22 | } 23 | 24 | @Override 25 | public Lang getDescription() { 26 | return Lang.CLAIM_COMMAND_DESCRIPTION; 27 | } 28 | 29 | @Override 30 | public String getSyntax() { 31 | return "/reward claim ()"; 32 | } 33 | 34 | @Override 35 | public String getPermission() { 36 | return null; 37 | } 38 | 39 | @Override 40 | public List getTabCompletion(CommandSender sender, int index, String[] args) { 41 | if (args.length == 1) return DailyRewardsPlugin.getRewardManager().getRewards().stream().map(Reward::getName).collect(Collectors.toList()); 42 | else if (args.length == 2) return DailyRewardsPlugin.get().getServer().getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList()); 43 | else return Collections.emptyList(); 44 | } 45 | 46 | @Override 47 | public void perform(CommandSender sender, String[] args) { 48 | RewardType rewardType; 49 | try { 50 | rewardType = RewardType.valueOf(args[0].toUpperCase(Locale.ENGLISH)); 51 | } catch (Exception exception){ 52 | sender.sendMessage(Lang.COMMAND_USAGE.asColoredString().replace("%usage%", getSyntax())); 53 | return; 54 | } 55 | 56 | Player claimingPlayer; 57 | if (args.length == 1) { 58 | if (!(sender instanceof Player)){ 59 | sender.sendMessage("[DailyRewards] Correct usage: " + getSyntax()); 60 | return; 61 | } 62 | claimingPlayer = (Player) sender; 63 | } else if (args.length == 2) { 64 | claimingPlayer = Bukkit.getPlayerExact(args[1]); 65 | } else { 66 | sender.sendMessage(Lang.COMMAND_USAGE.asColoredString().replace("%usage%", getSyntax())); 67 | return; 68 | } 69 | 70 | new ClaimAction(sender) 71 | .disableMenuOpening() 72 | .preCheck(claimingPlayer, rewardType); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/updatechecker/UpdateNotificator.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.updatechecker; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import eu.athelion.dailyrewards.configuration.file.Config; 5 | import eu.athelion.dailyrewards.util.TextUtil; 6 | import eu.athelion.dailyrewards.util.VersionUtil; 7 | import net.md_5.bungee.api.chat.ClickEvent; 8 | import net.md_5.bungee.api.chat.TextComponent; 9 | import org.bukkit.entity.Player; 10 | import org.bukkit.event.EventHandler; 11 | import org.bukkit.event.EventPriority; 12 | import org.bukkit.event.Listener; 13 | import org.bukkit.event.player.PlayerJoinEvent; 14 | import org.bukkit.scheduler.BukkitRunnable; 15 | 16 | public class UpdateNotificator implements Listener { 17 | 18 | public UpdateNotificator() { 19 | DailyRewardsPlugin.get().registerListeners(this); 20 | } 21 | 22 | @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) 23 | public void playerJoin(final PlayerJoinEvent event) { 24 | final Player player = event.getPlayer(); 25 | 26 | if (!player.isOp()) return; 27 | if (!Config.UPDATE_CHECKER.asBoolean()) return; 28 | if (VersionUtil.isLatestVersion()) return; 29 | 30 | TextComponent download = new TextComponent(TextUtil.colorize("&a&lDownload")); 31 | download.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://www.spigotmc.org/resources/%E2%9A%A1-daily-weekly-monthly-rewards-mysql-oraxen-itemsadder-support-1-8-1-19-4.81780/")); 32 | 33 | TextComponent changelog = new TextComponent(TextUtil.colorize("&a&lChangelog")); 34 | changelog.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://www.spigotmc.org/resources/%E2%9A%A1-daily-weekly-monthly-rewards-mysql-oraxen-itemsadder-support-1-8-1-19-4.81780/updates")); 35 | 36 | TextComponent upgrade = new TextComponent(TextUtil.colorize("&6&lUpgrade")); 37 | upgrade.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://www.spigotmc.org/resources/%E2%9C%A8-ultimaterewards-create-a-whole-network-reward-system-with-ease-1-8-1-19-4.108055/")); 38 | 39 | TextComponent donate = new TextComponent(TextUtil.colorize("&a&lSupport")); 40 | donate.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://discord.gg/kcxYUQTy6A")); 41 | 42 | 43 | new BukkitRunnable() { 44 | @Override 45 | public void run() { 46 | player.sendMessage(" "); 47 | player.sendMessage(TextUtil.colorize("&7There is a new version of &aDailyRewards&7 available.")); 48 | player.spigot().sendMessage(download, new TextComponent(TextUtil.colorize(" &8| ")), upgrade, new TextComponent(TextUtil.colorize(" &8| ")), changelog, new TextComponent(TextUtil.colorize(" &8| ")), donate); 49 | player.sendMessage(TextUtil.colorize("&8Latest version: &a" + DailyRewardsPlugin.getLatestVersion() + " &8| Your version: &c" + DailyRewardsPlugin.get().getDescription().getVersion())); 50 | player.sendMessage(" "); 51 | } 52 | }.runTaskLater(DailyRewardsPlugin.get(), 35); 53 | } 54 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/configuration/YamlFile.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.configuration; 2 | 3 | import com.tchristofferson.configupdater.ConfigUpdater; 4 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 5 | import org.apache.commons.lang.Validate; 6 | import org.bukkit.Bukkit; 7 | import org.bukkit.configuration.InvalidConfigurationException; 8 | import org.bukkit.configuration.file.YamlConfiguration; 9 | 10 | import java.io.File; 11 | import java.io.FileNotFoundException; 12 | import java.io.IOException; 13 | import java.util.Collections; 14 | import java.util.logging.Level; 15 | 16 | public class YamlFile { 17 | 18 | private final File file; 19 | private final UpdateMethod updateMethod; 20 | private final String filePath; 21 | private final YamlConfiguration configuration; 22 | 23 | public YamlFile(final String filePath, final File folder, final UpdateMethod updateMethod) { 24 | file = new File(folder, filePath); 25 | this.updateMethod = updateMethod; 26 | this.filePath = filePath; 27 | 28 | boolean update = true; 29 | switch (this.updateMethod){ 30 | case NEVER: 31 | update = false; 32 | break; 33 | case ON_LOAD: 34 | update = !file.exists(); 35 | break; 36 | } 37 | 38 | Validate.notNull(file, "File cannot be null"); 39 | 40 | configuration = new YamlConfiguration(); 41 | 42 | try { 43 | configuration.load(file); 44 | } catch (FileNotFoundException ex) { 45 | try { 46 | file.createNewFile(); 47 | } catch (IOException e) { 48 | throw new RuntimeException(e); 49 | } 50 | } catch (IOException ex) { 51 | Bukkit.getLogger().log(Level.SEVERE, "Cannot load " + file, ex); 52 | } catch (InvalidConfigurationException ex) { 53 | Bukkit.getLogger().log(Level.SEVERE, "Cannot load " + file, ex); 54 | return; 55 | } 56 | 57 | try { 58 | configuration.save(file); 59 | } catch (IOException e) { 60 | throw new RuntimeException(e); 61 | } 62 | configuration.options().copyDefaults(true); 63 | 64 | if (update) { 65 | try { 66 | ConfigUpdater.update(DailyRewardsPlugin.get(), filePath, file, Collections.emptyList()); 67 | reload(); 68 | } catch (IOException e) { 69 | throw new RuntimeException(e); 70 | } 71 | } 72 | } 73 | 74 | public YamlConfiguration getConfiguration() { 75 | return configuration; 76 | } 77 | 78 | public void reload() { 79 | try { 80 | configuration.load(file); 81 | } catch (InvalidConfigurationException | IOException ex) { 82 | ex.printStackTrace(); 83 | } 84 | } 85 | 86 | public File getFile() { 87 | return this.file; 88 | } 89 | 90 | public UpdateMethod getUpdateMethod() { 91 | return this.updateMethod; 92 | } 93 | 94 | public String getFilePath() { 95 | return this.filePath; 96 | } 97 | 98 | public enum UpdateMethod { 99 | EVERYTIME, ON_LOAD, NEVER 100 | } 101 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/commandmanager/subcommand/ToggleCommand.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.commandmanager.subcommand; 2 | 3 | import eu.athelion.dailyrewards.commandmanager.SubCommand; 4 | import eu.athelion.dailyrewards.configuration.file.Lang; 5 | import eu.athelion.dailyrewards.manager.Setting; 6 | import eu.athelion.dailyrewards.user.User; 7 | import eu.athelion.dailyrewards.user.UserHandler; 8 | import eu.athelion.dailyrewards.util.PermissionUtil; 9 | import org.bukkit.command.CommandSender; 10 | import org.bukkit.entity.Player; 11 | 12 | import java.util.Arrays; 13 | import java.util.Collections; 14 | import java.util.List; 15 | import java.util.Locale; 16 | import java.util.stream.Collectors; 17 | 18 | public class ToggleCommand implements SubCommand { 19 | @Override 20 | public String getName() { 21 | return "toggle"; 22 | } 23 | 24 | @Override 25 | public Lang getDescription() { 26 | return Lang.TOGGLE_COMMAND_DESCRIPTION; 27 | } 28 | 29 | @Override 30 | public String getSyntax() { 31 | return "/reward toggle "; 32 | } 33 | 34 | @Override 35 | public String getPermission() { 36 | return PermissionUtil.Permission.SETTINGS_MENU.get(); 37 | } 38 | 39 | @Override 40 | public List getTabCompletion(CommandSender sender, int index, String[] args) { 41 | if (args.length == 2) { 42 | return Arrays.stream(Setting.values()).map(Setting::name).collect(Collectors.toList()); 43 | } 44 | return Collections.emptyList(); 45 | } 46 | 47 | @Override 48 | public void perform(CommandSender sender, String[] args) { 49 | if (!(sender instanceof Player)) { 50 | sender.sendMessage("Only in-game command!"); 51 | return; 52 | } 53 | 54 | if (args.length < 1) { 55 | sender.sendMessage(Lang.COMMAND_USAGE.asColoredString().replace("%usage%", getSyntax())); 56 | return; 57 | } 58 | 59 | try { 60 | Setting setting = Setting.valueOf(args[0].toUpperCase(Locale.ENGLISH)); 61 | final Player player = (Player) sender; 62 | if (!PermissionUtil.hasPermission(player, "dailyreward.settings." + setting.getTag())) { 63 | player.sendMessage(Lang.INSUFFICIENT_PERMISSION.asColoredString() 64 | .replace("%permission%", "dailyreward.settings." + setting.getTag())); 65 | return; 66 | } 67 | User user = UserHandler.getUser(player); 68 | if (user.toggleSetting(setting, !user.hasSettingEnabled(setting))) { 69 | player.sendMessage(Lang.SETTING_ENABLED.asColoredString().replace("%setting%", setting.getName().asColoredString())); 70 | } else { 71 | player.sendMessage(Lang.SETTING_DISABLED.asColoredString().replace("%setting%", setting.getName().asColoredString())); 72 | } 73 | } catch (IllegalArgumentException ex) { 74 | sender.sendMessage(Lang.UNAVAILABLE_SETTING.asColoredString()); 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/commandmanager/subcommand/HelpCommand.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.commandmanager.subcommand; 2 | 3 | import eu.athelion.dailyrewards.commandmanager.MainCommand; 4 | import eu.athelion.dailyrewards.commandmanager.SubCommand; 5 | import eu.athelion.dailyrewards.configuration.file.Config; 6 | import eu.athelion.dailyrewards.configuration.file.Lang; 7 | import eu.athelion.dailyrewards.util.PermissionUtil; 8 | import eu.athelion.dailyrewards.util.TextUtil; 9 | import eu.athelion.dailyrewards.util.VersionUtil; 10 | import net.md_5.bungee.api.chat.BaseComponent; 11 | import net.md_5.bungee.api.chat.ClickEvent; 12 | import net.md_5.bungee.api.chat.HoverEvent; 13 | import net.md_5.bungee.api.chat.TextComponent; 14 | import org.bukkit.command.CommandSender; 15 | 16 | import java.util.List; 17 | 18 | public class HelpCommand implements SubCommand { 19 | private final List subCommands; 20 | 21 | public HelpCommand(MainCommand mainCommand) { 22 | this.subCommands = mainCommand.getSubCommands(); 23 | } 24 | 25 | @Override 26 | public String getName() { 27 | return "help"; 28 | } 29 | 30 | @Override 31 | public Lang getDescription() { 32 | return Lang.HELP_COMMAND_DESCRIPTION; 33 | } 34 | 35 | @Override 36 | public String getSyntax() { 37 | return "/reward help"; 38 | } 39 | 40 | @Override 41 | public String getPermission() { 42 | return PermissionUtil.Permission.HELP.get(); 43 | } 44 | 45 | @Override 46 | public List getTabCompletion(CommandSender sender, int index, String[] args) { 47 | return null; 48 | } 49 | 50 | @Override 51 | public void perform(CommandSender sender, String[] args) { 52 | sender.sendMessage(TextUtil.colorize(Config.HELP_HEADER.asString())); 53 | 54 | for (SubCommand subCommand : subCommands) { 55 | if (subCommand.getPermission() != null && !sender.hasPermission(subCommand.getPermission())) { 56 | continue; 57 | } 58 | 59 | BaseComponent[] msg = TextComponent.fromLegacyText( 60 | TextUtil.colorize(Config.HELP_MESSAGE_FORMAT.asString() 61 | .replace("%syntax%", subCommand.getSyntax()) 62 | .replace("%description%", subCommand.getDescription().asColoredString()) 63 | ) 64 | ); 65 | 66 | for (BaseComponent bc : msg) { 67 | if (!VersionUtil.isLegacyVersion()) 68 | bc.setHoverEvent( 69 | new HoverEvent( 70 | HoverEvent.Action.SHOW_TEXT, 71 | TextComponent.fromLegacyText( 72 | Lang.CLICK_TO_PERFORM.asColoredString() 73 | .replace("%command%", subCommand.getName()) 74 | ) 75 | ) 76 | ); 77 | 78 | bc.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, subCommand.getSyntax())); 79 | } 80 | 81 | sender.spigot().sendMessage(msg); 82 | } 83 | 84 | sender.sendMessage(TextUtil.colorize(Config.HELP_FOOTER.asString())); 85 | } 86 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/ActionsExecutor.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward; 2 | 3 | import com.google.common.base.Splitter; 4 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 5 | import eu.athelion.dailyrewards.util.PlayerUtil; 6 | import eu.athelion.dailyrewards.util.TextUtil; 7 | import eu.athelion.dailyrewards.util.builder.CustomFireworkBuilder; 8 | import net.md_5.bungee.api.ChatMessageType; 9 | import net.md_5.bungee.api.chat.TextComponent; 10 | import org.apache.commons.lang.StringUtils; 11 | import org.bukkit.entity.Player; 12 | 13 | import java.util.*; 14 | import java.util.regex.Matcher; 15 | import java.util.regex.Pattern; 16 | 17 | public class ActionsExecutor { 18 | private static final Pattern placeholderPattern = Pattern.compile("%\\w+%"); 19 | 20 | public static void executeActions(Player player, String rewardIdentifier, List actions) { 21 | final Set words = new HashSet<>(); 22 | 23 | String[] titleText = new String[]{" ", " "}; 24 | 25 | 26 | actions.forEach(action -> { 27 | String line = action.getStatement(); 28 | 29 | Matcher matcher = placeholderPattern.matcher(line); 30 | 31 | while (matcher.find()) { 32 | words.add(matcher.group()); 33 | } 34 | 35 | for (String word : words) { 36 | switch (word) { 37 | case "%player%": 38 | line = StringUtils.replace(line, word, player.getName()); 39 | break; 40 | case "%type%": 41 | line = StringUtils.replace(line, word, rewardIdentifier); 42 | break; 43 | } 44 | } 45 | 46 | String lineWithPlaceholders = TextUtil.applyPlaceholdersToString(player, line); 47 | String coloredLine = TextUtil.colorize(lineWithPlaceholders); 48 | 49 | switch (action.getActionType()) { 50 | case CONSOLE: 51 | DailyRewardsPlugin.get().runSync(() -> 52 | DailyRewardsPlugin.get().executeCommandAsConsole(lineWithPlaceholders) 53 | ); 54 | break; 55 | case PLAYER: 56 | player.performCommand("/" + lineWithPlaceholders); 57 | break; 58 | case MESSAGE: 59 | TextUtil.sendListToPlayer(player, Splitter.on("|").splitToList(coloredLine)); 60 | break; 61 | case ACTIONBAR: 62 | player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(coloredLine)); 63 | break; 64 | case TITLE: 65 | titleText[0] = coloredLine; 66 | break; 67 | case SUBTITLE: 68 | titleText[1] = coloredLine; 69 | break; 70 | case SOUND: 71 | PlayerUtil.playSound(player, line.toUpperCase(Locale.ENGLISH)); 72 | break; 73 | case FIREWORK: 74 | CustomFireworkBuilder 75 | .fromString(line) 76 | .launch(player.getLocation()); 77 | break; 78 | } 79 | }); 80 | 81 | 82 | player.sendTitle(titleText[0], titleText[1]); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/action/ResetAction.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward.action; 2 | 3 | import eu.athelion.dailyrewards.data.DataManager; 4 | import eu.athelion.dailyrewards.configuration.file.Lang; 5 | import eu.athelion.dailyrewards.manager.reward.RewardType; 6 | import eu.athelion.dailyrewards.manager.reward.action.checker.Checker; 7 | import eu.athelion.dailyrewards.manager.reward.action.response.ActionResponse; 8 | import eu.athelion.dailyrewards.manager.reward.action.response.ResetActionResponse; 9 | import eu.athelion.dailyrewards.user.UserHandler; 10 | import eu.athelion.dailyrewards.util.PermissionUtil; 11 | import org.bukkit.OfflinePlayer; 12 | import org.bukkit.command.CommandSender; 13 | 14 | import java.util.Collections; 15 | import java.util.HashMap; 16 | import java.util.List; 17 | 18 | public class ResetAction implements RewardAction { 19 | private final CommandSender executor; 20 | 21 | public ResetAction(CommandSender executor) { 22 | this.executor = executor; 23 | } 24 | 25 | @Override 26 | public ActionResponse execute(OfflinePlayer offlinePlayer, String typeString) { 27 | final boolean isPlayerOnline = offlinePlayer.isOnline(); 28 | 29 | String nickname = offlinePlayer.getName() == null ? "Unknown" : offlinePlayer.getName(); 30 | 31 | if (!isPlayerOnline && !offlinePlayer.hasPlayedBefore()) { 32 | executor.sendMessage(Lang.UNAVAILABLE_PLAYER.asColoredString().replace("%player%", nickname)); 33 | return ActionResponse.Type.UNAVAILABLE_PLAYER; 34 | } 35 | 36 | HashMap changes; 37 | 38 | if (typeString.equalsIgnoreCase("all")) { 39 | changes = new HashMap() {{ 40 | put(RewardType.DAILY.toString(), "0"); 41 | put(RewardType.WEEKLY.toString(), "0"); 42 | put(RewardType.MONTHLY.toString(), "0"); 43 | }}; 44 | 45 | } else { 46 | final RewardType type = RewardType.findByName(typeString); 47 | try { 48 | changes = new HashMap() {{ 49 | put(type.toString(), 0L); 50 | }}; 51 | 52 | } catch (IllegalArgumentException ex) { 53 | executor.sendMessage(Lang.INCOMPLETE_REWARD_RESET.asColoredString()); 54 | return ResetActionResponse.INCOMPLETE_REWARD_RESET; 55 | } 56 | } 57 | 58 | boolean updated = DataManager.updateValues( 59 | offlinePlayer.getUniqueId(), 60 | UserHandler.getUser(offlinePlayer.getPlayer()), 61 | changes 62 | ); 63 | 64 | if (updated) { 65 | executor.sendMessage(Lang.REWARD_RESET.asColoredString().replace("%type%", typeString).replace("%player%", nickname)); 66 | } else { 67 | executor.sendMessage(Lang.UNAVAILABLE_PLAYER.asColoredString().replace("%player%", nickname)); 68 | } 69 | 70 | return ActionResponse.Type.PROCEEDED; 71 | } 72 | 73 | @Override 74 | public boolean menuShouldOpen() { 75 | return false; 76 | } 77 | 78 | @Override 79 | public CommandSender getExecutor() { 80 | return executor; 81 | } 82 | 83 | @Override 84 | public PermissionUtil.Permission getPermission() { 85 | return PermissionUtil.Permission.RESET_FOR_OTHERS; 86 | } 87 | 88 | @Override 89 | public List getCheckers() { 90 | return Collections.emptyList(); 91 | } 92 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/task/JoinNotificationTask.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward.task; 2 | 3 | import eu.athelion.dailyrewards.configuration.file.Config; 4 | import eu.athelion.dailyrewards.configuration.file.Lang; 5 | import eu.athelion.dailyrewards.manager.Setting; 6 | import eu.athelion.dailyrewards.user.User; 7 | import eu.athelion.dailyrewards.util.PermissionUtil; 8 | import eu.athelion.dailyrewards.util.PlayerUtil; 9 | import eu.athelion.dailyrewards.util.VersionUtil; 10 | import net.md_5.bungee.api.chat.BaseComponent; 11 | import net.md_5.bungee.api.chat.ClickEvent; 12 | import net.md_5.bungee.api.chat.HoverEvent; 13 | import net.md_5.bungee.api.chat.TextComponent; 14 | import net.md_5.bungee.api.chat.hover.content.Text; 15 | import org.bukkit.entity.Player; 16 | import org.bukkit.scheduler.BukkitRunnable; 17 | 18 | import java.util.HashMap; 19 | import java.util.Map; 20 | import java.util.UUID; 21 | import java.util.concurrent.ConcurrentHashMap; 22 | 23 | public class JoinNotificationTask implements Task { 24 | private final Map playerRewardCheckTimes = new ConcurrentHashMap<>(); 25 | private final Map usersHashMap; 26 | 27 | public JoinNotificationTask(Map usersHashMap) { 28 | this.usersHashMap = usersHashMap; 29 | } 30 | 31 | public void addUser(User user) { 32 | if (user.getAvailableRewards().isEmpty()) { 33 | return; 34 | } 35 | 36 | if (user.hasSettingEnabled(Setting.AUTO_CLAIM)) { 37 | return; 38 | } 39 | 40 | if (!user.hasSettingEnabled(Setting.JOIN_NOTIFICATION)) { 41 | return; 42 | } 43 | 44 | if (!PermissionUtil.hasPermission(user.getPlayer(), PermissionUtil.Permission.JOIN_NOTIFICATION_SETTING)) { 45 | return; 46 | } 47 | 48 | long checkTime = System.currentTimeMillis() + (Config.JOIN_NOTIFICATION_DELAY.asInt() * 1000L); 49 | 50 | playerRewardCheckTimes.put(user, checkTime); 51 | } 52 | 53 | @Override 54 | public BukkitRunnable get() { 55 | return new BukkitRunnable() { 56 | @Override 57 | public void run() { 58 | long currentTime = System.currentTimeMillis(); 59 | 60 | for (User user : usersHashMap.values()) { 61 | if (!playerRewardCheckTimes.containsKey(user)) continue; 62 | 63 | long checkTime = playerRewardCheckTimes.get(user); 64 | if (currentTime >= checkTime) { 65 | Player player = user.getPlayer(); 66 | 67 | PlayerUtil.playSound(player, Config.JOIN_NOTIFICATION_SOUND.asString()); 68 | for (String line : Lang.JOIN_NOTIFICATION.asReplacedList(new HashMap() {{ 69 | put("%player%", player.getName()); 70 | put("%rewards%", String.valueOf(user.getAvailableRewards().size())); 71 | }})) { 72 | BaseComponent[] msg = TextComponent.fromLegacyText(line); 73 | 74 | for (BaseComponent bc : msg) { 75 | if (!VersionUtil.isLegacyVersion()) bc.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(Lang.JOIN_HOVER_MESSAGE.asColoredString(player)))); 76 | bc.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, Config.JOIN_NOTIFICATION_COMMAND.asString().replace("%player%", player.getName()))); 77 | } 78 | 79 | player.spigot().sendMessage(msg); 80 | } 81 | 82 | playerRewardCheckTimes.remove(user); 83 | } 84 | } 85 | } 86 | }; 87 | } 88 | 89 | public Map getPlayerRewardCheckTimes() { 90 | return playerRewardCheckTimes; 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/commandmanager/MainCommand.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.commandmanager; 2 | 3 | import eu.athelion.dailyrewards.configuration.file.Lang; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandSender; 6 | import org.bukkit.command.PluginCommand; 7 | import org.bukkit.command.TabExecutor; 8 | import org.bukkit.plugin.java.JavaPlugin; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | import java.util.*; 12 | import java.util.stream.Collectors; 13 | 14 | public abstract class MainCommand implements TabExecutor { 15 | protected final List subCommands = new ArrayList<>(); 16 | 17 | protected final Lang noPermMessage; 18 | protected final ArgumentMatcher argumentMatcher; 19 | 20 | public MainCommand(Lang noPermissionMessage, ArgumentMatcher argumentMatcher) { 21 | this.noPermMessage = noPermissionMessage; 22 | this.argumentMatcher = argumentMatcher; 23 | 24 | registerSubCommands(); 25 | } 26 | 27 | @Override 28 | public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { 29 | if (args.length == 0) { 30 | perform(sender); 31 | return true; 32 | } 33 | 34 | SubCommand subCommand = subCommands.stream().filter(sc -> sc.getName().equalsIgnoreCase(args[0])).findAny().orElse(getDefaultSyntax()); 35 | 36 | if (subCommand == null) { 37 | sender.sendMessage(Lang.UNKNOWN_COMMAND.asColoredString()); 38 | return false; 39 | } 40 | 41 | if (subCommand.getPermission() == null || sender.hasPermission(subCommand.getPermission())) 42 | subCommand.perform(sender, Arrays.copyOfRange(args, 1, args.length)); 43 | else 44 | sender.sendMessage(noPermMessage.asColoredString().replace("%permission%", subCommand.getPermission())); 45 | 46 | return true; 47 | } 48 | 49 | @Override 50 | public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { 51 | if (args.length == 0) 52 | return null; 53 | 54 | if (args.length == 1) { 55 | List subCommandsTC = subCommands.stream().filter(sc -> sc.getPermission() == null || sender.hasPermission(sc.getPermission())).map(SubCommand::getName).collect(Collectors.toList()); 56 | return getMatchingStrings(subCommandsTC, args[args.length - 1], argumentMatcher); 57 | } 58 | 59 | SubCommand subCommand = subCommands.stream().filter(sc -> sc.getName().equalsIgnoreCase(args[0])).findAny().orElse(null); 60 | 61 | if (subCommand == null) { 62 | return null; 63 | } 64 | 65 | List subCommandTB = subCommand.getTabCompletion(sender, args.length - 2, args); 66 | 67 | return getMatchingStrings(subCommandTB, args[args.length - 1], argumentMatcher); 68 | } 69 | 70 | private static List getMatchingStrings(List tabCompletions, String arg, ArgumentMatcher argumentMatcher) { 71 | if (tabCompletions == null || arg == null) 72 | return null; 73 | 74 | List result = argumentMatcher.filter(tabCompletions, arg); 75 | 76 | Collections.sort(result); 77 | 78 | return result; 79 | } 80 | 81 | public void registerMainCommand(JavaPlugin plugin, String cmdName) { 82 | PluginCommand cmd = plugin.getCommand(cmdName); 83 | 84 | cmd.setExecutor(this); 85 | cmd.setTabCompleter(this); 86 | cmd.setPermissionMessage(noPermMessage.asColoredString()); 87 | } 88 | 89 | protected abstract void registerSubCommands(); 90 | 91 | protected abstract void perform(CommandSender sender); 92 | 93 | protected SubCommand getDefaultSyntax() { 94 | return subCommands.stream().filter(sc -> sc.getName().equalsIgnoreCase("default")).findAny().orElse(null); 95 | } 96 | 97 | public List getSubCommands() { 98 | return subCommands; 99 | } 100 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/util/builder/CustomFireworkBuilder.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.util.builder; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import org.bukkit.Color; 5 | import org.bukkit.FireworkEffect; 6 | import org.bukkit.Location; 7 | import org.bukkit.entity.Firework; 8 | import org.bukkit.inventory.meta.FireworkMeta; 9 | import org.bukkit.metadata.FixedMetadataValue; 10 | import org.jetbrains.annotations.NotNull; 11 | 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | 15 | public final class CustomFireworkBuilder { 16 | private List colors; 17 | private FireworkEffect.Type type; 18 | private int power; 19 | 20 | private CustomFireworkBuilder() { 21 | this.colors = new ArrayList() {{ 22 | add(Color.BLUE); 23 | }}; 24 | 25 | this.type = FireworkEffect.Type.BALL; 26 | this.power = 1; 27 | } 28 | 29 | @NotNull 30 | public static CustomFireworkBuilder builder() { 31 | return new CustomFireworkBuilder(); 32 | } 33 | 34 | @NotNull 35 | public CustomFireworkBuilder setColors(@NotNull List colors) { 36 | this.colors = colors; 37 | return this; 38 | } 39 | 40 | @NotNull 41 | public CustomFireworkBuilder setType(@NotNull FireworkEffect.Type type) { 42 | this.type = type; 43 | return this; 44 | } 45 | 46 | @NotNull 47 | public CustomFireworkBuilder setPower(int power) { 48 | this.power = power; 49 | return this; 50 | } 51 | 52 | public void launch(Location location) { 53 | Firework firework = location.getWorld().spawn(location, Firework.class); 54 | firework.setMetadata("nodamage", new FixedMetadataValue(DailyRewardsPlugin.get(), true)); 55 | FireworkMeta fireworkMeta = firework.getFireworkMeta(); 56 | 57 | FireworkEffect.Builder effectBuilder = FireworkEffect.builder(); 58 | for (Color color : colors) { 59 | effectBuilder.withColor(color); 60 | } 61 | effectBuilder.with(this.type); 62 | 63 | fireworkMeta.addEffect(effectBuilder.build()); 64 | fireworkMeta.setPower(this.power); 65 | firework.setFireworkMeta(fireworkMeta); 66 | } 67 | 68 | public static CustomFireworkBuilder fromString(String configString) { 69 | CustomFireworkBuilder builder = new CustomFireworkBuilder(); 70 | 71 | if (configString == null || configString.isEmpty()) { 72 | return builder; 73 | } 74 | 75 | String[] keyValuePairs = configString.split(","); 76 | for (String pair : keyValuePairs) { 77 | String[] parts = pair.split(":"); 78 | if (parts.length != 2) { 79 | continue; 80 | } 81 | 82 | String key = parts[0].trim(); 83 | String value = parts[1].trim(); 84 | 85 | switch (key) { 86 | case "colors": 87 | List colors = parseColors(value); 88 | builder.setColors(colors); 89 | break; 90 | case "type": 91 | builder.setType(FireworkEffect.Type.valueOf(value.toUpperCase())); 92 | break; 93 | case "power": 94 | try { 95 | int power = Integer.parseInt(value); 96 | builder.setPower(power); 97 | } catch (NumberFormatException ignored) { 98 | } 99 | break; 100 | default: 101 | } 102 | } 103 | 104 | return builder; 105 | } 106 | 107 | private static List parseColors(String colorsString) { 108 | List colors = new ArrayList<>(); 109 | String[] colorStrings = colorsString.substring(colorsString.indexOf('{') + 1, colorsString.indexOf('}')).split(";"); 110 | for (String colorString : colorStrings) { 111 | try { 112 | Color color = Color.fromRGB(Integer.parseInt(colorString, 16)); 113 | colors.add(color); 114 | } catch (NumberFormatException e) { 115 | System.out.println("Invalid color: " + colorString); 116 | } 117 | } 118 | return colors; 119 | } 120 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/action/AutoClaimAction.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward.action; 2 | 3 | import eu.athelion.dailyrewards.configuration.file.Lang; 4 | import eu.athelion.dailyrewards.manager.reward.RewardType; 5 | import eu.athelion.dailyrewards.manager.reward.action.checker.Checker; 6 | import eu.athelion.dailyrewards.manager.reward.action.response.ActionResponse; 7 | import eu.athelion.dailyrewards.manager.reward.action.response.ClaimActionResponse; 8 | import eu.athelion.dailyrewards.user.User; 9 | import eu.athelion.dailyrewards.user.UserHandler; 10 | import eu.athelion.dailyrewards.util.PermissionUtil; 11 | import eu.athelion.dailyrewards.util.TextUtil; 12 | import eu.athelion.dailyrewards.util.VersionUtil; 13 | import net.md_5.bungee.api.chat.BaseComponent; 14 | import net.md_5.bungee.api.chat.HoverEvent; 15 | import net.md_5.bungee.api.chat.TextComponent; 16 | import net.md_5.bungee.api.chat.hover.content.Text; 17 | import org.bukkit.OfflinePlayer; 18 | import org.bukkit.command.CommandSender; 19 | import org.bukkit.entity.Player; 20 | 21 | import java.util.*; 22 | 23 | public class AutoClaimAction implements RewardAction> { 24 | 25 | @Override 26 | public ActionResponse execute(OfflinePlayer offlinePlayer, Set rewardTypes) { 27 | final User user = UserHandler.getUser(offlinePlayer.getUniqueId()); 28 | if (user == null) { 29 | return ActionResponse.Type.UNAVAILABLE_PLAYER; 30 | } 31 | 32 | final Player player = user.getPlayer(); 33 | 34 | Set claimedRewards = new HashSet<>(); 35 | Map notClaimedRewards = new HashMap<>(); 36 | for (RewardType rewardType : rewardTypes) { 37 | 38 | if (player.hasPermission(rewardType.getPermission())) { 39 | 40 | ActionResponse response = new ClaimAction(player) 41 | .disableAnnounce() 42 | .disableMenuOpening() 43 | .preCheck(player, rewardType); 44 | 45 | if (ActionResponse.isProceeded(response)) { 46 | claimedRewards.add(rewardType); 47 | } else { 48 | notClaimedRewards.put(rewardType, response); 49 | } 50 | 51 | } 52 | } 53 | 54 | if (!notClaimedRewards.isEmpty()) { 55 | BaseComponent[] msg = TextComponent.fromLegacyText(Lang.AUTO_CLAIM_FAILED.asColoredString(player)); 56 | StringBuilder notClaimRewardsBuffer = new StringBuilder(); 57 | 58 | if (!VersionUtil.isLegacyVersion()) { 59 | String format = Lang.AUTO_CLAIM_FAILED_HOVER_TEXT_LIST_FORMAT.asColoredString(player); 60 | for (Map.Entry notClaimedReward : notClaimedRewards.entrySet()) { 61 | notClaimRewardsBuffer 62 | .append(" \n") 63 | .append(format 64 | .replace("%reward%", notClaimedReward.getKey().getName()) 65 | .replace("%reason%", ((ClaimActionResponse) notClaimedReward.getValue()).getMessage()) 66 | ); 67 | } 68 | for (BaseComponent bc : msg) { 69 | bc.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text( 70 | Lang.AUTO_CLAIM_FAILED_HOVER_TEXT.asColoredString(player) 71 | .replace("%format%", 72 | notClaimRewardsBuffer.toString()))) 73 | ); 74 | } 75 | } 76 | 77 | player.spigot().sendMessage(msg); 78 | //player.sendMessage(Lang.AUTO_CLAIM_FAILED.asColoredString()); 79 | } 80 | 81 | if (!claimedRewards.isEmpty()) { 82 | StringBuilder claimedRewardsBuilder = new StringBuilder(); 83 | for (RewardType availableReward : claimedRewards) { 84 | claimedRewardsBuilder.append("\n ").append(availableReward.getName()); 85 | } 86 | TextUtil.sendListToPlayer(player, Lang.JOIN_AUTO_CLAIM_NOTIFICATION 87 | .asReplacedList(new HashMap() {{ 88 | put("%listOfRewards%", claimedRewardsBuilder.toString()); 89 | }} 90 | ) 91 | ); 92 | } 93 | 94 | 95 | return ActionResponse.Type.PROCEEDED; 96 | } 97 | 98 | @Override 99 | public boolean menuShouldOpen() { 100 | return false; 101 | } 102 | 103 | @Override 104 | public CommandSender getExecutor() { 105 | return null; 106 | } 107 | 108 | @Override 109 | public PermissionUtil.Permission getPermission() { 110 | return PermissionUtil.Permission.AUTO_CLAIM_SETTING; 111 | } 112 | 113 | @Override 114 | public List getCheckers() { 115 | return Collections.emptyList(); 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/RewardManager.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward; 2 | 3 | import eu.athelion.dailyrewards.api.event.AutoClaimEvent; 4 | import eu.athelion.dailyrewards.configuration.file.Config; 5 | import eu.athelion.dailyrewards.configuration.file.Lang; 6 | import eu.athelion.dailyrewards.manager.reward.action.AutoClaimAction; 7 | import eu.athelion.dailyrewards.user.User; 8 | import org.bukkit.Bukkit; 9 | 10 | import java.util.HashSet; 11 | import java.util.Optional; 12 | import java.util.Set; 13 | 14 | public class RewardManager { 15 | private final Set rewards; 16 | 17 | public RewardManager() { 18 | this.rewards = new HashSet<>(); 19 | loadRewards(); 20 | } 21 | 22 | public boolean processAutoClaimForUser(User user) { 23 | // if (!user.hasSettingEnabled(Setting.AUTO_CLAIM)) { 24 | // return false; 25 | // } 26 | 27 | if (user.getAvailableRewards().isEmpty()) { 28 | return false; 29 | } 30 | 31 | AutoClaimEvent autoClaimEvent = new AutoClaimEvent(user.getPlayer(), user.getAvailableRewards()); 32 | Bukkit.getPluginManager().callEvent(autoClaimEvent); 33 | 34 | new AutoClaimAction() 35 | .preCheck(user.getPlayer(), user.getAvailableRewards()); 36 | 37 | return !autoClaimEvent.isCancelled(); 38 | } 39 | 40 | public void loadRewards() { 41 | rewards.clear(); 42 | if (Config.DAILY_ENABLED.asBoolean()) 43 | rewards.add(new Reward(RewardType.DAILY, 44 | Config.DAILY_AVAILABLE_AFTER_FIRST_JOIN, 45 | Config.DAILY_COOLDOWN_FORMAT, 46 | Config.DAILY_COOLDOWN, 47 | Config.DAILY_COOLDOWN_FORMAT, 48 | Config.DAILY_POSITIONS, 49 | Config.DAILY_SOUND, 50 | Lang.DAILY_COLLECTED, 51 | Lang.DAILY_PREMIUM_COLLECTED, 52 | Config.DAILY_AVAILABLE_ITEM, 53 | Config.DAILY_UNAVAILABLE_ITEM, 54 | Lang.DAILY_DISPLAYNAME_AVAILABLE, 55 | Lang.DAILY_PREMIUM_DISPLAYNAME_AVAILABLE, 56 | Lang.DAILY_DISPLAYNAME_UNAVAILABLE, 57 | Lang.DAILY_PREMIUM_DISPLAYNAME_UNAVAILABLE, 58 | Lang.DAILY_AVAILABLE_LORE, 59 | Lang.DAILY_AVAILABLE_PREMIUM_LORE, 60 | Lang.DAILY_UNAVAILABLE_LORE, 61 | Lang.DAILY_UNAVAILABLE_PREMIUM_LORE, 62 | Config.DAILY_REWARDS, 63 | Config.DAILY_PREMIUM_REWARDS)); 64 | if (Config.WEEKLY_ENABLED.asBoolean()) 65 | rewards.add(new Reward(RewardType.WEEKLY, 66 | Config.WEEKLY_AVAILABLE_AFTER_FIRST_JOIN, 67 | Config.WEEKLY_COOLDOWN_FORMAT, 68 | Config.WEEKLY_COOLDOWN, 69 | Config.WEEKLY_COOLDOWN_FORMAT, 70 | Config.WEEKLY_POSITIONS, 71 | Config.WEEKLY_SOUND, 72 | Lang.WEEKLY_COLLECTED, 73 | Lang.WEEKLY_PREMIUM_COLLECTED, 74 | Config.WEEKLY_AVAILABLE_ITEM, 75 | Config.WEEKLY_UNAVAILABLE_ITEM, 76 | Lang.WEEKLY_DISPLAYNAME_AVAILABLE, 77 | Lang.WEEKLY_PREMIUM_DISPLAYNAME_AVAILABLE, 78 | Lang.WEEKLY_DISPLAYNAME_UNAVAILABLE, 79 | Lang.WEEKLY_PREMIUM_DISPLAYNAME_UNAVAILABLE, 80 | Lang.WEEKLY_AVAILABLE_LORE, 81 | Lang.WEEKLY_AVAILABLE_PREMIUM_LORE, 82 | Lang.WEEKLY_UNAVAILABLE_LORE, 83 | Lang.WEEKLY_UNAVAILABLE_PREMIUM_LORE, 84 | Config.WEEKLY_REWARDS, 85 | Config.WEEKLY_PREMIUM_REWARDS)); 86 | if (Config.MONTHLY_ENABLED.asBoolean()) 87 | rewards.add(new Reward( 88 | RewardType.MONTHLY, 89 | Config.MONTHLY_AVAILABLE_AFTER_FIRST_JOIN, 90 | Config.MONTHLY_COOLDOWN_FORMAT, 91 | Config.MONTHLY_COOLDOWN, 92 | Config.MONTHLY_COOLDOWN_FORMAT, 93 | Config.MONTHLY_POSITIONS, 94 | Config.MONTHLY_SOUND, 95 | Lang.MONTHLY_COLLECTED, 96 | Lang.MONTHLY_PREMIUM_COLLECTED, 97 | Config.MONTHLY_AVAILABLE_ITEM, 98 | Config.MONTHLY_UNAVAILABLE_ITEM, 99 | Lang.MONTHLY_DISPLAYNAME_AVAILABLE, 100 | Lang.MONTHLY_PREMIUM_DISPLAYNAME_AVAILABLE, 101 | Lang.MONTHLY_DISPLAYNAME_UNAVAILABLE, 102 | Lang.MONTHLY_PREMIUM_DISPLAYNAME_UNAVAILABLE, 103 | Lang.MONTHLY_AVAILABLE_LORE, 104 | Lang.MONTHLY_AVAILABLE_PREMIUM_LORE, 105 | Lang.MONTHLY_UNAVAILABLE_LORE, 106 | Lang.MONTHLY_UNAVAILABLE_PREMIUM_LORE, 107 | Config.MONTHLY_REWARDS, 108 | Config.MONTHLY_PREMIUM_REWARDS)); 109 | } 110 | 111 | public Optional getRewardByType(RewardType rewardType) { 112 | return rewards.stream().filter(reward -> reward.getType() == rewardType).findFirst(); 113 | } 114 | 115 | public Set getRewards() { 116 | return rewards; 117 | } 118 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/user/UserHandler.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.user; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import eu.athelion.dailyrewards.api.event.ReminderReceiveEvent; 5 | import eu.athelion.dailyrewards.data.DataManager; 6 | import eu.athelion.dailyrewards.hook.HookManager; 7 | import eu.athelion.dailyrewards.manager.reward.RewardType; 8 | import eu.athelion.dailyrewards.manager.reward.task.JoinNotificationTask; 9 | import eu.athelion.dailyrewards.manager.reward.task.AutoClaimTask; 10 | import org.bukkit.Bukkit; 11 | import org.bukkit.entity.Player; 12 | import org.bukkit.event.EventHandler; 13 | import org.bukkit.event.EventPriority; 14 | import org.bukkit.event.Listener; 15 | import org.bukkit.event.player.PlayerJoinEvent; 16 | import org.bukkit.event.player.PlayerQuitEvent; 17 | import org.jetbrains.annotations.NotNull; 18 | 19 | import java.util.*; 20 | import java.util.concurrent.ConcurrentHashMap; 21 | import java.util.function.Consumer; 22 | 23 | public final class UserHandler implements Listener { 24 | private static final Map usersHashMap = new ConcurrentHashMap<>(); 25 | private static final Map>> pendingTasks = new ConcurrentHashMap<>(); 26 | 27 | private final JoinNotificationTask joinNotificationTask; 28 | private final AutoClaimTask autoClaimTask; 29 | 30 | public UserHandler() { 31 | this.joinNotificationTask = new JoinNotificationTask(usersHashMap); 32 | if (DailyRewardsPlugin.getFoliaLib().isFolia()) { 33 | DailyRewardsPlugin.getFoliaLib().getScheduler() 34 | .runTimerAsync(wrappedTask -> this.joinNotificationTask.get().run(), 45, 45); 35 | } else { 36 | this.joinNotificationTask.get() 37 | .runTaskTimerAsynchronously(DailyRewardsPlugin.get(), 45, 45); 38 | } 39 | 40 | this.autoClaimTask = new AutoClaimTask(usersHashMap); 41 | if (DailyRewardsPlugin.getFoliaLib().isFolia()) { 42 | DailyRewardsPlugin.getFoliaLib().getScheduler() 43 | .runTimerAsync(wrappedTask -> this.autoClaimTask.get().run(), 45, 45); 44 | } else { 45 | this.autoClaimTask.get() 46 | .runTaskTimerAsynchronously(DailyRewardsPlugin.get(), 45, 45); 47 | } 48 | 49 | DailyRewardsPlugin.get().registerListeners(this); 50 | } 51 | 52 | public static User addUser(final User user) { 53 | usersHashMap.put(user.getPlayer().getUniqueId(), user); 54 | 55 | // Spusť čekající úkoly 56 | List> tasks = pendingTasks.remove(user.getPlayer().getUniqueId()); 57 | if (tasks != null) { 58 | for (Consumer task : tasks) { 59 | try { 60 | task.accept(user); 61 | } catch (Exception ex) { 62 | Bukkit.getLogger().warning("Failed to run pending User task: " + ex.getMessage()); 63 | ex.printStackTrace(); 64 | } 65 | } 66 | } 67 | 68 | return user; 69 | } 70 | 71 | public static User getUser(final UUID uuid) { 72 | return usersHashMap.get(uuid); 73 | } 74 | 75 | @NotNull 76 | public static User getUser(@NotNull Player player) { 77 | return getUser(player.getUniqueId()); 78 | } 79 | 80 | public static User removeUser(final UUID uuid) { 81 | return usersHashMap.remove(uuid); 82 | } 83 | 84 | public static void runWhenReady(Player player, Consumer action) { 85 | UUID uuid = player.getUniqueId(); 86 | User user = usersHashMap.get(uuid); 87 | 88 | if (user != null) { 89 | action.accept(user); 90 | } else { 91 | pendingTasks.computeIfAbsent(uuid, k -> new ArrayList<>()).add(action); 92 | } 93 | } 94 | 95 | @EventHandler(priority = EventPriority.HIGH) 96 | private void onJoin(PlayerJoinEvent event) { 97 | final Player player = event.getPlayer(); 98 | 99 | DataManager.loadPlayerDataAsync(player, data -> { 100 | User user = UserHandler.addUser( 101 | new User( 102 | player, 103 | data 104 | ) 105 | ); 106 | 107 | final Set availableRewards = user.getAvailableRewards(); 108 | 109 | ReminderReceiveEvent reminderReceiveEvent = new ReminderReceiveEvent(player, availableRewards); 110 | DailyRewardsPlugin.get().runSync(() -> Bukkit.getPluginManager().callEvent(reminderReceiveEvent)); 111 | 112 | if (reminderReceiveEvent.isCancelled()) { 113 | return; 114 | } 115 | 116 | if (HookManager.isAuthUsed()) { 117 | return; 118 | } 119 | 120 | joinNotificationTask.addUser(user); 121 | autoClaimTask.addUser(user); 122 | }); 123 | } 124 | 125 | @EventHandler 126 | private void onQuit(PlayerQuitEvent event) { 127 | User user = UserHandler.removeUser(event.getPlayer().getUniqueId()); 128 | joinNotificationTask.getPlayerRewardCheckTimes().remove(user); 129 | } 130 | 131 | public JoinNotificationTask getJoinNotificationTask() { 132 | return joinNotificationTask; 133 | } 134 | 135 | public AutoClaimTask getAutoClaimTask() { 136 | return autoClaimTask; 137 | } 138 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/configuration/file/Lang.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.configuration.file; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import eu.athelion.dailyrewards.configuration.ColorTextModifier; 5 | import eu.athelion.dailyrewards.configuration.PlaceholderColorTextModifier; 6 | import eu.athelion.dailyrewards.configuration.TextModifier; 7 | import eu.athelion.dailyrewards.configuration.YamlFile; 8 | import eu.athelion.dailyrewards.hook.HookManager; 9 | import eu.athelion.dailyrewards.util.TextUtil; 10 | import org.bukkit.configuration.ConfigurationSection; 11 | import org.bukkit.configuration.file.YamlConfiguration; 12 | import org.bukkit.entity.Player; 13 | 14 | import java.util.*; 15 | 16 | public enum Lang { 17 | PREFIX, 18 | BACK, 19 | LOADING, 20 | AVAILABLE, 21 | UNKNOWN_COMMAND, 22 | COMMAND_USAGE, 23 | INCOMPLETE_REWARD_RESET, 24 | REWARD_RESET, 25 | UNAVAILABLE_PLAYER, 26 | UNAVAILABLE_SETTING, 27 | REWARD_DISABLED, 28 | SETTING_ENABLED, 29 | SETTING_DISABLED, 30 | CLICK_TO_PERFORM, 31 | INSUFFICIENT_PERMISSION, 32 | 33 | CLAIM_COMMAND_DESCRIPTION, 34 | RESET_COMMAND_DESCRIPTION, 35 | SETTINGS_COMMAND_DESCRIPTION, 36 | TOGGLE_COMMAND_DESCRIPTION, 37 | RELOAD_COMMAND_DESCRIPTION, 38 | IMPORT_COMMAND_DESCRIPTION, 39 | HELP_COMMAND_DESCRIPTION, 40 | 41 | REWARDS_ARE_NOT_SET, 42 | RELOAD_MSG, 43 | MENU_TITLE, 44 | SETTINGS_TITLE, 45 | SETTINGS_DISPLAY_NAME, 46 | AUTO_CLAIM_FAILED, 47 | AUTO_CLAIM_FAILED_HOVER_TEXT, 48 | AUTO_CLAIM_FAILED_HOVER_TEXT_LIST_FORMAT, 49 | JOIN_AUTO_CLAIM_NOTIFICATION, 50 | JOIN_NOTIFICATION_SETTING_NAME, 51 | JOIN_AUTO_CLAIM_SETTING_NAME, 52 | NO_PERMISSION_SETTING_DISPLAY_NAME, 53 | NO_PERMISSION_SETTING_LORE, 54 | JOIN_NOTIFICATION_DISPLAY_NAME, 55 | JOIN_NOTIFICATION_ENABLED_LORE, 56 | JOIN_NOTIFICATION_DISABLED_LORE, 57 | AUTO_CLAIM_DISPLAY_NAME, 58 | AUTO_CLAIM_ENABLED_LORE, 59 | AUTO_CLAIM_DISABLED_LORE, 60 | JOIN_HOVER_MESSAGE, 61 | JOIN_NOTIFICATION, 62 | COOLDOWN_MESSAGE, 63 | CLAIMING_IN_DISABLED_WORLD, 64 | NOT_ENOUGH_REQUIRED_TIME_TO_CLAIM, 65 | LOCATED_IN_RESTRICTED_WORLD, 66 | INSUFFICIENT_PLAY_TIME, 67 | INSUFFICIENT_PERMISSIONS, 68 | NOT_ENOUGH_FREE_INVENTORY_SLOTS, 69 | UNAVAILABLE_REWARD, 70 | 71 | DAILY_NAME, 72 | DAILY_TITLE, 73 | DAILY_SUBTITLE, 74 | DAILY_COLLECTED, 75 | DAILY_PREMIUM_COLLECTED, 76 | DAILY_DISPLAYNAME_AVAILABLE, 77 | DAILY_AVAILABLE_LORE, 78 | DAILY_AVAILABLE_PREMIUM_LORE, 79 | DAILY_PREMIUM_DISPLAYNAME_AVAILABLE, 80 | DAILY_DISPLAYNAME_UNAVAILABLE, 81 | DAILY_PREMIUM_DISPLAYNAME_UNAVAILABLE, 82 | 83 | DAILY_UNAVAILABLE_LORE, 84 | DAILY_UNAVAILABLE_PREMIUM_LORE, 85 | 86 | WEEKLY_NAME, 87 | WEEKLY_TITLE, 88 | WEEKLY_SUBTITLE, 89 | WEEKLY_COLLECTED, 90 | WEEKLY_PREMIUM_COLLECTED, 91 | WEEKLY_DISPLAYNAME_AVAILABLE, 92 | WEEKLY_PREMIUM_DISPLAYNAME_AVAILABLE, 93 | 94 | WEEKLY_AVAILABLE_LORE, 95 | WEEKLY_AVAILABLE_PREMIUM_LORE, 96 | WEEKLY_DISPLAYNAME_UNAVAILABLE, 97 | WEEKLY_PREMIUM_DISPLAYNAME_UNAVAILABLE, 98 | 99 | WEEKLY_UNAVAILABLE_LORE, 100 | WEEKLY_UNAVAILABLE_PREMIUM_LORE, 101 | 102 | MONTHLY_NAME, 103 | MONTHLY_TITLE, 104 | MONTHLY_SUBTITLE, 105 | MONTHLY_COLLECTED, 106 | MONTHLY_PREMIUM_COLLECTED, 107 | MONTHLY_DISPLAYNAME_AVAILABLE, 108 | MONTHLY_PREMIUM_DISPLAYNAME_AVAILABLE, 109 | 110 | MONTHLY_AVAILABLE_LORE, 111 | MONTHLY_AVAILABLE_PREMIUM_LORE, 112 | MONTHLY_DISPLAYNAME_UNAVAILABLE, 113 | MONTHLY_PREMIUM_DISPLAYNAME_UNAVAILABLE, 114 | MONTHLY_UNAVAILABLE_LORE, 115 | MONTHLY_UNAVAILABLE_PREMIUM_LORE, 116 | FULL_INVENTORY_MESSAGE; 117 | 118 | private static final Map messages = new HashMap<>(); 119 | private static final Map listsStoredAsStrings = new HashMap<>(); 120 | 121 | private static TextModifier textModifier; 122 | 123 | private String getName() { 124 | return this.name(); 125 | } 126 | 127 | public static void reload(Config language) { 128 | YamlFile langYamlFile = new YamlFile("lang/" + language.asString() + ".yml", 129 | DailyRewardsPlugin.get().getDataFolder(), YamlFile.UpdateMethod.EVERYTIME); 130 | 131 | if (HookManager.isHookEnabled(HookManager.getPlaceholderApiHook())) { 132 | DailyRewardsPlugin.get().getLogger().info("Using PAPI text modifier"); 133 | textModifier = new PlaceholderColorTextModifier(); 134 | } else textModifier = new ColorTextModifier(); 135 | 136 | langYamlFile.reload(); 137 | final YamlConfiguration configuration = langYamlFile.getConfiguration(); 138 | 139 | ConfigurationSection langSection = configuration.getConfigurationSection("lang"); 140 | if (langSection == null) { 141 | DailyRewardsPlugin.get().getLogger().info("Invalid configuration in " + langYamlFile.getFilePath()); 142 | return; 143 | } 144 | 145 | langSection 146 | .getKeys(false) 147 | .forEach(key -> { 148 | String editedKey = key.toUpperCase(Locale.ENGLISH).replace("-", "_"); 149 | if (langSection.isList(key)) { 150 | listsStoredAsStrings.put(editedKey, String.join("ᴪ", langSection.getStringList(key))); 151 | } else 152 | messages.put(editedKey, Objects.requireNonNull(langSection.getString(key)).replace("%prefix%", Lang.PREFIX.asColoredString())); 153 | }); 154 | } 155 | 156 | public List asReplacedList(final Map definitions) { 157 | return TextUtil.colorize(TextUtil.replaceListAsString(listsStoredAsStrings.get(getName()), definitions)); 158 | } 159 | 160 | public String asColoredString() { 161 | return textModifier.modifyText(null, messages.get(getName())); 162 | } 163 | 164 | public String asColoredString(Player player) { 165 | return textModifier.modifyText(player, messages.get(getName())); 166 | } 167 | 168 | public String asReplacedString(Player player, Map definitions) { 169 | return textModifier.modifyText(player, TextUtil.replaceString(messages.get(getName()), definitions)); 170 | } 171 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/data/DataManager.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.data; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import eu.athelion.dailyrewards.configuration.file.Config; 5 | import eu.athelion.dailyrewards.manager.backend.MySQLManager; 6 | import eu.athelion.dailyrewards.manager.reward.Reward; 7 | import eu.athelion.dailyrewards.manager.reward.RewardType; 8 | import eu.athelion.dailyrewards.user.User; 9 | import eu.athelion.dailyrewards.util.TextUtil; 10 | import org.bukkit.Bukkit; 11 | import org.bukkit.command.CommandSender; 12 | import org.bukkit.configuration.ConfigurationSection; 13 | import org.bukkit.entity.Player; 14 | 15 | import java.util.HashMap; 16 | import java.util.Map; 17 | import java.util.UUID; 18 | import java.util.concurrent.CountDownLatch; 19 | 20 | public class DataManager { 21 | 22 | private static boolean usingMysql; 23 | 24 | public static boolean updateValues(final UUID id, User user, Map data) { 25 | if (user != null && user.isOnline()) { 26 | user.updateData(data); 27 | } 28 | 29 | if (isUsingMysql()) { 30 | return MySQLManager.updatePlayer(id, data); 31 | } else { 32 | final PlayerData playerData = PlayerData.getConfig(id); 33 | final ConfigurationSection rewardsSection = playerData.getConfigurationSection("rewards"); 34 | 35 | try { 36 | for (Map.Entry entry : data.entrySet()) 37 | rewardsSection.set(entry.getKey(), entry.getValue()); 38 | playerData.save(); 39 | } catch (NullPointerException ignored) { 40 | return false; 41 | } 42 | } 43 | 44 | return true; 45 | } 46 | 47 | public static void importToDatabase(CommandSender sender) { 48 | if (!usingMysql) { 49 | sender.sendMessage(TextUtil.colorize("&cYou need to have MySQL setup first!")); 50 | return; 51 | } 52 | 53 | sender.sendMessage(TextUtil.colorize("&aStarting import from files...")); 54 | 55 | CountDownLatch latch = new CountDownLatch(PlayerData.getFiles().size()); 56 | 57 | PlayerData.getFiles().parallelStream().forEach(file -> { 58 | String fileName = file.getName(); 59 | String uuidString = fileName.substring(0, fileName.length() - 4); 60 | UUID uuid = UUID.fromString(uuidString); 61 | MySQLManager.createPlayer(uuidString); 62 | 63 | ConfigurationSection data = PlayerData.getConfig(uuid).getConfigurationSection("rewards"); 64 | 65 | MySQLManager.updatePlayer(UUID.fromString(uuidString), data.getValues(false)); 66 | 67 | latch.countDown(); 68 | }); 69 | 70 | try { 71 | latch.await(); 72 | sender.sendMessage(TextUtil.colorize("&aImport from files completed successfully.")); 73 | } catch (InterruptedException e) { 74 | sender.sendMessage(TextUtil.colorize("&The import process has been interrupted.\n" + e.getMessage())); 75 | } 76 | } 77 | 78 | public static void initiatePlayer(final Player player){ 79 | if (isUsingMysql()) MySQLManager.createPlayer(player.getUniqueId().toString()); 80 | else { 81 | final PlayerData playerData = PlayerData.getConfig(player.getUniqueId()); 82 | if (!playerData.isConfigurationSection("rewards")) { 83 | playerData.createSection("rewards"); 84 | } 85 | 86 | final long currentTimeInMillis = System.currentTimeMillis(); 87 | final ConfigurationSection section = playerData.getConfigurationSection("rewards"); 88 | final int multiplier = 60 * 60 * 1000; 89 | 90 | setDefaultValue(section, RewardType.DAILY.toString(), Config.DAILY_AVAILABLE_AFTER_FIRST_JOIN.asBoolean() ? 0 : currentTimeInMillis + Config.DAILY_COOLDOWN.asLong() * multiplier); 91 | setDefaultValue(section, RewardType.WEEKLY.toString(), Config.WEEKLY_AVAILABLE_AFTER_FIRST_JOIN.asBoolean() ? 0 : currentTimeInMillis + Config.WEEKLY_COOLDOWN.asLong() * multiplier); 92 | setDefaultValue(section, RewardType.MONTHLY.toString(), Config.MONTHLY_AVAILABLE_AFTER_FIRST_JOIN.asBoolean() ? 0 : currentTimeInMillis + Config.MONTHLY_COOLDOWN.asLong() * multiplier); 93 | setDefaultValue(section, "autoClaim", Config.AUTO_CLAIM_REWARDS_ON_JOIN_BY_DEFAULT.asBoolean() ? 1 : 0); 94 | setDefaultValue(section, "joinNotification", Config.JOIN_NOTIFICATION_BY_DEFAULT.asBoolean() ? 1 : 0); 95 | 96 | playerData.save(); 97 | } 98 | } 99 | 100 | private static void setDefaultValue(ConfigurationSection section, String path, long value) { 101 | if (!section.isSet(path)) { 102 | section.set(path, value); 103 | } 104 | } 105 | 106 | public static Map getPlayerData(Player player){ 107 | Map data = new HashMap<>(); 108 | if (isUsingMysql()) data = MySQLManager.getRewardsCooldown(player.getUniqueId()); 109 | else { 110 | PlayerData playerData = PlayerData.getConfig(player.getUniqueId()); 111 | for (Reward reward : DailyRewardsPlugin.getRewardManager().getRewards()) { 112 | final RewardType rewardType = reward.getType(); 113 | data.put(rewardType.toString(), playerData.getString("rewards." + rewardType)); 114 | } 115 | data.put("autoClaim", playerData.getString("rewards.autoClaim")); 116 | data.put("joinNotification", playerData.getString("rewards.joinNotification")); 117 | } 118 | return data; 119 | } 120 | 121 | public static void loadPlayerDataAsync(final Player player, final FindOneCallback callback) { 122 | DailyRewardsPlugin.get().runAsync(() -> { 123 | initiatePlayer(player); 124 | final Map result = getPlayerData(player); 125 | if (DailyRewardsPlugin.getFoliaLib().isFolia()) { 126 | DailyRewardsPlugin.getFoliaLib().getScheduler().runNextTick(wrappedTask -> callback.onQueryDone(result)); 127 | } else Bukkit.getScheduler().runTask(DailyRewardsPlugin.get(), () -> callback.onQueryDone(result)); 128 | }); 129 | } 130 | 131 | public static boolean isUsingMysql() { 132 | return usingMysql; 133 | } 134 | 135 | public static void setUsingMysql(boolean usingMysql) { 136 | DataManager.usingMysql = usingMysql; 137 | } 138 | } -------------------------------------------------------------------------------- /src/main/resources/lang/Chinese.yml: -------------------------------------------------------------------------------- 1 | # 2 | # 自1.16版本后,您可以使用Hex格式的颜色代码。 3 | # 替换 &f 的我的世界颜色格式为 <#ffffff> 即可。 4 | # 对于渐变:<#ffffff>文本将在这里应用渐变。 5 | # 6 | # Everything about the models and colouring can be found at https://ultimaterewards.athelion.eu/colors-and-models 7 | # 8 | lang: 9 | prefix: "&e[&6&lDailyRewards&e]" 10 | unknown-command: "%prefix% &4Unknown command, use /rw help to list all available commands" 11 | auto-claim-notification: 12 | - " " 13 | - "&a ✔ &f%rewards% 礼包已自动领取!" 14 | - " " 15 | unclaimed-rewards-notification-hover-text: "&2点击领取礼包!" 16 | reward-reset: "&e%prefix% &f您已重置玩家 &e%player% 的 &e%type%&f 礼包。" 17 | unavailable-player: "%prefix% &c该玩家不存在!" 18 | unavailable-setting: "%prefix% &c该设置项不存在!" 19 | reward-disabled: "%prefix% &c无法获得该礼包!" 20 | insufficient-permission: "%prefix% &c您需要 %permission% 才能执行此操作!" 21 | rewards-are-not-set: "%prefix% &c尚未设置任何礼包!" 22 | reload-msg: "&e%prefix% &f插件已重载" 23 | incomplete-reward-reset: "%prefix% &c请指定您要重置的内容(daily/weekly/monthly/all)" 24 | full-inventory-message: "%prefix% &c领取失败:您的背包已满!" 25 | claiming-in-disabled-world: "%prefix% &c您无法在该世界中领取礼包(%world%)。" 26 | not-enough-required-time-to-claim: "%prefix% &c您必须在线至少 %requiredMinutes% 分钟才能领取该礼包(剩余 %minutes% 分钟)" 27 | command-usage: "%prefix% &c用法:%usage%" 28 | available: "&a&l可用" 29 | loading: "&b加载中..." 30 | back: "&c返回" 31 | click-to-perform: "&7点击执行 %command% 命令" 32 | claim-command-description: "兑换指定奖励" 33 | reset-command-description: "重置指定奖励" 34 | settings-command-description: "打开设置菜单" 35 | toggle-command-description: "切换某些设置" 36 | reload-command-description: "重新加载插件配置" 37 | import-command-description: "将所有本地数据导入数据库" 38 | help-command-description: "显示所有可用命令" 39 | # 40 | # 设置 41 | # 42 | settings-title: "设置" 43 | settings-display-name: "&e设置" 44 | setting-enabled: "%prefix% &a已启用 %setting%!" 45 | setting-disabled: "%prefix% &c已禁用 %setting%!" 46 | auto-claim-failed: "%prefix% &c部分礼包无法自动领取,悬停以获取更多信息。" 47 | auto-claim-failed-hover-text-list-format: "%reward% - %reason%" 48 | auto-claim-failed-hover-text: "&c无法自动领取以下礼包:%format%" 49 | join-auto-claim-notification: 50 | - " " 51 | - "&a ✔ 已自动领取以下礼包:&f%listOfRewards%" 52 | - " " 53 | join-notification-setting-name: "进服提示" 54 | join-auto-claim-setting-name: "进服自动领取" 55 | no-permission-setting-display-name: "&c&l%settingType%" 56 | no-permission-setting-lore: 57 | - "&c您没有权限修改此设置项!" 58 | - "&c缺少权限:%permission%" 59 | join-notification-display-name: "&a进服提示" 60 | join-notification-enabled-lore: 61 | - "&7如果您有未领取的礼包" 62 | - "&7将在进服时进行提示" 63 | - " " 64 | - "&c► 点击以禁用" 65 | join-notification-disabled-lore: 66 | - "&7如果您有未领取的礼包" 67 | - "&7将在进服时进行提示" 68 | - " " 69 | - "&a► 点击以启用" 70 | auto-claim-display-name: "&a进服自动领取" 71 | auto-claim-enabled-lore: 72 | - "&7如果您有未领取的礼包" 73 | - "&7将在进服时全部领取" 74 | - " " 75 | - "&c► 点击以禁用" 76 | auto-claim-disabled-lore: 77 | - "&7如果您有未领取的礼包" 78 | - "&7将在进服时全部领取" 79 | - " " 80 | - "&a► 点击以启用" 81 | 82 | located-in-restricted-world: "在线礼包在当前世界中已关闭" 83 | insufficient-play-time: "游戏时间不足,无法领取" 84 | insufficient-permissions: "权限不足" 85 | not-enough-free-inventory-slots: "背包空间不足" 86 | unavailable-reward: "礼包不可用" 87 | # 88 | # 礼包菜单 89 | # 90 | menu-title: "礼包" 91 | join-hover-message: "&7点击领取您的礼包" 92 | join-notification: 93 | - ' ' 94 | - '&2 Hi %player%, &a%rewards% 礼包正在等你! &f(点击这里)' 95 | - ' ' 96 | cooldown-message: "%prefix% &c对于 &l%type% &c礼包,您需要再等待 &n%time%" 97 | daily-name: "每日礼包" 98 | daily-title: "&a&l礼包" 99 | daily-subtitle: "&7已领取 &a每日礼包&7!" 100 | daily-collected: "&a%player% &7已领取 &a&l每日礼包&7!" 101 | daily-premium-collected: "&a%player% &7已领取 &a&l高级每日礼包&7!" 102 | daily-displayname-available: "&a&l每日礼包" 103 | daily-premium-displayname-available: "&e&l每日礼包" 104 | daily-available-lore: 105 | - "&7礼包包含:" 106 | - "&a 8x &f铁锭" 107 | - " " 108 | - "&c❌ 高级礼包未解锁" 109 | daily-available-premium-lore: 110 | - "&7礼包包含:" 111 | - "&a 16x &f铁锭" 112 | - "&a 3x &f金锭" 113 | - " " 114 | - "&e✔ 高级礼包已解锁" 115 | daily-displayname-unavailable: "&c&l每日礼包" 116 | daily-premium-displayname-unavailable: "&4&l每日礼包" 117 | daily-unavailable-lore: 118 | - " " 119 | - "&c可在 %cooldown%s 后领取" 120 | daily-unavailable-premium-lore: 121 | - " " 122 | - "&c可在 %cooldown%s 后领取" 123 | weekly-name: "每周礼包" 124 | weekly-title: "&e&l礼包" 125 | weekly-subtitle: "&7已领取 &e每周礼包&7!" 126 | weekly-collected: "&e%player% &7已领取 &e&l每周礼包&7!" 127 | weekly-premium-collected: "&e%player% &7已领取 &e&l高级每周礼包&7!" 128 | weekly-displayname-available: "&a&l每周礼包" 129 | weekly-premium-displayname-available: "&e&l每周礼包" 130 | weekly-available-lore: 131 | - "&7礼包包含:" 132 | - "&a 1x &f钻石" 133 | - " " 134 | - "&c❌ 高级礼包未解锁" 135 | weekly-available-premium-lore: 136 | - "&7礼包包含:" 137 | - "&a 5x &f钻石" 138 | - "&a 3x &f绿宝石" 139 | - " " 140 | - "&e✔ 高级礼包已解锁" 141 | weekly-displayname-unavailable: "&c&l每周礼包" 142 | weekly-premium-displayname-unavailable: "&4&l每周礼包" 143 | weekly-unavailable-lore: 144 | - " " 145 | - "&c可在 %cooldown%s 后领取" 146 | weekly-unavailable-premium-lore: 147 | - " " 148 | - "&c可在 %cooldown%s 后领取" 149 | monthly-name: "每月礼包" 150 | monthly-title: "&9&l礼包" 151 | monthly-subtitle: "&7您已领取 &9每月礼包&7!" 152 | monthly-collected: "&9%player% &7已领取 &9&l每月礼包&7!" 153 | monthly-premium-collected: "&9%player% &7已领取 &9&l高级每月礼包&7!" 154 | monthly-displayname-available: "&a&l每月礼包" 155 | monthly-premium-displayname-available: "&e&l每月礼包" 156 | monthly-available-lore: 157 | - "&7礼包包含:" 158 | - "&a 8x &f钻石" 159 | - "&a 32x &f铁锭" 160 | - "&a 16x &f金锭" 161 | - " " 162 | - "&c❌ 高级礼包未解锁" 163 | monthly-available-premium-lore: 164 | - "&7礼包包含:" 165 | - "&a 1x &f下界之星" 166 | - "&a 16x &f钻石" 167 | - "&a 64x &f铁锭" 168 | - "&a 32x &f金锭" 169 | - " " 170 | - "&e✔ 高级礼包已解锁" 171 | monthly-displayname-unavailable: "&c&l每月礼包" 172 | monthly-premium-displayname-unavailable: "&4&l每月礼包" 173 | monthly-unavailable-lore: 174 | - " " 175 | - "&c可在 %cooldown%s 后领取" 176 | monthly-unavailable-premium-lore: 177 | - " " 178 | - "&c可在 %cooldown%s 后领取" 179 | -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/Reward.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward; 2 | 3 | import eu.athelion.dailyrewards.configuration.file.Config; 4 | import eu.athelion.dailyrewards.configuration.file.Lang; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | import java.util.Collections; 9 | import java.util.List; 10 | import java.util.stream.Collectors; 11 | 12 | public class Reward { 13 | private final RewardType rewardType; 14 | private final Config availableAfterFirstJoin; 15 | private final Config placeholder; 16 | private final Config cooldown; 17 | private final Config cooldownFormat; 18 | private final Config position; 19 | private final Config sound; 20 | private final Lang collectedMessage; 21 | private final Lang collectedPremiumMessage; 22 | private final Config availableItem; 23 | private final Config unavailableItem; 24 | private final Lang availableDisplayName; 25 | private final Lang availablePremiumDisplayName; 26 | private final Lang unavailableDisplayName; 27 | private final Lang unavailablePremiumDisplayName; 28 | private final Lang availableLore; 29 | private final Lang availablePremiumLore; 30 | private final Lang unavailableLore; 31 | private final Lang unavailablePremiumLore; 32 | private final Config defaultRewards; 33 | private final Config premiumRewards; 34 | 35 | public Reward(RewardType rewardType, 36 | Config availableAfterFirstJoin, 37 | Config placeholder, 38 | Config cooldown, 39 | Config cooldownFormat, 40 | Config position, 41 | Config sound, 42 | Lang collectedMessage, 43 | Lang collectedPremiumMessage, 44 | Config availableItem, 45 | Config unavailableItem, 46 | Lang availableDisplayName, 47 | Lang availablePremiumDisplayName, 48 | Lang unavailableDisplayName, 49 | Lang unavailablePremiumDisplayName, 50 | Lang availableLore, 51 | Lang availablePremiumLore, 52 | Lang unavailableLore, 53 | Lang unavailablePremiumLore, 54 | Config defaultRewards, 55 | Config premiumRewards) { 56 | this.rewardType = rewardType; 57 | this.availableAfterFirstJoin = availableAfterFirstJoin; 58 | this.placeholder = placeholder; 59 | this.cooldown = cooldown; 60 | this.cooldownFormat = cooldownFormat; 61 | this.position = position; 62 | this.sound = sound; 63 | this.collectedMessage = collectedMessage; 64 | this.collectedPremiumMessage = collectedPremiumMessage; 65 | this.availableItem = availableItem; 66 | this.unavailableItem = unavailableItem; 67 | this.availableDisplayName = availableDisplayName; 68 | this.availablePremiumDisplayName = availablePremiumDisplayName; 69 | this.unavailableDisplayName = unavailableDisplayName; 70 | this.unavailablePremiumDisplayName = unavailablePremiumDisplayName; 71 | this.availableLore = availableLore; 72 | this.availablePremiumLore = availablePremiumLore; 73 | this.unavailableLore = unavailableLore; 74 | this.unavailablePremiumLore = unavailablePremiumLore; 75 | this.defaultRewards = defaultRewards; 76 | this.premiumRewards = premiumRewards; 77 | } 78 | 79 | public String getName() { 80 | return rewardType.toString(); 81 | } 82 | 83 | public RewardType getType() { 84 | return rewardType; 85 | } 86 | 87 | public boolean isAvailableAfterFirstJoin() { 88 | return availableAfterFirstJoin.asBoolean(); 89 | } 90 | 91 | public String getPlaceholder() { 92 | return placeholder.asString(); 93 | } 94 | 95 | public long getCooldown() { 96 | return cooldown.asLong() * 60L * 60L * 1000L; 97 | } 98 | 99 | public String getCooldownFormat() { 100 | return cooldownFormat.asString(); 101 | } 102 | 103 | public List getPosition() { 104 | return position.asReplacedList().stream().map(Integer::parseInt).collect(Collectors.toList()); 105 | } 106 | 107 | public String getSound() { 108 | return sound.asString(); 109 | } 110 | 111 | public String getCollectedMessage(Player player) { 112 | return collectedMessage.asColoredString(player); 113 | } 114 | 115 | public String getCollectedPremiumMessage(Player player) { 116 | return collectedPremiumMessage.asColoredString(player); 117 | } 118 | 119 | public ItemStack getAvailableItem() { 120 | return availableItem.asAnItem(); 121 | } 122 | 123 | public ItemStack getUnavailableItem() { 124 | return unavailableItem.asAnItem(); 125 | } 126 | 127 | public List getDefaultRewards() { 128 | return defaultRewards.asReplacedList(); 129 | } 130 | 131 | public List getPremiumRewards() { 132 | return premiumRewards.asReplacedList(); 133 | } 134 | 135 | public String getAvailableDisplayName() { 136 | return availableDisplayName.asColoredString(); 137 | } 138 | 139 | public String getAvailablePremiumDisplayName() { 140 | return availablePremiumDisplayName.asColoredString(); 141 | } 142 | 143 | public String getUnavailableDisplayName() { 144 | return unavailableDisplayName.asColoredString(); 145 | } 146 | 147 | public String getUnavailablePremiumDisplayName() { 148 | return unavailablePremiumDisplayName.asColoredString(); 149 | } 150 | 151 | public List getAvailableLore() { 152 | return availableLore.asReplacedList(Collections.emptyMap()); 153 | } 154 | 155 | public List getAvailablePremiumLore() { 156 | return availablePremiumLore.asReplacedList(Collections.emptyMap()); 157 | } 158 | 159 | public List getUnavailablePremiumLore() { 160 | return unavailablePremiumLore.asReplacedList(Collections.emptyMap()); 161 | } 162 | 163 | public List getUnavailableLore() { 164 | return unavailableLore.asReplacedList(Collections.emptyMap()); 165 | } 166 | } 167 | -------------------------------------------------------------------------------- /src/main/resources/config.yml: -------------------------------------------------------------------------------- 1 | # 2 | # 3 | # ____ _ _ ____ _ 4 | # | _ \ __ _(_) |_ _| _ \ _____ ____ _ _ __ __| | 5 | # | | | |/ _` | | | | | | |_) / _ \ \ /\ / / _` | '__/ _` | 6 | # | |_| | (_| | | | |_| | _ < __/\ V V / (_| | | | (_| | 7 | # |____/ \__,_|_|_|\__, |_| \_\___| \_/\_/ \__,_|_| \__,_| 8 | # |___/ 9 | # by Athelion Development 10 | # 11 | # 12 | # UPGRADE TO THE ULTIMATE EDITION AND UNLOCK UNLIMITED REWARD POSSIBILITIES! 13 | # CREATE CUSTOM REWARDS WITHOUT ANY LIMITATIONS AND ELEVATE YOUR SERVER EXPERIENCE! 14 | # DISCOVER MORE AT: https://www.spigotmc.org/resources/%E2%9C%A8-ultimaterewards-create-a-whole-network-reward-system-with-ease-1-8-1-19-3.108055/ 15 | # 16 | # 17 | # If you have some questions, join https://discord.athelion.eu for help 18 | # 19 | # All about models & colors can be found here: https://ultimaterewards.athelion.eu/colors-and-models 20 | # 21 | # Note that item & sound names are slightly different between >1.12 & 1.13< versions! 22 | # So make sure you are using valid item names (default one are used from 1.13+ versions) 23 | # otherwise will be replaced by stone if invalid name is in use. 24 | # 25 | config: 26 | # 27 | # Database section 28 | # 29 | 30 | # What type of database do you want to use? 31 | # Valid values: SQLITE, MYSQL, MARIADB, POSTGRESQL 32 | backend: SQLITE 33 | mysql-ip: 127.0.0.1 34 | mysql-port: 3306 35 | mysql-database-name: database 36 | mysql-username: user 37 | mysql-password: password 38 | 39 | # MySQL's connection pool settings 40 | mysql-pool-settings-maximum-pool-size: 10 41 | mysql-pool-settings-minimum-idle: 5 42 | mysql-pool-settings-maximum-lifetime: 1800000 43 | mysql-pool-settings-connection-timeout: 5000 44 | 45 | # Additional MySQL properties 46 | mysql-properties: 47 | useUnicode: true 48 | characterEncoding: utf8 49 | 50 | # 51 | # Global settings section 52 | # 53 | 54 | # All available languages can be found in lang folder 55 | # Not that it's case-sensitive 56 | language: English 57 | 58 | update-checker: true 59 | 60 | help-header: "&2&m---------------&f &lAVAILABLE COMMANDS&2 &m---------------" 61 | help-message-format: "&2 • &a%syntax% &7- &f%description%" 62 | help-footer: "&2&m------------------------------------------------" 63 | 64 | menu-size: 45 65 | fill-background-enabled: true 66 | background-item: GRAY_STAINED_GLASS_PANE 67 | open-menu-after-claiming: true 68 | join-notification-sound: BLOCK_NOTE_BLOCK_PLING 69 | join-notification-by-default: true 70 | join-notification-position: 21 71 | join-notification-command: "/dailyrewards:rewards" 72 | auto-claim-rewards-on-join-by-default: false 73 | auto-claim-rewards-position: 23 74 | announce-enabled: true 75 | # In seconds 76 | join-notification-delay: 3 77 | join-auto-claim-delay: 3 78 | unavailable-reward-sound: ENTITY_ENDER_DRAGON_HURT 79 | check-for-full-inventory: true 80 | # How much time (in minutes) a player must have played 81 | # on the server to be able to obtain rewards 82 | # Set to 0 to disable it. 83 | first-time-join-required-play-time: 100 84 | # Players won't be able to claim & open rewards 85 | # also won't receive notification 86 | disabled-worlds: 87 | - "disabledworld1" 88 | - "disabledworld2" 89 | # 90 | # 91 | # Settings menu section 92 | # 93 | # 94 | settings-menu-size: 45 95 | settings-enabled-in-menu: true 96 | settings-position: 40 97 | settings-item: REPEATER 98 | 99 | settings-join-notification-enabled-item: LIME_DYE 100 | settings-join-notification-disabled-item: GRAY_DYE 101 | 102 | settings-auto-claim-enabled-item: LIME_DYE 103 | settings-auto-claim-disabled-item: GRAY_DYE 104 | 105 | settings-back-item: STONE_BUTTON 106 | settings-back-position: 40 107 | # 108 | # 109 | # DAILY REWARD SECTION 110 | # 111 | # 112 | daily-enabled: true 113 | # Make reward available after first join 114 | daily-available-after-first-join: false 115 | daily-placeholder: "daily" 116 | # In hours 117 | daily-cooldown: 24 118 | daily-cooldown-format: "%hours%:%minutes%:%seconds%" 119 | daily-positions: 120 | - 20 121 | daily-sound: ENTITY_PLAYER_LEVELUP 122 | daily-available-item: "CHEST_MINECART" 123 | daily-unavailable-item: "MINECART" 124 | # Following commands will be executed when player claims his 125 | # reward with dailyreward.daily permission 126 | # 127 | # Available actions: 128 | # [console] - entered statement will be executed from console 129 | # [player] - statement performed as player command execution 130 | # [message] - messages the player with specified text 131 | # [actionbar] - shows the text in actionbar for the player 132 | # [title] - sends primary title with entered text 133 | # [subtitle] - sends secondary title with entered text 134 | # [sound] - plays specified sound for the player 135 | # [firework] - launches a firework above the player 136 | # 137 | daily-rewards: 138 | - "[console] give %player% iron_ingot 8" 139 | - "[console] give %player% gold_ingot 2" 140 | - "[actionbar] &aClaimed daily reward!" 141 | # In the other hand, when player has dailyreward.daily.premium 142 | # this commands will be executed (same way for weekly and monthly rewards) 143 | daily-premium-rewards: 144 | - "[console] give %player% iron_ingot 16" 145 | - "[console] give %player% gold_ingot 4" 146 | - "[actionbar] &aClaimed daily reward!" 147 | # 148 | # 149 | # WEEKLY REWARD SECTION 150 | # 151 | # 152 | weekly-enabled: true 153 | # Make reward available after first join 154 | weekly-available-after-first-join: false 155 | weekly-placeholder: "weekly" 156 | # In hours 157 | weekly-cooldown: 168 158 | weekly-cooldown-format: "%days% days %hours% hours %minutes% minutes" 159 | weekly-positions: 160 | - 22 161 | weekly-sound: ENTITY_FIREWORK_ROCKET_LARGE_BLAST 162 | weekly-available-item: "CHEST_MINECART" 163 | weekly-unavailable-item: "MINECART" 164 | weekly-rewards: 165 | - "[console] give %player% diamond 2" 166 | - "[console] give %player% emerald 1" 167 | weekly-premium-rewards: 168 | - "[console] give %player% diamond 4" 169 | - "[console] give %player% emerald 2" 170 | # 171 | # 172 | # MONTHLY REWARD SECTION 173 | # 174 | # 175 | monthly-enabled: true 176 | # Make reward available after first join 177 | monthly-available-after-first-join: false 178 | monthly-placeholder: "monthly" 179 | # In hours 180 | monthly-cooldown: 720 181 | monthly-cooldown-format: "%days% days %hours% hours %minutes% minutes" 182 | monthly-positions: 183 | - 24 184 | monthly-sound: ENTITY_FIREWORK_ROCKET_BLAST 185 | monthly-available-item: "CHEST_MINECART" 186 | monthly-unavailable-item: "MINECART" 187 | monthly-rewards: 188 | - "[console] give %player% diamond 8" 189 | - "[console] give %player% iron_ingot 32" 190 | - "[console] give %player% gold_ingot 16" 191 | monthly-premium-rewards: 192 | - "[console] give %player% diamond 16" 193 | - "[console] give %player% iron_ingot 64" 194 | - "[console] give %player% gold_ingot 32" -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/manager/reward/action/ClaimAction.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.manager.reward.action; 2 | 3 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 4 | import eu.athelion.dailyrewards.api.event.PlayerClaimRewardEvent; 5 | import eu.athelion.dailyrewards.api.event.PlayerPreClaimRewardEvent; 6 | import eu.athelion.dailyrewards.configuration.file.Config; 7 | import eu.athelion.dailyrewards.configuration.file.Lang; 8 | import eu.athelion.dailyrewards.manager.cooldown.Cooldown; 9 | import eu.athelion.dailyrewards.manager.cooldown.CooldownManager; 10 | import eu.athelion.dailyrewards.manager.reward.ActionsExecutor; 11 | import eu.athelion.dailyrewards.manager.reward.Reward; 12 | import eu.athelion.dailyrewards.manager.reward.RewardType; 13 | import eu.athelion.dailyrewards.manager.reward.action.checker.AvailableSlotsInInventoryChecker; 14 | import eu.athelion.dailyrewards.manager.reward.action.checker.Checker; 15 | import eu.athelion.dailyrewards.manager.reward.action.checker.DisabledWorldCheck; 16 | import eu.athelion.dailyrewards.manager.reward.action.checker.EnoughPlayTimeChecker; 17 | import eu.athelion.dailyrewards.manager.reward.action.response.ActionResponse; 18 | import eu.athelion.dailyrewards.manager.reward.action.response.ClaimActionResponse; 19 | import eu.athelion.dailyrewards.user.User; 20 | import eu.athelion.dailyrewards.user.UserHandler; 21 | import eu.athelion.dailyrewards.util.PermissionUtil; 22 | import eu.athelion.dailyrewards.util.PlayerUtil; 23 | import eu.athelion.dailyrewards.util.TextUtil; 24 | import org.bukkit.Bukkit; 25 | import org.bukkit.OfflinePlayer; 26 | import org.bukkit.command.CommandSender; 27 | import org.bukkit.entity.Player; 28 | 29 | import java.util.ArrayList; 30 | import java.util.HashMap; 31 | import java.util.List; 32 | 33 | public class ClaimAction implements RewardAction { 34 | private final CommandSender executor; 35 | private final List checkers; 36 | private boolean announce = true; 37 | private boolean menuShouldOpen = Config.OPEN_MENU_AFTER_CLAIMING.asBoolean(); 38 | 39 | public ClaimAction(CommandSender executor) { 40 | this.executor = executor; 41 | 42 | checkers = new ArrayList() {{ 43 | List disabledWorlds = Config.DISABLED_WORLDS.asReplacedList(); 44 | if (!disabledWorlds.isEmpty()) add(new DisabledWorldCheck(disabledWorlds)); 45 | if (Config.CHECK_FOR_FULL_INVENTORY.asBoolean()) add(new AvailableSlotsInInventoryChecker()); 46 | if (Config.FIRST_TIME_JOIN_REQUIRED_PLAY_TIME.asInt() > 0) add(new EnoughPlayTimeChecker()); 47 | }}; 48 | } 49 | 50 | @Override 51 | public ActionResponse execute(OfflinePlayer offlinePlayer, RewardType type) { 52 | final User user = UserHandler.getUser(offlinePlayer.getUniqueId()); 53 | if (!user.isOnline()) { 54 | return ActionResponse.Type.UNAVAILABLE_PLAYER; 55 | } 56 | 57 | final Player player = offlinePlayer.getPlayer(); 58 | final Reward reward = DailyRewardsPlugin.getRewardManager() 59 | .getRewardByType(type) 60 | .orElse(null); 61 | 62 | if (reward == null) { 63 | player.sendMessage(Lang.REWARD_DISABLED.asColoredString(player)); 64 | return ClaimActionResponse.UNAVAILABLE_REWARD; 65 | } 66 | 67 | final List rewardActions = TextUtil.replaceList(PermissionUtil.hasPremium(player, type) ? reward.getPremiumRewards() : reward.getDefaultRewards(), new HashMap() {{ 68 | put("player", player.getName()); 69 | }}); 70 | 71 | PlayerPreClaimRewardEvent playerPreClaimRewardEvent = new PlayerPreClaimRewardEvent(player, reward.getType(), rewardActions); 72 | Bukkit.getPluginManager().callEvent(playerPreClaimRewardEvent); 73 | 74 | if (playerPreClaimRewardEvent.isCancelled()) { 75 | return ClaimActionResponse.UNKNOWN; 76 | } 77 | 78 | if (!PermissionUtil.hasPermission(player, type.getPermission())) { 79 | //if (!player.hasPermission(type.getPermission())) { 80 | //if (!fromCommand) return; 81 | if (announce) player.sendMessage(Lang.INSUFFICIENT_PERMISSION.asColoredString(player) 82 | .replace("%permission%", type.getPermission())); 83 | return ClaimActionResponse.INSUFFICIENT_PERMISSIONS; 84 | } 85 | 86 | for (Checker checker : getCheckers()) { 87 | if (PermissionUtil.hasPermission(player, checker.getBypassPermission())) { 88 | continue; 89 | } 90 | 91 | if (!checker.check(player)) { 92 | if (announce) player.sendMessage(checker.getFailedCheckMessage()); 93 | return checker.getClaimActionResponse(); 94 | } 95 | } 96 | 97 | Cooldown cooldown = user.getCooldown(reward.getType()); 98 | if (cooldown.isClaimable()) { 99 | 100 | if (rewardActions.isEmpty()) { 101 | player.sendMessage(Lang.REWARDS_ARE_NOT_SET.asColoredString(player)); 102 | } else { 103 | PlayerClaimRewardEvent playerClaimRewardEvent = new PlayerClaimRewardEvent(player, reward.getType()); 104 | Bukkit.getPluginManager().callEvent(playerClaimRewardEvent); 105 | 106 | ActionsExecutor.executeActions( 107 | player, 108 | reward.getName(), 109 | TextUtil.findAndReturnActions(rewardActions) 110 | ); 111 | } 112 | 113 | DailyRewardsPlugin.get().runAsync((() -> CooldownManager.setCooldown(user, reward))); 114 | 115 | if (announce) { 116 | PlayerUtil.playSound(player, reward.getSound()); 117 | 118 | if (Config.ANNOUNCE_ENABLED.asBoolean()) { 119 | Bukkit.broadcastMessage((PermissionUtil.hasPremium(player, type) ? reward.getCollectedPremiumMessage(player) : reward.getCollectedMessage(player)).replace("%player%", player.getName())); 120 | } 121 | } 122 | if (!menuShouldOpen) player.closeInventory(); 123 | 124 | } else { 125 | if (!menuShouldOpen) { 126 | player.sendMessage(Lang.COOLDOWN_MESSAGE.asReplacedString(player, new HashMap() {{ 127 | put("%type%", type.getPlaceholder()); 128 | put("%time%", cooldown.getFormat(reward.getCooldownFormat())); 129 | }})); 130 | } 131 | PlayerUtil.playSound(player, Config.UNAVAILABLE_REWARD_SOUND.asUppercase()); 132 | } 133 | 134 | return ActionResponse.Type.PROCEEDED; 135 | } 136 | 137 | @Override 138 | public boolean menuShouldOpen() { 139 | return menuShouldOpen; 140 | } 141 | 142 | public ClaimAction disableAnnounce() { 143 | this.announce = false; 144 | return this; 145 | } 146 | 147 | public ClaimAction disableMenuOpening() { 148 | this.menuShouldOpen = false; 149 | return this; 150 | } 151 | 152 | @Override 153 | public CommandSender getExecutor() { 154 | return executor; 155 | } 156 | 157 | @Override 158 | public PermissionUtil.Permission getPermission() { 159 | return null; 160 | } 161 | 162 | @Override 163 | public List getCheckers() { 164 | return checkers; 165 | } 166 | } -------------------------------------------------------------------------------- /src/main/java/eu/athelion/dailyrewards/configuration/file/Config.java: -------------------------------------------------------------------------------- 1 | package eu.athelion.dailyrewards.configuration.file; 2 | 3 | import com.cryptomorin.xseries.XMaterial; 4 | import dev.dbassett.skullcreator.SkullCreator; 5 | import dev.lone.itemsadder.api.CustomStack; 6 | import dev.lone.itemsadder.api.ItemsAdder; 7 | import eu.athelion.dailyrewards.DailyRewardsPlugin; 8 | import eu.athelion.dailyrewards.configuration.YamlFile; 9 | import eu.athelion.dailyrewards.hook.HookManager; 10 | import eu.athelion.dailyrewards.util.TextUtil; 11 | import io.th0rgal.oraxen.api.OraxenItems; 12 | import org.bukkit.Material; 13 | import org.bukkit.configuration.ConfigurationSection; 14 | import org.bukkit.configuration.file.YamlConfiguration; 15 | import org.bukkit.inventory.ItemStack; 16 | import org.bukkit.inventory.meta.ItemMeta; 17 | 18 | import java.util.*; 19 | import java.util.stream.Collectors; 20 | 21 | public enum Config { 22 | LANGUAGE, 23 | MENU_SIZE, 24 | SETTINGS_MENU_SIZE, 25 | FILL_BACKGROUND_ENABLED, 26 | BACKGROUND_ITEM, 27 | OPEN_MENU_AFTER_CLAIMING, 28 | HELP_MESSAGE_FORMAT, 29 | HELP_HEADER, 30 | HELP_FOOTER, 31 | JOIN_NOTIFICATION_BY_DEFAULT, 32 | JOIN_NOTIFICATION_COMMAND, 33 | ANNOUNCE_ENABLED, 34 | JOIN_NOTIFICATION_DELAY, 35 | JOIN_AUTO_CLAIM_DELAY, 36 | UNAVAILABLE_REWARD_SOUND, 37 | AUTO_CLAIM_REWARDS_ON_JOIN_BY_DEFAULT, 38 | AUTO_CLAIM_REWARDS_POSITION, 39 | JOIN_NOTIFICATION_POSITION, 40 | JOIN_NOTIFICATION_SOUND, 41 | DISABLED_WORLDS, 42 | FIRST_TIME_JOIN_REQUIRED_PLAY_TIME, 43 | 44 | SETTINGS_ENABLED_IN_MENU, 45 | SETTINGS_POSITION, 46 | SETTINGS_ITEM, 47 | SETTINGS_JOIN_NOTIFICATION_ENABLED_ITEM, 48 | SETTINGS_JOIN_NOTIFICATION_DISABLED_ITEM, 49 | SETTINGS_AUTO_CLAIM_ENABLED_ITEM, 50 | SETTINGS_AUTO_CLAIM_DISABLED_ITEM, 51 | SETTINGS_BACK_ITEM, 52 | SETTINGS_BACK_POSITION, 53 | 54 | BACKEND, 55 | MYSQL_IP, 56 | MYSQL_PORT, 57 | MYSQL_DATABASE_NAME, 58 | MYSQL_USERNAME, 59 | MYSQL_PASSWORD, 60 | UPDATE_CHECKER, 61 | MYSQL_POOL_SETTINGS_MAXIMUM_POOL_SIZE, 62 | MYSQL_POOL_SETTINGS_MINIMUM_IDLE, 63 | MYSQL_POOL_SETTINGS_MAXIMUM_LIFETIME, 64 | MYSQL_POOL_SETTINGS_CONNECTION_TIMEOUT, 65 | 66 | MYSQL_PROPERTIES, 67 | 68 | DAILY_ENABLED, 69 | DAILY_COOLDOWN, 70 | DAILY_COOLDOWN_FORMAT, 71 | DAILY_AVAILABLE_AFTER_FIRST_JOIN, 72 | DAILY_PLACEHOLDER, 73 | DAILY_POSITIONS, 74 | DAILY_SOUND, 75 | DAILY_AVAILABLE_ITEM, 76 | DAILY_UNAVAILABLE_ITEM, 77 | DAILY_REWARDS, 78 | DAILY_PREMIUM_REWARDS, 79 | 80 | WEEKLY_ENABLED, 81 | WEEKLY_COOLDOWN, 82 | WEEKLY_COOLDOWN_FORMAT, 83 | WEEKLY_AVAILABLE_AFTER_FIRST_JOIN, 84 | WEEKLY_PLACEHOLDER, 85 | WEEKLY_AVAILABLE_ITEM, 86 | WEEKLY_UNAVAILABLE_ITEM, 87 | WEEKLY_POSITIONS, 88 | WEEKLY_SOUND, 89 | WEEKLY_REWARDS, 90 | WEEKLY_PREMIUM_REWARDS, 91 | 92 | MONTHLY_ENABLED, 93 | MONTHLY_COOLDOWN, 94 | MONTHLY_COOLDOWN_FORMAT, 95 | MONTHLY_AVAILABLE_AFTER_FIRST_JOIN, 96 | MONTHLY_PLACEHOLDER, 97 | MONTHLY_AVAILABLE_ITEM, 98 | MONTHLY_UNAVAILABLE_ITEM, 99 | MONTHLY_POSITIONS, 100 | MONTHLY_SOUND, 101 | MONTHLY_REWARDS, 102 | MONTHLY_PREMIUM_REWARDS, 103 | CHECK_FOR_FULL_INVENTORY; 104 | 105 | private static final YamlFile configYamlFile = new YamlFile("config.yml", 106 | DailyRewardsPlugin.get().getDataFolder(), YamlFile.UpdateMethod.EVERYTIME); 107 | private static final Map strings = new HashMap<>(); 108 | private static final Map> lists = new HashMap<>(); 109 | private static final Map items = new HashMap<>(); 110 | 111 | private String getName() { 112 | return this.name(); 113 | } 114 | 115 | public static void reload() { 116 | configYamlFile.reload(); 117 | final YamlConfiguration configuration = configYamlFile.getConfiguration(); 118 | 119 | ConfigurationSection configSection = configuration.getConfigurationSection("config"); 120 | 121 | configSection 122 | .getKeys(false) 123 | .forEach(key -> { 124 | String editedKey = key.toUpperCase(Locale.ENGLISH).replace("-", "_"); 125 | if (configSection.isList(key)) { 126 | lists.put(editedKey, configSection.getStringList(key)); 127 | } else 128 | strings.put(editedKey, configSection.getString(key)); 129 | }); 130 | 131 | loadItems(); 132 | 133 | Lang.reload(LANGUAGE); 134 | } 135 | 136 | private static void loadItems() { 137 | Arrays.stream(values()).map(Enum::name).filter(valueName -> valueName.endsWith("ITEM")).forEach(valueItemName -> { 138 | String itemName = strings.get(valueItemName); 139 | if (itemName.length() > 64) { 140 | items.put(valueItemName, SkullCreator.itemFromBase64(itemName)); 141 | } else if (itemName.startsWith("CustomModel")) { 142 | Material material = Material.valueOf(TextUtil.getPlaceholders(itemName, "[").stream().findFirst().get().replace("[", "").replace("]", "").toUpperCase(Locale.ENGLISH)); 143 | int data = Integer.parseInt(TextUtil.getPlaceholders(itemName, "{").stream().findFirst().get().replace("{", "").replace("}", "")); 144 | final ItemStack itemStack = new ItemStack(material); 145 | final ItemMeta meta = itemStack.getItemMeta(); 146 | meta.setCustomModelData(data); 147 | itemStack.setItemMeta(meta); 148 | items.put(valueItemName, itemStack); 149 | } else if (HookManager.getItemsAdderHook().isOn() && ItemsAdder.isCustomItem(itemName)) { 150 | items.put(valueItemName, CustomStack.getInstance(itemName).getItemStack()); 151 | } else if (HookManager.getOraxenHook().isOn() && OraxenItems.exists(itemName)) { 152 | items.put(valueItemName, OraxenItems.getItemById(itemName).build()); 153 | } else { 154 | items.put(valueItemName, XMaterial.matchXMaterial(itemName.toUpperCase(Locale.ENGLISH)).orElse(XMaterial.STONE).parseItem()); 155 | } 156 | }); 157 | } 158 | 159 | public Map asStringMap() { 160 | Map map = new HashMap<>(); 161 | ConfigurationSection section = configYamlFile.getConfiguration().getConfigurationSection(asString()); 162 | if (section == null) return map; 163 | for (String key : section.getKeys(false)) { 164 | String editedKey = key.toUpperCase(Locale.ENGLISH).replace("-", "_"); 165 | map.put(editedKey, section.getString(key)); 166 | } 167 | return map; 168 | } 169 | 170 | public List asReplacedList() { 171 | return lists.get(getName()); 172 | } 173 | 174 | public String asString() { 175 | return strings.get(getName()); 176 | } 177 | 178 | public ItemStack asAnItem() { 179 | return items.get(getName()); 180 | } 181 | 182 | public String asUppercase() { 183 | return this.asString().toUpperCase(); 184 | } 185 | 186 | public boolean asBoolean() { 187 | return Boolean.parseBoolean(asString()); 188 | } 189 | 190 | public long asLong() { 191 | return Long.parseLong(asString()); 192 | } 193 | 194 | public int asInt() { 195 | return Integer.parseInt(asString()); 196 | } 197 | 198 | public List asIntegerList() { 199 | return asReplacedList().stream().map(Integer::parseInt).collect(Collectors.toList()); 200 | } 201 | } 202 | -------------------------------------------------------------------------------- /src/main/resources/lang/Turkish.yml: -------------------------------------------------------------------------------- 1 | # 2 | # 1.16 sürümünden itibaren HEX renklerini de kullanabilirsiniz. 3 | # &f formatı yerine <#ffffff> kullanın 4 | # ve gradyan için: <#ffffff>Gradyanın uygulanacağı metin 5 | # 6 | # Everything about the models and colouring can be found at https://ultimaterewards.athelion.eu/colors-and-models 7 | # 8 | lang: 9 | prefix: "&e[&6&lDailyRewards&e]" 10 | unknown-command: "%prefix% &4Unknown command, use /rw help to list all available commands" 11 | auto-claim-notification: 12 | - " " 13 | - "&a ✔ &f%rewards% ödül(ler) otomatik olarak başarıyla alındı!" 14 | - " " 15 | unclaimed-rewards-notification-hover-text: "&2Ödülleri almak için tıklayın!" 16 | reward-reset: "&e%prefix% &fOyuncunun &e%type%&f ödülünü sıfırladınız: &e%player%" 17 | unavailable-player: "%prefix% &cOyuncu mevcut değil!" 18 | unavailable-setting: "%prefix% &cBu ayar mevcut değil!" 19 | reward-disabled: "%prefix% &cÖdül alınamıyor!" 20 | insufficient-permission: "%prefix% &cBu işlem için %permission% almanız gerekiyor!" 21 | rewards-are-not-set: "%prefix% &cÖdüller ayarlanmadı!" 22 | reload-msg: "&e%prefix% &fEklenti başarıyla yeniden yüklendi" 23 | incomplete-reward-reset: "%prefix% &cTam olarak neyi sıfırlamak istediğinizi belirtin (günlük/haftalık/aylık/tümü)" 24 | full-inventory-message: "%prefix% &cÖdülü alamazsınız, envanteriniz dolu!" 25 | claiming-in-disabled-world: "%prefix% &c%world% dünyasında ödül alamazsınız" 26 | not-enough-required-time-to-claim: "%prefix% &cÖdülleri alabilmek için sunucuda en az %requiredMinutes% dakika geçirmeniz gerekiyor (kalan süre: %minutes% dakika)" 27 | command-usage: "%prefix% &cGeçerli kullanım: %usage%" 28 | available: "&a&lMevcut" 29 | loading: "&bYükleniyor..." 30 | back: "&cGeri" 31 | click-to-perform: "&7Click to perform %command% command" 32 | claim-command-description: "Redeems stated reward" 33 | reset-command-description: "Resets specified reward" 34 | settings-command-description: "Opens settings menu" 35 | toggle-command-description: "Toggles certain setting" 36 | reload-command-description: "Reloads plugin's configuration" 37 | import-command-description: "Imports all local data to database" 38 | help-command-description: "Shows all available commands" 39 | # 40 | # Ayarlar 41 | # 42 | settings-title: "Ayarlar" 43 | settings-display-name: "&eAyarlar" 44 | setting-enabled: "%prefix% &a%setting% etkinleştirildi!" 45 | setting-disabled: "%prefix% &c%setting% devre dışı bırakıldı!" 46 | auto-claim-failed: "%prefix% &cBazı ödüller otomatik olarak alınamadı, detaylar için üzerine gelin." 47 | auto-claim-failed-hover-text-list-format: "%reward% - %reason%" 48 | auto-claim-failed-hover-text: "&cAşağıdaki ödüller otomatik olarak alınamadı: %format%" 49 | join-auto-claim-notification: 50 | - " " 51 | - "&a ✔ Aşağıdaki ödüller otomatik olarak alındı: &f%listOfRewards%" 52 | - " " 53 | join-notification-setting-name: "Giriş Bildirimi" 54 | join-auto-claim-setting-name: "Girişte Otomatik Alma" 55 | no-permission-setting-display-name: "&c&l%settingType%" 56 | no-permission-setting-lore: 57 | - "&cBu ayarı değiştirmeniz mümkün değil!" 58 | - "&cEksik izin: %permission%" 59 | join-notification-display-name: "&aGiriş Bildirimi" 60 | join-notification-enabled-lore: 61 | - "&7Eğer toplanmamış ödülleriniz varsa" 62 | - "&7giriş yaptığınızda sizi bilgilendirir" 63 | - " " 64 | - "&c► Devre dışı bırakmak için tıklayın" 65 | join-notification-disabled-lore: 66 | - "&7Eğer toplanmamış ödülleriniz varsa" 67 | - "&7giriş yaptığınızda sizi bilgilendirir" 68 | - " " 69 | - "&a► Etkinleştirmek için tıklayın" 70 | auto-claim-display-name: "&aGirişte Otomatik Alma" 71 | auto-claim-enabled-lore: 72 | - "&7Girişte tüm mevcut ödülleri" 73 | - "&7otomatik olarak alır" 74 | - " " 75 | - "&c► Devre dışı bırakmak için tıklayın" 76 | auto-claim-disabled-lore: 77 | - "&7Girişte tüm mevcut ödülleri" 78 | - "&7otomatik olarak alır" 79 | - " " 80 | - "&a► Etkinleştirmek için tıklayın" 81 | 82 | located-in-restricted-world: "Ödül, mevcut dünyada kullanılamıyor" 83 | insufficient-play-time: "Ödül almak için yeterli oyun süresi yok" 84 | insufficient-permissions: "Yetersiz izinler" 85 | not-enough-free-inventory-slots: "Yeterli boş envanter yuvası yok" 86 | unavailable-reward: "Ödül mevcut değil" 87 | # 88 | # Ödüller menüsü 89 | # 90 | menu-title: "Ödüller" 91 | join-hover-message: "&7Ödüllerinizi almak için tıklayın" 92 | join-notification: 93 | - ' ' 94 | - '&2 Merhaba %player%, &a%rewards% ödül seni bekliyor! &f(Buraya tıklayın)' 95 | - ' ' 96 | cooldown-message: "%prefix% &c&l%type% &cödülü almak için beklemeniz gerekiyor &n%time%" 97 | daily-name: "Günlük Ödül" 98 | daily-title: "&a&lÖdüller" 99 | daily-subtitle: "&7Günlük ödülünüzü aldınız" 100 | daily-collected: "&a%player% &7günlük ödülünü aldı!" 101 | daily-premium-collected: "&a%player% &7günlük premium ödülünü aldı!" 102 | daily-displayname-available: "&a&lGÜNLÜK ÖDÜL" 103 | daily-premium-displayname-available: "&e&lGÜNLÜK ÖDÜL" 104 | daily-available-lore: 105 | - "&7Ödül içeriği:" 106 | - "&a 8x &fIron Ingot" 107 | - " " 108 | - "&c❌ Premium ödül mevcut değil" 109 | daily-available-premium-lore: 110 | - "&7Ödül içeriği:" 111 | - "&a 16x &fIron Ingot" 112 | - "&a 3x &fGold Ingot" 113 | - " " 114 | - "&e✔ Premium ödül mevcut" 115 | daily-displayname-unavailable: "&c&lGÜNLÜK ÖDÜL" 116 | daily-premium-displayname-unavailable: "&4&lGÜNLÜK ÖDÜL" 117 | daily-unavailable-lore: 118 | - " " 119 | - "&cMevcut: %cooldown% sonra" 120 | daily-unavailable-premium-lore: 121 | - " " 122 | - "&cMevcut: %cooldown% sonra" 123 | weekly-name: "Haftalık Ödül" 124 | weekly-title: "&e&lÖdüller" 125 | weekly-subtitle: "&7Haftalık ödülünüzü aldınız" 126 | weekly-collected: "&e%player% &7haftalık ödülünü aldı!" 127 | weekly-premium-collected: "&e%player% &7haftalık premium ödülünü aldı!" 128 | weekly-displayname-available: "&a&lHAFTALIK ÖDÜL" 129 | weekly-premium-displayname-available: "&e&lHAFTALIK ÖDÜL" 130 | weekly-available-lore: 131 | - "&7Ödül içeriği:" 132 | - "&a 1x &fDiamond" 133 | - " " 134 | - "&c❌ Premium ödül mevcut değil" 135 | weekly-available-premium-lore: 136 | - "&7Ödül içeriği:" 137 | - "&a 5x &fDiamond" 138 | - "&a 3x &fEmerald" 139 | - " " 140 | - "&e✔ Premium ödül mevcut" 141 | weekly-displayname-unavailable: "&c&lHAFTALIK ÖDÜL" 142 | weekly-premium-displayname-unavailable: "&4&lHAFTALIK ÖDÜL" 143 | weekly-unavailable-lore: 144 | - " " 145 | - "&cMevcut: %cooldown% sonra" 146 | weekly-unavailable-premium-lore: 147 | - " " 148 | - "&cMevcut: %cooldown% sonra" 149 | monthly-name: "Aylık Ödül" 150 | monthly-title: "&9&lÖdüller" 151 | monthly-subtitle: "&7Aylık ödülünüzü aldınız" 152 | monthly-collected: "&9%player% &7aylık ödülünü aldı!" 153 | monthly-premium-collected: "&9%player% &7aylık premium ödülünü aldı!" 154 | monthly-displayname-available: "&a&lAYLIK ÖDÜL" 155 | monthly-premium-displayname-available: "&e&lAYLIK ÖDÜL" 156 | monthly-available-lore: 157 | - "&7Ödül içeriği:" 158 | - "&a 8x &fDiamond" 159 | - "&a 32x &fIron Ingot" 160 | - "&a 16x &fGold Ingot" 161 | - " " 162 | - "&c❌ Premium ödül mevcut değil" 163 | monthly-available-premium-lore: 164 | - "&7Ödül içeriği:" 165 | - "&a 1x &fNether Star" 166 | - "&a 16x &fDiamond" 167 | - "&a 64x &fIron Ingot" 168 | - "&a 32x &fGold Ingot" 169 | - " " 170 | - "&e✔ Premium ödül aktif" 171 | monthly-displayname-unavailable: "&c&lAYLIK ÖDÜL" 172 | monthly-premium-displayname-unavailable: "&4&lAYLIK ÖDÜL" 173 | monthly-unavailable-lore: 174 | - " " 175 | - "&cMevcut: %cooldown% sonra" 176 | monthly-unavailable-premium-lore: 177 | - " " 178 | - "&cMevcut: %cooldown% sonra" -------------------------------------------------------------------------------- /src/main/resources/lang/Czech.yml: -------------------------------------------------------------------------------- 1 | # 2 | # Od verze 1.16 můžete také používat HEX barvy. 3 | # Namísto formátu &f použijte <#ffffff> 4 | # a pro gradient: <#ffffff>Text, kde bude použit gradient 5 | # 6 | # Návod pro custom modely a barvy najdete na https://ultimaterewards.athelion.eu/colors-and-models 7 | # 8 | lang: 9 | prefix: "&e[&6&lDailyRewards&e]" 10 | unknown-command: "%prefix% &4Unknown command, use /rw help to list all available commands" 11 | auto-claim-notification: 12 | - " " 13 | - "&a ✔ &f%rewards% odměn bylo úspěšně automaticky vybráno!" 14 | - " " 15 | unclaimed-rewards-notification-hover-text: "&2Klikněte pro získání odměn!" 16 | reward-reset: "&e%prefix% &fOdměna typu %type% byla resetována pro hráče %player%" 17 | unavailable-player: "%prefix% &cHráč není dostupný!" 18 | unavailable-setting: "%prefix% &cToto nastavení neexistuje!" 19 | reward-disabled: "%prefix% &cOdměnu nelze získat!" 20 | insufficient-permission: "%prefix% &cK této akci je zapotřebí %permission% permise!" 21 | rewards-are-not-set: "%prefix% &cOdměny nejsou nastaveny!" 22 | reload-msg: "&e%prefix% &fPlugin byl úspěšně znovu načten" 23 | incomplete-reward-reset: "%prefix% &cUveďte, co přesně chcete resetovat (denní/týdenní/měsíční/vše)" 24 | full-inventory-message: "%prefix% &cNemůžete získat odměnu, váš inventář je plný!" 25 | claiming-in-disabled-world: "%prefix% &cNemůžete získat odměny ve světě %world%" 26 | not-enough-required-time-to-claim: "%prefix% &cMusíte strávit alespoň %requiredMinutes% minut na serveru, než budete moci získat odměny (zbývá %minutes% minut)" 27 | command-usage: "%prefix% &cSprávné použití: %usage%" 28 | available: "&a&lDostupná" 29 | loading: "&bNačítání..." 30 | back: "&cZpět" 31 | click-to-perform: "&7Click to perform %command% command" 32 | claim-command-description: "Redeems stated reward" 33 | reset-command-description: "Resets specified reward" 34 | settings-command-description: "Opens settings menu" 35 | toggle-command-description: "Toggles certain setting" 36 | reload-command-description: "Reloads plugin's configuration" 37 | import-command-description: "Imports all local data to database" 38 | help-command-description: "Shows all available commands" 39 | # 40 | # Nastavení 41 | # 42 | settings-title: "Nastavení" 43 | settings-display-name: "&eNastavení" 44 | setting-enabled: "%prefix% &aPovolili jste %setting%!" 45 | setting-disabled: "%prefix% &cZakázali jste %setting%!" 46 | auto-claim-failed: "%prefix% &cNěkteré odměny nebylo možné automaticky vybrat, podržte pro detaily." 47 | auto-claim-failed-hover-text-list-format: "%reward% - %reason%" 48 | auto-claim-failed-hover-text: "&cNásledující odměny nelze automaticky vybrat: %format%" 49 | join-auto-claim-notification: 50 | - " " 51 | - "&a ✔ Následující odměny byly automaticky vybrány: &f%listOfRewards%" 52 | - " " 53 | join-notification-setting-name: "Upozornění při připojení" 54 | join-auto-claim-setting-name: "Automatické získání při připojení" 55 | no-permission-setting-display-name: "&c&l%settingType%" 56 | no-permission-setting-lore: 57 | - "&cToto nastavení nelze přepnout!" 58 | - "&cChybí oprávnění: %permission%" 59 | join-notification-display-name: "&aUpozornění při připojení" 60 | join-notification-enabled-lore: 61 | - "&7Upozorní vás při připojení" 62 | - "&7pokud máte nevybrané odměny" 63 | - " " 64 | - "&c► Klikněte pro deaktivaci" 65 | join-notification-disabled-lore: 66 | - "&7Upozorní vás při připojení" 67 | - "&7pokud máte nevybrané odměny" 68 | - " " 69 | - "&a► Klikněte pro aktivaci" 70 | auto-claim-display-name: "&aAutomatické získání při připojení" 71 | auto-claim-enabled-lore: 72 | - "&7Automaticky získá" 73 | - "&7všechny dostupné odměny při připojení" 74 | - " " 75 | - "&c► Klikněte pro deaktivaci" 76 | auto-claim-disabled-lore: 77 | - "&7Automaticky získá" 78 | - "&7všechny dostupné odměny při připojení" 79 | - " " 80 | - "&a► Klikněte pro aktivaci" 81 | 82 | located-in-restricted-world: "Odměna není dostupná v aktuálním světě" 83 | insufficient-play-time: "Nedostatečný čas na hraní pro získání" 84 | insufficient-permissions: "Nedostatečná oprávnění" 85 | not-enough-free-inventory-slots: "Nedostatek volných míst v inventáři" 86 | unavailable-reward: "Odměna není dostupná" 87 | # 88 | # Menu odměn 89 | # 90 | menu-title: "Odměny" 91 | join-hover-message: "&7Klikněte pro vyzvednutí svých odměn" 92 | join-notification: 93 | - ' ' 94 | - '&2 Ahoj %player%, &a%rewards% odměn na tebe čeká! &f(Klikni sem)' 95 | - ' ' 96 | cooldown-message: "%prefix% &cPro &l%type% &codměnu musíte počkat &n%time%" 97 | daily-name: "Denní odměna" 98 | daily-title: "&a&lOdměny" 99 | daily-subtitle: "&7Získali jste svou &adenní&7 odměnu" 100 | daily-collected: "&a%player% &7získal svou &a&ldenní odměnu!" 101 | daily-premium-collected: "&a%player% &7získal svou &a&lprémiovou denní odměnu!" 102 | daily-displayname-available: "&a&lDENNÍ ODMĚNA" 103 | daily-premium-displayname-available: "&e&lDENNÍ ODMĚNA" 104 | daily-available-lore: 105 | - "&7Odměna obsahuje:" 106 | - "&a 8x &fIron Ingot" 107 | - " " 108 | - "&c❌ Prémiová odměna není dostupná" 109 | daily-available-premium-lore: 110 | - "&7Odměna obsahuje:" 111 | - "&a 16x &fIron Ingot" 112 | - "&a 3x &fGold Ingot" 113 | - " " 114 | - "&e✔ Prémiová odměna dostupná" 115 | daily-displayname-unavailable: "&c&lDENNÍ ODMĚNA" 116 | daily-premium-displayname-unavailable: "&4&lDENNÍ ODMĚNA" 117 | daily-unavailable-lore: 118 | - " " 119 | - "&cDostupná za: %cooldown%" 120 | daily-unavailable-premium-lore: 121 | - " " 122 | - "&cDostupná za: %cooldown%" 123 | weekly-name: "Týdenní odměna" 124 | weekly-title: "&e&lOdměny" 125 | weekly-subtitle: "&7Získali jste svou &etýdenní &7odměnu" 126 | weekly-collected: "&e%player% &7získal svou &e<ýdenní odměnu!" 127 | weekly-premium-collected: "&e%player% &7získal svou &e&lprémiovou týdenní odměnu!" 128 | weekly-displayname-available: "&a&lTÝDENNÍ ODMĚNA" 129 | weekly-premium-displayname-available: "&e&lTÝDENNÍ ODMĚNA" 130 | weekly-available-lore: 131 | - "&7Odměna obsahuje:" 132 | - "&a 1x &fDiamand" 133 | - " " 134 | - "&c❌ Prémiová odměna není dostupná" 135 | weekly-available-premium-lore: 136 | - "&7Odměna obsahuje:" 137 | - "&a 5x &fDiamond" 138 | - "&a 3x &fEmerald" 139 | - " " 140 | - "&e✔ Prémiová odměna dostupná" 141 | weekly-displayname-unavailable: "&c&lTÝDENNÍ ODMĚNA" 142 | weekly-premium-displayname-unavailable: "&4&lTÝDENNÍ ODMĚNA" 143 | weekly-unavailable-lore: 144 | - " " 145 | - "&cDostupná za: %cooldown%" 146 | weekly-unavailable-premium-lore: 147 | - " " 148 | - "&cDostupná za: %cooldown%" 149 | monthly-name: "Měsíční odměna" 150 | monthly-title: "&9&lOdměny" 151 | monthly-subtitle: "&7Získali jste svou &9měsíční &7odměnu" 152 | monthly-collected: "&9%player% &7získal &9&lměsíční odměnu!" 153 | monthly-premium-collected: "&9%player% &7získal svou &9&lprémiovou měsíční odměnu!" 154 | monthly-displayname-available: "&a&lMĚSÍČNÍ ODMĚNA" 155 | monthly-premium-displayname-available: "&e&lMĚSÍČNÍ ODMĚNA" 156 | monthly-available-lore: 157 | - "&7Odměna obsahuje:" 158 | - "&a 8x &fDiamond" 159 | - "&a 32x &fIron Ingot" 160 | - "&a 16x &fGold Ingot" 161 | - " " 162 | - "&c❌ Prémiová odměna není dostupná" 163 | monthly-available-premium-lore: 164 | - "&7Odměna obsahuje:" 165 | - "&a 1x &fNether Star" 166 | - "&a 16x &fDiamond" 167 | - "&a 64x &fIron Ingot" 168 | - "&a 32x &fGold Ingot" 169 | - " " 170 | - "&e✔ Prémiová odměna aktivována" 171 | monthly-displayname-unavailable: "&c&lMĚSÍČNÍ ODMĚNA" 172 | monthly-premium-displayname-unavailable: "&4&lMĚSÍČNÍ ODMĚNA" 173 | monthly-unavailable-lore: 174 | - " " 175 | - "&cDostupná za: %cooldown%" 176 | monthly-unavailable-premium-lore: 177 | - " " 178 | - "&cDostupná za: %cooldown%" -------------------------------------------------------------------------------- /src/main/resources/lang/Russian.yml: -------------------------------------------------------------------------------- 1 | # 2 | # Начиная с версии 1.16, вы также можете использовать HEX цвета. 3 | # Вместо формата &f используйте <#ffffff> 4 | # и для градиента: <#ffffff>Текст, к которому будет применен градиент 5 | # 6 | # Everything about the models and colouring can be found at https://ultimaterewards.athelion.eu/colors-and-models 7 | # 8 | lang: 9 | prefix: "&e[&6&lDailyRewards&e]" 10 | unknown-command: "%prefix% &4Unknown command, use /rw help to list all available commands" 11 | auto-claim-notification: 12 | - " " 13 | - "&a ✔ &f%rewards% награда(ы) была успешно получена автоматически!" 14 | - " " 15 | unclaimed-rewards-notification-hover-text: "&2Нажмите, чтобы получить награды!" 16 | reward-reset: "&e%prefix% &fВы сбросили &e%type%&f награду игрока &e%player%" 17 | unavailable-player: "%prefix% &cИгрок недоступен!" 18 | unavailable-setting: "%prefix% &cЭта настройка не существует!" 19 | reward-disabled: "%prefix% &cНаграда не может быть получена!" 20 | insufficient-permission: "%prefix% &cВам нужно %permission% на это действие!" 21 | rewards-are-not-set: "%prefix% &cНаграды не установлены!" 22 | reload-msg: "&e%prefix% &fПлагин был успешно перезагружен" 23 | incomplete-reward-reset: "%prefix% &cУкажите, что именно вы хотите сбросить (daily/weekly/monthly/all)" 24 | full-inventory-message: "%prefix% &cВы не можете получить награду, ваш инвентарь полон!" 25 | claiming-in-disabled-world: "%prefix% &cВы не можете получить награды в мире %world%" 26 | not-enough-required-time-to-claim: "%prefix% &cВы должны провести на сервере как минимум %requiredMinutes% минут, чтобы получить награды (осталось %minutes% минут)" 27 | command-usage: "%prefix% &cПравильное использование: %usage%" 28 | available: "&a&lДоступно" 29 | loading: "&bЗагрузка..." 30 | back: "&cНазад" 31 | click-to-perform: "&7Click to perform %command% command" 32 | claim-command-description: "Redeems stated reward" 33 | reset-command-description: "Resets specified reward" 34 | settings-command-description: "Opens settings menu" 35 | toggle-command-description: "Toggles certain setting" 36 | reload-command-description: "Reloads plugin's configuration" 37 | import-command-description: "Imports all local data to database" 38 | help-command-description: "Shows all available commands" 39 | # 40 | # Настройки 41 | # 42 | settings-title: "Настройки" 43 | settings-display-name: "&eНастройки" 44 | setting-enabled: "%prefix% &aВы включили %setting%!" 45 | setting-disabled: "%prefix% &cВы отключили %setting%!" 46 | auto-claim-failed: "%prefix% &cНекоторые награды не могут быть автоматически получены, наведите указатель мыши для подробностей." 47 | auto-claim-failed-hover-text-list-format: "%reward% - %reason%" 48 | auto-claim-failed-hover-text: "&cСледующие награды не могут быть автоматически получены: %format%" 49 | join-auto-claim-notification: 50 | - " " 51 | - "&a ✔ Следующие награды были автоматически получены: &f%listOfRewards%" 52 | - " " 53 | join-notification-setting-name: "Уведомление при входе" 54 | join-auto-claim-setting-name: "Автоматическое получение при входе" 55 | no-permission-setting-display-name: "&c&l%settingType%" 56 | no-permission-setting-lore: 57 | - "&cВы не можете изменить эту настройку!" 58 | - "&cОтсутствует разрешение: %permission%" 59 | join-notification-display-name: "&aУведомление при входе" 60 | join-notification-enabled-lore: 61 | - "&7Уведомляет вас при входе" 62 | - "&7если у вас есть не полученные награды" 63 | - " " 64 | - "&c► Нажмите, чтобы отключить" 65 | join-notification-disabled-lore: 66 | - "&7Уведомляет вас при входе" 67 | - "&7если у вас есть не полученные награды" 68 | - " " 69 | - "&a► Нажмите, чтобы включить" 70 | auto-claim-display-name: "&aАвтоматическое получение при входе" 71 | auto-claim-enabled-lore: 72 | - "&7Автоматически получает" 73 | - "&7все доступные награды при входе" 74 | - " " 75 | - "&c► Нажмите, чтобы отключить" 76 | auto-claim-disabled-lore: 77 | - "&7Автоматически получает" 78 | - "&7все доступные награды при входе" 79 | - " " 80 | - "&a► Нажмите, чтобы включить" 81 | 82 | located-in-restricted-world: "Награда недоступна в этом мире" 83 | insufficient-play-time: "Недостаточно времени для получения" 84 | insufficient-permissions: "Недостаточно прав" 85 | not-enough-free-inventory-slots: "Недостаточно свободных мест в инвентаре" 86 | unavailable-reward: "Награда недоступна" 87 | # 88 | # Меню наград 89 | # 90 | menu-title: "Награды" 91 | join-hover-message: "&7Нажмите, чтобы получить свои награды" 92 | join-notification: 93 | - ' ' 94 | - '&2 Привет, %player%, &a%rewards% награда(ы) ждут вас! &f(Нажмите здесь)' 95 | - ' ' 96 | cooldown-message: "%prefix% &cДля получения &l%type% &cнаграды нужно подождать &n%time%" 97 | daily-name: "Ежедневная награда" 98 | daily-title: "&a&lНаграды" 99 | daily-subtitle: "&7Вы получили свою &aежедневную&7 награду" 100 | daily-collected: "&a%player% &7получил свою &a&lежедневную награду!" 101 | daily-premium-collected: "&a%player% &7получил свою &a&lпремиальную ежедневную награду!" 102 | daily-displayname-available: "&a&lЕЖЕДНЕВНАЯ НАГРАДА" 103 | daily-premium-displayname-available: "&e&lЕЖЕДНЕВНАЯ НАГРАДА" 104 | daily-available-lore: 105 | - "&7Награда содержит:" 106 | - "&a 8x &fIron Ingot" 107 | - " " 108 | - "&c❌ Премиальная награда недоступна" 109 | daily-available-premium-lore: 110 | - "&7Награда содержит:" 111 | - "&a 16x &fIron Ingot" 112 | - "&a 3x &fGold Ingot" 113 | - " " 114 | - "&e✔ Премиальная награда доступна" 115 | daily-displayname-unavailable: "&c&lЕЖЕДНЕВНАЯ НАГРАДА" 116 | daily-premium-displayname-unavailable: "&4&lЕЖЕДНЕВНАЯ НАГРАДА" 117 | daily-unavailable-lore: 118 | - " " 119 | - "&cДоступно через: %cooldown%" 120 | daily-unavailable-premium-lore: 121 | - " " 122 | - "&cДоступно через: %cooldown%" 123 | weekly-name: "Еженедельная награда" 124 | weekly-title: "&e&lНаграды" 125 | weekly-subtitle: "&7Вы получили свою &eеженедельную&7 награду" 126 | weekly-collected: "&e%player% &7получил свою &e&lеженедельную награду!" 127 | weekly-premium-collected: "&e%player% &7получил свою &e&lпремиальную еженедельную награду!" 128 | weekly-displayname-available: "&a&lЕЖЕНЕДЕЛЬНАЯ НАГРАДА" 129 | weekly-premium-displayname-available: "&e&lЕЖЕНЕДЕЛЬНАЯ НАГРАДА" 130 | weekly-available-lore: 131 | - "&7Награда содержит:" 132 | - "&a 1x &fDiamond" 133 | - " " 134 | - "&c❌ Премиальная награда недоступна" 135 | weekly-available-premium-lore: 136 | - "&7Награда содержит:" 137 | - "&a 5x &fDiamond" 138 | - "&a 3x &fEmerald" 139 | - " " 140 | - "&e✔ Премиальная награда доступна" 141 | weekly-displayname-unavailable: "&c&lЕЖЕНЕДЕЛЬНАЯ НАГРАДА" 142 | weekly-premium-displayname-unavailable: "&4&lЕЖЕНЕДЕЛЬНАЯ НАГРАДА" 143 | weekly-unavailable-lore: 144 | - " " 145 | - "&cДоступно через: %cooldown%" 146 | weekly-unavailable-premium-lore: 147 | - " " 148 | - "&cДоступно через: %cooldown%" 149 | monthly-name: "Ежемесячная награда" 150 | monthly-title: "&9&lНаграды" 151 | monthly-subtitle: "&7Вы получили свою &9ежемесячную&7 награду" 152 | monthly-collected: "&9%player% &7получил свою &9&lежемесячную награду!" 153 | monthly-premium-collected: "&9%player% &7получил свою &9&lпремиальную ежемесячную награду!" 154 | monthly-displayname-available: "&a&lЕЖЕМЕСЯЧНАЯ НАГРАДА" 155 | monthly-premium-displayname-available: "&e&lЕЖЕМЕСЯЧНАЯ НАГРАДА" 156 | monthly-available-lore: 157 | - "&7Награда содержит:" 158 | - "&a 8x &fDiamond" 159 | - "&a 32x &fIron Ingot" 160 | - "&a 16x &fGold Ingot" 161 | - " " 162 | - "&c❌ Премиальная награда недоступна" 163 | monthly-available-premium-lore: 164 | - "&7Награда содержит:" 165 | - "&a 1x &fNether Star" 166 | - "&a 16x &fDiamond" 167 | - "&a 64x &fIron Ingot" 168 | - "&a 32x &fGold Ingot" 169 | - " " 170 | - "&e✔ Премиальная награда активирована" 171 | monthly-displayname-unavailable: "&c&lЕЖЕМЕСЯЧНАЯ НАГРАДА" 172 | monthly-premium-displayname-unavailable: "&4&lЕЖЕМЕСЯЧНАЯ НАГРАДА" 173 | monthly-unavailable-lore: 174 | - " " 175 | - "&cДоступно через: %cooldown%" 176 | monthly-unavailable-premium-lore: 177 | - " " 178 | - "&cДоступно через: %cooldown%" -------------------------------------------------------------------------------- /src/main/resources/lang/Ukrainian.yml: -------------------------------------------------------------------------------- 1 | # 2 | # Починаючи з версії 1.16, ви також можете використовувати HEX кольори. 3 | # Замість формату &f використовуйте <#ffffff> 4 | # Для градієнта: <#ffffff>Текст, до якого буде застосовано градієнт 5 | # 6 | # Все про моделі та кольори можна знайти на https://ultimaterewards.athelion.eu/colors-and-models 7 | # 8 | lang: 9 | prefix: '&e[&6&lDailyRewards&e]' 10 | unknown-command: '%prefix% &4Невідома команда, використовуйте /rw help для списку 11 | всіх доступних команд' 12 | auto-claim-notification: 13 | - ' ' 14 | - '&a ✔ &f%rewards% нагорода(и) була успішно отримана автоматично!' 15 | - ' ' 16 | unclaimed-rewards-notification-hover-text: '&2Натисніть, щоб отримати нагороди!' 17 | reward-reset: '&e%prefix% &fВи скинули &e%type%&f нагороду гравця &e%player%' 18 | unavailable-player: '%prefix% &cГравець недоступний!' 19 | unavailable-setting: '%prefix% &cЦього налаштування не існує!' 20 | reward-disabled: '%prefix% &cНагорода не може бути отримана!' 21 | insufficient-permission: '%prefix% &cВам потрібен %permission% для цієї дії!' 22 | rewards-are-not-set: '%prefix% &cНагороди не встановлені!' 23 | reload-msg: '&e%prefix% &fПлагін було успішно перезавантажено' 24 | incomplete-reward-reset: '%prefix% &cВкажіть, що саме ви хочете скинути (daily/weekly/monthly/all)' 25 | full-inventory-message: '%prefix% &cВи не можете отримати нагороду, ваш інвентар 26 | заповнений!' 27 | claiming-in-disabled-world: '%prefix% &cВи не можете отримати нагороди у світі %world%' 28 | not-enough-required-time-to-claim: '%prefix% &cВи повинні провести на сервері щонайменше 29 | %requiredMinutes% хвилин, щоб отримати нагороди (залишилось %minutes% хвилин)' 30 | command-usage: '%prefix% &cПравильне використання: %usage%' 31 | available: '&a&lДоступно' 32 | loading: '&bЗавантаження...' 33 | back: '&cНазад' 34 | click-to-perform: '&7Натисніть, щоб виконати команду %command%' 35 | claim-command-description: Отримує зазначену нагороду 36 | reset-command-description: Скидає зазначену нагороду 37 | settings-command-description: Відкриває меню налаштувань 38 | toggle-command-description: Перемикає певне налаштування 39 | reload-command-description: Перезавантажує конфігурацію плагіна 40 | import-command-description: Імпортує всі локальні дані до бази даних 41 | help-command-description: Показує всі доступні команди 42 | # 43 | # Налаштування 44 | # 45 | settings-title: Налаштування 46 | settings-display-name: '&eНалаштування' 47 | setting-enabled: '%prefix% &aВи увімкнули %setting%!' 48 | setting-disabled: '%prefix% &cВи вимкнули %setting%!' 49 | auto-claim-failed: '%prefix% &cДеякі нагороди не можуть бути отримані автоматично, 50 | наведіть вказівник миші для деталей.' 51 | auto-claim-failed-hover-text-list-format: '%reward% - %reason%' 52 | auto-claim-failed-hover-text: '&cНаступні нагороди не можуть бути отримані автоматично: 53 | %format%' 54 | join-auto-claim-notification: 55 | - ' ' 56 | - '&a ✔ Наступні нагороди були автоматично отримані: &f%listOfRewards%' 57 | - ' ' 58 | join-notification-setting-name: Повідомлення при вході 59 | join-auto-claim-setting-name: Автоматичне отримання при вході 60 | no-permission-setting-display-name: '&c&l%settingType%' 61 | no-permission-setting-lore: 62 | - '&cВи не можете змінити це налаштування!' 63 | - '&cВідсутній дозвіл: %permission%' 64 | join-notification-display-name: '&aПовідомлення при вході' 65 | join-notification-enabled-lore: 66 | - '&7Сповіщає вас при вході' 67 | - '&7якщо у вас є неотримані нагороди' 68 | - ' ' 69 | - '&c► Натисніть, щоб вимкнути' 70 | join-notification-disabled-lore: 71 | - '&7Сповіщає вас при вході' 72 | - '&7якщо у вас є неотримані нагороди' 73 | - ' ' 74 | - '&a► Натисніть, щоб увімкнути' 75 | auto-claim-display-name: '&aАвтоматичне отримання при вході' 76 | auto-claim-enabled-lore: 77 | - '&7Автоматично отримує' 78 | - '&7всі доступні нагороди при вході' 79 | - ' ' 80 | - '&c► Натисніть, щоб вимкнути' 81 | auto-claim-disabled-lore: 82 | - '&7Автоматично отримує' 83 | - '&7всі доступні нагороди при вході' 84 | - ' ' 85 | - '&a► Натисніть, щоб увімкнути' 86 | 87 | located-in-restricted-world: Нагорода недоступна в цьому світі 88 | insufficient-play-time: Недостатньо часу для отримання 89 | insufficient-permissions: Недостатньо прав 90 | not-enough-free-inventory-slots: Недостатньо вільних місць в інвентарі 91 | unavailable-reward: Нагорода недоступна 92 | # 93 | # Меню нагород 94 | # 95 | menu-title: Нагороди 96 | join-hover-message: '&7Натисніть, щоб отримати свої нагороди' 97 | join-notification: 98 | - ' ' 99 | - '&2 Привіт, %player%, &a%rewards% нагорода(и) чекають на вас! &f(Натисніть тут)' 100 | - ' ' 101 | cooldown-message: '%prefix% &cЩоб отримати &l%type% &cнагороду, потрібно зачекати 102 | &n%time%' 103 | daily-name: Щоденна нагорода 104 | daily-title: '&a&lНагороди' 105 | daily-subtitle: '&7Ви отримали свою &aщоденну&7 нагороду' 106 | daily-collected: '&a%player% &7отримав свою &a&lщоденну нагороду!' 107 | daily-premium-collected: '&a%player% &7отримав свою &a&lпреміальну щоденну нагороду!' 108 | daily-displayname-available: '&a&lЩОДЕННА НАГОРОДА' 109 | daily-premium-displayname-available: '&e&lЩОДЕННА НАГОРОДА' 110 | daily-available-lore: 111 | - '&7Нагорода містить:' 112 | - '&a 8x &fIron Ingot' 113 | - ' ' 114 | - '&c❌ Преміум нагорода недоступна' 115 | daily-available-premium-lore: 116 | - '&7Нагорода містить:' 117 | - '&a 16x &fIron Ingot' 118 | - '&a 3x &fGold Ingot' 119 | - ' ' 120 | - '&e✔ Преміум нагорода доступна' 121 | daily-displayname-unavailable: '&c&lЩОДЕННА НАГОРОДА' 122 | daily-premium-displayname-unavailable: '&4&lЩОДЕННА НАГОРОДА' 123 | daily-unavailable-lore: 124 | - ' ' 125 | - '&cДоступно через: %cooldown%' 126 | daily-unavailable-premium-lore: 127 | - ' ' 128 | - '&cДоступно через: %cooldown%' 129 | weekly-name: Щотижнева нагорода 130 | weekly-title: '&e&lНагороди' 131 | weekly-subtitle: '&7Ви отримали свою &eщотижневу&7 нагороду' 132 | weekly-collected: '&e%player% &7отримав свою &e&lщотижневу нагороду!' 133 | weekly-premium-collected: '&e%player% &7отримав свою &e&lпреміальну щотижневу нагороду!' 134 | weekly-displayname-available: '&a&lЩОТИЖНЕВА НАГОРОДА' 135 | weekly-premium-displayname-available: '&e&lЩОТИЖНЕВА НАГОРОДА' 136 | weekly-available-lore: 137 | - '&7Нагорода містить:' 138 | - '&a 1x &fDiamond' 139 | - ' ' 140 | - '&c❌ Преміум нагорода недоступна' 141 | weekly-available-premium-lore: 142 | - '&7Нагорода містить:' 143 | - '&a 5x &fDiamond' 144 | - '&a 3x &fEmerald' 145 | - ' ' 146 | - '&e✔ Преміум нагорода доступна' 147 | weekly-displayname-unavailable: '&c&lЩОТИЖНЕВА НАГОРОДА' 148 | weekly-premium-displayname-unavailable: '&4&lЩОТИЖНЕВА НАГОРОДА' 149 | weekly-unavailable-lore: 150 | - ' ' 151 | - '&cДоступно через: %cooldown%' 152 | weekly-unavailable-premium-lore: 153 | - ' ' 154 | - '&cДоступно через: %cooldown%' 155 | monthly-name: Щомісячна нагорода 156 | monthly-title: '&9&lНагороди' 157 | monthly-subtitle: '&7Ви отримали свою &9щомісячну&7 нагороду' 158 | monthly-collected: '&9%player% &7отримав свою &9&lщомісячну нагороду!' 159 | monthly-premium-collected: '&9%player% &7отримав свою &9&lпреміальну щомісячну нагороду!' 160 | monthly-displayname-available: '&a&lЩОМІСЯЧНА НАГОРОДА' 161 | monthly-premium-displayname-available: '&e&lЩОМІСЯЧНА НАГОРОДА' 162 | monthly-available-lore: 163 | - '&7Нагорода містить:' 164 | - '&a 8x &fDiamond' 165 | - '&a 32x &fIron Ingot' 166 | - '&a 16x &fGold Ingot' 167 | - ' ' 168 | - '&c❌ Преміум нагорода недоступна' 169 | monthly-available-premium-lore: 170 | - '&7Нагорода містить:' 171 | - '&a 1x &fNether Star' 172 | - '&a 16x &fDiamond' 173 | - '&a 64x &fIron Ingot' 174 | - '&a 32x &fGold Ingot' 175 | - ' ' 176 | - '&e✔ Преміум нагорода активована' 177 | monthly-displayname-unavailable: '&c&lЩОМІСЯЧНА НАГОРОДА' 178 | monthly-premium-displayname-unavailable: '&4&lЩОМІСЯЧНА НАГОРОДА' 179 | monthly-unavailable-lore: 180 | - ' ' 181 | - '&cДоступно через: %cooldown%' 182 | monthly-unavailable-premium-lore: 183 | - ' ' 184 | - '&cДоступно через: %cooldown%' -------------------------------------------------------------------------------- /src/main/resources/lang/Polish.yml: -------------------------------------------------------------------------------- 1 | # 2 | # Od wersji 1.16 możesz także używać kolorów HEX. 3 | # Zamiast formatu &f użyj <#ffffff> 4 | # a dla gradientu: <#ffffff>Tekst, na który zostanie zastosowany gradient 5 | # 6 | # Everything about the models and colouring can be found at https://ultimaterewards.athelion.eu/colors-and-models 7 | # 8 | lang: 9 | prefix: "&e[&6&lDailyRewards&e]" 10 | unknown-command: "%prefix% &4Unknown command, use /rw help to list all available commands" 11 | auto-claim-notification: 12 | - " " 13 | - "&a ✔ &f%rewards% nagród zostało pomyślnie automatycznie odebranych!" 14 | - " " 15 | unclaimed-rewards-notification-hover-text: "&2Kliknij, aby odebrać nagrody!" 16 | reward-reset: "&e%prefix% &fNagroda dla gracza &e%player%&f za &e%type%&f została zresetowana" 17 | unavailable-player: "%prefix% &cGracz nie jest dostępny!" 18 | unavailable-setting: "%prefix% &cTo ustawienie nie istnieje!" 19 | reward-disabled: "%prefix% &cNie można odebrać nagrody!" 20 | insufficient-permission: "%prefix% &cPotrzebujesz %permission% do wykonania tej akcji!" 21 | rewards-are-not-set: "%prefix% &cNagrody nie są ustawione!" 22 | reload-msg: "&e%prefix% &fPlugin został pomyślnie przeładowany" 23 | incomplete-reward-reset: "%prefix% &cOkreśl, co dokładnie chcesz zresetować (dzienna/tygodniowa/miesięczna/wszystkie)" 24 | full-inventory-message: "%prefix% &cNie możesz odebrać nagrody, twój ekwipunek jest pełny!" 25 | claiming-in-disabled-world: "%prefix% &cNie możesz odebrać nagród w świecie %world%" 26 | not-enough-required-time-to-claim: "%prefix% &cMusisz spędzić co najmniej %requiredMinutes% minut na serwerze, zanim będziesz mógł odebrać nagrody (pozostało %minutes% minut)" 27 | command-usage: "%prefix% &cPrawidłowe użycie: %usage%" 28 | available: "&a&lDostępne" 29 | loading: "&bŁadowanie..." 30 | back: "&cWróć" 31 | click-to-perform: "&7Click to perform %command% command" 32 | claim-command-description: "Redeems stated reward" 33 | reset-command-description: "Resets specified reward" 34 | settings-command-description: "Opens settings menu" 35 | toggle-command-description: "Toggles certain setting" 36 | reload-command-description: "Reloads plugin's configuration" 37 | import-command-description: "Imports all local data to database" 38 | help-command-description: "Shows all available commands" 39 | # 40 | # Ustawienia 41 | # 42 | settings-title: "Ustawienia" 43 | settings-display-name: "&eUstawienia" 44 | setting-enabled: "%prefix% &aWłączyłeś %setting%!" 45 | setting-disabled: "%prefix% &cWyłączyłeś %setting%!" 46 | auto-claim-failed: "%prefix% &cNiektórych nagród nie można było automatycznie odebrać, najedź kursorem, aby zobaczyć szczegóły." 47 | auto-claim-failed-hover-text-list-format: "%reward% - %reason%" 48 | auto-claim-failed-hover-text: "&cNastępujących nagród nie można automatycznie odebrać: %format%" 49 | join-auto-claim-notification: 50 | - " " 51 | - "&a ✔ Następujące nagrody zostały automatycznie odebrane: &f%listOfRewards%" 52 | - " " 53 | join-notification-setting-name: "Powiadomienie przy wejściu" 54 | join-auto-claim-setting-name: "Automatyczne odbieranie przy wejściu" 55 | no-permission-setting-display-name: "&c&l%settingType%" 56 | no-permission-setting-lore: 57 | - "&cNie możesz przełączać tego ustawienia!" 58 | - "&cBrakujące uprawnienie: %permission%" 59 | join-notification-display-name: "&aPowiadomienie przy wejściu" 60 | join-notification-enabled-lore: 61 | - "&7Powiadomi cię przy wejściu" 62 | - "&7jeśli masz nieodebrane nagrody" 63 | - " " 64 | - "&c► Kliknij, aby wyłączyć" 65 | join-notification-disabled-lore: 66 | - "&7Powiadomi cię przy wejściu" 67 | - "&7jeśli masz nieodebrane nagrody" 68 | - " " 69 | - "&a► Kliknij, aby włączyć" 70 | auto-claim-display-name: "&aAutomatyczne odbieranie przy wejściu" 71 | auto-claim-enabled-lore: 72 | - "&7Automatycznie odbierze" 73 | - "&7wszystkie dostępne nagrody przy wejściu" 74 | - " " 75 | - "&c► Kliknij, aby wyłączyć" 76 | auto-claim-disabled-lore: 77 | - "&7Automatycznie odbierze" 78 | - "&7wszystkie dostępne nagrody przy wejściu" 79 | - " " 80 | - "&a► Kliknij, aby włączyć" 81 | 82 | located-in-restricted-world: "Nagroda jest niedostępna w bieżącym świecie" 83 | insufficient-play-time: "Niewystarczający czas gry do odebrania" 84 | insufficient-permissions: "Niewystarczające uprawnienia" 85 | not-enough-free-inventory-slots: "Brak wystarczającej ilości wolnych miejsc w ekwipunku" 86 | unavailable-reward: "Nagroda jest niedostępna" 87 | # 88 | # Menu nagród 89 | # 90 | menu-title: "Nagrody" 91 | join-hover-message: "&7Kliknij, aby odebrać swoje nagrody" 92 | join-notification: 93 | - ' ' 94 | - '&2 Hej %player%, &a%rewards% nagród czeka na ciebie! &f(Kliknij tutaj)' 95 | - ' ' 96 | cooldown-message: "%prefix% &cAby odebrać &l%type% &cnagrodę, musisz poczekać &n%time%" 97 | daily-name: "Dzienna nagroda" 98 | daily-title: "&a&lNagrody" 99 | daily-subtitle: "&7Odebrałeś swoją &adzienną&7 nagrodę" 100 | daily-collected: "&a%player% &7odebrał swoją &a&ldzienną nagrodę!" 101 | daily-premium-collected: "&a%player% &7odebrał swoją &a&lprestiżową dzienną nagrodę!" 102 | daily-displayname-available: "&a&lDZIENNA NAGRODA" 103 | daily-premium-displayname-available: "&e&lDZIENNA NAGRODA" 104 | daily-available-lore: 105 | - "&7Nagroda zawiera:" 106 | - "&a 8x &fIron Ingot" 107 | - " " 108 | - "&c❌ Prestiżowa nagroda niedostępna" 109 | daily-available-premium-lore: 110 | - "&7Nagroda zawiera:" 111 | - "&a 16x &fIron Ingot" 112 | - "&a 3x &fGold Ingot" 113 | - " " 114 | - "&e✔ Prestiżowa nagroda dostępna" 115 | daily-displayname-unavailable: "&c&lDZIENNA NAGRODA" 116 | daily-premium-displayname-unavailable: "&4&lDZIENNA NAGRODA" 117 | daily-unavailable-lore: 118 | - " " 119 | - "&cDostępna za: %cooldown%" 120 | daily-unavailable-premium-lore: 121 | - " " 122 | - "&cDostępna za: %cooldown%" 123 | weekly-name: "Tygodniowa nagroda" 124 | weekly-title: "&e&lNagrody" 125 | weekly-subtitle: "&7Odebrałeś swoją &etygodniową &7nagrodę" 126 | weekly-collected: "&e%player% &7odebrał swoją &e<ygodniową nagrodę!" 127 | weekly-premium-collected: "&e%player% &7odebrał swoją &e&lprestiżową tygodniową nagrodę!" 128 | weekly-displayname-available: "&a&lTYGODNIOWA NAGRODA" 129 | weekly-premium-displayname-available: "&e&lTYGODNIOWA NAGRODA" 130 | weekly-available-lore: 131 | - "&7Nagroda zawiera:" 132 | - "&a 1x &fDiamond" 133 | - " " 134 | - "&c❌ Prestiżowa nagroda niedostępna" 135 | weekly-available-premium-lore: 136 | - "&7Nagroda zawiera:" 137 | - "&a 5x &fDiamond" 138 | - "&a 3x &fEmerald" 139 | - " " 140 | - "&e✔ Prestiżowa nagroda dostępna" 141 | weekly-displayname-unavailable: "&c&lTYGODNIOWA NAGRODA" 142 | weekly-premium-displayname-unavailable: "&4&lTYGODNIOWA NAGRODA" 143 | weekly-unavailable-lore: 144 | - " " 145 | - "&cDostępna za: %cooldown%" 146 | weekly-unavailable-premium-lore: 147 | - " " 148 | - "&cDostępna za: %cooldown%" 149 | monthly-name: "Miesięczna nagroda" 150 | monthly-title: "&9&lNagrody" 151 | monthly-subtitle: "&7Odebrałeś swoją &9miesięczną &7nagrodę" 152 | monthly-collected: "&9%player% &7odebrał &9&lmiesięczną nagrodę!" 153 | monthly-premium-collected: "&9%player% &7odebrał swoją &9&lprestiżową miesięczną nagrodę!" 154 | monthly-displayname-available: "&a&lMIESIĘCZNA NAGRODA" 155 | monthly-premium-displayname-available: "&e&lMIESIĘCZNA NAGRODA" 156 | monthly-available-lore: 157 | - "&7Nagroda zawiera:" 158 | - "&a 8x &fDiamond" 159 | - "&a 32x &fIron Ingot" 160 | - "&a 16x &fGold Ingot" 161 | - " " 162 | - "&c❌ Prestiżowa nagroda niedostępna" 163 | monthly-available-premium-lore: 164 | - "&7Nagroda zawiera:" 165 | - "&a 1x &fNether Star" 166 | - "&a 16x &fDiamond" 167 | - "&a 64x &fIron Ingot" 168 | - "&a 32x &fGold Ingot" 169 | - " " 170 | - "&e✔ Prestiżowa nagroda aktywowana" 171 | monthly-displayname-unavailable: "&c&lMIESIĘCZNA NAGRODA" 172 | monthly-premium-displayname-unavailable: "&4&lMIESIĘCZNA NAGRODA" 173 | monthly-unavailable-lore: 174 | - " " 175 | - "&cDostępna za: %cooldown%" 176 | monthly-unavailable-premium-lore: 177 | - " " 178 | - "&cDostępna za: %cooldown%" -------------------------------------------------------------------------------- /src/main/resources/lang/Romanian.yml: -------------------------------------------------------------------------------- 1 | # 2 | # From 1.16 version you can also use HEX colors. 3 | # Instead of &f format use <#ffffff> 4 | # and for gradient: <#ffffff>Text where will be applied gradient 5 | # 6 | # Everything about the models and colouring can be found at https://ultimaterewards.athelion.eu/colors-and-models 7 | # 8 | lang: 9 | prefix: "&e[&6&lDailyRewards&e]" 10 | unknown-command: "%prefix% &4Unknown command, use /rw help to list all available commands" 11 | auto-claim-notification: 12 | - " " 13 | - "&a ✔ &f%rewards% recompensă/recompense a fost auto-pretinsă cu succes!" 14 | - " " 15 | unclaimed-rewards-notification-hover-text: "&2Click pentru a obține recompensele!" 16 | reward-reset: "&e%prefix% &fAi resetat &e%type%&f recompensele unui jucător &e%player%" 17 | unavailable-player: "%prefix% &cJucătorul nu este disponibil!" 18 | unavailable-setting: "%prefix% &cAceastă setare nu există!" 19 | reward-disabled: "%prefix% &cRecompensa nu poate fi obținută!" 20 | insufficient-permission: "%prefix% &cAveți nevoie de %permission% pentru această acțiune!!" 21 | rewards-are-not-set: "%prefix% &cRecompensele nu sunt setate!" 22 | reload-msg: "&e%prefix% &fPluginul a fost reîncărcat cu succes" 23 | incomplete-reward-reset: "%prefix% &cSpecifica ce vrei să resetezi (zilnic/weekly/lunar/tot)" 24 | full-inventory-message: "%prefix% &cNu poți obține recompensele, inventarul tău este plin!" 25 | claiming-in-disabled-world: "%prefix% &cNu poți obține recompense în lumea %world%" 26 | not-enough-required-time-to-claim: "%prefix% &cTrebuie să petreci cel puțin %requiredMinutes% minute pe server înainte de a putea colecta recompense (%minutes% minute rămase)" 27 | command-usage: "%prefix% &cUtilizare validă: %usage%" 28 | available: "&a&lDisponibil" 29 | loading: "&bSe încarcă..." 30 | back: "&cÎnapoi" 31 | click-to-perform: "&7Click to perform %command% command" 32 | claim-command-description: "Redeems stated reward" 33 | reset-command-description: "Resets specified reward" 34 | settings-command-description: "Opens settings menu" 35 | toggle-command-description: "Toggles certain setting" 36 | reload-command-description: "Reloads plugin's configuration" 37 | import-command-description: "Imports all local data to database" 38 | help-command-description: "Shows all available commands" 39 | # 40 | # Settings 41 | # 42 | settings-title: "Setări" 43 | settings-display-name: "&eSetări" 44 | setting-enabled: "%prefix% &aAi activat %setting%!" 45 | setting-disabled: "%prefix% &cAi dezactivat %setting%!" 46 | auto-claim-failed: "%prefix% &cUnele recompense nu au putut fi auto-pretinse, treci cu mouse-ul pentru detalii." 47 | auto-claim-failed-hover-text-list-format: "%reward% - %reason%" 48 | auto-claim-failed-hover-text: "&cUrmătoarele recompense nu pot fi auto-pretinse: %format%" 49 | join-auto-claim-notification: 50 | - " " 51 | - "&a ✔ Următoarele recompense au fost auto-pretinse: &f%listOfRewards%" 52 | - " " 53 | join-notification-setting-name: "Notificare la alăturare" 54 | join-auto-claim-setting-name: "Auto-pretindere la alăturare" 55 | no-permission-setting-display-name: "&c&l%settingType%" 56 | no-permission-setting-lore: 57 | - "&cNu poți comuta acest tip de setare!" 58 | - "&cPermisiune lipsă: %permission%" 59 | join-notification-display-name: "&aNotificare la alăturare" 60 | join-notification-enabled-lore: 61 | - "&7Te notifică la alăturare" 62 | - "&7dacă ai recompense necolectate" 63 | - " " 64 | - "&c► Click pentru a dezactiva" 65 | join-notification-disabled-lore: 66 | - "&7Te notifică la alăturare" 67 | - "&7dacă ai recompense necolectate" 68 | - " " 69 | - "&a► Click pentru a activa" 70 | auto-claim-display-name: "&aAuto-pretindere la alăturare" 71 | auto-claim-enabled-lore: 72 | - "&7Va pretinde automat" 73 | - "&7toate recompensele disponibile la alăturare" 74 | - " " 75 | - "&c► Click pentru a dezactiva" 76 | auto-claim-disabled-lore: 77 | - "&7Va pretinde automat" 78 | - "&7toate recompensele disponibile la alăturare" 79 | - " " 80 | - "&a► Click pentru a activa" 81 | 82 | located-in-restricted-world: "Recompensa nu este disponibilă în lumea curentă" 83 | insufficient-play-time: "Timp de joc insuficient pentru a pretinde" 84 | insufficient-permissions: "Permisiuni insuficiente" 85 | not-enough-free-inventory-slots: "Nu sunt suficiente sloturi libere în inventar" 86 | unavailable-reward: "Recompensa nu este disponibilă" 87 | # 88 | # Rewards menu 89 | # 90 | menu-title: "Recompense" 91 | join-hover-message: "&7Click pentru a colecta recompensele tale" 92 | join-notification: 93 | - ' ' 94 | - '&2 Hey %player%, &a%rewards% recompensă/recompense te așteaptă! &f(Clic aici)' 95 | - ' ' 96 | cooldown-message: "%prefix% &cPentru &l%type% &crecompensă trebuie să aștepți &n%time%" 97 | daily-name: "Recompensă zilnică" 98 | daily-title: "&a&lRecompense" 99 | daily-subtitle: "&7Ai colectat recompensă ta &azilnică&7" 100 | daily-collected: "&a%player% &7a colectat recompensă sa &a&lizilnică!" 101 | daily-premium-collected: "&a%player% &7a colectat recompensă sa &a&lpremium zilnică!" 102 | daily-displayname-available: "&a&lRECOMPENSĂ ZILNICĂ" 103 | daily-premium-displayname-available: "&e&lRECOMPENSĂ ZILNICĂ" 104 | daily-available-lore: 105 | - "&7Recompensa conține:" 106 | - "&a 8x &fLingou de Fier" 107 | - " " 108 | - "&c❌ Recompensă premium indisponibilă" 109 | daily-available-premium-lore: 110 | - "&7Recompensa conține:" 111 | - "&a 16x &fLingou de Fier" 112 | - "&a 3x &fLingou de Aur" 113 | - " " 114 | - "&e✔ Recompensă premium disponibilă" 115 | daily-displayname-unavailable: "&c&lRECOMPENSĂ ZILNICĂ" 116 | daily-premium-displayname-unavailable: "&4&lRECOMPENSĂ ZILNICĂ" 117 | daily-unavailable-lore: 118 | - " " 119 | - "&cDisponibil în: %cooldown%" 120 | daily-unavailable-premium-lore: 121 | - " " 122 | - "&cDisponibil în: %cooldown%" 123 | weekly-name: "Recompensă săptămânală" 124 | weekly-title: "&e&lRecompense" 125 | weekly-subtitle: "&7Ai colectat recompensă ta &esăptămânală&7" 126 | weekly-collected: "&e%player% &7a colectat recompensă sa &e&lsăptămânală!" 127 | weekly-premium-collected: "&e%player% &7a colectat recompensă sa &e&lpremium săptămânală!" 128 | weekly-displayname-available: "&a&lRECOMPENSĂ SĂPTĂMÂNALĂ" 129 | weekly-premium-displayname-available: "&e&lRECOMPENSĂ SĂPTĂMÂNALĂ" 130 | weekly-available-lore: 131 | - "&7Recompensa conține:" 132 | - "&a 1x &fDiamant" 133 | - " " 134 | - "&c❌ Recompensă premium indisponibilă" 135 | weekly-available-premium-lore: 136 | - "&7Recompensa conține:" 137 | - "&a 5x &fDiamant" 138 | - "&a 3x &fEmerald" 139 | - " " 140 | - "&e✔ Recompensă premium disponibilă" 141 | weekly-displayname-unavailable: "&c&lRECOMPENSĂ SĂPTĂMÂNALĂ" 142 | weekly-premium-displayname-unavailable: "&4&lRECOMPENSĂ SĂPTĂMÂNALĂ" 143 | weekly-unavailable-lore: 144 | - " " 145 | - "&cDisponibil în: %cooldown%" 146 | weekly-unavailable-premium-lore: 147 | - " " 148 | - "&cDisponibil în: %cooldown%" 149 | monthly-name: "Recompensă lunară" 150 | monthly-title: "&9&lRecompense" 151 | monthly-subtitle: "&7Ai colectat recompensă ta &9lunară&7" 152 | monthly-collected: "&9%player% &7a revendicat &9&lrecompensă lunară!" 153 | monthly-premium-collected: "&9%player% &7a colectat recompensă sa &9&lpremium lunară!" 154 | monthly-displayname-available: "&a&lRECOMPENSĂ LUNARĂ" 155 | monthly-premium-displayname-available: "&e&lRECOMPENSĂ LUNARĂ" 156 | monthly-available-lore: 157 | - "&7Recompensa conține:" 158 | - "&a 8x &fDiamant" 159 | - "&a 32x &fLingou de Fier" 160 | - "&a 16x &fLingou de Aur" 161 | - " " 162 | - "&c❌ Recompensă premium indisponibilă" 163 | monthly-available-premium-lore: 164 | - "&7Recompensa conține:" 165 | - "&a 1x &fStea Nether" 166 | - "&a 16x &fDiamant" 167 | - "&a 64x &fLingou de Fier" 168 | - "&a 32x &fLingou de Aur" 169 | - " " 170 | - "&e✔ Recompensă premium activată" 171 | monthly-displayname-unavailable: "&c&lRECOMPENSĂ LUNARĂ" 172 | monthly-premium-displayname-unavailable: "&4&lRECOMPENSĂ LUNARĂ" 173 | monthly-unavailable-lore: 174 | - " " 175 | - "&cDisponibil în: %cooldown%" 176 | monthly-unavailable-premium-lore: 177 | - " " 178 | - "&cDisponibil în: %cooldown%" -------------------------------------------------------------------------------- /src/main/resources/lang/Finnish.yml: -------------------------------------------------------------------------------- 1 | # 2 | # From 1.16 version you can also use HEX colors. 3 | # Instead of &f format use <#ffffff> 4 | # and for gradient: <#ffffff>Text where will be applied gradient 5 | # 6 | # Everything about the models and colouring can be found at https://ultimaterewards.athelion.eu/colors-and-models 7 | # 8 | lang: 9 | prefix: "&e[&6&lDailyRewards&e]" 10 | unknown-command: "%prefix% &4Unknown command, use /rw help to list all available commands" 11 | auto-claim-notification: 12 | - " " 13 | - "&a ✔ &f%rewards% palkintoa on onnistuneesti haettu automaattisesti!" 14 | - " " 15 | unclaimed-rewards-notification-hover-text: "&2Napsauta saadaksesi palkinnot!" 16 | reward-reset: "&e%prefix% &fOlet nollannut pelaajan &e%player%&f &e%type%&f palkinnot" 17 | unavailable-player: "%prefix% &cPelaaja ei ole saatavilla!" 18 | unavailable-setting: "%prefix% &cTätä asetusta ei ole olemassa!" 19 | reward-disabled: "%prefix% &cPalkintoa ei voida hankkia!" 20 | insufficient-permission: "%prefix% &cTarvitset %permission% tätä toimintoa varten!" 21 | rewards-are-not-set: "%prefix% &cPalkintoja ei ole asetettu!" 22 | reload-msg: "&e%prefix% &fLaajennus ladattiin onnistuneesti uudelleen" 23 | incomplete-reward-reset: "%prefix% &cMääritä mitä tarkalleen haluat nollata (päivittäinen/viikoittainen/kuukausittainen/kaikki)" 24 | full-inventory-message: "%prefix% &cEt voi hankkia palkintoa, inventaario on täynnä!" 25 | claiming-in-disabled-world: "%prefix% &cEt voi hankkia palkintoja maailmassa %world%" 26 | not-enough-required-time-to-claim: "%prefix% &cSinun on oltava vähintään %requiredMinutes% minuuttia palvelimella ennen kuin voit kerätä palkintoja (%minutes% minuuttia jäljellä)" 27 | command-usage: "%prefix% &cVoimassa oleva käyttö: %usage%" 28 | available: "&a&lSaatavilla" 29 | loading: "&bLadataan..." 30 | back: "&cTakaisin" 31 | click-to-perform: "&7Click to perform %command% command" 32 | claim-command-description: "Redeems stated reward" 33 | reset-command-description: "Resets specified reward" 34 | settings-command-description: "Opens settings menu" 35 | toggle-command-description: "Toggles certain setting" 36 | reload-command-description: "Reloads plugin's configuration" 37 | import-command-description: "Imports all local data to database" 38 | help-command-description: "Shows all available commands" 39 | # 40 | # Settings 41 | # 42 | settings-title: "Asetukset" 43 | settings-display-name: "&eAsetukset" 44 | setting-enabled: "%prefix% &aOlet aktivoinut %setting%!" 45 | setting-disabled: "%prefix% &cOlet poistanut käytöstä %setting%!" 46 | auto-claim-failed: "%prefix% &cJotkin palkinnot eivät voineet olla automaattisesti haettu, vie hiiri yllä olevalle kohdalle saadaksesi lisätietoja." 47 | auto-claim-failed-hover-text-list-format: "%reward% - %reason%" 48 | auto-claim-failed-hover-text: "&cSeuraavia palkintoja ei voida automaattisesti hakea: %format%" 49 | join-auto-claim-notification: 50 | - " " 51 | - "&a ✔ Seuraavat palkinnot on haettu automaattisesti: &f%listOfRewards%" 52 | - " " 53 | join-notification-setting-name: "Liittymisilmoitus" 54 | join-auto-claim-setting-name: "Liittymisautomaattinen haku" 55 | no-permission-setting-display-name: "&c&l%settingType%" 56 | no-permission-setting-lore: 57 | - "&cEt voi kytkeä tätä asetusta päälle tai pois!" 58 | - "&cPuuttuva oikeus: %permission%" 59 | join-notification-display-name: "&aLiittymisilmoitus" 60 | join-notification-enabled-lore: 61 | - "&7Ilmoittaa sinulle liittyessäsi" 62 | - "&7jos sinulla on keräämättömiä palkintoja" 63 | - " " 64 | - "&c► Napsauta poistaaksesi käytöstä" 65 | join-notification-disabled-lore: 66 | - "&7Ilmoittaa sinulle liittyessäsi" 67 | - "&7jos sinulla on keräämättömiä palkintoja" 68 | - " " 69 | - "&a► Napsauta ottaaksesi käyttöön" 70 | auto-claim-display-name: "&aLiittymisautomaattinen haku" 71 | auto-claim-enabled-lore: 72 | - "&7Hakee automaattisesti" 73 | - "&7kaikki saatavilla olevat palkinnot liittyessäsi" 74 | - " " 75 | - "&c► Napsauta poistaaksesi käytöstä" 76 | auto-claim-disabled-lore: 77 | - "&7Hakee automaattisesti" 78 | - "&7kaikki saatavilla olevat palkinnot liittyessäsi" 79 | - " " 80 | - "&a► Napsauta ottaaksesi käyttöön" 81 | 82 | located-in-restricted-world: "Palkinto ei ole saatavilla nykyisessä maailmassa" 83 | insufficient-play-time: "Ei tarpeeksi peliaikaa haettavaksi" 84 | insufficient-permissions: "Riittämättömät oikeudet" 85 | not-enough-free-inventory-slots: "Ei tarpeeksi vapaita inventaarioslotteja" 86 | unavailable-reward: "Palkinto ei ole saatavilla" 87 | # 88 | # Rewards menu 89 | # 90 | menu-title: "Palkinnot" 91 | join-hover-message: "&7Napsauta kerätäksesi palkintosi" 92 | join-notification: 93 | - ' ' 94 | - '&2 Hei %player%, &a%rewards% palkintoa odottaa sinua! &f(Napsauta tästä)' 95 | - ' ' 96 | cooldown-message: "%prefix% &c%type% &cpalkinnon hakemiseen sinun on odotettava &n%time%" 97 | daily-name: "Päivittäinen Palkinto" 98 | daily-title: "&a&lPalkinnot" 99 | daily-subtitle: "&7Olet kerännyt &adaily&7 palkintosi" 100 | daily-collected: "&a%player% &7keräsi hänen &a&lpäivittäisen palkintonsa!" 101 | daily-premium-collected: "&a%player% &7keräsi hänen &a&lpremium päivittäisen palkintonsa!" 102 | daily-displayname-available: "&a&lPÄIVÄTTAINEN PALKINTO" 103 | daily-premium-displayname-available: "&e&lPÄIVÄTTAINEN PALKINTO" 104 | daily-available-lore: 105 | - "&7Palkinto sisältää:" 106 | - "&a 8x &fRautapalikka" 107 | - " " 108 | - "&c❌ Premium palkinto ei saatavilla" 109 | daily-available-premium-lore: 110 | - "&7Palkinto sisältää:" 111 | - "&a 16x &fRautapalikka" 112 | - "&a 3x &fKultapalikka" 113 | - " " 114 | - "&e✔ Premium palkinto saatavilla" 115 | daily-displayname-unavailable: "&c&lPÄIVÄTTAINEN PALKINTO" 116 | daily-premium-displayname-unavailable: "&4&lPÄIVÄTTAINEN PALKINTO" 117 | daily-unavailable-lore: 118 | - " " 119 | - "&cSaatavilla: %cooldown%" 120 | daily-unavailable-premium-lore: 121 | - " " 122 | - "&cSaatavilla: %cooldown%" 123 | weekly-name: "Viikoittainen Palkinto" 124 | weekly-title: "&e&lPalkinnot" 125 | weekly-subtitle: "&7Olet kerännyt &eviikoittaisen &7palkintosi" 126 | weekly-collected: "&e%player% &7keräsi hänen &e&lviikoittaisen palkintonsa!" 127 | weekly-premium-collected: "&e%player% &7keräsi hänen &e&lpremium viikoittaisen palkintonsa!" 128 | weekly-displayname-available: "&a&lVIIKOITTAINEN PALKINTO" 129 | weekly-premium-displayname-available: "&e&lVIIKOITTAINEN PALKINTO" 130 | weekly-available-lore: 131 | - "&7Palkinto sisältää:" 132 | - "&a 1x &fTimantti" 133 | - " " 134 | - "&c❌ Premium palkinto ei saatavilla" 135 | weekly-available-premium-lore: 136 | - "&7Palkinto sisältää:" 137 | - "&a 5x &fTimantti" 138 | - "&a 3x &fSmaragdi" 139 | - " " 140 | - "&e✔ Premium palkinto saatavilla" 141 | weekly-displayname-unavailable: "&c&lVIIKOITTAINEN PALKINTO" 142 | weekly-premium-displayname-unavailable: "&4&lVIIKOITTAINEN PALKINTO" 143 | weekly-unavailable-lore: 144 | - " " 145 | - "&cSaatavilla: %cooldown%" 146 | weekly-unavailable-premium-lore: 147 | - " " 148 | - "&cSaatavilla: %cooldown%" 149 | monthly-name: "Kuukausittainen Palkinto" 150 | monthly-title: "&9&lPalkinnot" 151 | monthly-subtitle: "&7Olet kerännyt &9kuukausittaisen &7palkintosi" 152 | monthly-collected: "&9%player% &7on hakenut &9&lkuukausittaisen palkinnon!" 153 | monthly-premium-collected: "&9%player% &7keräsi hänen &9&lpremium kuukausittaisen palkintonsa!" 154 | monthly-displayname-available: "&a&lKUUKAUSITTAINEN PALKINTO" 155 | monthly-premium-displayname-available: "&e&lKUUKAUSITTAINEN PALKINTO" 156 | monthly-available-lore: 157 | - "&7Palkinto sisältää:" 158 | - "&a 8x &fTimantti" 159 | - "&a 32x &fRautapalikka" 160 | - "&a 16x &fKultapalikka" 161 | - " " 162 | - "&c❌ Premium palkinto ei saatavilla" 163 | monthly-available-premium-lore: 164 | - "&7Palkinto sisältää:" 165 | - "&a 1x &fNether Star" 166 | - "&a 16x &fTimantti" 167 | - "&a 64x &fRautapalikka" 168 | - "&a 32x &fKultapalikka" 169 | - " " 170 | - "&e✔ Premium palkinto aktivoitu" 171 | monthly-displayname-unavailable: "&c&lKUUKAUSITTAINEN PALKINTO" 172 | monthly-premium-displayname-unavailable: "&4&lKUUKAUSITTAINEN PALKINTO" 173 | monthly-unavailable-lore: 174 | - " " 175 | - "&cSaatavilla: %cooldown%" 176 | monthly-unavailable-premium-lore: 177 | - " " 178 | - "&cSaatavilla: %cooldown%" --------------------------------------------------------------------------------