├── lib └── GadgetsMenu.jar ├── .gitignore ├── src └── main │ ├── java │ └── studio │ │ └── magemonkey │ │ └── genesis │ │ ├── misc │ │ ├── MetricsManager.java │ │ ├── Enchant.java │ │ ├── userinput │ │ │ ├── GenesisAnvilHolderUserInput.java │ │ │ ├── AnvilTools.java │ │ │ ├── GenesisAnvilHolder.java │ │ │ ├── GenesisUserInput.java │ │ │ └── GenesisChatUserInput.java │ │ ├── VersionManager.java │ │ ├── EnumUT.java │ │ ├── TimeTools.java │ │ └── ShopItemPurchaseTask.java │ │ ├── core │ │ ├── GenesisCustomActions.java │ │ ├── conditions │ │ │ ├── GenesisCondition.java │ │ │ ├── GenesisConditionTypePermission.java │ │ │ ├── GenesisConditionTypeWorld.java │ │ │ ├── GenesisConditionTypeHealth.java │ │ │ ├── GenesisConditionTypeExp.java │ │ │ ├── GenesisConditionTypeTime.java │ │ │ ├── GenesisConditionTypeHunger.java │ │ │ ├── GenesisConditionTypeItem.java │ │ │ ├── GenesisConditionTypeLocationX.java │ │ │ ├── GenesisConditionTypeLocationY.java │ │ │ ├── GenesisConditionTypeLocationZ.java │ │ │ ├── GenesisConditionTypeLightlevel.java │ │ │ ├── GenesisConditionTypeRealYear.java │ │ │ ├── GenesisConditionTypeRealHour.java │ │ │ ├── GenesisConditionTypeRealMinute.java │ │ │ ├── GenesisConditionTypeRealSecond.java │ │ │ ├── GenesisConditionTypeRealWeek.java │ │ │ ├── GenesisConditionTypeHandItem.java │ │ │ ├── GenesisConditionTypeWeather.java │ │ │ ├── GenesisConditionTypeRealMillisecond.java │ │ │ ├── GenesisConditionTypeRealMonthDay.java │ │ │ ├── GenesisConditionTypeGroup.java │ │ │ ├── GenesisConditionTypePoints.java │ │ │ ├── GenesisSingleCondition.java │ │ │ ├── GenesisConditionSet.java │ │ │ ├── GenesisConditionTypeMoney.java │ │ │ ├── GenesisConditionTypeRealWeekDay.java │ │ │ ├── GenesisConditionTypeShopPage.java │ │ │ ├── GenesisConditionTypeMatch.java │ │ │ ├── GenesisConditionTypeRealMonth.java │ │ │ └── GenesisConditionTypeServerpinging.java │ │ ├── GenesisCustomLink.java │ │ ├── rewards │ │ │ ├── GenesisRewardTypeNumber.java │ │ │ ├── GenesisRewardTypeNothing.java │ │ │ ├── GenesisRewardTypeClose.java │ │ │ ├── GenesisRewardTypeCustom.java │ │ │ ├── GenesisRewardTypeBungeeCordServer.java │ │ │ ├── GenesisRewardTypeShop.java │ │ │ ├── GenesisRewardTypeExp.java │ │ │ ├── GenesisRewardTypePoints.java │ │ │ ├── GenesisRewardTypeMessage.java │ │ │ ├── GenesisRewardTypePlayerCommand.java │ │ │ └── GenesisRewardTypeCommand.java │ │ ├── prices │ │ │ ├── GenesisPriceTypeNothing.java │ │ │ └── GenesisPriceTypeNumber.java │ │ └── GenesisShopHolder.java │ │ ├── events │ │ ├── GenesisEvent.java │ │ ├── GenesisRegisterTypesEvent.java │ │ ├── GenesisReloadedEvent.java │ │ ├── GenesisLoadShopItemsEvent.java │ │ ├── GenesisLoadShopItemEvent.java │ │ ├── GenesisChoosePageLayoutEvent.java │ │ ├── GenesisCheckStringForFeaturesEvent.java │ │ ├── GenesisPlayerPurchasedEvent.java │ │ ├── GenesisCreatedShopItemEvent.java │ │ ├── GenesisDisplayItemEvent.java │ │ ├── GenesisPlayerPurchaseEvent.java │ │ ├── GenesisCreateShopItemEvent.java │ │ └── GenesisTransformStringEvent.java │ │ ├── managers │ │ ├── external │ │ │ ├── spawners │ │ │ │ ├── ISpawnEggHandler.java │ │ │ │ ├── ISpawnerHandler.java │ │ │ │ ├── SpawnersHandlerEpicSpawners.java │ │ │ │ └── SpawnersHandlerSilkSpawners.java │ │ │ ├── PlaceholderAPIHandler.java │ │ │ ├── LanguageManager.java │ │ │ └── VaultHandler.java │ │ ├── serverpinging │ │ │ ├── ServerConnector.java │ │ │ ├── ConnectedBuyItem.java │ │ │ ├── ServerPingingRunnableHandler.java │ │ │ ├── ServerPingingList.java │ │ │ ├── ServerConnector4.java │ │ │ └── ServerConnector3.java │ │ ├── misc │ │ │ └── ItemDataConverter.java │ │ ├── config │ │ │ └── ConfigLoader.java │ │ ├── features │ │ │ ├── StorageManager.java │ │ │ ├── AutoRefreshHandler.java │ │ │ ├── PlayerDataHandler.java │ │ │ ├── ItemDataStorage.java │ │ │ ├── BugFinder.java │ │ │ └── TransactionLog.java │ │ └── item │ │ │ ├── ItemDataPartAmount.java │ │ │ ├── ItemDataPartUnbreaking.java │ │ │ ├── ItemDataPartAxolotl.java │ │ │ ├── ItemDataPartKnowledgeBook.java │ │ │ ├── ItemDataPartTropicalFish.java │ │ │ ├── ItemDataPartItemModel.java │ │ │ ├── ItemDataPartGlowing.java │ │ │ ├── ItemDataPartName.java │ │ │ └── ItemDataPartMobEgg.java │ │ ├── bungee │ │ ├── GenesisBungeePlugin.java │ │ └── GenesisBungeeListener.java │ │ ├── inbuiltaddons │ │ ├── logictypes │ │ │ ├── LogicTypes.java │ │ │ ├── TypeRegisterListener.java │ │ │ ├── GenesisPricePart.java │ │ │ └── GenesisRewardPart.java │ │ ├── advancedshops │ │ │ ├── AdvancedShops.java │ │ │ └── ActionSet.java │ │ └── InbuiltAddonLoader.java │ │ ├── pointsystem │ │ ├── GenesisPointsPluginNone.java │ │ ├── GenesisPointsPluginTokenEnchant.java │ │ ├── GenesisPointsPluginGringotts.java │ │ ├── GenesisPointsPluginJobs.java │ │ ├── GenesisPointsPluginPlayerPoints.java │ │ ├── GenesisPointsPluginTokenManager.java │ │ ├── GenesisPointsAPI.java │ │ ├── GenesisPointsPluginKingdoms.java │ │ ├── GenesisPointsPluginGadgetsMenu.java │ │ ├── GenesisPointsPluginVotingPlugin.java │ │ ├── GenesisPointsPluginFailed.java │ │ └── GenesisPointsPlugin.java │ │ └── api │ │ ├── GenesisAddonConfigurable.java │ │ └── GenesisAddonStorage.java │ └── resources │ ├── todo.txt │ ├── bungee.yml │ ├── plugin.yml │ ├── PlayerCommands.yml │ ├── BungeeCordServers.yml │ ├── LilyPadServers.yml │ ├── HugeShop.yml │ ├── PointShop.yml │ └── lang │ └── zh-cn.yml ├── .github ├── dependabot.yml ├── workflows │ ├── dependabot-automerge.yml │ ├── maven.yml │ ├── dependabot-autoapprove.yml │ ├── devbuild.yml │ └── release.yml ├── update_version.py └── notify_published.py ├── LICENSE.txt └── README.md /lib/GadgetsMenu.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/magemonkeystudio/genesis/HEAD/lib/GadgetsMenu.jar -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | .settings 3 | .classpath 4 | .project 5 | /.idea/ 6 | *.iml 7 | dependency-reduced-pom.xml 8 | .floo* 9 | gh-pages/ 10 | settings.xml 11 | toolchains.xml 12 | log.txt -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/misc/MetricsManager.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.misc; 2 | 3 | 4 | public class MetricsManager { 5 | String USER = "%%__USER__%%"; 6 | 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/main/resources/todo.txt: -------------------------------------------------------------------------------- 1 | Genesis: 2 | * RewardType OR with random reward (chances can be defined by user) 3 | 4 | * Optionale Funktion bei jedem Shop: lock-gui: true (dann kann Inventar nicht weggeklickt werden) 5 | -------------------------------------------------------------------------------- /src/main/resources/bungee.yml: -------------------------------------------------------------------------------- 1 | name: Genesis 2 | main: studio.magemonkey.genesis.bungee.GenesisBungeePlugin 3 | version: ${project.version} 4 | description: BungeeCord plugin for Genesis 5 | authors: [ Black_ixx, MageMonkeyStudio ] -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/GenesisCustomActions.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | public interface GenesisCustomActions { 6 | 7 | void customAction(Player p, int id); 8 | 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/events/GenesisEvent.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.events; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.event.Event; 5 | 6 | public abstract class GenesisEvent extends Event { 7 | 8 | public GenesisEvent() { 9 | super(!Bukkit.getServer().isPrimaryThread()); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/external/spawners/ISpawnEggHandler.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.external.spawners; 2 | 3 | import org.bukkit.inventory.ItemStack; 4 | 5 | public interface ISpawnEggHandler { 6 | 7 | 8 | ItemStack transformEgg(ItemStack i, String entityName); 9 | 10 | String readEgg(ItemStack i); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/external/spawners/ISpawnerHandler.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.external.spawners; 2 | 3 | import org.bukkit.inventory.ItemStack; 4 | 5 | public interface ISpawnerHandler { 6 | 7 | 8 | ItemStack transformSpawner(ItemStack i, String entityName); 9 | 10 | String readSpawner(ItemStack i); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/serverpinging/ServerConnector.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.serverpinging; 2 | 3 | public interface ServerConnector { 4 | 5 | 6 | /** 7 | * Update the server info or not 8 | * 9 | * @param info info to update 10 | * @return updaed or not 11 | */ 12 | boolean update(ServerInfo info); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/bungee/GenesisBungeePlugin.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.bungee; 2 | 3 | 4 | import net.md_5.bungee.api.plugin.Plugin; 5 | 6 | public class GenesisBungeePlugin extends Plugin { 7 | 8 | 9 | @Override 10 | public void onEnable() { 11 | getProxy().getPluginManager().registerListener(this, new GenesisBungeeListener(this)); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/inbuiltaddons/logictypes/LogicTypes.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.inbuiltaddons.logictypes; 2 | 3 | import org.bukkit.Bukkit; 4 | import studio.magemonkey.genesis.Genesis; 5 | 6 | public class LogicTypes { 7 | 8 | 9 | public void enable(Genesis plugin) { 10 | Bukkit.getPluginManager().registerEvents(new TypeRegisterListener(), plugin); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisCondition.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | public interface GenesisCondition { 8 | 9 | boolean meetsCondition(GenesisShopHolder holder, GenesisBuy buy, Player p); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/inbuiltaddons/advancedshops/AdvancedShops.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.inbuiltaddons.advancedshops; 2 | 3 | import org.bukkit.Bukkit; 4 | import studio.magemonkey.genesis.Genesis; 5 | 6 | public class AdvancedShops { 7 | 8 | public void enable(Genesis plugin) { 9 | Bukkit.getPluginManager().registerEvents(new ShopItemCreationListener(), plugin); 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/inbuiltaddons/InbuiltAddonLoader.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.inbuiltaddons; 2 | 3 | import studio.magemonkey.genesis.Genesis; 4 | import studio.magemonkey.genesis.inbuiltaddons.advancedshops.AdvancedShops; 5 | import studio.magemonkey.genesis.inbuiltaddons.logictypes.LogicTypes; 6 | 7 | public class InbuiltAddonLoader { 8 | 9 | public void load(Genesis plugin) { 10 | new AdvancedShops().enable(plugin); 11 | new LogicTypes().enable(plugin); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/misc/Enchant.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.misc; 2 | 3 | import org.bukkit.enchantments.Enchantment; 4 | 5 | public class Enchant { 6 | 7 | private final Enchantment type; 8 | private final int lvl; 9 | 10 | public Enchant(Enchantment type, int lvl) { 11 | this.type = type; 12 | this.lvl = lvl; 13 | } 14 | 15 | public Enchantment getType() { 16 | return type; 17 | } 18 | 19 | public int getLevel() { 20 | return lvl; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/GenesisCustomLink.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | 6 | public class GenesisCustomLink { 7 | 8 | private final GenesisCustomActions actions; 9 | private final int id; 10 | 11 | public GenesisCustomLink(int id, GenesisCustomActions actions) { 12 | this.actions = actions; 13 | this.id = id; 14 | } 15 | 16 | public void doAction(Player p) { 17 | actions.customAction(p, id); 18 | } 19 | 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/misc/userinput/GenesisAnvilHolderUserInput.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.misc.userinput; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | public class GenesisAnvilHolderUserInput extends GenesisAnvilHolder { 6 | 7 | 8 | private final GenesisUserInput input; 9 | 10 | public GenesisAnvilHolderUserInput(GenesisUserInput input) { 11 | this.input = input; 12 | } 13 | 14 | @Override 15 | public void userClickedResult(Player p) { 16 | input.receivedInput(p, getOutputText()); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "maven" 9 | directory: "/" 10 | schedule: 11 | interval: "weekly" 12 | target-branch: "dev" 13 | open-pull-requests-limit: 10 14 | reviewers: 15 | - Travja -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/events/GenesisRegisterTypesEvent.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.events; 2 | 3 | import org.bukkit.event.HandlerList; 4 | 5 | public class GenesisRegisterTypesEvent extends GenesisEvent { 6 | 7 | private static final HandlerList handlers = new HandlerList(); 8 | 9 | 10 | public GenesisRegisterTypesEvent() { 11 | } 12 | 13 | public static HandlerList getHandlerList() { 14 | return handlers; 15 | } 16 | 17 | @Override 18 | public HandlerList getHandlers() { 19 | return handlers; 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/inbuiltaddons/logictypes/TypeRegisterListener.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.inbuiltaddons.logictypes; 2 | 3 | import org.bukkit.event.EventHandler; 4 | import org.bukkit.event.Listener; 5 | import studio.magemonkey.genesis.events.GenesisRegisterTypesEvent; 6 | 7 | public class TypeRegisterListener implements Listener { 8 | 9 | 10 | @EventHandler 11 | public void onCreate(GenesisRegisterTypesEvent event) { 12 | new GenesisPriceTypeAnd().register(); 13 | new GenesisPriceTypeOr().register(); 14 | new GenesisRewardTypeAnd().register(); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /.github/workflows/dependabot-automerge.yml: -------------------------------------------------------------------------------- 1 | name: Dependabot auto-merge 2 | on: pull_request_target 3 | permissions: 4 | pull-requests: write 5 | contents: write 6 | jobs: 7 | dependabot: 8 | runs-on: ubuntu-latest 9 | if: ${{ github.event.pull_request.user.login == 'dependabot[bot]' }} 10 | steps: 11 | - name: Dependabot metadata 12 | id: dependabot-metadata 13 | uses: dependabot/fetch-metadata@v1 14 | - name: Enable auto-merge for Dependabot PRs 15 | run: gh pr merge --auto --squash "$PR_URL" 16 | env: 17 | PR_URL: ${{github.event.pull_request.html_url}} 18 | GH_TOKEN: ${{secrets.ACTIONS_PAT}} -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/misc/VersionManager.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.misc; 2 | 3 | import org.bukkit.Bukkit; 4 | 5 | public class VersionManager { 6 | public static boolean classExists(String className) { 7 | try { 8 | Class.forName(className); 9 | return true; 10 | } catch (ClassNotFoundException e) { 11 | return false; 12 | } 13 | } 14 | 15 | public static boolean isAtLeast(int i) { 16 | String version = Bukkit.getServer().getBukkitVersion().split("-")[0]; 17 | int version2 = Integer.parseInt(version.split("\\.")[1]); 18 | return version2 >= i; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/inbuiltaddons/logictypes/GenesisPricePart.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.inbuiltaddons.logictypes; 2 | 3 | import studio.magemonkey.genesis.core.prices.GenesisPriceType; 4 | 5 | public class GenesisPricePart { 6 | 7 | private final GenesisPriceType priceType; 8 | private final Object price; 9 | 10 | public GenesisPricePart(GenesisPriceType priceType, Object price) { 11 | this.price = price; 12 | this.priceType = priceType; 13 | } 14 | 15 | public GenesisPriceType getPriceType() { 16 | return priceType; 17 | } 18 | 19 | public Object getPrice() { 20 | return price; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/external/spawners/SpawnersHandlerEpicSpawners.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.external.spawners; 2 | 3 | import com.craftaro.epicspawners.api.EpicSpawnersApi; 4 | import org.bukkit.inventory.ItemStack; 5 | 6 | public class SpawnersHandlerEpicSpawners implements ISpawnerHandler { 7 | 8 | public ItemStack transformSpawner(ItemStack i, String entityType) { 9 | return EpicSpawnersApi.getSpawnerManager().getSpawnerData(entityType).getFirstTier().toItemStack(); 10 | } 11 | 12 | public String readSpawner(ItemStack i) { 13 | return EpicSpawnersApi.getSpawnerManager().getSpawnerTier(i).getIdentifyingName(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/inbuiltaddons/logictypes/GenesisRewardPart.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.inbuiltaddons.logictypes; 2 | 3 | import studio.magemonkey.genesis.core.rewards.GenesisRewardType; 4 | 5 | public class GenesisRewardPart { 6 | 7 | private final GenesisRewardType rewardtype; 8 | private final Object reward; 9 | 10 | public GenesisRewardPart(GenesisRewardType rewardtype, Object reward) { 11 | this.reward = reward; 12 | this.rewardtype = rewardtype; 13 | } 14 | 15 | public GenesisRewardType getRewardType() { 16 | return rewardtype; 17 | } 18 | 19 | public Object getReward() { 20 | return reward; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypePermission.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | public class GenesisConditionTypePermission extends GenesisConditionTypeMatch { 6 | 7 | 8 | @Override 9 | public boolean matches(Player p, String singleCondition) { 10 | return p.hasPermission(singleCondition); 11 | } 12 | 13 | 14 | @Override 15 | public boolean dependsOnPlayer() { 16 | return true; 17 | } 18 | 19 | @Override 20 | public String[] createNames() { 21 | return new String[]{"permission"}; 22 | } 23 | 24 | 25 | @Override 26 | public void enableType() { 27 | } 28 | 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeWorld.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | 4 | import org.bukkit.entity.Player; 5 | 6 | public class GenesisConditionTypeWorld extends GenesisConditionTypeMatch { 7 | 8 | @Override 9 | public boolean matches(Player p, String singleCondition) { 10 | return p.getWorld().getName().equalsIgnoreCase(singleCondition); 11 | } 12 | 13 | @Override 14 | public boolean dependsOnPlayer() { 15 | return true; 16 | } 17 | 18 | @Override 19 | public String[] createNames() { 20 | return new String[]{"world", "worldname"}; 21 | } 22 | 23 | 24 | @Override 25 | public void enableType() { 26 | } 27 | 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/external/PlaceholderAPIHandler.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.external; 2 | 3 | import me.clip.placeholderapi.PlaceholderAPI; 4 | import org.bukkit.entity.Player; 5 | import studio.magemonkey.genesis.Genesis; 6 | 7 | public class PlaceholderAPIHandler { 8 | 9 | public PlaceholderAPIHandler() { 10 | Genesis.log("Hooked into PlaceholderAPI."); 11 | } 12 | 13 | public String transformString(String s, Player p) { 14 | if (containsPlaceholder(s)) { 15 | s = PlaceholderAPI.setPlaceholders(p, s); 16 | } 17 | return s; 18 | } 19 | 20 | public boolean containsPlaceholder(String s) { 21 | return PlaceholderAPI.containsPlaceholders(s); 22 | } 23 | 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/events/GenesisReloadedEvent.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.events; 2 | 3 | import org.bukkit.event.HandlerList; 4 | import studio.magemonkey.genesis.Genesis; 5 | 6 | public class GenesisReloadedEvent extends GenesisEvent { 7 | 8 | private static final HandlerList handlers = new HandlerList(); 9 | 10 | 11 | private final Genesis plugin; 12 | 13 | 14 | public GenesisReloadedEvent(Genesis plugin) { 15 | this.plugin = plugin; 16 | } 17 | 18 | public static HandlerList getHandlerList() { 19 | return handlers; 20 | } 21 | 22 | public Genesis getGenesis() { 23 | return plugin; 24 | } 25 | 26 | @Override 27 | public HandlerList getHandlers() { 28 | return handlers; 29 | } 30 | 31 | } -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeHealth.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | public class GenesisConditionTypeHealth extends GenesisConditionTypeNumber { 8 | 9 | @Override 10 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 11 | return p.getHealth(); 12 | } 13 | 14 | @Override 15 | public boolean dependsOnPlayer() { 16 | return true; 17 | } 18 | 19 | @Override 20 | public String[] createNames() { 21 | return new String[]{"health"}; 22 | } 23 | 24 | 25 | @Override 26 | public void enableType() { 27 | } 28 | 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/external/LanguageManager.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.external; 2 | 3 | 4 | import com.meowj.langutils.lang.LanguageHelper; 5 | import org.bukkit.enchantments.Enchantment; 6 | import org.bukkit.inventory.ItemStack; 7 | import studio.magemonkey.genesis.managers.ClassManager; 8 | 9 | public class LanguageManager { 10 | 11 | private final String locale; 12 | 13 | public LanguageManager() { 14 | locale = ClassManager.manager.getMessageHandler().getRaw("Locale"); 15 | } 16 | 17 | public String getDisplayNameItem(ItemStack i) { 18 | return LanguageHelper.getItemDisplayName(i, locale); 19 | } 20 | 21 | public String getDisplayNameEnchantment(Enchantment e) { 22 | return LanguageHelper.getEnchantmentName(e, locale); 23 | } 24 | 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeExp.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | public class GenesisConditionTypeExp extends GenesisConditionTypeNumber { 8 | 9 | @Override 10 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 11 | return p.getLevel(); 12 | } 13 | 14 | @Override 15 | public boolean dependsOnPlayer() { 16 | return true; 17 | } 18 | 19 | @Override 20 | public String[] createNames() { 21 | return new String[]{"exp", "xp", "level", "levels"}; 22 | } 23 | 24 | 25 | @Override 26 | public void enableType() { 27 | } 28 | 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeTime.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | public class GenesisConditionTypeTime extends GenesisConditionTypeNumber { 8 | 9 | @Override 10 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 11 | return p.getWorld().getTime(); 12 | } 13 | 14 | @Override 15 | public boolean dependsOnPlayer() { 16 | return true; 17 | } 18 | 19 | @Override 20 | public String[] createNames() { 21 | return new String[]{"worldtime", "time"}; 22 | } 23 | 24 | 25 | @Override 26 | public void enableType() { 27 | } 28 | 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/pointsystem/GenesisPointsPluginNone.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.pointsystem; 2 | 3 | import org.bukkit.OfflinePlayer; 4 | 5 | public class GenesisPointsPluginNone extends GenesisPointsPlugin { 6 | 7 | public GenesisPointsPluginNone() { 8 | super("None"); 9 | } 10 | 11 | public double getPoints(OfflinePlayer player) { 12 | return -1; 13 | } 14 | 15 | public double setPoints(OfflinePlayer player, double points) { 16 | return -1; 17 | } 18 | 19 | public double takePoints(OfflinePlayer player, double points) { 20 | return -1; 21 | } 22 | 23 | public double givePoints(OfflinePlayer player, double points) { 24 | return -1; 25 | } 26 | 27 | @Override 28 | public boolean usesDoubleValues() { 29 | return false; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeHunger.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | public class GenesisConditionTypeHunger extends GenesisConditionTypeNumber { 8 | 9 | @Override 10 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 11 | return p.getFoodLevel(); 12 | } 13 | 14 | @Override 15 | public boolean dependsOnPlayer() { 16 | return true; 17 | } 18 | 19 | @Override 20 | public String[] createNames() { 21 | return new String[]{"hunger", "foodlevel", "food"}; 22 | } 23 | 24 | 25 | @Override 26 | public void enableType() { 27 | } 28 | 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeItem.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.managers.misc.InputReader; 5 | 6 | public class GenesisConditionTypeItem extends GenesisConditionTypeMatch { 7 | 8 | 9 | @Override 10 | public boolean matches(Player p, String singleCondition) { 11 | return p.getInventory().contains(InputReader.readMaterial(singleCondition)); 12 | } 13 | 14 | 15 | @Override 16 | public boolean dependsOnPlayer() { 17 | return true; 18 | } 19 | 20 | @Override 21 | public String[] createNames() { 22 | return new String[]{"item", "inventoryitem", "hasitem", "material"}; 23 | } 24 | 25 | 26 | @Override 27 | public void enableType() { 28 | } 29 | 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeLocationX.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | 4 | import org.bukkit.entity.Player; 5 | import studio.magemonkey.genesis.core.GenesisBuy; 6 | import studio.magemonkey.genesis.core.GenesisShopHolder; 7 | 8 | public class GenesisConditionTypeLocationX extends GenesisConditionTypeNumber { 9 | 10 | @Override 11 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 12 | return p.getLocation().getX(); 13 | } 14 | 15 | @Override 16 | public boolean dependsOnPlayer() { 17 | return true; 18 | } 19 | 20 | @Override 21 | public String[] createNames() { 22 | return new String[]{"locationx", "x"}; 23 | } 24 | 25 | 26 | @Override 27 | public void enableType() { 28 | } 29 | 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeLocationY.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | 4 | import org.bukkit.entity.Player; 5 | import studio.magemonkey.genesis.core.GenesisBuy; 6 | import studio.magemonkey.genesis.core.GenesisShopHolder; 7 | 8 | public class GenesisConditionTypeLocationY extends GenesisConditionTypeNumber { 9 | 10 | @Override 11 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 12 | return p.getLocation().getY(); 13 | } 14 | 15 | @Override 16 | public boolean dependsOnPlayer() { 17 | return true; 18 | } 19 | 20 | @Override 21 | public String[] createNames() { 22 | return new String[]{"locationy", "y"}; 23 | } 24 | 25 | 26 | @Override 27 | public void enableType() { 28 | } 29 | 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeLocationZ.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | 4 | import org.bukkit.entity.Player; 5 | import studio.magemonkey.genesis.core.GenesisBuy; 6 | import studio.magemonkey.genesis.core.GenesisShopHolder; 7 | 8 | public class GenesisConditionTypeLocationZ extends GenesisConditionTypeNumber { 9 | 10 | @Override 11 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 12 | return p.getLocation().getZ(); 13 | } 14 | 15 | @Override 16 | public boolean dependsOnPlayer() { 17 | return true; 18 | } 19 | 20 | @Override 21 | public String[] createNames() { 22 | return new String[]{"locationz", "z"}; 23 | } 24 | 25 | 26 | @Override 27 | public void enableType() { 28 | } 29 | 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeLightlevel.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | 4 | import org.bukkit.entity.Player; 5 | import studio.magemonkey.genesis.core.GenesisBuy; 6 | import studio.magemonkey.genesis.core.GenesisShopHolder; 7 | 8 | public class GenesisConditionTypeLightlevel extends GenesisConditionTypeNumber { 9 | 10 | @Override 11 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 12 | return p.getLocation().getBlock().getLightLevel(); 13 | } 14 | 15 | @Override 16 | public boolean dependsOnPlayer() { 17 | return true; 18 | } 19 | 20 | @Override 21 | public String[] createNames() { 22 | return new String[]{"lightlevel"}; 23 | } 24 | 25 | 26 | @Override 27 | public void enableType() { 28 | } 29 | 30 | 31 | } 32 | -------------------------------------------------------------------------------- /.github/workflows/maven.yml: -------------------------------------------------------------------------------- 1 | name: Build Artifacts 2 | 3 | on: 4 | pull_request: 5 | branches: [ main, dev ] 6 | 7 | jobs: 8 | build: 9 | 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/checkout@v4 14 | - name: Set up JDK 17 15 | uses: actions/setup-java@v4 16 | with: 17 | distribution: 'zulu' 18 | java-version: 21 19 | server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml 20 | settings-path: ${{ github.workspace }} # location for the settings.xml file 21 | gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} 22 | gpg-passphrase: MAVEN_GPG_PASSPHRASE 23 | - name: 'Create settings.xml' 24 | uses: s4u/maven-settings-action@v3.0.0 25 | with: 26 | githubServer: false 27 | - name: Build with Maven 28 | run: mvn clean package -e -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeRealYear.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | import java.util.Calendar; 8 | 9 | public class GenesisConditionTypeRealYear extends GenesisConditionTypeNumber { 10 | 11 | @Override 12 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 13 | return Calendar.getInstance().get(Calendar.YEAR); 14 | } 15 | 16 | @Override 17 | public boolean dependsOnPlayer() { 18 | return false; 19 | } 20 | 21 | @Override 22 | public String[] createNames() { 23 | return new String[]{"realyear", "year"}; 24 | } 25 | 26 | 27 | @Override 28 | public void enableType() { 29 | } 30 | 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeRealHour.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | import java.util.Calendar; 8 | 9 | public class GenesisConditionTypeRealHour extends GenesisConditionTypeNumber { 10 | 11 | @Override 12 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 13 | return Calendar.getInstance().get(Calendar.HOUR_OF_DAY); 14 | } 15 | 16 | @Override 17 | public boolean dependsOnPlayer() { 18 | return false; 19 | } 20 | 21 | @Override 22 | public String[] createNames() { 23 | return new String[]{"realhour", "hour"}; 24 | } 25 | 26 | 27 | @Override 28 | public void enableType() { 29 | } 30 | 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeRealMinute.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | import java.util.Calendar; 8 | 9 | public class GenesisConditionTypeRealMinute extends GenesisConditionTypeNumber { 10 | 11 | @Override 12 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 13 | return Calendar.getInstance().get(Calendar.MINUTE); 14 | } 15 | 16 | @Override 17 | public boolean dependsOnPlayer() { 18 | return false; 19 | } 20 | 21 | @Override 22 | public String[] createNames() { 23 | return new String[]{"realminute", "minute"}; 24 | } 25 | 26 | 27 | @Override 28 | public void enableType() { 29 | } 30 | 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeRealSecond.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | import java.util.Calendar; 8 | 9 | public class GenesisConditionTypeRealSecond extends GenesisConditionTypeNumber { 10 | 11 | @Override 12 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 13 | return Calendar.getInstance().get(Calendar.SECOND); 14 | } 15 | 16 | @Override 17 | public boolean dependsOnPlayer() { 18 | return false; 19 | } 20 | 21 | @Override 22 | public String[] createNames() { 23 | return new String[]{"realsecond", "second"}; 24 | } 25 | 26 | 27 | @Override 28 | public void enableType() { 29 | } 30 | 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeRealWeek.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | import java.util.Calendar; 8 | 9 | public class GenesisConditionTypeRealWeek extends GenesisConditionTypeNumber { 10 | 11 | @Override 12 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 13 | return Calendar.getInstance().get(Calendar.WEEK_OF_YEAR); 14 | } 15 | 16 | @Override 17 | public boolean dependsOnPlayer() { 18 | return false; 19 | } 20 | 21 | @Override 22 | public String[] createNames() { 23 | return new String[]{"realweek", "week"}; 24 | } 25 | 26 | 27 | @Override 28 | public void enableType() { 29 | } 30 | 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeHandItem.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.managers.misc.InputReader; 5 | import studio.magemonkey.genesis.misc.Misc; 6 | 7 | public class GenesisConditionTypeHandItem extends GenesisConditionTypeMatch { 8 | 9 | 10 | @Override 11 | public boolean matches(Player p, String singleCondition) { 12 | return Misc.getItemInMainHand(p).getType().equals(InputReader.readMaterial(singleCondition)); 13 | } 14 | 15 | 16 | @Override 17 | public boolean dependsOnPlayer() { 18 | return true; 19 | } 20 | 21 | @Override 22 | public String[] createNames() { 23 | return new String[]{"handitem", "itemhand", "mainitem", "iteminhand"}; 24 | } 25 | 26 | 27 | @Override 28 | public void enableType() { 29 | } 30 | 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeWeather.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | public class GenesisConditionTypeWeather extends GenesisConditionTypeMatch { 6 | 7 | 8 | @Override 9 | public boolean matches(Player p, String singleCondition) { 10 | if (singleCondition.equalsIgnoreCase("storm")) { 11 | return p.getWorld().hasStorm(); 12 | } else if (singleCondition.equalsIgnoreCase("clear")) { 13 | return !p.getWorld().hasStorm(); 14 | } 15 | return false; 16 | } 17 | 18 | 19 | @Override 20 | public boolean dependsOnPlayer() { 21 | return true; 22 | } 23 | 24 | @Override 25 | public String[] createNames() { 26 | return new String[]{"weather"}; 27 | } 28 | 29 | 30 | @Override 31 | public void enableType() { 32 | } 33 | 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeRealMillisecond.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | import java.util.Calendar; 8 | 9 | public class GenesisConditionTypeRealMillisecond extends GenesisConditionTypeNumber { 10 | 11 | @Override 12 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 13 | return Calendar.getInstance().get(Calendar.MILLISECOND); 14 | } 15 | 16 | @Override 17 | public boolean dependsOnPlayer() { 18 | return false; 19 | } 20 | 21 | @Override 22 | public String[] createNames() { 23 | return new String[]{"realmillisecond", "millisecond"}; 24 | } 25 | 26 | 27 | @Override 28 | public void enableType() { 29 | } 30 | 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeRealMonthDay.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | import java.util.Calendar; 8 | 9 | public class GenesisConditionTypeRealMonthDay extends GenesisConditionTypeNumber { 10 | 11 | @Override 12 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 13 | return Calendar.getInstance().get(Calendar.DAY_OF_MONTH); 14 | } 15 | 16 | @Override 17 | public boolean dependsOnPlayer() { 18 | return false; 19 | } 20 | 21 | @Override 22 | public String[] createNames() { 23 | return new String[]{"realmonthday", "realday", "monthday", "day"}; 24 | } 25 | 26 | 27 | @Override 28 | public void enableType() { 29 | } 30 | 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/serverpinging/ConnectedBuyItem.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.serverpinging; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import org.bukkit.inventory.ItemStack; 6 | import org.bukkit.inventory.meta.ItemMeta; 7 | import studio.magemonkey.genesis.core.GenesisBuy; 8 | 9 | import java.util.List; 10 | 11 | @Getter 12 | @AllArgsConstructor 13 | public class ConnectedBuyItem { 14 | private List originalLore; 15 | private String originalName; 16 | private GenesisBuy shopItem; 17 | 18 | public ConnectedBuyItem(GenesisBuy originalBuy, ItemStack menuItem) { 19 | this.shopItem = originalBuy; 20 | if (menuItem != null) { 21 | ItemMeta meta = menuItem.getItemMeta(); 22 | if (meta != null) { 23 | this.originalLore = meta.getLore(); 24 | this.originalName = meta.getDisplayName(); 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeGroup.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.managers.ClassManager; 5 | 6 | public class GenesisConditionTypeGroup extends GenesisConditionTypeMatch { 7 | 8 | 9 | @Override 10 | public boolean matches(Player p, String singleCondition) { 11 | return ClassManager.manager.getVaultHandler().getPermission().playerInGroup(p, singleCondition); 12 | } 13 | 14 | 15 | @Override 16 | public boolean dependsOnPlayer() { 17 | return true; 18 | } 19 | 20 | @Override 21 | public String[] createNames() { 22 | return new String[]{"group", "permissionsgroup"}; 23 | } 24 | 25 | 26 | @Override 27 | public void enableType() { 28 | ClassManager.manager.getSettings().setVaultEnabled(true); 29 | ClassManager.manager.getSettings().setPermissionsEnabled(true); 30 | } 31 | 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypePoints.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | import studio.magemonkey.genesis.managers.ClassManager; 7 | 8 | public class GenesisConditionTypePoints extends GenesisConditionTypeNumber { 9 | 10 | @Override 11 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 12 | return ClassManager.manager.getPointsManager().getPoints(p); 13 | } 14 | 15 | @Override 16 | public boolean dependsOnPlayer() { 17 | return true; 18 | } 19 | 20 | @Override 21 | public String[] createNames() { 22 | return new String[]{"points"}; 23 | } 24 | 25 | 26 | @Override 27 | public void enableType() { 28 | ClassManager.manager.getSettings().setPointsEnabled(true); 29 | } 30 | 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/events/GenesisLoadShopItemsEvent.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.events; 2 | 3 | 4 | import org.bukkit.event.HandlerList; 5 | import studio.magemonkey.genesis.core.GenesisShop; 6 | import studio.magemonkey.genesis.core.GenesisShops; 7 | 8 | 9 | public class GenesisLoadShopItemsEvent extends GenesisEvent { 10 | 11 | private static final HandlerList handlers = new HandlerList(); 12 | 13 | 14 | private final GenesisShop shop; 15 | private final GenesisShops shopHandler; 16 | 17 | 18 | public GenesisLoadShopItemsEvent(GenesisShops shopHandler, GenesisShop shop) { 19 | this.shop = shop; 20 | this.shopHandler = shopHandler; 21 | } 22 | 23 | public static HandlerList getHandlerList() { 24 | return handlers; 25 | } 26 | 27 | public GenesisShop getShop() { 28 | return shop; 29 | } 30 | 31 | public GenesisShops getShopHandler() { 32 | return shopHandler; 33 | } 34 | 35 | @Override 36 | public HandlerList getHandlers() { 37 | return handlers; 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /.github/workflows/dependabot-autoapprove.yml: -------------------------------------------------------------------------------- 1 | name: Dependabot auto-approve 2 | on: pull_request_target 3 | permissions: 4 | pull-requests: write 5 | jobs: 6 | dependabot: 7 | runs-on: ubuntu-latest 8 | # Checking the author will prevent your Action run failing on non-Dependabot PRs 9 | if: ${{ github.event.pull_request.user.login == 'dependabot[bot]' }} 10 | steps: 11 | - name: Dependabot metadata 12 | id: dependabot-metadata 13 | uses: dependabot/fetch-metadata@v1 14 | - uses: actions/checkout@v4 15 | - name: Approve a PR if not already approved 16 | run: | 17 | gh pr checkout "$PR_URL" # sets the upstream metadata for `gh pr status` 18 | if [ "$(gh pr status --json reviewDecision -q .currentBranch.reviewDecision)" != "APPROVED" ]; 19 | then gh pr review --approve "$PR_URL" 20 | else echo "PR already approved, skipping additional approvals to minimize emails/notification noise."; 21 | fi 22 | env: 23 | PR_URL: ${{github.event.pull_request.html_url}} 24 | GITHUB_TOKEN: ${{secrets.ACTIONS_PAT}} -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/external/spawners/SpawnersHandlerSilkSpawners.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.external.spawners; 2 | 3 | import de.dustplanet.util.SilkUtil; 4 | import org.bukkit.inventory.ItemStack; 5 | 6 | 7 | public class SpawnersHandlerSilkSpawners implements ISpawnerHandler, ISpawnEggHandler { 8 | 9 | private final SilkUtil util; 10 | 11 | 12 | public SpawnersHandlerSilkSpawners() { 13 | util = SilkUtil.hookIntoSilkSpanwers(); 14 | } 15 | 16 | public ItemStack transformSpawner(ItemStack i, String entityName) { 17 | return util.newSpawnerItem(entityName, null, i.getAmount(), false); 18 | } 19 | 20 | public ItemStack transformEgg(ItemStack i, String entityName) { 21 | return util.newEggItem(entityName, i.getAmount(), null); 22 | } 23 | 24 | 25 | public String readSpawner(ItemStack i) { 26 | return util.getCreatureName(util.getStoredSpawnerItemEntityID(i)); 27 | } 28 | 29 | public String readEgg(ItemStack i) { 30 | return util.getCreatureName(util.getStoredEggEntityID(i)); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/events/GenesisLoadShopItemEvent.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.events; 2 | 3 | 4 | import lombok.Getter; 5 | import lombok.RequiredArgsConstructor; 6 | import org.bukkit.configuration.ConfigurationSection; 7 | import org.bukkit.event.HandlerList; 8 | import studio.magemonkey.genesis.core.GenesisBuy; 9 | import studio.magemonkey.genesis.core.GenesisShop; 10 | 11 | @Getter 12 | @RequiredArgsConstructor 13 | public class GenesisLoadShopItemEvent extends GenesisEvent { 14 | 15 | private static final HandlerList handlers = new HandlerList(); 16 | 17 | 18 | private final GenesisShop shop; 19 | private final String shopItemName; 20 | private final ConfigurationSection configurationSection; 21 | 22 | private GenesisBuy customShopItem; 23 | 24 | public static HandlerList getHandlerList() { 25 | return handlers; 26 | } 27 | 28 | public void useCustomShopItem(GenesisBuy buy) { 29 | this.customShopItem = buy; 30 | } 31 | 32 | @Override 33 | public HandlerList getHandlers() { 34 | return handlers; 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 MageMonkeyStudio 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/studio/magemonkey/genesis/managers/misc/ItemDataConverter.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.misc; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.Material; 5 | import org.bukkit.material.MaterialData; 6 | 7 | import java.util.EnumSet; 8 | 9 | @SuppressWarnings("deprecation") 10 | public class ItemDataConverter { 11 | 12 | /** 13 | * Convert a material from old to new 14 | * 15 | * @param m material to get 16 | * @param data data value 17 | * @return material 18 | */ 19 | public static Material convertMaterial(Material m, byte data) { 20 | return Bukkit.getUnsafe().fromLegacy(new MaterialData(m, data)); 21 | } 22 | 23 | /** 24 | * Convert a material from old to new 25 | * 26 | * @param ID the id of the item 27 | * @param Data the data of the item 28 | * @return material 29 | */ 30 | public static Material convertMaterial(int ID, byte Data) { 31 | for (Material i : EnumSet.allOf(Material.class)) 32 | if (i.getId() == ID) return Bukkit.getUnsafe().fromLegacy(new MaterialData(i, Data)); 33 | return null; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/events/GenesisChoosePageLayoutEvent.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.events; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import org.bukkit.event.HandlerList; 6 | import studio.magemonkey.genesis.core.GenesisShop; 7 | import studio.magemonkey.genesis.managers.features.PageLayoutHandler; 8 | 9 | public class GenesisChoosePageLayoutEvent extends GenesisEvent { 10 | private static final HandlerList handlers = new HandlerList(); 11 | 12 | @Getter 13 | private final GenesisShop shop; 14 | private final String name; 15 | @Getter 16 | @Setter 17 | private PageLayoutHandler layout; 18 | 19 | 20 | public GenesisChoosePageLayoutEvent(GenesisShop shop, String name, PageLayoutHandler layout) { 21 | this.shop = shop; 22 | this.name = name; 23 | this.layout = layout; 24 | } 25 | 26 | public static HandlerList getHandlerList() { 27 | return handlers; 28 | } 29 | 30 | public String getShopItemName() { 31 | return name; 32 | } 33 | 34 | @Override 35 | public HandlerList getHandlers() { 36 | return handlers; 37 | } 38 | 39 | } -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/config/ConfigLoader.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.config; 2 | 3 | import org.apache.commons.lang3.Validate; 4 | import org.bukkit.Bukkit; 5 | import org.bukkit.configuration.InvalidConfigurationException; 6 | import org.bukkit.configuration.file.YamlConfiguration; 7 | 8 | import java.io.File; 9 | import java.io.FileNotFoundException; 10 | import java.io.IOException; 11 | import java.util.logging.Level; 12 | 13 | public class ConfigLoader { 14 | 15 | public static YamlConfiguration loadConfiguration(File file, boolean debug) throws InvalidConfigurationException { 16 | Validate.notNull(file, "File cannot be null"); 17 | 18 | YamlConfiguration config = new YamlConfiguration(); 19 | 20 | try { 21 | config.load(file); 22 | } catch (FileNotFoundException ex) { 23 | if (debug) 24 | Bukkit.getLogger().log(Level.SEVERE, "Cannot load " + file, ex); 25 | } catch (IOException ex) { 26 | if (debug) 27 | Bukkit.getLogger().log(Level.SEVERE, "Cannot load " + file, ex); 28 | } 29 | 30 | return config; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/misc/EnumUT.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.misc; 2 | 3 | import java.lang.reflect.Method; 4 | 5 | public class EnumUT { 6 | @SuppressWarnings("unchecked") 7 | public static T[] values(Class clazz) { 8 | try { 9 | Method method = clazz.getMethod("values"); 10 | return (T[]) method.invoke(null); 11 | } catch (Exception e) { 12 | return (T[]) new Object[0]; 13 | } 14 | } 15 | 16 | public static String name(Object obj) { 17 | String name = null; 18 | // Attempt to find and call the name method 19 | try { 20 | Method method = obj.getClass().getMethod("name"); 21 | name = (String) method.invoke(obj); 22 | } catch (Exception e) { 23 | // try the super class if applicable 24 | try { 25 | Method method = obj.getClass().getSuperclass().getMethod("name"); 26 | name = (String) method.invoke(obj); 27 | } catch (Exception e2) { 28 | } 29 | } 30 | 31 | if (name != null) name = name.replace('.', '_'); 32 | return name; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisSingleCondition.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | public class GenesisSingleCondition implements GenesisCondition { 8 | 9 | private final GenesisConditionType type; 10 | private final String conditiontype; 11 | private final String condition; 12 | 13 | 14 | public GenesisSingleCondition(GenesisConditionType type, String conditiontype, String condition) { 15 | this.type = type; 16 | this.conditiontype = conditiontype; 17 | this.condition = condition; 18 | } 19 | 20 | public boolean meetsCondition(GenesisShopHolder holder, GenesisBuy buy, Player p) { 21 | return type.meetsCondition(holder, buy, p, conditiontype, condition); 22 | } 23 | 24 | public GenesisConditionType getType() { 25 | return type; 26 | } 27 | 28 | public String getConditionType() { 29 | return conditiontype; 30 | } 31 | 32 | public String getCondition() { 33 | return condition; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/rewards/GenesisRewardTypeNumber.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.rewards; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.inventory.ClickType; 5 | import studio.magemonkey.genesis.core.GenesisBuy; 6 | import studio.magemonkey.genesis.core.prices.GenesisPriceType; 7 | import studio.magemonkey.genesis.managers.ClassManager; 8 | 9 | public abstract class GenesisRewardTypeNumber extends GenesisRewardType { 10 | 11 | 12 | public abstract boolean isIntegerValue(); 13 | 14 | @Override 15 | public boolean isPlayerDependend(GenesisBuy buy, ClickType clickType) { 16 | return super.isPlayerDependend(buy, clickType) || (buy.getPriceType(clickType) == GenesisPriceType.ItemAll 17 | && ClassManager.manager.getSettings().getItemAllShowFinalReward()); 18 | } 19 | 20 | @Override 21 | public boolean supportsMultipliers() { 22 | return true; 23 | } 24 | 25 | @Override 26 | public void giveReward(Player p, GenesisBuy buy, Object reward, ClickType clickType) { 27 | giveReward(p, buy, reward, clickType, 1); 28 | } 29 | 30 | public abstract void giveReward(Player p, GenesisBuy buy, Object reward, ClickType clickType, int multiplier); 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/features/StorageManager.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.features; 2 | 3 | import org.bukkit.configuration.file.FileConfiguration; 4 | import org.bukkit.configuration.file.YamlConfiguration; 5 | import studio.magemonkey.genesis.Genesis; 6 | 7 | import java.io.File; 8 | import java.io.IOException; 9 | 10 | public class StorageManager { 11 | 12 | 13 | private final String fileName = "data"; 14 | private final File file; 15 | private FileConfiguration config = null; 16 | 17 | public StorageManager(final Genesis plugin) { 18 | this.file = new File(plugin.getDataFolder().getAbsolutePath(), fileName); 19 | reloadConfig(); 20 | } 21 | 22 | public FileConfiguration getConfig() { 23 | if (config == null) 24 | reloadConfig(); 25 | 26 | return config; 27 | } 28 | 29 | public void reloadConfig() { 30 | config = YamlConfiguration.loadConfiguration(file); 31 | } 32 | 33 | public void saveConfig() { 34 | try { 35 | getConfig().save(file); 36 | } catch (IOException e) { 37 | Genesis.log("Could not save plugin data to " + file); 38 | } 39 | } 40 | 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/features/AutoRefreshHandler.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.features; 2 | 3 | import org.bukkit.scheduler.BukkitRunnable; 4 | import org.bukkit.scheduler.BukkitTask; 5 | import studio.magemonkey.genesis.Genesis; 6 | import studio.magemonkey.genesis.folia.CrossScheduler; 7 | 8 | public class AutoRefreshHandler { 9 | 10 | private int id = -1; 11 | 12 | public void start(int speed, Genesis plugin) { 13 | // TODO couldn't find proper solution for folia yet 14 | if (!CrossScheduler.isFolia()) { 15 | BukkitTask t = new AutoRefreshRunnable(plugin).runTaskTimer(plugin, speed, speed); 16 | id = t.getTaskId(); 17 | } 18 | } 19 | 20 | public void stop() { 21 | if (id == -1) { 22 | return; 23 | } 24 | CrossScheduler.cancelTask(id); 25 | } 26 | 27 | 28 | public class AutoRefreshRunnable extends BukkitRunnable { 29 | 30 | private final Genesis plugin; 31 | 32 | public AutoRefreshRunnable(Genesis plugin) { 33 | this.plugin = plugin; 34 | } 35 | 36 | @Override 37 | public void run() { 38 | plugin.getClassManager().getShops().refreshShops(false); 39 | } 40 | } 41 | 42 | } -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/pointsystem/GenesisPointsPluginTokenEnchant.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.pointsystem; 2 | 3 | import com.vk2gpz.tokenenchant.api.TokenEnchantAPI; 4 | import org.bukkit.OfflinePlayer; 5 | 6 | 7 | public class GenesisPointsPluginTokenEnchant extends GenesisPointsPlugin { 8 | 9 | public GenesisPointsPluginTokenEnchant() { 10 | super("TokenEnchant", "TokenEnchants", "TE"); 11 | } 12 | 13 | @Override 14 | public double getPoints(OfflinePlayer player) { 15 | return TokenEnchantAPI.getInstance().getTokens(player); 16 | } 17 | 18 | @Override 19 | public double setPoints(OfflinePlayer player, double points) { 20 | TokenEnchantAPI.getInstance().setTokens(player, points); 21 | return points; 22 | } 23 | 24 | @Override 25 | public double takePoints(OfflinePlayer player, double points) { 26 | TokenEnchantAPI.getInstance().removeTokens(player, points); 27 | return getPoints(player); 28 | } 29 | 30 | @Override 31 | public double givePoints(OfflinePlayer player, double points) { 32 | TokenEnchantAPI.getInstance().addTokens(player, points); 33 | return getPoints(player); 34 | } 35 | 36 | @Override 37 | public boolean usesDoubleValues() { 38 | return true; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/events/GenesisCheckStringForFeaturesEvent.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.events; 2 | 3 | import lombok.Getter; 4 | import org.bukkit.event.HandlerList; 5 | import studio.magemonkey.genesis.core.GenesisBuy; 6 | import studio.magemonkey.genesis.core.GenesisShop; 7 | 8 | public class GenesisCheckStringForFeaturesEvent extends GenesisEvent { 9 | 10 | private static final HandlerList handlers = new HandlerList(); 11 | 12 | 13 | @Getter 14 | private final String text; 15 | @Getter 16 | private final GenesisShop shop; 17 | private final GenesisBuy buy; 18 | 19 | private boolean containsFeature; 20 | 21 | 22 | public GenesisCheckStringForFeaturesEvent(String text, GenesisBuy item, GenesisShop shop) { 23 | this.text = text; 24 | this.buy = item; 25 | this.shop = shop; 26 | } 27 | 28 | public static HandlerList getHandlerList() { 29 | return handlers; 30 | } 31 | 32 | public GenesisBuy getShopItem() { 33 | return buy; 34 | } 35 | 36 | public void approveFeature() { 37 | containsFeature = true; 38 | } 39 | 40 | public boolean containsFeature() { 41 | return containsFeature; 42 | } 43 | 44 | @Override 45 | public HandlerList getHandlers() { 46 | return handlers; 47 | } 48 | 49 | } -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/pointsystem/GenesisPointsPluginGringotts.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.pointsystem; 2 | 3 | import org.bukkit.OfflinePlayer; 4 | import org.gestern.gringotts.Gringotts; 5 | 6 | public class GenesisPointsPluginGringotts extends GenesisPointsPlugin { 7 | public GenesisPointsPluginGringotts() { 8 | super("Gringotts"); 9 | } 10 | 11 | @Override 12 | public double getPoints(OfflinePlayer player) { 13 | return Gringotts.instance.getEco().player(player.getUniqueId()).balance(); 14 | } 15 | 16 | @Override 17 | public double setPoints(OfflinePlayer player, double points) { 18 | Gringotts.instance.getEco().player(player.getUniqueId()).setBalance(points); 19 | return getPoints(player); 20 | } 21 | 22 | @Override 23 | public double takePoints(OfflinePlayer player, double points) { 24 | Gringotts.instance.getEco().player(player.getUniqueId()).withdraw(points); 25 | return getPoints(player); 26 | } 27 | 28 | @Override 29 | public double givePoints(OfflinePlayer player, double points) { 30 | Gringotts.instance.getEco().player(player.getUniqueId()).deposit(points); 31 | return getPoints(player); 32 | } 33 | 34 | @Override 35 | public boolean usesDoubleValues() { 36 | return true; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionSet.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | 10 | public class GenesisConditionSet implements GenesisCondition { 11 | 12 | private final List conditions; 13 | 14 | 15 | public GenesisConditionSet() { 16 | conditions = new ArrayList<>(); 17 | } 18 | 19 | public GenesisConditionSet(List conditions) { 20 | this.conditions = conditions; 21 | } 22 | 23 | 24 | public void addCondition(GenesisCondition c) { 25 | conditions.add(c); 26 | } 27 | 28 | @Override 29 | public boolean meetsCondition(GenesisShopHolder holder, GenesisBuy buy, Player p) { 30 | for (GenesisCondition c : conditions) { 31 | if (!c.meetsCondition(holder, buy, p)) { 32 | return false; 33 | } 34 | } 35 | return true; 36 | } 37 | 38 | 39 | public boolean isEmpty() { 40 | return conditions.isEmpty(); 41 | } 42 | 43 | public List getConditions() { 44 | return conditions; 45 | } 46 | 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/serverpinging/ServerPingingRunnableHandler.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.serverpinging; 2 | 3 | import org.bukkit.scheduler.BukkitRunnable; 4 | import org.bukkit.scheduler.BukkitTask; 5 | import studio.magemonkey.genesis.Genesis; 6 | import studio.magemonkey.genesis.folia.CrossScheduler; 7 | 8 | public class ServerPingingRunnableHandler { 9 | 10 | private int id = -1; 11 | 12 | public void start(int speed, Genesis plugin, ServerPingingManager manager) { 13 | // TODO couldn't find proper solution for folia yet 14 | if (!CrossScheduler.isFolia()) { 15 | BukkitTask t = new ServerPingingRunnable(manager).runTaskTimerAsynchronously(plugin, speed, speed); 16 | id = t.getTaskId(); 17 | } 18 | } 19 | 20 | public void stop() { 21 | if (id == -1) { 22 | return; 23 | } 24 | CrossScheduler.cancelTask(id); 25 | } 26 | 27 | 28 | public class ServerPingingRunnable extends BukkitRunnable { 29 | 30 | private final ServerPingingManager manager; 31 | 32 | public ServerPingingRunnable(ServerPingingManager manager) { 33 | this.manager = manager; 34 | } 35 | 36 | 37 | @Override 38 | public void run() { 39 | manager.update(); 40 | } 41 | } 42 | 43 | } -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/pointsystem/GenesisPointsPluginJobs.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.pointsystem; 2 | 3 | import com.gamingmesh.jobs.Jobs; 4 | import org.bukkit.OfflinePlayer; 5 | 6 | public class GenesisPointsPluginJobs extends GenesisPointsPlugin { 7 | 8 | public GenesisPointsPluginJobs() { 9 | super("Jobs", "JobsReborn"); 10 | } 11 | 12 | @Override 13 | public double getPoints(OfflinePlayer player) { 14 | return Jobs.getPlayerManager().getJobsPlayer(player.getUniqueId()).getPointsData().getCurrentPoints(); 15 | } 16 | 17 | @Override 18 | public double setPoints(OfflinePlayer player, double points) { 19 | Jobs.getPlayerManager().getJobsPlayer(player.getUniqueId()).setPoints(points); 20 | return points; 21 | } 22 | 23 | @Override 24 | public double takePoints(OfflinePlayer player, double points) { 25 | Jobs.getPlayerManager().getJobsPlayer(player.getUniqueId()).takePoints(points); 26 | return getPoints(player); 27 | } 28 | 29 | @Override 30 | public double givePoints(OfflinePlayer player, double points) { 31 | Jobs.getPlayerManager().getJobsPlayer(player.getUniqueId()).addPoints(points); 32 | return getPoints(player); 33 | } 34 | 35 | @Override 36 | public boolean usesDoubleValues() { 37 | return true; 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeMoney.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | import studio.magemonkey.genesis.managers.ClassManager; 7 | 8 | public class GenesisConditionTypeMoney extends GenesisConditionTypeNumber { 9 | 10 | @Override 11 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 12 | if (ClassManager.manager.getVaultHandler() == null) { 13 | return 0; 14 | } 15 | if (ClassManager.manager.getVaultHandler().getEconomy() == null) { 16 | return 0; 17 | } 18 | if (ClassManager.manager.getVaultHandler().getEconomy().hasAccount(p.getName())) { 19 | return ClassManager.manager.getVaultHandler().getEconomy().getBalance(p.getName()); 20 | } 21 | return 0; 22 | } 23 | 24 | @Override 25 | public boolean dependsOnPlayer() { 26 | return true; 27 | } 28 | 29 | @Override 30 | public String[] createNames() { 31 | return new String[]{"money"}; 32 | } 33 | 34 | 35 | @Override 36 | public void enableType() { 37 | ClassManager.manager.getSettings().setVaultEnabled(true); 38 | ClassManager.manager.getSettings().setMoneyEnabled(true); 39 | } 40 | 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/prices/GenesisPriceTypeNothing.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.prices; 2 | 3 | 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.inventory.ClickType; 6 | import studio.magemonkey.genesis.core.GenesisBuy; 7 | import studio.magemonkey.genesis.managers.ClassManager; 8 | 9 | public class GenesisPriceTypeNothing extends GenesisPriceType { 10 | 11 | 12 | public Object createObject(Object o, boolean forceFinalState) { 13 | return null; 14 | } 15 | 16 | public boolean validityCheck(String itemName, Object o) { 17 | return true; 18 | } 19 | 20 | public void enableType() { 21 | } 22 | 23 | 24 | @Override 25 | public boolean hasPrice(Player p, GenesisBuy buy, Object price, ClickType clickType, boolean messageOnFailure) { 26 | return true; 27 | } 28 | 29 | @Override 30 | public String takePrice(Player p, GenesisBuy buy, Object price, ClickType clickType) { 31 | return ""; 32 | } 33 | 34 | @Override 35 | public String getDisplayPrice(Player p, GenesisBuy buy, Object price, ClickType clickType) { 36 | return ClassManager.manager.getMessageHandler().get("Display.Nothing"); 37 | } 38 | 39 | 40 | @Override 41 | public String[] createNames() { 42 | return new String[]{"nothing", "free"}; 43 | } 44 | 45 | @Override 46 | public boolean mightNeedShopUpdate() { 47 | return false; 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/events/GenesisPlayerPurchasedEvent.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.events; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.HandlerList; 5 | import org.bukkit.event.inventory.ClickType; 6 | import studio.magemonkey.genesis.core.GenesisBuy; 7 | import studio.magemonkey.genesis.core.GenesisShop; 8 | 9 | public class GenesisPlayerPurchasedEvent extends GenesisEvent { 10 | 11 | private static final HandlerList handlers = new HandlerList(); 12 | 13 | private final Player player; 14 | private final GenesisBuy buy; 15 | private final GenesisShop shop; 16 | private final ClickType clickType; 17 | 18 | 19 | public GenesisPlayerPurchasedEvent(Player player, GenesisShop shop, GenesisBuy buy, ClickType clickType) { 20 | this.player = player; 21 | this.buy = buy; 22 | this.shop = shop; 23 | this.clickType = clickType; 24 | } 25 | 26 | public static HandlerList getHandlerList() { 27 | return handlers; 28 | } 29 | 30 | public Player getPlayer() { 31 | return player; 32 | } 33 | 34 | public GenesisBuy getShopItem() { 35 | return buy; 36 | } 37 | 38 | public GenesisShop getShop() { 39 | return shop; 40 | } 41 | 42 | public ClickType getClickType() { 43 | return clickType; 44 | } 45 | 46 | @Override 47 | public HandlerList getHandlers() { 48 | return handlers; 49 | } 50 | 51 | } -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeRealWeekDay.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | import java.util.Calendar; 8 | 9 | public class GenesisConditionTypeRealWeekDay extends GenesisConditionTypeNumber { 10 | 11 | @Override 12 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 13 | int weekday = Calendar.getInstance().get(Calendar.DAY_OF_WEEK); 14 | 15 | switch (weekday) { 16 | case Calendar.MONDAY: 17 | return 1; 18 | case Calendar.TUESDAY: 19 | return 2; 20 | case Calendar.WEDNESDAY: 21 | return 3; 22 | case Calendar.THURSDAY: 23 | return 4; 24 | case Calendar.FRIDAY: 25 | return 5; 26 | case Calendar.SATURDAY: 27 | return 6; 28 | case Calendar.SUNDAY: 29 | return 7; 30 | } 31 | 32 | return 0; 33 | } 34 | 35 | @Override 36 | public boolean dependsOnPlayer() { 37 | return false; 38 | } 39 | 40 | @Override 41 | public String[] createNames() { 42 | return new String[]{"realweekday", "weekday"}; 43 | } 44 | 45 | 46 | @Override 47 | public void enableType() { 48 | } 49 | 50 | 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/events/GenesisCreatedShopItemEvent.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.events; 2 | 3 | 4 | import org.bukkit.configuration.ConfigurationSection; 5 | import org.bukkit.event.HandlerList; 6 | import org.bukkit.plugin.Plugin; 7 | import studio.magemonkey.genesis.core.GenesisBuy; 8 | import studio.magemonkey.genesis.core.GenesisShop; 9 | 10 | public class GenesisCreatedShopItemEvent extends GenesisEvent { 11 | 12 | private static final HandlerList handlers = new HandlerList(); 13 | 14 | 15 | private final GenesisShop shop; 16 | private final GenesisBuy item; 17 | private final ConfigurationSection section; 18 | 19 | 20 | public GenesisCreatedShopItemEvent(GenesisShop shop, GenesisBuy item, ConfigurationSection section) { 21 | this.shop = shop; 22 | this.item = item; 23 | this.section = section; 24 | } 25 | 26 | public static HandlerList getHandlerList() { 27 | return handlers; 28 | } 29 | 30 | public ConfigurationSection getConfigurationSection() { 31 | return section; 32 | } 33 | 34 | public GenesisBuy getShopItem() { 35 | return item; 36 | } 37 | 38 | public GenesisShop getShop() { 39 | return shop; 40 | } 41 | 42 | public void putSpecialInformation(Plugin plugin, Object information) { 43 | item.putSpecialInformation(plugin, information); 44 | } 45 | 46 | @Override 47 | public HandlerList getHandlers() { 48 | return handlers; 49 | } 50 | 51 | } -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/bungee/GenesisBungeeListener.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.bungee; 2 | 3 | import net.md_5.bungee.api.event.PluginMessageEvent; 4 | import net.md_5.bungee.api.plugin.Listener; 5 | import net.md_5.bungee.api.plugin.Plugin; 6 | import net.md_5.bungee.event.EventHandler; 7 | 8 | import java.io.ByteArrayInputStream; 9 | import java.io.DataInputStream; 10 | import java.io.IOException; 11 | 12 | public class GenesisBungeeListener implements Listener { 13 | 14 | private final Plugin plugin; 15 | 16 | public GenesisBungeeListener(Plugin plugin) { 17 | this.plugin = plugin; 18 | } 19 | 20 | 21 | @EventHandler 22 | public void onPluginMessage(PluginMessageEvent e) { 23 | 24 | if (e.getTag().equalsIgnoreCase("BungeeCord")) { 25 | DataInputStream dis = new DataInputStream(new ByteArrayInputStream(e.getData())); 26 | 27 | 28 | try { 29 | String subchannel = dis.readUTF(); 30 | 31 | 32 | if (subchannel.equalsIgnoreCase("Genesis")) { 33 | 34 | String type = dis.readUTF(); 35 | 36 | if (type.equalsIgnoreCase("Command")) { 37 | 38 | String command = dis.readUTF(); 39 | plugin.getProxy().getPluginManager().dispatchCommand(plugin.getProxy().getConsole(), command); 40 | 41 | } 42 | 43 | } 44 | 45 | } catch (IOException e1) { 46 | e1.printStackTrace(); 47 | } 48 | } 49 | 50 | } 51 | } -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeShopPage.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | public class GenesisConditionTypeShopPage extends GenesisConditionTypeNumber { 8 | @Override 9 | public boolean meetsCondition(GenesisShopHolder holder, 10 | GenesisBuy shopItem, 11 | Player p, 12 | String conditiontype, 13 | String condition) { 14 | return super.meetsCondition(holder, shopItem, p, conditiontype, transformLine(holder, condition)); 15 | } 16 | 17 | @Override 18 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 19 | return holder.getDisplayPage(); 20 | } 21 | 22 | @Override 23 | public boolean dependsOnPlayer() { 24 | return true; 25 | } 26 | 27 | @Override 28 | public String[] createNames() { 29 | return new String[]{"shoppage", "page"}; 30 | } 31 | 32 | 33 | @Override 34 | public void enableType() { 35 | } 36 | 37 | 38 | public String transformLine(GenesisShopHolder holder, String s) { 39 | s = s.replace("%maxpage%", String.valueOf(holder.getDisplayHighestPage())); 40 | s = s.replace("%maxshoppage%", String.valueOf(holder.getDisplayHighestPage())); 41 | return s; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /.github/update_version.py: -------------------------------------------------------------------------------- 1 | import re 2 | import sys 3 | 4 | is_dev = len(sys.argv) >= 2 and eval(sys.argv[1].lower().capitalize()) 5 | prep = not is_dev and len(sys.argv) >= 3 and bool(sys.argv[2]) 6 | 7 | 8 | def replace_version(): 9 | regex = r'^[ ]{4}((((\d+\.?)+)((-R(\d+)\.?)(\d+)?)?)(-SNAPSHOT)?)<\/version>$' 10 | with open('pom.xml', 'r') as pom: 11 | contents = pom.read() 12 | ver = re.findall(regex, contents, re.MULTILINE) 13 | version = ver[0][0] 14 | bare_version = ver[0][2] 15 | if is_dev: 16 | if not '-R' in version: 17 | new_version = version + '-R0.1-SNAPSHOT' 18 | elif not '-SNAPSHOT' in version: 19 | new_version = version + '.1-SNAPSHOT' 20 | else: 21 | r_version = ver[0][5] 22 | patch = int(ver[0][7]) + 1 23 | new_version = bare_version + r_version + str(patch) + '-SNAPSHOT' 24 | elif prep: 25 | r_version = int(ver[0][6]) + 1 26 | new_version = bare_version + '-R' + str(r_version) 27 | else: 28 | version = ver[0][2] 29 | minor = int(ver[0][3]) 30 | new_version = version[:-(len(str(minor)))] + str(minor + 1) 31 | contents = re.sub(regex, 32 | ' ' + new_version + '', 33 | contents, 34 | 1, 35 | re.MULTILINE) 36 | with open('pom.xml', 'w') as pom: 37 | pom.write(contents) 38 | 39 | 40 | replace_version() 41 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/pointsystem/GenesisPointsPluginPlayerPoints.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.pointsystem; 2 | 3 | import org.black_ixx.playerpoints.PlayerPoints; 4 | import org.bukkit.Bukkit; 5 | import org.bukkit.OfflinePlayer; 6 | import org.bukkit.plugin.Plugin; 7 | 8 | public class GenesisPointsPluginPlayerPoints extends GenesisPointsPlugin { 9 | private PlayerPoints pp; 10 | 11 | public GenesisPointsPluginPlayerPoints() { 12 | super("PlayerPoints", "PlayerPoint", "PP"); 13 | 14 | Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin("PlayerPoints"); 15 | if (plugin != null) { 16 | pp = ((PlayerPoints) plugin); 17 | } 18 | } 19 | 20 | @Override 21 | public double getPoints(OfflinePlayer player) { 22 | return pp.getAPI().look(player.getUniqueId()); 23 | } 24 | 25 | @Override 26 | public double setPoints(OfflinePlayer player, double points) { 27 | pp.getAPI().set(player.getUniqueId(), (int) points); 28 | return points; 29 | } 30 | 31 | @Override 32 | public double takePoints(OfflinePlayer player, double points) { 33 | pp.getAPI().take(player.getUniqueId(), (int) points); 34 | return getPoints(player); 35 | } 36 | 37 | @Override 38 | public double givePoints(OfflinePlayer player, double points) { 39 | pp.getAPI().give(player.getUniqueId(), (int) points); 40 | return getPoints(player); 41 | } 42 | 43 | @Override 44 | public boolean usesDoubleValues() { 45 | return false; 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /.github/notify_published.py: -------------------------------------------------------------------------------- 1 | import re 2 | import requests 3 | import simplejson as json 4 | import sys 5 | 6 | is_dev = len(sys.argv) >= 3 and bool(sys.argv[2]) 7 | search_string = \ 8 | r'Uploaded to (magemonkey-repo): (https:\/\/repo\.travja\.dev(:443)?\/.*?\/studio\/magemonkey\/(.*?)\/(.*?)\/(' \ 9 | r'.*?)(? read(ItemStack i, List output) { 44 | output.add("amount:" + i.getAmount()); 45 | return output; 46 | } 47 | 48 | @Override 49 | public boolean isSimilar(ItemStack shopItem, ItemStack playerItem, GenesisBuy buy, Player p) { 50 | return shopItem.getAmount() == playerItem.getAmount(); 51 | } 52 | 53 | 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/misc/userinput/AnvilTools.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.misc.userinput; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.inventory.InventoryType; 6 | import org.bukkit.inventory.Inventory; 7 | import org.bukkit.inventory.ItemStack; 8 | import org.bukkit.inventory.meta.ItemMeta; 9 | 10 | public class AnvilTools { 11 | 12 | 13 | /** 14 | * Open an anvil inventory for a player 15 | * 16 | * @param title the title of the inventory 17 | * @param item the item in the anvil 18 | * @param holder the holder 19 | * @param p the player to open for 20 | * @return opened inventory for player 21 | */ 22 | // WARNING: MIGHT NOT WORK WHEN USING OLDER MC BUILDS. 23 | public static Inventory openAnvilGui(String title, ItemStack item, GenesisAnvilHolder holder, Player p) { 24 | Inventory i = createAnvilGui(title, item, holder); 25 | p.openInventory(i); 26 | return i; 27 | } 28 | 29 | /** 30 | * Create anvil inventory 31 | * 32 | * @param title the title of inventory 33 | * @param item the item in the inventory 34 | * @param holder the holder 35 | * @return created anvil inventory 36 | */ 37 | public static Inventory createAnvilGui(String title, ItemStack item, GenesisAnvilHolder holder) { 38 | Inventory inventory = Bukkit.createInventory(holder, InventoryType.ANVIL); 39 | item = item.clone(); 40 | ItemMeta meta = item.getItemMeta(); 41 | meta.setDisplayName(title); 42 | item.setItemMeta(meta); 43 | inventory.setItem(0, item); 44 | holder.setInventory(inventory); 45 | return inventory; 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/item/ItemDataPartUnbreaking.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.item; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.inventory.ItemStack; 5 | import org.bukkit.inventory.meta.ItemMeta; 6 | import studio.magemonkey.genesis.core.GenesisBuy; 7 | import studio.magemonkey.genesis.managers.misc.InputReader; 8 | 9 | import java.util.List; 10 | 11 | public class ItemDataPartUnbreaking extends ItemDataPart { 12 | 13 | @Override 14 | public ItemStack transform(ItemStack item, String usedName, String argument) { 15 | boolean b = true; 16 | if (argument != null) { 17 | b = InputReader.getBoolean(argument, true); 18 | } 19 | ItemMeta meta = item.getItemMeta(); 20 | meta.setUnbreakable(b); 21 | item.setItemMeta(meta); 22 | return item; 23 | } 24 | 25 | @Override 26 | public int getPriority() { 27 | return PRIORITY_NORMAL; 28 | } 29 | 30 | @Override 31 | public boolean removeSpaces() { 32 | return true; 33 | } 34 | 35 | @Override 36 | public String[] createNames() { 37 | return new String[]{"unbreaking", "unbreakable"}; 38 | } 39 | 40 | @Override 41 | public boolean needsArgument() { 42 | return false; 43 | } 44 | 45 | 46 | @Override 47 | public List read(ItemStack i, List output) { 48 | ItemMeta meta = i.getItemMeta(); 49 | if (meta.isUnbreakable()) { 50 | output.add("unbreakable:true"); 51 | } 52 | return output; 53 | } 54 | 55 | 56 | @Override 57 | public boolean isSimilar(ItemStack shopItem, ItemStack playerItem, GenesisBuy buy, Player p) { 58 | return true; //Does not matter 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/misc/userinput/GenesisAnvilHolder.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.misc.userinput; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.inventory.Inventory; 5 | import org.bukkit.inventory.InventoryHolder; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public abstract class GenesisAnvilHolder implements InventoryHolder { 9 | 10 | private Inventory inventory; 11 | 12 | public GenesisAnvilHolder() { 13 | } 14 | 15 | public GenesisAnvilHolder(Inventory inventory) { 16 | this.inventory = inventory; 17 | } 18 | 19 | 20 | /** 21 | * Get the inventory 22 | * 23 | * @return inventory 24 | */ 25 | @Override 26 | public Inventory getInventory() { 27 | return inventory; 28 | } 29 | 30 | /** 31 | * Set the inventory 32 | * 33 | * @param i inventory 34 | */ 35 | public void setInventory(Inventory i) { 36 | this.inventory = i; 37 | } 38 | 39 | /** 40 | * Get the output text from the inventory 41 | * 42 | * @return output text 43 | */ 44 | public String getOutputText() { 45 | if (inventory != null) { 46 | ItemStack item = inventory.getItem(2); 47 | if (item 48 | != null) { // Somehow the item in the result slot (slot 3) always is null?! Even when one is displayed by client 49 | if (item.hasItemMeta()) { 50 | return item.getItemMeta().getDisplayName(); 51 | } 52 | } 53 | } 54 | return null; 55 | } 56 | 57 | 58 | /** 59 | * Check if player clicked result 60 | * 61 | * @param p player to check 62 | */ 63 | public abstract void userClickedResult(Player p); 64 | 65 | 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/events/GenesisDisplayItemEvent.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.events; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.Cancellable; 5 | import org.bukkit.event.HandlerList; 6 | import org.bukkit.inventory.Inventory; 7 | import studio.magemonkey.genesis.core.GenesisBuy; 8 | import studio.magemonkey.genesis.core.GenesisShop; 9 | 10 | public class GenesisDisplayItemEvent extends GenesisEvent implements Cancellable { 11 | 12 | private static final HandlerList handlers = new HandlerList(); 13 | 14 | private final Player player; 15 | 16 | private final GenesisBuy buy; 17 | 18 | private final GenesisShop shop; 19 | 20 | private final Inventory inventory; 21 | 22 | private boolean cancelled = false; 23 | 24 | public GenesisDisplayItemEvent(Player player, GenesisShop shop, GenesisBuy buy, Inventory inventory) { 25 | this.player = player; 26 | this.buy = buy; 27 | this.shop = shop; 28 | this.inventory = inventory; 29 | } 30 | 31 | public static HandlerList getHandlerList() { 32 | return handlers; 33 | } 34 | 35 | public Player getPlayer() { 36 | return player; 37 | } 38 | 39 | public GenesisBuy getShopItem() { 40 | return buy; 41 | } 42 | 43 | public GenesisShop getShop() { 44 | return shop; 45 | } 46 | 47 | public Inventory getInventory() { 48 | return inventory; 49 | } 50 | 51 | @Override 52 | public boolean isCancelled() { 53 | return cancelled; 54 | } 55 | 56 | @Override 57 | public void setCancelled(boolean cancelled) { 58 | this.cancelled = cancelled; 59 | } 60 | 61 | @Override 62 | public HandlerList getHandlers() { 63 | return handlers; 64 | } 65 | 66 | } -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/events/GenesisPlayerPurchaseEvent.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.events; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.Cancellable; 5 | import org.bukkit.event.HandlerList; 6 | import org.bukkit.event.inventory.ClickType; 7 | import studio.magemonkey.genesis.core.GenesisBuy; 8 | import studio.magemonkey.genesis.core.GenesisShop; 9 | 10 | public class GenesisPlayerPurchaseEvent extends GenesisEvent implements Cancellable { 11 | 12 | private static final HandlerList handlers = new HandlerList(); 13 | 14 | private final Player player; 15 | private final GenesisBuy buy; 16 | private final GenesisShop shop; 17 | private final ClickType clickType; 18 | 19 | private boolean cancelled = false; 20 | 21 | public GenesisPlayerPurchaseEvent(Player player, GenesisShop shop, GenesisBuy buy, ClickType clickType) { 22 | this.player = player; 23 | this.buy = buy; 24 | this.shop = shop; 25 | this.clickType = clickType; 26 | } 27 | 28 | public static HandlerList getHandlerList() { 29 | return handlers; 30 | } 31 | 32 | public Player getPlayer() { 33 | return player; 34 | } 35 | 36 | public GenesisBuy getShopItem() { 37 | return buy; 38 | } 39 | 40 | public GenesisShop getShop() { 41 | return shop; 42 | } 43 | 44 | public ClickType getClickType() { 45 | return clickType; 46 | } 47 | 48 | @Override 49 | public boolean isCancelled() { 50 | return cancelled; 51 | } 52 | 53 | @Override 54 | public void setCancelled(boolean cancelled) { 55 | this.cancelled = cancelled; 56 | } 57 | 58 | @Override 59 | public HandlerList getHandlers() { 60 | return handlers; 61 | } 62 | 63 | } -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeRealMonth.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | 7 | import java.util.Calendar; 8 | 9 | public class GenesisConditionTypeRealMonth extends GenesisConditionTypeNumber { 10 | 11 | @Override 12 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 13 | int month = Calendar.getInstance().get(Calendar.MONTH); 14 | 15 | switch (month) { 16 | case Calendar.JANUARY: 17 | return 1; 18 | case Calendar.FEBRUARY: 19 | return 2; 20 | case Calendar.MARCH: 21 | return 3; 22 | case Calendar.APRIL: 23 | return 4; 24 | case Calendar.MAY: 25 | return 5; 26 | case Calendar.JUNE: 27 | return 6; 28 | case Calendar.JULY: 29 | return 7; 30 | case Calendar.AUGUST: 31 | return 8; 32 | case Calendar.SEPTEMBER: 33 | return 9; 34 | case Calendar.OCTOBER: 35 | return 10; 36 | case Calendar.NOVEMBER: 37 | return 11; 38 | case Calendar.DECEMBER: 39 | return 12; 40 | } 41 | 42 | return 0; 43 | } 44 | 45 | @Override 46 | public boolean dependsOnPlayer() { 47 | return false; 48 | } 49 | 50 | @Override 51 | public String[] createNames() { 52 | return new String[]{"realmonth", "month"}; 53 | } 54 | 55 | 56 | @Override 57 | public void enableType() { 58 | } 59 | 60 | 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/misc/userinput/GenesisUserInput.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.misc.userinput; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.inventory.ItemStack; 5 | import studio.magemonkey.genesis.managers.ClassManager; 6 | 7 | public abstract class GenesisUserInput { 8 | 9 | 10 | /** 11 | * Get user input from anvil 12 | * 13 | * @param p the player to check 14 | * @param anvilText the text from anvil 15 | * @param anvilItem the item from anvil 16 | * @param chatText the chat text 17 | */ 18 | public void getUserInput(Player p, 19 | String anvilText, 20 | ItemStack anvilItem, 21 | String chatText) { // Might not receive input for sure 22 | if (supportsAnvils()) { 23 | AnvilTools.openAnvilGui(anvilText, 24 | anvilItem, 25 | new GenesisAnvilHolderUserInput(this), 26 | p); // Does not work atm 27 | return; 28 | } 29 | ClassManager.manager.getPlayerDataHandler() 30 | .requestInput(p, 31 | new GenesisChatUserInput(p, 32 | this, 33 | ClassManager.manager.getSettings().getInputTimeout() * 1000L)); 34 | ClassManager.manager.getMessageHandler() 35 | .sendMessageDirect(ClassManager.manager.getStringManager().transform(chatText, p), p); 36 | p.closeInventory(); 37 | } 38 | 39 | public abstract void receivedInput(Player p, String text); 40 | 41 | 42 | public boolean supportsAnvils() { 43 | return false; // Anvils are currently not working & when they are check for server version here 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | name: ${project.name} 2 | version: ${project.version} 3 | api-version: 1.13 4 | description: A powerful custom shop creator plugin 5 | authors: [ Black_ixx, MageMonkeyStudio ] 6 | main: studio.magemonkey.genesis.Genesis 7 | folia-supported: true 8 | softdepend: [ Divinity, ItemsAdder, MagicCosmetics, MythicMobs, PlayerShops GUI, ItemShops, ThirdCurrency, GuiShopManager, LimitedUses, TrickyShops, Vault, PlayerPoints, Jobs, Gringotts, VotingPlugin, SilkSpawners, PlaceholderAPI ] 9 | loadbefore: [ LimitedUses, ItemShops, PlayerShops, ThirdCurrency, GuiShopManager, TrickyShops ] 10 | libraries: [ org.apache.commons:commons-lang3:${apache.version} ] 11 | commands: 12 | gen: 13 | description: Genesis command 14 | genesis: 15 | description: Genesis command 16 | shop: 17 | description: Genesis command 18 | permissions: 19 | Genesis.open: 20 | description: Allows opening shops via command/sign 21 | default: op 22 | Genesis.open.sign: 23 | description: Allows opening shops via sign 24 | default: op 25 | Genesis.open.command: 26 | description: Allows opening shops via command 27 | default: op 28 | Genesis.open.other: 29 | description: Allows opening shops for other players 30 | default: op 31 | Genesis.close: 32 | description: Allows closing inventories of other players 33 | default: op 34 | Genesis.reload: 35 | description: Allows reloading the plugin 36 | default: op 37 | Genesis.createSign: 38 | description: Allows creating Genesis signs 39 | default: op 40 | Genesis.bypass: 41 | description: Allows to bypass the click delay 42 | default: op 43 | Genesis.read: 44 | description: Allows reading and generating itemdata of hold items 45 | default: op 46 | Genesis.create: 47 | description: Allows create shops 48 | default: op -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/misc/TimeTools.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.misc; 2 | 3 | import studio.magemonkey.genesis.managers.ClassManager; 4 | 5 | public class TimeTools { 6 | 7 | 8 | public final static int SECOND = 1; 9 | public final static int MINUTE = SECOND * 60; 10 | public final static int HOUR = MINUTE * 60; 11 | public final static int DAY = HOUR * 24; 12 | public final static int WEEK = DAY * 7; 13 | 14 | /** 15 | * Transform a long into time 16 | * 17 | * @param timeInSeconds the time to transform 18 | * @return transformed string 19 | */ 20 | public static String transform(long timeInSeconds) { 21 | if (timeInSeconds > WEEK) { 22 | return ClassManager.manager.getMessageHandler() 23 | .get("Time.Weeks") 24 | .replace("%time%", String.valueOf(timeInSeconds / WEEK)); 25 | } 26 | if (timeInSeconds > DAY) { 27 | return ClassManager.manager.getMessageHandler() 28 | .get("Time.Days") 29 | .replace("%time%", String.valueOf(timeInSeconds / DAY)); 30 | } 31 | if (timeInSeconds > HOUR) { 32 | return ClassManager.manager.getMessageHandler() 33 | .get("Time.Hours") 34 | .replace("%time%", String.valueOf(timeInSeconds / HOUR)); 35 | } 36 | if (timeInSeconds > MINUTE) { 37 | return ClassManager.manager.getMessageHandler() 38 | .get("Time.Minutes") 39 | .replace("%time%", String.valueOf(timeInSeconds / MINUTE)); 40 | } 41 | return ClassManager.manager.getMessageHandler() 42 | .get("Time.Seconds") 43 | .replace("%time%", String.valueOf(timeInSeconds)); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/misc/userinput/GenesisChatUserInput.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.misc.userinput; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.managers.ClassManager; 5 | 6 | import java.util.UUID; 7 | 8 | public class GenesisChatUserInput { 9 | 10 | private final UUID uuid; 11 | private final GenesisUserInput input; 12 | private final long time; 13 | 14 | 15 | public GenesisChatUserInput(Player p, GenesisUserInput input, long allowedDelay) { 16 | this.uuid = p.getUniqueId(); 17 | this.input = input; 18 | time = System.currentTimeMillis() + allowedDelay; 19 | 20 | if (ClassManager.manager.getSettings().getBungeeCordServerEnabled()) { 21 | ClassManager.manager.getBungeeCordManager().playerInputNotification(p, "start", String.valueOf(time)); 22 | } 23 | } 24 | 25 | 26 | /** 27 | * Check if time is up to date 28 | * 29 | * @return up to date 30 | */ 31 | public boolean isUpToDate() { 32 | return time > System.currentTimeMillis(); 33 | } 34 | 35 | /** 36 | * Check if it's the correct player being checked 37 | * 38 | * @param p player to check 39 | * @return correct or not 40 | */ 41 | public boolean isCorrectPlayer(Player p) { 42 | return p.getUniqueId().equals(uuid); 43 | } 44 | 45 | /** 46 | * Input received 47 | * 48 | * @param p the player to check 49 | * @param text string 50 | */ 51 | public void input(Player p, String text) { 52 | input.receivedInput(p, text); 53 | if (ClassManager.manager.getSettings().getBungeeCordServerEnabled()) { 54 | ClassManager.manager.getBungeeCordManager().playerInputNotification(p, "end", null); 55 | } 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/events/GenesisCreateShopItemEvent.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.events; 2 | 3 | 4 | import lombok.Getter; 5 | import lombok.RequiredArgsConstructor; 6 | import org.bukkit.configuration.ConfigurationSection; 7 | import org.bukkit.event.HandlerList; 8 | import studio.magemonkey.genesis.core.GenesisBuy; 9 | import studio.magemonkey.genesis.core.GenesisInputType; 10 | import studio.magemonkey.genesis.core.GenesisShop; 11 | import studio.magemonkey.genesis.core.conditions.GenesisCondition; 12 | import studio.magemonkey.genesis.core.prices.GenesisPriceType; 13 | import studio.magemonkey.genesis.core.rewards.GenesisRewardType; 14 | 15 | 16 | @Getter 17 | @RequiredArgsConstructor 18 | public class GenesisCreateShopItemEvent extends GenesisEvent { 19 | private static final HandlerList handlers = new HandlerList(); 20 | 21 | private final GenesisShop shop; 22 | private final String shopItemName; 23 | private final ConfigurationSection configurationSection; 24 | private final GenesisRewardType rewardType; 25 | private final GenesisPriceType priceType; 26 | private final Object reward, price; 27 | private final String message; 28 | private final int inventoryLocation; 29 | private final String extraPermission; 30 | private final GenesisCondition condition; 31 | private final GenesisInputType inputType; 32 | private final String inputText; 33 | private GenesisBuy customShopItem; 34 | 35 | public static HandlerList getHandlerList() { 36 | return handlers; 37 | } 38 | 39 | public void useCustomShopItem(GenesisBuy buy) { 40 | this.customShopItem = buy; 41 | } 42 | 43 | @Override 44 | public HandlerList getHandlers() { 45 | return handlers; 46 | } 47 | 48 | } -------------------------------------------------------------------------------- /src/main/resources/PlayerCommands.yml: -------------------------------------------------------------------------------- 1 | #Note: In order for commands to work properly players need to open the shop via main menu where they are forced to select a target. 2 | #Because of that simply do not give your players direct permissions to this shop. 3 | ShopName: PlayerCommandsSecret 4 | DisplayName: '&6&l%input% &0&lCommands' 5 | shop: 6 | reselecttarget: 7 | MenuItem: 8 | - name:&f&lSelect other player 9 | - lore:&8Click to select an other player. 10 | - amount:1 11 | - type:PLAYER_HEAD 12 | RewardType: SHOP 13 | ForceInput: PLAYER 14 | ForceInputMessage: '&8Enter the name of a player you want to select.' 15 | Reward: PlayerCommandsSecret 16 | PriceType: NOTHING 17 | Message: '' 18 | ExtraPermission: '' 19 | InventoryLocation: 1 20 | gamemode: 21 | MenuItem: 22 | - name:&f&lAdventure mode 23 | - lore:&8Set the gamemode of &l&6%input% &8to adventure mode. 24 | - amount:1 25 | - type:TORCH 26 | RewardType: PLAYERCOMMAND 27 | Reward: 28 | - 'gamemode 2 %input%' 29 | PriceType: NOTHING 30 | Message: '' 31 | ExtraPermission: '' 32 | InventoryLocation: 2 33 | msgtest: 34 | MenuItem: 35 | - name:&f&lTest message 36 | - lore:&8Send &l&6%input% &8a test message. 37 | - amount:1 38 | - type:PAPER 39 | RewardType: PLAYERCOMMAND 40 | Reward: 41 | - 'msg %input% this is a test' 42 | PriceType: NOTHING 43 | Message: '' 44 | ExtraPermission: '' 45 | InventoryLocation: 3 46 | kick: 47 | MenuItem: 48 | - name:&f&lKick 49 | - lore:&8Kick &l&6%input% &8from the server. 50 | - amount:1 51 | - type:DIAMOND_SWORD 52 | - itemflag:all 53 | RewardType: PLAYERCOMMAND 54 | Reward: 55 | - 'kick %input%' 56 | PriceType: NOTHING 57 | Message: '' 58 | ExtraPermission: '' 59 | InventoryLocation: 4 -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/pointsystem/GenesisPointsPluginTokenManager.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.pointsystem; 2 | 3 | import me.realized.tokenmanager.TokenManagerPlugin; 4 | import org.bukkit.OfflinePlayer; 5 | import org.bukkit.entity.Player; 6 | 7 | import java.util.OptionalLong; 8 | 9 | 10 | public class GenesisPointsPluginTokenManager extends GenesisPointsPlugin { 11 | private final TokenManagerPlugin tm; 12 | 13 | public GenesisPointsPluginTokenManager() { 14 | super("TokenManager", "TM"); 15 | tm = TokenManagerPlugin.getInstance(); 16 | } 17 | 18 | 19 | @Override 20 | public double getPoints(OfflinePlayer player) { 21 | if (player instanceof Player) { 22 | OptionalLong l = tm.getTokens((Player) player); 23 | return l.isPresent() ? l.getAsLong() : 0; 24 | } 25 | return -1; 26 | } 27 | 28 | @Override 29 | public double setPoints(OfflinePlayer player, double points) { 30 | if (player instanceof Player) { 31 | tm.setTokens((Player) player, (long) points); 32 | return points; 33 | } else { 34 | return -1; 35 | } 36 | } 37 | 38 | @Override 39 | public double takePoints(OfflinePlayer player, double points) { 40 | if (player instanceof Player) { 41 | return this.setPoints(player, this.getPoints(player) - points); 42 | } else { 43 | return -1; 44 | } 45 | } 46 | 47 | @Override 48 | public double givePoints(OfflinePlayer player, double points) { 49 | if (player instanceof Player) { 50 | return this.setPoints(player, this.getPoints(player) + points); 51 | } else { 52 | return -1; 53 | } 54 | } 55 | 56 | 57 | @Override 58 | public boolean usesDoubleValues() { 59 | return false; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/pointsystem/GenesisPointsAPI.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.pointsystem; 2 | 3 | import java.util.LinkedHashMap; 4 | 5 | public class GenesisPointsAPI { 6 | private static final LinkedHashMap interfaces = new LinkedHashMap<>(); 7 | 8 | /** 9 | * Register a points plugin 10 | * 11 | * @param points the points to register 12 | */ 13 | public static void register(GenesisPointsPlugin points) { 14 | interfaces.put(points.getName(), points); 15 | } 16 | 17 | /** 18 | * Get a points plugin object 19 | * 20 | * @param name name of points plugin 21 | * @return points plugin 22 | */ 23 | public static GenesisPointsPlugin get(String name) { 24 | if (name != null) { 25 | GenesisPointsPlugin p = interfaces.get(name); 26 | if (p != null) { 27 | return p; 28 | } 29 | for (GenesisPointsPlugin api : interfaces.values()) { 30 | if (api.getName().equalsIgnoreCase(name)) { 31 | return api; 32 | } 33 | } 34 | for (GenesisPointsPlugin api : interfaces.values()) { 35 | for (String nickname : api.getNicknames()) { 36 | if (nickname.equalsIgnoreCase(name)) { 37 | return api; 38 | } 39 | } 40 | } 41 | } 42 | return null; 43 | } 44 | 45 | /** 46 | * Get the first available points plugin 47 | * 48 | * @return points plugin 49 | */ 50 | public static GenesisPointsPlugin getFirstAvailable() { 51 | for (GenesisPointsPlugin api : interfaces.values()) { 52 | if (api.isAvailable()) { 53 | return api; 54 | } 55 | } 56 | return null; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/events/GenesisTransformStringEvent.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.events; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.HandlerList; 5 | import studio.magemonkey.genesis.core.GenesisBuy; 6 | import studio.magemonkey.genesis.core.GenesisShop; 7 | import studio.magemonkey.genesis.core.GenesisShopHolder; 8 | 9 | public class GenesisTransformStringEvent extends GenesisEvent { 10 | 11 | private static final HandlerList handlers = new HandlerList(); 12 | 13 | 14 | private String text; 15 | private final Player target; 16 | private final GenesisShop shop; 17 | private final GenesisBuy buy; 18 | private final GenesisShopHolder holder; 19 | 20 | 21 | public GenesisTransformStringEvent(String text, 22 | GenesisBuy item, 23 | GenesisShop shop, 24 | GenesisShopHolder holder, 25 | Player target) { 26 | this.text = text; 27 | this.buy = item; 28 | this.shop = shop; 29 | this.holder = holder; 30 | this.target = target; 31 | } 32 | 33 | public static HandlerList getHandlerList() { 34 | return handlers; 35 | } 36 | 37 | public String getText() { 38 | return text; 39 | } 40 | 41 | public void setText(String text) { 42 | this.text = text; 43 | } 44 | 45 | public Player getTarget() { 46 | return target; 47 | } 48 | 49 | public GenesisShop getShop() { 50 | return shop; 51 | } 52 | 53 | public GenesisBuy getShopItem() { 54 | return buy; 55 | } 56 | 57 | public GenesisShopHolder getShopHolder() { 58 | return holder; 59 | } 60 | 61 | @Override 62 | public HandlerList getHandlers() { 63 | return handlers; 64 | } 65 | 66 | } -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/prices/GenesisPriceTypeNumber.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.prices; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.inventory.ClickType; 5 | import studio.magemonkey.genesis.core.GenesisBuy; 6 | import studio.magemonkey.genesis.core.rewards.GenesisRewardType; 7 | import studio.magemonkey.genesis.managers.ClassManager; 8 | 9 | public abstract class GenesisPriceTypeNumber extends GenesisPriceType { 10 | 11 | 12 | public abstract boolean isIntegerValue(); 13 | 14 | @Override 15 | public boolean isPlayerDependend(GenesisBuy buy, ClickType clickType) { 16 | return super.isPlayerDependend(buy, clickType) || (buy.getRewardType(clickType) == GenesisRewardType.ItemAll 17 | && ClassManager.manager.getSettings().getItemAllShowFinalReward()); 18 | } 19 | 20 | @Override 21 | public boolean supportsMultipliers() { 22 | return true; 23 | } 24 | 25 | @Override 26 | public String takePrice(Player p, GenesisBuy buy, Object price, ClickType clickType) { 27 | return takePrice(p, buy, price, clickType, 1); 28 | } 29 | 30 | @Override 31 | public boolean hasPrice(Player p, GenesisBuy buy, Object price, ClickType clickType, boolean messageOnFailure) { 32 | return hasPrice(p, buy, price, clickType, 1, messageOnFailure); 33 | } 34 | 35 | 36 | public abstract String takePrice(Player p, GenesisBuy buy, Object price, ClickType clickType, int multiplier); 37 | 38 | public abstract boolean hasPrice(Player p, 39 | GenesisBuy buy, 40 | Object price, 41 | ClickType clickType, 42 | int multiplier, 43 | boolean messageOnFailure); 44 | 45 | public abstract String getDisplayBalance(Player p, GenesisBuy buy, Object price, ClickType clickType); 46 | 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/GenesisShopHolder.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import org.bukkit.inventory.Inventory; 6 | import org.bukkit.inventory.InventoryHolder; 7 | 8 | import java.util.HashMap; 9 | import java.util.Map; 10 | 11 | public class GenesisShopHolder implements InventoryHolder { 12 | 13 | @Getter 14 | private GenesisShopHolder previousShopHolder; 15 | @Getter 16 | private final GenesisShop shop; 17 | @Getter 18 | @Setter 19 | private int page, highestPage; 20 | private Map items; 21 | 22 | public GenesisShopHolder(GenesisShop shop, HashMap items) { 23 | this.shop = shop; 24 | this.items = items; 25 | } 26 | 27 | public GenesisShopHolder(GenesisShop shop, GenesisShopHolder previousShopHolder) { 28 | this(shop); 29 | this.previousShopHolder = previousShopHolder; 30 | } 31 | 32 | public GenesisShopHolder(GenesisShop shop) { 33 | this.shop = shop; 34 | } 35 | 36 | @Override 37 | public Inventory getInventory() { 38 | return null; 39 | } 40 | 41 | public GenesisBuy getShopItem(int i) { 42 | return items.get(i); 43 | } 44 | 45 | public int getSlot(GenesisBuy buy) { 46 | for (int slot : items.keySet()) { 47 | GenesisBuy value = items.get(slot); 48 | if (value == buy) { 49 | return slot; 50 | } 51 | } 52 | return -1; 53 | } 54 | 55 | 56 | public int getDisplayPage() { 57 | return page + 1; 58 | } 59 | 60 | public int getDisplayHighestPage() { 61 | return highestPage + 1; 62 | } 63 | 64 | public void setItems(Map items, int page, int highestPage) { 65 | this.items = items; 66 | this.page = page; 67 | this.highestPage = highestPage; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/item/ItemDataPartAxolotl.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.item; 2 | 3 | import org.bukkit.Material; 4 | import org.bukkit.entity.Axolotl; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.inventory.ItemStack; 7 | import org.bukkit.inventory.meta.AxolotlBucketMeta; 8 | import studio.magemonkey.genesis.core.GenesisBuy; 9 | import studio.magemonkey.genesis.managers.ClassManager; 10 | 11 | import java.util.List; 12 | 13 | public class ItemDataPartAxolotl extends ItemDataPart { 14 | @Override 15 | public ItemStack transform(ItemStack item, String usedName, String argument) { 16 | if (!item.getType().equals(Material.AXOLOTL_BUCKET)) { 17 | ClassManager.manager.getBugFinder() 18 | .severe("Mistake in Config: '" + argument + "' is not a valid '" + usedName 19 | + "'. The material must be AXOLOTL_BUCKET."); 20 | return item; 21 | } 22 | AxolotlBucketMeta meta = (AxolotlBucketMeta) item.getItemMeta(); 23 | meta.setVariant(Axolotl.Variant.valueOf(argument.toUpperCase())); 24 | item.setItemMeta(meta); 25 | return item; 26 | } 27 | 28 | @Override 29 | public boolean isSimilar(ItemStack shopItem, ItemStack playerItem, GenesisBuy buy, Player p) { 30 | return true; 31 | } 32 | 33 | @Override 34 | public List read(ItemStack i, List output) { 35 | AxolotlBucketMeta meta = (AxolotlBucketMeta) i.getItemMeta(); 36 | Axolotl.Variant variant = meta.getVariant(); 37 | output.add("axolotl:" + variant.name()); 38 | return output; 39 | } 40 | 41 | @Override 42 | public int getPriority() { 43 | return PRIORITY_NORMAL; 44 | } 45 | 46 | @Override 47 | public boolean removeSpaces() { 48 | return true; 49 | } 50 | 51 | @Override 52 | public String[] createNames() { 53 | return new String[]{"axolotl"}; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/serverpinging/ServerPingingList.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.serverpinging; 2 | 3 | import lombok.Getter; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | 6 | import java.util.LinkedHashMap; 7 | import java.util.List; 8 | import java.util.Map; 9 | import java.util.Vector; 10 | 11 | 12 | public class ServerPingingList { 13 | private final Map toAdd = new LinkedHashMap<>(); 14 | @Getter 15 | private final Map infos = new LinkedHashMap<>(); 16 | private final List toPing = new Vector<>(); 17 | 18 | 19 | public void update(ServerConnector currentConnector, boolean complete) { 20 | synchronized (toAdd) { 21 | for (String name : toAdd.keySet()) { 22 | ServerInfo info = toAdd.get(name); 23 | infos.put(name, info); 24 | toPing.add(info); 25 | } 26 | toAdd.clear(); 27 | } 28 | 29 | if (complete) { 30 | synchronized (toPing) { 31 | for (ServerInfo info : toPing) { 32 | info.update(currentConnector); 33 | } 34 | } 35 | } 36 | } 37 | 38 | 39 | public void addServerInfo(String name, ServerInfo info) { 40 | toAdd.put(name, info); 41 | } 42 | 43 | public ServerInfo getInfo(String name) { 44 | for (String s : infos.keySet()) { 45 | if (s.equalsIgnoreCase(name)) { 46 | return infos.get(s); 47 | } 48 | } 49 | return null; 50 | } 51 | 52 | public ServerInfo getFirstInfo(GenesisBuy buy) { 53 | for (ServerInfo info : infos.values()) { 54 | for (ConnectedBuyItem item : info.getConnectedBuyItems()) { 55 | if (item.getShopItem() == buy) { 56 | return info; 57 | } 58 | } 59 | } 60 | return null; 61 | } 62 | 63 | 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/features/PlayerDataHandler.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.features; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisShop; 5 | import studio.magemonkey.genesis.misc.userinput.GenesisChatUserInput; 6 | 7 | import java.util.HashMap; 8 | 9 | public class PlayerDataHandler { 10 | 11 | private final HashMap lastShop = new HashMap<>(); 12 | private final HashMap input = new HashMap<>(); 13 | private final HashMap inputWaiting = new HashMap<>(); 14 | 15 | public void openedShop(Player p, GenesisShop shop) { 16 | this.lastShop.put(p, shop); 17 | } 18 | 19 | /* 20 | * TODO: 21 | * - Add new input placeholder to the string manager 22 | * - Add an optional "input: " property to shopitems which will cause input to be requested and the item being bought after the input is defined 23 | */ 24 | 25 | public void requestInput(Player p, GenesisChatUserInput input) { 26 | this.inputWaiting.put(p, input); 27 | } 28 | 29 | public void removeInputRequest(Player p) { 30 | this.inputWaiting.remove(p); 31 | } 32 | 33 | public void enteredInput(Player p, String input) { 34 | this.input.put(p, input); 35 | } 36 | 37 | 38 | public void leftServer(Player p) { 39 | lastShop.remove(p); 40 | input.remove(p); 41 | inputWaiting.remove(p); 42 | } 43 | 44 | 45 | public String getInput(Player p) { 46 | if (input.containsKey(p)) { 47 | return input.get(p); 48 | } 49 | return "Player did not have the option to enter input! Shop seems to not be set up correctly."; 50 | } 51 | 52 | public GenesisChatUserInput getInputRequest(Player p) { 53 | return inputWaiting.get(p); 54 | } 55 | 56 | public GenesisShop getLastShop(Player p) { 57 | return lastShop.get(p); 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/api/GenesisAddonConfigurable.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.api; 2 | 3 | import org.bukkit.command.CommandSender; 4 | import org.bukkit.configuration.file.FileConfiguration; 5 | 6 | public abstract class GenesisAddonConfigurable extends GenesisAddon { 7 | 8 | 9 | private GenesisAddonConfig config; 10 | 11 | 12 | /** 13 | * Enables the config for the addon 14 | */ 15 | protected void enable() { 16 | config = new GenesisAddonConfig(this, "config"); 17 | super.enable(); 18 | } 19 | 20 | /** 21 | * Disables the addon for the config 22 | */ 23 | protected void disable() { 24 | super.disable(); 25 | if (saveConfigOnDisable()) { 26 | config.save(); 27 | } 28 | } 29 | 30 | /** 31 | * Reloads thje config for an addon 32 | * 33 | * @param sender the execute of the command 34 | */ 35 | public void reload(CommandSender sender) { 36 | config.reload(); 37 | super.reload(sender); 38 | } 39 | 40 | 41 | /** 42 | * Gets the config for the addon as a FileConfiguration 43 | * 44 | * @return config for addon 45 | */ 46 | @Override 47 | public FileConfiguration getConfig() { 48 | return config.getConfig(); 49 | } 50 | 51 | /** 52 | * Gets the config for the addon 53 | * 54 | * @return config for addon 55 | */ 56 | public GenesisAddonConfig getAddonConfig() { 57 | return config; 58 | } 59 | 60 | /** 61 | * Reloads the config 62 | */ 63 | @Override 64 | public void reloadConfig() { 65 | config.reload(); 66 | } 67 | 68 | /** 69 | * Saves the config 70 | */ 71 | @Override 72 | public void saveConfig() { 73 | config.save(); 74 | } 75 | 76 | /** 77 | * Determines whether or not to save the config when the addon is disabled 78 | * 79 | * @return save or not 80 | */ 81 | public abstract boolean saveConfigOnDisable(); 82 | 83 | 84 | } 85 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/pointsystem/GenesisPointsPluginKingdoms.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.pointsystem; 2 | 3 | import org.bukkit.OfflinePlayer; 4 | import org.kingdoms.constants.group.Kingdom; 5 | import org.kingdoms.constants.player.KingdomPlayer; 6 | 7 | public class GenesisPointsPluginKingdoms extends GenesisPointsPlugin { 8 | public GenesisPointsPluginKingdoms() { 9 | super("Kingdoms"); 10 | } 11 | 12 | @Override 13 | public double getPoints(OfflinePlayer player) { 14 | KingdomPlayer kp = KingdomPlayer.getKingdomPlayer(player); 15 | if (kp.getKingdom() != null) { 16 | Kingdom kingdom = kp.getKingdom(); 17 | if (kingdom != null) { 18 | return kingdom.getResourcePoints(); 19 | } 20 | } 21 | return 0; 22 | } 23 | 24 | @Override 25 | public double setPoints(OfflinePlayer player, double points) { 26 | KingdomPlayer kp = KingdomPlayer.getKingdomPlayer(player); 27 | if (kp.getKingdom() != null) { 28 | Kingdom kingdom = kp.getKingdom(); 29 | if (kingdom != null) { 30 | kingdom.setResourcePoints((long) points); 31 | return kingdom.getResourcePoints(); 32 | } 33 | } 34 | return 0; 35 | } 36 | 37 | @Override 38 | public double takePoints(OfflinePlayer player, double points) { 39 | return setPoints(player, (long) (getPoints(player) - points)); 40 | } 41 | 42 | @Override 43 | public double givePoints(OfflinePlayer player, double points) { 44 | KingdomPlayer kp = KingdomPlayer.getKingdomPlayer(player); 45 | if (kp.getKingdom() != null) { 46 | Kingdom kingdom = kp.getKingdom(); 47 | if (kingdom != null) { 48 | kingdom.addResourcePoints((long) points); 49 | return kingdom.getResourcePoints(); 50 | } 51 | } 52 | return 0; 53 | } 54 | 55 | @Override 56 | public boolean usesDoubleValues() { 57 | return true; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Build](https://github.com/magemonkeystudio/genesis/actions/workflows/release.yml/badge.svg?branch=main)](https://central.sonatype.com/repository/maven-snapshots/studio/magemonkey/genesis) 2 | [![Build](https://github.com/magemonkeystudio/genesis/actions/workflows/devbuild.yml/badge.svg?branch=dev)](https://central.sonatype.com/repository/maven-snapshots/studio/magemonkey/genesis) 3 | 4 | # Genesis 5 | 6 | Genesis is one of the most player-friendly and multifunctional GUI plugins ever! Say goodbye to all the annoying 7 | command- or signshops! 8 | It can not only be used to create shops but for every kind of menu. Here are just a few examples: 9 | 10 | * Shop (Buy or sell items) 11 | * Kits 12 | * A menu that allows players to execute commands with a simple click 13 | * Server selector (when having multiple servers connected) 14 | * Warp menu 15 | 16 | ## Project page 17 | 18 | More information about the project can be found here: [Link](https://www.spigotmc.org/resources/222/). The page includes 19 | a download-link as well. 20 | 21 | ## Building Genesis 22 | 23 | A few notes regarding building Genesis: the current state of the code, unfortunately, requires you to manually add (the 24 | jars of) a few other plugins to the project in order to be able to successfully build Genesis. As Genesis includes 25 | support for many different plugins, such as Kingdoms and EpicSpawners, you need to add those to the project (at least 26 | those, which I was not able to add directly via Maven). It requires some initial effort to download those plugins and 27 | add them to the project. 28 | 29 | One (in my opinion a dirty one) workaround might be to just remove the code of those plugins you do not care about 30 | anyways, skipping the step where you have to download the jars. This has been done by a few people already. Without 31 | having tested the code myself, here is a commit of a fork, where it was already attempted to remove that code: 32 | https://github.com/Megumiovo/BossShopPro/commit/319e8c13dfab33b73c1856428e638d1bc1b63698 33 | 34 | ## API 35 | 36 | Information regarding the Genesis API can be found here: [Link](https://www.spigotmc.org/wiki/bossshoppro-api/). 37 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/pointsystem/GenesisPointsPluginGadgetsMenu.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.pointsystem; 2 | 3 | import com.yapzhenyie.GadgetsMenu.api.GadgetsMenuAPI; 4 | import com.yapzhenyie.GadgetsMenu.player.PlayerManager; 5 | import org.bukkit.OfflinePlayer; 6 | import org.bukkit.entity.Player; 7 | 8 | 9 | public class GenesisPointsPluginGadgetsMenu extends GenesisPointsPlugin { 10 | 11 | 12 | public GenesisPointsPluginGadgetsMenu() { 13 | super("GadgetsMenu"); 14 | } 15 | 16 | 17 | @Override 18 | public double getPoints(OfflinePlayer player) { 19 | Player p = player.getPlayer(); 20 | if (p == null) { 21 | return 0; 22 | } 23 | PlayerManager playerManager = GadgetsMenuAPI.getPlayerManager(p); 24 | return playerManager.getMysteryDust(); 25 | } 26 | 27 | @Override 28 | public double setPoints(OfflinePlayer player, double points) { 29 | Player p = player.getPlayer(); 30 | if (p == null) { 31 | return -1; 32 | } 33 | PlayerManager playerManager = GadgetsMenuAPI.getPlayerManager(p); 34 | playerManager.setMysteryDust((int) points); 35 | return points; 36 | } 37 | 38 | @Override 39 | public double takePoints(OfflinePlayer player, double points) { 40 | Player p = player.getPlayer(); 41 | if (p == null) { 42 | return -1; 43 | } 44 | PlayerManager playerManager = GadgetsMenuAPI.getPlayerManager(p); 45 | playerManager.removeMysteryDust((int) points); 46 | return playerManager.getMysteryDust(); 47 | } 48 | 49 | @Override 50 | public double givePoints(OfflinePlayer player, double points) { 51 | Player p = player.getPlayer(); 52 | if (p == null) { 53 | return -1; 54 | } 55 | PlayerManager playerManager = GadgetsMenuAPI.getPlayerManager(p); 56 | playerManager.addMysteryDust((int) points); 57 | return playerManager.getMysteryDust(); 58 | } 59 | 60 | @Override 61 | public boolean usesDoubleValues() { 62 | return false; 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/inbuiltaddons/advancedshops/ActionSet.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.inbuiltaddons.advancedshops; 2 | 3 | import lombok.Getter; 4 | import studio.magemonkey.genesis.core.GenesisInputType; 5 | import studio.magemonkey.genesis.core.prices.GenesisPriceType; 6 | import studio.magemonkey.genesis.core.rewards.GenesisRewardType; 7 | import studio.magemonkey.genesis.managers.ClassManager; 8 | 9 | @Getter 10 | public class ActionSet { 11 | private final GenesisRewardType rewardType; 12 | private final GenesisPriceType priceType; 13 | 14 | private final Object reward; 15 | private final Object price; 16 | 17 | private final String message; 18 | 19 | private final GenesisInputType inputType; 20 | private final String inputText; 21 | 22 | private String extraPermission; 23 | private boolean extraPermissionGroup; 24 | 25 | 26 | public ActionSet(GenesisRewardType rewardType, 27 | GenesisPriceType priceType, 28 | Object reward, 29 | Object price, 30 | String message, 31 | String extraPermission, 32 | GenesisInputType inputType, 33 | String inputText) { 34 | this.rewardType = rewardType; 35 | this.priceType = priceType; 36 | this.reward = reward; 37 | this.price = price; 38 | this.message = message; 39 | this.inputType = inputType; 40 | this.inputText = inputText; 41 | 42 | if (extraPermission != null && extraPermission != "") { 43 | this.extraPermission = extraPermission; 44 | if (this.extraPermission.startsWith("[") && this.extraPermission.endsWith("]")) { 45 | if (this.extraPermission.length() > 2) { 46 | String group = this.extraPermission.substring(1, this.extraPermission.length() - 1); 47 | ClassManager.manager.getSettings().setVaultEnabled(true); 48 | this.extraPermission = group; 49 | extraPermissionGroup = true; 50 | } 51 | } 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/features/ItemDataStorage.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.features; 2 | 3 | import org.bukkit.configuration.file.FileConfiguration; 4 | import org.bukkit.configuration.file.YamlConfiguration; 5 | import studio.magemonkey.genesis.Genesis; 6 | 7 | import java.io.File; 8 | import java.io.IOException; 9 | import java.io.InputStream; 10 | import java.io.InputStreamReader; 11 | import java.text.SimpleDateFormat; 12 | import java.util.Date; 13 | import java.util.List; 14 | 15 | public class ItemDataStorage { 16 | 17 | 18 | private final Genesis plugin; 19 | private final String fileName = "ItemDataStorage.yml"; 20 | private final File file; 21 | private FileConfiguration config = null; 22 | private final SimpleDateFormat formatter = new SimpleDateFormat("yyyy dd-MM 'at' hh:mm:ss a (E)"); 23 | 24 | public ItemDataStorage(final Genesis plugin) { 25 | this.plugin = plugin; 26 | this.file = new File(plugin.getDataFolder().getAbsolutePath(), fileName); 27 | reloadConfig(); 28 | } 29 | 30 | public FileConfiguration getConfig() { 31 | if (config == null) 32 | reloadConfig(); 33 | 34 | return config; 35 | } 36 | 37 | public void reloadConfig() { 38 | config = YamlConfiguration.loadConfiguration(file); 39 | InputStream defConfigStream = plugin.getResource(fileName); 40 | if (defConfigStream != null) { 41 | YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(new InputStreamReader(defConfigStream)); 42 | config.setDefaults(defConfig); 43 | } 44 | } 45 | 46 | public void saveConfig() { 47 | try { 48 | getConfig().save(file); 49 | } catch (IOException e) { 50 | Genesis.log("Could not save " + fileName + " to " + file); 51 | } 52 | } 53 | 54 | public String getDate() { 55 | Date dNow = new Date(); 56 | return formatter.format(dNow); 57 | } 58 | 59 | public void addItemData(String playername, List itemdata) { 60 | config.set(playername + "." + getDate(), itemdata); 61 | saveConfig(); 62 | } 63 | 64 | 65 | } 66 | -------------------------------------------------------------------------------- /.github/workflows/devbuild.yml: -------------------------------------------------------------------------------- 1 | name: Dev Build 2 | 3 | on: 4 | push: 5 | branches: [ dev ] 6 | paths: [ src/** ] 7 | 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/checkout@v4 14 | name: Checkout repo 15 | with: 16 | token: ${{ secrets.ACTIONS_PAT }} 17 | - name: Configure git 18 | run: | 19 | git config user.name "Build Monkey" 20 | git config user.email "<>" 21 | - name: Set up JDK 17 22 | uses: actions/setup-java@v4 23 | with: 24 | distribution: 'zulu' 25 | java-version: 21 26 | server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml 27 | settings-path: ${{ github.workspace }} # location for the settings.xml file 28 | gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} 29 | gpg-passphrase: MAVEN_GPG_PASSPHRASE 30 | - name: 'Create settings.xml' 31 | uses: s4u/maven-settings-action@v3.0.0 32 | with: 33 | githubServer: false 34 | servers: '[{"id": "magemonkey-repo", "username": "${{ secrets.REPO_USERNAME }}", "password": "${{ secrets.DEPLOY_KEY }}"}]' 35 | - name: Publish to Travja Repo 36 | env: 37 | MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} 38 | run: | 39 | mvn clean deploy -P gpg,publish -DcreateChecksum=true 2>&1 | tee log.txt 40 | result_code=${PIPESTATUS[0]} 41 | exit $result_code 42 | - name: Tag release version 43 | run: | 44 | version=$(mvn org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate -Dexpression=project.version -q -DforceStdout) 45 | git tag -a $version -m "Dev $version" 46 | - name: Update version 47 | run: python ./.github/update_version.py true 48 | - name: Push to git 49 | run: | 50 | git add . 51 | git commit -m "[ci skip] Update dev version" 52 | git push 53 | git push --tags 54 | - name: Notify Discord 55 | run: | 56 | python -m venv .venv 57 | .venv/bin/pip install simplejson requests 58 | .venv/bin/python ./.github/notify_published.py ${{ secrets.BSP_WEBHOOK }} true 59 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/rewards/GenesisRewardTypeBungeeCordServer.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.rewards; 2 | 3 | 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.inventory.ClickType; 6 | import studio.magemonkey.genesis.core.GenesisBuy; 7 | import studio.magemonkey.genesis.managers.ClassManager; 8 | import studio.magemonkey.genesis.managers.misc.InputReader; 9 | 10 | 11 | public class GenesisRewardTypeBungeeCordServer extends GenesisRewardType { 12 | 13 | 14 | public Object createObject(Object o, boolean forceFinalState) { 15 | return InputReader.readString(o, true); 16 | } 17 | 18 | public boolean validityCheck(String itemName, Object o) { 19 | if (o != null) { 20 | return true; 21 | } 22 | ClassManager.manager.getBugFinder() 23 | .severe("Was not able to create ShopItem " + itemName 24 | + "! The reward object needs to be the name of connected BungeeCordServer (a single text line)."); 25 | return false; 26 | } 27 | 28 | public void enableType() { 29 | ClassManager.manager.getSettings().setBungeeCordServerEnabled(true); 30 | } 31 | 32 | @Override 33 | public boolean canBuy(Player p, GenesisBuy buy, boolean messageIfNoSuccess, Object reward, ClickType clickType) { 34 | return true; 35 | } 36 | 37 | @Override 38 | public void giveReward(Player p, GenesisBuy buy, Object reward, ClickType clickType) { 39 | String server = (String) reward; 40 | ClassManager.manager.getBungeeCordManager().sendToServer(server, p, ClassManager.manager.getPlugin()); 41 | } 42 | 43 | @Override 44 | public String getDisplayReward(Player p, GenesisBuy buy, Object reward, ClickType clickType) { 45 | String server = (String) reward; 46 | return ClassManager.manager.getMessageHandler().get("Display.BungeeCordServer").replace("%server%", server); 47 | } 48 | 49 | @Override 50 | public String[] createNames() { 51 | return new String[]{"bungeecordserver", "bungee"}; 52 | } 53 | 54 | public boolean logTransaction() { 55 | return false; 56 | } 57 | 58 | @Override 59 | public boolean mightNeedShopUpdate() { 60 | return false; 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/item/ItemDataPartKnowledgeBook.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.item; 2 | 3 | import org.bukkit.Material; 4 | import org.bukkit.NamespacedKey; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.inventory.ItemStack; 7 | import org.bukkit.inventory.meta.KnowledgeBookMeta; 8 | import studio.magemonkey.genesis.core.GenesisBuy; 9 | import studio.magemonkey.genesis.managers.ClassManager; 10 | 11 | import java.util.List; 12 | 13 | public class ItemDataPartKnowledgeBook extends ItemDataPart { 14 | @Override 15 | public ItemStack transform(ItemStack item, String usedName, String argument) { 16 | if (!item.getType().equals(Material.KNOWLEDGE_BOOK)) { 17 | ClassManager.manager.getBugFinder() 18 | .severe("Mistake in Config: '" + argument + "' is not a valid '" + usedName 19 | + "'. The material must be KNOWLEDGE_BOOK."); 20 | return item; 21 | } 22 | KnowledgeBookMeta meta = (KnowledgeBookMeta) item.getItemMeta(); 23 | NamespacedKey key = NamespacedKey.fromString(argument); 24 | meta.addRecipe(key); 25 | item.setItemMeta(meta); 26 | return item; 27 | } 28 | 29 | @Override 30 | public boolean isSimilar(ItemStack shopItem, ItemStack playerItem, GenesisBuy buy, Player p) { 31 | //TODO: implement comparison of two knowledge books. 32 | return shopItem.getType() != Material.KNOWLEDGE_BOOK && playerItem.getType() != Material.KNOWLEDGE_BOOK; 33 | } 34 | 35 | @Override 36 | public List read(ItemStack i, List output) { 37 | KnowledgeBookMeta meta = (KnowledgeBookMeta) i.getItemMeta(); 38 | if (meta.hasRecipes()) { 39 | for (NamespacedKey key : meta.getRecipes()) { 40 | output.add("knowledgebook:" + key.getNamespace() + ":" + key.getKey()); 41 | } 42 | } 43 | return output; 44 | } 45 | 46 | @Override 47 | public int getPriority() { 48 | return PRIORITY_NORMAL; 49 | } 50 | 51 | @Override 52 | public boolean removeSpaces() { 53 | return true; 54 | } 55 | 56 | @Override 57 | public String[] createNames() { 58 | return new String[]{"knowledgebook"}; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/resources/BungeeCordServers.yml: -------------------------------------------------------------------------------- 1 | ShopName: BungeeCordServers 2 | DisplayName: '&c&lBungeeCordServers' 3 | signs: 4 | text: '[BungeeCordServers]' 5 | NeedPermissionToCreateSign: true 6 | shop: 7 | EarthGame: 8 | MenuItem: 9 | - type:BROWN_TERRACOTTA 10 | - amount:1 11 | - name:&aEarth Game 12 | - lore:&7Click to connect! 13 | - durability:3 14 | RewardType: BUNGEECORDSERVER 15 | Reward: earthgame 16 | PriceType: NOTHING 17 | ExtraPermission: '' 18 | InventoryLocation: 2 19 | Creative: 20 | MenuItem: 21 | - type:BLUE_TERRACOTTA 22 | - amount:1 23 | - name:&aCreative 24 | - lore:&7Click to connect! 25 | RewardType: BUNGEECORDSERVER 26 | Reward: creative 27 | PriceType: NOTHING 28 | ExtraPermission: '' 29 | InventoryLocation: 3 30 | HungerGames: 31 | MenuItem: 32 | - type:YELLOW_TERRACOTTA 33 | - amount:1 34 | - name:&aHunger Games 35 | - lore:&7Click to connect! 36 | RewardType: BUNGEECORDSERVER 37 | Reward: hungergames 38 | PriceType: NOTHING 39 | ExtraPermission: '' 40 | InventoryLocation: 4 41 | Survival: 42 | MenuItem: 43 | - type:BLACK_TERRACOTTA 44 | - amount:1 45 | - name:&aSurvival 46 | - lore:&7Click to connect! 47 | RewardType: BUNGEECORDSERVER 48 | Reward: survival 49 | PriceType: NOTHING 50 | ExtraPermission: '' 51 | InventoryLocation: 5 52 | PvP: 53 | MenuItem: 54 | - type:RED_TERRACOTTA 55 | - amount:1 56 | - name:&aPvP 57 | - lore:&7Click to connect! 58 | RewardType: BUNGEECORDSERVER 59 | Reward: pvp 60 | PriceType: NOTHING 61 | ExtraPermission: '' 62 | InventoryLocation: 6 63 | Factions: 64 | MenuItem: 65 | - type:PURPLE_TERRACOTTA 66 | - amount:1 67 | - name:&aFactions 68 | - lore:&7Click to connect! 69 | RewardType: BUNGEECORDSERVER 70 | Reward: factions 71 | PriceType: NOTHING 72 | ExtraPermission: '' 73 | InventoryLocation: 7 74 | ZombieV: 75 | MenuItem: 76 | - type:GREEN_TERRACOTTA 77 | - amount:1 78 | - name:&aZombieV &6&ONew! 79 | - lore:&7Click to connect! 80 | RewardType: BUNGEECORDSERVER 81 | Reward: zombiev 82 | PriceType: NOTHING 83 | ExtraPermission: '' 84 | InventoryLocation: 8 85 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/external/VaultHandler.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.external; 2 | 3 | import net.milkbowl.vault.economy.Economy; 4 | import net.milkbowl.vault.permission.Permission; 5 | import org.bukkit.Bukkit; 6 | import org.bukkit.plugin.RegisteredServiceProvider; 7 | import studio.magemonkey.genesis.Genesis; 8 | import studio.magemonkey.genesis.managers.ClassManager; 9 | import studio.magemonkey.genesis.misc.NoEconomy; 10 | 11 | public class VaultHandler { 12 | 13 | private Permission perms; 14 | private Economy economy; 15 | 16 | public VaultHandler(boolean eco, boolean per) { 17 | Genesis.log("Vault found."); 18 | 19 | if (eco) { 20 | setupEconomy(); 21 | } 22 | if (per) { 23 | setupPermissions(); 24 | } 25 | 26 | } 27 | 28 | /////////////////////////////////////// 29 | 30 | private void setupEconomy() { 31 | RegisteredServiceProvider economyProvider = 32 | Bukkit.getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class); 33 | if (economyProvider == null) { 34 | ClassManager.manager.getBugFinder() 35 | .warn("No Economy Plugin was found... You need one if you want to work with Money! Get it there: http://plugins.bukkit.org/."); 36 | economy = new NoEconomy(); 37 | return; 38 | } 39 | economy = economyProvider.getProvider(); 40 | } 41 | 42 | private void setupPermissions() { 43 | RegisteredServiceProvider rsp = 44 | Bukkit.getServer().getServicesManager().getRegistration(Permission.class); 45 | if (rsp == null) { 46 | ClassManager.manager.getBugFinder() 47 | .warn("No Permissions Plugin was found... You need one if you want to work with Permissions or Permission Groups! Get it there: http://plugins.bukkit.org/"); 48 | return; 49 | } 50 | perms = rsp.getProvider(); 51 | } 52 | 53 | /////////////////////////////////////// 54 | 55 | public Permission getPermission() { 56 | return perms; 57 | } 58 | 59 | public Economy getEconomy() { 60 | return economy; 61 | } 62 | 63 | /////////////////////////////////////// 64 | 65 | 66 | } 67 | -------------------------------------------------------------------------------- /src/main/resources/LilyPadServers.yml: -------------------------------------------------------------------------------- 1 | ShopName: LilyPadServers 2 | DisplayName: '&c&lLilyPadServers' 3 | signs: 4 | text: '[LilyPadServers]' 5 | NeedPermissionToCreateSign: true 6 | shop: 7 | EarthGame: 8 | MenuItem: 9 | - lore:&7Click to connect! 10 | - name:&aEarth Game 11 | - amount:1 12 | - type:BROWN_TERRACOTTA 13 | RewardType: PLAYERCOMMAND 14 | Reward: 15 | - server earthgame 16 | PriceType: NOTHING 17 | Message: '' 18 | ExtraPermission: '' 19 | InventoryLocation: 2 20 | Creative: 21 | MenuItem: 22 | - type:BLUE_TERRACOTTA 23 | - amount:1 24 | - name:&aCreative 25 | - lore:&7Click to connect! 26 | RewardType: PLAYERCOMMAND 27 | Reward: server creative 28 | PriceType: NOTHING 29 | ExtraPermission: '' 30 | InventoryLocation: 3 31 | HungerGames: 32 | MenuItem: 33 | - type:YELLOW_TERRACOTTA 34 | - amount:1 35 | - name:&aHunger Games 36 | - lore:&7Click to connect! 37 | RewardType: PLAYERCOMMAND 38 | Reward: server hungergames 39 | PriceType: NOTHING 40 | ExtraPermission: '' 41 | InventoryLocation: 4 42 | Survival: 43 | MenuItem: 44 | - type:BLACK_TERRACOTTA 45 | - amount:1 46 | - name:&aSurvival 47 | - lore:&7Click to connect! 48 | RewardType: PLAYERCOMMAND 49 | Reward: server survival 50 | PriceType: NOTHING 51 | ExtraPermission: '' 52 | InventoryLocation: 5 53 | PvP: 54 | MenuItem: 55 | - type:RED_TERRACOTTA 56 | - amount:1 57 | - name:&aPvP 58 | - lore:&7Click to connect! 59 | RewardType: PLAYERCOMMAND 60 | Reward: server pvp 61 | PriceType: NOTHING 62 | ExtraPermission: '' 63 | InventoryLocation: 6 64 | Factions: 65 | MenuItem: 66 | - type:PURPLE_TERRACOTTA 67 | - amount:1 68 | - name:&aFactions 69 | - lore:&7Click to connect! 70 | RewardType: PLAYERCOMMAND 71 | Reward: server factions 72 | PriceType: NOTHING 73 | ExtraPermission: '' 74 | InventoryLocation: 7 75 | ZombieV: 76 | MenuItem: 77 | - type:GREEN_TERRACOTTA 78 | - amount:1 79 | - name:&aZombieV &6&ONew! 80 | - lore:&7Click to connect! 81 | RewardType: PLAYERCOMMAND 82 | Reward: server zombiev 83 | PriceType: NOTHING 84 | ExtraPermission: '' 85 | InventoryLocation: 8 -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/item/ItemDataPartTropicalFish.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.item; 2 | 3 | import org.bukkit.DyeColor; 4 | import org.bukkit.Material; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.entity.TropicalFish; 7 | import org.bukkit.inventory.ItemStack; 8 | import org.bukkit.inventory.meta.TropicalFishBucketMeta; 9 | import studio.magemonkey.genesis.core.GenesisBuy; 10 | import studio.magemonkey.genesis.managers.ClassManager; 11 | 12 | import java.util.List; 13 | 14 | public class ItemDataPartTropicalFish extends ItemDataPart { 15 | @Override 16 | public ItemStack transform(ItemStack item, String usedName, String argument) { 17 | if (!item.getType().equals(Material.TROPICAL_FISH_BUCKET)) { 18 | ClassManager.manager.getBugFinder() 19 | .severe("Mistake in Config: '" + argument + "' is not a valid '" + usedName 20 | + "'. The material must be TROPICAL_FISH_BUCKET."); 21 | return item; 22 | } 23 | TropicalFishBucketMeta meta = (TropicalFishBucketMeta) item.getItemMeta(); 24 | String[] parts = argument.split("#"); 25 | DyeColor color = DyeColor.valueOf(parts[0].toUpperCase()); 26 | TropicalFish.Pattern p = TropicalFish.Pattern.valueOf(parts[1].toUpperCase()); 27 | meta.setPatternColor(color); 28 | meta.setPattern(p); 29 | item.setItemMeta(meta); 30 | return item; 31 | } 32 | 33 | @Override 34 | public boolean isSimilar(ItemStack shopItem, ItemStack playerItem, GenesisBuy buy, Player p) { 35 | return true; 36 | } 37 | 38 | @Override 39 | public List read(ItemStack i, List output) { 40 | TropicalFishBucketMeta meta = (TropicalFishBucketMeta) i.getItemMeta(); 41 | TropicalFish.Pattern p = meta.getPattern(); 42 | DyeColor color = meta.getPatternColor(); 43 | output.add("tropicalfish:" + color.name() + "#" + p.name()); 44 | return output; 45 | } 46 | 47 | @Override 48 | public int getPriority() { 49 | return PRIORITY_NORMAL; 50 | } 51 | 52 | @Override 53 | public boolean removeSpaces() { 54 | return true; 55 | } 56 | 57 | @Override 58 | public String[] createNames() { 59 | return new String[]{"tropicalfish"}; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/pointsystem/GenesisPointsPluginVotingPlugin.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.pointsystem; 2 | 3 | import com.bencodez.votingplugin.VotingPluginMain; 4 | import org.bukkit.Bukkit; 5 | import org.bukkit.OfflinePlayer; 6 | import org.bukkit.entity.Player; 7 | 8 | 9 | public class GenesisPointsPluginVotingPlugin extends GenesisPointsPlugin { 10 | public GenesisPointsPluginVotingPlugin() { 11 | super("VotingPlugin", "VP"); 12 | } 13 | 14 | @Override 15 | public double getPoints(OfflinePlayer player) { 16 | VotingPluginMain votingPlugin = (VotingPluginMain) Bukkit.getPluginManager().getPlugin("VotingPlugin"); 17 | if (player instanceof Player) { 18 | return votingPlugin.getVotingPluginUserManager().getVotingPluginUser(player).getPoints(); 19 | } else { 20 | return 0; 21 | } 22 | } 23 | 24 | @Override 25 | public double setPoints(OfflinePlayer player, double points) { 26 | VotingPluginMain votingPlugin = (VotingPluginMain) Bukkit.getPluginManager().getPlugin("VotingPlugin"); 27 | if (player instanceof Player) { 28 | votingPlugin.getVotingPluginUserManager().getVotingPluginUser(player).setPoints((int) points); 29 | return points; 30 | } else { 31 | return 0; 32 | } 33 | } 34 | 35 | @Override 36 | public double takePoints(OfflinePlayer player, double points) { 37 | VotingPluginMain votingPlugin = (VotingPluginMain) Bukkit.getPluginManager().getPlugin("VotingPlugin"); 38 | if (player instanceof Player) { 39 | votingPlugin.getVotingPluginUserManager().getVotingPluginUser(player).removePoints((int) points); 40 | return points; 41 | } else { 42 | return 0; 43 | } 44 | } 45 | 46 | @Override 47 | public double givePoints(OfflinePlayer player, double points) { 48 | VotingPluginMain votingPlugin = (VotingPluginMain) Bukkit.getPluginManager().getPlugin("VotingPlugin"); 49 | if (player instanceof Player) { 50 | votingPlugin.getVotingPluginUserManager().getVotingPluginUser(player).addPoints((int) points); 51 | return getPoints(player); 52 | } else { 53 | return 0; 54 | } 55 | } 56 | 57 | 58 | @Override 59 | public boolean usesDoubleValues() { 60 | return false; 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/item/ItemDataPartItemModel.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.item; 2 | 3 | import org.bukkit.NamespacedKey; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.inventory.ItemStack; 6 | import org.bukkit.inventory.meta.ItemMeta; 7 | import studio.magemonkey.genesis.core.GenesisBuy; 8 | import studio.magemonkey.genesis.managers.ClassManager; 9 | import studio.magemonkey.genesis.managers.misc.InputReader; 10 | 11 | import java.util.List; 12 | import java.util.Objects; 13 | 14 | public class ItemDataPartItemModel extends ItemDataPart { 15 | @Override 16 | public ItemStack transform(ItemStack item, String usedName, String argument) { 17 | String itemModel = InputReader.readString(argument, true); 18 | if (itemModel == null || itemModel.isBlank()) { 19 | ClassManager.manager.getBugFinder() 20 | .severe("Mistake in Config: '" + argument + "' is not a valid '" + usedName 21 | + "'. It needs to be a string."); 22 | return item; 23 | } 24 | ItemMeta meta = item.getItemMeta(); 25 | if (meta == null) { 26 | return item; 27 | } 28 | 29 | meta.setItemModel(NamespacedKey.fromString(itemModel)); 30 | item.setItemMeta(meta); 31 | return item; 32 | } 33 | 34 | @Override 35 | public boolean isSimilar(ItemStack shopItem, ItemStack playerItem, GenesisBuy buy, Player p) { 36 | NamespacedKey shopItemModel = shopItem.hasItemMeta() ? shopItem.getItemMeta().getItemModel() : null; 37 | NamespacedKey playerItemModel = playerItem.hasItemMeta() ? playerItem.getItemMeta().getItemModel() : null; 38 | return Objects.equals(shopItemModel, playerItemModel); 39 | } 40 | 41 | @Override 42 | public List read(ItemStack i, List output) { 43 | if (i.hasItemMeta() && i.getItemMeta().hasItemModel()) { 44 | String d = i.getItemMeta().getItemModel().getKey(); 45 | output.add("ItemModel:" + d); 46 | } 47 | return output; 48 | } 49 | 50 | @Override 51 | public int getPriority() { 52 | return PRIORITY_NORMAL; 53 | } 54 | 55 | @Override 56 | public boolean removeSpaces() { 57 | return false; 58 | } 59 | 60 | @Override 61 | public String[] createNames() { 62 | return new String[]{"ItemModel"}; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/misc/ShopItemPurchaseTask.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.misc; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.inventory.ClickType; 6 | import org.bukkit.event.inventory.InventoryClickEvent; 7 | import studio.magemonkey.genesis.core.GenesisBuy; 8 | import studio.magemonkey.genesis.core.GenesisShop; 9 | import studio.magemonkey.genesis.core.GenesisShopHolder; 10 | import studio.magemonkey.genesis.core.prices.GenesisPriceType; 11 | import studio.magemonkey.genesis.core.rewards.GenesisRewardType; 12 | import studio.magemonkey.genesis.managers.ClassManager; 13 | 14 | import java.util.UUID; 15 | 16 | public class ShopItemPurchaseTask implements Runnable { 17 | 18 | 19 | private final UUID uuid; 20 | private final GenesisBuy buy; 21 | private final GenesisShop shop; 22 | private final GenesisShopHolder holder; 23 | private final ClickType clickType; 24 | private final GenesisRewardType rewardtype; 25 | private final GenesisPriceType priceType; 26 | private final InventoryClickEvent event; 27 | 28 | public ShopItemPurchaseTask(Player p, 29 | GenesisBuy buy, 30 | GenesisShop shop, 31 | GenesisShopHolder holder, 32 | ClickType clickType, 33 | GenesisRewardType rewardtype, 34 | GenesisPriceType priceType, 35 | InventoryClickEvent event) { 36 | this.uuid = p.getUniqueId(); 37 | this.buy = buy; 38 | this.shop = shop; 39 | this.holder = holder; 40 | this.clickType = clickType; 41 | this.rewardtype = rewardtype; 42 | this.priceType = priceType; 43 | this.event = event; 44 | } 45 | 46 | @SuppressWarnings("deprecation") 47 | @Override 48 | public void run() { 49 | Player p = Bukkit.getPlayer(uuid); 50 | 51 | if (p != null) { 52 | buy.purchase(p, 53 | shop, 54 | holder, 55 | clickType, 56 | rewardtype, 57 | priceType, 58 | event, 59 | ClassManager.manager.getPlugin(), 60 | true); 61 | } 62 | } 63 | 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/item/ItemDataPartGlowing.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.item; 2 | 3 | import org.bukkit.NamespacedKey; 4 | import org.bukkit.enchantments.Enchantment; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.inventory.ItemFlag; 7 | import org.bukkit.inventory.ItemStack; 8 | import org.bukkit.inventory.meta.ItemMeta; 9 | import studio.magemonkey.genesis.core.GenesisBuy; 10 | import studio.magemonkey.genesis.managers.misc.InputReader; 11 | 12 | import java.util.List; 13 | 14 | public class ItemDataPartGlowing extends ItemDataPart { 15 | @Override 16 | public ItemStack transform(ItemStack item, String usedName, String argument) { 17 | boolean b = false; 18 | if (argument != null) { 19 | b = InputReader.getBoolean(argument, false); 20 | } 21 | if (b) { 22 | item.addUnsafeEnchantment(Enchantment.getByKey(NamespacedKey.minecraft("respiration")), 1); 23 | ItemMeta meta = item.getItemMeta(); 24 | meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); 25 | item.setItemMeta(meta); 26 | } 27 | return item; 28 | } 29 | 30 | @Override 31 | public boolean isSimilar(ItemStack shopItem, ItemStack playerItem, GenesisBuy buy, Player p) { 32 | ItemMeta shop = shopItem.getItemMeta(); 33 | ItemMeta player = playerItem.getItemMeta(); 34 | return (shop.hasEnchant(Enchantment.getByKey(NamespacedKey.minecraft("respiration"))) && shop.hasItemFlag( 35 | ItemFlag.HIDE_ENCHANTS)) == ( 36 | player.hasEnchant(Enchantment.getByKey(NamespacedKey.minecraft("respiration"))) && player.hasItemFlag( 37 | ItemFlag.HIDE_ENCHANTS)); 38 | } 39 | 40 | @Override 41 | public List read(ItemStack i, List output) { 42 | ItemMeta meta = i.getItemMeta(); 43 | if (meta.hasItemFlag(ItemFlag.HIDE_ENCHANTS) & meta.hasEnchant(Enchantment.getByKey(NamespacedKey.minecraft( 44 | "respiration")))) { 45 | output.add("glowing:true"); 46 | } 47 | return output; 48 | } 49 | 50 | @Override 51 | public int getPriority() { 52 | return PRIORITY_NORMAL; 53 | } 54 | 55 | @Override 56 | public boolean removeSpaces() { 57 | return true; 58 | } 59 | 60 | @Override 61 | public String[] createNames() { 62 | return new String[]{"glowing"}; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/resources/HugeShop.yml: -------------------------------------------------------------------------------- 1 | ShopName: HugeShop 2 | DisplayName: '&l&nPages demonstration' 3 | signs: 4 | text: '[hugeshop]' 5 | NeedPermissionToCreateSign: true 6 | shop: 7 | book: 8 | MenuItem: 9 | - lore:&cThis example item costs %price% 10 | - amount:1 11 | - type:WRITTEN_BOOK 12 | - 'book:&lExample Book#&6Black_ixx' 13 | RewardType: ITEM 14 | Reward: 15 | - - type:WRITTEN_BOOK 16 | - amount:1 17 | - 'book:&lExample Book#&6Black_ixx' 18 | - bookpage:1#Hello World. This is some text at page 1.&0 19 | - bookpage:1#&0 20 | - bookpage:1#&0Color codes:&0 21 | - bookpage:1#&0&11 &22 &33 &44 &55 &66 &77 &88 &99 &00 &aa &bb &cc &dd &ee &ff&r &kk&r &ll&r &mm&r &nn&r &oo&r &rr&0 22 | - bookpage:1#&0 23 | - bookpage:1#&0 24 | - bookpage:1#&0 25 | - bookpage:1#&0 26 | - bookpage:1#&0 27 | - bookpage:1#&0 28 | - bookpage:1#&0 29 | - bookpage:1#&0End of page 1. 30 | - bookpage:2#&4&l&nRules&0 31 | - bookpage:2#&0- Do not &csteal&0 32 | - bookpage:2#&0- Do not &cspam&0 33 | - bookpage:2#&0- Do not &cgrief&0 34 | - bookpage:2#&0- Be friendly&0 35 | - bookpage:3#&l&nShop introduction&0 36 | - bookpage:3#&0 37 | - bookpage:3#&0Use '&1/shop&0' in order to open the server shop menu. 38 | PriceType: NOTHING 39 | Message: '&7You just got an example book for free!' 40 | ExtraPermission: '' 41 | InventoryLocation: 1 42 | stone2: 43 | MenuItem: 44 | - lore:&cThis example item costs %price% 45 | - name:&4&lExample Item 2 46 | - amount:1 47 | - type:COBBLESTONE 48 | RewardType: ITEM 49 | Reward: 50 | - - name:&8&l%player%'s stone 51 | - amount:1 52 | - type:COBBLESTONE 53 | PriceType: MONEY 54 | Price: 1000.0 55 | Message: '&7You just purchased an example item for %price%!' 56 | ExtraPermission: '' 57 | InventoryLocation: 46 58 | stone3: 59 | MenuItem: 60 | - lore:&cThis example item costs %price% 61 | - name:&4&lExample Item 3 62 | - amount:1 63 | - type:SANDSTONE 64 | RewardType: ITEM 65 | Reward: 66 | - - name:&8&l%player%'s stone 67 | - amount:1 68 | - type:SANDSTONE 69 | PriceType: MONEY 70 | Price: 1000.0 71 | Message: '&7You just purchased an example item for %price%!' 72 | ExtraPermission: '' 73 | InventoryLocation: 91 74 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/rewards/GenesisRewardTypeShop.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.rewards; 2 | 3 | 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.inventory.ClickType; 6 | import studio.magemonkey.genesis.core.GenesisBuy; 7 | import studio.magemonkey.genesis.managers.ClassManager; 8 | import studio.magemonkey.genesis.managers.misc.InputReader; 9 | 10 | 11 | public class GenesisRewardTypeShop extends GenesisRewardType { 12 | 13 | 14 | public Object createObject(Object o, boolean forceFinalState) { 15 | return InputReader.readString(o, true); 16 | } 17 | 18 | public boolean validityCheck(String itemName, Object o) { 19 | if (o != null) { 20 | return true; 21 | } 22 | ClassManager.manager.getBugFinder() 23 | .severe("Was not able to create ShopItem " + itemName 24 | + "! The reward object needs to be the name of a shop (a single text line)."); 25 | return false; 26 | } 27 | 28 | public void enableType() { 29 | } 30 | 31 | @Override 32 | public boolean canBuy(Player p, GenesisBuy buy, boolean messageIfNoSuccess, Object reward, ClickType clickType) { 33 | return true; 34 | } 35 | 36 | @Override 37 | public void giveReward(Player p, GenesisBuy buy, Object reward, ClickType clickType) { 38 | String shopName = (String) reward; 39 | 40 | if (shopName == null || shopName == "" || shopName.length() < 1) { 41 | p.closeInventory(); 42 | } else { 43 | ClassManager.manager.getShops().openShop(p, shopName); 44 | } 45 | } 46 | 47 | @Override 48 | public String getDisplayReward(Player p, GenesisBuy buy, Object reward, ClickType clickType) { 49 | String shopName = (String) reward; 50 | if (shopName == null || shopName == "" || shopName.length() < 1) { 51 | return ClassManager.manager.getMessageHandler().get("Display.Close"); 52 | } 53 | return ClassManager.manager.getMessageHandler().get("Display.Shop").replace("%shop%", shopName); 54 | } 55 | 56 | @Override 57 | public String[] createNames() { 58 | return new String[]{"shop"}; 59 | } 60 | 61 | public boolean logTransaction() { 62 | return false; 63 | } 64 | 65 | @Override 66 | public boolean mightNeedShopUpdate() { 67 | return false; 68 | } 69 | 70 | @Override 71 | public boolean isActualReward() { 72 | return false; 73 | } 74 | 75 | } 76 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/serverpinging/ServerConnector4.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.serverpinging; 2 | 3 | import studio.magemonkey.genesis.managers.ClassManager; 4 | 5 | import java.io.DataInputStream; 6 | import java.io.DataOutputStream; 7 | import java.io.IOException; 8 | import java.net.Socket; 9 | 10 | 11 | public class ServerConnector4 implements ServerConnector { 12 | 13 | //A very old connector 14 | 15 | 16 | @Override 17 | public boolean update(ServerInfo info) { 18 | return ping(info); 19 | } 20 | 21 | 22 | public boolean ping(ServerInfo info) { 23 | try { 24 | final Socket socket = new Socket(); 25 | socket.connect(info.getAddress(), info.getTimeout()); 26 | 27 | final DataInputStream in = new DataInputStream(socket.getInputStream()); 28 | final DataOutputStream out = new DataOutputStream(socket.getOutputStream()); 29 | 30 | out.write(0xFE); 31 | out.write(0x01); 32 | out.write(0xFA); 33 | out.writeShort(11); 34 | out.writeChars("MC|PingHost"); 35 | out.writeShort(7 + 2 * info.getHost().length()); 36 | out.writeByte(73); // Protocol version 37 | out.writeShort(info.getHost().length()); 38 | out.writeChars(info.getHost()); 39 | out.writeInt(info.getPort()); 40 | 41 | out.flush(); 42 | 43 | if (in.read() != 255) { 44 | socket.close(); 45 | throw new IOException("Bad message: An incorrect packet was received."); 46 | } 47 | 48 | final short bit = in.readShort(); 49 | 50 | final StringBuilder sb = new StringBuilder(); 51 | for (int i = 0; i < bit; ++i) { 52 | sb.append(in.readChar()); 53 | } 54 | 55 | in.close(); 56 | out.close(); 57 | socket.close(); 58 | 59 | final String[] bits = sb.toString().split("\0"); 60 | 61 | 62 | info.setMotd(bits[3]); 63 | info.setPlayers(Integer.valueOf(bits[4])); 64 | info.setMaxPlayers(Integer.valueOf(bits[5])); 65 | info.setOnline(true); 66 | return true; 67 | } catch (Exception e) { 68 | info.setOnline(false); 69 | if (ClassManager.manager.getSettings().isDebugEnabled()) { 70 | e.printStackTrace(); 71 | } 72 | return false; 73 | } 74 | } 75 | 76 | 77 | } 78 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/pointsystem/GenesisPointsPluginFailed.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.pointsystem; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.OfflinePlayer; 5 | 6 | import java.util.HashSet; 7 | import java.util.Set; 8 | import java.util.UUID; 9 | 10 | public class GenesisPointsPluginFailed extends GenesisPointsPlugin { 11 | private boolean notifiedConsole = false; 12 | private final Set notifiedPlayers = new HashSet<>(); 13 | 14 | public GenesisPointsPluginFailed() { 15 | super("Failed"); 16 | } 17 | 18 | public double getPoints(OfflinePlayer player) { 19 | informPlayer(player); 20 | return -1; 21 | } 22 | 23 | public double setPoints(OfflinePlayer player, double points) { 24 | informPlayer(player); 25 | return -1; 26 | } 27 | 28 | public double takePoints(OfflinePlayer player, double points) { 29 | informPlayer(player); 30 | return -1; 31 | } 32 | 33 | public double givePoints(OfflinePlayer player, double points) { 34 | informPlayer(player); 35 | return -1; 36 | } 37 | 38 | private void informPlayer(OfflinePlayer player) { //Not sending to prevent spam on servers that installed Genesis for the first time. It should be enough when Genesis notifies about this on startup. 39 | if (!notifiedConsole) { 40 | notifiedConsole = true; 41 | Bukkit.getConsoleSender() 42 | .sendMessage("PlayerPoints/CommandPoints was not found... " 43 | + "You need one of that plugins if you want to work with Points! " 44 | + "Get PlayerPoints there: " 45 | + "https://dev.bukkit.org/server-mods/playerpoints/"); 46 | } 47 | 48 | if (notifiedPlayers.contains(player.getUniqueId())) return; 49 | 50 | if (player.isOnline()) { 51 | if (player.isOp()) { 52 | player.getPlayer() 53 | .sendMessage( 54 | "[Genesis] No Points Plugin installed. If you want to work with Points please install one."); 55 | } else { 56 | player.getPlayer() 57 | .sendMessage("[Genesis] No Points Plugin installed. Please inform an administrator."); 58 | } 59 | notifiedPlayers.add(player.getUniqueId()); 60 | } 61 | } 62 | 63 | @Override 64 | public boolean usesDoubleValues() { 65 | return false; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/features/BugFinder.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.features; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.configuration.file.FileConfiguration; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | import studio.magemonkey.genesis.Genesis; 7 | 8 | import java.io.File; 9 | import java.io.IOException; 10 | import java.io.InputStream; 11 | import java.io.InputStreamReader; 12 | import java.text.SimpleDateFormat; 13 | import java.util.Date; 14 | 15 | public class BugFinder { 16 | 17 | 18 | private final Genesis plugin; 19 | private final String fileName = "BugFinder.yml"; 20 | private final File file; 21 | String USER = "%%__USER__%%"; 22 | private FileConfiguration config = null; 23 | private final SimpleDateFormat formatter = new SimpleDateFormat("yyyy dd-MM 'at' hh:mm:ss a (E)"); 24 | 25 | public BugFinder(final Genesis plugin) { 26 | this.plugin = plugin; 27 | this.file = new File(plugin.getDataFolder().getAbsolutePath(), fileName); 28 | reloadConfig(); 29 | } 30 | 31 | public FileConfiguration getConfig() { 32 | if (config == null) 33 | reloadConfig(); 34 | 35 | return config; 36 | } 37 | 38 | public void reloadConfig() { 39 | config = YamlConfiguration.loadConfiguration(file); 40 | InputStream defConfigStream = plugin.getResource(fileName); 41 | if (defConfigStream != null) { 42 | YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(new InputStreamReader(defConfigStream)); 43 | config.setDefaults(defConfig); 44 | } 45 | } 46 | 47 | public void saveConfig() { 48 | try { 49 | getConfig().save(file); 50 | } catch (IOException e) { 51 | Bukkit.getLogger().severe("[" + Genesis.NAME + "] Could not save BugFinder config to " + file); 52 | } 53 | } 54 | 55 | public String getDate() { 56 | Date dNow = new Date(); 57 | return formatter.format(dNow); 58 | } 59 | 60 | public void addMessage(String message) { 61 | config.set(getDate(), message); 62 | saveConfig(); 63 | } 64 | 65 | public void warn(String message) { 66 | addMessage(message); 67 | Bukkit.getLogger().warning("[" + Genesis.NAME + "] " + message); 68 | } 69 | 70 | public void severe(String message) { 71 | addMessage(message); 72 | Bukkit.getLogger().severe("[" + Genesis.NAME + "] " + message); 73 | } 74 | 75 | 76 | } 77 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/pointsystem/GenesisPointsPlugin.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.pointsystem; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.OfflinePlayer; 5 | 6 | public abstract class GenesisPointsPlugin { 7 | private final String name; 8 | private final String[] nicknames; 9 | private final boolean available; 10 | 11 | public GenesisPointsPlugin(String mainName, String... nicknames) { 12 | this.name = mainName; 13 | this.nicknames = nicknames; 14 | this.available = Bukkit.getPluginManager().getPlugin(name) != null; 15 | } 16 | 17 | /** 18 | * Get the name of the points plugin 19 | * 20 | * @return name 21 | */ 22 | public String getName() { 23 | return name; 24 | } 25 | 26 | /** 27 | * Get the nicknames of the points plugin 28 | * 29 | * @return nicknames 30 | */ 31 | public String[] getNicknames() { 32 | return nicknames; 33 | } 34 | 35 | /** 36 | * Check if points plugin is available 37 | * 38 | * @return available or not 39 | */ 40 | public boolean isAvailable() { 41 | return available; 42 | } 43 | 44 | /** 45 | * Get the points from an offline player 46 | * 47 | * @param player player to get points from 48 | * @return points of player 49 | */ 50 | public abstract double getPoints(OfflinePlayer player); 51 | 52 | /** 53 | * Set the points of a player 54 | * 55 | * @param player player to modify 56 | * @param points points to set 57 | * @return points to set 58 | */ 59 | public abstract double setPoints(OfflinePlayer player, double points); 60 | 61 | /** 62 | * Take points from a player 63 | * 64 | * @param player the player to modify 65 | * @param points points to take 66 | * @return amount taken 67 | */ 68 | public abstract double takePoints(OfflinePlayer player, double points); 69 | 70 | /** 71 | * Give points to a player 72 | * 73 | * @param player player to modify 74 | * @param points the amount to give 75 | * @return amount given 76 | */ 77 | public abstract double givePoints(OfflinePlayer player, double points); 78 | 79 | /** 80 | * Use double values 81 | * 82 | * @return true or false 83 | */ 84 | public abstract boolean usesDoubleValues(); 85 | 86 | 87 | /** 88 | * Register a plugin into the API 89 | */ 90 | public void register() { 91 | GenesisPointsAPI.register(this); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/rewards/GenesisRewardTypeExp.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.rewards; 2 | 3 | 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.inventory.ClickType; 6 | import studio.magemonkey.genesis.core.GenesisBuy; 7 | import studio.magemonkey.genesis.managers.ClassManager; 8 | import studio.magemonkey.genesis.managers.misc.InputReader; 9 | 10 | 11 | public class GenesisRewardTypeExp extends GenesisRewardTypeNumber { 12 | 13 | 14 | public Object createObject(Object o, boolean forceFinalState) { 15 | return InputReader.getInt(o, -1); 16 | } 17 | 18 | public boolean validityCheck(String itemName, Object o) { 19 | if ((Integer) o != -1) { 20 | return true; 21 | } 22 | ClassManager.manager.getBugFinder() 23 | .severe("Was not able to create ShopItem " + itemName 24 | + "! The reward object needs to be a valid Integer number. Example: '7' or '12'."); 25 | return false; 26 | } 27 | 28 | public void enableType() { 29 | } 30 | 31 | @Override 32 | public boolean canBuy(Player p, GenesisBuy buy, boolean messageIfNoSuccess, Object reward, ClickType clickType) { 33 | return true; 34 | } 35 | 36 | @Override 37 | public void giveReward(Player p, GenesisBuy buy, Object reward, ClickType clickType, int multiplier) { 38 | int exp = (int) ClassManager.manager.getMultiplierHandler() 39 | .calculateRewardWithMultiplier(p, buy, clickType, ((Integer) reward)) * multiplier; 40 | if (ClassManager.manager.getSettings().getExpUseLevel()) { 41 | p.setLevel(p.getLevel() + exp); 42 | } else { 43 | p.giveExp(exp); 44 | } 45 | } 46 | 47 | @Override 48 | public String getDisplayReward(Player p, GenesisBuy buy, Object reward, ClickType clickType) { 49 | return ClassManager.manager.getMultiplierHandler() 50 | .calculateRewardDisplayWithMultiplier(p, 51 | buy, 52 | clickType, 53 | ((Integer) reward), 54 | ClassManager.manager.getMessageHandler().get("Display.Exp").replace("%levels%", "%number%")); 55 | } 56 | 57 | @Override 58 | public String[] createNames() { 59 | return new String[]{"exp", "xp"}; 60 | } 61 | 62 | 63 | @Override 64 | public boolean mightNeedShopUpdate() { 65 | return true; 66 | } 67 | 68 | @Override 69 | public boolean isIntegerValue() { 70 | return true; 71 | } 72 | 73 | 74 | } 75 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/item/ItemDataPartName.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.item; 2 | 3 | import org.bukkit.ChatColor; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.inventory.ItemStack; 6 | import org.bukkit.inventory.meta.ItemMeta; 7 | import studio.magemonkey.genesis.core.GenesisBuy; 8 | import studio.magemonkey.genesis.managers.ClassManager; 9 | 10 | import java.util.List; 11 | 12 | public class ItemDataPartName extends ItemDataPart { 13 | 14 | @Override 15 | public ItemStack transform(ItemStack item, String usedName, String argument) { 16 | ItemMeta meta = item.getItemMeta(); 17 | if (meta == null) return item; 18 | 19 | meta.setDisplayName(argument); 20 | item.setItemMeta(meta); 21 | return item; 22 | } 23 | 24 | @Override 25 | public int getPriority() { 26 | return PRIORITY_NORMAL; 27 | } 28 | 29 | @Override 30 | public boolean removeSpaces() { 31 | return false; 32 | } 33 | 34 | @Override 35 | public String[] createNames() { 36 | return new String[]{"name", "text", "title"}; 37 | } 38 | 39 | 40 | @Override 41 | public List read(ItemStack i, List output) { 42 | ItemMeta meta = i.getItemMeta(); 43 | if (meta == null) return output; 44 | 45 | if (meta.hasDisplayName()) { 46 | output.add("name:" + meta.getDisplayName().replaceAll(String.valueOf(ChatColor.COLOR_CHAR), "&")); 47 | } 48 | return output; 49 | } 50 | 51 | 52 | @Override 53 | public boolean isSimilar(ItemStack shopItem, ItemStack playerItem, GenesisBuy buy, Player p) { 54 | ItemMeta ms = shopItem.getItemMeta(); 55 | ItemMeta mp = playerItem.getItemMeta(); 56 | if (ms != null && ms.hasDisplayName()) { 57 | if (mp == null || !mp.hasDisplayName()) { 58 | return false; 59 | } 60 | String shopItemName = ms.getDisplayName(); 61 | if (ClassManager.manager.getStringManager() 62 | .checkStringForFeatures(buy == null ? null : buy.getShop(), 63 | buy, 64 | buy == null ? null : buy.getItem(), 65 | shopItemName)) { 66 | shopItemName = ClassManager.manager.getStringManager() 67 | .transform(shopItemName, buy, buy == null ? null : buy.getShop(), null, p); 68 | } 69 | return shopItemName.equalsIgnoreCase(mp.getDisplayName()); 70 | } 71 | return true; 72 | } 73 | 74 | 75 | } 76 | -------------------------------------------------------------------------------- /src/main/resources/PointShop.yml: -------------------------------------------------------------------------------- 1 | ShopName: PointShop 2 | DisplayName: '&1&lPointShop &a[v]' 3 | signs: 4 | text: '[PointShop]' 5 | NeedPermissionToCreateSign: true 6 | shop: 7 | 100Points: 8 | MenuItem: 9 | - type:DIAMOND 10 | - amount:1 11 | - name:&6%reward% 12 | - 'lore:&cPrice: %price%' 13 | RewardType: POINTS 14 | Reward: 100 15 | PriceType: MONEY 16 | Price: 1000 17 | Message: '&eYou bought %reward%! Money left: &c%left%' 18 | ExtraPermission: '' 19 | InventoryLocation: 1 20 | 500Points: 21 | MenuItem: 22 | - type:DIAMOND 23 | - amount:5 24 | - name:&6%reward% 25 | - 'lore:&cPrice: %price%' 26 | RewardType: POINTS 27 | Reward: 500 28 | PriceType: MONEY 29 | Price: 5000 30 | Message: '&eYou bought %reward%! Money left: &c%left%' 31 | ExtraPermission: '' 32 | InventoryLocation: 2 33 | 1000Points: 34 | MenuItem: 35 | - type:DIAMOND 36 | - amount:10 37 | - name:&6%reward% 38 | - 'lore:&cPrice: %price%' 39 | RewardType: POINTS 40 | Reward: 1000 41 | PriceType: MONEY 42 | Price: 10000 43 | Message: '&eYou bought %reward%! Money left: &c%left%' 44 | ExtraPermission: '' 45 | InventoryLocation: 3 46 | 500Money: 47 | MenuItem: 48 | - type:EMERALD 49 | - amount:5 50 | - name:&6%reward% 51 | - 'lore:&cPrice: %price%' 52 | RewardType: MONEY 53 | Reward: 500 54 | PriceType: POINTS 55 | Price: 100 56 | Message: '&eYou bought %reward%! Points left: &c%left%' 57 | ExtraPermission: '' 58 | InventoryLocation: 19 59 | 1000Money: 60 | MenuItem: 61 | - type:EMERALD 62 | - amount:10 63 | - name:&6%reward% 64 | - 'lore:&cPrice: %price%' 65 | RewardType: MONEY 66 | Reward: 1000 67 | PriceType: POINTS 68 | Price: 200 69 | Message: '&eYou bought %reward%! Points left: &c%left%' 70 | ExtraPermission: '' 71 | InventoryLocation: 20 72 | 5000Money: 73 | MenuItem: 74 | - type:EMERALD 75 | - amount:50 76 | - name:&6%reward% 77 | - 'lore:&cPrice: %price%' 78 | RewardType: MONEY 79 | Reward: 5000 80 | PriceType: POINTS 81 | Price: 1000 82 | Message: '&eYou bought %reward%! Points left: &c%left%' 83 | ExtraPermission: '' 84 | InventoryLocation: 21 85 | Back: 86 | MenuItem: 87 | - type:REDSTONE 88 | - amount:1 89 | - name:&cBack 90 | - lore:&8Back to Menu 91 | RewardType: SHOP 92 | Reward: menu 93 | PriceType: NOTHING 94 | Message: '&6Leaving the PointShop...' 95 | ExtraPermission: '' 96 | InventoryLocation: 27 97 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release Build 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | paths: [ src/** ] 7 | 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/checkout@v4 14 | with: 15 | token: ${{ secrets.ACTIONS_PAT }} 16 | - name: Configure git 17 | run: | 18 | git config user.name "Build Monkey" 19 | git config user.email "<>" 20 | - name: Set up JDK 17 21 | uses: actions/setup-java@v4 22 | with: 23 | distribution: 'zulu' 24 | java-version: 21 25 | server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml 26 | settings-path: ${{ github.workspace }} # location for the settings.xml file 27 | gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} 28 | gpg-passphrase: MAVEN_GPG_PASSPHRASE 29 | - name: 'Create settings.xml' 30 | uses: s4u/maven-settings-action@v3.0.0 31 | with: 32 | githubServer: false 33 | servers: '[{"id": "magemonkey-repo", "username": "${{ secrets.REPO_USERNAME }}", "password": "${{ secrets.DEPLOY_KEY }}"}]' 34 | - name: Update version 35 | run: python ./.github/update_version.py false true 36 | - name: Publish to Travja Repo 37 | env: 38 | MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} 39 | run: | 40 | mvn clean deploy -P gpg,publish -DcreateChecksum=true 2>&1 | tee log.txt 41 | result_code=${PIPESTATUS[0]} 42 | exit $result_code 43 | - name: Tag release version 44 | run: | 45 | git add . 46 | git commit -m "[ci skip] Update release version" 47 | version=$(mvn org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate -Dexpression=project.version -q -DforceStdout) 48 | git tag -a $version -m "Release $version" 49 | git push 50 | git push --tags 51 | git fetch --unshallow --all 52 | git checkout dev 53 | git merge -X theirs --no-edit main 54 | - name: Update version 55 | run: python ./.github/update_version.py 56 | - name: Update version 57 | run: python ./.github/update_version.py true 58 | - name: Push to git 59 | run: | 60 | git add . 61 | git commit -m "[ci skip] Update version for development" 62 | git push 63 | - name: Notify Discord 64 | run: | 65 | python -m venv .venv 66 | .venv/bin/pip install simplejson requests 67 | .venv/bin/python ./.github/notify_published.py ${{ secrets.BSP_WEBHOOK }} 68 | -------------------------------------------------------------------------------- /src/main/resources/lang/zh-cn.yml: -------------------------------------------------------------------------------- 1 | Main: 2 | NoPermission: '&c你不能这么做!' 3 | AlreadyBought: '&c你已经购买了它!' 4 | ShopNotExisting: '&c那个商店不存在。。。' 5 | ShopItemNotExisting: '&c那个商店物品不存在。。。' 6 | OpenShop: '' 7 | OpenShopOtherPlayer: '&6正在给玩家%player%打开商店&c%shop%&6。。。' 8 | CloseShopOtherPlayer: '&6已关闭玩家%player%正在打开的商店&6。。。' 9 | CloseShop: '' 10 | InventoryFull: '&c您的背包没有足够的可用空间!' 11 | PlayerNotFound: '&c玩家 %name% 未找到!' 12 | ClickSpamWarning: '&c请等待另一个%time_left%秒,直到您可以再次使用它。' 13 | OffensiveClickSpamWarning: '&4警告:请不要点击太快。' 14 | OffensiveClickSpamKick: '&4因点击过多被踢。' 15 | NeedItemInHand: '&c您需要在主手上放一个物品才能执行此指令!' 16 | PrintedItemInfo: '&6所有物品信息已成功保存在此处: &7''/plugins/Genesis/ItemDataStorage.yml''&6。' 17 | ListAndSeparator: ' & ' 18 | ListOrSeparator: ' 或 ' 19 | WorldNotExisting: "&c那个世界不存在。。。" 20 | StartReload: "&eGenesis正在开始重载。。。" 21 | ReloadFinish: "&e完成!" 22 | Economy: 23 | NoAccount: '&c你没有经济账户!' 24 | ShopCreate: 25 | Success: "&a文件已保存至 &7/plugins/Genesis/shops&a下。" 26 | Success2: "&c请重载插件才能读取新生成的商店文件。" 27 | FileExists: "&c相同的文件已存在,将会覆盖文件。" 28 | #这两个字符串不要随意修改,否则无法保存文件。 29 | Title: "&8正在创建商店 %shop% (关闭以保存文件)" 30 | TitleHead: "&8正在创建商店" 31 | Command: 32 | Help1: "&c/Genesis - 打开主商店" 33 | Help2: "&c/Genesis <商店名> [输入内容] - 打开指定的商店" 34 | Help3: "&c/Genesis open <商店名> <玩家名> [输入内容] - 给一个指定的玩家打开一个指定的商店" 35 | Help4: "&c/Genesis close [玩家名] - 给一个指定的玩家关闭商店" 36 | Help5: "&c/Genesis simulate <玩家名> <商店名> <商店物品> - 模拟点击" 37 | Help6: "&c/Genesis reload - 重载插件" 38 | Help7: "&c/Genesis read - 输出你主手拿着的物品的物品数据" 39 | Help8: "&c/Genesis create <商店名> <标题> - 创建一个商店" 40 | Help: "&c/Genesis help - 输出这个" 41 | NotEnough: 42 | Money: '&c你没有足够的钱!' 43 | Item: '&c你没有足够的物品!' 44 | Points: '&c你没有足够的点券!' 45 | Exp: '&c你没有足够的经验!' 46 | Or: '&c你没有足够的资源!' 47 | Enchantment: 48 | Invalid: '&c你不能附魔拿在主手的物品!' 49 | EmptyHand: '&c你的手上必须要拿着一个东西!' 50 | Display: 51 | Exp: '%levels% 经验等级' 52 | Money: '%money% 金币' 53 | Points: '%points% 点券' 54 | Item: '%items%' 55 | ItemAll: '全部的 %item%' 56 | ItemAllBuy: '一背包的 %item%' 57 | ItemAllEach: '%value% 每个' 58 | Nothing: '没有什么' 59 | BungeeCordServer: '传送至 %server%' 60 | BungeeCordCommand: 'BungeeCord 指令: %commands%' 61 | Close: '关闭商店' 62 | Command: '控制台指令: %commands%' 63 | Custom: '未知' 64 | Enchantment: '附魔: %type% 等级 %level%' 65 | Permission: '权限: %permissions%' 66 | PlayerCommand: '指令: %commands%' 67 | PlayerCommandOp: '指令: %commands%' 68 | Shop: '打开商店 %shop%' 69 | Page: '打开商店页码 %page%' 70 | Teleport: '传送至 %world% x:%x% y:%y% z:%z%' 71 | TeleportWorld: '传送至 %world%' 72 | Time: 73 | Seconds: '%time% 秒' 74 | Minutes: '%time% 分钟' 75 | Hours: '%time% 小时' 76 | Days: '%time% 天' 77 | Weeks: '%time% 周' -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/rewards/GenesisRewardTypePoints.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.rewards; 2 | 3 | 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.inventory.ClickType; 6 | import studio.magemonkey.genesis.core.GenesisBuy; 7 | import studio.magemonkey.genesis.managers.ClassManager; 8 | import studio.magemonkey.genesis.managers.misc.InputReader; 9 | 10 | 11 | public class GenesisRewardTypePoints extends GenesisRewardTypeNumber { 12 | 13 | 14 | public Object createObject(Object o, boolean forceFinalState) { 15 | return InputReader.getDouble(o, -1); 16 | } 17 | 18 | public boolean validityCheck(String itemName, Object o) { 19 | if ((Double) o != -1) { 20 | return true; 21 | } 22 | ClassManager.manager.getBugFinder() 23 | .severe("Was not able to create ShopItem " + itemName 24 | + "! The reward object needs to be a valid Integer number. Example: '7' or '12'."); 25 | return false; 26 | } 27 | 28 | public void enableType() { 29 | ClassManager.manager.getSettings().setPointsEnabled(true); 30 | } 31 | 32 | @Override 33 | public boolean canBuy(Player p, GenesisBuy buy, boolean messageIfNoSuccess, Object reward, ClickType clickType) { 34 | return true; 35 | } 36 | 37 | @Override 38 | public void giveReward(Player p, GenesisBuy buy, Object reward, ClickType clickType, int multiplier) { 39 | double points = ClassManager.manager.getMultiplierHandler() 40 | .calculateRewardWithMultiplier(p, buy, clickType, ((Double) reward)) * multiplier; 41 | ClassManager.manager.getPointsManager().givePoints(p, points); 42 | } 43 | 44 | @Override 45 | public String getDisplayReward(Player p, GenesisBuy buy, Object reward, ClickType clickType) { 46 | return ClassManager.manager.getMultiplierHandler() 47 | .calculateRewardDisplayWithMultiplier(p, 48 | buy, 49 | clickType, 50 | ((Double) reward), 51 | ClassManager.manager.getMessageHandler().get("Display.Points").replace("%points%", "%number%")); 52 | } 53 | 54 | @Override 55 | public String[] createNames() { 56 | return new String[]{"points", "point"}; 57 | } 58 | 59 | 60 | @Override 61 | public boolean mightNeedShopUpdate() { 62 | return true; 63 | } 64 | 65 | @Override 66 | public boolean isIntegerValue() { 67 | return false; 68 | } 69 | 70 | @Override 71 | public boolean allowAsync() { 72 | return true; 73 | } 74 | 75 | } 76 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/features/TransactionLog.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.features; 2 | 3 | import org.bukkit.configuration.file.FileConfiguration; 4 | import org.bukkit.configuration.file.YamlConfiguration; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.event.inventory.ClickType; 7 | import studio.magemonkey.genesis.Genesis; 8 | import studio.magemonkey.genesis.core.GenesisBuy; 9 | 10 | import java.io.File; 11 | import java.io.IOException; 12 | import java.io.InputStream; 13 | import java.io.InputStreamReader; 14 | import java.text.SimpleDateFormat; 15 | import java.util.Date; 16 | 17 | public class TransactionLog { 18 | 19 | 20 | private final Genesis plugin; 21 | private final String fileName = "TransactionLog.yml"; 22 | private final File file; 23 | private FileConfiguration config = null; 24 | private final SimpleDateFormat formatter = new SimpleDateFormat("yyyy dd-MM 'at' hh:mm:ss a (E)"); 25 | 26 | public TransactionLog(final Genesis plugin) { 27 | this.plugin = plugin; 28 | this.file = new File(plugin.getDataFolder().getAbsolutePath(), fileName); 29 | reloadConfig(); 30 | } 31 | 32 | public FileConfiguration getConfig() { 33 | if (config == null) 34 | reloadConfig(); 35 | 36 | return config; 37 | } 38 | 39 | public void reloadConfig() { 40 | config = YamlConfiguration.loadConfiguration(file); 41 | InputStream defConfigStream = plugin.getResource(fileName); 42 | if (defConfigStream != null) { 43 | YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(new InputStreamReader(defConfigStream)); 44 | config.setDefaults(defConfig); 45 | } 46 | } 47 | 48 | public void saveConfig() { 49 | try { 50 | getConfig().save(file); 51 | } catch (IOException e) { 52 | Genesis.log("Could not save BugFinder config to " + file); 53 | } 54 | } 55 | 56 | public String getDate() { 57 | Date dNow = new Date(); 58 | return formatter.format(dNow); 59 | } 60 | 61 | public void addTransaction(String message) { 62 | config.set(getDate(), message); 63 | } 64 | 65 | public void addTransaction(Player p, GenesisBuy buy, ClickType clickType) { 66 | if (buy.getRewardType(clickType).logTransaction()) { 67 | addTransaction( 68 | "Player " + p.getName() + " bought " + buy.getName() + "(" + buy.getRewardType(clickType).name() 69 | + ") for " + buy.getPriceType(clickType).name() + "."); 70 | } 71 | } 72 | 73 | 74 | } 75 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/conditions/GenesisConditionTypeServerpinging.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.conditions; 2 | 3 | import org.bukkit.entity.Player; 4 | import studio.magemonkey.genesis.core.GenesisBuy; 5 | import studio.magemonkey.genesis.core.GenesisShopHolder; 6 | import studio.magemonkey.genesis.managers.ClassManager; 7 | import studio.magemonkey.genesis.managers.misc.InputReader; 8 | import studio.magemonkey.genesis.managers.serverpinging.ServerInfo; 9 | import studio.magemonkey.genesis.managers.serverpinging.ServerPingingManager; 10 | 11 | public class GenesisConditionTypeServerpinging extends GenesisConditionTypeNumber { 12 | 13 | 14 | @Override 15 | public boolean meetsCondition(GenesisShopHolder holder, 16 | GenesisBuy shopItem, 17 | Player p, 18 | String conditiontype, 19 | String condition) { 20 | if (conditiontype.equalsIgnoreCase("online")) { 21 | ServerPingingManager m = ClassManager.manager.getServerPingingManager(); 22 | if (m != null) { 23 | ServerInfo connector = m.getFirstInfo(shopItem); 24 | boolean b = InputReader.getBoolean(condition, true); 25 | if (connector != null) { 26 | return connector.isOnline() == b; 27 | } 28 | } 29 | return false; 30 | } 31 | 32 | return super.meetsCondition(holder, shopItem, p, conditiontype, condition); 33 | } 34 | 35 | 36 | @Override 37 | public double getNumber(GenesisBuy shopItem, GenesisShopHolder holder, Player p) { 38 | ServerPingingManager m = ClassManager.manager.getServerPingingManager(); 39 | if (m != null) { 40 | ServerInfo connector = ClassManager.manager.getServerPingingManager().getFirstInfo(shopItem); 41 | if (connector != null) { 42 | if (connector.isOnline()) { 43 | return connector.getPlayers(); 44 | } 45 | } 46 | } 47 | return 0; 48 | } 49 | 50 | @Override 51 | public boolean dependsOnPlayer() { 52 | return false; 53 | } 54 | 55 | @Override 56 | public String[] createNames() { 57 | return new String[]{"serverpinging", "serverping", "pinging", "ping"}; 58 | } 59 | 60 | 61 | @Override 62 | public String[] showStructure() { 63 | return new String[]{"online", "over:[double]", "under:[double]", "equals:[double]", "between:[double]-[double]"}; 64 | } 65 | 66 | 67 | @Override 68 | public void enableType() { 69 | } 70 | 71 | 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/rewards/GenesisRewardTypeMessage.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.rewards; 2 | 3 | import net.md_5.bungee.api.chat.BaseComponent; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.inventory.ClickType; 6 | import studio.magemonkey.genesis.core.GenesisBuy; 7 | import studio.magemonkey.genesis.managers.ClassManager; 8 | import studio.magemonkey.genesis.managers.misc.InputReader; 9 | import studio.magemonkey.genesis.managers.misc.StringManipulationLib; 10 | 11 | import java.util.List; 12 | 13 | public class GenesisRewardTypeMessage extends GenesisRewardType { 14 | 15 | @Override 16 | public Object createObject(Object o, boolean forceFinalState) { 17 | return InputReader.readStringList(o); 18 | } 19 | 20 | @Override 21 | public boolean validityCheck(String itemName, Object o) { 22 | if (o != null) { 23 | return true; 24 | } 25 | ClassManager.manager.getBugFinder() 26 | .severe("Was not able to create ShopItem " + itemName 27 | + "! The reward object needs to be a list of commands (text lines)."); 28 | return false; 29 | } 30 | 31 | @Override 32 | public void enableType() {} 33 | 34 | @Override 35 | public boolean canBuy(Player p, GenesisBuy buy, boolean messageIfNoSuccess, Object reward, ClickType clickType) { 36 | return true; 37 | } 38 | 39 | @Override 40 | public void giveReward(Player p, GenesisBuy buy, Object reward, ClickType clickType) { 41 | List messages = (List) reward; 42 | 43 | for (String s : messages) { 44 | BaseComponent baseComponent = InputReader.readChatComponent(s); 45 | if (baseComponent == null) { 46 | p.sendMessage(s); 47 | } else { 48 | p.spigot().sendMessage(baseComponent); 49 | } 50 | } 51 | 52 | p.getOpenInventory(); 53 | if (!ClassManager.manager.getPlugin().getAPI().isValidShop(p.getOpenInventory())) { 54 | p.updateInventory(); 55 | } 56 | } 57 | 58 | @Override 59 | public String getDisplayReward(Player p, GenesisBuy buy, Object reward, ClickType clickType) { 60 | return ClassManager.manager.getMessageHandler().get("Display.Message") 61 | .replace("%messages%", StringManipulationLib.formatList((List) reward)); 62 | } 63 | 64 | @Override 65 | public String[] createNames() { 66 | return new String[]{"message", "messages", "playermessage", "playermessages"}; 67 | } 68 | 69 | @Override 70 | public boolean mightNeedShopUpdate() { 71 | return false; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/api/GenesisAddonStorage.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.api; 2 | 3 | import java.util.List; 4 | import java.util.Set; 5 | 6 | 7 | public interface GenesisAddonStorage { 8 | 9 | 10 | int TYPE_LOCAL_FILE = 0; // More types might be added in future 11 | 12 | /** 13 | * Set the path for the config 14 | * 15 | * @param path path 16 | * @param value value 17 | */ 18 | void set(String path, Object value); 19 | 20 | /** 21 | * Get a string from the config 22 | * 23 | * @param path path 24 | * @param def default 25 | * @return string 26 | */ 27 | String getString(String path, String def); 28 | 29 | /** 30 | * Get an int from the config 31 | * 32 | * @param path path 33 | * @param def default 34 | * @return int 35 | */ 36 | int getInt(String path, int def); 37 | 38 | /** 39 | * Get a double from the config 40 | * 41 | * @param path path 42 | * @param def default 43 | * @return double 44 | */ 45 | double getDouble(String path, double def); 46 | 47 | /** 48 | * Get a boolean from the config 49 | * 50 | * @param path path 51 | * @param def default 52 | * @return boolean 53 | */ 54 | boolean getBoolean(String path, boolean def); 55 | 56 | /** 57 | * Get a list of strings from the config 58 | * 59 | * @param path path 60 | * @return list of strings 61 | */ 62 | List getStringList(String path); 63 | 64 | /** 65 | * Check if a config contains a path 66 | * 67 | * @param key path 68 | * @return contains or not 69 | */ 70 | boolean containsPath(String key); 71 | 72 | /** 73 | * List of keys from config 74 | * 75 | * @param section path 76 | * @param deep subkeys or not 77 | * @return list of keys 78 | */ 79 | Set listKeys(String section, boolean deep); 80 | 81 | /** 82 | * Delete all parts from a section 83 | * 84 | * @param section the section to delete 85 | */ 86 | void deleteAll(String section); 87 | 88 | /** 89 | * Save the addon 90 | * 91 | * @return saved or not 92 | */ 93 | boolean save(); 94 | 95 | /** 96 | * Save the addon async 97 | */ 98 | void saveAsync(); 99 | 100 | /** 101 | * Copies from file to new file 102 | * 103 | * @param source the file to copy from 104 | * @return new addon storage file 105 | */ 106 | boolean pasteContentFrom(GenesisAddonStorage source); 107 | 108 | 109 | } 110 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/rewards/GenesisRewardTypePlayerCommand.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.rewards; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.inventory.ClickType; 5 | import studio.magemonkey.genesis.core.GenesisBuy; 6 | import studio.magemonkey.genesis.managers.ClassManager; 7 | import studio.magemonkey.genesis.managers.misc.InputReader; 8 | import studio.magemonkey.genesis.managers.misc.StringManipulationLib; 9 | 10 | import java.util.List; 11 | 12 | public class GenesisRewardTypePlayerCommand extends GenesisRewardType { 13 | 14 | 15 | public Object createObject(Object o, boolean forceFinalState) { 16 | return InputReader.readStringList(o); 17 | } 18 | 19 | public boolean validityCheck(String itemName, Object o) { 20 | if (o != null) { 21 | return true; 22 | } 23 | ClassManager.manager.getBugFinder() 24 | .severe("Was not able to create ShopItem " + itemName 25 | + "! The reward object needs to be a list of commands (text lines)."); 26 | return false; 27 | } 28 | 29 | @Override 30 | public void enableType() { 31 | } 32 | 33 | @Override 34 | public boolean canBuy(Player p, GenesisBuy buy, boolean messageIfNoSuccess, Object reward, ClickType clickType) { 35 | return true; 36 | } 37 | 38 | @SuppressWarnings("unchecked") 39 | @Override 40 | public void giveReward(Player p, GenesisBuy buy, Object reward, ClickType clickType) { 41 | List commands = (List) reward; 42 | 43 | for (String s : commands) { 44 | p.performCommand(ClassManager.manager.getStringManager().transform(s, buy, null, null, p)); 45 | } 46 | 47 | if (p.getOpenInventory() != null & !ClassManager.manager.getPlugin() 48 | .getAPI() 49 | .isValidShop(p.getOpenInventory())) { 50 | p.updateInventory(); 51 | } 52 | 53 | } 54 | 55 | @Override 56 | public String getDisplayReward(Player p, GenesisBuy buy, Object reward, ClickType clickType) { 57 | @SuppressWarnings("unchecked") 58 | List commands = (List) reward; 59 | String commandsFormatted = StringManipulationLib.formatList(commands); 60 | return ClassManager.manager.getMessageHandler() 61 | .get("Display.PlayerCommand") 62 | .replace("%commands%", commandsFormatted); 63 | } 64 | 65 | @Override 66 | public String[] createNames() { 67 | return new String[]{"playercommand", "playercommands"}; 68 | } 69 | 70 | @Override 71 | public boolean mightNeedShopUpdate() { 72 | return true; 73 | } 74 | 75 | } 76 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/serverpinging/ServerConnector3.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.serverpinging; 2 | 3 | import studio.magemonkey.genesis.managers.ClassManager; 4 | 5 | import java.io.*; 6 | import java.net.Socket; 7 | import java.nio.charset.StandardCharsets; 8 | 9 | 10 | public class ServerConnector3 implements ServerConnector { 11 | 12 | //A very old connector 13 | 14 | 15 | @Override 16 | public boolean update(ServerInfo info) { 17 | return fetchData(info); 18 | } 19 | 20 | 21 | public boolean fetchData(ServerInfo info) { 22 | 23 | Socket socket = new Socket(); 24 | 25 | try { 26 | 27 | socket.setSoTimeout(info.getTimeout()); 28 | socket.connect(info.getAddress(), info.getTimeout()); 29 | OutputStream os = socket.getOutputStream(); 30 | DataOutputStream dos = new DataOutputStream(os); 31 | InputStream is = socket.getInputStream(); 32 | 33 | InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_16BE); 34 | dos.write(new byte[]{(byte) 0xFE, (byte) 0x01}); 35 | int packetId = is.read(); 36 | 37 | if (packetId == -1) { 38 | info.setNoConnection(); 39 | return false; 40 | } 41 | 42 | if (packetId != 0xFF) { 43 | info.setNoConnection(); 44 | return false; 45 | } 46 | 47 | int length = isr.read(); 48 | 49 | if (length == -1) { 50 | info.setNoConnection(); 51 | return false; 52 | } 53 | if (length == 1) { 54 | info.setNoConnection(); 55 | return false; 56 | } 57 | 58 | char[] chars = new char[length]; 59 | socket.close(); 60 | 61 | if (isr.read(chars, 0, length) != length) { 62 | info.setNoConnection(); 63 | return false; 64 | } 65 | 66 | String string = new String(chars); 67 | String[] data = string.split("\0"); 68 | 69 | info.setMotd(data[3]); 70 | info.setPlayers(Integer.parseInt(data[4])); 71 | info.setMaxPlayers(Integer.parseInt(data[5])); 72 | info.setOnline(true); 73 | return true; 74 | 75 | } catch (Exception e) { 76 | info.setNoConnection(); 77 | if (ClassManager.manager.getSettings().isDebugEnabled()) { 78 | e.printStackTrace(); 79 | } 80 | 81 | try {//new 82 | socket.close(); 83 | } catch (IOException e1) { 84 | }//new end 85 | 86 | return false; 87 | } 88 | } 89 | 90 | 91 | } 92 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/core/rewards/GenesisRewardTypeCommand.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.core.rewards; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.inventory.ClickType; 6 | import studio.magemonkey.genesis.core.GenesisBuy; 7 | import studio.magemonkey.genesis.managers.ClassManager; 8 | import studio.magemonkey.genesis.managers.misc.InputReader; 9 | import studio.magemonkey.genesis.managers.misc.StringManipulationLib; 10 | 11 | import java.util.List; 12 | 13 | public class GenesisRewardTypeCommand extends GenesisRewardType { 14 | 15 | 16 | public Object createObject(Object o, boolean forceFinalState) { 17 | return InputReader.readStringList(o); 18 | } 19 | 20 | public boolean validityCheck(String itemName, Object o) { 21 | if (o != null) { 22 | return true; 23 | } 24 | ClassManager.manager.getBugFinder() 25 | .severe("Was not able to create ShopItem " + itemName 26 | + "! The reward object needs to be a list of commands (text lines)."); 27 | return false; 28 | } 29 | 30 | @Override 31 | public void enableType() { 32 | } 33 | 34 | @Override 35 | public boolean canBuy(Player p, GenesisBuy buy, boolean messageIfNoSuccess, Object reward, ClickType clickType) { 36 | return true; 37 | } 38 | 39 | @SuppressWarnings("unchecked") 40 | @Override 41 | public void giveReward(Player p, GenesisBuy buy, Object reward, ClickType clickType) { 42 | List commands = (List) reward; 43 | 44 | for (String s : commands) { 45 | Bukkit.dispatchCommand(Bukkit.getConsoleSender(), 46 | ClassManager.manager.getStringManager().transform(s, buy, null, null, p)); 47 | } 48 | if (p.getOpenInventory() != null & !ClassManager.manager.getPlugin() 49 | .getAPI() 50 | .isValidShop(p.getOpenInventory())) { 51 | p.updateInventory(); 52 | } 53 | 54 | } 55 | 56 | @Override 57 | public String getDisplayReward(Player p, GenesisBuy buy, Object reward, ClickType clickType) { 58 | @SuppressWarnings("unchecked") 59 | List commands = (List) reward; 60 | String commandsFormatted = StringManipulationLib.formatList(commands); 61 | return ClassManager.manager.getMessageHandler() 62 | .get("Display.Command") 63 | .replace("%commands%", commandsFormatted); 64 | } 65 | 66 | @Override 67 | public String[] createNames() { 68 | return new String[]{"command", "commands", "consolecommand", "consolecommands"}; 69 | } 70 | 71 | @Override 72 | public boolean mightNeedShopUpdate() { 73 | return true; 74 | } 75 | 76 | } 77 | -------------------------------------------------------------------------------- /src/main/java/studio/magemonkey/genesis/managers/item/ItemDataPartMobEgg.java: -------------------------------------------------------------------------------- 1 | package studio.magemonkey.genesis.managers.item; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.inventory.ItemStack; 5 | import studio.magemonkey.genesis.core.GenesisBuy; 6 | import studio.magemonkey.genesis.managers.ClassManager; 7 | 8 | import java.util.List; 9 | 10 | 11 | public class ItemDataPartMobEgg extends ItemDataPart { 12 | 13 | @Override 14 | public ItemStack transform(ItemStack item, String usedName, String argument) { 15 | if (ClassManager.manager.getSpawnEggHandler() == null) { 16 | ClassManager.manager.getBugFinder() 17 | .warn("Unable to work with ItemData of type " + createNames()[0] 18 | + ": Requires the plugin SilkSpawners, which was not found."); 19 | return item; 20 | } 21 | 22 | ItemStack egg = ClassManager.manager.getSpawnEggHandler().transformEgg(item, argument); 23 | if (egg == null) { 24 | ClassManager.manager.getBugFinder() 25 | .severe("Mistake in Config: '" + argument + "' is not a valid mob type ('" + usedName + "')."); 26 | return item; 27 | } 28 | 29 | return egg; 30 | } 31 | 32 | @Override 33 | public int getPriority() { 34 | return PRIORITY_MOST_EARLY; 35 | } 36 | 37 | @Override 38 | public boolean removeSpaces() { 39 | return true; 40 | } 41 | 42 | @Override 43 | public String[] createNames() { 44 | return new String[]{"monsteregg", "mobegg", "spawnegg"}; 45 | } 46 | 47 | 48 | @Override 49 | public List read(ItemStack i, List output) { 50 | if (i.getType().name().endsWith("SPAWN_EGG")) { 51 | if (ClassManager.manager.getSpawnEggHandler() != null) { 52 | output.add("monsteregg:" + ClassManager.manager.getSpawnEggHandler().readEgg(i)); 53 | } else { 54 | // no custom output needed: Knowing the material type is enough 55 | } 56 | } 57 | return output; 58 | } 59 | 60 | 61 | @Override 62 | public boolean isSimilar(ItemStack shopItem, ItemStack playerItem, GenesisBuy buy, Player p) { 63 | if (!shopItem.getType().equals(playerItem.getType())) { 64 | return false; 65 | } 66 | 67 | if (ClassManager.manager.getSpawnEggHandler() 68 | != null) { //just necessary for custom mob types: General ones are determined by material name 69 | String mobs = ClassManager.manager.getSpawnEggHandler().readEgg(shopItem); 70 | String mobp = ClassManager.manager.getSpawnEggHandler().readEgg(playerItem); 71 | return mobs.equalsIgnoreCase(mobp); 72 | } 73 | return true; 74 | } 75 | 76 | } 77 | --------------------------------------------------------------------------------