├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── demande-de-changement-.md │ └── demande-de-feature.md ├── issue_template.md ├── pull_request_template.md ├── release.yml └── workflows │ ├── build-test.yml │ ├── check-milestone.yml │ ├── milestone-close.yml │ ├── release-to-discord.yml │ └── tag-sync.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle ├── src ├── main │ ├── java │ │ └── fr │ │ │ └── openmc │ │ │ ├── api │ │ │ ├── chronometer │ │ │ │ ├── Chronometer.java │ │ │ │ ├── ChronometerInfo.java │ │ │ │ └── ChronometerType.java │ │ │ ├── cooldown │ │ │ │ ├── CooldownInterceptor.java │ │ │ │ ├── DynamicCooldown.java │ │ │ │ └── DynamicCooldownManager.java │ │ │ ├── input │ │ │ │ ├── ChatInput.java │ │ │ │ ├── location │ │ │ │ │ ├── InteractionInfo.java │ │ │ │ │ └── ItemInteraction.java │ │ │ │ └── signgui │ │ │ │ │ ├── SignEditor.java │ │ │ │ │ ├── SignGUI.java │ │ │ │ │ ├── SignGUIAction.java │ │ │ │ │ ├── SignGUIBuilder.java │ │ │ │ │ ├── SignGUIChannelHandler.java │ │ │ │ │ ├── SignGUIFinishHandler.java │ │ │ │ │ ├── SignGUIResult.java │ │ │ │ │ ├── exception │ │ │ │ │ ├── SignGUIException.java │ │ │ │ │ └── SignGUIVersionException.java │ │ │ │ │ └── wrapper │ │ │ │ │ └── MojangWrapper.java │ │ │ └── menulib │ │ │ │ ├── Menu.java │ │ │ │ ├── MenuLib.java │ │ │ │ ├── PaginatedMenu.java │ │ │ │ ├── default_menu │ │ │ │ └── ConfirmMenu.java │ │ │ │ └── utils │ │ │ │ ├── InventorySize.java │ │ │ │ ├── ItemBuilder.java │ │ │ │ ├── ItemUtils.java │ │ │ │ ├── MenuUtils.java │ │ │ │ └── StaticSlots.java │ │ │ └── core │ │ │ ├── CommandsManager.java │ │ │ ├── ListenersManager.java │ │ │ ├── OMCPlugin.java │ │ │ ├── commands │ │ │ ├── admin │ │ │ │ └── freeze │ │ │ │ │ ├── FreezeCommand.java │ │ │ │ │ ├── FreezeListener.java │ │ │ │ │ └── FreezeManager.java │ │ │ ├── debug │ │ │ │ ├── ChronometerCommand.java │ │ │ │ └── CooldownCommand.java │ │ │ ├── fun │ │ │ │ ├── Diceroll.java │ │ │ │ └── Playtime.java │ │ │ └── utils │ │ │ │ ├── Restart.java │ │ │ │ ├── Rtp.java │ │ │ │ ├── SetSpawn.java │ │ │ │ ├── Socials.java │ │ │ │ ├── Spawn.java │ │ │ │ └── SpawnManager.java │ │ │ ├── features │ │ │ ├── accountdetection │ │ │ │ ├── AccountDetectionManager.java │ │ │ │ └── commands │ │ │ │ │ └── AccountDetectionCommand.java │ │ │ ├── adminshop │ │ │ │ ├── AdminShopCommand.java │ │ │ │ ├── AdminShopManager.java │ │ │ │ ├── AdminShopUtils.java │ │ │ │ ├── AdminShopYAML.java │ │ │ │ ├── ShopCategory.java │ │ │ │ ├── ShopItem.java │ │ │ │ └── menus │ │ │ │ │ ├── AdminShopCategoryMenu.java │ │ │ │ │ ├── AdminShopMenu.java │ │ │ │ │ ├── ColorVariantsMenu.java │ │ │ │ │ └── ConfirmMenu.java │ │ │ ├── analytics │ │ │ │ ├── AnalyticsManager.java │ │ │ │ └── Stats.java │ │ │ ├── bossbar │ │ │ │ ├── BossbarManager.java │ │ │ │ ├── commands │ │ │ │ │ └── BossBarCommand.java │ │ │ │ └── listeners │ │ │ │ │ └── BossbarListener.java │ │ │ ├── city │ │ │ │ ├── CPermission.java │ │ │ │ ├── ChunkDataCache.java │ │ │ │ ├── City.java │ │ │ │ ├── CityChatManager.java │ │ │ │ ├── CityManager.java │ │ │ │ ├── CityMessages.java │ │ │ │ ├── CityType.java │ │ │ │ ├── ProtectionsManager.java │ │ │ │ ├── commands │ │ │ │ │ ├── AdminCityCommands.java │ │ │ │ │ ├── AdminMayorCommands.java │ │ │ │ │ ├── CityChatCommand.java │ │ │ │ │ ├── CityChestCommand.java │ │ │ │ │ ├── CityCommands.java │ │ │ │ │ └── CityPermsCommands.java │ │ │ │ ├── conditions │ │ │ │ │ ├── CityBankConditions.java │ │ │ │ │ ├── CityClaimCondition.java │ │ │ │ │ ├── CityCreateConditions.java │ │ │ │ │ ├── CityInviteConditions.java │ │ │ │ │ ├── CityKickCondition.java │ │ │ │ │ ├── CityLeaveCondition.java │ │ │ │ │ ├── CityManageConditions.java │ │ │ │ │ └── CityTypeConditions.java │ │ │ │ ├── events │ │ │ │ │ ├── ChunkClaimedEvent.java │ │ │ │ │ ├── CityCreationEvent.java │ │ │ │ │ ├── CityDeleteEvent.java │ │ │ │ │ ├── CityMoneyUpdateEvent.java │ │ │ │ │ ├── CityPermissionChangeEvent.java │ │ │ │ │ ├── CityRenameEvent.java │ │ │ │ │ ├── MemberJoinEvent.java │ │ │ │ │ └── MemberLeaveEvent.java │ │ │ │ ├── listeners │ │ │ │ │ ├── CityChatListener.java │ │ │ │ │ ├── CityTypeCooldown.java │ │ │ │ │ └── protections │ │ │ │ │ │ ├── BlockProtection.java │ │ │ │ │ │ ├── BowProtection.java │ │ │ │ │ │ ├── DamageProtection.java │ │ │ │ │ │ ├── EntityProtection.java │ │ │ │ │ │ ├── ExplodeProtection.java │ │ │ │ │ │ ├── FireProtection.java │ │ │ │ │ │ ├── FishProtection.java │ │ │ │ │ │ ├── FoodProtection.java │ │ │ │ │ │ ├── HangingProtection.java │ │ │ │ │ │ ├── InteractProtection.java │ │ │ │ │ │ ├── LeashProtection.java │ │ │ │ │ │ ├── MountProtection.java │ │ │ │ │ │ ├── PotionProtection.java │ │ │ │ │ │ └── TramplingProtection.java │ │ │ │ ├── mascots │ │ │ │ │ ├── Mascot.java │ │ │ │ │ ├── MascotUtils.java │ │ │ │ │ ├── MascotsLevels.java │ │ │ │ │ ├── MascotsListener.java │ │ │ │ │ └── MascotsManager.java │ │ │ │ ├── mayor │ │ │ │ │ ├── CityLaw.java │ │ │ │ │ ├── ElectionType.java │ │ │ │ │ ├── Mayor.java │ │ │ │ │ ├── MayorCandidate.java │ │ │ │ │ ├── MayorVote.java │ │ │ │ │ ├── listeners │ │ │ │ │ │ ├── JoinListener.java │ │ │ │ │ │ ├── PhaseListener.java │ │ │ │ │ │ └── UrneListener.java │ │ │ │ │ ├── managers │ │ │ │ │ │ ├── MayorManager.java │ │ │ │ │ │ ├── NPCManager.java │ │ │ │ │ │ └── PerkManager.java │ │ │ │ │ ├── npcs │ │ │ │ │ │ ├── MayorNPC.java │ │ │ │ │ │ └── OwnerNPC.java │ │ │ │ │ └── perks │ │ │ │ │ │ ├── PerkType.java │ │ │ │ │ │ ├── Perks.java │ │ │ │ │ │ ├── basic │ │ │ │ │ │ ├── AyweniterPerk.java │ │ │ │ │ │ ├── CityHunterPerk.java │ │ │ │ │ │ ├── DemonFruitPerk.java │ │ │ │ │ │ ├── GPSTrackerPerk.java │ │ │ │ │ │ ├── MascotFriendlyPerk.java │ │ │ │ │ │ ├── MinerPerk.java │ │ │ │ │ │ ├── RagePerk.java │ │ │ │ │ │ └── SymbiosisPerk.java │ │ │ │ │ │ ├── event │ │ │ │ │ │ ├── AgriculturalEssorPerk.java │ │ │ │ │ │ ├── IdyllicRain.java │ │ │ │ │ │ ├── ImpotCollection.java │ │ │ │ │ │ ├── MilitaryDissuasion.java │ │ │ │ │ │ └── MineralRushPerk.java │ │ │ │ │ │ └── readme.md │ │ │ │ └── menu │ │ │ │ │ ├── CitizensPermsMenu.java │ │ │ │ │ ├── CityChestMenu.java │ │ │ │ │ ├── CityChunkMenu.java │ │ │ │ │ ├── CityMenu.java │ │ │ │ │ ├── CityModifyMenu.java │ │ │ │ │ ├── CityTransferMenu.java │ │ │ │ │ ├── CityTypeMenu.java │ │ │ │ │ ├── InvitationsMenu.java │ │ │ │ │ ├── NoCityMenu.java │ │ │ │ │ ├── bank │ │ │ │ │ ├── CityBankDepositMenu.java │ │ │ │ │ ├── CityBankMenu.java │ │ │ │ │ └── CityBankWithdrawMenu.java │ │ │ │ │ ├── list │ │ │ │ │ ├── CityListDetailsMenu.java │ │ │ │ │ └── CityListMenu.java │ │ │ │ │ ├── mascots │ │ │ │ │ ├── MascotMenu.java │ │ │ │ │ ├── MascotsDeadMenu.java │ │ │ │ │ └── MascotsSkinMenu.java │ │ │ │ │ ├── mayor │ │ │ │ │ ├── MayorElectionMenu.java │ │ │ │ │ ├── MayorLawMenu.java │ │ │ │ │ ├── MayorMandateMenu.java │ │ │ │ │ ├── MayorVoteMenu.java │ │ │ │ │ ├── MoreInfoMenu.java │ │ │ │ │ ├── create │ │ │ │ │ │ ├── MayorColorMenu.java │ │ │ │ │ │ ├── MayorCreateMenu.java │ │ │ │ │ │ ├── MayorModifyMenu.java │ │ │ │ │ │ ├── MenuType.java │ │ │ │ │ │ └── PerkChoiceMenu.java │ │ │ │ │ └── npc │ │ │ │ │ │ ├── MayorNpcMenu.java │ │ │ │ │ │ └── OwnerNpcMenu.java │ │ │ │ │ └── playerlist │ │ │ │ │ ├── CityPlayerGestionMenu.java │ │ │ │ │ └── CityPlayerListMenu.java │ │ │ ├── contest │ │ │ │ ├── ContestData.java │ │ │ │ ├── ContestEndEvent.java │ │ │ │ ├── ContestPlayer.java │ │ │ │ ├── commands │ │ │ │ │ └── ContestCommand.java │ │ │ │ ├── listeners │ │ │ │ │ ├── ContestIntractEvents.java │ │ │ │ │ └── ContestListener.java │ │ │ │ ├── managers │ │ │ │ │ ├── ContestManager.java │ │ │ │ │ └── ContestPlayerManager.java │ │ │ │ └── menu │ │ │ │ │ ├── ConfirmMenu.java │ │ │ │ │ ├── ContributionMenu.java │ │ │ │ │ ├── MoreInfoMenu.java │ │ │ │ │ ├── TradeMenu.java │ │ │ │ │ └── VoteMenu.java │ │ │ ├── corporation │ │ │ │ ├── CorpPermission.java │ │ │ │ ├── ItemsAdderIntegration.java │ │ │ │ ├── MethodState.java │ │ │ │ ├── commands │ │ │ │ │ ├── CompanyCommand.java │ │ │ │ │ └── ShopCommand.java │ │ │ │ ├── company │ │ │ │ │ ├── Company.java │ │ │ │ │ └── CompanyOwner.java │ │ │ │ ├── data │ │ │ │ │ ├── MerchantData.java │ │ │ │ │ └── TransactionData.java │ │ │ │ ├── listener │ │ │ │ │ ├── CustomItemsCompanyListener.java │ │ │ │ │ └── ShopListener.java │ │ │ │ ├── manager │ │ │ │ │ ├── CompanyManager.java │ │ │ │ │ ├── PlayerShopManager.java │ │ │ │ │ └── ShopBlocksManager.java │ │ │ │ ├── menu │ │ │ │ │ ├── company │ │ │ │ │ │ ├── CompanyBaltopMenu.java │ │ │ │ │ │ ├── CompanyBankTransactionsMenu.java │ │ │ │ │ │ ├── CompanyMenu.java │ │ │ │ │ │ ├── CompanySearchMenu.java │ │ │ │ │ │ └── ShopManageMenu.java │ │ │ │ │ └── shop │ │ │ │ │ │ ├── ShopCatalogueMenu.java │ │ │ │ │ │ ├── ShopMenu.java │ │ │ │ │ │ ├── ShopSalesMenu.java │ │ │ │ │ │ ├── ShopSearchMenu.java │ │ │ │ │ │ └── ShopStocksMenu.java │ │ │ │ └── shops │ │ │ │ │ ├── Shop.java │ │ │ │ │ ├── ShopItem.java │ │ │ │ │ ├── ShopOwner.java │ │ │ │ │ └── Supply.java │ │ │ ├── economy │ │ │ │ ├── BankManager.java │ │ │ │ ├── EconomyData.java │ │ │ │ ├── EconomyManager.java │ │ │ │ ├── Transaction.java │ │ │ │ ├── TransactionsManager.java │ │ │ │ ├── TransactionsMenu.java │ │ │ │ ├── commands │ │ │ │ │ ├── Baltop.java │ │ │ │ │ ├── BankCommands.java │ │ │ │ │ ├── History.java │ │ │ │ │ ├── Money.java │ │ │ │ │ └── Pay.java │ │ │ │ └── menu │ │ │ │ │ ├── PersonalBankDepositMenu.java │ │ │ │ │ ├── PersonalBankMenu.java │ │ │ │ │ └── PersonalBankWithdrawMenu.java │ │ │ ├── friend │ │ │ │ ├── FriendCommand.java │ │ │ │ ├── FriendManager.java │ │ │ │ ├── FriendRequest.java │ │ │ │ └── FriendSQLManager.java │ │ │ ├── homes │ │ │ │ ├── Home.java │ │ │ │ ├── HomeIcons.java │ │ │ │ ├── HomeLimit.java │ │ │ │ ├── HomeLimits.java │ │ │ │ ├── HomeUpgradeManager.java │ │ │ │ ├── HomesManager.java │ │ │ │ ├── command │ │ │ │ │ ├── DelHome.java │ │ │ │ │ ├── HomeWorld.java │ │ │ │ │ ├── RelocateHome.java │ │ │ │ │ ├── RenameHome.java │ │ │ │ │ ├── SetHome.java │ │ │ │ │ └── TpHome.java │ │ │ │ ├── menu │ │ │ │ │ ├── HomeChangeIconMenu.java │ │ │ │ │ ├── HomeConfigMenu.java │ │ │ │ │ ├── HomeDeleteConfirmMenu.java │ │ │ │ │ ├── HomeMenu.java │ │ │ │ │ └── HomeUpgradeMenu.java │ │ │ │ ├── utils │ │ │ │ │ └── HomeUtil.java │ │ │ │ └── world │ │ │ │ │ ├── DisabledWorldHome.java │ │ │ │ │ └── WorldDisableInfo.java │ │ │ ├── leaderboards │ │ │ │ ├── LeaderboardManager.java │ │ │ │ ├── commands │ │ │ │ │ └── LeaderboardCommands.java │ │ │ │ ├── listeners │ │ │ │ │ └── LeaderboardListener.java │ │ │ │ └── utils │ │ │ │ │ └── PacketUtils.java │ │ │ ├── mailboxes │ │ │ │ ├── MailboxCommand.java │ │ │ │ ├── MailboxListener.java │ │ │ │ ├── MailboxManager.java │ │ │ │ ├── letter │ │ │ │ │ ├── LetterHead.java │ │ │ │ │ └── SenderLetter.java │ │ │ │ ├── menu │ │ │ │ │ ├── HomeMailbox.java │ │ │ │ │ ├── PendingMailbox.java │ │ │ │ │ ├── PlayerMailbox.java │ │ │ │ │ ├── PlayersList.java │ │ │ │ │ └── letter │ │ │ │ │ │ ├── Letter.java │ │ │ │ │ │ └── SendingLetter.java │ │ │ │ └── utils │ │ │ │ │ ├── MailboxInv.java │ │ │ │ │ ├── MailboxMenuManager.java │ │ │ │ │ ├── MailboxUtils.java │ │ │ │ │ └── PaginatedMailbox.java │ │ │ ├── quests │ │ │ │ ├── QuestProgressSaveManager.java │ │ │ │ ├── QuestsManager.java │ │ │ │ ├── command │ │ │ │ │ └── QuestCommand.java │ │ │ │ ├── menus │ │ │ │ │ └── QuestsMenu.java │ │ │ │ ├── objects │ │ │ │ │ ├── Quest.java │ │ │ │ │ ├── QuestBuilder.java │ │ │ │ │ ├── QuestStep.java │ │ │ │ │ └── QuestTier.java │ │ │ │ ├── quests │ │ │ │ │ ├── BreakDiamondQuest.java │ │ │ │ │ ├── BreakLogQuest.java │ │ │ │ │ ├── BreakStoneQuest.java │ │ │ │ │ ├── BreakWheatQuest.java │ │ │ │ │ ├── ChickenThrowerQuest.java │ │ │ │ │ ├── CityCreateQuest.java │ │ │ │ │ ├── ConsumeKebabQuest.java │ │ │ │ │ ├── CraftCakeQuest.java │ │ │ │ │ ├── CraftDiamondArmorQuest.java │ │ │ │ │ ├── CraftKebabQuest.java │ │ │ │ │ ├── EnchantFirstItemQuest.java │ │ │ │ │ ├── FishingQuest.java │ │ │ │ │ ├── KillPlayersQuest.java │ │ │ │ │ ├── KillSuperCreeperQuest.java │ │ │ │ │ ├── KillZombieQuest.java │ │ │ │ │ ├── MineAyweniteQuest.java │ │ │ │ │ ├── SaveTheEarthQuest.java │ │ │ │ │ ├── SmeltIronQuest.java │ │ │ │ │ ├── WalkQuests.java │ │ │ │ │ └── WinContestQuest.java │ │ │ │ ├── readme.md │ │ │ │ └── rewards │ │ │ │ │ ├── QuestItemReward.java │ │ │ │ │ ├── QuestMoneyReward.java │ │ │ │ │ └── QuestReward.java │ │ │ ├── scoreboards │ │ │ │ ├── GlobalTeamManager.java │ │ │ │ ├── ScoreboardManager.java │ │ │ │ └── TabList.java │ │ │ ├── tpa │ │ │ │ ├── TPAManager.java │ │ │ │ ├── TPAQueue.java │ │ │ │ └── commands │ │ │ │ │ ├── TPACommand.java │ │ │ │ │ ├── TPAcceptCommand.java │ │ │ │ │ ├── TPCancelCommand.java │ │ │ │ │ └── TPDenyCommand.java │ │ │ └── updates │ │ │ │ ├── UpdateCommand.java │ │ │ │ ├── UpdateListener.java │ │ │ │ └── UpdateManager.java │ │ │ ├── listeners │ │ │ ├── AsyncChatListener.java │ │ │ ├── ChronometerListener.java │ │ │ ├── ClockInfos.java │ │ │ ├── CubeListener.java │ │ │ ├── JoinMessageListener.java │ │ │ ├── PlayerDeathListener.java │ │ │ ├── RespawnListener.java │ │ │ ├── SessionsListener.java │ │ │ └── SleepListener.java │ │ │ └── utils │ │ │ ├── CacheOfflinePlayer.java │ │ │ ├── ChunkInfo.java │ │ │ ├── ChunkPos.java │ │ │ ├── ColorUtils.java │ │ │ ├── DateUtils.java │ │ │ ├── DiscordWebhook.java │ │ │ ├── InputUtils.java │ │ │ ├── ItemUtils.java │ │ │ ├── MaterialUtils.java │ │ │ ├── MotdUtils.java │ │ │ ├── PlayerNameCache.java │ │ │ ├── PlayerUtils.java │ │ │ ├── Queue.java │ │ │ ├── api │ │ │ ├── FancyNpcApi.java │ │ │ ├── ItemAdderApi.java │ │ │ ├── LuckPermsApi.java │ │ │ ├── PapiApi.java │ │ │ └── WorldGuardApi.java │ │ │ ├── customfonts │ │ │ ├── CustomFonts.java │ │ │ └── Fonts.java │ │ │ ├── customitems │ │ │ ├── CustomItem.java │ │ │ ├── CustomItemRegistry.java │ │ │ ├── CustomItemsDebugCommand.java │ │ │ ├── armors │ │ │ │ ├── SuitBoots.java │ │ │ │ ├── SuitChestplate.java │ │ │ │ ├── SuitHelmet.java │ │ │ │ └── SuitLeggings.java │ │ │ ├── buttons │ │ │ │ ├── AcceptButton.java │ │ │ │ ├── CloseButton.java │ │ │ │ ├── MinusButton.java │ │ │ │ ├── NextPage.java │ │ │ │ ├── OneButton.java │ │ │ │ ├── PlusButton.java │ │ │ │ ├── PreviousPage.java │ │ │ │ ├── RefuseButton.java │ │ │ │ ├── SearchButton.java │ │ │ │ ├── StackButton.java │ │ │ │ └── TenButton.java │ │ │ └── items │ │ │ │ ├── Aywenite.java │ │ │ │ ├── ContestShell.java │ │ │ │ ├── KebabItem.java │ │ │ │ ├── MascotWand.java │ │ │ │ ├── WarpWand.java │ │ │ │ ├── company │ │ │ │ └── CompanyBox.java │ │ │ │ └── homes │ │ │ │ ├── Bin.java │ │ │ │ ├── BinRed.java │ │ │ │ ├── Information.java │ │ │ │ ├── Invisible.java │ │ │ │ ├── Upgrade.java │ │ │ │ └── icons │ │ │ │ ├── Axenq.java │ │ │ │ ├── Bank.java │ │ │ │ ├── Chateau.java │ │ │ │ ├── Chest.java │ │ │ │ ├── Default.java │ │ │ │ ├── Farm.java │ │ │ │ ├── Home.java │ │ │ │ ├── Sandblock.java │ │ │ │ ├── Shop.java │ │ │ │ └── Xernas.java │ │ │ ├── database │ │ │ └── DatabaseManager.java │ │ │ ├── menu │ │ │ └── ConfirmMenu.java │ │ │ ├── messages │ │ │ ├── MessageType.java │ │ │ ├── MessagesManager.java │ │ │ └── Prefix.java │ │ │ ├── serializer │ │ │ ├── BukkitSerializer.java │ │ │ └── LocationSerializer.java │ │ │ ├── translation │ │ │ └── TranslationManager.java │ │ │ └── world │ │ │ ├── WorldUtils.java │ │ │ └── Yaw.java │ └── resources │ │ ├── config.yml │ │ ├── data │ │ ├── accountdetection.yml │ │ ├── adminshop.yml │ │ ├── bossbars.yml │ │ ├── contest.yml │ │ ├── leaderboards.yml │ │ ├── mascots.yml │ │ ├── motd.yml │ │ ├── rtp.yml │ │ └── spawn.yml │ │ ├── plugin.yml │ │ └── translations │ │ └── fr.yml └── test │ ├── java │ └── fr │ │ └── openmc │ │ └── core │ │ ├── OMCPluginTest.java │ │ └── utils │ │ ├── DateUtilsTest.java │ │ ├── InputUtilsTest.java │ │ ├── ItemsUtilTest.java │ │ └── MotdUtilsTest.java │ └── resources │ ├── config.yml │ └── plugin.yml └── third_party_licenses └── SignGUI_LICENSE /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Créé un report d'un bug pour nous aider ! 4 | title: "[BUG] " 5 | labels: ":lady_beetle: Bug Report" 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Décrire le bug ?** 11 | _une description claire du bug_ 12 | 13 | **Pour le reproduire** 14 | Étape pour reproduire le Bug 15 | 1. Aller '...' 16 | 2. Cliquer sur '....' 17 | 3. Taper la commande '....' 18 | 19 | **Capture d'écran** 20 | _si possible ajouter des photos du bug_ 21 | 22 | **Informations Supplémentaires :** 23 | - Serveur : [ex. local, production] 24 | Si local alors : 25 | - Plugins : [ex. ItemAdder 4.0.9, ...] 26 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/demande-de-changement-.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 'Demande de Changement ' 3 | about: 'Demandez un Changement/Amélioration sur une Feature ' 4 | title: "[CHANGE] " 5 | labels: ":arrows_counterclockwise: Changement" 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Le Changement concerne quelle Feature ?** 11 | _veuillez décrire, dire quelle feature (ex. La Banque de la Ville, Les Trades des Contests, ...)_ 12 | 13 | **Description du Changement** 14 | _veuillez donner une description précise (ex. Réduire le cooldown entre la navigation de 2 menu, ...)_ 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/demande-de-feature.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Demande de Feature 3 | about: Suggérer une idée pour OpenMC ! 4 | title: "[FEAT]" 5 | labels: ":package: Features" 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Décrire votre Feature que vous voulez demander** 11 | _Une bonne description qui décrit tout ce que vous voulez_ 12 | 13 | **Capture d'écran** 14 | _des photos de GUI, pour bien de mob, de lore_ 15 | 16 | **Voulez vous faire cette feature ? :** 17 | -------------------------------------------------------------------------------- /.github/issue_template.md: -------------------------------------------------------------------------------- 1 | ## Pour que votre Issue soit accepté, il vous faut : 2 | * Quel Type d'Issue (bug, feature, ...) : 3 | 4 | ## Decrivez vos changements 5 | *Clairement et avec des screenshots si nécessaires* -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## Petit résumé de la PR: 2 | 3 | 4 | ## Étape nécessaire afin que la PR soit fini (si PR en draft) 5 | 6 | 7 | 8 | - [ ] Suivre le [Code de Conduite](https://github.com/ServerOpenMC/PluginV2/blob/master/CODE_OF_CONDUCT.md) 9 | - [ ] Enlever tous les imports non utilisés 10 | - [ ] Bien documenter la feature 11 | - [ ] Fournir un profileur (si besoin/demandé par un admin) 12 | - [ ] Avoir une milestone associée à la PR 13 | - [ ] Valider tout les checks 14 | - [ ] Tester et valider la feature/changement 15 | 16 | * Les Issues corrigée(s) en commun : 17 | 18 | ## Decrivez vos changements 19 | 20 | -------------------------------------------------------------------------------- /.github/release.yml: -------------------------------------------------------------------------------- 1 | changelog: 2 | categories: 3 | - title: Nouvelles Fonctionnalités 4 | labels: 5 | - "🆙 Amélioration" 6 | - ":arrows_counterclockwise: Changement" 7 | - ":package: Features" 8 | - title: Bugs et Optimisations 9 | labels: 10 | - "⚡Optimisation" 11 | - ":sparkles: Fixes" 12 | - title: Autre 13 | labels: 14 | - "*" 15 | -------------------------------------------------------------------------------- /.github/workflows/build-test.yml: -------------------------------------------------------------------------------- 1 | name: Build & Test 2 | 3 | on: 4 | pull_request: 5 | paths-ignore: 6 | - '.github/**' 7 | - '.gitignore' 8 | - 'LICENSE' 9 | - 'README.md' 10 | push: 11 | paths-ignore: 12 | - '.github/**' 13 | - '.gitignore' 14 | - 'LICENSE' 15 | - 'README.md' 16 | 17 | jobs: 18 | test: 19 | name: Test 20 | runs-on: ubuntu-latest 21 | steps: 22 | - name: Checkout repository 23 | uses: actions/checkout@v4 24 | 25 | - name: Set up JDK 21 26 | uses: actions/setup-java@v4 27 | with: 28 | distribution: temurin 29 | java-version: 21 30 | 31 | - name: Make gradlew executable 32 | run: chmod +x ./gradlew 33 | 34 | - name: Run Tests with Gradle 35 | run: ./gradlew test 36 | 37 | - name: Report test results 38 | uses: dorny/test-reporter@v2 39 | if: always() 40 | with: 41 | name: Gradle Tests 42 | path: build/test-results/test/*.xml 43 | reporter: java-junit 44 | fail-on-error: true 45 | 46 | build: 47 | name: Build 48 | runs-on: ubuntu-latest 49 | permissions: write-all 50 | steps: 51 | - name: Checkout Repository 52 | uses: actions/checkout@v4 53 | with: 54 | fetch-depth: 0 55 | 56 | - name: Set up JDK 21 57 | uses: actions/setup-java@v4 58 | with: 59 | distribution: temurin 60 | java-version: 21 61 | 62 | - name: Make gradlew executable 63 | run: chmod +x ./gradlew 64 | 65 | - name: Build with snapshot version 66 | env: 67 | SNAPSHOT: true 68 | GITHUB_SHA: ${{ github.sha }} 69 | run: ./gradlew jar 70 | 71 | - name: Upload Plugin jar 72 | uses: actions/upload-artifact@v4 73 | with: 74 | name: OpenMC-${{ github.sha }} 75 | path: builds/ 76 | -------------------------------------------------------------------------------- /.github/workflows/check-milestone.yml: -------------------------------------------------------------------------------- 1 | name: Milestone Check 2 | 3 | on: 4 | pull_request: 5 | types: [opened, edited, reopened, synchronize] 6 | 7 | jobs: 8 | check-milestone: 9 | name: Milestone check 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Verify that PR has been assigned a milestone 13 | run: | 14 | if [ "${{ github.event.pull_request.milestone }}" == "" ]; then 15 | echo "❌ PR has not been assigned a milestone." 16 | exit 1 17 | fi 18 | -------------------------------------------------------------------------------- /.github/workflows/release-to-discord.yml: -------------------------------------------------------------------------------- 1 | name: Release to Discord 2 | on: 3 | release: 4 | types: [published] 5 | 6 | jobs: 7 | github-releases-to-discord: 8 | runs-on: ubuntu-latest 9 | name: Release to Discord 10 | steps: 11 | - name: Checkout 12 | uses: actions/checkout@v4 13 | - name: Github Releases To Discord 14 | uses: SethCohen/github-releases-to-discord@v1.16.2 15 | with: 16 | webhook_url: ${{ secrets.WEBHOOK_URL }} 17 | color: "16021398" # decimal of #f47796 18 | username: "Mise à jour de OpenMC" 19 | avatar_url: "https://raw.githubusercontent.com/ServerOpenMC/.github/refs/heads/master/brandkit/logo.png" 20 | #content: "||<@&1258420105209974804>||" 21 | footer_title: "Changements" 22 | footer_icon_url: "https://raw.githubusercontent.com/ServerOpenMC/.github/refs/heads/master/brandkit/logo.png" 23 | footer_timestamp: true 24 | max_description: '16384' 25 | reduce_headings: true 26 | -------------------------------------------------------------------------------- /.github/workflows/tag-sync.yml: -------------------------------------------------------------------------------- 1 | name: Sync Tags from Upstream 2 | 3 | on: 4 | push: 5 | workflow_dispatch: 6 | schedule: 7 | - cron: '0 0 * * *' # Runs at 00:00 UTC every day 8 | 9 | jobs: 10 | sync-tags: 11 | if: github.repository != 'ServerOpenMC/PluginV2' 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout repository 15 | uses: actions/checkout@v4 16 | with: 17 | fetch-depth: 0 18 | token: ${{ secrets.GITHUB_TOKEN }} 19 | 20 | - name: Configure Git 21 | run: | 22 | git config user.name "GitHub Actions" 23 | git config user.email "actions@github.com" 24 | 25 | - name: Sync tags from upstream 26 | run: | 27 | git remote add upstream https://github.com/ServerOpenMC/PluginV2.git 28 | git fetch upstream --tags 29 | git push origin --tags 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Plugin OpenMC 2 | Nouveau plugin collaboratif pour un serveur : VOTRE serveur ! 3 | 4 | 5 | 6 | 7 | 8 | ## 🤝 Rejoindre le développement. 9 | 1. Commencez par forker le dépôt et rejoindre le [Discord](https://discord.gg/aywen) 10 | 2. Assurez-vous de bien suivre [CONTRIBUTING.md](https://github.com/ServerOpenMC/PluginV2/blob/master/CONTRIBUTING.md) 11 | 3. Une fois qu'une fonctionnalité est implémentée et fonctionnelle, créez une pull request. 12 | 4. Après approbation, elle sera disponible sur le serveur de développement pour les tests. 13 | 14 | Serveur de test : `dev.openmc.fr` (1.21.5 Java Edition) 15 | 16 | Serveur de la beta : `beta.openmc.fr` (1.21.5 Java Edition) 17 | 18 | Serveur de jeu : `play.openmc.fr` (1.21.5 Java Edition) 19 | 20 | ## 📘 En apprendre plus. 21 | Vous voulez en savoir plus ? Vous voulez avoir des tutoriels à propos d'OpenMC ? 22 | Cliquez [ici](https://github.com/ServerOpenMC/PluginV2/wiki) afin d'accéder au wiki 23 | 24 | ## 📃 License 25 | Projet sous [GPL-3.0 license](https://choosealicense.com/licenses/gpl-3.0/). 26 | 27 | ## Crédits 28 | Ce projet intègre du code provenant de la repo [SignGUI](https://github.com/Rapha149/SignGUI), spécifiquement de la [Pull Request #30](https://github.com/Rapha149/SignGUI/pull/30) pour la mise à jour de compatibilité avec Minecraft 1.21.5. 29 | La repo originale est sous licence [MIT](https://github.com/Rapha149/SignGUI/blob/main/LICENSE). 30 | 31 | --- 32 | Merci à @MathiasDPX pour la nouvelle configuration du repo. 33 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServerOpenMC/PluginV2/8972bdcd7f867a3fabd71069a0e4a818d42570ae/gradle.properties -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ServerOpenMC/PluginV2/8972bdcd7f867a3fabd71069a0e4a818d42570ae/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'OpenMC' 2 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/api/chronometer/ChronometerInfo.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.api.chronometer; 2 | 3 | import lombok.Getter; 4 | 5 | 6 | @Getter 7 | public class ChronometerInfo { 8 | private final String chronometerGroup; 9 | private final int chronometerTime; 10 | 11 | public ChronometerInfo(String chronometerGroup, int chronometerTime) { 12 | this.chronometerTime = chronometerTime; 13 | this.chronometerGroup = chronometerGroup; 14 | } 15 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/api/chronometer/ChronometerType.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.api.chronometer; 2 | 3 | import lombok.Getter; 4 | import net.md_5.bungee.api.ChatMessageType; 5 | 6 | @Getter 7 | public enum ChronometerType { 8 | ACTION_BAR(ChatMessageType.ACTION_BAR), 9 | CHAT(ChatMessageType.CHAT), 10 | SYSTEM(ChatMessageType.SYSTEM); 11 | 12 | private final ChatMessageType chatMessageType; 13 | 14 | ChronometerType(ChatMessageType chatMessageType) { 15 | if (chatMessageType==null){ 16 | chatMessageType = ChatMessageType.SYSTEM; 17 | } 18 | this.chatMessageType = chatMessageType; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/api/cooldown/CooldownInterceptor.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.api.cooldown; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | import org.jetbrains.annotations.Unmodifiable; 5 | import revxrsal.commands.command.CommandActor; 6 | import revxrsal.commands.command.ExecutableCommand; 7 | import revxrsal.commands.process.CommandCondition; 8 | 9 | import java.util.List; 10 | 11 | public class CooldownInterceptor implements CommandCondition { 12 | @Override 13 | public void test(@NotNull CommandActor actor, @NotNull ExecutableCommand command, @NotNull @Unmodifiable List arguments) { 14 | 15 | DynamicCooldown cooldown = command.getAnnotation(DynamicCooldown.class); 16 | if (cooldown == null) { 17 | return; 18 | } 19 | 20 | if (!DynamicCooldownManager.isReady(actor.getUniqueId().toString(), cooldown.group())) { 21 | long remaining = DynamicCooldownManager.getRemaining(actor.getUniqueId().toString(), cooldown.group()); 22 | String message = cooldown.message(); 23 | message = message.replace("%sec%", String.valueOf(remaining / 1000)); 24 | message = message.replace("%ms%", String.valueOf(remaining)); 25 | actor.reply(message); 26 | throw new IllegalStateException("Cooldown active"); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/api/cooldown/DynamicCooldown.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.api.cooldown; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target(ElementType.METHOD) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface DynamicCooldown { 11 | /** 12 | * The cooldown group name 13 | * @return group name 14 | */ 15 | String group() default "general"; 16 | 17 | /** 18 | * The message to show when cooldown is active 19 | * @return message 20 | */ 21 | String message() default "§cVous devez attendre %sec%s"; 22 | /* 23 | %sec% | Le temps restant en secondes 24 | %ms% | Le temps restant en millisecondes 25 | */ 26 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/api/input/ChatInput.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.api.input; 2 | 3 | import io.papermc.paper.event.player.AsyncChatEvent; 4 | import net.kyori.adventure.text.TextComponent; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.event.EventHandler; 7 | import org.bukkit.event.Listener; 8 | 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | import java.util.UUID; 12 | import java.util.function.Consumer; 13 | 14 | public class ChatInput implements Listener { 15 | 16 | private static final Map> playerInputs = new HashMap<>(); 17 | 18 | public static void sendInput(Player player, String startMessage, Consumer callback) { 19 | playerInputs.put(player.getUniqueId(), callback); 20 | player.closeInventory(); 21 | player.sendMessage(startMessage); 22 | } 23 | 24 | @EventHandler 25 | public void onPlayerChat(AsyncChatEvent event) { 26 | Player player = event.getPlayer(); 27 | if (playerInputs.containsKey(player.getUniqueId())) { 28 | event.setCancelled(true); 29 | 30 | Consumer callback = playerInputs.remove(player.getUniqueId()); 31 | 32 | if (event.message() instanceof TextComponent textComponent) { 33 | String string = textComponent.content(); 34 | if (string.contains("cancel")) { 35 | player.sendMessage("§eVous avez annulé l'action !"); 36 | callback.accept(null); 37 | } 38 | callback.accept(string); 39 | } 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/api/input/location/InteractionInfo.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.api.input.location; 2 | 3 | import fr.openmc.api.chronometer.ChronometerInfo; 4 | import lombok.Getter; 5 | import org.bukkit.inventory.ItemStack; 6 | 7 | @Getter 8 | public class InteractionInfo { 9 | private final ItemStack item; 10 | private final ChronometerInfo chronometerInfo; 11 | 12 | public InteractionInfo(ItemStack item, ChronometerInfo chronometerInfo) { 13 | this.chronometerInfo = chronometerInfo; 14 | this.item = item; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/api/input/signgui/SignEditor.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.api.input.signgui; 2 | 3 | import io.netty.channel.ChannelPipeline; 4 | import org.bukkit.Location; 5 | 6 | // Ce code est basé sur le fichier SignEditor.java du dépôt SignGUI 7 | // (https://github.com/Rapha149/SignGUI). Licence originale : MIT. 8 | public class SignEditor { 9 | 10 | private final Object sign; 11 | private final Location location; 12 | private final Object blockPosition; 13 | private final ChannelPipeline pipeline; 14 | 15 | public SignEditor(Object sign, Location location, Object blockPosition, ChannelPipeline pipeline) { 16 | this.sign = sign; 17 | this.location = location; 18 | this.blockPosition = blockPosition; 19 | this.pipeline = pipeline; 20 | } 21 | 22 | public Object getSign() { 23 | return sign; 24 | } 25 | 26 | public Location getLocation() { 27 | return location; 28 | } 29 | 30 | public Object getBlockPosition() { 31 | return blockPosition; 32 | } 33 | 34 | public ChannelPipeline getPipeline() { 35 | return pipeline; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/api/input/signgui/SignGUIChannelHandler.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.api.input.signgui; 2 | 3 | import io.netty.handler.codec.MessageToMessageDecoder; 4 | 5 | // Ce code est basé sur le fichier SignGUIChannelHandler.java du dépôt SignGUI 6 | // (https://github.com/Rapha149/SignGUI). Licence originale : MIT. 7 | public abstract class SignGUIChannelHandler extends MessageToMessageDecoder { 8 | 9 | public abstract Object getBlockPosition(); 10 | 11 | public abstract void close(); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/api/input/signgui/SignGUIFinishHandler.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.api.input.signgui; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | import java.util.List; 6 | 7 | // Ce code est basé sur le fichier SignGUIFinishHandler.java du dépôt SignGUI 8 | // (https://github.com/Rapha149/SignGUI). Licence originale : MIT. 9 | /** 10 | * A functional interface used for handling the result of the sign editing. 11 | */ 12 | @FunctionalInterface 13 | public interface SignGUIFinishHandler { 14 | 15 | /** 16 | * Called when the player finished editing the sign. 17 | * Return a list of actions that should be executed after the editing is finished. The actions are executed in the order they are in the list. 18 | * If {@link SignGUIAction#displayNewLines(String...)} is not included, the sign gui will be closed. 19 | * If you just want to close the sign gui, return an empty list or null. 20 | * 21 | * @param player The player who edited the sign. 22 | * @param result The result of the editing. 23 | * @return The list of actions. 24 | */ 25 | List onFinish(Player player, SignGUIResult result); 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/api/input/signgui/SignGUIResult.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.api.input.signgui; 2 | 3 | import org.bukkit.ChatColor; 4 | 5 | // Ce code est basé sur le fichier SignGUIResult.java du dépôt SignGUI 6 | // (https://github.com/Rapha149/SignGUI). Licence originale : MIT. 7 | /** 8 | * The result of the sign editing. 9 | */ 10 | public class SignGUIResult { 11 | 12 | private final String[] lines; 13 | 14 | SignGUIResult(String[] lines) { 15 | this.lines = lines; 16 | } 17 | 18 | /** 19 | * @return The lines of the sign when the player finished editing. 20 | */ 21 | public String[] getLines() { 22 | return lines; 23 | } 24 | 25 | /** 26 | * Used for getting a specific line of the sign. 27 | * @param index The index of the desired line. 28 | * @return The line at the given index. 29 | */ 30 | public String getLine(int index) { 31 | return lines[index]; 32 | } 33 | 34 | /** 35 | * Used for getting the lines of the sign without color codes. 36 | * Calls {@link org.bukkit.ChatColor#stripColor(String)} on each line. 37 | * This method only strips color codes with § (not with {@literal &} for example). 38 | * 39 | * @return The lines of the sign without color codes. 40 | */ 41 | public String[] getLinesWithoutColor() { 42 | String[] linesWithoutColor = new String[lines.length]; 43 | for (int i = 0; i < lines.length; i++) 44 | linesWithoutColor[i] = ChatColor.stripColor(lines[i]); 45 | return linesWithoutColor; 46 | } 47 | 48 | /** 49 | * Used for getting a specific line of the sign without color codes. 50 | * Calls {@link org.bukkit.ChatColor#stripColor(String)} on the line. 51 | * This method only strips color codes with § (not with {@literal &} for example). 52 | * 53 | * @param index The index of the desired line. 54 | * @return The line at the given index without color codes. 55 | */ 56 | public String getLineWithoutColor(int index) { 57 | return ChatColor.stripColor(lines[index]); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/api/input/signgui/exception/SignGUIException.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.api.input.signgui.exception; 2 | 3 | // Ce code est basé sur le fichier SignGUIException.java du dépôt SignGUI 4 | // (https://github.com/Rapha149/SignGUI). Licence originale : MIT. 5 | /** 6 | * An exception thrown when an error occurs while using this api. 7 | */ 8 | public class SignGUIException extends RuntimeException { 9 | 10 | /** 11 | * {@inheritDoc} 12 | */ 13 | public SignGUIException() { 14 | } 15 | 16 | /** 17 | * {@inheritDoc} 18 | */ 19 | public SignGUIException(String message) { 20 | super(message); 21 | } 22 | 23 | /** 24 | * {@inheritDoc} 25 | */ 26 | public SignGUIException(String message, Throwable cause) { 27 | super(message, cause); 28 | } 29 | 30 | /** 31 | * {@inheritDoc} 32 | */ 33 | public SignGUIException(Throwable cause) { 34 | super(cause); 35 | } 36 | 37 | /** 38 | * {@inheritDoc} 39 | */ 40 | public SignGUIException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { 41 | super(message, cause, enableSuppression, writableStackTrace); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/api/input/signgui/exception/SignGUIVersionException.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.api.input.signgui.exception; 2 | 3 | // Ce code est basé sur le fichier SignGUIVersionException.java du dépôt SignGUI 4 | // (https://github.com/Rapha149/SignGUI). Licence originale : MIT. 5 | /** 6 | * An exception thrown when the server version is not supported by this api or an error occured during initialization. 7 | */ 8 | public class SignGUIVersionException extends Exception { 9 | 10 | /** 11 | * {@inheritDoc} 12 | */ 13 | public SignGUIVersionException() { 14 | } 15 | 16 | /** 17 | * {@inheritDoc} 18 | */ 19 | public SignGUIVersionException(String message) { 20 | super(message); 21 | } 22 | 23 | /** 24 | * {@inheritDoc} 25 | */ 26 | public SignGUIVersionException(String message, Throwable cause) { 27 | super(message, cause); 28 | } 29 | 30 | /** 31 | * {@inheritDoc} 32 | */ 33 | public SignGUIVersionException(Throwable cause) { 34 | super(cause); 35 | } 36 | 37 | /** 38 | * {@inheritDoc} 39 | */ 40 | public SignGUIVersionException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { 41 | super(message, cause, enableSuppression, writableStackTrace); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/api/menulib/utils/InventorySize.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.api.menulib.utils; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * Represents different inventory sizes that can be used for organizing game inventories. 7 | * Each inventory size is associated with a specific numerical value representing the 8 | * number of slots available in the inventory. 9 | *

10 | * This enum provides a convenient way to define and manage various inventory sizes:
11 | * - {@code SMALLEST}: 9 slots
12 | * - {@code SMALL}: 18 slots
13 | * - {@code NORMAL}: 27 slots
14 | * - {@code LARGE}: 36 slots
15 | * - {@code LARGER}: 45 slots
16 | * - {@code LARGEST}: 54 slots
17 | */ 18 | public enum InventorySize { 19 | 20 | SMALLEST(9), 21 | SMALL(18), 22 | NORMAL(27), 23 | LARGE(36), 24 | LARGER(45), 25 | LARGEST(54); 26 | 27 | @Getter 28 | private final int size; 29 | 30 | /** 31 | * Constructs an InventorySize enum instance with the specified size. 32 | * 33 | * @param size the size of the inventory associated with this enum instance 34 | */ 35 | InventorySize(int size) { 36 | this.size = size; 37 | } 38 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/CommandsManager.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core; 2 | 3 | import fr.openmc.api.cooldown.CooldownInterceptor; 4 | import fr.openmc.core.commands.admin.freeze.FreezeCommand; 5 | import fr.openmc.core.commands.debug.ChronometerCommand; 6 | import fr.openmc.core.commands.debug.CooldownCommand; 7 | import fr.openmc.core.commands.fun.Diceroll; 8 | import fr.openmc.core.commands.fun.Playtime; 9 | import fr.openmc.core.commands.utils.*; 10 | import fr.openmc.core.features.adminshop.AdminShopCommand; 11 | import fr.openmc.core.features.friend.FriendCommand; 12 | import fr.openmc.core.features.friend.FriendManager; 13 | import fr.openmc.core.features.mailboxes.MailboxCommand; 14 | import fr.openmc.core.features.quests.command.QuestCommand; 15 | import fr.openmc.core.features.updates.UpdateCommand; 16 | import lombok.Getter; 17 | import revxrsal.commands.bukkit.BukkitCommandHandler; 18 | 19 | public class CommandsManager { 20 | @Getter static CommandsManager instance; 21 | @Getter static BukkitCommandHandler handler; 22 | 23 | public CommandsManager() { 24 | instance = this; 25 | OMCPlugin plugin = OMCPlugin.getInstance(); 26 | handler = BukkitCommandHandler.create(plugin); 27 | 28 | handler.registerCondition(new CooldownInterceptor()); 29 | 30 | registerSuggestions(); 31 | registerCommands(); 32 | } 33 | 34 | private void registerCommands() { 35 | handler.register( 36 | new Socials(), 37 | new Spawn(), 38 | new UpdateCommand(), 39 | new Rtp(), 40 | new SetSpawn(), 41 | new Playtime(), 42 | new Diceroll(), 43 | new CooldownCommand(), 44 | new ChronometerCommand(), 45 | new FreezeCommand(), 46 | new MailboxCommand(OMCPlugin.getInstance()), 47 | new FriendCommand(), 48 | new QuestCommand(), 49 | new Restart(), 50 | new AdminShopCommand() 51 | ); 52 | } 53 | 54 | private void registerSuggestions() { 55 | FriendManager.getInstance().initCommandSuggestion(); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/ListenersManager.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core; 2 | 3 | import fr.openmc.api.input.ChatInput; 4 | import fr.openmc.api.input.location.ItemInteraction; 5 | import fr.openmc.core.features.bossbar.listeners.BossbarListener; 6 | import fr.openmc.core.features.mailboxes.MailboxListener; 7 | import fr.openmc.core.features.updates.UpdateListener; 8 | import fr.openmc.core.listeners.*; 9 | import org.bukkit.Bukkit; 10 | import org.bukkit.Server; 11 | import org.bukkit.event.Listener; 12 | import org.bukkit.plugin.java.JavaPlugin; 13 | 14 | public class ListenersManager { 15 | public ListenersManager() { 16 | registerEvents( 17 | new SessionsListener(), 18 | new JoinMessageListener(), 19 | new UpdateListener(), 20 | new ClockInfos(), 21 | new MailboxListener(), 22 | new ChronometerListener(), 23 | new CubeListener(OMCPlugin.getInstance()), 24 | new ItemInteraction(), 25 | new ChatInput(), 26 | new CubeListener(OMCPlugin.getInstance()), 27 | new RespawnListener(), 28 | new SleepListener(), 29 | new PlayerDeathListener(), 30 | new AsyncChatListener(OMCPlugin.getInstance()), 31 | new BossbarListener() 32 | ); 33 | } 34 | 35 | private void registerEvents(Listener... args) { 36 | Server server = Bukkit.getServer(); 37 | JavaPlugin plugin = OMCPlugin.getInstance(); 38 | for (Listener listener : args) { 39 | server.getPluginManager().registerEvents(listener, plugin); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/commands/admin/freeze/FreezeCommand.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.commands.admin.freeze; 2 | 3 | import org.bukkit.entity.Player; 4 | import revxrsal.commands.annotation.Command; 5 | import revxrsal.commands.annotation.Named; 6 | import revxrsal.commands.bukkit.annotation.CommandPermission; 7 | 8 | public class FreezeCommand { 9 | 10 | /** 11 | * Freeze a player 12 | * 13 | * @param player The player who executes the command 14 | * @param target The target player to freeze 15 | */ 16 | @Command("freeze") 17 | @CommandPermission("omc.admins.commands.freeze") 18 | public void onCommand(Player player, @Named("player") Player target) { 19 | FreezeManager.switchFreeze(player, target); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/commands/debug/ChronometerCommand.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.commands.debug; 2 | 3 | import fr.openmc.api.chronometer.Chronometer; 4 | import fr.openmc.api.chronometer.ChronometerType; 5 | import org.bukkit.entity.Player; 6 | import revxrsal.commands.annotation.Command; 7 | import revxrsal.commands.annotation.Description; 8 | import revxrsal.commands.annotation.Named; 9 | import revxrsal.commands.bukkit.annotation.CommandPermission; 10 | 11 | public class ChronometerCommand { 12 | @Command("debug chronometer start") 13 | @CommandPermission("omc.debug.chronometer.start") 14 | @Description("Test du chronometre") 15 | private void chronometerStart(Player target,@Named("time") int time){ 16 | if (time > 90) { 17 | target.sendMessage("§4Ne pas dépasser plus de 90s pour le débogage"); 18 | return; 19 | } 20 | Chronometer.startChronometer(target, "debug", time, ChronometerType.ACTION_BAR, null, ChronometerType.ACTION_BAR, null); 21 | } 22 | 23 | @Command("debug chronometer stopall") 24 | @CommandPermission("omc.debug.chronometer.stopall") 25 | @Description("Test du chronometre") 26 | private void chronometerStopAll(Player target) { 27 | Chronometer.stopAllChronometer(target, ChronometerType.ACTION_BAR, null); 28 | } 29 | 30 | @Command("debug chronometer stop") 31 | @CommandPermission("omc.debug.chronometer.stop") 32 | @Description("Test du chronometre") 33 | private void chronometerStop(Player target, @Named("group") String group) { 34 | Chronometer.stopChronometer(target, group, ChronometerType.ACTION_BAR, null); 35 | } 36 | 37 | @Command("debug chronometer list") 38 | @CommandPermission("omc.debug.chronometer.list") 39 | @Description("Test du chronometre") 40 | private void chronometerList(Player owner, @Named("target") Player target) { 41 | Chronometer.listChronometers(target, owner); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/commands/debug/CooldownCommand.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.commands.debug; 2 | 3 | import fr.openmc.api.cooldown.DynamicCooldown; 4 | import fr.openmc.api.cooldown.DynamicCooldownManager; 5 | import net.kyori.adventure.text.Component; 6 | import net.kyori.adventure.text.format.NamedTextColor; 7 | import org.bukkit.entity.Player; 8 | import revxrsal.commands.annotation.AutoComplete; 9 | import revxrsal.commands.annotation.Command; 10 | import revxrsal.commands.annotation.Description; 11 | import revxrsal.commands.annotation.Named; 12 | import revxrsal.commands.bukkit.annotation.CommandPermission; 13 | 14 | public class CooldownCommand { 15 | @Command("debug cooldown") 16 | @CommandPermission("omc.debug.cooldown") 17 | @AutoComplete("success|error") 18 | @Description("Test de cooldown") 19 | @DynamicCooldown(group="test", message = "§c%ms% (%sec%s)") 20 | public void cooldown(Player player, @Named("isSuccess") String isSuccess) { 21 | if (isSuccess.equals("success")) { 22 | player.sendMessage(Component.text("Succès, le cooldown est activé").color(NamedTextColor.GREEN)); 23 | DynamicCooldownManager.use(player.getUniqueId().toString(), "test" ,5000); 24 | } else { 25 | player.sendMessage(Component.text("Erreur, vous pouvez refaire la commande").color(NamedTextColor.RED)); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/commands/fun/Diceroll.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.commands.fun; 2 | 3 | import java.util.Random; 4 | 5 | import fr.openmc.core.utils.messages.MessageType; 6 | import fr.openmc.core.utils.messages.MessagesManager; 7 | import fr.openmc.core.utils.messages.Prefix; 8 | import net.kyori.adventure.text.Component; 9 | import org.bukkit.entity.Player; 10 | import revxrsal.commands.annotation.Command; 11 | import revxrsal.commands.annotation.Description; 12 | import revxrsal.commands.bukkit.annotation.CommandPermission; 13 | 14 | public class Diceroll { 15 | @Command("diceroll") 16 | @CommandPermission("omc.commands.diceroll") 17 | @Description("Faire un lancé de dés (Donne un nombre aléatoire entre 1 et 10)") 18 | private void diceroll(Player player) { 19 | Random rand = new Random(); 20 | int result = rand.nextInt(10) + 1; 21 | 22 | 23 | MessagesManager.sendMessage(player, Component.text("🎲 Le résultat est: §6" + result + "§r 🎲"), Prefix.OPENMC, MessageType.INFO, true); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/commands/fun/Playtime.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.commands.fun; 2 | 3 | import fr.openmc.core.OMCPlugin; 4 | import fr.openmc.core.utils.DateUtils; 5 | import fr.openmc.core.utils.messages.MessageType; 6 | import fr.openmc.core.utils.messages.MessagesManager; 7 | import fr.openmc.core.utils.messages.Prefix; 8 | import net.kyori.adventure.text.Component; 9 | import org.bukkit.Statistic; 10 | import org.bukkit.entity.Player; 11 | import revxrsal.commands.annotation.Command; 12 | import revxrsal.commands.annotation.Description; 13 | import revxrsal.commands.bukkit.annotation.CommandPermission; 14 | 15 | public class Playtime { 16 | @Command("playtime") 17 | @CommandPermission("omc.commands.playtime") 18 | @Description("Donne votre temps de jeu") 19 | private void playtime(Player player) { 20 | long timePlayed = player.getStatistic(Statistic.PLAY_ONE_MINUTE); 21 | 22 | MessagesManager.sendMessage(player, Component.text(OMCPlugin.getTranslationManager().getTranslation("messages.general.playtime", 23 | "fr", "playTime", DateUtils.convertTime(timePlayed))), Prefix.OPENMC, MessageType.INFO, true); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/commands/utils/SetSpawn.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.commands.utils; 2 | 3 | import net.kyori.adventure.text.Component; 4 | import org.bukkit.Location; 5 | import org.bukkit.entity.Player; 6 | 7 | import fr.openmc.core.utils.messages.MessageType; 8 | import fr.openmc.core.utils.messages.MessagesManager; 9 | import fr.openmc.core.utils.messages.Prefix; 10 | import revxrsal.commands.annotation.Command; 11 | import revxrsal.commands.annotation.Description; 12 | import revxrsal.commands.bukkit.annotation.CommandPermission; 13 | 14 | public class SetSpawn { 15 | 16 | @Command("setspawn") 17 | @Description("Permet de changer le spawn") 18 | @CommandPermission("omc.admin.commands.setspawn") 19 | public void setSpawn(Player player) { 20 | 21 | Location location = player.getLocation(); 22 | 23 | SpawnManager.getInstance().setSpawn(location); 24 | 25 | MessagesManager.sendMessage(player, Component.text("§aVous avez changé le point de spawn en §6X: §e" + location.getBlockX() + "§6, Y:§e" + location.getBlockY() + "§6, Z: §e" + location.getBlockY()), Prefix.OPENMC, MessageType.SUCCESS, true); 26 | 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/adminshop/AdminShopCommand.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.adminshop; 2 | 3 | import org.bukkit.entity.Player; 4 | import revxrsal.commands.annotation.Command; 5 | import revxrsal.commands.annotation.Description; 6 | 7 | 8 | public class AdminShopCommand { 9 | 10 | @Command("adminshop") 11 | @Description("Ouvrir le menu du shop admin") 12 | public void openAdminShop(Player player) { 13 | AdminShopManager.getInstance().openMainMenu(player); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/adminshop/ShopCategory.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.adminshop; 2 | 3 | import org.bukkit.Material; 4 | 5 | public record ShopCategory(String id, String name, Material material, int position) {} -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/analytics/AnalyticsManager.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.analytics; 2 | 3 | import fr.openmc.core.OMCPlugin; 4 | import java.sql.Connection; 5 | import java.sql.SQLException; 6 | 7 | public class AnalyticsManager { 8 | public static boolean isEnabled() { 9 | return OMCPlugin.getConfigs().getBoolean("features.analytics", false); 10 | } 11 | 12 | public static void init_db(Connection conn) throws SQLException { 13 | try { 14 | conn.prepareStatement("CREATE TABLE IF NOT EXISTS stats (player VARCHAR(36) NOT NULL PRIMARY KEY , scope VARCHAR(255) NOT NULL , `value` BIGINT DEFAULT 0);").executeUpdate(); 15 | } catch (SQLException e) { 16 | e.printStackTrace(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/bossbar/listeners/BossbarListener.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.bossbar.listeners; 2 | 3 | import fr.openmc.core.features.bossbar.BossbarManager; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.Listener; 6 | import org.bukkit.event.player.PlayerJoinEvent; 7 | import org.bukkit.event.player.PlayerQuitEvent; 8 | 9 | public class BossbarListener implements Listener { 10 | 11 | @EventHandler 12 | public void onPlayerJoin(PlayerJoinEvent event) { 13 | BossbarManager.getInstance().addBossBar(event.getPlayer()); 14 | } 15 | @EventHandler 16 | public void onPlayerQuit(PlayerQuitEvent event) { 17 | BossbarManager.getInstance().removeBossBar(event.getPlayer()); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/CPermission.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city; 2 | 3 | import lombok.Getter; 4 | 5 | public enum CPermission { 6 | OWNER("Propriétaire"), //Impossible à donner sauf avec un transfert 7 | INVITE("Inviter"), 8 | KICK("Expulser"), 9 | CLAIM("Claim"), 10 | SEE_CHUNKS("Voir les Claims"), 11 | RENAME("Renommer"), 12 | MONEY_GIVE("Donner de l'argent"), 13 | MONEY_BALANCE("Voir l'argent"), 14 | MONEY_TAKE("Prendre de l'argent"), 15 | PERMS("Permissions"), // Cette permission est donnée seulement par l'owner 16 | CHEST("Accès au Coffre"), 17 | CHEST_UPGRADE("Améliorer le coffre"), 18 | TYPE("Changer le type de ville"), 19 | MASCOT_MOVE("Déplacer la mascotte"), 20 | MASCOT_SKIN("Changer le skin de la mascotte"), 21 | MASCOT_UPGRADE("Améliorer la mascotte"), 22 | MASCOT_HEAL("Soigner la mascotte") 23 | ; 24 | 25 | @Getter 26 | private final String displayName; 27 | 28 | CPermission(String displayName) { 29 | this.displayName = displayName; 30 | } 31 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/ChunkDataCache.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city; 2 | 3 | import fr.openmc.core.utils.ChunkInfo; 4 | import fr.openmc.core.utils.ChunkPos; 5 | 6 | import java.util.Map; 7 | 8 | public class ChunkDataCache { 9 | public static final long CACHE_EXPIRY_MS = 30000; // 30 seconds 10 | public final Map chunkInfoMap; 11 | final long timestamp; 12 | 13 | public ChunkDataCache(Map chunkInfoMap) { 14 | this.chunkInfoMap = chunkInfoMap; 15 | this.timestamp = System.currentTimeMillis(); 16 | } 17 | 18 | public boolean isExpired() { 19 | return System.currentTimeMillis() - timestamp > CACHE_EXPIRY_MS; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/CityType.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city; 2 | 3 | public enum CityType { 4 | WAR, 5 | PEACE, 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/commands/CityChatCommand.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.commands; 2 | 3 | import fr.openmc.core.features.city.CityChatManager; 4 | import org.bukkit.entity.Player; 5 | import revxrsal.commands.annotation.Command; 6 | import revxrsal.commands.annotation.Description; 7 | import revxrsal.commands.bukkit.annotation.CommandPermission; 8 | 9 | public class CityChatCommand { 10 | @Command({"cc", "city chat", "ville chat"}) 11 | @CommandPermission("omc.commands.city.chat") 12 | @Description("Activer ou désactiver le chat de ville") 13 | public void onCityChat(Player sender) { 14 | if (!CityChatManager.isCityChatMember(sender)) { 15 | CityChatManager.addCityChatMember(sender); 16 | } else { 17 | CityChatManager.removeCityChatMember(sender); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/conditions/CityClaimCondition.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.conditions; 2 | 3 | import fr.openmc.core.features.city.CPermission; 4 | import fr.openmc.core.features.city.City; 5 | import fr.openmc.core.utils.messages.MessageType; 6 | import fr.openmc.core.utils.messages.MessagesManager; 7 | import fr.openmc.core.utils.messages.Prefix; 8 | import net.kyori.adventure.text.Component; 9 | import org.bukkit.Bukkit; 10 | import org.bukkit.entity.Player; 11 | 12 | /** 13 | * Le but de cette classe est de regrouper toutes les conditions necessaires 14 | * pour claim une zone (utile pour faire une modif sur menu et commandes). 15 | */ 16 | public class CityClaimCondition { 17 | 18 | /** 19 | * Retourne un booleen pour dire si la ville peut etre etendu 20 | * 21 | * @param city la ville sur laquelle on fait les actions 22 | * @param player le joueur sur lequel tester les permissions 23 | * @return booleen 24 | */ 25 | public static boolean canCityClaim(City city, Player player) { 26 | if (player.getWorld() != Bukkit.getWorld("world")) return false ; 27 | 28 | if (city == null) { 29 | MessagesManager.sendMessage(player, MessagesManager.Message.PLAYERNOCITY.getMessage(), Prefix.CITY, MessageType.ERROR, false); 30 | return false; 31 | } 32 | 33 | if (!(city.hasPermission(player.getUniqueId(), CPermission.CLAIM))) { 34 | MessagesManager.sendMessage(player, Component.text("Tu n'as pas la permission de claim"), Prefix.CITY, MessageType.ERROR, false); 35 | return false; 36 | } 37 | 38 | return true; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/conditions/CityLeaveCondition.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.conditions; 2 | 3 | import fr.openmc.core.features.city.CPermission; 4 | import fr.openmc.core.features.city.City; 5 | import fr.openmc.core.utils.messages.MessageType; 6 | import fr.openmc.core.utils.messages.MessagesManager; 7 | import fr.openmc.core.utils.messages.Prefix; 8 | import net.kyori.adventure.text.Component; 9 | import org.bukkit.entity.Player; 10 | 11 | /** 12 | * Le but de cette classe est de regrouper toutes les conditions necessaires 13 | * pour quitter une ville (utile pour faire une modif sur menu et commandes). 14 | */ 15 | public class CityLeaveCondition { 16 | 17 | /** 18 | * Retourne un booleen pour dire si le joueur peut quitter 19 | * 20 | * @param city la ville sur laquelle on veut quitter 21 | * @param player le joueur qui veut quitter 22 | * @return booleen 23 | */ 24 | public static boolean canCityLeave(City city, Player player) { 25 | if (city == null) { 26 | MessagesManager.sendMessage(player, MessagesManager.Message.PLAYERNOCITY.getMessage(), Prefix.CITY, MessageType.ERROR, false); 27 | return false; 28 | } 29 | 30 | if (city.hasPermission(player.getUniqueId(), CPermission.OWNER)) { 31 | MessagesManager.sendMessage(player, Component.text("Tu ne peux pas quitter la ville car tu en es le maire, supprime la ou transfère la propriété"), Prefix.CITY, MessageType.ERROR, false); 32 | return false; 33 | } 34 | return true; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/conditions/CityTypeConditions.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.conditions; 2 | 3 | import fr.openmc.core.features.city.CPermission; 4 | import fr.openmc.core.features.city.City; 5 | import fr.openmc.core.utils.messages.MessageType; 6 | import fr.openmc.core.utils.messages.MessagesManager; 7 | import fr.openmc.core.utils.messages.Prefix; 8 | import net.kyori.adventure.text.Component; 9 | import org.bukkit.entity.Player; 10 | 11 | /** 12 | * Le but de cette classe est de regrouper toutes les conditions necessaires 13 | * touchant aux mascottes (utile pour faire une modif sur menu et commandes). 14 | */ 15 | public class CityTypeConditions { 16 | 17 | /** 18 | * Retourne un booleen pour dire si la ville peut changer de typê 19 | * 20 | * @param city la ville sur laquelle on teste cela 21 | * @param player le joueur sur lequel tester les permissions 22 | * @return booleen 23 | */ 24 | public static boolean canCityChangeType(City city, Player player, boolean reply) { 25 | 26 | if (city == null) { 27 | if (reply) MessagesManager.sendMessage(player, MessagesManager.Message.PLAYERNOCITY.getMessage(), Prefix.CITY, MessageType.ERROR, false); 28 | return false; 29 | } 30 | 31 | if (!(city.hasPermission(player.getUniqueId(), CPermission.TYPE))) { 32 | if (reply) MessagesManager.sendMessage(player, Component.text("Tu n'as pas la permission de changer le status de ta ville"), Prefix.CITY, MessageType.ERROR, false); 33 | return false; 34 | } 35 | return true; 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/events/ChunkClaimedEvent.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.events; 2 | 3 | import fr.openmc.core.features.city.City; 4 | import lombok.Getter; 5 | import org.bukkit.Chunk; 6 | import org.bukkit.event.Event; 7 | import org.bukkit.event.HandlerList; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | public class ChunkClaimedEvent extends Event { 11 | 12 | private static final HandlerList HANDLERS = new HandlerList(); 13 | 14 | @Getter private City city; 15 | @Getter private Chunk chunk; 16 | 17 | public ChunkClaimedEvent(City city, Chunk chunk) { 18 | this.city = city; 19 | this.chunk = chunk; 20 | } 21 | 22 | public static HandlerList getHandlerList() { 23 | return HANDLERS; 24 | } 25 | 26 | @Override 27 | public @NotNull HandlerList getHandlers() { 28 | return HANDLERS; 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/events/CityCreationEvent.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.events; 2 | 3 | import fr.openmc.core.features.city.City; 4 | import fr.openmc.core.features.quests.quests.CityCreateQuest; 5 | import lombok.Getter; 6 | import org.bukkit.entity.Player; 7 | import org.bukkit.event.Event; 8 | import org.bukkit.event.HandlerList; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | public class CityCreationEvent extends Event { 12 | 13 | @Getter private final City city; 14 | @Getter private final Player owner; 15 | 16 | private static final HandlerList HANDLERS = new HandlerList(); 17 | 18 | public CityCreationEvent(City city, Player owner) { 19 | this.city = city; 20 | this.owner = owner; 21 | } 22 | 23 | public static HandlerList getHandlerList() { 24 | return HANDLERS; 25 | } 26 | 27 | @Override 28 | public @NotNull HandlerList getHandlers() { 29 | return HANDLERS; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/events/CityDeleteEvent.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.events; 2 | 3 | import fr.openmc.core.features.city.City; 4 | import lombok.Getter; 5 | import org.bukkit.event.Event; 6 | import org.bukkit.event.HandlerList; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class CityDeleteEvent extends Event { 10 | 11 | @Getter private City city; 12 | 13 | public CityDeleteEvent(City city) { 14 | this.city = city; 15 | } 16 | 17 | private static final HandlerList HANDLERS = new HandlerList(); 18 | 19 | public static HandlerList getHandlerList() { 20 | return HANDLERS; 21 | } 22 | 23 | @Override 24 | public @NotNull HandlerList getHandlers() { 25 | return HANDLERS; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/events/CityMoneyUpdateEvent.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.events; 2 | 3 | import fr.openmc.core.features.city.City; 4 | import lombok.Getter; 5 | import org.bukkit.event.Event; 6 | import org.bukkit.event.HandlerList; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class CityMoneyUpdateEvent extends Event { 10 | 11 | private static final HandlerList HANDLERS = new HandlerList(); 12 | 13 | @Getter private double difference; 14 | @Getter private double before; 15 | @Getter private double after; 16 | @Getter private City city; 17 | 18 | public CityMoneyUpdateEvent(City city, double before, double after) { 19 | this.city = city; 20 | this.before = before; 21 | this.after = after; 22 | this.difference = after - before; 23 | } 24 | 25 | public static HandlerList getHandlerList() { 26 | return HANDLERS; 27 | } 28 | 29 | @Override 30 | public @NotNull HandlerList getHandlers() { 31 | return HANDLERS; 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/events/CityPermissionChangeEvent.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.events; 2 | 3 | import fr.openmc.core.features.city.CPermission; 4 | import fr.openmc.core.features.city.City; 5 | import lombok.Getter; 6 | import org.bukkit.OfflinePlayer; 7 | import org.bukkit.event.Event; 8 | import org.bukkit.event.HandlerList; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | public class CityPermissionChangeEvent extends Event { 12 | 13 | @Getter private final City city; 14 | @Getter private final OfflinePlayer member; 15 | @Getter private final CPermission permission; 16 | @Getter private final boolean value; 17 | 18 | private static final HandlerList HANDLERS = new HandlerList(); 19 | 20 | public CityPermissionChangeEvent(City city, OfflinePlayer member, CPermission permission, boolean value) { 21 | this.city = city; 22 | this.member = member; 23 | this.permission = permission; 24 | this.value = value; 25 | } 26 | 27 | public static HandlerList getHandlerList() { 28 | return HANDLERS; 29 | } 30 | 31 | @Override 32 | public @NotNull HandlerList getHandlers() { 33 | return HANDLERS; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/events/CityRenameEvent.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.events; 2 | 3 | import fr.openmc.core.features.city.City; 4 | import lombok.Getter; 5 | import org.bukkit.event.Event; 6 | import org.bukkit.event.HandlerList; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class CityRenameEvent extends Event { 10 | 11 | @Getter private String oldName; 12 | @Getter private City city; 13 | 14 | public CityRenameEvent(String oldName, City city) { 15 | this.oldName = oldName; 16 | this.city = city; 17 | } 18 | 19 | private static final HandlerList HANDLERS = new HandlerList(); 20 | 21 | public static HandlerList getHandlerList() { 22 | return HANDLERS; 23 | } 24 | 25 | @Override 26 | public @NotNull HandlerList getHandlers() { 27 | return HANDLERS; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/events/MemberJoinEvent.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.events; 2 | 3 | import fr.openmc.core.features.city.City; 4 | import lombok.Getter; 5 | import org.bukkit.OfflinePlayer; 6 | import org.bukkit.event.Event; 7 | import org.bukkit.event.HandlerList; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | public class MemberJoinEvent extends Event { 11 | 12 | @Getter private OfflinePlayer player; 13 | @Getter private City city; 14 | 15 | public MemberJoinEvent(OfflinePlayer player, City city) { 16 | this.player = player; 17 | this.city = city; 18 | } 19 | 20 | private static final HandlerList HANDLERS = new HandlerList(); 21 | 22 | public static HandlerList getHandlerList() { 23 | return HANDLERS; 24 | } 25 | 26 | @Override 27 | public @NotNull HandlerList getHandlers() { 28 | return HANDLERS; 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/events/MemberLeaveEvent.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.events; 2 | 3 | import fr.openmc.core.features.city.City; 4 | import lombok.Getter; 5 | import org.bukkit.OfflinePlayer; 6 | import org.bukkit.event.Event; 7 | import org.bukkit.event.HandlerList; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | public class MemberLeaveEvent extends Event { 11 | @Getter private OfflinePlayer player; 12 | @Getter private City city; 13 | 14 | public MemberLeaveEvent(OfflinePlayer player, City city) { 15 | this.player = player; 16 | this.city = city; 17 | } 18 | 19 | private static final HandlerList HANDLERS = new HandlerList(); 20 | 21 | public static HandlerList getHandlerList() { 22 | return HANDLERS; 23 | } 24 | 25 | @Override 26 | public @NotNull HandlerList getHandlers() { 27 | return HANDLERS; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/listeners/CityChatListener.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.listeners; 2 | 3 | import fr.openmc.core.features.city.CityChatManager; 4 | import io.papermc.paper.event.player.AsyncChatEvent; 5 | import net.kyori.adventure.text.Component; 6 | import org.bukkit.entity.Player; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.Listener; 9 | 10 | public class CityChatListener implements Listener { 11 | 12 | @EventHandler 13 | public void onPlayerChat(AsyncChatEvent event) { 14 | Player player = event.getPlayer(); 15 | Component message = event.message(); 16 | 17 | if (CityChatManager.isCityChatMember(player)) { 18 | event.setCancelled(true); 19 | CityChatManager.sendCityChatMessage(player, message); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/listeners/CityTypeCooldown.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.listeners; 2 | 3 | import fr.openmc.api.cooldown.DynamicCooldownManager; 4 | import fr.openmc.core.features.city.City; 5 | import fr.openmc.core.features.city.CityManager; 6 | import fr.openmc.core.utils.messages.MessageType; 7 | import fr.openmc.core.utils.messages.MessagesManager; 8 | import fr.openmc.core.utils.messages.Prefix; 9 | import net.kyori.adventure.text.Component; 10 | import org.bukkit.entity.Player; 11 | import org.bukkit.event.EventHandler; 12 | import org.bukkit.event.Listener; 13 | import org.bukkit.event.player.PlayerJoinEvent; 14 | 15 | import java.util.UUID; 16 | 17 | public class CityTypeCooldown implements Listener { 18 | 19 | private static final long COOLDOWN_TIME = 5 * 24 * 60 * 60 * 1000L; // 5 jours en ms 20 | 21 | @EventHandler 22 | void onJoin(PlayerJoinEvent e){ 23 | Player player = e.getPlayer(); 24 | City city = CityManager.getPlayerCity(player.getUniqueId()); 25 | if (city!=null){ 26 | String city_uuid = city.getUUID(); 27 | if (!DynamicCooldownManager.isReady(city_uuid, "city:type")) { 28 | MessagesManager.sendMessage(player, Component.text("Type de ville changeable dans : " + DynamicCooldownManager.getRemaining(UUID.fromString(city_uuid).toString(), "city:type")/1000 + "s"), Prefix.CITY, MessageType.INFO, false); 29 | } else { 30 | MessagesManager.sendMessage(player, Component.text("Type de ville changeable"), Prefix.CITY, MessageType.INFO, false); 31 | } 32 | } 33 | } 34 | } 35 | 36 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/listeners/protections/BlockProtection.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.listeners.protections; 2 | 3 | import fr.openmc.core.features.city.ProtectionsManager; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.EventPriority; 6 | import org.bukkit.event.Listener; 7 | import org.bukkit.event.block.BlockBreakEvent; 8 | import org.bukkit.event.block.BlockPlaceEvent; 9 | 10 | public class BlockProtection implements Listener { 11 | @EventHandler(priority = EventPriority.HIGH) 12 | public void onPlaceBlock(BlockPlaceEvent event) { 13 | ProtectionsManager.verify(event.getPlayer(), event, event.getBlock().getLocation()); 14 | } 15 | 16 | @EventHandler 17 | void onBlockBreak(BlockBreakEvent event) { 18 | ProtectionsManager.verify(event.getPlayer(), event, event.getBlock().getLocation()); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/listeners/protections/BowProtection.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.listeners.protections; 2 | 3 | import com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent; 4 | import fr.openmc.core.features.city.ProtectionsManager; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.event.EventHandler; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.event.entity.EntityShootBowEvent; 9 | 10 | public class BowProtection implements Listener { 11 | @EventHandler 12 | void onLaunchProjectile(PlayerLaunchProjectileEvent event) { 13 | ProtectionsManager.verify(event.getPlayer(), event, event.getPlayer().getLocation()); 14 | } 15 | 16 | @EventHandler 17 | public void onEntityShootBow(EntityShootBowEvent event) { 18 | if (!(event.getEntity() instanceof Player player)) return; 19 | 20 | ProtectionsManager.verify(player, event, event.getEntity().getLocation()); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/listeners/protections/EntityProtection.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.listeners.protections; 2 | 3 | import fr.openmc.core.features.city.ProtectionsManager; 4 | import org.bukkit.entity.Entity; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.event.EventHandler; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.event.player.PlayerArmorStandManipulateEvent; 9 | import org.bukkit.event.player.PlayerInteractEntityEvent; 10 | import org.bukkit.event.player.PlayerShearEntityEvent; 11 | import org.bukkit.inventory.InventoryHolder; 12 | import org.bukkit.inventory.Merchant; 13 | 14 | public class EntityProtection implements Listener { 15 | @EventHandler 16 | public void onArmorStandManipulate(PlayerArmorStandManipulateEvent event) { 17 | ProtectionsManager.verify(event.getPlayer(), event, event.getRightClicked().getLocation()); 18 | } 19 | 20 | @EventHandler 21 | void onShear(PlayerShearEntityEvent event) { 22 | ProtectionsManager.verify(event.getPlayer(), event, event.getEntity().getLocation()); 23 | } 24 | 25 | @EventHandler 26 | public void onEntityInventoryOpen(PlayerInteractEntityEvent event) { 27 | Player player = event.getPlayer(); 28 | Entity entity = event.getRightClicked(); 29 | 30 | if (entity instanceof Merchant || entity instanceof InventoryHolder) { 31 | ProtectionsManager.verify(player, event, entity.getLocation()); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/listeners/protections/FireProtection.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.listeners.protections; 2 | 3 | 4 | import fr.openmc.core.features.city.ProtectionsManager; 5 | import org.bukkit.Location; 6 | import org.bukkit.entity.Player; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.Listener; 9 | import org.bukkit.event.block.BlockIgniteEvent; 10 | 11 | public class FireProtection implements Listener { 12 | @EventHandler 13 | public void onFireIgnite(BlockIgniteEvent event) { 14 | Location loc = event.getBlock().getLocation(); 15 | Player player = event.getPlayer(); 16 | 17 | if (player == null) return; 18 | 19 | ProtectionsManager.verify(event.getPlayer(), event, loc); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/listeners/protections/FishProtection.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.listeners.protections; 2 | 3 | import fr.openmc.core.features.city.ProtectionsManager; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.Listener; 6 | import org.bukkit.event.player.PlayerFishEvent; 7 | 8 | public class FishProtection implements Listener { 9 | @EventHandler 10 | void onFish(PlayerFishEvent event) { 11 | ProtectionsManager.verify(event.getPlayer(), event, event.getHook().getLocation()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/listeners/protections/FoodProtection.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.listeners.protections; 2 | 3 | import org.bukkit.event.EventHandler; 4 | import org.bukkit.event.EventPriority; 5 | import org.bukkit.event.Listener; 6 | import org.bukkit.event.player.PlayerItemConsumeEvent; 7 | 8 | public class FoodProtection implements Listener { 9 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 10 | public void onFoodConsume(PlayerItemConsumeEvent event) { 11 | // on laisse les gens manger 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/listeners/protections/HangingProtection.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.listeners.protections; 2 | 3 | import fr.openmc.core.features.city.ProtectionsManager; 4 | import org.bukkit.entity.*; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.Listener; 7 | import org.bukkit.event.hanging.HangingBreakByEntityEvent; 8 | import org.bukkit.event.player.PlayerInteractEntityEvent; 9 | 10 | public class HangingProtection implements Listener { 11 | @EventHandler 12 | public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { 13 | if (event.isCancelled()) return; 14 | 15 | Player player = event.getPlayer(); 16 | Entity entity = event.getRightClicked(); 17 | 18 | if (entity instanceof ItemFrame || entity instanceof GlowItemFrame || entity instanceof Hanging) { 19 | ProtectionsManager.verify(player, event, entity.getLocation()); 20 | } 21 | } 22 | 23 | @EventHandler 24 | public void onHangingBreakByEntity(HangingBreakByEntityEvent event) { 25 | if (event.isCancelled()) return; 26 | if (event.getRemover() instanceof Player player) { 27 | ProtectionsManager.verify(player, event, event.getEntity().getLocation()); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/listeners/protections/LeashProtection.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.listeners.protections; 2 | 3 | import fr.openmc.core.features.city.ProtectionsManager; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.Listener; 6 | import org.bukkit.event.entity.PlayerLeashEntityEvent; 7 | import org.bukkit.event.player.PlayerUnleashEntityEvent; 8 | 9 | public class LeashProtection implements Listener { 10 | @EventHandler 11 | void onLeash(PlayerLeashEntityEvent event) { 12 | ProtectionsManager.verify(event.getPlayer(), event, event.getEntity().getLocation()); 13 | } 14 | 15 | @EventHandler 16 | void onUnleash(PlayerUnleashEntityEvent event) { 17 | ProtectionsManager.verify(event.getPlayer(), event, event.getEntity().getLocation()); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/listeners/protections/MountProtection.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.listeners.protections; 2 | 3 | import fr.openmc.core.features.city.ProtectionsManager; 4 | import org.bukkit.entity.Entity; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.entity.Tameable; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.Listener; 9 | import org.bukkit.event.entity.EntityMountEvent; 10 | 11 | public class MountProtection implements Listener { 12 | @EventHandler 13 | public void onEntityMount(EntityMountEvent event) { 14 | if (event.isCancelled()) return; 15 | if (!(event.getEntity() instanceof Player player)) return; 16 | 17 | Entity mount = event.getMount(); 18 | 19 | if (!(mount instanceof Tameable tameable)) return; 20 | 21 | 22 | if (!tameable.isTamed()) return; 23 | 24 | if (!tameable.getOwnerUniqueId().equals(player.getUniqueId())) 25 | ProtectionsManager.verify(player, event, mount.getLocation()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/listeners/protections/PotionProtection.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.listeners.protections; 2 | 3 | import fr.openmc.core.features.city.City; 4 | import fr.openmc.core.features.city.CityManager; 5 | import fr.openmc.core.features.city.CityType; 6 | import org.bukkit.Location; 7 | import org.bukkit.entity.LivingEntity; 8 | import org.bukkit.entity.Player; 9 | import org.bukkit.entity.ThrownPotion; 10 | import org.bukkit.entity.Witch; 11 | import org.bukkit.event.EventHandler; 12 | import org.bukkit.event.EventPriority; 13 | import org.bukkit.event.Listener; 14 | import org.bukkit.event.entity.PotionSplashEvent; 15 | import org.bukkit.projectiles.ProjectileSource; 16 | 17 | public class PotionProtection implements Listener { 18 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 19 | public void onPotionSplash(PotionSplashEvent event) { 20 | ThrownPotion potion = event.getPotion(); 21 | ProjectileSource shooter = potion.getShooter(); 22 | 23 | if (!(shooter instanceof Witch witch)) 24 | return; 25 | 26 | Location witchLocation = witch.getLocation(); 27 | City city = CityManager.getCityFromChunk(witchLocation.getChunk().getX(), witchLocation.getChunk().getZ()); 28 | if (city == null) 29 | return; 30 | 31 | boolean isCityInWar = city.getType().equals(CityType.WAR); 32 | 33 | for (LivingEntity affectedEntity : event.getAffectedEntities()) { 34 | if (!(affectedEntity instanceof Player player)) 35 | continue; 36 | 37 | boolean isNotMember = !city.isMember(player); 38 | if (!isNotMember || isCityInWar) 39 | continue; 40 | 41 | event.setCancelled(true); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/listeners/protections/TramplingProtection.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.listeners.protections; 2 | 3 | import fr.openmc.core.features.city.ProtectionsManager; 4 | import org.bukkit.Material; 5 | import org.bukkit.block.Block; 6 | import org.bukkit.event.EventHandler; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.event.block.Action; 9 | import org.bukkit.event.entity.EntityInteractEvent; 10 | import org.bukkit.event.player.PlayerInteractEvent; 11 | 12 | public class TramplingProtection implements Listener { 13 | @EventHandler 14 | public void onEntityInteract(EntityInteractEvent event) { 15 | if (event.isCancelled()) return; 16 | Block block = event.getBlock(); 17 | if (block.getType() == Material.FARMLAND) { 18 | ProtectionsManager.verify(event.getEntity(), event, block.getLocation()); 19 | } 20 | } 21 | 22 | @EventHandler 23 | public void onPlayerTrampling(PlayerInteractEvent event) { 24 | if (event.isCancelled()) return; 25 | if (event.getAction() == Action.PHYSICAL) { 26 | if (event.getClickedBlock() == null) return; 27 | if (event.getClickedBlock().getType() == Material.FARMLAND) { 28 | ProtectionsManager.verify(event.getPlayer(), event, event.getClickedBlock().getLocation()); 29 | } 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/mascots/Mascot.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.mascots; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import org.bukkit.Chunk; 6 | 7 | import java.util.UUID; 8 | 9 | @Setter 10 | @Getter 11 | public class Mascot { 12 | 13 | private String cityUUID; 14 | private UUID mascotUUID; 15 | private int level; 16 | private boolean immunity; 17 | private boolean alive; 18 | private Chunk chunk; 19 | 20 | public Mascot(String cityUUID, UUID mascotUUID, int level, boolean immunity, boolean alive, Chunk chunk) { 21 | this.cityUUID = cityUUID; 22 | this.mascotUUID = mascotUUID; 23 | this.level = level; 24 | this.immunity = immunity; 25 | this.alive = alive; 26 | this.chunk = chunk; 27 | } 28 | } 29 | 30 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/mayor/CityLaw.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.mayor; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import org.bukkit.Location; 6 | 7 | 8 | @Setter 9 | @Getter 10 | public class CityLaw { 11 | private boolean pvp; 12 | private Location warp; 13 | 14 | public CityLaw(boolean pvp, Location warp) { 15 | this.pvp = pvp; 16 | this.warp = warp; 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/mayor/ElectionType.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.mayor; 2 | 3 | public enum ElectionType { 4 | ELECTION, 5 | OWNER_CHOOSE, 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/mayor/Mayor.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.mayor; 2 | 3 | import fr.openmc.core.features.city.City; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import net.kyori.adventure.text.format.NamedTextColor; 7 | 8 | import java.util.UUID; 9 | 10 | @Getter 11 | @Setter 12 | public class Mayor { 13 | private City city; 14 | private String name; 15 | private UUID UUID; 16 | private NamedTextColor mayorColor; 17 | private int idPerk1; 18 | private int idPerk2; 19 | private int idPerk3; 20 | private ElectionType electionType; 21 | 22 | public Mayor(City city, String mayorName, UUID mayorUUID, NamedTextColor mayorColor, int idPerk1, int idPerk2, int idPerk3, ElectionType electionType) { 23 | this.city = city; 24 | this.name = mayorName; 25 | this.UUID = mayorUUID; 26 | this.mayorColor = mayorColor; 27 | this.idPerk1 = idPerk1; 28 | this.idPerk2 = idPerk2; 29 | this.idPerk3 = idPerk3; 30 | this.electionType = electionType; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/mayor/MayorCandidate.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.mayor; 2 | 3 | import fr.openmc.core.features.city.City; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import net.kyori.adventure.text.format.NamedTextColor; 7 | 8 | import java.util.UUID; 9 | 10 | @Getter 11 | public class MayorCandidate { 12 | private final City city; 13 | private final String name; 14 | private final UUID UUID; 15 | @Setter private NamedTextColor candidateColor; 16 | private final int idChoicePerk2; 17 | private final int idChoicePerk3; 18 | @Setter private int vote; 19 | 20 | public MayorCandidate(City city, String candidateName, UUID candidateUUID, NamedTextColor candidateColor, int idChoicePerk2, int idChoicePerk3, int vote) { 21 | this.city = city; 22 | this.name = candidateName; 23 | this.UUID = candidateUUID; 24 | this.candidateColor = candidateColor; 25 | this.idChoicePerk2 = idChoicePerk2; 26 | this.idChoicePerk3 = idChoicePerk3; 27 | this.vote = vote; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/mayor/MayorVote.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.mayor; 2 | 3 | import lombok.Getter; 4 | 5 | import java.util.UUID; 6 | 7 | @Getter 8 | public class MayorVote { 9 | private final UUID voterUUID; 10 | private final MayorCandidate candidate; 11 | 12 | public MayorVote(UUID voterUUID, MayorCandidate candidate) { 13 | this.voterUUID = voterUUID; 14 | this.candidate = candidate; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/mayor/listeners/JoinListener.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.mayor.listeners; 2 | 3 | import fr.openmc.core.features.city.City; 4 | import fr.openmc.core.features.city.CityManager; 5 | import fr.openmc.core.features.city.mayor.ElectionType; 6 | import fr.openmc.core.features.city.mayor.managers.MayorManager; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.event.EventHandler; 9 | import org.bukkit.event.Listener; 10 | import org.bukkit.event.player.PlayerJoinEvent; 11 | 12 | public class JoinListener implements Listener { 13 | 14 | @EventHandler 15 | public void onPlayerJoin(PlayerJoinEvent event) { 16 | Player player = event.getPlayer(); 17 | MayorManager mayorManager = MayorManager.getInstance(); 18 | City playerCity = CityManager.getPlayerCity(player.getUniqueId()); 19 | 20 | if (playerCity == null) return; 21 | 22 | if (playerCity.getLaw() == null) { 23 | MayorManager.createCityLaws(playerCity, false, null); 24 | } 25 | 26 | if (mayorManager.phaseMayor == 2 && mayorManager.cityMayor.get(playerCity)==null) { 27 | mayorManager.runSetupMayor(playerCity); 28 | } else if (mayorManager.phaseMayor == 1 && mayorManager.cityMayor.get(playerCity)==null) { 29 | if (playerCity.getMembers().size()>=mayorManager.MEMBER_REQ_ELECTION) { 30 | mayorManager.createMayor(null,null, playerCity, null, null, null, null, ElectionType.ELECTION); 31 | } 32 | mayorManager.createMayor(null, null, playerCity, null, null, null, null, ElectionType.OWNER_CHOOSE); 33 | 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/mayor/listeners/PhaseListener.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.mayor.listeners; 2 | 3 | import fr.openmc.core.OMCPlugin; 4 | import fr.openmc.core.features.city.mayor.managers.MayorManager; 5 | import fr.openmc.core.utils.DateUtils; 6 | import org.bukkit.scheduler.BukkitRunnable; 7 | 8 | import java.sql.SQLException; 9 | 10 | import static fr.openmc.core.features.city.mayor.managers.MayorManager.PHASE_1_DAY; 11 | import static fr.openmc.core.features.city.mayor.managers.MayorManager.PHASE_2_DAY; 12 | 13 | public class PhaseListener { 14 | 15 | /** 16 | * Constructor for the PhaseListener class. 17 | * This class is responsible for managing the phases of the mayor election process. 18 | * 19 | * @param plugin The OMCPlugin instance. 20 | */ 21 | public PhaseListener(OMCPlugin plugin) { 22 | MayorManager mayorManager = MayorManager.getInstance(); 23 | BukkitRunnable eventRunnable = new BukkitRunnable() { 24 | @Override 25 | public void run() { 26 | int phase = mayorManager.phaseMayor; 27 | 28 | // PHASE 1 - Elections - Mardi à Mercredi 29 | if (phase == 2 && PHASE_1_DAY == DateUtils.getCurrentDayOfWeek()) { 30 | try { 31 | mayorManager.initPhase1(); 32 | } catch (SQLException e) { 33 | throw new RuntimeException(e); 34 | } 35 | } 36 | 37 | // PHASE 2 - Maire Elu - Jeudi à Jeudi Prochain 38 | if (phase == 1 && PHASE_2_DAY == DateUtils.getCurrentDayOfWeek()) { 39 | mayorManager.initPhase2(); 40 | } 41 | } 42 | }; 43 | // 1200 s = 1 min 44 | eventRunnable.runTaskTimer(plugin, 0, 1200); 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/mayor/npcs/MayorNPC.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.mayor.npcs; 2 | 3 | import de.oliver.fancynpcs.api.Npc; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import org.bukkit.Location; 7 | 8 | public class MayorNPC { 9 | 10 | @Getter 11 | private Npc npc; 12 | @Getter 13 | private String cityUUID; 14 | @Getter 15 | @Setter 16 | private Location location; 17 | 18 | public MayorNPC(Npc npc, String cityUUID, Location location) { 19 | this.npc = npc; 20 | this.cityUUID=cityUUID; 21 | this.location=location; 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/mayor/npcs/OwnerNPC.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.mayor.npcs; 2 | 3 | import de.oliver.fancynpcs.api.Npc; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import org.bukkit.Location; 7 | 8 | public class OwnerNPC { 9 | 10 | @Getter 11 | private Npc npc; 12 | @Getter 13 | private String cityUUID; 14 | @Getter 15 | @Setter 16 | private Location location; 17 | 18 | public OwnerNPC(Npc npc, String cityUUID, Location location) { 19 | this.npc = npc; 20 | this.cityUUID=cityUUID; 21 | this.location=location; 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/mayor/perks/PerkType.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.mayor.perks; 2 | 3 | public enum PerkType { 4 | EVENT, 5 | BASIC 6 | ; 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/mayor/perks/basic/CityHunterPerk.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.mayor.perks.basic; 2 | 3 | import fr.openmc.core.features.city.City; 4 | import fr.openmc.core.features.city.CityManager; 5 | import fr.openmc.core.features.city.mayor.managers.MayorManager; 6 | import fr.openmc.core.features.city.mayor.managers.PerkManager; 7 | import fr.openmc.core.features.city.mayor.perks.Perks; 8 | import org.bukkit.entity.Entity; 9 | import org.bukkit.entity.Monster; 10 | import org.bukkit.entity.Player; 11 | import org.bukkit.event.EventHandler; 12 | import org.bukkit.event.Listener; 13 | import org.bukkit.event.entity.EntityDamageByEntityEvent; 14 | 15 | public class CityHunterPerk implements Listener { 16 | 17 | @EventHandler 18 | public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { 19 | if (!(event.getDamager() instanceof Player attacker)) { 20 | return; 21 | } 22 | 23 | 24 | City attackerCity = CityManager.getPlayerCity(attacker.getUniqueId()); 25 | if (attackerCity == null) { 26 | return; 27 | } 28 | 29 | if (attackerCity.getMayor() == null) return; 30 | 31 | if (MayorManager.getInstance().phaseMayor != 2) return; 32 | 33 | if (!PerkManager.hasPerk(attackerCity.getMayor(), Perks.CITY_HUNTER.getId())) { 34 | return; 35 | } 36 | 37 | Entity target = event.getEntity(); 38 | 39 | if (!(target instanceof Player) && !(target instanceof Monster)) { 40 | return; 41 | } 42 | 43 | if (CityManager.getCityFromChunk(target.getChunk().getX(), target.getChunk().getZ()) != null && CityManager.getCityFromChunk(target.getChunk().getX(), target.getChunk().getZ()) != attackerCity) { 44 | return; 45 | } 46 | 47 | double baseDamage = event.getDamage(); 48 | double newDamage = baseDamage * 1.20; 49 | 50 | event.setDamage(newDamage); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/mayor/perks/basic/SymbiosisPerk.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.mayor.perks.basic; 2 | 3 | import fr.openmc.core.features.city.City; 4 | import fr.openmc.core.features.city.CityManager; 5 | import fr.openmc.core.features.city.mayor.managers.PerkManager; 6 | import fr.openmc.core.features.city.mayor.perks.Perks; 7 | import org.bukkit.Bukkit; 8 | import org.bukkit.entity.LivingEntity; 9 | import org.bukkit.entity.Player; 10 | import org.bukkit.event.EventHandler; 11 | import org.bukkit.event.Listener; 12 | import org.bukkit.event.entity.EntityDamageEvent; 13 | 14 | public class SymbiosisPerk implements Listener { 15 | 16 | private static final double RADIUS = 10.0; 17 | 18 | @EventHandler 19 | public void onEntityDamage(EntityDamageEvent event) { 20 | if (!(event.getEntity() instanceof Player)) { 21 | return; 22 | } 23 | Player player = (Player) event.getEntity(); 24 | 25 | City playerCity = CityManager.getPlayerCity(player.getUniqueId()); 26 | if (playerCity == null) { 27 | return; 28 | } 29 | 30 | if (!PerkManager.hasPerk(playerCity.getMayor(), Perks.SYMBIOSIS.getId())) return; 31 | 32 | LivingEntity mascot = (LivingEntity) Bukkit.getEntity(playerCity.getMascot().getMascotUUID()); 33 | 34 | if (mascot == null || !mascot.isValid()) { 35 | return; 36 | } 37 | 38 | if (player.getLocation().distance(mascot.getLocation()) <= RADIUS) { 39 | double originalDamage = event.getDamage(); 40 | double reducedDamage = originalDamage * 0.85; 41 | event.setDamage(reducedDamage); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/city/menu/mayor/create/MenuType.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.city.menu.mayor.create; 2 | 3 | public enum MenuType { 4 | OWNER, // donc le propriétaire qui choisis 3 Perk comme les elections sont désactivé 5 | CANDIDATE, // donc un joueur normal si les elections sont activé 6 | OWNER_1 // donc le propriétaire qui choisis 1 perk evenementiels 7 | ; 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/contest/ContestEndEvent.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.contest; 2 | 3 | import lombok.Getter; 4 | import org.bukkit.event.Event; 5 | import org.bukkit.event.HandlerList; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | import java.util.List; 9 | import java.util.UUID; 10 | 11 | public class ContestEndEvent extends Event { 12 | 13 | @Getter 14 | private final ContestData contestData; 15 | private static final HandlerList HANDLERS = new HandlerList(); 16 | @Getter 17 | private final List winners; 18 | @Getter 19 | private final List losers; 20 | 21 | /** 22 | * @param contestData The contest data 23 | * @param winners The list of winners 24 | * @param losers The list of losers 25 | */ 26 | public ContestEndEvent(ContestData contestData, List winners, List losers) { 27 | this.contestData = contestData; 28 | this.winners = winners; 29 | this.losers = losers; 30 | } 31 | 32 | public static HandlerList getHandlerList() { 33 | return HANDLERS; 34 | } 35 | 36 | @Override 37 | public @NotNull HandlerList getHandlers() { 38 | return HANDLERS; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/contest/ContestPlayer.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.contest; 2 | 3 | import lombok.Getter; 4 | import net.kyori.adventure.text.format.NamedTextColor; 5 | 6 | @Getter 7 | public class ContestPlayer { 8 | private final String name; 9 | private final int points; 10 | private final int camp; 11 | private final NamedTextColor color; 12 | 13 | public ContestPlayer(String name, int points, int camp, NamedTextColor color) { 14 | this.name = name; 15 | this.points = points; 16 | this.camp = camp; 17 | this.color = color; 18 | } 19 | } 20 | 21 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/contest/listeners/ContestIntractEvents.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.contest.listeners; 2 | 3 | import dev.lone.itemsadder.api.Events.FurnitureInteractEvent; 4 | import org.bukkit.Sound; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.Listener; 7 | import org.bukkit.Bukkit; 8 | 9 | public class ContestIntractEvents implements Listener { 10 | @EventHandler 11 | private void onFurnitureInteractEvent(FurnitureInteractEvent furniture) { 12 | if (furniture.getNamespacedID().equals("omc_contest:borne")) { 13 | furniture.getPlayer().playSound(furniture.getPlayer().getLocation(), Sound.BLOCK_BARREL_OPEN, 1.0F, 0.7F); 14 | Bukkit.dispatchCommand(furniture.getPlayer(), "openmc:contest"); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/corporation/CorpPermission.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.corporation; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public enum CorpPermission { 7 | OWNER("Propriétaire"), 8 | //CITYMEMBER("Membre de la ville"), 9 | SUPERIOR("Gérant des permission"), 10 | SETCUT("Définir la part de l'entrprise"), 11 | INVITE("Inviter"), 12 | FIRE("Expulser"), 13 | SUPPLY("Réapprovisionner"), 14 | SELLER("Ajouter/Retirer des items en vente"), 15 | LIQUIDATESHOP("Liquider un shop"), 16 | CREATESHOP("Créer un shop"), 17 | DELETESHOP("Supprimer un shop"), 18 | HIRINGER("Embaucher les postulants"), 19 | WITHDRAW("Retirer x$ de l'entreprise"), 20 | DEPOSIT("Ajouter x$ dans l'entreprise") 21 | ; 22 | 23 | private final String displayName; 24 | 25 | CorpPermission(String displayName) { 26 | this.displayName = displayName; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/corporation/ItemsAdderIntegration.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.corporation; 2 | 3 | import dev.lone.itemsadder.api.CustomFurniture; 4 | import dev.lone.itemsadder.api.CustomStack; 5 | import org.bukkit.block.Block; 6 | 7 | public class ItemsAdderIntegration { 8 | 9 | public static boolean placeShopFurniture(Block block) { 10 | CustomStack customFurniture = CustomFurniture.getInstance("omc_company:caisse"); 11 | if (customFurniture == null || block.getType() != org.bukkit.Material.AIR) 12 | return false; 13 | 14 | CustomFurniture.spawn("omc_company:caisse", block); 15 | return true; 16 | } 17 | 18 | public static boolean removeShopFurniture(Block block) { 19 | CustomStack placed = CustomFurniture.byAlreadySpawned(block); 20 | if (placed == null || !placed.getNamespacedID().equals("omc_company:caisse")) 21 | return false; 22 | 23 | CustomFurniture.remove(CustomFurniture.byAlreadySpawned(block).getEntity(), false); 24 | return true; 25 | } 26 | 27 | public static boolean hasFurniture(Block block) { 28 | CustomStack placed = CustomFurniture.byAlreadySpawned(block); 29 | return placed != null && placed.getNamespacedID().equals("omc_company:caisse"); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/corporation/MethodState.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.corporation; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public enum MethodState { 7 | SUCCESS, 8 | WARNING, 9 | ERROR, 10 | FAILURE, 11 | ESCAPE, 12 | SPECIAL 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/corporation/company/CompanyOwner.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.corporation.company; 2 | 3 | import fr.openmc.core.features.city.City; 4 | import lombok.Getter; 5 | 6 | import java.util.UUID; 7 | 8 | @Getter 9 | public class CompanyOwner { 10 | 11 | private final City city; 12 | private final UUID player; 13 | 14 | public CompanyOwner(City city) { 15 | this.city = city; 16 | this.player = null; 17 | } 18 | 19 | public CompanyOwner(UUID owner) { 20 | this.city = null; 21 | this.player = owner; 22 | } 23 | 24 | /** 25 | * know if the owner is a city 26 | * 27 | * @return true if it's a city 28 | */ 29 | public boolean isCity() { 30 | return city != null; 31 | } 32 | 33 | /** 34 | * know if the owner is a player 35 | * 36 | * @return true if it's a player 37 | */ 38 | public boolean isPlayer() { 39 | return player != null; 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/corporation/data/MerchantData.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.corporation.data; 2 | 3 | import lombok.Getter; 4 | import org.bukkit.inventory.ItemStack; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | @Getter 10 | public class MerchantData { 11 | 12 | private final List depositedItems = new ArrayList<>(); 13 | private double moneyWon = 0; 14 | 15 | /** 16 | * @return the amount of items the merchant has deposit 17 | */ 18 | public int getAllDepositedItemsAmount() { 19 | int amount = 0; 20 | for (ItemStack item : depositedItems) { 21 | amount += item.getAmount(); 22 | } 23 | return amount; 24 | } 25 | 26 | /** 27 | * add an item to the merchant data 28 | * 29 | * @param item the item to add 30 | */ 31 | public void depositItem(ItemStack item) { 32 | depositedItems.add(item); 33 | } 34 | 35 | /** 36 | * add money to the money won of the merchant 37 | * 38 | * @param money the money to add 39 | */ 40 | public void addMoneyWon(double money) { 41 | moneyWon += money; 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/corporation/data/TransactionData.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.corporation.data; 2 | 3 | import java.util.UUID; 4 | 5 | public record TransactionData(double value, String nature, String place, UUID sender) { 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/corporation/listener/CustomItemsCompanyListener.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.corporation.listener; 2 | 3 | import dev.lone.itemsadder.api.CustomFurniture; 4 | import dev.lone.itemsadder.api.Events.FurnitureBreakEvent; 5 | import dev.lone.itemsadder.api.Events.FurnitureInteractEvent; 6 | import fr.openmc.core.features.corporation.shops.Shop; 7 | import fr.openmc.core.features.corporation.manager.ShopBlocksManager; 8 | import fr.openmc.core.features.corporation.menu.shop.ShopMenu; 9 | import org.bukkit.Location; 10 | import org.bukkit.event.EventHandler; 11 | import org.bukkit.event.Listener; 12 | 13 | public class CustomItemsCompanyListener implements Listener { 14 | private final ShopBlocksManager shopBlocksManager = ShopBlocksManager.getInstance(); 15 | 16 | 17 | @EventHandler 18 | public void onFurnitureBreak(FurnitureBreakEvent event){ 19 | CustomFurniture furniture = event.getFurniture(); 20 | 21 | if (furniture!=null && furniture.getNamespacedID().equals("omc_company:caisse") && !event.getPlayer().isOp()){ 22 | event.setCancelled(true); 23 | } 24 | } 25 | 26 | @EventHandler 27 | public void onFurnitureInteract(FurnitureInteractEvent e){ 28 | if (e.getFurniture() == null) { 29 | return; 30 | } 31 | 32 | if (e.getFurniture().getNamespacedID().equals("omc_company:caisse")){ 33 | 34 | double x = e.getFurniture().getEntity().getLocation().getBlockX(); 35 | double y = e.getFurniture().getEntity().getLocation().getBlockY(); 36 | double z = e.getFurniture().getEntity().getLocation().getBlockZ(); 37 | 38 | Shop shop = shopBlocksManager.getShop(new Location(e.getFurniture().getEntity().getWorld(), x, y, z)); 39 | if (shop == null) { 40 | return; 41 | } 42 | e.setCancelled(true); 43 | ShopMenu menu = new ShopMenu(e.getPlayer(), shop, 0); 44 | menu.open(); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/corporation/shops/ShopOwner.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.corporation.shops; 2 | 3 | import fr.openmc.core.features.corporation.company.Company; 4 | import lombok.Getter; 5 | 6 | import java.util.UUID; 7 | 8 | @Getter 9 | public class ShopOwner { 10 | 11 | private final Company company; 12 | private final UUID player; 13 | 14 | /** 15 | * ShopOwner for a company or a player 16 | * @param company to set a company as the owner 17 | */ 18 | 19 | public ShopOwner(Company company) { 20 | this.company = company; 21 | this.player = null; 22 | } 23 | 24 | /** 25 | * ShopOwner for a company or a player 26 | * @param owner to set a player as the owner 27 | */ 28 | public ShopOwner(UUID owner) { 29 | this.company = null; 30 | this.player = owner; 31 | } 32 | 33 | /** 34 | * know if it's a company 35 | */ 36 | public boolean isCompany() { 37 | return company != null; 38 | } 39 | 40 | /** 41 | * know if it's a player 42 | */ 43 | public boolean isPlayer() { 44 | return player != null; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/corporation/shops/Supply.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.corporation.shops; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.UUID; 7 | 8 | @Getter 9 | public class Supply { 10 | 11 | private final UUID supplier; 12 | private final UUID itemId; 13 | private final UUID supplierUUID; 14 | @Setter 15 | private int amount; 16 | 17 | public Supply(UUID supplier, UUID itemId, int amount) { 18 | this.supplier = supplier; 19 | this.itemId = itemId; 20 | this.amount = amount; 21 | this.supplierUUID = UUID.randomUUID(); 22 | } 23 | 24 | public Supply(UUID supplier, UUID itemId, int amount, UUID supplierUUID) { 25 | this.supplier = supplier; 26 | this.itemId = itemId; 27 | this.amount = amount; 28 | this.supplierUUID = supplierUUID; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/economy/TransactionsManager.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.economy; 2 | 3 | import fr.openmc.core.OMCPlugin; 4 | import fr.openmc.core.utils.database.DatabaseManager; 5 | 6 | import java.sql.Connection; 7 | import java.sql.PreparedStatement; 8 | import java.sql.ResultSet; 9 | import java.sql.SQLException; 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | import java.util.UUID; 13 | 14 | public class TransactionsManager { 15 | public static void init_db(Connection conn) throws SQLException { 16 | conn.prepareStatement("CREATE TABLE IF NOT EXISTS transactions (recipient VARCHAR(36), sender VARCHAR(36), amount DOUBLE, reason VARCHAR(255), date TIMESTAMP DEFAULT CURRENT_TIMESTAMP)").executeUpdate(); 17 | } 18 | 19 | public static List getTransactionsByPlayers(UUID player, int limit) { 20 | if (!OMCPlugin.getConfigs().getBoolean("features.transactions", false)) { 21 | return List.of(new Transaction("CONSOLE", "CONSOLE", 0, "Désactivé")); 22 | } 23 | 24 | List transactions = new ArrayList<>(); 25 | try { 26 | PreparedStatement statement = DatabaseManager.getConnection().prepareStatement("SELECT recipient, sender, amount, reason FROM transactions WHERE recipient = ? OR sender = ? ORDER BY date DESC LIMIT ?"); 27 | statement.setString(1, player.toString()); 28 | statement.setString(2, player.toString()); 29 | statement.setInt(3, limit); 30 | 31 | ResultSet rs = statement.executeQuery(); 32 | while (rs.next()) { 33 | transactions.add(new Transaction( 34 | rs.getString("recipient"), 35 | rs.getString("sender"), 36 | rs.getDouble("amount"), 37 | rs.getString("reason") 38 | )); 39 | } 40 | 41 | return transactions; 42 | } catch (SQLException err) { 43 | err.printStackTrace(); 44 | return List.of(new Transaction("CONSOLE", "CONSOLE", 0, "ERREUR")); 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/economy/TransactionsMenu.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.economy; 2 | 3 | import fr.openmc.api.menulib.Menu; 4 | import fr.openmc.api.menulib.utils.InventorySize; 5 | import fr.openmc.core.utils.CacheOfflinePlayer; 6 | import org.bukkit.Bukkit; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.event.inventory.InventoryClickEvent; 9 | import org.bukkit.event.inventory.InventoryCloseEvent; 10 | import org.bukkit.inventory.ItemStack; 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | import java.util.HashMap; 14 | import java.util.List; 15 | import java.util.Map; 16 | import java.util.UUID; 17 | 18 | public class TransactionsMenu extends Menu { 19 | Player owner; 20 | UUID target; 21 | 22 | public TransactionsMenu(Player owner, UUID target) { 23 | super(owner); 24 | this.owner = owner; 25 | this.target = target; 26 | } 27 | 28 | @Override 29 | public @NotNull String getName() { 30 | return "Transactions de "+ CacheOfflinePlayer.getOfflinePlayer(target).getName(); 31 | } 32 | 33 | @Override 34 | public @NotNull InventorySize getInventorySize() { 35 | return InventorySize.LARGEST; 36 | } 37 | 38 | @Override 39 | public void onInventoryClick(InventoryClickEvent inventoryClickEvent) {} 40 | 41 | @Override 42 | public @NotNull Map getContent() { 43 | Map items = new HashMap<>(); 44 | int iter = 0; 45 | for (Transaction transaction: TransactionsManager.getTransactionsByPlayers(target, 54)) { 46 | items.put(iter, transaction.toItemStack(target)); 47 | iter++; 48 | } 49 | 50 | return items; 51 | } 52 | 53 | @Override 54 | public void onClose(InventoryCloseEvent event) { 55 | //empty 56 | } 57 | 58 | @Override 59 | public List getTakableSlot() { 60 | return List.of(); 61 | } 62 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/economy/commands/History.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.economy.commands; 2 | 3 | import fr.openmc.core.features.economy.TransactionsMenu; 4 | import org.bukkit.entity.Player; 5 | import revxrsal.commands.annotation.Command; 6 | import revxrsal.commands.annotation.Cooldown; 7 | import revxrsal.commands.annotation.Description; 8 | import revxrsal.commands.annotation.Optional; 9 | import revxrsal.commands.bukkit.annotation.CommandPermission; 10 | 11 | public class History { 12 | @Command("money history") 13 | @Description("Affiche votre historique de transactions") 14 | @CommandPermission("omc.commands.money.history") 15 | @Cooldown(30) 16 | public void history(Player sender, @Optional Player target){ 17 | if (!(sender instanceof Player player)) { return; } 18 | 19 | if (target == null) { 20 | target = player; 21 | } else { 22 | if (!sender.hasPermission("omc.admin.money.history")) { 23 | target = player; 24 | } 25 | } 26 | 27 | new TransactionsMenu(player, target.getUniqueId()).open(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/homes/HomeLimit.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.homes; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.UUID; 7 | 8 | @Getter 9 | public class HomeLimit { 10 | 11 | private final UUID playerUUID; 12 | @Setter private HomeLimits homeLimit; 13 | 14 | public HomeLimit(UUID playerUUID, HomeLimits limit) { 15 | this.playerUUID = playerUUID; 16 | this.homeLimit = limit; 17 | } 18 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/homes/HomeLimits.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.homes; 2 | 3 | import lombok.Getter; 4 | 5 | public enum HomeLimits { 6 | 7 | LIMIT_0(1, 0, 0), 8 | LIMIT_1(3, 5000, 10), 9 | LIMIT_2(5, 10000, 20), 10 | LIMIT_3(7, 15000, 30), 11 | LIMIT_4(10, 20000, 40), 12 | LIMIT_5(13, 25000, 50), 13 | LIMIT_6(15, 30000, 60), 14 | LIMIT_7(17, 35000, 70), 15 | LIMIT_8(20, 40000, 80), 16 | LIMIT_9(23, 45000, 90), 17 | LIMIT_10(25, 50000, 100), 18 | LIMIT_11(27, 55000, 110), 19 | LIMIT_12(30, 60000, 120), 20 | ; 21 | 22 | @Getter int limit; 23 | @Getter int price; 24 | @Getter int ayweniteCost; 25 | 26 | HomeLimits(int limit, int price, int ayweniteCost) { 27 | this.limit = limit; 28 | this.price = price; 29 | this.ayweniteCost = ayweniteCost; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/homes/world/WorldDisableInfo.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.homes.world; 2 | 3 | public record WorldDisableInfo(String addedBy, long addedOn) {} 4 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/mailboxes/letter/SenderLetter.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.mailboxes.letter; 2 | 3 | import net.kyori.adventure.text.Component; 4 | import net.kyori.adventure.text.format.NamedTextColor; 5 | import org.bukkit.Material; 6 | import org.bukkit.OfflinePlayer; 7 | import org.bukkit.inventory.ItemStack; 8 | import org.bukkit.inventory.meta.SkullMeta; 9 | 10 | import java.time.LocalDateTime; 11 | import java.util.ArrayList; 12 | 13 | import static fr.openmc.core.features.mailboxes.utils.MailboxUtils.*; 14 | import static fr.openmc.core.utils.DateUtils.formatRelativeDate; 15 | 16 | public class SenderLetter extends ItemStack { 17 | private final int id; 18 | 19 | public SenderLetter(OfflinePlayer player, int id, int itemsCount, LocalDateTime sentAt, boolean refused) { 20 | super(Material.PLAYER_HEAD, 1); 21 | this.id = id; 22 | SkullMeta skullMeta = (SkullMeta) this.getItemMeta(); 23 | skullMeta.setOwningPlayer(player); 24 | skullMeta.displayName(getStatus(refused)); 25 | ArrayList lore = new ArrayList<>(); 26 | lore.add(colorText("➡ Cliquez pour annuler", NamedTextColor.YELLOW, true)); 27 | lore.add(getPlayerName(player)); 28 | lore.add(colorText(formatRelativeDate(sentAt) + ", " + itemsCount + " " + getItemCount(itemsCount), NamedTextColor.DARK_GRAY, true)); 29 | skullMeta.lore(lore); 30 | this.setItemMeta(skullMeta); 31 | } 32 | 33 | public static Component getStatus(boolean refused) { 34 | NamedTextColor color = refused ? NamedTextColor.DARK_RED : NamedTextColor.DARK_AQUA; 35 | Component status = Component.text("[", NamedTextColor.DARK_GRAY) 36 | .append(Component.text(refused ? "❌" : "⌚", color)) 37 | .append(Component.text("] ", NamedTextColor.DARK_GRAY)) 38 | .append(Component.text(refused ? "Refusée" : "En attente", color)); 39 | return nonItalic(status); 40 | } 41 | 42 | public int getId() { 43 | return id; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/mailboxes/menu/PlayersList.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.mailboxes.menu; 2 | 3 | 4 | import fr.openmc.core.features.mailboxes.utils.PaginatedMailbox; 5 | import fr.openmc.core.utils.ItemUtils; 6 | import org.bukkit.Bukkit; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.inventory.ItemStack; 9 | 10 | public class PlayersList extends PaginatedMailbox { 11 | public PlayersList(Player player) { 12 | super(player); 13 | for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { 14 | if (onlinePlayer == player) continue; 15 | pageItems.add(ItemUtils.getPlayerHead(onlinePlayer.getUniqueId())); 16 | } 17 | initInventory(); 18 | } 19 | 20 | @Override 21 | public void openInventory() { 22 | player.openInventory(this.inventory); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/mailboxes/utils/MailboxInv.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.mailboxes.utils; 2 | 3 | 4 | import fr.openmc.core.OMCPlugin; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.inventory.Inventory; 7 | import org.bukkit.inventory.InventoryHolder; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | import static fr.openmc.core.features.mailboxes.utils.MailboxMenuManager.playerInventories; 11 | import static fr.openmc.core.features.mailboxes.utils.MailboxUtils.sendFailureMessage; 12 | 13 | public abstract class MailboxInv implements InventoryHolder { 14 | protected static String invErrorMessage; 15 | protected final Player player; 16 | protected final OMCPlugin plugin = OMCPlugin.getInstance(); 17 | protected Inventory inventory; 18 | 19 | public MailboxInv(Player player) { 20 | this.player = player; 21 | } 22 | 23 | public void addInventory() { 24 | playerInventories.put(player, this); 25 | } 26 | 27 | public void removeInventory() { 28 | playerInventories.remove(player); 29 | } 30 | 31 | @Override 32 | public @NotNull Inventory getInventory() { 33 | return this.inventory; 34 | } 35 | 36 | public void openInventory() { 37 | if (inventory == null) { 38 | sendInvErrorMessage(player); 39 | return; 40 | } 41 | player.openInventory(this.inventory); 42 | } 43 | 44 | protected void sendInvErrorMessage(Player player) { 45 | if (invErrorMessage == null) return; 46 | sendFailureMessage(player, invErrorMessage); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/command/QuestCommand.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.command; 2 | 3 | import fr.openmc.core.features.quests.menus.QuestsMenu; 4 | import fr.openmc.core.utils.messages.MessageType; 5 | import fr.openmc.core.utils.messages.MessagesManager; 6 | import fr.openmc.core.utils.messages.Prefix; 7 | import org.bukkit.entity.Player; 8 | import revxrsal.commands.annotation.*; 9 | 10 | @Command({"quest", "quests"}) 11 | @Description("Commande pour les quêtes") 12 | public class QuestCommand { 13 | 14 | @DefaultFor({"~"}) 15 | @Description("Ouvre le menu des quêtes") 16 | public void onQuest(Player player) { 17 | new QuestsMenu(player).open(); 18 | } 19 | 20 | @Subcommand("open") 21 | @Description("Ouvre le menu des quêtes") 22 | public void resetProgress(Player sender, @Optional Player target) { 23 | if (target == null || target == sender) { 24 | new QuestsMenu(sender).open(); 25 | } else { 26 | if (sender.hasPermission("omc.quests.admin")) new QuestsMenu(target).open(); 27 | else MessagesManager.sendMessage(sender, MessagesManager.Message.NOPERMISSION.getMessage(), Prefix.OPENMC, MessageType.ERROR, true); 28 | 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/quests/BreakDiamondQuest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.quests; 2 | 3 | import fr.openmc.core.features.quests.objects.Quest; 4 | import fr.openmc.core.features.quests.objects.QuestTier; 5 | import fr.openmc.core.features.quests.rewards.QuestMoneyReward; 6 | import org.bukkit.Material; 7 | import org.bukkit.enchantments.Enchantment; 8 | import org.bukkit.event.EventHandler; 9 | import org.bukkit.event.EventPriority; 10 | import org.bukkit.event.Listener; 11 | import org.bukkit.event.block.BlockBreakEvent; 12 | import org.bukkit.inventory.ItemStack; 13 | 14 | public class BreakDiamondQuest extends Quest implements Listener { 15 | 16 | public BreakDiamondQuest() { 17 | super( 18 | "Richou", 19 | "Casser {target} minerai{s} de diamant", 20 | Material.DIAMOND 21 | ); 22 | 23 | this.addTiers( 24 | new QuestTier(100, new QuestMoneyReward(2500)), 25 | new QuestTier(400, new QuestMoneyReward(5000)), 26 | new QuestTier(800, new QuestMoneyReward(10000)) 27 | ); 28 | } 29 | 30 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 31 | public void onPlayerBreak(BlockBreakEvent event) { 32 | ItemStack tool = event.getPlayer().getInventory().getItemInMainHand(); 33 | if (tool.containsEnchantment(Enchantment.SILK_TOUCH)) { 34 | return; // Ne pas compter si le joueur utilise Silk Touch 35 | } 36 | 37 | if (event.getBlock().getType().equals(Material.DIAMOND_ORE) 38 | || event.getBlock().getType().equals(Material.DEEPSLATE_DIAMOND_ORE) 39 | ) { 40 | this.incrementProgress(event.getPlayer().getUniqueId()); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/quests/BreakStoneQuest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.quests; 2 | 3 | import fr.openmc.core.features.quests.objects.Quest; 4 | import fr.openmc.core.features.quests.objects.QuestTier; 5 | import fr.openmc.core.features.quests.rewards.QuestMoneyReward; 6 | import org.bukkit.Material; 7 | import org.bukkit.block.Block; 8 | import org.bukkit.enchantments.Enchantment; 9 | import org.bukkit.event.EventHandler; 10 | import org.bukkit.event.EventPriority; 11 | import org.bukkit.event.Listener; 12 | import org.bukkit.event.block.BlockBreakEvent; 13 | import org.bukkit.inventory.ItemStack; 14 | 15 | public class BreakStoneQuest extends Quest implements Listener { 16 | 17 | public BreakStoneQuest() { 18 | super("Casseur de pierres","Miner {target} blocs de pierre", new ItemStack(Material.DIAMOND_PICKAXE)); 19 | 20 | 21 | this.addTiers( 22 | new QuestTier(10000, new QuestMoneyReward(2000)), 23 | new QuestTier(30000, new QuestMoneyReward(4000)), 24 | new QuestTier(80000, new QuestMoneyReward(6000)), 25 | new QuestTier(150000, new QuestMoneyReward(10000)) 26 | ); 27 | } 28 | 29 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 30 | public void onPlayerBreak(BlockBreakEvent event) { 31 | ItemStack tool = event.getPlayer().getInventory().getItemInMainHand(); 32 | Block block = event.getBlock(); 33 | if (block.getType().equals(Material.STONE)) { 34 | this.incrementProgress(event.getPlayer().getUniqueId()); 35 | } 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/quests/ChickenThrowerQuest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.quests; 2 | 3 | import fr.openmc.core.features.quests.objects.Quest; 4 | import fr.openmc.core.features.quests.objects.QuestTier; 5 | import fr.openmc.core.features.quests.rewards.QuestMoneyReward; 6 | import org.bukkit.Material; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.EventPriority; 9 | import org.bukkit.event.Listener; 10 | import org.bukkit.event.player.PlayerEggThrowEvent; 11 | import org.bukkit.inventory.ItemStack; 12 | 13 | public class ChickenThrowerQuest extends Quest implements Listener { 14 | 15 | public ChickenThrowerQuest() { 16 | super( 17 | "Lanceur de Poules", 18 | "Lancer {target} oeufs", 19 | new ItemStack(Material.EGG) 20 | ); 21 | 22 | this.addTiers( 23 | new QuestTier(50, new QuestMoneyReward(500)), 24 | new QuestTier(200, new QuestMoneyReward(2000)), 25 | new QuestTier(500, new QuestMoneyReward(5000)), 26 | new QuestTier(1000, new QuestMoneyReward(10000)) 27 | ); 28 | } 29 | 30 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 31 | public void onEggThrow(PlayerEggThrowEvent event) { 32 | this.incrementProgress(event.getPlayer().getUniqueId(), 1); 33 | } 34 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/quests/CityCreateQuest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.quests; 2 | 3 | import fr.openmc.core.features.city.events.CityCreationEvent; 4 | import fr.openmc.core.features.city.events.MemberJoinEvent; 5 | import fr.openmc.core.features.quests.objects.Quest; 6 | import fr.openmc.core.features.quests.objects.QuestTier; 7 | import fr.openmc.core.features.quests.rewards.QuestMoneyReward; 8 | import org.bukkit.Material; 9 | import org.bukkit.OfflinePlayer; 10 | import org.bukkit.entity.Player; 11 | import org.bukkit.event.EventHandler; 12 | import org.bukkit.event.EventPriority; 13 | import org.bukkit.event.Listener; 14 | 15 | public class CityCreateQuest extends Quest implements Listener { 16 | 17 | public CityCreateQuest() { 18 | super( 19 | "Citoyen", 20 | "Créer ou rejoins une ville", 21 | Material.OAK_DOOR 22 | ); 23 | 24 | this.addTier(new QuestTier( 25 | 1, 26 | new QuestMoneyReward(3000) 27 | )); 28 | } 29 | 30 | @EventHandler(priority = EventPriority.NORMAL) 31 | public void onCityCreate(CityCreationEvent event) { 32 | Player player = event.getOwner(); 33 | if (player != null) this.incrementProgress(player.getUniqueId()); 34 | } 35 | 36 | @EventHandler(priority = EventPriority.NORMAL) 37 | public void onPlayerJoin(MemberJoinEvent event) { 38 | OfflinePlayer player = event.getPlayer(); 39 | if (player.isOnline()) this.incrementProgress(player.getUniqueId()); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/quests/ConsumeKebabQuest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.quests; 2 | 3 | import fr.openmc.core.features.quests.objects.Quest; 4 | import fr.openmc.core.features.quests.objects.QuestTier; 5 | import fr.openmc.core.features.quests.rewards.QuestMoneyReward; 6 | import fr.openmc.core.utils.customitems.CustomItemRegistry; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.EventPriority; 9 | import org.bukkit.event.Listener; 10 | import org.bukkit.event.player.PlayerItemConsumeEvent; 11 | import org.bukkit.inventory.ItemStack; 12 | 13 | public class ConsumeKebabQuest extends Quest implements Listener { 14 | 15 | public ConsumeKebabQuest() { 16 | super("Miam Miam", "Manger {target} kebab{s}", CustomItemRegistry.getByName("omc_foods:kebab").getBest()); 17 | 18 | this.addTiers( 19 | new QuestTier(10, new QuestMoneyReward(30)), 20 | new QuestTier(64, new QuestMoneyReward(80)), 21 | new QuestTier(256, new QuestMoneyReward(160)), 22 | new QuestTier(1024, new QuestMoneyReward(1000)) 23 | ); 24 | } 25 | 26 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 27 | public void onPlayerConsume(PlayerItemConsumeEvent event) { 28 | ItemStack item = event.getItem(); 29 | if (item.isSimilar(CustomItemRegistry.getByName("omc_foods:kebab").getBest())) { 30 | this.incrementProgress(event.getPlayer().getUniqueId()); 31 | } 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/quests/CraftCakeQuest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.quests; 2 | 3 | import fr.openmc.core.features.quests.objects.Quest; 4 | import fr.openmc.core.features.quests.objects.QuestTier; 5 | import fr.openmc.core.features.quests.rewards.QuestMoneyReward; 6 | import org.bukkit.Material; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.EventPriority; 9 | import org.bukkit.event.Listener; 10 | import org.bukkit.event.inventory.CraftItemEvent; 11 | 12 | public class CraftCakeQuest extends Quest implements Listener { 13 | 14 | public CraftCakeQuest() { 15 | super("Le pâtissier", "Craft {target} gâteaux", Material.CAKE); 16 | 17 | this.addTiers( 18 | new QuestTier(64, new QuestMoneyReward(100)), 19 | new QuestTier(256, new QuestMoneyReward(400)) 20 | ); 21 | } 22 | 23 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 24 | public void onPlayerCraft(CraftItemEvent event) { 25 | if (event.getRecipe().getResult().getType().equals(Material.CAKE)) { 26 | this.incrementProgress(event.getWhoClicked().getUniqueId()); 27 | } 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/quests/CraftKebabQuest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.quests; 2 | 3 | import fr.openmc.core.features.quests.objects.Quest; 4 | import fr.openmc.core.features.quests.objects.QuestTier; 5 | import fr.openmc.core.features.quests.rewards.QuestItemReward; 6 | import fr.openmc.core.features.quests.rewards.QuestMoneyReward; 7 | import fr.openmc.core.utils.customitems.CustomItemRegistry; 8 | import org.bukkit.Material; 9 | import org.bukkit.event.EventHandler; 10 | import org.bukkit.event.EventPriority; 11 | import org.bukkit.event.Listener; 12 | import org.bukkit.event.inventory.CraftItemEvent; 13 | import org.bukkit.inventory.ItemStack; 14 | 15 | public class CraftKebabQuest extends Quest implements Listener { 16 | 17 | public CraftKebabQuest() { 18 | super( 19 | "Kebab", 20 | "Fabriquer {target} kebab{s}", 21 | Material.BREAD 22 | ); 23 | 24 | this.addTiers( 25 | new QuestTier(1, new QuestItemReward(CustomItemRegistry.getByName("omc_foods:kebab").getBest(), 16)), 26 | new QuestTier(32, new QuestMoneyReward(100)), 27 | new QuestTier(128, new QuestMoneyReward(400)), 28 | new QuestTier(512, new QuestMoneyReward(800)) 29 | ); 30 | } 31 | 32 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 33 | public void onPlayerCraft(CraftItemEvent event) { 34 | ItemStack item = event.getCurrentItem(); 35 | if (item != null && item.isSimilar(CustomItemRegistry.getByName("omc_foods:kebab").getBest())) { 36 | incrementProgress(event.getWhoClicked().getUniqueId()); 37 | } 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/quests/EnchantFirstItemQuest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.quests; 2 | 3 | import fr.openmc.core.features.quests.objects.Quest; 4 | import fr.openmc.core.features.quests.objects.QuestTier; 5 | import fr.openmc.core.features.quests.rewards.QuestMoneyReward; 6 | import org.bukkit.Material; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.EventPriority; 9 | import org.bukkit.event.Listener; 10 | import org.bukkit.event.enchantment.EnchantItemEvent; 11 | import org.bukkit.inventory.ItemStack; 12 | 13 | public class EnchantFirstItemQuest extends Quest implements Listener { 14 | 15 | public EnchantFirstItemQuest() { 16 | super("Abracadabra", "Enchanter un objet pour la première fois", Material.ENCHANTING_TABLE); 17 | 18 | this.addTiers( 19 | new QuestTier(1, new QuestMoneyReward(200)) 20 | ); 21 | } 22 | 23 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 24 | public void onEnchantItem(EnchantItemEvent event) { 25 | ItemStack item = event.getItem(); 26 | if (item.getType() != Material.AIR) { 27 | this.incrementProgress(event.getEnchanter().getUniqueId()); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/quests/KillPlayersQuest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.quests; 2 | 3 | import fr.openmc.core.features.quests.objects.Quest; 4 | import fr.openmc.core.features.quests.objects.QuestTier; 5 | import fr.openmc.core.features.quests.rewards.QuestMoneyReward; 6 | import org.bukkit.Material; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.event.EventHandler; 9 | import org.bukkit.event.EventPriority; 10 | import org.bukkit.event.Listener; 11 | import org.bukkit.event.entity.PlayerDeathEvent; 12 | 13 | public class KillPlayersQuest extends Quest implements Listener { 14 | 15 | public KillPlayersQuest() { 16 | super( 17 | "Tueur à gage", 18 | "Tuer {target} joueurs", 19 | Material.IRON_SWORD 20 | ); 21 | 22 | this.addTiers( 23 | new QuestTier(5, new QuestMoneyReward(2500)), 24 | new QuestTier(20, new QuestMoneyReward(5000)), 25 | new QuestTier(30, new QuestMoneyReward(10000)) 26 | ); 27 | } 28 | 29 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 30 | public void onPlayerKill(PlayerDeathEvent event) { 31 | if (event.getEntity().getKiller() instanceof Player player) { 32 | this.incrementProgress(player.getUniqueId(), 1); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/quests/KillSuperCreeperQuest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.quests; 2 | 3 | import fr.openmc.core.features.quests.objects.Quest; 4 | import fr.openmc.core.features.quests.objects.QuestTier; 5 | import fr.openmc.core.features.quests.rewards.QuestMoneyReward; 6 | import org.bukkit.Material; 7 | import org.bukkit.entity.Creeper; 8 | import org.bukkit.entity.Player; 9 | import org.bukkit.event.EventHandler; 10 | import org.bukkit.event.EventPriority; 11 | import org.bukkit.event.Listener; 12 | import org.bukkit.event.entity.EntityDeathEvent; 13 | 14 | public class KillSuperCreeperQuest extends Quest implements Listener { 15 | 16 | public KillSuperCreeperQuest() { 17 | super( 18 | "Le Boss des Creepers", 19 | "Tuer {target} creepers super chargés", 20 | Material.CREEPER_HEAD 21 | ); 22 | 23 | this.addTier(new QuestTier(1, new QuestMoneyReward(1000))); 24 | } 25 | 26 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 27 | public void onPlayerKill(EntityDeathEvent event) { 28 | Player player = event.getEntity().getKiller(); 29 | if (player != null && event.getEntity() instanceof Creeper creeper && creeper.isPowered()) { 30 | this.incrementProgress(player.getUniqueId()); 31 | } 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/quests/KillZombieQuest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.quests; 2 | 3 | import fr.openmc.core.features.quests.objects.Quest; 4 | import fr.openmc.core.features.quests.objects.QuestTier; 5 | import fr.openmc.core.features.quests.rewards.QuestMoneyReward; 6 | import org.bukkit.Material; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.entity.Zombie; 9 | import org.bukkit.event.EventHandler; 10 | import org.bukkit.event.EventPriority; 11 | import org.bukkit.event.Listener; 12 | import org.bukkit.event.entity.EntityDeathEvent; 13 | 14 | public class KillZombieQuest extends Quest implements Listener { 15 | 16 | public KillZombieQuest() { 17 | super("Apocalypse zombie ?", "Tuer {target} zombies", Material.ZOMBIE_HEAD); 18 | 19 | this.addTiers( 20 | new QuestTier(1000, new QuestMoneyReward(8000)), 21 | new QuestTier(4000, new QuestMoneyReward(10000)), 22 | new QuestTier(10000, new QuestMoneyReward(15000)) 23 | ); 24 | } 25 | 26 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 27 | public void onZombieKill(EntityDeathEvent event) { 28 | if (event.getEntity().getKiller() instanceof Player player && event.getEntity() instanceof Zombie) { 29 | this.incrementProgress(player.getUniqueId()); 30 | } 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/quests/MineAyweniteQuest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.quests; 2 | 3 | import dev.lone.itemsadder.api.CustomBlock; 4 | import fr.openmc.core.features.quests.objects.Quest; 5 | import fr.openmc.core.features.quests.objects.QuestTier; 6 | import fr.openmc.core.features.quests.rewards.QuestItemReward; 7 | import fr.openmc.core.features.quests.rewards.QuestMoneyReward; 8 | import fr.openmc.core.utils.customitems.CustomItemRegistry; 9 | import org.bukkit.Material; 10 | import org.bukkit.enchantments.Enchantment; 11 | import org.bukkit.event.EventHandler; 12 | import org.bukkit.event.EventPriority; 13 | import org.bukkit.event.Listener; 14 | import org.bukkit.event.block.BlockBreakEvent; 15 | import org.bukkit.inventory.ItemStack; 16 | 17 | public class MineAyweniteQuest extends Quest implements Listener { 18 | 19 | public MineAyweniteQuest() { 20 | super("Ohhh... c'est précieux ça ?", "Miner {target} Aywenite{s}", CustomItemRegistry.getByName("omc_items:aywenite").getBest()); 21 | 22 | this.addTiers( 23 | new QuestTier(1, new QuestMoneyReward(20)), 24 | new QuestTier(64, new QuestMoneyReward(140)), 25 | new QuestTier(512, new QuestItemReward(Material.ANCIENT_DEBRIS, 2)) 26 | ); 27 | } 28 | 29 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 30 | public void onPlayerBreakBlock(BlockBreakEvent event) { 31 | ItemStack tool = event.getPlayer().getInventory().getItemInMainHand(); 32 | if (tool.containsEnchantment(Enchantment.SILK_TOUCH)) { 33 | return; // Ne pas compter si le joueur utilise Silk Touch 34 | } 35 | 36 | CustomBlock customBlock = CustomBlock.byAlreadyPlaced(event.getBlock()); 37 | if (customBlock != null && customBlock.getNamespacedID() != null && 38 | ("omc_blocks:aywenite_ore".equals(customBlock.getNamespacedID()) || 39 | "omc_blocks:deepslate_aywenite_ore".equals(customBlock.getNamespacedID())) 40 | ) { 41 | this.incrementProgress(event.getPlayer().getUniqueId()); 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/quests/SaveTheEarthQuest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.quests; 2 | 3 | import fr.openmc.core.features.quests.objects.Quest; 4 | import fr.openmc.core.features.quests.objects.QuestTier; 5 | import fr.openmc.core.features.quests.rewards.QuestItemReward; 6 | import org.bukkit.Material; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.EventPriority; 9 | import org.bukkit.event.Listener; 10 | import org.bukkit.event.world.StructureGrowEvent; 11 | 12 | public class SaveTheEarthQuest extends Quest implements Listener { 13 | 14 | public SaveTheEarthQuest() { 15 | super("Sauvons la planète", "Planter {target} arbres et les faire grandir avec des poudres d'os", Material.OAK_SAPLING); 16 | 17 | this.addTiers( 18 | new QuestTier(10, new QuestItemReward(Material.OAK_LOG, 32)), 19 | new QuestTier(40, new QuestItemReward(Material.OAK_LOG, 64)), 20 | new QuestTier(100, new QuestItemReward(Material.OAK_LOG, 128)), 21 | new QuestTier(1000, new QuestItemReward(Material.OAK_LOG, 256)) 22 | ); 23 | } 24 | 25 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 26 | public void onPlayerBreak(StructureGrowEvent event) { 27 | if (event.getPlayer() != null) 28 | this.incrementProgress(event.getPlayer().getUniqueId()); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/quests/SmeltIronQuest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.quests; 2 | 3 | import fr.openmc.core.features.quests.objects.Quest; 4 | import fr.openmc.core.features.quests.objects.QuestTier; 5 | import fr.openmc.core.features.quests.rewards.QuestMoneyReward; 6 | import org.bukkit.Material; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.EventPriority; 9 | import org.bukkit.event.Listener; 10 | import org.bukkit.event.inventory.FurnaceExtractEvent; 11 | 12 | public class SmeltIronQuest extends Quest implements Listener { 13 | 14 | public SmeltIronQuest() { 15 | super("Chaud devant !", "Faire fondre {target} lingots de fer", Material.IRON_ORE); 16 | 17 | this.addTiers( 18 | new QuestTier(256, new QuestMoneyReward(2000)), 19 | new QuestTier(512, new QuestMoneyReward(4000)), 20 | new QuestTier(1536, new QuestMoneyReward(8000)) 21 | ); 22 | } 23 | 24 | @EventHandler(priority = EventPriority.MONITOR) 25 | public void onPlayerSmelt(FurnaceExtractEvent event) { 26 | if (event.getItemType().equals(Material.IRON_INGOT)) { 27 | int amount = event.getItemAmount(); 28 | this.incrementProgress(event.getPlayer().getUniqueId(), amount); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/quests/WalkQuests.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.quests; 2 | 3 | import fr.openmc.core.features.quests.objects.Quest; 4 | import fr.openmc.core.features.quests.objects.QuestTier; 5 | import fr.openmc.core.features.quests.rewards.QuestMoneyReward; 6 | import org.bukkit.Material; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.event.EventHandler; 9 | import org.bukkit.event.EventPriority; 10 | import org.bukkit.event.Listener; 11 | import org.bukkit.event.player.PlayerMoveEvent; 12 | 13 | public class WalkQuests extends Quest implements Listener { 14 | public WalkQuests() { 15 | super("Le randonneur", "Marcher {target} blocs", Material.LEATHER_BOOTS, true); 16 | 17 | this.addTiers( 18 | new QuestTier(4000, new QuestMoneyReward(500)), 19 | new QuestTier(10000, new QuestMoneyReward(1200)), 20 | new QuestTier(30000, new QuestMoneyReward(3200)), 21 | new QuestTier(100000, new QuestMoneyReward(8000)) 22 | ); 23 | } 24 | 25 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 26 | public void onPlayerMove(PlayerMoveEvent event) { 27 | Player player = event.getPlayer(); 28 | if ( 29 | (event.getFrom().getBlockX() != event.getTo().getBlockX() 30 | || event.getFrom().getBlockZ() != event.getTo().getBlockZ()) 31 | && !player.isFlying() 32 | && !player.isGliding() 33 | && !player.isInsideVehicle() 34 | ) { 35 | this.incrementProgress(player.getUniqueId()); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/quests/WinContestQuest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.quests; 2 | 3 | import fr.openmc.core.features.contest.ContestEndEvent; 4 | import fr.openmc.core.features.quests.objects.Quest; 5 | import fr.openmc.core.features.quests.objects.QuestTier; 6 | import fr.openmc.core.features.quests.rewards.QuestItemReward; 7 | import fr.openmc.core.utils.customitems.CustomItemRegistry; 8 | import org.bukkit.Material; 9 | import org.bukkit.event.EventHandler; 10 | import org.bukkit.event.Listener; 11 | 12 | import java.util.UUID; 13 | 14 | public class WinContestQuest extends Quest implements Listener { 15 | 16 | public WinContestQuest() { 17 | super( 18 | "Choisir son camp", 19 | "Gagne {target} contest", 20 | Material.NAUTILUS_SHELL 21 | ); 22 | 23 | this.addTier(new QuestTier(1, new QuestItemReward(CustomItemRegistry.getByName("omc_contest:contest_shell").getBest(), 5))); 24 | } 25 | 26 | @EventHandler 27 | public void onEndContest(ContestEndEvent event) { 28 | for (UUID playerUUID : event.getWinners()) { 29 | this.incrementProgress(playerUUID); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/rewards/QuestMoneyReward.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.rewards; 2 | 3 | import fr.openmc.core.features.economy.EconomyManager; 4 | import fr.openmc.core.utils.messages.MessageType; 5 | import fr.openmc.core.utils.messages.MessagesManager; 6 | import fr.openmc.core.utils.messages.Prefix; 7 | import lombok.Getter; 8 | import net.kyori.adventure.text.Component; 9 | import org.bukkit.entity.Player; 10 | 11 | /** 12 | * Class representing a money reward for a quest. 13 | *

14 | * This class implements the QuestReward interface and provides functionality to give a specified amount of money to a player. 15 | */ 16 | public class QuestMoneyReward implements QuestReward { 17 | 18 | @Getter private final double amount; 19 | 20 | /** 21 | * Constructor for the QuestMoneyReward class. 22 | * 23 | * @param amount The amount of money to be rewarded. 24 | */ 25 | public QuestMoneyReward(double amount) { 26 | this.amount = amount; 27 | } 28 | 29 | /** 30 | * Gives the specified amount of money to the player. 31 | * 32 | * @param player The player to whom the reward will be given. 33 | */ 34 | @Override 35 | public void giveReward(Player player) { 36 | EconomyManager.getInstance().addBalance(player.getUniqueId(), amount); 37 | MessagesManager.sendMessage( 38 | player, 39 | Component.text("§aVous avez reçu §e" + amount + EconomyManager.getEconomyIcon()), 40 | Prefix.QUEST, 41 | MessageType.SUCCESS, 42 | false 43 | ); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/quests/rewards/QuestReward.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.quests.rewards; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | /** 6 | * Interface representing a quest reward. 7 | * Implementations of this interface should define how to give the reward to a player. 8 | */ 9 | public interface QuestReward { 10 | /** 11 | * Gives the reward to the specified player. 12 | * 13 | * @param player The player to give the reward to. 14 | */ 15 | void giveReward(Player player); 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/scoreboards/TabList.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.scoreboards; 2 | 3 | import com.comphenix.protocol.PacketType; 4 | import com.comphenix.protocol.ProtocolLibrary; 5 | import com.comphenix.protocol.ProtocolManager; 6 | import com.comphenix.protocol.events.PacketContainer; 7 | import com.comphenix.protocol.wrappers.WrappedChatComponent; 8 | import lombok.Getter; 9 | import me.clip.placeholderapi.PlaceholderAPI; 10 | import org.bukkit.Bukkit; 11 | import org.bukkit.entity.Player; 12 | 13 | public class TabList { 14 | 15 | @Getter private static TabList instance; 16 | private ProtocolManager protocolManager = null; 17 | 18 | public TabList() { 19 | instance = this; 20 | if (Bukkit.getPluginManager().getPlugin("ProtocolLib") != null) 21 | this.protocolManager = ProtocolLibrary.getProtocolManager(); 22 | } 23 | 24 | public void updateHeaderFooter(Player player, String header, String footer) { 25 | try { 26 | if (protocolManager == null) return; 27 | PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.PLAYER_LIST_HEADER_FOOTER); 28 | packet.getChatComponents().write(0, WrappedChatComponent.fromText(header)) 29 | .write(1, WrappedChatComponent.fromText(footer)); 30 | protocolManager.sendServerPacket(player, packet); 31 | } catch (Exception e) { 32 | throw new RuntimeException(e); 33 | } 34 | } 35 | 36 | public void updateTabList(Player player) { 37 | int visibleOnlinePlayers = 0; 38 | for (Player p : Bukkit.getOnlinePlayers()) { 39 | if (p.canSee(player)) { 40 | visibleOnlinePlayers++; 41 | } 42 | } 43 | 44 | String header = PlaceholderAPI.setPlaceholders(player, "\n\n\n\n\n\n\n"+PlaceholderAPI.setPlaceholders(player, "%img_openmc%")+"\n\n §eJoueurs en ligne §7: §6"+visibleOnlinePlayers+"§7/§e%server_max_players% \n"); 45 | String footer = "\n§dplay.openmc.fr\n"; 46 | 47 | updateHeaderFooter(player, header, footer); 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/tpa/TPAManager.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.tpa; 2 | 3 | import fr.openmc.core.OMCPlugin; 4 | import fr.openmc.core.CommandsManager; 5 | import fr.openmc.core.features.tpa.commands.TPACommand; 6 | import fr.openmc.core.features.tpa.commands.TPAcceptCommand; 7 | import fr.openmc.core.features.tpa.commands.TPCancelCommand; 8 | import fr.openmc.core.features.tpa.commands.TPDenyCommand; 9 | 10 | public class TPAManager { 11 | 12 | public TPAManager() { 13 | CommandsManager.getHandler().register( 14 | new TPAcceptCommand(), 15 | new TPACommand(OMCPlugin.getInstance()), 16 | new TPDenyCommand(), 17 | new TPCancelCommand() 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/tpa/commands/TPCancelCommand.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.tpa.commands; 2 | 3 | import fr.openmc.core.features.tpa.TPAQueue; 4 | import fr.openmc.core.utils.messages.MessageType; 5 | import fr.openmc.core.utils.messages.MessagesManager; 6 | import fr.openmc.core.utils.messages.Prefix; 7 | import net.kyori.adventure.text.Component; 8 | import org.bukkit.entity.Player; 9 | import revxrsal.commands.annotation.Command; 10 | import revxrsal.commands.annotation.Named; 11 | import revxrsal.commands.annotation.Optional; 12 | import revxrsal.commands.bukkit.annotation.CommandPermission; 13 | 14 | public class TPCancelCommand { 15 | 16 | /** 17 | * Command to cancel a teleport request. 18 | * @param player The player who wants to cancel the request. 19 | */ 20 | @Command("tpcancel") 21 | @CommandPermission("omc.commands.tpa") 22 | public void tpCancel(Player player) { 23 | if (!TPAQueue.QUEUE.requesterHasPendingRequest(player)) { 24 | MessagesManager.sendMessage(player, Component.text("§4Vous n'avez aucune demande de téléportation en cours"), Prefix.OPENMC, MessageType.ERROR, false); 25 | return; 26 | } 27 | 28 | Player target = TPAQueue.QUEUE.getTargetByRequester(player); 29 | 30 | TPAQueue.QUEUE.removeRequest(player, target); 31 | MessagesManager.sendMessage(player, Component.text("§2Vous avez annulé votre demande de téléportation à §6" + target.getName()), Prefix.OPENMC, MessageType.SUCCESS, true); 32 | MessagesManager.sendMessage(target, Component.text("§3" + player.getName() + " §4a annulé sa demande de téléportation"), Prefix.OPENMC, MessageType.INFO, true); 33 | 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/updates/UpdateCommand.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.updates; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | import revxrsal.commands.annotation.Command; 6 | import revxrsal.commands.annotation.Description; 7 | import revxrsal.commands.bukkit.annotation.CommandPermission; 8 | 9 | public class UpdateCommand { 10 | 11 | @Command("omc version") 12 | @CommandPermission("omc.commands.version") 13 | @Description("Vous donne de l'information sur le version du plugin") 14 | private void version(Player player) { 15 | UpdateManager.getInstance().sendUpdateMessage(player); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/updates/UpdateListener.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.updates; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.Listener; 6 | import org.bukkit.event.player.PlayerJoinEvent; 7 | 8 | public class UpdateListener implements Listener { 9 | 10 | @EventHandler 11 | public void onPlayerJoin(PlayerJoinEvent event) { 12 | final Player player = event.getPlayer(); 13 | 14 | UpdateManager.getInstance().sendUpdateMessage(player); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/features/updates/UpdateManager.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.features.updates; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.scheduler.BukkitRunnable; 6 | 7 | import fr.openmc.core.OMCPlugin; 8 | import fr.openmc.core.utils.messages.MessageType; 9 | import fr.openmc.core.utils.messages.MessagesManager; 10 | import fr.openmc.core.utils.messages.Prefix; 11 | import lombok.Getter; 12 | import net.kyori.adventure.text.Component; 13 | import net.kyori.adventure.text.event.ClickEvent; 14 | 15 | public class UpdateManager { 16 | @Getter 17 | static UpdateManager instance; 18 | @Getter 19 | Component message; 20 | 21 | public UpdateManager() { 22 | instance = this; 23 | 24 | String version = OMCPlugin.getInstance().getDescription().getVersion(); 25 | String milestoneUrl = "https://github.com/ServerOpenMC/PluginV2/releases/"; 26 | 27 | message = Component.text("§8§m §r\n\n§7 Vous jouez actuellement sur la version") 28 | .append(Component.text("§d§l " + version).clickEvent(ClickEvent.openUrl(milestoneUrl))) 29 | .append(Component.text("§7 du plugin §d§lOpenMC.\n")) 30 | .append(Component.text("§f§l Cliquez ici pour voir les changements.").clickEvent(ClickEvent.openUrl(milestoneUrl))) 31 | .append(Component.text("\n\n§8§m §r")); 32 | 33 | long period = 14400 * 20; // 4h 34 | 35 | new BukkitRunnable() { 36 | @Override 37 | public void run() { 38 | sendUpdateBroadcast(); 39 | }; 40 | }.runTaskTimer(OMCPlugin.getInstance(), 0, period); 41 | } 42 | 43 | public void sendUpdateMessage(Player player) { 44 | player.sendMessage(message); 45 | } 46 | 47 | public void sendUpdateBroadcast() { 48 | Bukkit.broadcast(message); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/listeners/ChronometerListener.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.listeners; 2 | 3 | import fr.openmc.api.chronometer.Chronometer; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.Listener; 6 | import org.bukkit.event.player.PlayerQuitEvent; 7 | 8 | public class ChronometerListener implements Listener { 9 | @EventHandler 10 | public void onDisconnection(PlayerQuitEvent e){ 11 | Chronometer.stopAllChronometer(e.getPlayer(), null, "%null%"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/listeners/ClockInfos.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.listeners; 2 | 3 | import net.kyori.adventure.text.Component; 4 | import org.bukkit.Material; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.event.EventHandler; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.event.player.PlayerInteractEvent; 9 | import org.bukkit.inventory.PlayerInventory; 10 | 11 | /* 12 | * Repris de src/main/java/fr/communaywen/core/clockinfos/tasks/CompassClockTask.java 13 | * Travail original par Fnafgameur 14 | */ 15 | public class ClockInfos implements Listener { 16 | @EventHandler 17 | public void onPlayerInteract(PlayerInteractEvent event) { 18 | Player player = event.getPlayer(); 19 | PlayerInventory inv = player.getInventory(); 20 | 21 | if (inv.getItemInMainHand().getType() != Material.CLOCK) return; 22 | 23 | long daysPassed = player.getWorld().getFullTime() / 24000; 24 | long currentTime = player.getWorld().getTime(); 25 | long time = currentTime + (daysPassed * 24000); 26 | long hours = (time / 1000 + 6) % 24; 27 | long minutes = (time % 1000) * 60 / 1000; 28 | 29 | String minutesAsText = String.format("%02d", minutes); 30 | String hoursAsText = String.format("%02d", hours); 31 | 32 | // J12 03h49 33 | player.sendActionBar(Component.text("J"+daysPassed+" "+hoursAsText+"h"+minutesAsText)); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/listeners/PlayerDeathListener.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.listeners; 2 | 3 | import fr.openmc.core.features.economy.EconomyManager; 4 | import fr.openmc.core.utils.messages.MessageType; 5 | import fr.openmc.core.utils.messages.MessagesManager; 6 | import fr.openmc.core.utils.messages.Prefix; 7 | import net.kyori.adventure.text.Component; 8 | import net.kyori.adventure.text.format.NamedTextColor; 9 | import org.bukkit.entity.Player; 10 | import org.bukkit.event.EventHandler; 11 | import org.bukkit.event.Listener; 12 | import org.bukkit.event.entity.PlayerDeathEvent; 13 | 14 | import static fr.openmc.core.features.economy.EconomyManager.*; 15 | 16 | public class PlayerDeathListener implements Listener { 17 | private final double LOSS_MONEY = 0.35; 18 | 19 | @EventHandler(ignoreCancelled = true) 20 | public void onPlayerDead(PlayerDeathEvent event) { 21 | Player player = event.getPlayer(); 22 | double balance = getBalance(player.getUniqueId()); 23 | 24 | if (balance>0) { 25 | withdrawBalance(player.getUniqueId(), balance * LOSS_MONEY); 26 | MessagesManager.sendMessage(player, Component.text("Vous venez de mourrir avec §6" + getFormattedSimplifiedNumber(balance) + EconomyManager.getEconomyIcon() + "§f, vous avez perdu §6" + getFormattedSimplifiedNumber(balance * LOSS_MONEY) + EconomyManager.getEconomyIcon() + "\n§8*pensez à mettre votre argent dans la banque*"), Prefix.OPENMC, MessageType.INFO, false); 27 | } 28 | 29 | if (event.deathMessage() == null) return; 30 | MessagesManager.broadcastMessage(event.deathMessage().color(NamedTextColor.DARK_RED), Prefix.DEATH, MessageType.INFO); 31 | event.deathMessage(null); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/listeners/RespawnListener.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.listeners; 2 | 3 | import fr.openmc.core.commands.utils.SpawnManager; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.Listener; 7 | import org.bukkit.event.player.PlayerRespawnEvent; 8 | 9 | public class RespawnListener implements Listener { 10 | 11 | @EventHandler 12 | public void onRespawn(PlayerRespawnEvent event) { 13 | final Player player = event.getPlayer(); 14 | if (player.getRespawnLocation() != null) return; 15 | event.setRespawnLocation(SpawnManager.getInstance().getSpawnLocation()); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/listeners/SessionsListener.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.listeners; 2 | 3 | import fr.openmc.core.features.analytics.Stats; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.Listener; 6 | import org.bukkit.event.player.PlayerJoinEvent; 7 | 8 | public class SessionsListener implements Listener { 9 | @EventHandler 10 | void onPlayerJoin(PlayerJoinEvent event) { 11 | Stats.SESSION.increment(event.getPlayer().getUniqueId()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/CacheOfflinePlayer.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.OfflinePlayer; 5 | 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | import java.util.UUID; 9 | 10 | public class CacheOfflinePlayer { 11 | private static final Map offlinePlayerCache = new HashMap<>(); 12 | 13 | /** 14 | * Donne l'OfflinePlayer s'il est déjà mis en cache, sinon il exécute la méthode basique 15 | */ 16 | public static OfflinePlayer getOfflinePlayer(UUID uuid) { 17 | return offlinePlayerCache.computeIfAbsent(uuid, Bukkit::getOfflinePlayer); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/ChunkInfo.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils; 2 | 3 | import fr.openmc.core.features.city.City; 4 | 5 | public record ChunkInfo(City city, boolean isProtected) { } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/ChunkPos.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils; 2 | 3 | public class ChunkPos { 4 | final int x, z; 5 | public ChunkPos(int x, int z) { this.x = x; this.z = z; } 6 | 7 | @Override 8 | public boolean equals(Object o) { 9 | if (this == o) return true; 10 | if (o == null || getClass() != o.getClass()) return false; 11 | ChunkPos chunkPos = (ChunkPos) o; 12 | return x == chunkPos.x && z == chunkPos.z; 13 | } 14 | 15 | @Override 16 | public int hashCode() { 17 | return 31 * x + z; 18 | } 19 | 20 | @Override 21 | public String toString() { 22 | return x + "," + z; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/DiscordWebhook.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils; 2 | 3 | import javax.net.ssl.HttpsURLConnection; 4 | import java.io.OutputStream; 5 | import java.net.URI; 6 | import java.net.URL; 7 | import java.nio.charset.StandardCharsets; 8 | 9 | public class DiscordWebhook { 10 | 11 | /** 12 | * Envoie un message vers un webhook Discord via POST JSON. 13 | * 14 | * @param webhookUrl URL complète du webhook (https://discord.com/api/webhooks/ID/TOKEN). 15 | * @param message Contenu du message à envoyer. 16 | * @throws Exception en cas d’erreur de connexion ou d’I/O. 17 | */ 18 | public static void sendMessage(String webhookUrl, String message) throws Exception { 19 | URL url = new URI(webhookUrl).toURL(); 20 | HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 21 | conn.setRequestMethod("POST"); 22 | conn.setRequestProperty("Content-Type", "application/json"); 23 | conn.setDoOutput(true); 24 | 25 | String jsonPayload = String.format("{\"content\":\"%s\"}", message); 26 | try (OutputStream os = conn.getOutputStream()) { 27 | os.write(jsonPayload.getBytes(StandardCharsets.UTF_8)); 28 | } 29 | 30 | int status = conn.getResponseCode(); 31 | if (status != 204) { 32 | throw new RuntimeException("Échec du webhook, code HTTP : " + status); 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/MotdUtils.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.configuration.file.YamlConfiguration; 5 | import org.bukkit.plugin.java.JavaPlugin; 6 | import org.bukkit.scheduler.BukkitRunnable; 7 | import net.kyori.adventure.text.Component; 8 | 9 | import java.io.File; 10 | import java.util.List; 11 | import java.util.Map; 12 | import java.util.Random; 13 | 14 | public class MotdUtils { 15 | private final YamlConfiguration motdConfig; 16 | private static Component motd; 17 | 18 | public MotdUtils(JavaPlugin plugin) { 19 | File motdFile = new File(plugin.getDataFolder() + "/data", "motd.yml"); 20 | 21 | if(!motdFile.exists()) { 22 | motdFile.getParentFile().mkdirs(); 23 | plugin.saveResource("data/motd.yml", false); 24 | } 25 | 26 | motdConfig = YamlConfiguration.loadConfiguration(motdFile); 27 | 28 | new BukkitRunnable() { 29 | @Override 30 | public void run() { 31 | List> motds = motdConfig.getMapList("motds"); 32 | 33 | int randomIndex = new Random().nextInt(motds.size()); 34 | Map motdData = motds.get(randomIndex); 35 | 36 | String line1 = (String) (motdData).get("line1"); 37 | String line2 = (String) (motdData).get("line2"); 38 | 39 | 40 | motd=Component.text(line1 + "\n" + line2); 41 | Bukkit.getServer().motd(motd); 42 | } 43 | }.runTaskTimer(plugin, 0L, 12000L); // 12000 ticks = 10 minutes 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/PlayerNameCache.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils; 2 | 3 | import org.bukkit.OfflinePlayer; 4 | 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | import java.util.UUID; 8 | 9 | public class PlayerNameCache { 10 | private static final Map nameCache = new HashMap<>(); 11 | 12 | public static String getName(UUID uuid) { 13 | return nameCache.computeIfAbsent(uuid, id -> { 14 | OfflinePlayer player = CacheOfflinePlayer.getOfflinePlayer(id); 15 | return player.getName() != null ? player.getName() : "Inconnu"; 16 | }); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/PlayerUtils.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils; 2 | 3 | import com.destroystokyo.paper.profile.PlayerProfile; 4 | import org.bukkit.Bukkit; 5 | import org.bukkit.Material; 6 | import org.bukkit.entity.Player; 7 | import org.bukkit.inventory.ItemStack; 8 | import org.bukkit.inventory.meta.SkullMeta; 9 | import org.jetbrains.annotations.Nullable; 10 | 11 | import java.util.UUID; 12 | 13 | public class PlayerUtils { 14 | 15 | /** 16 | * @param player Player to be tested 17 | * @return If the player is safe 18 | */ 19 | private boolean isInSafePosition(Player player) { 20 | if (player.isFlying()) return false; 21 | if (player.isInsideVehicle()) return false; 22 | if (player.isGliding()) return false; 23 | if (player.isSleeping()) return false; 24 | if (player.isUnderWater()) return false; 25 | if (player.isFlying()) return false; 26 | if (player.isVisualFire()) return false; 27 | // TODO: Check si le block en pile, sur la tête et en dessous (trapdoor) est plein 28 | 29 | return true; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/Queue.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils; 2 | 3 | import lombok.Getter; 4 | 5 | import java.util.LinkedHashMap; 6 | import java.util.Map; 7 | 8 | @Getter 9 | public class Queue { 10 | 11 | private final LinkedHashMap queue; 12 | 13 | public Queue(int size) { 14 | this.queue = new LinkedHashMap() { 15 | @Override 16 | protected boolean removeEldestEntry(final Map.Entry eldest) { 17 | return size() > size; 18 | } 19 | }; 20 | } 21 | 22 | public void add(K key, V value) { 23 | queue.put(key, value); 24 | } 25 | 26 | public void remove(K key) { 27 | queue.remove(key); 28 | } 29 | 30 | public V get(K key) { 31 | return queue.get(key); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/api/FancyNpcApi.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.api; 2 | 3 | import org.bukkit.Bukkit; 4 | 5 | public class FancyNpcApi { 6 | private static boolean hasFancyNpc = false; 7 | 8 | public FancyNpcApi() { 9 | hasFancyNpc = Bukkit.getPluginManager().isPluginEnabled("FancyNpcs"); 10 | } 11 | 12 | /** 13 | * Retourne si l'instance a FancyNpc 14 | */ 15 | public static boolean hasFancyNpc() { 16 | return hasFancyNpc; 17 | } 18 | 19 | /** 20 | * Set if the instance has FancyNpc 21 | * 22 | * @param hasFancyNpc true if the instance has FancyNpc, false otherwise 23 | */ 24 | public static void setHasFancyNpc(boolean hasFancyNpc) { 25 | FancyNpcApi.hasFancyNpc = hasFancyNpc; 26 | } 27 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/api/ItemAdderApi.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.api; 2 | 3 | import org.bukkit.Bukkit; 4 | 5 | public class ItemAdderApi { 6 | private static boolean hasItemAdder; 7 | 8 | public ItemAdderApi() { 9 | hasItemAdder = Bukkit.getPluginManager().isPluginEnabled("ItemsAdder");; 10 | } 11 | 12 | /** 13 | * Retourne si l'instance a ItemAdder 14 | */ 15 | public static boolean hasItemAdder() { 16 | return hasItemAdder; 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/api/PapiApi.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.api; 2 | 3 | import org.bukkit.Bukkit; 4 | 5 | public class PapiApi { 6 | private static boolean hasPAPI; 7 | 8 | public PapiApi() { 9 | hasPAPI = Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null; 10 | } 11 | 12 | /** 13 | * Retourne si l'instance a PlaceholderAPI 14 | */ 15 | public static boolean hasPAPI() { 16 | return hasPAPI; 17 | } 18 | 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customfonts/CustomFonts.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customfonts; 2 | 3 | import org.bukkit.Bukkit; 4 | 5 | public abstract class CustomFonts { 6 | 7 | private static final boolean hasItemsAdder = Bukkit.getPluginManager().isPluginEnabled("ItemsAdder"); 8 | 9 | /** 10 | * use exemple : CustomFonts.getBest("omc_homes:bin", "🗑️") 11 | * 12 | * @param namespaceID the namespaceID of the font 13 | * @param baseFont the base font 14 | * @return Best Font to use for the server 15 | */ 16 | public static String getBest(String namespaceID, String baseFont) { 17 | String font = null; 18 | if (hasItemsAdder) font = Fonts.getFont(namespaceID); 19 | 20 | if (font == null) { 21 | font = baseFont; 22 | } 23 | 24 | return font; 25 | } 26 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customfonts/Fonts.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customfonts; 2 | 3 | import dev.lone.itemsadder.api.FontImages.FontImageWrapper; 4 | 5 | public class Fonts { 6 | public static String getFont(String namespaceID){ 7 | return "§r" + new FontImageWrapper(namespaceID).getString(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/CustomItem.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems; 2 | 3 | import fr.openmc.core.utils.api.ItemAdderApi; 4 | import lombok.Getter; 5 | import org.bukkit.inventory.ItemStack; 6 | 7 | public abstract class CustomItem { 8 | public abstract ItemStack getVanilla(); 9 | public abstract ItemStack getItemsAdder(); 10 | @Getter private final String name; 11 | 12 | public CustomItem(String name) { 13 | this.name = name; 14 | CustomItemRegistry.register(name, this); 15 | } 16 | 17 | @Override 18 | public boolean equals(Object anotherObject) { 19 | if (anotherObject instanceof ItemStack anotherItem) { 20 | CustomItem citem = CustomItemRegistry.getByItemStack(anotherItem); 21 | 22 | if (citem == null) return false; 23 | return citem.getName().equals(this.getName()); 24 | } 25 | 26 | if (anotherObject instanceof String name) { 27 | return this.getName().equals(name); 28 | } 29 | 30 | if (anotherObject instanceof CustomItem citem) { 31 | return citem.getName().equals(this.getName()); 32 | } 33 | 34 | return false; 35 | } 36 | 37 | /** 38 | * Order: 39 | * 1. ItemsAdder 40 | * 2. Vanilla 41 | * @return Best ItemStack to use for the server 42 | */ 43 | public ItemStack getBest() { 44 | ItemStack item = null; 45 | if (ItemAdderApi.hasItemAdder()) item = getItemsAdder(); 46 | 47 | if (item == null) { 48 | item = getVanilla(); 49 | } 50 | 51 | return item; 52 | } 53 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/armors/SuitBoots.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.armors; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class SuitBoots extends CustomItem { 9 | public SuitBoots() { 10 | super("omc_items:suit_boots"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.IRON_BOOTS); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_items:suit_boots"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/armors/SuitChestplate.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.armors; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class SuitChestplate extends CustomItem { 9 | public SuitChestplate() { 10 | super("omc_items:suit_chestplate"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.IRON_CHESTPLATE); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_items:suit_chestplate"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/armors/SuitHelmet.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.armors; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class SuitHelmet extends CustomItem { 9 | public SuitHelmet() { 10 | super("omc_items:suit_helmet"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.IRON_HELMET); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_items:suit_helmet"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/armors/SuitLeggings.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.armors; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class SuitLeggings extends CustomItem { 9 | public SuitLeggings() { 10 | super("omc_items:suit_leggings"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.IRON_LEGGINGS); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_items:suit_leggings"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/buttons/AcceptButton.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.buttons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import net.kyori.adventure.text.Component; 6 | import net.kyori.adventure.text.format.TextDecoration; 7 | import org.bukkit.Material; 8 | import org.bukkit.inventory.ItemStack; 9 | import org.bukkit.inventory.meta.ItemMeta; 10 | 11 | public class AcceptButton extends CustomItem { 12 | public AcceptButton() { 13 | super("omc_menus:accept_btn"); 14 | } 15 | 16 | private ItemStack format(ItemStack initial) { 17 | ItemMeta meta = initial.getItemMeta(); 18 | meta.displayName(Component.text("Accepter").decoration(TextDecoration.ITALIC, false)); 19 | initial.setItemMeta(meta); 20 | return initial; 21 | } 22 | 23 | @Override 24 | public ItemStack getVanilla() { 25 | ItemStack item = new ItemStack(Material.GREEN_CONCRETE); 26 | return format(item); 27 | } 28 | 29 | @Override 30 | public ItemStack getItemsAdder() { 31 | CustomStack stack = CustomStack.getInstance("omc_menus:accept_btn"); 32 | if (stack != null) { 33 | return format(stack.getItemStack()); 34 | } else { 35 | return null; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/buttons/CloseButton.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.buttons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import net.kyori.adventure.text.Component; 6 | import net.kyori.adventure.text.format.TextDecoration; 7 | import org.bukkit.Material; 8 | import org.bukkit.inventory.ItemStack; 9 | import org.bukkit.inventory.meta.ItemMeta; 10 | 11 | public class CloseButton extends CustomItem { 12 | public CloseButton() { 13 | super("menu:close_button"); 14 | } 15 | 16 | private ItemStack format(ItemStack initial) { 17 | ItemMeta meta = initial.getItemMeta(); 18 | meta.displayName(Component.text("Fermer").decoration(TextDecoration.ITALIC, false)); 19 | initial.setItemMeta(meta); 20 | return initial; 21 | } 22 | 23 | @Override 24 | public ItemStack getVanilla() { 25 | ItemStack item = new ItemStack(Material.DARK_OAK_DOOR); 26 | return format(item); 27 | } 28 | 29 | @Override 30 | public ItemStack getItemsAdder() { 31 | CustomStack stack = CustomStack.getInstance("_iainternal:icon_cancel"); 32 | if (stack != null) { 33 | return format(stack.getItemStack()); 34 | } else { 35 | return null; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/buttons/MinusButton.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.buttons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class MinusButton extends CustomItem { 9 | 10 | public MinusButton() { 11 | super("omc_menus:minus_btn"); 12 | } 13 | 14 | @Override 15 | public ItemStack getVanilla() { 16 | return new ItemStack(Material.PAPER); 17 | } 18 | 19 | @Override 20 | public ItemStack getItemsAdder() { 21 | CustomStack stack = CustomStack.getInstance(this.getName()); 22 | if (stack != null) { 23 | return stack.getItemStack(); 24 | } else { 25 | return null; 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/buttons/NextPage.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.buttons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import net.kyori.adventure.text.Component; 6 | import net.kyori.adventure.text.format.TextDecoration; 7 | import org.bukkit.Material; 8 | import org.bukkit.inventory.ItemStack; 9 | import org.bukkit.inventory.meta.ItemMeta; 10 | 11 | public class NextPage extends CustomItem { 12 | public NextPage() { 13 | super("menu:next_page"); 14 | } 15 | 16 | private ItemStack format(ItemStack initial) { 17 | ItemMeta meta = initial.getItemMeta(); 18 | meta.displayName(Component.text("Prochaine page").decoration(TextDecoration.ITALIC, false)); 19 | initial.setItemMeta(meta); 20 | return initial; 21 | } 22 | 23 | @Override 24 | public ItemStack getVanilla() { 25 | ItemStack item = new ItemStack(Material.ARROW); 26 | return format(item); 27 | } 28 | 29 | @Override 30 | public ItemStack getItemsAdder() { 31 | CustomStack stack = CustomStack.getInstance("_iainternal:icon_next_orange"); 32 | if (stack != null) { 33 | return format(stack.getItemStack()); 34 | } else { 35 | return null; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/buttons/OneButton.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.buttons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class OneButton extends CustomItem { 9 | 10 | public OneButton() { 11 | super("omc_menus:1_btn"); 12 | } 13 | 14 | @Override 15 | public ItemStack getVanilla() { 16 | return new ItemStack(Material.PAPER); 17 | } 18 | 19 | @Override 20 | public ItemStack getItemsAdder() { 21 | CustomStack stack = CustomStack.getInstance(this.getName()); 22 | if (stack != null) { 23 | return stack.getItemStack(); 24 | } else { 25 | return null; 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/buttons/PlusButton.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.buttons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class PlusButton extends CustomItem { 9 | 10 | public PlusButton() { 11 | super("omc_menus:plus_btn"); 12 | } 13 | 14 | @Override 15 | public ItemStack getVanilla() { 16 | return new ItemStack(Material.PAPER); 17 | } 18 | 19 | @Override 20 | public ItemStack getItemsAdder() { 21 | CustomStack stack = CustomStack.getInstance(this.getName()); 22 | if (stack != null) { 23 | return stack.getItemStack(); 24 | } else { 25 | return null; 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/buttons/PreviousPage.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.buttons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import net.kyori.adventure.text.Component; 6 | import net.kyori.adventure.text.format.TextDecoration; 7 | import org.bukkit.Material; 8 | import org.bukkit.inventory.ItemStack; 9 | import org.bukkit.inventory.meta.ItemMeta; 10 | 11 | public class PreviousPage extends CustomItem { 12 | public PreviousPage() { 13 | super("menu:previous_page"); 14 | } 15 | 16 | private ItemStack format(ItemStack initial) { 17 | ItemMeta meta = initial.getItemMeta(); 18 | meta.displayName(Component.text("Page précedente").decoration(TextDecoration.ITALIC, false)); 19 | initial.setItemMeta(meta); 20 | return initial; 21 | } 22 | 23 | @Override 24 | public ItemStack getVanilla() { 25 | ItemStack item = new ItemStack(Material.ARROW); 26 | return format(item); 27 | } 28 | 29 | @Override 30 | public ItemStack getItemsAdder() { 31 | CustomStack stack = CustomStack.getInstance("_iainternal:icon_back_orange"); 32 | if (stack != null) { 33 | return format(stack.getItemStack()); 34 | } else { 35 | return null; 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/buttons/RefuseButton.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.buttons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import net.kyori.adventure.text.Component; 6 | import net.kyori.adventure.text.format.TextDecoration; 7 | import org.bukkit.Material; 8 | import org.bukkit.inventory.ItemStack; 9 | import org.bukkit.inventory.meta.ItemMeta; 10 | 11 | public class RefuseButton extends CustomItem { 12 | public RefuseButton() { 13 | super("omc_menus:refuse_btn"); 14 | } 15 | 16 | private ItemStack format(ItemStack initial) { 17 | ItemMeta meta = initial.getItemMeta(); 18 | meta.displayName(Component.text("Refuser").decoration(TextDecoration.ITALIC, false)); 19 | initial.setItemMeta(meta); 20 | return initial; 21 | } 22 | 23 | @Override 24 | public ItemStack getVanilla() { 25 | ItemStack item = new ItemStack(Material.RED_CONCRETE); 26 | return format(item); 27 | } 28 | 29 | @Override 30 | public ItemStack getItemsAdder() { 31 | CustomStack stack = CustomStack.getInstance("omc_menus:refuse_btn"); 32 | if (stack != null) { 33 | return format(stack.getItemStack()); 34 | } else { 35 | return null; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/buttons/SearchButton.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.buttons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import net.kyori.adventure.text.Component; 6 | import net.kyori.adventure.text.format.TextDecoration; 7 | import org.bukkit.Material; 8 | import org.bukkit.inventory.ItemStack; 9 | import org.bukkit.inventory.meta.ItemMeta; 10 | 11 | public class SearchButton extends CustomItem { 12 | public SearchButton() { 13 | super("menu:search_btn"); 14 | } 15 | 16 | private ItemStack format(ItemStack initial) { 17 | ItemMeta meta = initial.getItemMeta(); 18 | meta.displayName(Component.text("Chercher").decoration(TextDecoration.ITALIC, false)); 19 | initial.setItemMeta(meta); 20 | return initial; 21 | } 22 | 23 | @Override 24 | public ItemStack getVanilla() { 25 | ItemStack item = new ItemStack(Material.SPYGLASS); 26 | return format(item); 27 | } 28 | 29 | @Override 30 | public ItemStack getItemsAdder() { 31 | CustomStack stack = CustomStack.getInstance("_iainternal:icon_search"); 32 | if (stack != null) { 33 | return format(stack.getItemStack()); 34 | } else { 35 | return null; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/buttons/StackButton.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.buttons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class StackButton extends CustomItem { 9 | 10 | public StackButton() { super("omc_menus:64_btn"); } 11 | 12 | @Override 13 | public ItemStack getVanilla() { 14 | return new ItemStack(Material.PAPER); 15 | } 16 | 17 | @Override 18 | public ItemStack getItemsAdder() { 19 | CustomStack stack = CustomStack.getInstance(this.getName()); 20 | if (stack != null) { 21 | return stack.getItemStack(); 22 | } else { 23 | return null; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/buttons/TenButton.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.buttons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class TenButton extends CustomItem { 9 | 10 | public TenButton() { super("omc_company:10_btn"); } 11 | 12 | @Override 13 | public ItemStack getVanilla() { 14 | return new ItemStack(Material.PAPER); 15 | } 16 | 17 | @Override 18 | public ItemStack getItemsAdder() { 19 | CustomStack stack = CustomStack.getInstance(this.getName()); 20 | if (stack != null) { 21 | return stack.getItemStack(); 22 | } else { 23 | return null; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/Aywenite.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class Aywenite extends CustomItem { 9 | public Aywenite() { 10 | super("omc_items:aywenite"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.AMETHYST_SHARD); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_items:aywenite"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/ContestShell.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class ContestShell extends CustomItem { 9 | public ContestShell() { 10 | super("omc_contest:contest_shell"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.NAUTILUS_SHELL); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_contest:contest_shell"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/KebabItem.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class KebabItem extends CustomItem { 9 | 10 | public KebabItem() { 11 | super("omc_foods:kebab"); 12 | } 13 | 14 | @Override 15 | public ItemStack getVanilla() { 16 | return new ItemStack(Material.COOKED_BEEF); 17 | } 18 | 19 | 20 | @Override 21 | public ItemStack getItemsAdder() { 22 | CustomStack stack = CustomStack.getInstance(this.getName()); 23 | if (stack != null) return stack.getItemStack(); 24 | else return null; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/MascotWand.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class MascotWand extends CustomItem { 9 | public MascotWand() { 10 | super("omc_items:mascot_stick"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.STICK); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_items:mascot_stick"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/WarpWand.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class WarpWand extends CustomItem { 9 | public WarpWand() { 10 | super("omc_items:warp_stick"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.STICK); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_items:warp_stick"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/company/CompanyBox.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items.company; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class CompanyBox extends CustomItem { 9 | public CompanyBox() { 10 | super("omc_company:company_box"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.CHEST); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_company:company_box"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/homes/Bin.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items.homes; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class Bin extends CustomItem { 9 | public Bin() { 10 | super("omc_homes:omc_homes_icon_bin"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.CHEST); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_homes:omc_homes_icon_bin"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/homes/BinRed.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items.homes; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class BinRed extends CustomItem { 9 | public BinRed() { 10 | super("omc_homes:omc_homes_icon_bin_red"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.CHEST); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_homes:omc_homes_icon_bin_red"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/homes/Information.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items.homes; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class Information extends CustomItem { 9 | public Information() { 10 | super("omc_homes:omc_homes_icon_information"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.CHEST); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_homes:omc_homes_icon_information"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | }} 27 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/homes/Invisible.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items.homes; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class Invisible extends CustomItem { 9 | public Invisible() { 10 | super("omc_homes:omc_homes_invisible"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.CHEST); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_homes:omc_homes_invisible"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/homes/Upgrade.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items.homes; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class Upgrade extends CustomItem { 9 | public Upgrade() { 10 | super("omc_homes:omc_homes_icon_upgrade"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.CHEST); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_homes:omc_homes_icon_upgrade"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/homes/icons/Axenq.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items.homes.icons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class Axenq extends CustomItem { 9 | public Axenq() { 10 | super("omc_homes:omc_homes_icon_axenq"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.CHEST); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_homes:omc_homes_icon_axenq"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/homes/icons/Bank.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items.homes.icons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class Bank extends CustomItem { 9 | public Bank() { 10 | super("omc_homes:omc_homes_icon_bank"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.CHEST); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_homes:omc_homes_icon_bank"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/homes/icons/Chateau.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items.homes.icons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class Chateau extends CustomItem { 9 | public Chateau() { 10 | super("omc_homes:omc_homes_icon_chateau"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.CHEST); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_homes:omc_homes_icon_chateau"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/homes/icons/Chest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items.homes.icons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class Chest extends CustomItem { 9 | public Chest() { 10 | super("omc_homes:omc_homes_icon_chest"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.CHEST); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_homes:omc_homes_icon_chest"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/homes/icons/Default.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items.homes.icons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class Default extends CustomItem { 9 | public Default() { 10 | super("omc_homes:omc_homes_icon_grass"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.CHEST); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_homes:omc_homes_icon_grass"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/homes/icons/Farm.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items.homes.icons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class Farm extends CustomItem { 9 | public Farm() { 10 | super("omc_homes:omc_homes_icon_zombie"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.CHEST); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_homes:omc_homes_icon_zombie"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/homes/icons/Home.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items.homes.icons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class Home extends CustomItem { 9 | public Home() { 10 | super("omc_homes:omc_homes_icon_maison"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.CHEST); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_homes:omc_homes_icon_maison"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/homes/icons/Sandblock.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items.homes.icons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class Sandblock extends CustomItem { 9 | public Sandblock() { 10 | super("omc_homes:omc_homes_icon_sandblock"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.CHEST); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_homes:omc_homes_icon_sandblock"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/homes/icons/Shop.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items.homes.icons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class Shop extends CustomItem { 9 | public Shop() { 10 | super("omc_homes:omc_homes_icon_shop"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.CHEST); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_homes:omc_homes_icon_shop"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/customitems/items/homes/icons/Xernas.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.customitems.items.homes.icons; 2 | 3 | import dev.lone.itemsadder.api.CustomStack; 4 | import fr.openmc.core.utils.customitems.CustomItem; 5 | import org.bukkit.Material; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | public class Xernas extends CustomItem { 9 | public Xernas() { 10 | super("omc_homes:omc_homes_icon_xernas"); 11 | } 12 | 13 | @Override 14 | public ItemStack getVanilla() { 15 | return new ItemStack(Material.CHEST); 16 | } 17 | 18 | @Override 19 | public ItemStack getItemsAdder() { 20 | CustomStack stack = CustomStack.getInstance("omc_homes:omc_homes_icon_xernas"); 21 | if (stack != null) { 22 | return stack.getItemStack(); 23 | } else { 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/messages/MessageType.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.messages; 2 | 3 | import lombok.Getter; 4 | import org.bukkit.Sound; 5 | 6 | @Getter 7 | public enum MessageType { 8 | ERROR("§c❗", Sound.BLOCK_NOTE_BLOCK_BASS), 9 | WARNING("§6⚠", Sound.BLOCK_NOTE_BLOCK_HARP), 10 | SUCCESS("§a✔", Sound.BLOCK_NOTE_BLOCK_PLING), 11 | INFO("§bℹ", Sound.BLOCK_NOTE_BLOCK_BIT), 12 | NONE("", null) 13 | ; 14 | 15 | private final String prefix; 16 | private final Sound sound; 17 | 18 | MessageType(String prefix, Sound sound) { 19 | this.prefix = prefix; 20 | this.sound = sound; 21 | } 22 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/messages/Prefix.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.messages; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * Enum representing various prefixes for messages. 7 | * Each prefix is associated with a formatted string using custom colors and fonts. 8 | */ 9 | public enum Prefix { 10 | 11 | // Font: https://lingojam.com/MinecraftSmallFont 12 | // For gradient color: https://www.birdflop.com/resources/rgb/ 13 | // Color format: MiniMessage 14 | 15 | OPENMC("ᴏᴘᴇɴᴍᴄ"), 16 | STAFF("ѕᴛᴀꜰꜰ"), 17 | CITY("ᴄɪᴛʏ"), 18 | CONTEST("ᴄᴏɴᴛᴇѕᴛ"), 19 | QUESTS("ǫᴜᴇѕᴛѕ"), 20 | HOME("ʜᴏᴍᴇ"), 21 | FRIEND("ꜰʀɪᴇɴᴅ"), 22 | MAYOR("ᴍᴀʏᴏʀ"), 23 | QUEST("ǫᴜᴇѕᴛ"), 24 | BANK("ʙᴀɴᴋ"), 25 | ENTREPRISE("ᴇɴᴛʀᴇᴘʀɪѕᴇ"), // a changer si ça ne correspond pas 26 | SHOP("ѕʜᴏᴘ"), 27 | ADMINSHOP("ᴀᴅᴍɪɴꜱʜᴏᴘ"), 28 | ACCOUTDETECTION("ᴀᴄᴄᴏᴜɴᴛ ᴅᴇᴛᴇᴄᴛɪᴏɴ"), 29 | DEATH("☠") 30 | ; 31 | 32 | @Getter private final String prefix; 33 | Prefix(String prefix) { 34 | this.prefix = prefix; 35 | } 36 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/serializer/BukkitSerializer.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.serializer; 2 | 3 | import lombok.Cleanup; 4 | import org.bukkit.inventory.ItemStack; 5 | import org.bukkit.util.io.BukkitObjectInputStream; 6 | import org.bukkit.util.io.BukkitObjectOutputStream; 7 | 8 | import java.io.ByteArrayInputStream; 9 | import java.io.ByteArrayOutputStream; 10 | import java.io.IOException; 11 | 12 | public class BukkitSerializer { 13 | public static byte[] serializeItemStacks(ItemStack[] inv) throws IOException { 14 | @Cleanup ByteArrayOutputStream os = new ByteArrayOutputStream(); 15 | @Cleanup BukkitObjectOutputStream bos = new BukkitObjectOutputStream(os); 16 | bos.writeObject(inv); 17 | return os.toByteArray(); 18 | } 19 | 20 | public static ItemStack[] deserializeItemStacks(byte[] b) throws Exception { 21 | @Cleanup ByteArrayInputStream bais = new ByteArrayInputStream(b); 22 | @Cleanup BukkitObjectInputStream bois = new BukkitObjectInputStream(bais); 23 | return (ItemStack[]) bois.readObject(); 24 | } 25 | } -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/world/WorldUtils.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.world; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | public class WorldUtils { 6 | 7 | public static Yaw getYaw(Player p) { 8 | float yaw = p.getLocation().getYaw(); 9 | yaw = (yaw % 360 + 360) % 360; // true modulo, as javas modulo is weird for negative values 10 | if (yaw > 135 || yaw < -135) { 11 | return Yaw.NORTH; 12 | } else if (yaw < -45) { 13 | return Yaw.EAST; 14 | } else if (yaw > 45) { 15 | return Yaw.WEST; 16 | } else { 17 | return Yaw.SOUTH; 18 | } 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/fr/openmc/core/utils/world/Yaw.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils.world; 2 | 3 | import org.bukkit.block.BlockFace; 4 | 5 | public enum Yaw { 6 | 7 | NORTH, 8 | EAST, 9 | SOUTH, 10 | WEST; 11 | 12 | public Yaw getOpposite() { 13 | return switch (this) { 14 | case NORTH -> SOUTH; 15 | case EAST -> WEST; 16 | case SOUTH -> NORTH; 17 | case WEST -> EAST; 18 | }; 19 | } 20 | 21 | public BlockFace toBlockFace() { 22 | return switch (this) { 23 | case NORTH -> BlockFace.NORTH; 24 | case EAST -> BlockFace.EAST; 25 | case SOUTH -> BlockFace.SOUTH; 26 | case WEST -> BlockFace.WEST; 27 | }; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/resources/config.yml: -------------------------------------------------------------------------------- 1 | ##### 2 | # Database 3 | ##### 4 | database: 5 | url: "jdbc:mysql://host:port/openmc" 6 | username: "" 7 | password: "" 8 | 9 | features: 10 | analytics: true 11 | transactions: true 12 | 13 | chat: 14 | # {prefix}, {suffix}, {name}, {message} 15 | message: "&r{prefix} {name}&8: &f{message}" 16 | 17 | ##### 18 | # Paramètres pour un environnement de production 19 | ##### 20 | homepage: "https://openmc.fr/" 21 | discord: "https://aywen.fr/discord/" 22 | blog: "https://blog.openmc.fr/" 23 | wiki: "https://wiki.openmc.fr/" 24 | -------------------------------------------------------------------------------- /src/main/resources/data/accountdetection.yml: -------------------------------------------------------------------------------- 1 | anti-vpn: true 2 | anti-double-account: true 3 | discord-webhook: https://discord.com/api/webhooks/ID/TOKEN 4 | exempted-players: 5 | - dfa5846a-6f55-4407-9eb7-d06aafdbc804 # Moi 6 | - d2ca5e0f-2d36-4ba1-8d0f-0c277a1da6ef # Mon double compte ;) -------------------------------------------------------------------------------- /src/main/resources/data/bossbars.yml: -------------------------------------------------------------------------------- 1 | messages: 2 | - "Bienvenue sur OpenMC !" 3 | - "Astuce : Utilisez /leaderboard pour voir les classements !" 4 | - "Événement en cours : UPDATE V2 !" 5 | - "Astuce : Utilisez /omcbossbar ou /bb pour activer/désactiver la bossbar !" 6 | - "Rejoignez le discord pour contribuer au développement !" -------------------------------------------------------------------------------- /src/main/resources/data/leaderboards.yml: -------------------------------------------------------------------------------- 1 | contributors-location: 2 | ==: org.bukkit.Location 3 | world: world 4 | x: 0.0 5 | y: 0.0 6 | z: 0.0 7 | pitch: 0.0 8 | yaw: 0.0 9 | money-location: 10 | ==: org.bukkit.Location 11 | world: world 12 | x: 0.0 13 | y: 0.0 14 | z: 0.0 15 | pitch: 0.0 16 | yaw: 0.0 17 | ville-money-location: 18 | ==: org.bukkit.Location 19 | world: world 20 | x: 0.0 21 | y: 0.0 22 | z: 0.0 23 | pitch: 0.0 24 | yaw: 0.0 25 | playtime-location: 26 | ==: org.bukkit.Location 27 | world: world 28 | x: 0.0 29 | y: 0.0 30 | z: 0.0 31 | pitch: 0.0 32 | yaw: 0.0 33 | scale: 0.75 -------------------------------------------------------------------------------- /src/main/resources/data/mascots.yml: -------------------------------------------------------------------------------- 1 | #--------------------CONFIGURATION DES MASCOTS----------------------------- 2 | # La Liste des Mascots 3 | # sert de data container pour les free claims 4 | -------------------------------------------------------------------------------- /src/main/resources/data/motd.yml: -------------------------------------------------------------------------------- 1 | ##### 2 | # MOTD 3 | ##### 4 | motds: 5 | - motd1: 6 | line1: "§d§lOPENMC V2 §r§8- §7Le serveur Open Source §8- §d1.21.5" 7 | line2: " §6§lCONTEST UPDATE §3§lCITY UPDATE §d§lV2 UPDATE " 8 | - motd2: 9 | line1: "§d§lOPENMC V2 §r§8- §7Le serveur Open Source §8- §d1.21.5" 10 | line2: " §3§lV2 UPDATE " -------------------------------------------------------------------------------- /src/main/resources/data/rtp.yml: -------------------------------------------------------------------------------- 1 | max-radius: 10000 2 | min-radius: 2000 3 | # Par rapport au spawn 4 | max-tries: 3 5 | rtp-cooldown: 3600 # 1h -------------------------------------------------------------------------------- /src/main/resources/data/spawn.yml: -------------------------------------------------------------------------------- 1 | spawn: 2 | world: world # Nom du monde 3 | x: 0.0 # Coordonnées X 4 | y: 0.0 # Coordonnées Y 5 | z: 0.0 # Coordonnées Z 6 | yaw: 0.0 # Coordonnées Yaw 7 | pitch: 0.0 # Coordonnées Pitch -------------------------------------------------------------------------------- /src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | name: OpenMC 2 | version: ${version} 3 | main: fr.openmc.core.OMCPlugin 4 | api-version: '1.21.5' 5 | 6 | depend: 7 | - WorldEdit 8 | 9 | softdepend: 10 | - FancyNpcs 11 | - PlaceholderAPI 12 | - LuckPerms 13 | - ItemsAdder 14 | - WorldGuard 15 | - ProtocolLib 16 | 17 | prefix: OMC 18 | authors: [ La communauté ] 19 | description: Nouveau plugin d'OpenMC 20 | website: https://openmc.fr 21 | 22 | permissions: 23 | omc.commands.*: 24 | description: "Donne l'accès au commandes" 25 | default: true 26 | omc.admins.commands.*: 27 | description: "Donne l'accès aux commandes d'administration" 28 | default: op 29 | -------------------------------------------------------------------------------- /src/main/resources/translations/fr.yml: -------------------------------------------------------------------------------- 1 | messages: 2 | general: 3 | playtime: "Vous avez {playTime} §7de temps de jeu." 4 | -------------------------------------------------------------------------------- /src/test/java/fr/openmc/core/OMCPluginTest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core; 2 | 3 | import org.bukkit.plugin.java.JavaPlugin; 4 | import org.junit.jupiter.api.AfterEach; 5 | import org.junit.jupiter.api.Assertions; 6 | import org.junit.jupiter.api.BeforeEach; 7 | import org.junit.jupiter.api.DisplayName; 8 | import org.junit.jupiter.api.Test; 9 | import org.mockbukkit.mockbukkit.MockBukkit; 10 | import org.mockbukkit.mockbukkit.ServerMock; 11 | 12 | public class OMCPluginTest { 13 | 14 | public static JavaPlugin plugin; 15 | public static ServerMock server; 16 | 17 | @BeforeEach 18 | public void setUp() { 19 | server = MockBukkit.mock(); 20 | 21 | server.addSimpleWorld("world"); 22 | 23 | plugin = MockBukkit.load(OMCPlugin.class); 24 | } 25 | 26 | @AfterEach 27 | public void tearDown() { 28 | MockBukkit.unmock(); 29 | } 30 | 31 | @Test 32 | @DisplayName("Test if plugin is load") 33 | public void testPluginIsEnabled() { 34 | Assertions.assertTrue(plugin.isEnabled()); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/test/java/fr/openmc/core/utils/DateUtilsTest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils; 2 | 3 | import org.junit.jupiter.api.*; 4 | 5 | public class DateUtilsTest { 6 | 7 | @Test 8 | @DisplayName("Time to Ticks") 9 | public void testConvertTime() { 10 | Assertions.assertEquals( 11 | "20m", 12 | DateUtils.convertTime(24000) 13 | ); 14 | } 15 | 16 | } -------------------------------------------------------------------------------- /src/test/java/fr/openmc/core/utils/InputUtilsTest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils; 2 | 3 | import org.junit.jupiter.api.*; 4 | import org.junit.jupiter.params.ParameterizedTest; 5 | import org.junit.jupiter.params.provider.ValueSource; 6 | 7 | public class InputUtilsTest { 8 | 9 | @Test 10 | @DisplayName("Conversion Sign Input to Money") 11 | public void testConvertSignInputToMoney_ShouldGiveTheAmountInFloat() { 12 | Assertions.assertEquals( 13 | 3000000.0, 14 | InputUtils.convertToMoneyValue("3m") 15 | ); 16 | Assertions.assertEquals( 17 | 3000.0, 18 | InputUtils.convertToMoneyValue("3k") 19 | ); 20 | Assertions.assertEquals( 21 | 3000000.0, 22 | InputUtils.convertToMoneyValue("3M") 23 | ); 24 | Assertions.assertEquals( 25 | 3000.0, 26 | InputUtils.convertToMoneyValue("3K") 27 | ); 28 | Assertions.assertEquals( 29 | 1.0, 30 | InputUtils.convertToMoneyValue("1") 31 | ); 32 | Assertions.assertEquals( 33 | 3000.0, 34 | InputUtils.convertToMoneyValue("3000") 35 | ); 36 | } 37 | 38 | @ParameterizedTest 39 | @DisplayName("Conversion of input sign to -1") 40 | @ValueSource(strings = {"-3", "-1", "489y", "1.1", "4,5"}) 41 | public void testConvertSignInputToMoney_ShouldGiveAnError(String input) { 42 | Assertions.assertEquals(-1, InputUtils.convertToMoneyValue(input)); 43 | } 44 | 45 | @ParameterizedTest 46 | @DisplayName("Check is returned value is true") 47 | @ValueSource(strings = {"1", "3m", "3k", "3M", "3K", "3000"}) 48 | public void testIsInputMoney_MustReturnTrue(String input) { 49 | Assertions.assertTrue(InputUtils.isInputMoney(input)); 50 | } 51 | 52 | @ParameterizedTest 53 | @DisplayName("Check is returned value is false") 54 | @ValueSource(strings= {"0", "-3", "-1", "489y", "1.1", "4,5"}) 55 | public void testIsInputMoney_MustReturnFalse(String input) { 56 | Assertions.assertFalse(InputUtils.isInputMoney(input)); 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/test/java/fr/openmc/core/utils/ItemsUtilTest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils; 2 | 3 | import org.bukkit.Material; 4 | import org.bukkit.inventory.ItemStack; 5 | import org.junit.jupiter.api.*; 6 | 7 | public class ItemsUtilTest { 8 | 9 | @Test 10 | @DisplayName("getItemTranslation with ItemStack") 11 | public void testGetTranslationWithStack() { 12 | Assertions.assertEquals( 13 | "block.minecraft.chest", 14 | ItemUtils.getItemTranslation(new ItemStack(Material.CHEST)).key() 15 | ); 16 | } 17 | 18 | @Test 19 | @DisplayName("getItemTranslation with Material") 20 | public void testGetTranslationWithMaterial() { 21 | Assertions.assertEquals( 22 | "block.minecraft.dirt", 23 | ItemUtils.getItemTranslation(Material.DIRT).key() 24 | ); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/test/java/fr/openmc/core/utils/MotdUtilsTest.java: -------------------------------------------------------------------------------- 1 | package fr.openmc.core.utils; 2 | 3 | import net.kyori.adventure.text.Component; 4 | import net.kyori.adventure.text.TextComponent; 5 | 6 | import org.bukkit.plugin.java.JavaPlugin; 7 | import org.junit.jupiter.api.*; 8 | import org.mockbukkit.mockbukkit.MockBukkit; 9 | import org.mockbukkit.mockbukkit.ServerMock; 10 | 11 | public class MotdUtilsTest { 12 | 13 | private ServerMock server; 14 | private JavaPlugin plugin; 15 | 16 | @BeforeEach 17 | public void setUp() { 18 | server = MockBukkit.mock(); 19 | plugin = MockBukkit.createMockPlugin(); 20 | } 21 | 22 | @AfterEach 23 | public void tearDown() { 24 | MockBukkit.unmock(); 25 | } 26 | 27 | private String getComponentContent(Component component) { 28 | return ((TextComponent) component).content(); 29 | } 30 | 31 | @Test 32 | @DisplayName("MOTD switch") 33 | public void testMOTD() { 34 | String motd = getComponentContent(server.motd()); 35 | 36 | new MotdUtils(plugin); 37 | server.getScheduler().performTicks(12001L); 38 | 39 | Assertions.assertNotEquals(getComponentContent(server.motd()), motd); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/test/resources/config.yml: -------------------------------------------------------------------------------- 1 | ##### 2 | # Database 3 | ##### 4 | database: 5 | url: "jdbc:h2:~/test" 6 | username: "" 7 | password: "" 8 | 9 | features: 10 | analytics: true 11 | transactions: true 12 | 13 | ##### 14 | # Paramètres pour un environnement de production 15 | ##### 16 | homepage: "https://openmc.fr/" 17 | discord: "https://discord.gg/aywen/" 18 | blog: "https://blog.openmc.fr/" 19 | -------------------------------------------------------------------------------- /src/test/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | name: OpenMC 2 | version: ${version} 3 | main: fr.openmc.core.TestPlugin 4 | api-version: '1.21.5' 5 | prefix: OMC 6 | -------------------------------------------------------------------------------- /third_party_licenses/SignGUI_LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Rapha149 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. --------------------------------------------------------------------------------