├── .github └── workflows │ ├── compile.yml │ ├── deploy.yml │ └── maven.yml ├── .gitignore ├── .gitlab-ci.yml ├── LICENSE.md ├── README.md ├── ci_settings.xml ├── pom.xml ├── proxy-api ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── andrei1058 │ └── bedwars │ └── proxy │ └── api │ ├── ArenaStatus.java │ ├── BedWars.java │ ├── CachedArena.java │ ├── Language.java │ ├── Messages.java │ ├── RemoteReJoin.java │ └── event │ ├── ArenaCacheCreateEvent.java │ ├── ArenaCacheRemoveEvent.java │ ├── ArenaCacheUpdateEvent.java │ ├── PlayerArenaJoinEvent.java │ ├── PlayerLangChangeEvent.java │ └── PlayerReJoinEvent.java └── proxy-plugin ├── pom.xml └── src └── main ├── java └── com │ └── andrei1058 │ └── bedwars │ └── proxy │ ├── API.java │ ├── BedWarsProxy.java │ ├── arenamanager │ ├── ArenaGUI.java │ ├── ArenaManager.java │ ├── ArenaSelectorListener.java │ ├── LegacyArena.java │ └── TpRequest.java │ ├── arenasign │ ├── ArenaSign.java │ ├── DynamicArenaSign.java │ ├── SignListener.java │ ├── SignManager.java │ └── StaticArenaSign.java │ ├── command │ ├── ParentCommand.java │ ├── RejoinCommand.java │ ├── SubCommand.java │ ├── main │ │ ├── JoinCMD.java │ │ ├── LangCMD.java │ │ ├── MainCommand.java │ │ ├── ReJoinCMD.java │ │ ├── SelectorCMD.java │ │ └── TpCommand.java │ └── party │ │ ├── AcceptCMD.java │ │ ├── DisbandCMD.java │ │ ├── InviteCMD.java │ │ ├── LeaveCMD.java │ │ ├── PartyCommand.java │ │ └── RemoveCMD.java │ ├── configuration │ ├── BedWarsConfig.java │ ├── ConfigPath.java │ ├── PluginConfig.java │ ├── SignsConfig.java │ └── SoundsConfig.java │ ├── database │ ├── CacheListener.java │ ├── Database.java │ ├── MySQL.java │ ├── NoDatabase.java │ ├── SessionKeeper.java │ └── StatsCache.java │ ├── language │ ├── English.java │ ├── LangListeners.java │ ├── Language.java │ └── LanguageManager.java │ ├── levels │ ├── Level.java │ └── internal │ │ ├── InternalLevel.java │ │ ├── LevelListeners.java │ │ └── PlayerLevel.java │ ├── party │ ├── Internal.java │ ├── NoParty.java │ ├── PAF.java │ ├── PAFBungeeCordParty.java │ ├── Parties.java │ └── Party.java │ ├── rejoin │ └── RemoteReJoin.java │ ├── socketmanager │ ├── ArenaSocketTask.java │ ├── ServerSocketTask.java │ └── TimeOutTask.java │ └── support │ └── papi │ └── SupportPAPI.java └── resources └── plugin.yml /.github/workflows/compile.yml: -------------------------------------------------------------------------------- 1 | name: Deploy snapshot with Maven 2 | 3 | on: 4 | push: 5 | branches-ignore: 6 | - production 7 | pull_request: 8 | branches-ignore: 9 | - production 10 | 11 | jobs: 12 | build: 13 | runs-on: ubuntu-latest 14 | environment: 15 | name: development 16 | url: https://repo.andrei1058.dev 17 | steps: 18 | - uses: actions/checkout@v2 19 | - name: Set up JDK 17.0.2 20 | uses: actions/setup-java@v2 21 | with: 22 | java-version: '17.0.2' 23 | distribution: 'adopt' 24 | - name: Deploy snapshot with Maven 25 | env: 26 | MVN_REPO_USER: ${{ secrets.MVN_REPO_USER }} 27 | MVN_REPO_PASS: ${{ secrets.MVN_REPO_PASS }} 28 | ANDEV_RES_ID: 2 29 | run: | 30 | sudo apt install jq -y 31 | curl -X GET https://api.andrei1058.dev/v1/resources/$ANDEV_RES_ID/versioning/current -H "Accept: application/json" >> version.json 32 | export UPDATE_VERSION=`jq '.version' version.json | tr -d '"'` 33 | mvn versions:set -DnewVersion=$UPDATE_VERSION-SNAPSHOT 34 | mvn versions:update-child-modules 35 | mvn clean deploy -s ci_settings.xml 36 | echo "UPDATE_VERSION=$UPDATE_VERSION" >> $GITHUB_ENV -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy with Maven 2 | 3 | on: 4 | push: 5 | branches: [production] 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | environment: 11 | name: production 12 | url: https://repo.andrei1058.dev 13 | steps: 14 | - uses: actions/checkout@v2 15 | - name: Set up JDK 17.0.2 16 | uses: actions/setup-java@v2 17 | with: 18 | java-version: '17.0.2' 19 | distribution: 'adopt' 20 | - name: Deploy with Maven 21 | env: 22 | MVN_REPO_USER: ${{ secrets.MVN_REPO_USER }} 23 | MVN_REPO_PASS: ${{ secrets.MVN_REPO_PASS }} 24 | ANDEV_API_TOKEN: ${{ secrets.ANDEV_API_TOKEN }} 25 | J_DOCS_USER: ${{ secrets.J_DOCS_USER }} 26 | J_DOCS_PASS: ${{ secrets.J_DOCS_PASS }} 27 | POLY_API_KEY: ${{ secrets.POLY_API_KEY }} 28 | POLY_RESOURCE_ID: "2167" 29 | run: | 30 | sudo apt install jq -y 31 | curl -X GET https://api.andrei1058.dev/v1/resources/2/versioning/candidate -H "Accept: application/json" >> version.json 32 | export UPDATE_VERSION=`jq '.version' version.json | tr -d '"'` 33 | mvn versions:set -DnewVersion=$UPDATE_VERSION 34 | mvn versions:update-child-modules 35 | mvn clean deploy -s ci_settings.xml 36 | mvn javadoc:javadoc 37 | sudo apt install -y -qq lftp 38 | lftp -c "set ftp:ssl-allow no; open -u $J_DOCS_USER,$J_DOCS_PASS javadocs.andrei1058.dev; mirror -Rev proxy-api/target/site/apidocs ./BedWarsProxy --ignore-time --parallel=10 --exclude-glob .git* --exclude .git/" 39 | curl -F "file=@proxy-api/target/proxy-api-$UPDATE_VERSION.jar" -F api_key=$POLY_API_KEY -F resource_id=$POLY_RESOURCE_ID -F version="$UPDATE_VERSION" -F title="v$UPDATE_VERSION" -F message="For a detailed update log please visit https://github.com/andrei1058/BedWarsProxy/releases" "https://api.polymart.org/v1/postUpdate" 40 | curl -X PUT https://api.andrei1058.dev/v1/resources/2/versioning/commit -H "Accept: application/json" -H "Authorization: Bearer ${{ secrets.ANDEV_API_TOKEN }}" -H "Content-Type: application/json" --data '{"confirmation": true}' >> version.json 41 | echo "UPDATE_VERSION=$UPDATE_VERSION" >> $GITHUB_ENV 42 | - name: Create Tag 43 | uses: softprops/action-gh-release@v1 44 | with: 45 | generate_release_notes: true 46 | name: ${{env.UPDATE_VERSION}} 47 | tag_name: ${{env.UPDATE_VERSION}} -------------------------------------------------------------------------------- /.github/workflows/maven.yml: -------------------------------------------------------------------------------- 1 | name: Compile with Maven 2 | 3 | on: 4 | push: 5 | branches-ignore: 6 | - production 7 | - master 8 | pull_request: 9 | branches-ignore: 10 | - production 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | environment: 16 | name: development 17 | url: https://repo.andrei1058.dev 18 | steps: 19 | - uses: actions/checkout@v2 20 | - name: Set up JDK 17.0.2 21 | uses: actions/setup-java@v2 22 | with: 23 | java-version: '17.0.2' 24 | distribution: 'adopt' 25 | - name: Compile with Maven 26 | env: 27 | MVN_REPO_USER: ${{ secrets.MVN_REPO_USER }} 28 | MVN_REPO_PASS: ${{ secrets.MVN_REPO_PASS }} 29 | ANDEV_RES_ID: 2 30 | run: | 31 | sudo apt install jq -y 32 | curl -X GET https://api.andrei1058.dev/v1/resources/$ANDEV_RES_ID/versioning/current -H "Accept: application/json" >> version.json 33 | export UPDATE_VERSION=`jq '.version' version.json | tr -d '"'` 34 | mvn versions:set -DnewVersion=$UPDATE_VERSION-SNAPSHOT 35 | mvn versions:update-child-modules 36 | mvn clean install -s ci_settings.xml 37 | echo "UPDATE_VERSION=$UPDATE_VERSION" >> $GITHUB_ENV -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | target 3 | */target 4 | BedWarsProxy.iml 5 | proxy.iml 6 | /dependency-reduced-pom.xml 7 | /proxy (1).iml 8 | /proxy (2).iml 9 | /proxy-plugin/bwp-plugin.iml 10 | /proxy-api/bwp-api.iml 11 | /proxy-plugin/proxy-plugin.iml 12 | /*/dependency-reduced-pom.xml 13 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | variables: 2 | MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repos -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true" 3 | MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true" 4 | 5 | 6 | image: "maven:3.6.3-jdk-8" 7 | 8 | development-job: 9 | except: 10 | - 'tags' 11 | script: 12 | - 'mvn versions:set -DnewVersion=1.2.4-SNAPSHOT' 13 | - 'mvn versions:update-child-modules' 14 | - 'mvn -DgitVer=git-$CI_COMMIT_SHORT_SHA- -U clean install -s ci_settings.xml' 15 | artifacts: 16 | paths: 17 | - '*/target/*.jar' 18 | - 'proxy-api/target/apidocs' 19 | 20 | release-job: 21 | only: 22 | - 'tags' 23 | script: 24 | - 'mvn versions:set -DnewVersion=1.2.4' 25 | - 'mvn versions:update-child-modules' 26 | - 'mvn -DgitVer='''' -U clean deploy -s ci_settings.xml' 27 | after_script: 28 | - 'apt-get update && apt-get install -y -qq lftp' 29 | - 'lftp -c "set ftp:ssl-allow no; open -u $APIDOCS_USER,$APIDOCS_PASS andrei1058.com; mirror -Rev proxy-api/target/apidocs ./$CI_PROJECT_TITLE --ignore-time --parallel=10 --exclude-glob .git* --exclude .git/"' 30 | artifacts: 31 | paths: 32 | - '*/target/*.jar' 33 | - 'proxy-api/target/apidocs' 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | [![Documentation](https://i.imgur.com/7QDbrIS.png)](https://andrei1058.gitbook.io/bedwarsproxy/) [![Report a Bug](https://i.imgur.com/Z1qOYLC.png)](https://gitlab.com/andrei1058/bedwarsproxy/-/issues) [![API](https://i.imgur.com/JfMTMMc.png)](http://javadoc.andrei1058.dev/BedWarsProxy/) [![Discord](https://i.imgur.com/yBySzkU.png)](https://discord.gg/XdJfN2X) 3 | 4 | **BedWarsProxy** is a plugin for Bungeecord networks that are running BedWars1058 in BUNGEE mode. This plugin provides features for lobby servers: join gui/ signs, placeholders and more. 5 | 6 | ![Signs](https://i.imgur.com/ggNRp4D.png?1) 7 | 8 | **FEATURES** 9 | - dynamic game signs 10 | - static game signs 11 | - global arena selector 12 | - per group arena selector 13 | - arena rejoin system 14 | - admin /bw tp command to catch cheaters 15 | - per player language system in sync with arenas 16 | - PAPI placeholders 17 | - internal party system 18 | - API for developers 19 | 20 | **HOW TO USE** 21 | 22 | All the information you need can be found on its [documentation/ wiki](https://andrei1058.gitbook.io/bedwarsproxy/). 23 | 24 | **DOWNLOAD** 25 | - [Latest release](https://www.spigotmc.org/resources/66642) 26 | - [Development builds](https://ci.codemc.io/job/andrei1058/job/BedWarsProxy/) 27 | 28 | **MAVEN REPO** 29 | ```xml 30 | 31 | andrei1058-releases 32 | https://repo.andrei1058.dev/releases/ 33 | 34 | 35 | com.andrei1058.bedwars 36 | proxy-api 37 | VERSION HERE 38 | provided 39 | 40 | ``` 41 | 42 | [![Codacy Badge](https://app.codacy.com/project/badge/Grade/8043171c9b8044f4a77b788d80a55d2f)](https://www.codacy.com/manual/andrew.dascalu/bedwarsproxy?utm_source=gitlab.com&utm_medium=referral&utm_content=andrei1058/bedwarsproxy&utm_campaign=Badge_Grade) ![Servers](https://img.shields.io/bstats/servers/6036) ![Version](https://img.shields.io/spiget/version/66642) ![Chat](https://img.shields.io/discord/201345265821679617) ![Size](https://img.shields.io/spiget/download-size/66642) ![Downloads](https://img.shields.io/spiget/downloads/66642) ![Rating](https://img.shields.io/spiget/rating/66642) ![Versions](https://img.shields.io/spiget/tested-versions/66642) -------------------------------------------------------------------------------- /ci_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | gitlab-maven 5 | 6 | 7 | 8 | Job-Token 9 | ${env.CI_JOB_TOKEN} 10 | 11 | 12 | 13 | 14 | 15 | ftp-repo 16 | ${env.FTP_USR} 17 | ${env.FTP_PASS} 18 | 19 | 20 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.andrei1058.bedwars 8 | proxy 9 | 1.2.5 10 | 11 | proxy-api 12 | proxy-plugin 13 | 14 | 15 | 16 | UTF-8 17 | UTF-8 18 | 19 | pom 20 | 21 | 22 | 23 | spigot-repo 24 | https://hub.spigotmc.org/nexus/content/repositories/snapshots/ 25 | 26 | 27 | placeholderapi 28 | https://repo.extendedclip.com/content/repositories/placeholderapi/ 29 | 30 | 31 | 32 | 33 | 34 | 35 | org.apache.maven.wagon 36 | wagon-ftp 37 | 3.5.1 38 | 39 | 40 | 41 | 42 | maven-compiler-plugin 43 | 3.10.1 44 | 45 | 1.8 46 | 1.8 47 | eclipse 48 | 49 | javax.* 50 | org.intellij.* 51 | org.jetbrains.* 52 | 53 | 54 | 55 | 56 | org.codehaus.plexus 57 | plexus-compiler-eclipse 58 | 2.11.1 59 | 60 | 61 | 62 | 63 | org.apache.maven.plugins 64 | maven-deploy-plugin 65 | 3.0.0-M2 66 | 67 | true 68 | 69 | 70 | 71 | org.apache.maven.plugins 72 | maven-javadoc-plugin 73 | 3.3.2 74 | 75 | true 76 | 77 | 78 | 79 | com.github.spotbugs 80 | spotbugs-maven-plugin 81 | 4.5.3.0 82 | 83 | 84 | 85 | com.github.spotbugs 86 | spotbugs 87 | 4.6.0 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | org.apache.maven.plugins 97 | maven-javadoc-plugin 98 | 3.3.3-SNAPSHOT 99 | 100 | 101 | 102 | 103 | 104 | 105 | ftp-repo 106 | ftp://andrei1058.dev/releases 107 | 108 | 109 | ftp-repo 110 | ftp://andrei1058.dev/snapshots 111 | 112 | 113 | -------------------------------------------------------------------------------- /proxy-api/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | proxy 7 | com.andrei1058.bedwars 8 | 1.2.5 9 | 10 | 4.0.0 11 | 12 | proxy-api 13 | ${project.parent.version} 14 | 15 | 16 | 17 | spigot-repo 18 | https://hub.spigotmc.org/nexus/content/repositories/snapshots/ 19 | 20 | 21 | 22 | 23 | 24 | org.spigotmc 25 | spigot-api 26 | 1.8.8-R0.1-SNAPSHOT 27 | provided 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | org.apache.maven.plugins 36 | maven-compiler-plugin 37 | 38 | 8 39 | 8 40 | 41 | javax.* 42 | org.intellij.* 43 | org.jetbrains.* 44 | 45 | 46 | 47 | 48 | org.apache.maven.plugins 49 | maven-javadoc-plugin 50 | 3.3.2 51 | 52 | private 53 | 54 | 55 | 56 | org.apache.maven.plugins 57 | maven-deploy-plugin 58 | 3.0.0-M2 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /proxy-api/src/main/java/com/andrei1058/bedwars/proxy/api/ArenaStatus.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.api; 2 | 3 | public enum ArenaStatus { 4 | 5 | WAITING, STARTING, PLAYING, RESTARTING, UNKNOWN 6 | } 7 | -------------------------------------------------------------------------------- /proxy-api/src/main/java/com/andrei1058/bedwars/proxy/api/BedWars.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.api; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | import java.util.List; 6 | import java.util.UUID; 7 | 8 | public interface BedWars { 9 | 10 | /** 11 | * Get language util. 12 | * 13 | * @return utils. 14 | */ 15 | LanguageUtil getLanguageUtil(); 16 | 17 | interface LanguageUtil { 18 | /** 19 | * Save default data if not exists in the language files. 20 | * Save a default message on all languages files. 21 | * 22 | * @param path message path. 23 | * @param data message value. 24 | */ 25 | void saveIfNotExists(String path, Object data); 26 | 27 | /** 28 | * Get installed language list. 29 | * 30 | * @return available languages list. 31 | */ 32 | List getLanguages(); 33 | 34 | /** 35 | * Get message in player's language. 36 | * 37 | * @param p target player. 38 | * @param path message path. 39 | * @return color translated message. 40 | */ 41 | String getMsg(Player p, String path); 42 | 43 | /** 44 | * Retrieve a player language. 45 | * 46 | * @param p target player. 47 | * @return player language. 48 | */ 49 | Language getPlayerLanguage(Player p); 50 | 51 | /** 52 | * Get a string list in player's language. 53 | * 54 | * @param p target player. 55 | * @param path list path. 56 | * @return translated list with translated colors. 57 | */ 58 | List getList(Player p, String path); 59 | 60 | /** 61 | * Check if a language is loaded. 62 | * Iso example: en, ro etc. 63 | * 64 | * @param iso language iso code. 65 | * @return true if the language is loaded. 66 | */ 67 | boolean isLanguageExist(String iso); 68 | 69 | /** 70 | * Add a language to the list. 71 | * 72 | * @param language new language. 73 | * @return true if the language was added successfully. 74 | */ 75 | boolean addLanguage(Language language); 76 | 77 | /** 78 | * Get a language by iso code. 79 | * 80 | * @param iso language code. Ex: ro, en. 81 | * @return NULL if not found. 82 | */ 83 | Language getLang(String iso); 84 | 85 | /** 86 | * Change server default language. 87 | * 88 | * @param defaultLanguage language. 89 | */ 90 | void setDefaultLanguage(Language defaultLanguage); 91 | 92 | 93 | /** 94 | * Get server default language. 95 | * 96 | * @return server default language. 97 | */ 98 | Language getDefaultLanguage(); 99 | } 100 | 101 | interface ArenaUtil { 102 | /** 103 | * Destroy available rejoins for the given arena. 104 | * 105 | * @param arena target arena. 106 | */ 107 | void destroyReJoins(CachedArena arena); 108 | 109 | /** 110 | * Get available rejoin session for a player. 111 | * 112 | * @param player player uuid. 113 | * @return NULL if not found. 114 | */ 115 | RemoteReJoin getReJoin(UUID player); 116 | 117 | /** 118 | * Get an arena by server and map identifier. 119 | * 120 | * @param server server id. 121 | * @param remoteIdentifier remote map identifier. 122 | * @return arena. 123 | */ 124 | CachedArena getArena(String server, String remoteIdentifier); 125 | 126 | /** 127 | * Add a player to the most filled arena from a group. 128 | * 129 | * @param p target player. 130 | * @param group arena group. 131 | * @return true if joined successfully. 132 | */ 133 | boolean joinRandomFromGroup(Player p, String group); 134 | 135 | /** 136 | * Add a player to the most filled arena. 137 | * Check if is the party owner first. 138 | * 139 | * @param p target player. 140 | * @return true if joined successfully. 141 | */ 142 | boolean joinRandomArena(Player p); 143 | 144 | /** 145 | * Remove an arena and destroy its data. 146 | * @param a arena. 147 | */ 148 | void disableArena(CachedArena a); 149 | } 150 | 151 | /** 152 | * Get arena util. 153 | * 154 | * @return utils. 155 | */ 156 | ArenaUtil getArenaUtil(); 157 | } 158 | -------------------------------------------------------------------------------- /proxy-api/src/main/java/com/andrei1058/bedwars/proxy/api/CachedArena.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.api; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | public interface CachedArena { 6 | 7 | String getRemoteIdentifier(); 8 | 9 | String getArenaName(); 10 | 11 | String getServer(); 12 | 13 | String getDisplayName(Language lang); 14 | 15 | String getArenaGroup(); 16 | 17 | String getDisplayGroup(Language lang); 18 | 19 | void setArenaGroup(String group); 20 | 21 | void setArenaName(String newName); 22 | 23 | ArenaStatus getStatus(); 24 | 25 | String getDisplayStatus(Language lang); 26 | 27 | void setStatus(ArenaStatus arenaStatus); 28 | 29 | int getMaxPlayers(); 30 | 31 | int getCurrentPlayers(); 32 | 33 | long getLastUpdate(); 34 | 35 | void setCurrentPlayers(int players); 36 | 37 | void setLastUpdate(long time); 38 | 39 | void setMaxPlayers(int players); 40 | 41 | int getMaxInTeam(); 42 | 43 | void setMaxInTeam(int max); 44 | 45 | boolean addSpectator(Player player, String targetPlayer); 46 | 47 | // NULL if not party 48 | boolean addPlayer(Player player, String partyOwnerName); 49 | 50 | boolean reJoin(RemoteReJoin player); 51 | 52 | boolean equals(CachedArena arena); 53 | } 54 | -------------------------------------------------------------------------------- /proxy-api/src/main/java/com/andrei1058/bedwars/proxy/api/Language.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.api; 2 | 3 | import java.util.List; 4 | 5 | public interface Language { 6 | 7 | /** 8 | * Set chat prefix. 9 | * 10 | * @param prefix messages prefix. 11 | */ 12 | void setPrefix(String prefix); 13 | 14 | /** 15 | * Get language iso code. 16 | * 17 | * @return language iso code. Ex: ro, en. 18 | */ 19 | String getIso(); 20 | 21 | /** 22 | * Get language name. 23 | * This is used in the /bw lang list. 24 | * It is a sort of display name. 25 | * 26 | * @return language display name. 27 | */ 28 | String getLangName(); 29 | 30 | /** 31 | * Check if a message was set. 32 | * 33 | * @param path message path. 34 | * @return true if the given path exists. 35 | */ 36 | boolean exists(String path); 37 | 38 | /** 39 | * Get a color translated message. 40 | * 41 | * @param path message path. 42 | * @return a color translated message. 43 | */ 44 | String getMsg(String path); 45 | 46 | /** 47 | * Get a color translated list. 48 | * 49 | * @param path message path. 50 | * @return a color translated list. 51 | */ 52 | List getList(String path); 53 | 54 | /** 55 | * Set a message. 56 | * 57 | * @param path message path. 58 | * @param value message value. 59 | */ 60 | void set(String path, Object value); 61 | } 62 | -------------------------------------------------------------------------------- /proxy-api/src/main/java/com/andrei1058/bedwars/proxy/api/Messages.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.api; 2 | 3 | public class Messages { 4 | 5 | public static final String ARENA_DISPLAY_GROUP_PATH = "display-group-"; 6 | public static final String ARENA_DISPLAY_NAME_PATH = "display-name-"; 7 | public static String FORMATTING_STATS_DATE_FORMAT = "format-stats-time"; 8 | 9 | public static String PREFIX = "prefix"; 10 | 11 | //Arena GUI related 12 | public static String ARENA_GUI_INV_NAME = "arena-selector-gui-name"; 13 | public static String ARENA_GUI_ARENA_CONTENT_NAME = "arena-selector-content-name"; 14 | public static String ARENA_GUI_ARENA_CONTENT_LORE = "arena-selector-content-lore"; 15 | 16 | // Arena status/ status change related 17 | public static String ARENA_STATUS_WAITING_NAME = "arena-status-waiting"; 18 | public static String ARENA_STATUS_STARTING_NAME = "arena-status-starting"; 19 | public static String ARENA_STATUS_PLAYING_NAME = "arena-status-playing"; 20 | public static String ARENA_STATUS_RESTARTING_NAME = "arena-status-restarting"; 21 | public static String ARENA_STATUS_OFFLINE_NAME = "arena-status-offline"; 22 | 23 | public static String ARENA_JOIN_DENIED_SELECTOR = "arena-join-denied-selector"; 24 | public static String ARENA_SPECTATE_DENIED_SELECTOR = "arena-spectate-denied-selector"; 25 | 26 | // meanings 27 | public static String COMMAND_LANG_LIST_HEADER = "cmd-lang-list-header"; 28 | public static String COMMAND_LANG_LIST_FORMAT = "cmd-lang-list-format"; 29 | public static String COMMAND_LANG_USAGE = "cmd-lang-usage"; 30 | public static String COMMAND_TP_USAGE = "cmd-tp-usage"; 31 | public static String COMMAND_TP_NOT_FOUND = "cmd-tp-fail"; 32 | public static String COMMAND_TP_FAIL2 = "cmd-tp-fai2"; 33 | public static String COMMAND_LANG_SELECTED_NOT_EXIST = "cmd-lang-not-exist"; 34 | public static String COMMAND_LANG_SELECTED_SUCCESSFULLY = "cmd-lang-set"; 35 | public static String COMMAND_JOIN_USAGE = "cmd-join-usage"; 36 | public static String COMMAND_JOIN_GROUP_OR_ARENA_NOT_FOUND = "cmd-join-not-found"; 37 | public static String COMMAND_JOIN_DENIED_IS_FULL = "cmd-join-arena-full"; 38 | public static String COMMAND_JOIN_NO_EMPTY_FOUND = "cmd-join-arenas-full"; 39 | public static String COMMAND_JOIN_DENIED_PARTY_TOO_BIG = "cmd-join-party-big"; 40 | public static String COMMAND_JOIN_DENIED_NOT_PARTY_LEADER = "cmd-join-not-leader"; 41 | public static String COMMAND_JOIN_SPECTATOR_DENIED_MSG = "cmd-join-spectate-denied"; 42 | public static String REJOIN_NO_ARENA = "cmd-rejoin-no-arena"; 43 | public static String REJOIN_DENIED = "cmd-rejoin-denied"; 44 | public static String REJOIN_ALLOWED = "cmd-rejoin-allowed"; 45 | public static String COMMAND_NOT_FOUND_OR_INSUFF_PERMS = "cmd-not-found"; 46 | public static String COMMAND_GUI_DISPLAY = "cmd-arena-gui-display"; 47 | public static String COMMAND_GUI_HOVER = "cmd-arena-gui-hover"; 48 | public static String COMMAND_LANGUAGE_DISPLAY = "cmd-lang-display"; 49 | public static String COMMAND_LANGUAGE_HOVER = "cmd-lang-hover"; 50 | public static String COMMAND_REJOIN_DISPLAY = "cmd-rejoin-display"; 51 | public static String COMMAND_REJOIN_HOVER = "cmd-rejoin-hover"; 52 | public static String COMMAND_TP_DISPLAY = "cmd-tp-display"; 53 | public static String COMMAND_TP_HOVER = "cmd-tp-hover"; 54 | 55 | public static String COMMAND_PARTY_HELP = "cmd-party-help"; 56 | public static String COMMAND_PARTY_INVITE_USAGE = "cmd-party-invite-usage"; 57 | public static String COMMAND_PARTY_INVITE_SENT = "cmd-party-invite"; 58 | public static String COMMAND_PARTY_INVITE_DENIED_PLAYER_OFFLINE = "cmd-party-offline"; 59 | public static String COMMAND_PARTY_INVITE_SENT_TARGET_RECEIVE_MSG = "cmd-party-invite-received"; 60 | public static String COMMAND_PARTY_INVITE_DENIED_CANNOT_INVITE_YOURSELF = "cmd-party-invite-self"; 61 | public static String COMMAND_PARTY_ACCEPT_DENIED_NO_INVITE = "cmd-party-no-invite"; 62 | public static String COMMAND_PARTY_ACCEPT_DENIED_ALREADY_IN_PARTY = "cmd-party-already-in"; 63 | public static String COMMAND_PARTY_INSUFFICIENT_PERMISSIONS = "cmd-party-no-perm"; 64 | public static String COMMAND_PARTY_ACCEPT_USAGE = "cmd-party-accept-usage"; 65 | public static String COMMAND_PARTY_ACCEPT_SUCCESS = "cmd-party-join"; 66 | public static String COMMAND_PARTY_GENERAL_DENIED_NOT_IN_PARTY = "cmd-party-not-in"; 67 | public static String COMMAND_PARTY_LEAVE_DENIED_IS_OWNER_NEEDS_DISBAND = "cmd-party-cant-leave"; 68 | public static String COMMAND_PARTY_LEAVE_SUCCESS = "cmd-party-leave"; 69 | public static String COMMAND_PARTY_DISBAND_SUCCESS = "cmd-party-disband"; 70 | public static String COMMAND_PARTY_REMOVE_USAGE = "cmd-party-remove-usage"; 71 | public static String COMMAND_PARTY_REMOVE_SUCCESS = "cmd-party-remove"; 72 | public static String COMMAND_PARTY_REMOVE_DENIED_TARGET_NOT_PARTY_MEMBER = "cmd-party-remove-not-in"; 73 | 74 | 75 | // signs related 76 | public static String SIGN_DYNAMIC_WAITING = "sign-dynamic-content.waiting"; 77 | public static String SIGN_DYNAMIC_STARTING = "sign-dynamic-content.starting"; 78 | public static String SIGN_DYNAMIC_SEARCHING = "sign-dynamic-content.searching"; 79 | public static String SIGN_DYNAMIC_NO_GAMES = "sign-dynamic-content.no-games"; 80 | 81 | public static String SIGN_STATIC_WAITING = "sign-static-content.waiting"; 82 | public static String SIGN_STATIC_STARTING = "sign-static-content.starting"; 83 | public static String SIGN_STATIC_PLAYING = "sign-static-content.playing"; 84 | public static String SIGN_STATIC_SEARCHING = "sign-static-content.searching"; 85 | public static String SIGN_STATIC_NO_GAMES = "sign-static-content.no-games"; 86 | } 87 | -------------------------------------------------------------------------------- /proxy-api/src/main/java/com/andrei1058/bedwars/proxy/api/RemoteReJoin.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.api; 2 | 3 | import java.util.UUID; 4 | 5 | public interface RemoteReJoin { 6 | 7 | /** 8 | * Remove re-join data. 9 | */ 10 | void destroy(); 11 | 12 | /** 13 | * Get user uuid. 14 | * 15 | * @return user uuid. 16 | */ 17 | UUID getUUID(); 18 | 19 | /** 20 | * Get arena. 21 | * 22 | * @return arena. 23 | **/ 24 | CachedArena getArena(); 25 | } 26 | -------------------------------------------------------------------------------- /proxy-api/src/main/java/com/andrei1058/bedwars/proxy/api/event/ArenaCacheCreateEvent.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.api.event; 2 | 3 | import com.andrei1058.bedwars.proxy.api.CachedArena; 4 | import org.bukkit.event.Event; 5 | import org.bukkit.event.HandlerList; 6 | 7 | public class ArenaCacheCreateEvent extends Event { 8 | private static final HandlerList HANDLERS = new HandlerList(); 9 | 10 | private CachedArena arena; 11 | 12 | /** 13 | * Called when an arena is enabled successfully. It's called after a restart as well. 14 | * 15 | * @param a target arena. 16 | */ 17 | public ArenaCacheCreateEvent(CachedArena a) { 18 | this.arena = a; 19 | } 20 | 21 | /** 22 | * Get the arena. 23 | * 24 | * @return arena. 25 | */ 26 | public CachedArena getArena() { 27 | return arena; 28 | } 29 | 30 | /** 31 | * Bukkit stuff. 32 | * 33 | * @return handlers. 34 | */ 35 | @Override 36 | public HandlerList getHandlers() { 37 | return HANDLERS; 38 | } 39 | 40 | /** 41 | * Bukkit stuff. 42 | * 43 | * @return handlers. 44 | */ 45 | public static HandlerList getHandlerList() { 46 | return HANDLERS; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /proxy-api/src/main/java/com/andrei1058/bedwars/proxy/api/event/ArenaCacheRemoveEvent.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.api.event; 2 | 3 | import com.andrei1058.bedwars.proxy.api.CachedArena; 4 | import org.bukkit.event.Event; 5 | import org.bukkit.event.HandlerList; 6 | 7 | public class ArenaCacheRemoveEvent extends Event { 8 | private static final HandlerList HANDLERS = new HandlerList(); 9 | 10 | private CachedArena arena; 11 | 12 | /** 13 | * Called when an arena is removed from the list. 14 | */ 15 | public ArenaCacheRemoveEvent(CachedArena a) { 16 | this.arena = a; 17 | } 18 | 19 | /** 20 | * Get the arena. 21 | * 22 | * @return arena. 23 | */ 24 | public CachedArena getArena() { 25 | return arena; 26 | } 27 | 28 | /** 29 | * Bukkit stuff. 30 | * 31 | * @return handlers. 32 | */ 33 | @Override 34 | public HandlerList getHandlers() { 35 | return HANDLERS; 36 | } 37 | 38 | /** 39 | * Bukkit stuff. 40 | * 41 | * @return handlers. 42 | */ 43 | public static HandlerList getHandlerList() { 44 | return HANDLERS; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /proxy-api/src/main/java/com/andrei1058/bedwars/proxy/api/event/ArenaCacheUpdateEvent.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.api.event; 2 | 3 | import com.andrei1058.bedwars.proxy.api.CachedArena; 4 | import org.bukkit.event.Event; 5 | import org.bukkit.event.HandlerList; 6 | 7 | public class ArenaCacheUpdateEvent extends Event { 8 | 9 | private static final HandlerList HANDLERS = new HandlerList(); 10 | 11 | private CachedArena arena; 12 | 13 | /** 14 | * Called when an arena is enabled successfully. It's called after a restart as well. 15 | * 16 | */ 17 | public ArenaCacheUpdateEvent(CachedArena a) { 18 | this.arena = a; 19 | } 20 | 21 | /** 22 | * Get the arena. 23 | * @return arena. 24 | */ 25 | public CachedArena getArena() { 26 | return arena; 27 | } 28 | /** 29 | * Bukkit stuff. 30 | * 31 | * @return handlers. 32 | */ 33 | @Override 34 | public HandlerList getHandlers() { 35 | return HANDLERS; 36 | } 37 | /** 38 | * Bukkit stuff. 39 | * 40 | * @return handlers. 41 | */ 42 | public static HandlerList getHandlerList() { 43 | return HANDLERS; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /proxy-api/src/main/java/com/andrei1058/bedwars/proxy/api/event/PlayerArenaJoinEvent.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.api.event; 2 | 3 | import com.andrei1058.bedwars.proxy.api.CachedArena; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.Cancellable; 6 | import org.bukkit.event.Event; 7 | import org.bukkit.event.HandlerList; 8 | 9 | public class PlayerArenaJoinEvent extends Event implements Cancellable { 10 | 11 | private static final HandlerList HANDLERS = new HandlerList(); 12 | 13 | private boolean cancelled; 14 | private Player player; 15 | private CachedArena arena; 16 | private boolean spectator = false; 17 | 18 | /** 19 | * Called when a player joins an arena. 20 | * This is called before sending him to the server. 21 | * 22 | * @param player player. 23 | * @param arena arena. 24 | */ 25 | public PlayerArenaJoinEvent(Player player, CachedArena arena) { 26 | this.player = player; 27 | this.arena = arena; 28 | } 29 | 30 | public PlayerArenaJoinEvent(Player player, CachedArena arena, boolean spectator) { 31 | this(player, arena); 32 | this.spectator = spectator; 33 | } 34 | 35 | /** 36 | * Get player. 37 | * 38 | * @return player. 39 | */ 40 | public Player getPlayer() { 41 | return player; 42 | } 43 | 44 | /** 45 | * Get arena. 46 | * 47 | * @return arena. 48 | */ 49 | public CachedArena getArena() { 50 | return arena; 51 | } 52 | 53 | /** 54 | * Check if the player has joined as spectator. 55 | * 56 | * @return true if the player is a spectator, otherwise false. 57 | */ 58 | public boolean isSpectator() { 59 | return spectator; 60 | } 61 | 62 | /** 63 | * Bukkit stuff. 64 | * 65 | * @return handlers. 66 | */ 67 | @Override 68 | public HandlerList getHandlers() { 69 | return HANDLERS; 70 | } 71 | 72 | /** 73 | * Bukkit stuff. 74 | * 75 | * @return handlers. 76 | */ 77 | public static HandlerList getHandlerList() { 78 | return HANDLERS; 79 | } 80 | 81 | /** 82 | * Check if event is cancelled. 83 | * 84 | * @return true if canceled. 85 | */ 86 | @Override 87 | public boolean isCancelled() { 88 | return cancelled; 89 | } 90 | 91 | /** 92 | * Change value. 93 | * 94 | * @param cancel cancel event. 95 | */ 96 | @Override 97 | public void setCancelled(boolean cancel) { 98 | this.cancelled = cancel; 99 | } 100 | 101 | } -------------------------------------------------------------------------------- /proxy-api/src/main/java/com/andrei1058/bedwars/proxy/api/event/PlayerLangChangeEvent.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.api.event; 2 | 3 | import com.andrei1058.bedwars.proxy.api.Language; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.Event; 6 | import org.bukkit.event.HandlerList; 7 | 8 | public class PlayerLangChangeEvent extends Event { 9 | private static final HandlerList HANDLERS = new HandlerList(); 10 | 11 | private boolean cancelled = false; 12 | private Player player; 13 | private Language oldLang, newLang; 14 | 15 | /** 16 | * Called when a Player changes his language. 17 | * 18 | * @param p target player. 19 | * @param oldLang old language. 20 | * @param newLang new language. 21 | */ 22 | public PlayerLangChangeEvent(Player p, Language oldLang, Language newLang) { 23 | this.player = p; 24 | this.oldLang = oldLang; 25 | this.newLang = newLang; 26 | } 27 | 28 | /** 29 | * Check if event is cancelled. 30 | * 31 | * @return true if canceled. 32 | */ 33 | public boolean isCancelled() { 34 | return cancelled; 35 | } 36 | 37 | /** 38 | * Change value. 39 | * 40 | * @param cancelled cancel event. 41 | */ 42 | public void setCancelled(boolean cancelled) { 43 | this.cancelled = cancelled; 44 | } 45 | 46 | /** 47 | * Get Player. 48 | * 49 | * @return player. 50 | */ 51 | public Player getPlayer() { 52 | return player; 53 | } 54 | 55 | /** 56 | * Get old Language. 57 | * 58 | * @return old language. 59 | */ 60 | public Language getOldLang() { 61 | return oldLang; 62 | } 63 | 64 | 65 | /** 66 | * Get new Language. 67 | * 68 | * @return new language. 69 | */ 70 | public Language getNewLang() { 71 | return newLang; 72 | } 73 | 74 | /** 75 | * Bukkit stuff. 76 | * 77 | * @return handlers. 78 | */ 79 | @Override 80 | public HandlerList getHandlers() { 81 | return HANDLERS; 82 | } 83 | 84 | /** 85 | * Bukkit stuff. 86 | * 87 | * @return handlers. 88 | */ 89 | public static HandlerList getHandlerList() { 90 | return HANDLERS; 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /proxy-api/src/main/java/com/andrei1058/bedwars/proxy/api/event/PlayerReJoinEvent.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.api.event; 2 | 3 | import com.andrei1058.bedwars.proxy.api.CachedArena; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.Event; 6 | import org.bukkit.event.HandlerList; 7 | 8 | public class PlayerReJoinEvent extends Event { 9 | 10 | private static final HandlerList HANDLERS = new HandlerList(); 11 | 12 | private Player player; 13 | private CachedArena arena; 14 | 15 | /** 16 | * Called when a player rejoins an arena. 17 | * This is called before sending him to the server. 18 | * 19 | * @param player player. 20 | * @param arena arena. 21 | */ 22 | public PlayerReJoinEvent(Player player, CachedArena arena) { 23 | this.player = player; 24 | this.arena = arena; 25 | } 26 | 27 | /** 28 | * Get player. 29 | * 30 | * @return player. 31 | */ 32 | public Player getPlayer() { 33 | return player; 34 | } 35 | 36 | /** 37 | * Get arena. 38 | * 39 | * @return arena. 40 | */ 41 | public CachedArena getArena() { 42 | return arena; 43 | } 44 | 45 | /** 46 | * Bukkit stuff. 47 | * 48 | * @return handlers. 49 | */ 50 | @Override 51 | public HandlerList getHandlers() { 52 | return HANDLERS; 53 | } 54 | 55 | /** 56 | * Bukkit stuff. 57 | * 58 | * @return handlers. 59 | */ 60 | public static HandlerList getHandlerList() { 61 | return HANDLERS; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /proxy-plugin/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | proxy 7 | com.andrei1058.bedwars 8 | 1.2.5 9 | 10 | 4.0.0 11 | 12 | proxy-plugin 13 | ${project.parent.version} 14 | 15 | 16 | 17 | simonsators-repo 18 | https://simonsator.de/repo/ 19 | 20 | 21 | codemc-repo 22 | https://repo.codemc.org/repository/maven-public/ 23 | 24 | 25 | bungee-chat 26 | https://oss.sonatype.org/content/repositories/public/ 27 | 28 | 29 | alessiodp-repo 30 | https://repo.alessiodp.com/releases/ 31 | 32 | 33 | andrei1058-repo 34 | https://repo.andrei1058.dev/releases 35 | 36 | 37 | andrei1058-repo2 38 | https://repo.andrei1058.dev/snapshots/ 39 | 40 | 41 | 42 | 43 | 44 | me.clip 45 | placeholderapi 46 | 2.11.1 47 | provided 48 | 49 | 50 | de.simonsator 51 | Party-and-Friends-MySQL-Edition-Spigot-API 52 | 1.5.3 53 | provided 54 | 55 | 56 | de.simonsator 57 | Spigot-Party-API-For-RedisBungee 58 | 1.0.3-SNAPSHOT 59 | provided 60 | 61 | 62 | com.alessiodp.parties 63 | parties-api 64 | 3.2.4 65 | provided 66 | 67 | 68 | de.simonsator 69 | DevelopmentPAFSpigot 70 | 1.0.67 71 | provided 72 | 73 | 74 | com.andrei1058.spigot.versionsupport 75 | itemstack-version 76 | 1.6.3 77 | compile 78 | 79 | 80 | javax.annotation 81 | javax.annotation-api 82 | 83 | 84 | 85 | 86 | com.andrei1058.spigot.versionsupport 87 | sounds-version 88 | 1.6.3 89 | compile 90 | 91 | 92 | javax.annotation 93 | javax.annotation-api 94 | 95 | 96 | 97 | 98 | com.andrei1058.spigot.versionsupport 99 | material-version 100 | 1.6.3 101 | compile 102 | 103 | 104 | javax.annotation 105 | javax.annotation-api 106 | 107 | 108 | 109 | 110 | com.andrei1058.spigot.versionsupport 111 | block-version 112 | 1.6.3 113 | compile 114 | 115 | 116 | javax.annotation 117 | javax.annotation-api 118 | 119 | 120 | 121 | 122 | org.bstats 123 | bstats-bukkit 124 | 3.0.0 125 | compile 126 | 127 | 128 | com.andrei1058.spigot.signapi 129 | signs-api 130 | 22.3 131 | compile 132 | 133 | 134 | com.andrei1058.bedwars 135 | proxy-api 136 | ${project.version} 137 | compile 138 | 139 | 140 | net.md-5 141 | bungeecord-chat 142 | 1.8-SNAPSHOT 143 | provided 144 | 145 | 146 | com.google.code.gson 147 | gson 148 | 149 | 150 | 151 | 152 | net.md-5 153 | bungeecord-api 154 | 1.8-SNAPSHOT 155 | provided 156 | 157 | 158 | org.jetbrains 159 | annotations 160 | 23.0.0 161 | provided 162 | 163 | 164 | org.spigotmc 165 | spigot-api 166 | 1.8.8-R0.1-SNAPSHOT 167 | provided 168 | 169 | 170 | 171 | 172 | maven-snapshots 173 | https://repository.apache.org/content/repositories/snapshots/ 174 | 175 | 176 | 177 | 178 | 179 | src/main/resources 180 | true 181 | 182 | plugin.yml 183 | 184 | 185 | 186 | 187 | 188 | org.apache.maven.plugins 189 | maven-deploy-plugin 190 | 3.0.0-M2 191 | 192 | true 193 | 194 | 195 | 196 | org.apache.maven.plugins 197 | maven-javadoc-plugin 198 | 3.3.2 199 | 200 | true 201 | 202 | 203 | 204 | org.apache.maven.plugins 205 | maven-shade-plugin 206 | 3.3.1-SNAPSHOT 207 | 208 | 209 | 210 | org.bstats 211 | com.andrei1058.bedwars.proxy.libs 212 | 213 | 214 | com.andrei1058.spigot.versionsupport 215 | com.andrei1058.bedwars.proxy.libs 216 | 217 | 218 | 219 | 220 | 221 | package 222 | 223 | shade 224 | 225 | 226 | 227 | 228 | 229 | 230 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/API.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy; 2 | 3 | import com.andrei1058.bedwars.proxy.api.BedWars; 4 | import com.andrei1058.bedwars.proxy.arenamanager.ArenaManager; 5 | import com.andrei1058.bedwars.proxy.language.LanguageManager; 6 | 7 | public class API implements BedWars { 8 | /** 9 | * Get language util. 10 | * 11 | * @return utils. 12 | */ 13 | @Override 14 | public LanguageUtil getLanguageUtil() { 15 | return LanguageManager.get(); 16 | } 17 | 18 | /** 19 | * Get arena util. 20 | * 21 | * @return utils. 22 | */ 23 | @Override 24 | public ArenaUtil getArenaUtil() { 25 | return ArenaManager.getInstance(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/BedWarsProxy.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy; 2 | 3 | import com.andrei1058.bedwars.proxy.api.BedWars; 4 | import com.andrei1058.bedwars.proxy.arenamanager.ArenaManager; 5 | import com.andrei1058.bedwars.proxy.arenamanager.ArenaSelectorListener; 6 | import com.andrei1058.bedwars.proxy.arenasign.SignManager; 7 | import com.andrei1058.bedwars.proxy.command.RejoinCommand; 8 | import com.andrei1058.bedwars.proxy.command.main.MainCommand; 9 | import com.andrei1058.bedwars.proxy.command.party.PartyCommand; 10 | import com.andrei1058.bedwars.proxy.configuration.BedWarsConfig; 11 | import com.andrei1058.bedwars.proxy.configuration.ConfigPath; 12 | import com.andrei1058.bedwars.proxy.configuration.SoundsConfig; 13 | import com.andrei1058.bedwars.proxy.database.*; 14 | import com.andrei1058.bedwars.proxy.language.LangListeners; 15 | import com.andrei1058.bedwars.proxy.language.LanguageManager; 16 | import com.andrei1058.bedwars.proxy.levels.Level; 17 | import com.andrei1058.bedwars.proxy.levels.internal.InternalLevel; 18 | import com.andrei1058.bedwars.proxy.levels.internal.LevelListeners; 19 | import com.andrei1058.bedwars.proxy.party.*; 20 | import com.andrei1058.bedwars.proxy.socketmanager.ServerSocketTask; 21 | import com.andrei1058.bedwars.proxy.socketmanager.TimeOutTask; 22 | import com.andrei1058.bedwars.proxy.support.papi.SupportPAPI; 23 | import com.andrei1058.spigot.versionsupport.BlockSupport; 24 | import com.andrei1058.spigot.versionsupport.ItemStackSupport; 25 | import com.andrei1058.spigot.versionsupport.MaterialSupport; 26 | import com.andrei1058.spigot.versionsupport.SoundSupport; 27 | import net.md_5.bungee.api.chat.ClickEvent; 28 | import net.md_5.bungee.api.chat.ComponentBuilder; 29 | import net.md_5.bungee.api.chat.HoverEvent; 30 | import net.md_5.bungee.api.chat.TextComponent; 31 | import org.bstats.bukkit.Metrics; 32 | import org.bstats.charts.SimplePie; 33 | import org.bukkit.Bukkit; 34 | import org.bukkit.command.CommandMap; 35 | import org.bukkit.event.Listener; 36 | import org.bukkit.plugin.Plugin; 37 | import org.bukkit.plugin.ServicePriority; 38 | import org.bukkit.plugin.java.JavaPlugin; 39 | import org.jetbrains.annotations.NotNull; 40 | 41 | import java.lang.reflect.Field; 42 | 43 | public class BedWarsProxy extends JavaPlugin{ 44 | 45 | private static BedWarsProxy plugin; 46 | private static BedWars api; 47 | public static BedWarsConfig config; 48 | private static Database remoteDatabase = null; 49 | private static StatsCache statsCache; 50 | 51 | private static SoundSupport soundAdapter; 52 | private static MaterialSupport materialAdapter; 53 | private static BlockSupport blockAdapter; 54 | private static ItemStackSupport itemAdapter; 55 | 56 | private static Party party; 57 | private static Level levelManager; 58 | 59 | @Override 60 | public void onLoad() { 61 | plugin = this; 62 | api = new API(); 63 | Bukkit.getServicesManager().register(BedWars.class, api, this, ServicePriority.Highest); 64 | // Setup languages 65 | } 66 | 67 | @Override 68 | public void onEnable() { 69 | soundAdapter = SoundSupport.SupportBuilder.load(); 70 | materialAdapter = MaterialSupport.SupportBuilder.load(); 71 | blockAdapter = BlockSupport.SupportBuilder.load(); 72 | itemAdapter = ItemStackSupport.SupportBuilder.load(); 73 | 74 | LanguageManager.init(); 75 | config = new BedWarsConfig(); 76 | if (config.getBoolean("database.enable")) { 77 | Bukkit.getScheduler().runTaskAsynchronously(this, () -> remoteDatabase = new MySQL()); 78 | } else { 79 | remoteDatabase = new NoDatabase(); 80 | } 81 | statsCache = new StatsCache(); 82 | 83 | if (!ServerSocketTask.init(config.getInt(ConfigPath.GENERAL_CONFIGURATION_PORT))) { 84 | getLogger().severe("Could not register port: " + config.getInt(ConfigPath.GENERAL_CONFIGURATION_PORT)); 85 | getLogger().severe("Please change it in config! Port already in use!"); 86 | } 87 | 88 | getLogger().info("Listening for BedWars1058 arenas on port: " + config.getInt(ConfigPath.GENERAL_CONFIGURATION_PORT)); 89 | 90 | registerListeners(new LangListeners(), new ArenaSelectorListener(), new CacheListener()); 91 | //noinspection InstantiationOfUtilityClass 92 | new SoundsConfig(); 93 | 94 | Bukkit.getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); 95 | 96 | Bukkit.getScheduler().runTaskTimer(this, new TimeOutTask(), 20L, 10L); 97 | 98 | //Party support 99 | if (config.getYml().getBoolean(ConfigPath.GENERAL_CONFIGURATION_ALLOW_PARTIES)) { 100 | if (Bukkit.getServer().getPluginManager().isPluginEnabled("Parties")) { 101 | getLogger().info("Hook into Parties (by AlessioDP) support!"); 102 | party = new Parties(); 103 | } else if (Bukkit.getServer().getPluginManager().isPluginEnabled("Spigot-Party-API-PAF")) { 104 | getLogger().info("Hook into Party and Friends Extended Edition for BungeeCord (by Simonsator) support!"); 105 | party = new PAFBungeeCordParty(); 106 | } else if (Bukkit.getServer().getPluginManager().isPluginEnabled("PartyAndFriends")) { 107 | getLogger().info("Hook into Party and Friends for Spigot (by Simonsator) support!"); 108 | party = new PAF(); 109 | } 110 | } 111 | if (party == null) { 112 | party = new Internal(); 113 | getLogger().info("Loading internal Party system. /party"); 114 | } 115 | 116 | levelManager = new InternalLevel(); 117 | Bukkit.getPluginManager().registerEvents(new LevelListeners(), this); 118 | 119 | try { 120 | Field bukkitCommandMap = Bukkit.getServer().getClass().getDeclaredField("commandMap"); 121 | bukkitCommandMap.setAccessible(true); 122 | CommandMap commandMap = (CommandMap) bukkitCommandMap.get(Bukkit.getServer()); 123 | commandMap.register("bw", new MainCommand("bw")); 124 | commandMap.register("rejoin", new RejoinCommand("rejoin")); 125 | if (config.getBoolean(ConfigPath.GENERAL_ENABLE_PARTY_CMD)) { 126 | commandMap.register("party", new PartyCommand("party")); 127 | } 128 | } catch (NoSuchFieldException | IllegalAccessException e) { 129 | e.printStackTrace(); 130 | } 131 | 132 | /* PlaceholderAPI Support */ 133 | if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { 134 | getLogger().info("Hook into PlaceholderAPI support!"); 135 | new SupportPAPI().register(); 136 | } 137 | 138 | Metrics m = new Metrics(this, 6036); 139 | m.addCustomChart(new SimplePie("default_language", () -> LanguageManager.get().getDefaultLanguage().getIso())); 140 | m.addCustomChart(new SimplePie("party_adapter", () -> getParty().getClass().getName())); 141 | m.addCustomChart(new SimplePie("level_adapter", () -> getLevelManager().getClass().getName())); 142 | SignManager.init(); 143 | } 144 | 145 | @Override 146 | public void onDisable() { 147 | ServerSocketTask.stopTasks(); 148 | Bukkit.getScheduler().cancelTasks(this); 149 | } 150 | 151 | public static Plugin getPlugin() { 152 | return plugin; 153 | } 154 | 155 | public static Database getRemoteDatabase() { 156 | return remoteDatabase; 157 | } 158 | 159 | public static StatsCache getStatsCache() { 160 | return statsCache; 161 | } 162 | 163 | public static MaterialSupport getMaterialAdapter() { 164 | return materialAdapter; 165 | } 166 | 167 | @SuppressWarnings("unused") 168 | public static BlockSupport getBlockAdapter() { 169 | return blockAdapter; 170 | } 171 | 172 | public static ItemStackSupport getItemAdapter() { 173 | return itemAdapter; 174 | } 175 | 176 | public static SoundSupport getSoundAdapter() { 177 | return soundAdapter; 178 | } 179 | 180 | private static void registerListeners(@NotNull Listener... listeners) { 181 | for (Listener listener : listeners) { 182 | Bukkit.getPluginManager().registerEvents(listener, getPlugin()); 183 | } 184 | } 185 | 186 | public static Party getParty() { 187 | return party; 188 | } 189 | 190 | public static Level getLevelManager() { 191 | return levelManager; 192 | } 193 | 194 | /** 195 | * Create a text component. 196 | */ 197 | @NotNull 198 | public static TextComponent createTC(String text, String suggest, String shot_text) { 199 | TextComponent tx = new TextComponent(text); 200 | tx.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, suggest)); 201 | tx.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(shot_text).create())); 202 | return tx; 203 | } 204 | 205 | public static void setRemoteDatabase(Database remoteDatabase) { 206 | BedWarsProxy.remoteDatabase = remoteDatabase; 207 | } 208 | 209 | 210 | public static BedWars getAPI() { 211 | return api; 212 | } 213 | } 214 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/arenamanager/ArenaGUI.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.arenamanager; 2 | 3 | import com.andrei1058.bedwars.proxy.BedWarsProxy; 4 | import com.andrei1058.bedwars.proxy.api.ArenaStatus; 5 | import com.andrei1058.bedwars.proxy.api.CachedArena; 6 | import com.andrei1058.bedwars.proxy.configuration.ConfigPath; 7 | import com.andrei1058.bedwars.proxy.configuration.SoundsConfig; 8 | import com.andrei1058.bedwars.proxy.language.Language; 9 | import com.andrei1058.bedwars.proxy.api.Messages; 10 | import com.andrei1058.bedwars.proxy.language.LanguageManager; 11 | import org.bukkit.Bukkit; 12 | import org.bukkit.ChatColor; 13 | import org.bukkit.Material; 14 | import org.bukkit.configuration.file.YamlConfiguration; 15 | import org.bukkit.enchantments.Enchantment; 16 | import org.bukkit.entity.Player; 17 | import org.bukkit.inventory.Inventory; 18 | import org.bukkit.inventory.InventoryHolder; 19 | import org.bukkit.inventory.ItemFlag; 20 | import org.bukkit.inventory.ItemStack; 21 | import org.bukkit.inventory.meta.ItemMeta; 22 | 23 | import java.util.ArrayList; 24 | import java.util.HashMap; 25 | import java.util.List; 26 | import java.util.stream.Collectors; 27 | 28 | public class ArenaGUI { 29 | 30 | //Object[0] = inventory, Object[1] = group 31 | private static HashMap refresh = new HashMap<>(); 32 | private static YamlConfiguration yml = BedWarsProxy.config.getYml(); 33 | 34 | //Object[0] = inventory, Object[1] = group 35 | public static void refreshInv(Player p, Object[] data) { 36 | 37 | List arenas; 38 | if (((String)data[1]).equalsIgnoreCase("default")) { 39 | arenas = new ArrayList<>(ArenaManager.getArenas()); 40 | } else { 41 | arenas = new ArrayList<>(); 42 | for (CachedArena a : ArenaManager.getArenas()){ 43 | if (a.getArenaGroup().equalsIgnoreCase(data[1].toString())) arenas.add(a); 44 | } 45 | } 46 | 47 | arenas.removeIf(a -> a.getStatus() == ArenaStatus.PLAYING && !BedWarsProxy.config.getBoolean(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_SETTINGS_SHOW_PLAYING)); 48 | 49 | arenas = arenas.stream().sorted(ArenaManager.getComparator()).collect(Collectors.toList()); 50 | 51 | int arenaKey = 0; 52 | for (String useSlot : BedWarsProxy.config.getString(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_SETTINGS_USE_SLOTS).split(",")) { 53 | int slot; 54 | try { 55 | slot = Integer.parseInt(useSlot); 56 | } catch (Exception e) { 57 | continue; 58 | } 59 | ItemStack i; 60 | ((Inventory)data[0]).setItem(slot, new ItemStack(Material.AIR)); 61 | if (arenaKey >= arenas.size()) { 62 | continue; 63 | } 64 | 65 | CachedArena ca = arenas.get(arenaKey); 66 | 67 | String status; 68 | switch (ca.getStatus()) { 69 | case WAITING: 70 | status = "waiting"; 71 | break; 72 | case PLAYING: 73 | status = "playing"; 74 | break; 75 | case STARTING: 76 | status = "starting"; 77 | break; 78 | default: 79 | continue; 80 | } 81 | 82 | i = BedWarsProxy.getItemAdapter().createItem(yml.getString(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_MATERIAL.replace("%path%", status)), 83 | 1, (byte) yml.getInt(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_DATA.replace("%path%", status))); 84 | if (i == null) i = new ItemStack(Material.BEDROCK); 85 | 86 | if (yml.getBoolean(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_ENCHANTED.replace("%path%", status))) { 87 | if (i.getItemMeta() != null){ 88 | ItemMeta im = i.getItemMeta(); 89 | im.addEnchant(Enchantment.LURE, 1, true); 90 | im.addItemFlags(ItemFlag.HIDE_ENCHANTS); 91 | i.setItemMeta(im); 92 | } 93 | } 94 | 95 | 96 | ItemMeta im = i.getItemMeta(); 97 | com.andrei1058.bedwars.proxy.api.Language lang = LanguageManager.get().getPlayerLanguage(p); 98 | if (im != null){ 99 | im.setDisplayName(Language.getMsg(p, Messages.ARENA_GUI_ARENA_CONTENT_NAME).replace("{name}", ca.getDisplayName(lang))); 100 | List lore = new ArrayList<>(); 101 | for (String s : LanguageManager.get().getList(p, Messages.ARENA_GUI_ARENA_CONTENT_LORE)) { 102 | if (!(s.contains("{group}") && ca.getArenaGroup().equalsIgnoreCase("default"))) { 103 | lore.add(s.replace("{on}", String.valueOf(ca.getCurrentPlayers())).replace("{max}", 104 | String.valueOf(ca.getMaxPlayers())).replace("{status}", ca.getDisplayStatus(lang)) 105 | .replace("{group}", ca.getDisplayGroup(lang))); 106 | } 107 | } 108 | im.setLore(lore); 109 | i.setItemMeta(im); 110 | } 111 | i = BedWarsProxy.getItemAdapter().addTag(i, "server", ca.getServer()); 112 | i = BedWarsProxy.getItemAdapter().addTag(i, "world_identifier", ca.getRemoteIdentifier()); 113 | i = BedWarsProxy.getItemAdapter().addTag(i, "cancelClick", "true"); 114 | 115 | ((Inventory)data[0]).setItem(slot, i); 116 | arenaKey++; 117 | } 118 | } 119 | 120 | public static void openGui(Player p, String group) { 121 | int size = BedWarsProxy.config.getYml().getInt(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_SETTINGS_SIZE); 122 | if (size % 9 != 0) size = 27; 123 | if (size > 54) size = 54; 124 | Inventory inv = Bukkit.createInventory(new SelectorHolder(), size, Language.getMsg(p, Messages.ARENA_GUI_INV_NAME)); 125 | 126 | ItemStack i = BedWarsProxy.getItemAdapter().createItem(yml.getString(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_MATERIAL.replace("%path%", "skipped-slot")), 127 | 1, (byte) yml.getInt(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_DATA.replace("%path%", "skipped-slot"))); 128 | if (i == null) i = new ItemStack(Material.BEDROCK); 129 | i = BedWarsProxy.getItemAdapter().addTag(i, "cancelClick", "true"); 130 | 131 | if (i.getItemMeta() != null){ 132 | ItemMeta im = i.getItemMeta(); 133 | im.setDisplayName(ChatColor.translateAlternateColorCodes('&', BedWarsProxy.config.getString(ConfigPath.GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_SERVER_IP))); 134 | im.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); 135 | i.setItemMeta(im); 136 | } 137 | 138 | for (int x = 0; x < inv.getSize(); x++) { 139 | inv.setItem(x, i); 140 | } 141 | 142 | p.openInventory(inv); 143 | refresh.put(p, new Object[]{inv, group}); 144 | refreshInv(p, new Object[]{inv, group}); 145 | //p.updateInventory(); 146 | SoundsConfig.playSound("arena-selector-open", p); 147 | } 148 | 149 | public static HashMap getRefresh() { 150 | return refresh; 151 | } 152 | 153 | public static class SelectorHolder implements InventoryHolder { 154 | @Override 155 | public Inventory getInventory() { 156 | return null; 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/arenamanager/ArenaManager.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.arenamanager; 2 | 3 | import com.andrei1058.bedwars.proxy.api.*; 4 | import com.andrei1058.bedwars.proxy.api.event.ArenaCacheRemoveEvent; 5 | import com.andrei1058.bedwars.proxy.BedWarsProxy; 6 | import com.andrei1058.bedwars.proxy.configuration.ConfigPath; 7 | import com.andrei1058.bedwars.proxy.language.LanguageManager; 8 | import com.andrei1058.bedwars.proxy.socketmanager.ArenaSocketTask; 9 | import org.bukkit.Bukkit; 10 | import org.bukkit.entity.Player; 11 | import org.jetbrains.annotations.NotNull; 12 | import org.jetbrains.annotations.Nullable; 13 | import org.bukkit.configuration.file.YamlConfiguration; 14 | 15 | import java.util.*; 16 | 17 | import static com.andrei1058.bedwars.proxy.BedWarsProxy.config; 18 | import static com.andrei1058.bedwars.proxy.BedWarsProxy.getParty; 19 | 20 | public class ArenaManager implements BedWars.ArenaUtil { 21 | 22 | private final LinkedList arenas = new LinkedList<>(); 23 | private final HashMap socketByServer = new HashMap<>(); 24 | 25 | private static ArenaManager instance = null; 26 | 27 | private ArenaManager() { 28 | instance = this; 29 | } 30 | 31 | public static ArenaManager getInstance() { 32 | return instance == null ? new ArenaManager() : instance; 33 | } 34 | 35 | public void registerServerSocket(String server, ArenaSocketTask task) { 36 | if (socketByServer.containsKey(server)) { 37 | socketByServer.replace(server, task); 38 | return; 39 | } 40 | socketByServer.put(server, task); 41 | } 42 | 43 | public void registerArena(@NotNull CachedArena arena) { 44 | if (getArena(arena.getServer(), arena.getRemoteIdentifier()) != null) return; 45 | arenas.add(arena); 46 | } 47 | 48 | public CachedArena getArena(String server, String remoteIdentifier) { 49 | 50 | List arenaList = getArenas(); 51 | 52 | for (int i=0; i= arenaList.size()) break; 54 | CachedArena ca = arenaList.get(i); 55 | if (ca.getServer().equals(server) && ca.getRemoteIdentifier().equals(remoteIdentifier)) return ca; 56 | } 57 | return null; 58 | } 59 | 60 | public static List getArenas() { 61 | return Collections.unmodifiableList(getInstance().arenas); 62 | } 63 | 64 | public static Comparator getComparator() { 65 | return new Comparator() { 66 | @Override 67 | public int compare(CachedArena o1, CachedArena o2) { 68 | if (o1.getStatus() == ArenaStatus.STARTING && o2.getStatus() == ArenaStatus.STARTING) { 69 | return Integer.compare(o2.getCurrentPlayers(), o1.getCurrentPlayers()); 70 | } else if (o1.getStatus() == ArenaStatus.STARTING && o2.getStatus() != ArenaStatus.STARTING) { 71 | return -1; 72 | } else if (o2.getStatus() == ArenaStatus.STARTING && o1.getStatus() != ArenaStatus.STARTING) { 73 | return 1; 74 | } else if (o1.getStatus() == ArenaStatus.WAITING && o2.getStatus() == ArenaStatus.WAITING) { 75 | // balance nodes 76 | if (o1.getServer().equals(o2.getServer())){ 77 | return -1; 78 | } 79 | return Integer.compare(o2.getCurrentPlayers(), o1.getCurrentPlayers()); 80 | } else if (o1.getStatus() == ArenaStatus.WAITING && o2.getStatus() != ArenaStatus.WAITING) { 81 | return -1; 82 | } else if (o2.getStatus() == ArenaStatus.WAITING && o1.getStatus() != ArenaStatus.WAITING) { 83 | return 1; 84 | } else if (o1.getStatus() == ArenaStatus.PLAYING && o2.getStatus() == ArenaStatus.PLAYING) { 85 | return -1; 86 | } else if (o1.getStatus() == ArenaStatus.PLAYING && o2.getStatus() != ArenaStatus.PLAYING) { 87 | return -1; 88 | } else return 1; 89 | } 90 | 91 | @Override 92 | public boolean equals(Object obj) { 93 | return obj instanceof CachedArena; 94 | } 95 | }; 96 | } 97 | 98 | public static ArenaSocketTask getSocketByServer(String server) { 99 | return getInstance().socketByServer.getOrDefault(server, null); 100 | } 101 | 102 | /** 103 | * Check if given string is an integer. 104 | */ 105 | @SuppressWarnings("unused") 106 | public static boolean isInteger(String string) { 107 | try { 108 | Integer.parseInt(string); 109 | } catch (Exception ex) { 110 | return false; 111 | } 112 | return true; 113 | } 114 | 115 | /** 116 | * Add a player to the most filled arena from a group. 117 | */ 118 | public boolean joinRandomFromGroup(@NotNull Player p, String group) { 119 | if (getParty().hasParty(p.getUniqueId()) && !getParty().isOwner(p.getUniqueId())) { 120 | p.sendMessage(LanguageManager.get().getMsg(p, Messages.COMMAND_JOIN_DENIED_NOT_PARTY_LEADER)); 121 | return false; 122 | } 123 | 124 | List arenaList = new ArrayList<>(); 125 | getArenas().forEach(a -> { 126 | if (a.getArenaGroup().equalsIgnoreCase(group)) arenaList.add(a); 127 | }); 128 | arenaList.sort(getComparator()); 129 | 130 | //shuffle if determined in config 131 | if (config.getYml().getBoolean(ConfigPath.GENERAL_CONFIGURATION_RANDOMARENAS)){ 132 | Collections.shuffle(arenaList); 133 | } 134 | 135 | 136 | int amount = BedWarsProxy.getParty().hasParty(p.getUniqueId()) ? BedWarsProxy.getParty().getMembers(p.getUniqueId()).size() : 1; 137 | for (CachedArena a : arenaList) { 138 | if (a.getCurrentPlayers() >= a.getMaxPlayers()) continue; 139 | if (a.getMaxPlayers() - a.getCurrentPlayers() >= amount) { 140 | a.addPlayer(p, null); 141 | return true; 142 | } 143 | } 144 | p.sendMessage(LanguageManager.get().getMsg(p, Messages.COMMAND_JOIN_NO_EMPTY_FOUND)); 145 | return true; 146 | } 147 | 148 | /** 149 | * Check if arena group exists. 150 | */ 151 | public static boolean hasGroup(String arenaGroup) { 152 | for (CachedArena ad : getArenas()) { 153 | if (ad.getArenaGroup().equalsIgnoreCase(arenaGroup)) return true; 154 | } 155 | return false; 156 | } 157 | 158 | /** 159 | * Add a player to the most filled arena. 160 | * Check if is the party owner first. 161 | */ 162 | public boolean joinRandomArena(@NotNull Player p) { 163 | if (getParty().hasParty(p.getUniqueId()) && !getParty().isOwner(p.getUniqueId())) { 164 | p.sendMessage(LanguageManager.get().getMsg(p, Messages.COMMAND_JOIN_DENIED_NOT_PARTY_LEADER)); 165 | return false; 166 | } 167 | List arenaList = new ArrayList<>(getArenas()); 168 | arenaList.sort(getComparator()); 169 | 170 | int amount = BedWarsProxy.getParty().hasParty(p.getUniqueId()) ? BedWarsProxy.getParty().getMembers(p.getUniqueId()).size() : 1; 171 | for (CachedArena a : arenaList) { 172 | if (a.getCurrentPlayers() >= a.getMaxPlayers()) continue; 173 | if (a.getMaxPlayers() - a.getCurrentPlayers() >= amount) { 174 | a.addPlayer(p, null); 175 | break; 176 | } 177 | } 178 | return true; 179 | } 180 | 181 | public void disableArena(CachedArena a) { 182 | arenas.remove(a); 183 | Bukkit.getPluginManager().callEvent(new ArenaCacheRemoveEvent(a)); 184 | } 185 | 186 | public HashMap getSocketByServer() { 187 | return socketByServer; 188 | } 189 | 190 | @SuppressWarnings("unused") 191 | @Nullable 192 | public static CachedArena getArenaByIdentifier(String identifier) { 193 | for (CachedArena ca : getArenas()) { 194 | if (ca.getRemoteIdentifier().equals(identifier)) { 195 | return ca; 196 | } 197 | } 198 | return null; 199 | } 200 | 201 | @Override 202 | public void destroyReJoins(CachedArena arena) { 203 | List toRemove = new ArrayList<>(); 204 | for (Map.Entry rrj : com.andrei1058.bedwars.proxy.rejoin.RemoteReJoin.getRejoinByUUID().entrySet()) { 205 | if (rrj.getValue().getArena().equals(arena)) { 206 | toRemove.add(rrj.getValue()); 207 | } 208 | } 209 | toRemove.forEach(RemoteReJoin::destroy); 210 | } 211 | 212 | @Override 213 | public RemoteReJoin getReJoin(UUID player) { 214 | return com.andrei1058.bedwars.proxy.rejoin.RemoteReJoin.getReJoin(player); 215 | } 216 | } 217 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/arenamanager/ArenaSelectorListener.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.arenamanager; 2 | 3 | import com.andrei1058.bedwars.proxy.api.ArenaStatus; 4 | import com.andrei1058.bedwars.proxy.api.CachedArena; 5 | import com.andrei1058.bedwars.proxy.configuration.SoundsConfig; 6 | import com.andrei1058.bedwars.proxy.api.event.ArenaCacheCreateEvent; 7 | import com.andrei1058.bedwars.proxy.api.event.ArenaCacheRemoveEvent; 8 | import com.andrei1058.bedwars.proxy.api.event.ArenaCacheUpdateEvent; 9 | import com.andrei1058.bedwars.proxy.language.Language; 10 | import com.andrei1058.bedwars.proxy.api.Messages; 11 | import com.andrei1058.bedwars.proxy.BedWarsProxy; 12 | import org.bukkit.Material; 13 | import org.bukkit.entity.Player; 14 | import org.bukkit.event.EventHandler; 15 | import org.bukkit.event.Listener; 16 | import org.bukkit.event.inventory.ClickType; 17 | import org.bukkit.event.inventory.InventoryClickEvent; 18 | import org.bukkit.event.inventory.InventoryCloseEvent; 19 | import org.bukkit.inventory.ItemStack; 20 | 21 | public class ArenaSelectorListener implements Listener { 22 | 23 | @EventHandler 24 | public void onArenaSelectorClick(InventoryClickEvent e) { 25 | if (e.getClickedInventory() != null && e.getClickedInventory().getHolder() instanceof ArenaGUI.SelectorHolder) { 26 | e.setCancelled(true); 27 | Player p = (Player) e.getWhoClicked(); 28 | ItemStack i = e.getCurrentItem(); 29 | 30 | if (i == null) return; 31 | if (i.getType() == Material.AIR) return; 32 | 33 | if (!BedWarsProxy.getItemAdapter().hasTag(i, "server")) return; 34 | if (!BedWarsProxy.getItemAdapter().hasTag(i, "world_identifier")) return; 35 | String server = BedWarsProxy.getItemAdapter().getTag(i, "server"); 36 | String identifier = BedWarsProxy.getItemAdapter().getTag(i, "world_identifier"); 37 | 38 | CachedArena a = ArenaManager.getInstance().getArena(server, identifier); 39 | if (a == null) return; 40 | 41 | if (e.getClick() == ClickType.LEFT) { 42 | if ((a.getStatus() == ArenaStatus.WAITING || a.getStatus() == ArenaStatus.STARTING) && a.addPlayer(p, null)) { 43 | SoundsConfig.playSound("join-allowed", p); 44 | } else { 45 | SoundsConfig.playSound("join-denied", p); 46 | p.sendMessage(Language.getMsg(p, Messages.ARENA_JOIN_DENIED_SELECTOR)); 47 | } 48 | } else if (e.getClick() == ClickType.RIGHT) { 49 | if (a.getStatus() == ArenaStatus.PLAYING && a.addSpectator(p, null)) { 50 | SoundsConfig.playSound("spectate-allowed", p); 51 | } else { 52 | p.sendMessage(Language.getMsg(p, Messages.ARENA_SPECTATE_DENIED_SELECTOR)); 53 | SoundsConfig.playSound("spectate-denied", p); 54 | } 55 | } 56 | p.closeInventory(); 57 | } 58 | } 59 | 60 | @EventHandler 61 | public void onArenaSelectorClose(InventoryCloseEvent e) { 62 | if (!(e.getPlayer() instanceof Player)) return; 63 | ArenaGUI.getRefresh().remove(e.getPlayer()); 64 | } 65 | 66 | @EventHandler 67 | public void onCacheCreate(ArenaCacheCreateEvent e) { 68 | for (Player p : ArenaGUI.getRefresh().keySet()) { 69 | ArenaGUI.refreshInv(p, ArenaGUI.getRefresh().get(p)); 70 | } 71 | } 72 | 73 | @EventHandler 74 | public void onCacheUpdate(ArenaCacheUpdateEvent e) { 75 | for (Player p : ArenaGUI.getRefresh().keySet()) { 76 | ArenaGUI.refreshInv(p, ArenaGUI.getRefresh().get(p)); 77 | } 78 | } 79 | 80 | @EventHandler 81 | public void onCacheDelete(ArenaCacheRemoveEvent e) { 82 | for (Player p : ArenaGUI.getRefresh().keySet()) { 83 | ArenaGUI.refreshInv(p, ArenaGUI.getRefresh().get(p)); 84 | } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/arenamanager/TpRequest.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.arenamanager; 2 | 3 | import com.andrei1058.bedwars.proxy.api.CachedArena; 4 | import com.andrei1058.bedwars.proxy.socketmanager.ArenaSocketTask; 5 | import com.google.gson.JsonObject; 6 | 7 | import java.util.LinkedList; 8 | import java.util.UUID; 9 | 10 | public class TpRequest { 11 | 12 | private UUID requester; 13 | private String target; 14 | private CachedArena arena = null; 15 | private long millis; 16 | 17 | private static LinkedList requests = new LinkedList<>(); 18 | 19 | public TpRequest(UUID requester, String target){ 20 | this.requester = requester; 21 | this.target = target; 22 | requests.add(this); 23 | 24 | JsonObject jo = new JsonObject(); 25 | jo.addProperty("type", "Q"); 26 | jo.addProperty("name", target); 27 | jo.addProperty("requester", requester.toString()); 28 | 29 | for (ArenaSocketTask ast : ArenaManager.getInstance().getSocketByServer().values()) { 30 | ast.getOut().println(jo.toString()); 31 | } 32 | this.millis = System.currentTimeMillis()+3000; 33 | } 34 | 35 | public static TpRequest getTpRequest(UUID requester){ 36 | for (TpRequest tr : requests){ 37 | if (tr.requester.equals(requester)){ 38 | if (tr.millis > System.currentTimeMillis()){ 39 | return tr; 40 | } else { 41 | requests.remove(tr); 42 | return null; 43 | } 44 | } 45 | } 46 | return null; 47 | } 48 | 49 | public CachedArena getArena() { 50 | return arena; 51 | } 52 | 53 | public String getTarget() { 54 | return target; 55 | } 56 | 57 | public void setArena(CachedArena arena) { 58 | this.arena = arena; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/arenasign/ArenaSign.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.arenasign; 2 | 3 | import com.andrei1058.bedwars.proxy.api.CachedArena; 4 | 5 | public interface ArenaSign { 6 | 7 | String getGroup(); 8 | 9 | String getArena(); 10 | 11 | CachedArena getAssignedArena(); 12 | 13 | void refresh(); 14 | 15 | void remove(); 16 | 17 | boolean equals(String world, int x, int y, int z); 18 | 19 | void setStatus(SignStatus status); 20 | 21 | SignStatus getStatus(); 22 | 23 | enum SignStatus { 24 | REFRESHING, NO_DATA, FOUND 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/arenasign/DynamicArenaSign.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.arenasign; 2 | 3 | import com.andrei1058.bedwars.proxy.api.Language; 4 | import com.andrei1058.bedwars.proxy.arenamanager.ArenaManager; 5 | import com.andrei1058.bedwars.proxy.api.ArenaStatus; 6 | import com.andrei1058.bedwars.proxy.api.CachedArena; 7 | import com.andrei1058.bedwars.proxy.api.Messages; 8 | import com.andrei1058.bedwars.proxy.language.LanguageManager; 9 | import com.andrei1058.spigot.signapi.PacketSign; 10 | import org.bukkit.block.Block; 11 | import org.bukkit.event.block.Action; 12 | import org.jetbrains.annotations.NotNull; 13 | 14 | import java.util.ArrayList; 15 | import java.util.List; 16 | import java.util.stream.Collectors; 17 | 18 | public class DynamicArenaSign extends PacketSign implements ArenaSign { 19 | 20 | private String group; 21 | private CachedArena arena; 22 | private SignStatus status = SignStatus.NO_DATA; 23 | 24 | /** 25 | * Create a dynamic sign. 26 | * 27 | * @param group arena group. 28 | */ 29 | public DynamicArenaSign(Block block, @NotNull String group) { 30 | super(block); 31 | this.group = group.toLowerCase(); 32 | 33 | this.setContent(player -> { 34 | Language l = LanguageManager.get().getPlayerLanguage(player); 35 | 36 | if (arena == null) { 37 | if (status == SignStatus.REFRESHING) { 38 | return l.getList(Messages.SIGN_DYNAMIC_SEARCHING); 39 | } else { 40 | return l.getList(Messages.SIGN_DYNAMIC_NO_GAMES); 41 | } 42 | } else { 43 | List msg; 44 | if (arena.getStatus() == ArenaStatus.WAITING) { 45 | msg = l.getList(Messages.SIGN_DYNAMIC_WAITING); 46 | } else if (arena.getStatus() == ArenaStatus.STARTING) { 47 | msg = l.getList(Messages.SIGN_DYNAMIC_STARTING); 48 | } else { 49 | msg = l.getList(Messages.SIGN_DYNAMIC_SEARCHING); 50 | } 51 | msg.replaceAll(o -> o.replace("{group}", arena.getDisplayGroup(l)) 52 | .replace("{current}", String.valueOf(arena.getCurrentPlayers())) 53 | .replace("{max}", String.valueOf(arena.getMaxPlayers())) 54 | .replace("{map}", arena.getDisplayName(l)) 55 | .replace("{status}", arena.getDisplayStatus(l)) 56 | .replace("{id}", arena.getServer())); 57 | return msg; 58 | } 59 | }); 60 | 61 | this.setClickListener((player, action) -> { 62 | if (action != Action.RIGHT_CLICK_BLOCK) return; 63 | if (getAssignedArena() != null) { 64 | getAssignedArena().addPlayer(player, null); 65 | } 66 | }); 67 | 68 | SignManager.get().add(this); 69 | } 70 | 71 | @Override 72 | public void remove() { 73 | SignManager.get().remove(this); 74 | } 75 | 76 | @Override 77 | public boolean equals(@NotNull String world, int x, int y, int z) { 78 | return world.equals(getWorld()) && x == getLocation().getBlockX() && y == getLocation().getBlockY() && z == getLocation().getBlockZ(); 79 | } 80 | 81 | @Override 82 | public String getGroup() { 83 | return group; 84 | } 85 | 86 | @Override 87 | public String getArena() { 88 | return arena == null ? null : arena.getRemoteIdentifier(); 89 | } 90 | 91 | public CachedArena getAssignedArena() { 92 | return arena; 93 | } 94 | 95 | protected static synchronized void assignArena(@NotNull DynamicArenaSign sign) { 96 | sign.setStatus(SignStatus.REFRESHING); 97 | try { 98 | Thread.sleep(800); 99 | } catch (InterruptedException e) { 100 | e.printStackTrace(); 101 | sign.setStatus(SignStatus.NO_DATA); 102 | return; 103 | } 104 | List arenas = ArenaManager.getArenas().stream().filter(p -> p.getArenaGroup().equals(sign.getGroup())) 105 | .filter(p -> p.getStatus() == ArenaStatus.WAITING || p.getStatus() == ArenaStatus.STARTING).sorted(ArenaManager.getComparator()).collect(Collectors.toList()); 106 | if (arenas.isEmpty()) { 107 | sign.setStatus(SignStatus.NO_DATA); 108 | return; 109 | } 110 | 111 | List toRemove = new ArrayList<>(); 112 | for (ArenaSign as : SignManager.get().getArenaSigns()) { 113 | if (as.getAssignedArena() == null) continue; 114 | if (!(as instanceof DynamicArenaSign)) continue; 115 | toRemove.add(as.getAssignedArena()); 116 | } 117 | arenas.removeAll(toRemove); 118 | if (arenas.isEmpty()) { 119 | sign.setStatus(SignStatus.NO_DATA); 120 | } else { 121 | sign.setArena(arenas.get(0)); 122 | sign.setStatus(SignStatus.FOUND); 123 | } 124 | } 125 | 126 | 127 | public void setStatus(SignStatus status) { 128 | if (status == SignStatus.NO_DATA || status == SignStatus.REFRESHING) { 129 | this.arena = null; 130 | } 131 | this.status = status; 132 | refresh(); 133 | } 134 | 135 | @Override 136 | public SignStatus getStatus() { 137 | return status; 138 | } 139 | 140 | public void setArena(CachedArena arena) { 141 | this.arena = arena; 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/arenasign/SignManager.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.arenasign; 2 | 3 | import com.andrei1058.bedwars.proxy.configuration.ConfigPath; 4 | import com.andrei1058.bedwars.proxy.configuration.SignsConfig; 5 | import com.andrei1058.bedwars.proxy.BedWarsProxy; 6 | import com.andrei1058.spigot.signapi.PacketSign; 7 | import com.andrei1058.spigot.signapi.SpigotSignAPI; 8 | import org.bukkit.Bukkit; 9 | import org.bukkit.World; 10 | import org.bukkit.block.Block; 11 | import org.jetbrains.annotations.Contract; 12 | import org.jetbrains.annotations.NotNull; 13 | 14 | import java.util.ArrayList; 15 | import java.util.Collections; 16 | import java.util.LinkedList; 17 | import java.util.List; 18 | 19 | public class SignManager { 20 | 21 | private static SignManager INSTANCE; 22 | 23 | private SpigotSignAPI signAPI; 24 | private LinkedList arenaSigns = new LinkedList<>(); 25 | private SignsConfig signsConfig = new SignsConfig(); 26 | 27 | private SignManager() { 28 | INSTANCE = this; 29 | signAPI = new SpigotSignAPI(BedWarsProxy.getPlugin()); 30 | signAPI.setDelay(20); 31 | Bukkit.getPluginManager().registerEvents(new SignListener(), BedWarsProxy.getPlugin()); 32 | 33 | for (String s : getConfig().getList(ConfigPath.SIGNS_LIST_PATH)){ 34 | String[] data = s.split(","); 35 | World w = Bukkit.getWorld(data[5]); 36 | if (w == null) continue; 37 | Block b; 38 | try { 39 | b = w.getBlockAt(Integer.parseInt(data[0]), Integer.parseInt(data[1]), Integer.parseInt(data[2])); 40 | } catch (Exception ignored){ 41 | continue; 42 | } 43 | if (!b.getType().toString().contains("SIGN")) continue; 44 | if (data.length >= 7){ 45 | if (data.length < 8 || data[7].isEmpty()){ 46 | new DynamicArenaSign(b, data[6]); 47 | } else { 48 | new StaticArenaSign(b, data[6], data[7]); 49 | } 50 | } 51 | } 52 | 53 | Bukkit.getScheduler().runTaskLaterAsynchronously(BedWarsProxy.getPlugin(), ()-> { 54 | for (ArenaSign as : arenaSigns){ 55 | if (as instanceof DynamicArenaSign) { 56 | DynamicArenaSign.assignArena((DynamicArenaSign) as); 57 | } else if (as instanceof StaticArenaSign){ 58 | StaticArenaSign.assignArena((StaticArenaSign) as); 59 | } 60 | } 61 | }, 20*10L); 62 | } 63 | 64 | public static void init() { 65 | if (INSTANCE == null) new SignManager(); 66 | } 67 | 68 | public static SignManager get() { 69 | return INSTANCE; 70 | } 71 | 72 | public void remove(ArenaSign arenaSign) { 73 | arenaSigns.remove(arenaSign); 74 | signAPI.removeSign((PacketSign) arenaSign); 75 | } 76 | 77 | @NotNull 78 | @Contract(pure = true) 79 | public List getArenaSigns() { 80 | return Collections.unmodifiableList(arenaSigns); 81 | } 82 | 83 | protected void add(ArenaSign arenaSign){ 84 | arenaSigns.add(arenaSign); 85 | signAPI.addSign((PacketSign) arenaSign); 86 | } 87 | 88 | public SignsConfig getConfig() { 89 | return signsConfig; 90 | } 91 | 92 | public void loadSignsForWorld(World world){ 93 | List signs = new ArrayList<>(); 94 | for (String s : getConfig().getList(ConfigPath.SIGNS_LIST_PATH)){ 95 | String[] data = s.split(","); 96 | if (!data[5].equalsIgnoreCase(world.getName())) continue; 97 | Block b; 98 | try { 99 | b = world.getBlockAt(Integer.parseInt(data[0]), Integer.parseInt(data[1]), Integer.parseInt(data[2])); 100 | } catch (Exception ignored){ 101 | continue; 102 | } 103 | if (!b.getType().toString().contains("SIGN")) continue; 104 | if (data.length >= 7){ 105 | if (data.length < 8 || data[7].isEmpty()){ 106 | signs.add(new DynamicArenaSign(b, data[6])); 107 | } else { 108 | signs.add(new StaticArenaSign(b, data[6], data[7])); 109 | } 110 | } 111 | } 112 | 113 | Bukkit.getScheduler().runTaskLaterAsynchronously(BedWarsProxy.getPlugin(), ()-> { 114 | for (ArenaSign as : signs){ 115 | if (as instanceof DynamicArenaSign) { 116 | DynamicArenaSign.assignArena((DynamicArenaSign) as); 117 | } else if (as instanceof StaticArenaSign){ 118 | StaticArenaSign.assignArena((StaticArenaSign) as); 119 | } 120 | } 121 | }, 20*10L); 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/arenasign/StaticArenaSign.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.arenasign; 2 | 3 | import com.andrei1058.bedwars.proxy.api.Language; 4 | import com.andrei1058.bedwars.proxy.arenamanager.ArenaManager; 5 | import com.andrei1058.bedwars.proxy.api.ArenaStatus; 6 | import com.andrei1058.bedwars.proxy.api.CachedArena; 7 | import com.andrei1058.bedwars.proxy.configuration.ConfigPath; 8 | import com.andrei1058.bedwars.proxy.api.Messages; 9 | import com.andrei1058.bedwars.proxy.language.LanguageManager; 10 | import com.andrei1058.spigot.signapi.PacketSign; 11 | import org.bukkit.block.Block; 12 | import org.bukkit.event.block.Action; 13 | import org.jetbrains.annotations.NotNull; 14 | 15 | import java.util.ArrayList; 16 | import java.util.List; 17 | import java.util.stream.Collectors; 18 | 19 | public class StaticArenaSign extends PacketSign implements ArenaSign { 20 | 21 | private String group; 22 | private String arena; 23 | private CachedArena assignedArena; 24 | private SignStatus status = SignStatus.NO_DATA; 25 | 26 | protected StaticArenaSign(Block signBlock, String group, String arena) { 27 | super(signBlock); 28 | this.group = group; 29 | this.arena = arena; 30 | 31 | this.setContent(player -> { 32 | Language l = LanguageManager.get().getPlayerLanguage(player); 33 | 34 | if (getAssignedArena() == null) { 35 | if (status == SignStatus.REFRESHING) { 36 | return l.getList(Messages.SIGN_STATIC_SEARCHING); 37 | } else { 38 | return l.getList(Messages.SIGN_STATIC_NO_GAMES); 39 | } 40 | } else { 41 | List msg; 42 | if (getAssignedArena().getStatus() == ArenaStatus.WAITING) { 43 | msg = l.getList(Messages.SIGN_STATIC_WAITING); 44 | } else if (getAssignedArena().getStatus() == ArenaStatus.STARTING) { 45 | msg = l.getList(Messages.SIGN_STATIC_WAITING); 46 | } else if (getAssignedArena().getStatus() == ArenaStatus.PLAYING){ 47 | msg = l.getList(Messages.SIGN_STATIC_PLAYING); 48 | } else { 49 | msg = l.getList(Messages.SIGN_STATIC_SEARCHING); 50 | } 51 | msg.replaceAll(o -> o.replace("{group}", getAssignedArena().getDisplayGroup(l)) 52 | .replace("{current}", String.valueOf(getAssignedArena().getCurrentPlayers())) 53 | .replace("{max}", String.valueOf(getAssignedArena().getMaxPlayers())) 54 | .replace("{map}", getAssignedArena().getDisplayName(l)) 55 | .replace("{status}", getAssignedArena().getDisplayStatus(l)) 56 | .replace("{id}", getAssignedArena().getServer())); 57 | return msg; 58 | } 59 | }); 60 | 61 | this.setClickListener((player, action) -> { 62 | if (action != Action.RIGHT_CLICK_BLOCK) return; 63 | CachedArena ca = getAssignedArena(); 64 | if (ca != null){ 65 | if (!ca.addPlayer(player, null)){ 66 | ca.addSpectator(player, null); 67 | } 68 | } 69 | }); 70 | 71 | SignManager.get().add(this); 72 | } 73 | 74 | @Override 75 | public String getGroup() { 76 | return group; 77 | } 78 | 79 | public CachedArena getAssignedArena() { 80 | return assignedArena; 81 | } 82 | 83 | @Override 84 | public String getArena() { 85 | return arena; 86 | } 87 | 88 | @Override 89 | public void remove() { 90 | SignManager.get().remove(this); 91 | } 92 | 93 | @Override 94 | public boolean equals(@NotNull String world, int x, int y, int z) { 95 | return world.equals(getWorld()) && x == getLocation().getBlockX() && y == getLocation().getBlockY() && z == getLocation().getBlockZ(); 96 | } 97 | 98 | @Override 99 | public void setStatus(SignStatus status) { 100 | if (status == SignStatus.NO_DATA || status == SignStatus.REFRESHING) { 101 | this.assignedArena = null; 102 | } 103 | this.status = status; 104 | refresh(); 105 | } 106 | 107 | @Override 108 | public SignStatus getStatus() { 109 | return status; 110 | } 111 | 112 | protected static synchronized void assignArena(@NotNull StaticArenaSign sign){ 113 | sign.setStatus(SignStatus.REFRESHING); 114 | try { 115 | Thread.sleep(1000); 116 | } catch (InterruptedException e) { 117 | e.printStackTrace(); 118 | } 119 | List arenas; 120 | if (SignManager.get().getConfig().getBoolean(ConfigPath.SIGNS_SETTINGS_STATIC_SHOW_PLAYING)){ 121 | arenas = ArenaManager.getArenas().stream().filter(p -> p.getArenaGroup().equals(sign.getGroup())).sorted(ArenaManager.getComparator()) 122 | .filter(p -> p.getStatus() == ArenaStatus.WAITING || p.getStatus() == ArenaStatus.STARTING || p.getStatus() == ArenaStatus.PLAYING).collect(Collectors.toList()); 123 | } else { 124 | arenas = ArenaManager.getArenas().stream().filter(p -> p.getArenaGroup().equals(sign.getGroup())) 125 | .filter(p -> p.getStatus() == ArenaStatus.WAITING || p.getStatus() == ArenaStatus.STARTING).sorted(ArenaManager.getComparator()).collect(Collectors.toList()); 126 | } 127 | if (arenas.isEmpty()) { 128 | sign.setStatus(SignStatus.NO_DATA); 129 | return; 130 | } 131 | 132 | List toRemove = new ArrayList<>(); 133 | for (ArenaSign as : SignManager.get().getArenaSigns()) { 134 | if (as.getAssignedArena() == null) continue; 135 | if (!(as instanceof StaticArenaSign)) continue; 136 | toRemove.add(as.getAssignedArena()); 137 | } 138 | arenas.removeAll(toRemove); 139 | if (arenas.isEmpty()) { 140 | sign.setStatus(SignStatus.NO_DATA); 141 | } else { 142 | sign.assignedArena = arenas.get(0); 143 | sign.setStatus(SignStatus.FOUND); 144 | } 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/command/ParentCommand.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.command; 2 | 3 | import org.bukkit.Location; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandSender; 6 | 7 | import java.util.ArrayList; 8 | import java.util.Arrays; 9 | import java.util.List; 10 | 11 | public abstract class ParentCommand extends Command { 12 | 13 | //List of sub commands 14 | private List subCommands = new ArrayList<>(); 15 | 16 | /** 17 | * Create a new Parent Command 18 | */ 19 | public ParentCommand(String name) { 20 | super(name); 21 | } 22 | 23 | /** 24 | * Manage how to run this parent command 25 | */ 26 | @Override 27 | public boolean execute(CommandSender s, String st, String[] args) { 28 | 29 | //send default message 30 | if (args.length == 0) { 31 | sendDefaultMessage(s); 32 | return true; 33 | } 34 | 35 | //check for sub-commands 36 | for (SubCommand sc : getSubCommands()) { 37 | if (sc.getName().equalsIgnoreCase(args[0])) { 38 | sc.execute(s, Arrays.copyOfRange(args, 1, args.length)); 39 | return true; 40 | } 41 | } 42 | 43 | //send default message if not sub-command was found 44 | sendDefaultMessage(s); 45 | return true; 46 | } 47 | 48 | /** 49 | * Manage parent command tab-complete event. 50 | * If you don't want to show a sub-command on tab-complete consider overriding the hasPermission method 51 | * of the sub-command. So if it is a setup command check if CommandSender is in setup-mode and if he is not 52 | * just return false and it will not be shown. 53 | */ 54 | public List tabComplete(CommandSender s, String alias, String[] args, Location location) throws IllegalArgumentException { 55 | if (args.length == 1) { 56 | List sub = new ArrayList<>(); 57 | for (SubCommand sb : getSubCommands()) { 58 | if (sb.hasPermission(s)) sub.add(sb.getName()); 59 | } 60 | return sub; 61 | } else if (args.length == 2) { 62 | if (hasSubCommand(args[0])) { 63 | return getSubCommand(args[0]).tabComplete(s, alias, args, location); 64 | } 65 | } 66 | return null; 67 | } 68 | 69 | /** 70 | * Add a sub-command to this parent 71 | */ 72 | public void addSubCommand(SubCommand subCommand) { 73 | subCommands.add(subCommand); 74 | } 75 | 76 | /** Remove sub-command */ 77 | public void removeSubCommand(String name){ 78 | SubCommand sc = getSubCommand(name); 79 | if (sc != null) subCommands.remove(sc); 80 | } 81 | 82 | 83 | /** 84 | * This is called when parent command is used without specifying a sub-command 85 | * When parent args length is 0 86 | */ 87 | public abstract void sendDefaultMessage(CommandSender s); 88 | 89 | /** 90 | * Check if command has given sub-command. 91 | * 92 | * @param name search for give name. 93 | */ 94 | public boolean hasSubCommand(String name) { 95 | for (SubCommand sc : getSubCommands()) { 96 | if (sc.getName().equalsIgnoreCase(name)) return true; 97 | } 98 | return false; 99 | } 100 | 101 | /** 102 | * Get command sub-command. 103 | * 104 | * @param name search for given name. 105 | */ 106 | public SubCommand getSubCommand(String name) { 107 | for (SubCommand sc : getSubCommands()) { 108 | if (sc.getName().equalsIgnoreCase(name)) return sc; 109 | } 110 | return null; 111 | } 112 | 113 | /** 114 | * Get sub-commands list 115 | */ 116 | public List getSubCommands() { 117 | return subCommands; 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/command/RejoinCommand.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.command; 2 | 3 | import com.andrei1058.bedwars.proxy.language.LanguageManager; 4 | import com.andrei1058.bedwars.proxy.rejoin.RemoteReJoin; 5 | import com.andrei1058.bedwars.proxy.configuration.SoundsConfig; 6 | import com.andrei1058.bedwars.proxy.language.Language; 7 | import com.andrei1058.bedwars.proxy.api.Messages; 8 | import org.bukkit.command.CommandSender; 9 | import org.bukkit.command.ConsoleCommandSender; 10 | import org.bukkit.command.defaults.BukkitCommand; 11 | import org.bukkit.entity.Player; 12 | 13 | public class RejoinCommand extends BukkitCommand { 14 | 15 | public RejoinCommand(String name) { 16 | super(name); 17 | } 18 | 19 | @Override 20 | public boolean execute(CommandSender s, String st, String[] args) { 21 | if (s instanceof ConsoleCommandSender) { 22 | s.sendMessage("This command is for players!"); 23 | return true; 24 | } 25 | 26 | Player p = (Player) s; 27 | 28 | if (!p.hasPermission("bw.rejoin")) { 29 | p.sendMessage(Language.getMsg(p, Messages.COMMAND_NOT_FOUND_OR_INSUFF_PERMS)); 30 | return true; 31 | } 32 | 33 | com.andrei1058.bedwars.proxy.api.RemoteReJoin rj = RemoteReJoin.getReJoin(p.getUniqueId()); 34 | 35 | if (rj == null) { 36 | p.sendMessage(Language.getMsg(p, Messages.REJOIN_NO_ARENA)); 37 | SoundsConfig.playSound("rejoin-denied", p); 38 | return true; 39 | } 40 | 41 | if (!rj.getArena().reJoin(rj)) { 42 | p.sendMessage(Language.getMsg(p, Messages.REJOIN_DENIED)); 43 | SoundsConfig.playSound("rejoin-denied", p); 44 | return true; 45 | } 46 | 47 | p.sendMessage(Language.getMsg(p, Messages.REJOIN_ALLOWED).replace("{arena}", rj.getArena().getDisplayName(LanguageManager.get().getPlayerLanguage(p)))); 48 | SoundsConfig.playSound("rejoin-allowed", p); 49 | return true; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/command/SubCommand.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.command; 2 | 3 | import org.bukkit.Location; 4 | import org.bukkit.command.CommandSender; 5 | 6 | import java.util.List; 7 | 8 | public abstract class SubCommand { 9 | 10 | private String name; 11 | private String permission; 12 | 13 | /** 14 | * Create a new sub-command. 15 | * Do not forget to add it to a parent. 16 | * 17 | * @param name sub-command name. 18 | * @param permission sub-command permission, leave empty if no permission is required. 19 | */ 20 | public SubCommand(String name, String permission) { 21 | this.name = name; 22 | this.permission = permission; 23 | } 24 | 25 | 26 | /** 27 | * Use this method to specify what your command should do. 28 | */ 29 | public abstract void execute(CommandSender s, String[] args); 30 | 31 | /** 32 | * Manage what to show on sub-command tab-complete. 33 | * If you do not want to shop this sub command in certain cases at mainCommand plus tab, 34 | * consider overriding {@link #hasPermission(CommandSender)} and make it return false when required. 35 | * This method only manages the tab-complete of mainCommand plus subCommand. 36 | */ 37 | public List tabComplete(CommandSender s, String alias, String[] args, Location location) { 38 | return null; 39 | } 40 | 41 | /** 42 | * Check if someone has permission to run this sub-command or if it can appear on tab complete. 43 | */ 44 | public boolean hasPermission(CommandSender s) { 45 | return getPermission().isEmpty() || s.hasPermission(getPermission()); 46 | } 47 | 48 | /** 49 | * Get sub-command name 50 | */ 51 | public String getName() { 52 | return name; 53 | } 54 | 55 | /** 56 | * Get sub-command permission 57 | */ 58 | public String getPermission() { 59 | return permission; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/command/main/JoinCMD.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.command.main; 2 | 3 | import com.andrei1058.bedwars.proxy.arenamanager.ArenaManager; 4 | import com.andrei1058.bedwars.proxy.api.ArenaStatus; 5 | import com.andrei1058.bedwars.proxy.api.CachedArena; 6 | import com.andrei1058.bedwars.proxy.command.SubCommand; 7 | import com.andrei1058.bedwars.proxy.api.Messages; 8 | import org.bukkit.Location; 9 | import org.bukkit.command.CommandSender; 10 | import org.bukkit.command.ConsoleCommandSender; 11 | import org.bukkit.entity.Player; 12 | 13 | import java.util.ArrayList; 14 | import java.util.Comparator; 15 | import java.util.List; 16 | 17 | import static com.andrei1058.bedwars.proxy.BedWarsProxy.getParty; 18 | import static com.andrei1058.bedwars.proxy.language.Language.getMsg; 19 | 20 | public class JoinCMD extends SubCommand { 21 | 22 | public JoinCMD(String name, String permission) { 23 | super(name, permission); 24 | } 25 | 26 | @Override 27 | public void execute(CommandSender s, String[] args) { 28 | if (s instanceof ConsoleCommandSender) return; 29 | Player p = (Player) s; 30 | if (args.length < 1) { 31 | s.sendMessage(getMsg(p, Messages.COMMAND_JOIN_USAGE)); 32 | return; 33 | } 34 | if (args[0].equalsIgnoreCase("random")) { 35 | if (!ArenaManager.getInstance().joinRandomArena(p)) { 36 | s.sendMessage(getMsg(p, Messages.COMMAND_JOIN_NO_EMPTY_FOUND)); 37 | } 38 | return; 39 | } 40 | if (ArenaManager.hasGroup(args[0])) { 41 | ArenaManager.getInstance().joinRandomFromGroup(p, args[0]); 42 | return; 43 | } else { 44 | if (getParty().hasParty(p.getUniqueId()) && !getParty().isOwner(p.getUniqueId())) { 45 | p.sendMessage(getMsg(p, Messages.COMMAND_JOIN_DENIED_NOT_PARTY_LEADER)); 46 | return; 47 | } 48 | ArrayList arenas = new ArrayList<>(); 49 | ArenaManager.getArenas().forEach(a -> { 50 | if (a.getArenaName().contains(args[0])) arenas.add(a); 51 | }); 52 | arenas.removeIf(a -> !(a.getStatus() == ArenaStatus.WAITING || a.getStatus() == ArenaStatus.STARTING)); 53 | arenas.sort(ArenaManager.getComparator()); 54 | if (!arenas.isEmpty()){ 55 | arenas.get(0).addPlayer(p, null); 56 | return; 57 | } 58 | } 59 | s.sendMessage(getMsg(p, Messages.COMMAND_JOIN_GROUP_OR_ARENA_NOT_FOUND).replace("{name}", args[0])); 60 | } 61 | 62 | @Override 63 | public List tabComplete(CommandSender s, String alias, String[] args, Location location) { 64 | List tab = new ArrayList<>(); 65 | for (CachedArena ad : ArenaManager.getArenas()) { 66 | if (!tab.contains(ad.getArenaGroup())) tab.add(ad.getArenaGroup()); 67 | } 68 | for (CachedArena arena : ArenaManager.getArenas()) { 69 | tab.add(arena.getArenaName()); 70 | } 71 | return tab; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/command/main/LangCMD.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.command.main; 2 | 3 | import com.andrei1058.bedwars.proxy.BedWarsProxy; 4 | import com.andrei1058.bedwars.proxy.command.SubCommand; 5 | import com.andrei1058.bedwars.proxy.language.Language; 6 | import com.andrei1058.bedwars.proxy.api.Messages; 7 | import com.andrei1058.bedwars.proxy.language.LanguageManager; 8 | import org.bukkit.Bukkit; 9 | import org.bukkit.Location; 10 | import org.bukkit.command.CommandSender; 11 | import org.bukkit.command.ConsoleCommandSender; 12 | import org.bukkit.entity.Player; 13 | 14 | import java.util.ArrayList; 15 | import java.util.List; 16 | 17 | import static com.andrei1058.bedwars.proxy.language.Language.getMsg; 18 | 19 | public class LangCMD extends SubCommand { 20 | 21 | /** 22 | * Create a new sub-command. 23 | * Do not forget to add it to a parent. 24 | * 25 | * @param name sub-command name. 26 | * @param permission sub-command permission, leave empty if no permission is required. 27 | */ 28 | public LangCMD(String name, String permission) { 29 | super(name, permission); 30 | } 31 | 32 | @Override 33 | public void execute(CommandSender s, String[] args) { 34 | if (s instanceof ConsoleCommandSender) return; 35 | Player p = (Player) s; 36 | if (!hasPermission(p)){ 37 | p.sendMessage(getMsg(p, Messages.COMMAND_NOT_FOUND_OR_INSUFF_PERMS)); 38 | return; 39 | } 40 | 41 | if (args.length == 0) { 42 | p.sendMessage(getMsg(p, Messages.COMMAND_LANG_LIST_HEADER)); 43 | for (com.andrei1058.bedwars.proxy.api.Language l : LanguageManager.get().getLanguages()) { 44 | p.sendMessage(getMsg(p, Messages.COMMAND_LANG_LIST_FORMAT).replace("{iso}", l.getIso()).replace("{name}", l.getLangName())); 45 | } 46 | p.sendMessage(getMsg(p, Messages.COMMAND_LANG_USAGE)); 47 | return; 48 | } else if (LanguageManager.get().isLanguageExist(args[0])) { 49 | LanguageManager.get().setPlayerLanguage(p, args[0], false); 50 | Bukkit.getScheduler().runTaskLater(BedWarsProxy.getPlugin(), () -> p.sendMessage(getMsg(p, Messages.COMMAND_LANG_SELECTED_SUCCESSFULLY)), 10L); 51 | } else { 52 | p.sendMessage(getMsg(p, Messages.COMMAND_LANG_SELECTED_NOT_EXIST)); 53 | } 54 | } 55 | 56 | @Override 57 | public List tabComplete(CommandSender s, String alias, String[] args, Location location) { 58 | List tab = new ArrayList<>(); 59 | for (com.andrei1058.bedwars.proxy.api.Language lang : LanguageManager.get().getLanguages()) { 60 | tab.add(lang.getIso()); 61 | } 62 | return tab; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/command/main/MainCommand.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.command.main; 2 | 3 | import com.andrei1058.bedwars.proxy.command.ParentCommand; 4 | import com.andrei1058.bedwars.proxy.BedWarsProxy; 5 | import com.andrei1058.bedwars.proxy.language.Language; 6 | import com.andrei1058.bedwars.proxy.api.Messages; 7 | import org.bukkit.command.CommandSender; 8 | import org.bukkit.command.ConsoleCommandSender; 9 | import org.bukkit.entity.Player; 10 | 11 | import java.util.Arrays; 12 | 13 | public class MainCommand extends ParentCommand { 14 | 15 | private static MainCommand instance; 16 | 17 | /** 18 | * Create a new Parent Command 19 | * 20 | * @param name 21 | */ 22 | public MainCommand(String name) { 23 | super(name); 24 | instance = this; 25 | setAliases(Arrays.asList("bedwars")); 26 | addSubCommand(new SelectorCMD("gui", "")); 27 | addSubCommand(new LangCMD("lang", "")); 28 | addSubCommand(new LangCMD("language", "")); 29 | addSubCommand(new JoinCMD("join", "")); 30 | addSubCommand(new ReJoinCMD("rejoin", "bw.rejoin")); 31 | addSubCommand(new TpCommand("tp", "bw.tp")); 32 | } 33 | 34 | @Override 35 | public void sendDefaultMessage(CommandSender s) { 36 | if (s instanceof ConsoleCommandSender) return; 37 | Player p = (Player) s; 38 | 39 | s.sendMessage(" "); 40 | s.sendMessage("§8§l|-" + " §6" + BedWarsProxy.getPlugin().getDescription().getName() + " v" + BedWarsProxy.getPlugin().getDescription().getVersion() + " §7- §cCommands"); 41 | s.sendMessage(" "); 42 | if (hasSubCommand("gui")) { 43 | p.spigot().sendMessage(BedWarsProxy.createTC(Language.getMsg(p, Messages.COMMAND_GUI_DISPLAY), "/bw gui", Language.getMsg(p, Messages.COMMAND_GUI_HOVER))); 44 | } 45 | if (hasSubCommand("lang")) { 46 | p.spigot().sendMessage(BedWarsProxy.createTC(Language.getMsg(p, Messages.COMMAND_LANGUAGE_DISPLAY), "/bw lang", Language.getMsg(p, Messages.COMMAND_LANGUAGE_HOVER))); 47 | } 48 | if (hasSubCommand("rejoin")) { 49 | p.spigot().sendMessage(BedWarsProxy.createTC(Language.getMsg(p, Messages.COMMAND_REJOIN_DISPLAY), "/bw rejoin", Language.getMsg(p, Messages.COMMAND_REJOIN_HOVER))); 50 | } 51 | if (hasSubCommand("tp") && getSubCommand("tp").hasPermission(s)) { 52 | p.spigot().sendMessage(BedWarsProxy.createTC(Language.getMsg(p, Messages.COMMAND_TP_DISPLAY), "/bw tp", Language.getMsg(p, Messages.COMMAND_TP_HOVER))); 53 | } 54 | } 55 | 56 | public static MainCommand getInstance() { 57 | return instance; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/command/main/ReJoinCMD.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.command.main; 2 | 3 | import com.andrei1058.bedwars.proxy.language.LanguageManager; 4 | import com.andrei1058.bedwars.proxy.rejoin.RemoteReJoin; 5 | import com.andrei1058.bedwars.proxy.command.SubCommand; 6 | import com.andrei1058.bedwars.proxy.configuration.SoundsConfig; 7 | import com.andrei1058.bedwars.proxy.language.Language; 8 | import com.andrei1058.bedwars.proxy.api.Messages; 9 | import org.bukkit.command.CommandSender; 10 | import org.bukkit.command.ConsoleCommandSender; 11 | import org.bukkit.entity.Player; 12 | 13 | public class ReJoinCMD extends SubCommand { 14 | 15 | public ReJoinCMD(String name, String permission) { 16 | super(name, permission); 17 | } 18 | 19 | @Override 20 | public void execute(CommandSender s, String[] args) { 21 | if (s instanceof ConsoleCommandSender) { 22 | s.sendMessage("This command is for players!"); 23 | return; 24 | } 25 | 26 | Player p = (Player) s; 27 | 28 | if (!p.hasPermission("bw.rejoin")) { 29 | p.sendMessage(Language.getMsg(p, Messages.COMMAND_NOT_FOUND_OR_INSUFF_PERMS)); 30 | return; 31 | } 32 | 33 | com.andrei1058.bedwars.proxy.api.RemoteReJoin rj = RemoteReJoin.getReJoin(p.getUniqueId()); 34 | 35 | if (rj == null) { 36 | p.sendMessage(Language.getMsg(p, Messages.REJOIN_NO_ARENA)); 37 | SoundsConfig.playSound("rejoin-denied", p); 38 | return; 39 | } 40 | 41 | if (!rj.getArena().reJoin(rj)) { 42 | p.sendMessage(Language.getMsg(p, Messages.REJOIN_DENIED)); 43 | SoundsConfig.playSound("rejoin-denied", p); 44 | return; 45 | } 46 | 47 | p.sendMessage(Language.getMsg(p, Messages.REJOIN_ALLOWED).replace("{arena}", rj.getArena().getDisplayName(LanguageManager.get().getPlayerLanguage(p)))); 48 | SoundsConfig.playSound("rejoin-allowed", p); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/command/main/SelectorCMD.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.command.main; 2 | 3 | import com.andrei1058.bedwars.proxy.arenamanager.ArenaGUI; 4 | import com.andrei1058.bedwars.proxy.command.SubCommand; 5 | import org.bukkit.command.CommandSender; 6 | import org.bukkit.command.ConsoleCommandSender; 7 | import org.bukkit.entity.Player; 8 | 9 | public class SelectorCMD extends SubCommand { 10 | /** 11 | * Create a new sub-command. 12 | * Do not forget to add it to a parent. 13 | * 14 | * @param name sub-command name. 15 | * @param permission sub-command permission, leave empty if no permission is required. 16 | */ 17 | public SelectorCMD(String name, String permission) { 18 | super(name, permission); 19 | } 20 | 21 | @Override 22 | public void execute(CommandSender s, String[] args) { 23 | if (s instanceof ConsoleCommandSender) return; 24 | Player p = (Player) s; 25 | 26 | String group = "default"; 27 | 28 | if (args.length == 1) { 29 | group = args[0]; 30 | } 31 | 32 | ArenaGUI.openGui(p, group); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/command/main/TpCommand.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.command.main; 2 | 3 | import com.andrei1058.bedwars.proxy.command.SubCommand; 4 | import com.andrei1058.bedwars.proxy.BedWarsProxy; 5 | import com.andrei1058.bedwars.proxy.api.ArenaStatus; 6 | import com.andrei1058.bedwars.proxy.arenamanager.TpRequest; 7 | import com.andrei1058.bedwars.proxy.language.Language; 8 | import com.andrei1058.bedwars.proxy.api.Messages; 9 | import org.bukkit.Bukkit; 10 | import org.bukkit.command.CommandSender; 11 | import org.bukkit.command.ConsoleCommandSender; 12 | import org.bukkit.entity.Player; 13 | 14 | public class TpCommand extends SubCommand { 15 | 16 | 17 | public TpCommand(String name, String permission) { 18 | super(name, permission); 19 | } 20 | 21 | @Override 22 | public void execute(CommandSender s, String[] args) { 23 | if (s instanceof ConsoleCommandSender) { 24 | s.sendMessage("This command is for players!"); 25 | return; 26 | } 27 | 28 | Player p = (Player) s; 29 | 30 | if (!p.hasPermission("bw.tp")) { 31 | p.sendMessage(Language.getMsg(p, Messages.COMMAND_NOT_FOUND_OR_INSUFF_PERMS)); 32 | return; 33 | } 34 | 35 | if (args.length != 1) { 36 | p.sendMessage(Language.getMsg((Player) s, Messages.COMMAND_TP_USAGE)); 37 | return; 38 | } 39 | 40 | TpRequest tr = TpRequest.getTpRequest(((Player) s).getUniqueId()); 41 | if (tr == null) { 42 | tr = new TpRequest(((Player) s).getUniqueId(), args[0]); 43 | } else return; 44 | 45 | TpRequest finalTr = tr; Player pl = (Player) s; 46 | Bukkit.getScheduler().runTaskLater(BedWarsProxy.getPlugin(), () -> { 47 | if (pl.isOnline()){ 48 | if (finalTr.getArena() == null){ 49 | pl.sendMessage(Language.getMsg(pl, Messages.COMMAND_TP_NOT_FOUND).replace("{player}", finalTr.getTarget())); 50 | } else { 51 | if (finalTr.getArena().getStatus() != ArenaStatus.PLAYING){ 52 | pl.sendMessage(Language.getMsg(pl, Messages.COMMAND_TP_FAIL2).replace("{player}", 53 | finalTr.getTarget()).replace("{server}", finalTr.getArena().getServer())); 54 | } else { 55 | finalTr.getArena().addSpectator(pl, finalTr.getTarget()); 56 | } 57 | } 58 | } 59 | }, 45L); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/command/party/AcceptCMD.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.command.party; 2 | 3 | import com.andrei1058.bedwars.proxy.command.SubCommand; 4 | import com.andrei1058.bedwars.proxy.api.Messages; 5 | import org.bukkit.Bukkit; 6 | import org.bukkit.command.CommandSender; 7 | import org.bukkit.entity.Player; 8 | 9 | import java.util.UUID; 10 | 11 | import static com.andrei1058.bedwars.proxy.BedWarsProxy.getParty; 12 | import static com.andrei1058.bedwars.proxy.language.Language.getMsg; 13 | 14 | public class AcceptCMD extends SubCommand { 15 | 16 | public AcceptCMD(String name, String permission) { 17 | super(name, permission); 18 | } 19 | 20 | @Override 21 | public void execute(CommandSender s, String[] args) { 22 | if (!(s instanceof Player)) return; 23 | Player p = (Player) s; 24 | if (args.length < 1) { 25 | return; 26 | } 27 | if (getParty().hasParty(p.getUniqueId())) { 28 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_ACCEPT_DENIED_ALREADY_IN_PARTY)); 29 | return; 30 | } 31 | if (Bukkit.getPlayer(args[0]) == null || !Bukkit.getPlayer(args[0]).isOnline()) { 32 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_INVITE_DENIED_PLAYER_OFFLINE).replace("{player}", args[0])); 33 | return; 34 | } 35 | if (!PartyCommand.getPartySessionRequest().containsKey(Bukkit.getPlayer(args[0]).getUniqueId())) { 36 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_ACCEPT_DENIED_NO_INVITE)); 37 | return; 38 | } 39 | if (PartyCommand.getPartySessionRequest().get(Bukkit.getPlayer(args[0]).getUniqueId()).toString().equalsIgnoreCase(p.getUniqueId().toString())) { 40 | PartyCommand.getPartySessionRequest().remove(Bukkit.getPlayer(args[0]).getUniqueId()); 41 | if (getParty().hasParty(Bukkit.getPlayer(args[0]).getUniqueId())) { 42 | getParty().addMember(Bukkit.getPlayer(args[0]).getUniqueId(), p); 43 | Player pl; 44 | for (UUID on : getParty().getMembers(Bukkit.getPlayer(args[0]).getUniqueId())) { 45 | pl = Bukkit.getPlayer(on); 46 | if (pl == null) continue; 47 | pl.sendMessage(getMsg(p, Messages.COMMAND_PARTY_ACCEPT_SUCCESS).replace("{player}", p.getName())); 48 | } 49 | } else { 50 | getParty().createParty(Bukkit.getPlayer(args[0]), p); 51 | Player pl; 52 | for (UUID on : getParty().getMembers(Bukkit.getPlayer(args[0]).getUniqueId())) { 53 | pl = Bukkit.getPlayer(on); 54 | if (pl == null) continue; 55 | pl.sendMessage(getMsg(p, Messages.COMMAND_PARTY_ACCEPT_SUCCESS).replace("{player}", p.getName())); 56 | } 57 | } 58 | } else { 59 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_ACCEPT_DENIED_NO_INVITE)); 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/command/party/DisbandCMD.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.command.party; 2 | 3 | import com.andrei1058.bedwars.proxy.command.SubCommand; 4 | import com.andrei1058.bedwars.proxy.api.Messages; 5 | import org.bukkit.command.CommandSender; 6 | import org.bukkit.entity.Player; 7 | 8 | import static com.andrei1058.bedwars.proxy.BedWarsProxy.getParty; 9 | import static com.andrei1058.bedwars.proxy.language.Language.getMsg; 10 | 11 | public class DisbandCMD extends SubCommand { 12 | 13 | public DisbandCMD(String name, String permission) { 14 | super(name, permission); 15 | } 16 | 17 | @Override 18 | public void execute(CommandSender s, String[] args) { 19 | if (!(s instanceof Player)) return; 20 | Player p = (Player) s; 21 | 22 | if (!getParty().hasParty(p.getUniqueId())) { 23 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_GENERAL_DENIED_NOT_IN_PARTY)); 24 | return; 25 | } 26 | if (!getParty().isOwner(p.getUniqueId())) { 27 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_INSUFFICIENT_PERMISSIONS)); 28 | return; 29 | } 30 | getParty().disband(p.getUniqueId()); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/command/party/InviteCMD.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.command.party; 2 | 3 | import com.andrei1058.bedwars.proxy.command.SubCommand; 4 | import com.andrei1058.bedwars.proxy.api.Messages; 5 | import com.google.common.collect.ImmutableList; 6 | import net.md_5.bungee.api.chat.ClickEvent; 7 | import net.md_5.bungee.api.chat.TextComponent; 8 | import org.bukkit.Bukkit; 9 | import org.bukkit.Location; 10 | import org.bukkit.command.CommandSender; 11 | import org.bukkit.entity.Player; 12 | import org.bukkit.util.StringUtil; 13 | 14 | import java.util.ArrayList; 15 | import java.util.Collections; 16 | import java.util.Iterator; 17 | import java.util.List; 18 | 19 | import static com.andrei1058.bedwars.proxy.BedWarsProxy.getParty; 20 | import static com.andrei1058.bedwars.proxy.language.Language.getMsg; 21 | 22 | public class InviteCMD extends SubCommand { 23 | 24 | public InviteCMD(String name, String permission) { 25 | super(name, permission); 26 | } 27 | 28 | @Override 29 | public void execute(CommandSender s, String[] args) { 30 | if (!(s instanceof Player)) return; 31 | Player p = (Player) s; 32 | if (args.length == 0) { 33 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_INVITE_USAGE)); 34 | return; 35 | } 36 | if (getParty().hasParty(p.getUniqueId()) && !getParty().isOwner(p.getUniqueId())) { 37 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_INSUFFICIENT_PERMISSIONS)); 38 | return; 39 | } 40 | if (Bukkit.getPlayer(args[0]) != null && Bukkit.getPlayer(args[0]).isOnline()) { 41 | if (p == Bukkit.getPlayer(args[0])) { 42 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_INVITE_DENIED_CANNOT_INVITE_YOURSELF)); 43 | return; 44 | } 45 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_INVITE_SENT).replace("{player}", args[0])); 46 | TextComponent tc = new TextComponent(getMsg(p, Messages.COMMAND_PARTY_INVITE_SENT_TARGET_RECEIVE_MSG).replace("{player}", p.getName())); 47 | tc.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/party accept " + p.getName())); 48 | Bukkit.getPlayer(args[0]).spigot().sendMessage(tc); 49 | if (PartyCommand.getPartySessionRequest().containsKey(p.getUniqueId())) { 50 | PartyCommand.getPartySessionRequest().replace(p.getUniqueId(), Bukkit.getPlayer(args[0]).getUniqueId()); 51 | } else { 52 | PartyCommand.getPartySessionRequest().put(p.getUniqueId(), Bukkit.getPlayer(args[0]).getUniqueId()); 53 | } 54 | } else { 55 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_INVITE_DENIED_PLAYER_OFFLINE).replace("{player}", args[0])); 56 | } 57 | } 58 | 59 | @Override 60 | public List tabComplete(CommandSender s, String alias, String[] args, Location location) { 61 | if (args.length == 0) { 62 | return ImmutableList.of(); 63 | } else { 64 | String lastWord = args[args.length - 1]; 65 | Player senderPlayer = s instanceof Player ? (Player)s : null; 66 | ArrayList matchedPlayers = new ArrayList(); 67 | Iterator var8 = s.getServer().getOnlinePlayers().iterator(); 68 | 69 | while(true) { 70 | Player player; 71 | String name; 72 | do { 73 | if (!var8.hasNext()) { 74 | Collections.sort(matchedPlayers, String.CASE_INSENSITIVE_ORDER); 75 | return matchedPlayers; 76 | } 77 | 78 | player = (Player)var8.next(); 79 | name = player.getName(); 80 | } while(senderPlayer != null && !senderPlayer.canSee(player)); 81 | 82 | if (StringUtil.startsWithIgnoreCase(name, lastWord)) { 83 | matchedPlayers.add(name); 84 | } 85 | } 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/command/party/LeaveCMD.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.command.party; 2 | 3 | import com.andrei1058.bedwars.proxy.command.SubCommand; 4 | import com.andrei1058.bedwars.proxy.api.Messages; 5 | import org.bukkit.command.CommandSender; 6 | import org.bukkit.entity.Player; 7 | 8 | import static com.andrei1058.bedwars.proxy.BedWarsProxy.getParty; 9 | import static com.andrei1058.bedwars.proxy.language.Language.getMsg; 10 | 11 | public class LeaveCMD extends SubCommand { 12 | 13 | public LeaveCMD(String name, String permission) { 14 | super(name, permission); 15 | } 16 | 17 | @Override 18 | public void execute(CommandSender s, String[] args) { 19 | if (!(s instanceof Player)) return; 20 | Player p = (Player) s; 21 | if (!getParty().hasParty(p.getUniqueId())) { 22 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_GENERAL_DENIED_NOT_IN_PARTY)); 23 | return; 24 | } 25 | if (getParty().isOwner(p.getUniqueId())) { 26 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_LEAVE_DENIED_IS_OWNER_NEEDS_DISBAND)); 27 | return; 28 | } 29 | getParty().removeFromParty(p.getUniqueId()); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/command/party/PartyCommand.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.command.party; 2 | 3 | import com.andrei1058.bedwars.proxy.command.ParentCommand; 4 | import com.andrei1058.bedwars.proxy.api.Messages; 5 | import com.andrei1058.bedwars.proxy.language.LanguageManager; 6 | import org.bukkit.command.CommandSender; 7 | import org.bukkit.command.ConsoleCommandSender; 8 | import org.bukkit.entity.Player; 9 | 10 | import java.util.HashMap; 11 | import java.util.UUID; 12 | 13 | public class PartyCommand extends ParentCommand { 14 | 15 | public PartyCommand(String name) { 16 | super(name); 17 | addSubCommand(new InviteCMD("invite", "")); 18 | addSubCommand(new AcceptCMD("accept", "")); 19 | addSubCommand(new LeaveCMD("leave", "")); 20 | addSubCommand(new DisbandCMD("disband", "")); 21 | addSubCommand(new RemoveCMD("remove", "")); 22 | } 23 | 24 | //owner, target 25 | private static HashMap partySessionRequest = new HashMap<>(); 26 | 27 | @Override 28 | public void sendDefaultMessage(CommandSender s) { 29 | if (s instanceof ConsoleCommandSender) return; 30 | Player p = (Player) s; 31 | for (String st : LanguageManager.get().getList(p, Messages.COMMAND_PARTY_HELP)) { 32 | p.sendMessage(st); 33 | } 34 | } 35 | 36 | /** 37 | * Get list of requests. 38 | */ 39 | public static HashMap getPartySessionRequest() { 40 | return partySessionRequest; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/command/party/RemoveCMD.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.command.party; 2 | 3 | import com.andrei1058.bedwars.proxy.command.SubCommand; 4 | import com.andrei1058.bedwars.proxy.api.Messages; 5 | import org.bukkit.Bukkit; 6 | import org.bukkit.command.CommandSender; 7 | import org.bukkit.entity.Player; 8 | 9 | import static com.andrei1058.bedwars.proxy.BedWarsProxy.getParty; 10 | import static com.andrei1058.bedwars.proxy.language.Language.getMsg; 11 | 12 | public class RemoveCMD extends SubCommand { 13 | 14 | public RemoveCMD(String name, String permission) { 15 | super(name, permission); 16 | } 17 | 18 | @Override 19 | public void execute(CommandSender s, String[] args) { 20 | if (!(s instanceof Player)) return; 21 | Player p = (Player) s; 22 | 23 | if (args.length == 0) { 24 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_REMOVE_USAGE)); 25 | return; 26 | } 27 | if (getParty().hasParty(p.getUniqueId()) && !getParty().isOwner(p.getUniqueId())) { 28 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_INSUFFICIENT_PERMISSIONS)); 29 | return; 30 | } 31 | Player target = Bukkit.getPlayer(args[0]); 32 | if (target == null) { 33 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_REMOVE_DENIED_TARGET_NOT_PARTY_MEMBER).replace("{player}", args[0])); 34 | return; 35 | } 36 | if (!getParty().isMember(p.getUniqueId(), target.getUniqueId())) { 37 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_REMOVE_DENIED_TARGET_NOT_PARTY_MEMBER).replace("{player}", args[0])); 38 | return; 39 | } 40 | getParty().removePlayer(p.getUniqueId(), target.getUniqueId()); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/configuration/BedWarsConfig.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.configuration; 2 | 3 | import com.andrei1058.bedwars.proxy.language.English; 4 | import com.andrei1058.bedwars.proxy.language.Language; 5 | import com.andrei1058.bedwars.proxy.BedWarsProxy; 6 | import com.andrei1058.bedwars.proxy.language.LanguageManager; 7 | import org.bukkit.configuration.file.YamlConfiguration; 8 | 9 | import java.io.File; 10 | import java.util.Collections; 11 | 12 | public class BedWarsConfig extends PluginConfig { 13 | 14 | public BedWarsConfig() { 15 | super(BedWarsProxy.getPlugin(), "config", BedWarsProxy.getPlugin().getDataFolder().getPath()); 16 | 17 | YamlConfiguration yml = getYml(); 18 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_PORT, 2019); 19 | yml.addDefault("language", "en"); 20 | yml.addDefault(ConfigPath.GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_SERVER_IP, "yourServer.com"); 21 | yml.addDefault("storeLink", "https://www.spigotmc.org/resources/authors/39904/"); 22 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_ALLOW_PARTIES, true); 23 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_RANDOMARENAS, true); 24 | yml.addDefault("database.enable", false); 25 | yml.addDefault("database.host", "localhost"); 26 | yml.addDefault("database.database", "bedWars"); 27 | yml.addDefault("database.user", "root"); 28 | yml.addDefault("database.pass", ""); 29 | yml.addDefault("database.port", 3306); 30 | yml.addDefault("database.ssl", false); 31 | yml.options().copyDefaults(true); 32 | 33 | yml.addDefault("levels-settings.default-name", "&7[{number}✩] "); 34 | yml.addDefault("levels-settings.progress-bar-symbol", "■"); 35 | yml.addDefault("levels-settings.progress-bar-unlocked-color", "&b"); 36 | yml.addDefault("levels-settings.progress-bar-locked-color", "&7"); 37 | yml.addDefault("levels-settings.progress-bar-format", "&8 [{progress}&8]"); 38 | yml.addDefault(ConfigPath.GENERAL_ENABLE_PARTY_CMD, true); 39 | 40 | //saveLobbyCommandItem("stats", "bw stats", false, String.valueOf(BedWarsProxy.getMaterialAdapter().getForCurrent("SKULL_ITEM", "SKULL_ITEM", "PLAYER_HEAD")), 3, 0); 41 | //saveLobbyCommandItem("arena-selector", "bw gui", true, "CHEST", 5, 4); 42 | //saveLobbyCommandItem("leave", "bw leave", false, String.valueOf(BedWarsProxy.getMaterialAdapter().getForCurrent("BED", "BED", "RED_BED")), 0, 8); 43 | 44 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_DISABLED_LANGUAGES, Collections.singletonList("your language iso here")); 45 | 46 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_SETTINGS_SIZE, 45); 47 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_SETTINGS_SHOW_PLAYING, true); 48 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_SETTINGS_USE_SLOTS, "10,11,12,13,14,15,16,19,20,21,22,23,24,25,28,29,30,31,32,33,34"); 49 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_MATERIAL.replace("%path%", "waiting"), "DIAMOND_BLOCK"); 50 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_DATA.replace("%path%", "waiting"), 0); 51 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_ENCHANTED.replace("%path%", "waiting"), false); 52 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_MATERIAL.replace("%path%", "starting"), "GOLD_BLOCK"); 53 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_DATA.replace("%path%", "starting"), 0); 54 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_ENCHANTED.replace("%path%", "starting"), true); 55 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_MATERIAL.replace("%path%", "playing"), "REDSTONE_BLOCK"); 56 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_DATA.replace("%path%", "playing"), 0); 57 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_ENCHANTED.replace("%path%", "playing"), false); 58 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_MATERIAL.replace("%path%", "skipped-slot"), String.valueOf(BedWarsProxy.getMaterialAdapter().getForCurrent("STAINED_GLASS_PANE", "STAINED_GLASS_PANE", "BLACK_STAINED_GLASS_PANE"))); 59 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_DATA.replace("%path%", "skipped-slot"), 7); 60 | yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_ENCHANTED.replace("%path%", "skipped-slot"), false); 61 | 62 | save(); 63 | 64 | //set default server language 65 | String whatLang = "en"; 66 | new English(); 67 | File[] langs = new File("plugins/" + BedWarsProxy.getPlugin().getDescription().getName() + "/Languages").listFiles(); 68 | if (langs != null) { 69 | for (File f : langs) { 70 | if (f.isFile()) { 71 | if (f.getName().startsWith("messages_") && f.getName().endsWith(".yml")) { 72 | String lang = f.getName().replace("messages_", "").replace(".yml", ""); 73 | if (lang.equalsIgnoreCase(yml.getString("language"))) { 74 | whatLang = f.getName().replace("messages_", "").replace(".yml", ""); 75 | } 76 | if (LanguageManager.get().getLang(lang) == null) new Language(BedWarsProxy.getPlugin(), lang); 77 | } 78 | } 79 | } 80 | } 81 | com.andrei1058.bedwars.proxy.api.Language def = LanguageManager.get().getLang(whatLang); 82 | 83 | if (def == null) throw new IllegalStateException("Could not found default language: " + whatLang); 84 | LanguageManager.get().setDefaultLanguage(def); 85 | 86 | //remove languages if disabled 87 | //server language can t be disabled 88 | for (String iso : yml.getStringList(ConfigPath.GENERAL_CONFIGURATION_DISABLED_LANGUAGES)) { 89 | com.andrei1058.bedwars.proxy.api.Language l = LanguageManager.get().getLang(iso); 90 | if (l != null) { 91 | if (l != def) LanguageManager.get().getLanguages().remove(l); 92 | } 93 | } 94 | // 95 | } 96 | 97 | /* 98 | * Add Lobby Command Item To 99 | * This won't create the item back if you delete it. 100 | */ 101 | /*public void saveLobbyCommandItem(String name, String cmd, boolean enchanted, String material, int data, int slot) { 102 | if (isFirstTime()) { 103 | getYml().addDefault(ConfigPath.GENERAL_CONFIGURATION_LOBBY_ITEMS_COMMAND.replace("%path%", name), cmd); 104 | getYml().addDefault(ConfigPath.GENERAL_CONFIGURATION_LOBBY_ITEMS_MATERIAL.replace("%path%", name), material); 105 | getYml().addDefault(ConfigPath.GENERAL_CONFIGURATION_LOBBY_ITEMS_DATA.replace("%path%", name), data); 106 | getYml().addDefault(ConfigPath.GENERAL_CONFIGURATION_LOBBY_ITEMS_ENCHANTED.replace("%path%", name), enchanted); 107 | getYml().addDefault(ConfigPath.GENERAL_CONFIGURATION_LOBBY_ITEMS_SLOT.replace("%path%", name), slot); 108 | getYml().options().copyDefaults(true); 109 | save(); 110 | } 111 | }*/ 112 | 113 | /*public String getLobbyWorldName() { 114 | if (getYml().get("lobbyLoc") == null) return ""; 115 | String d = getYml().getString("lobbyLoc"); 116 | if (d == null) return ""; 117 | String[] data = d.replace("[", "").replace("]", "").split(","); 118 | return data[data.length - 1]; 119 | }*/ 120 | } 121 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/configuration/ConfigPath.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.configuration; 2 | 3 | public class ConfigPath { 4 | 5 | public static final String GENERAL_CONFIGURATION_DISABLED_LANGUAGES = "disabled-languages"; 6 | public static final String GENERAL_CONFIGURATION_PORT = "port"; 7 | public static final String GENERAL_ENABLE_PARTY_CMD = "enable-party-cmd"; 8 | 9 | public static final String GENERAL_CONFIGURATION_ALLOW_PARTIES = "allow-parties"; 10 | public static final String GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_SERVER_IP = "server-ip"; 11 | public static final String GENERAL_CONFIGURATION_RANDOMARENAS = "random-selection"; 12 | 13 | public static final String GENERAL_CONFIGURATION_ARENA_SELECTOR_PATH = "arena-gui"; 14 | public static final String GENERAL_CONFIGURATION_ARENA_SELECTOR_SETTINGS_SIZE = GENERAL_CONFIGURATION_ARENA_SELECTOR_PATH + ".settings.inv-size"; 15 | public static final String GENERAL_CONFIGURATION_ARENA_SELECTOR_SETTINGS_SHOW_PLAYING = GENERAL_CONFIGURATION_ARENA_SELECTOR_PATH + ".settings.show-playing"; 16 | public static final String GENERAL_CONFIGURATION_ARENA_SELECTOR_SETTINGS_USE_SLOTS = GENERAL_CONFIGURATION_ARENA_SELECTOR_PATH + ".settings.use-slots"; 17 | public static final String GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_MATERIAL = GENERAL_CONFIGURATION_ARENA_SELECTOR_PATH + ".%path%.material"; 18 | public static final String GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_DATA = GENERAL_CONFIGURATION_ARENA_SELECTOR_PATH + ".%path%.data"; 19 | public static final String GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_ENCHANTED = GENERAL_CONFIGURATION_ARENA_SELECTOR_PATH + ".%path%.enchanted"; 20 | 21 | public static final String SIGNS_LIST_PATH = "signs-list"; 22 | public static final String SIGNS_SETTINGS_STATIC_SHOW_PLAYING = "signs-settings.static-signs.show-playing"; 23 | } 24 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/configuration/PluginConfig.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.configuration; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.Location; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | import org.bukkit.plugin.Plugin; 7 | 8 | import java.io.File; 9 | import java.io.IOException; 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | import java.util.logging.Level; 13 | import java.util.stream.Collectors; 14 | 15 | public class PluginConfig { 16 | 17 | private YamlConfiguration yml; 18 | private File config; 19 | private String name; 20 | private boolean firstTime = false; 21 | 22 | /** 23 | * Create a new configuration file. 24 | * 25 | * @param plugin config owner. 26 | * @param name config name. Do not include .yml in it. 27 | */ 28 | public PluginConfig(Plugin plugin, String name, String dir) { 29 | File d = new File(dir); 30 | if (!d.exists()) { 31 | if (!d.mkdirs()) { 32 | plugin.getLogger().log(Level.SEVERE, "Could not create " + d.getPath()); 33 | return; 34 | } 35 | } 36 | 37 | config = new File(dir, name + ".yml"); 38 | if (!config.exists()) { 39 | firstTime = true; 40 | plugin.getLogger().log(Level.INFO, "Creating " + config.getPath()); 41 | try { 42 | if (!config.createNewFile()) { 43 | plugin.getLogger().log(Level.SEVERE, "Could not create " + config.getPath()); 44 | return; 45 | } 46 | } catch (IOException e) { 47 | e.printStackTrace(); 48 | } 49 | } 50 | 51 | yml = YamlConfiguration.loadConfiguration(config); 52 | yml.options().copyDefaults(true); 53 | this.name = name; 54 | } 55 | 56 | /** 57 | * Reload configuration. 58 | */ 59 | public void reload() { 60 | yml = YamlConfiguration.loadConfiguration(config); 61 | } 62 | 63 | /** 64 | * Convert a location to an arena location syntax 65 | */ 66 | public String stringLocationArenaFormat(Location loc) { 67 | return loc.getX() + "," + loc.getY() + "," + loc.getZ() + "," + (double) loc.getYaw() + "," + (double) loc.getPitch(); 68 | } 69 | 70 | /** 71 | * Convert a location to a string for general use 72 | * Use {@link #stringLocationArenaFormat(Location)} for arena locations 73 | */ 74 | public String stringLocationConfigFormat(Location loc) { 75 | return loc.getBlockX() + "," + loc.getBlockY() + "," + loc.getBlockZ() + "," + (double) loc.getYaw() + "," + (double) loc.getPitch() + "," + loc.getWorld().getName(); 76 | } 77 | 78 | /** 79 | * Save a general location to the config. 80 | * Use {@link #saveArenaLoc(String, Location)} for arena locations 81 | */ 82 | public void saveConfigLoc(String path, Location loc) { 83 | String data = loc.getX() + "," + loc.getY() + "," + loc.getZ() + "," + (double) loc.getYaw() + "," + (double) loc.getPitch() + "," + loc.getWorld().getName(); 84 | yml.set(path, data); 85 | save(); 86 | } 87 | 88 | /** 89 | * Save a location for arena use 90 | */ 91 | public void saveArenaLoc(String path, Location loc) { 92 | String data = loc.getX() + "," + loc.getY() + "," + loc.getZ() + "," + (double) loc.getYaw() + "," + (double) loc.getPitch(); 93 | yml.set(path, data); 94 | save(); 95 | } 96 | 97 | /** 98 | * Get a general location 99 | * Use {@link #getArenaLoc(String)} for locations stored using {@link #saveArenaLoc(String, Location)} 100 | */ 101 | public Location getConfigLoc(String path) { 102 | String d = yml.getString(path); 103 | if (d == null) return null; 104 | String[] data = d.replace("[", "").replace("]", "").split(","); 105 | return new Location(Bukkit.getWorld(data[5]), Double.parseDouble(data[0]), Double.parseDouble(data[1]), Double.parseDouble(data[2]), Float.parseFloat(data[3]), Float.parseFloat(data[4])); 106 | } 107 | 108 | /** 109 | * Get a location for arena use 110 | * Use {@link #getConfigLoc(String)} (String)} for locations stored using {@link #saveConfigLoc(String, Location)} (String, Location)} 111 | */ 112 | public Location getArenaLoc(String path) { 113 | String d = yml.getString(path); 114 | if (d == null) return null; 115 | String[] data = d.replace("[", "").replace("]", "").split(","); 116 | return new Location(Bukkit.getWorld(name), Double.parseDouble(data[0]), Double.parseDouble(data[1]), Double.parseDouble(data[2]), Float.parseFloat(data[3]), Float.parseFloat(data[4])); 117 | } 118 | 119 | /** 120 | * Convert string to arena location syntax 121 | */ 122 | public Location convertStringToArenaLocation(String string) { 123 | String[] data = string.split(","); 124 | return new Location(Bukkit.getWorld(name), Double.parseDouble(data[0]), Double.parseDouble(data[1]), Double.parseDouble(data[2]), Float.parseFloat(data[3]), Float.parseFloat(data[4])); 125 | 126 | } 127 | 128 | /** 129 | * Get list of arena locations at given path 130 | */ 131 | public List getArenaLocations(String path) { 132 | List l = new ArrayList<>(); 133 | for (String s : yml.getStringList(path)) { 134 | Location loc = convertStringToArenaLocation(s); 135 | if (loc != null) { 136 | l.add(loc); 137 | } 138 | } 139 | return l; 140 | } 141 | 142 | /** 143 | * Set data to config 144 | */ 145 | public void set(String path, Object value) { 146 | yml.set(path, value); 147 | save(); 148 | } 149 | 150 | /** 151 | * Get yml instance 152 | */ 153 | public YamlConfiguration getYml() { 154 | return yml; 155 | } 156 | 157 | /** 158 | * Save config changes to file 159 | */ 160 | public void save() { 161 | try { 162 | yml.save(config); 163 | } catch (IOException e) { 164 | e.printStackTrace(); 165 | } 166 | } 167 | 168 | /** 169 | * Get list of strings at given path 170 | * 171 | * @return a list of string with colors translated 172 | */ 173 | public List getList(String path) { 174 | return yml.getStringList(path).stream().map(s -> s.replace("&", "§")).collect(Collectors.toList()); 175 | } 176 | 177 | /** 178 | * Get boolean at given path 179 | */ 180 | public boolean getBoolean(String path) { 181 | return yml.getBoolean(path); 182 | } 183 | 184 | /** 185 | * Get Integer at given path 186 | */ 187 | public int getInt(String path) { 188 | return yml.getInt(path); 189 | } 190 | 191 | 192 | /** 193 | * Get string at given path 194 | */ 195 | public String getString(String path) { 196 | return yml.getString(path); 197 | } 198 | 199 | /** 200 | * Check if the config file was created for the first time 201 | * Can be used to add default values 202 | */ 203 | public boolean isFirstTime() { 204 | return firstTime; 205 | } 206 | 207 | /** 208 | * Compare two arena locations 209 | * Return true if same location 210 | */ 211 | public boolean compareArenaLoc(Location l1, Location l2) { 212 | return l1.getBlockX() == l2.getBlockX() && l1.getBlockZ() == l2.getBlockZ() && l1.getBlockY() == l2.getBlockY(); 213 | } 214 | 215 | /** 216 | * Get config name 217 | */ 218 | public String getName() { 219 | return name; 220 | } 221 | 222 | /** 223 | * Change internal name. 224 | */ 225 | public void setName(String name) { 226 | this.name = name; 227 | } 228 | } 229 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/configuration/SignsConfig.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.configuration; 2 | 3 | import com.andrei1058.bedwars.proxy.BedWarsProxy; 4 | import org.bukkit.configuration.file.YamlConfiguration; 5 | 6 | import java.util.ArrayList; 7 | 8 | public class SignsConfig extends PluginConfig{ 9 | 10 | public SignsConfig() { 11 | super(BedWarsProxy.getPlugin(), "signs", BedWarsProxy.getPlugin().getDataFolder().getPath()); 12 | 13 | YamlConfiguration yml = getYml(); 14 | yml.options().copyDefaults(true); 15 | yml.addDefault(ConfigPath.SIGNS_LIST_PATH, new ArrayList<>()); 16 | yml.addDefault(ConfigPath.SIGNS_SETTINGS_STATIC_SHOW_PLAYING, false); 17 | save(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/configuration/SoundsConfig.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.configuration; 2 | 3 | import com.andrei1058.bedwars.proxy.BedWarsProxy; 4 | import org.bukkit.Sound; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | import org.bukkit.entity.Player; 7 | 8 | import java.util.List; 9 | 10 | public class SoundsConfig { 11 | 12 | /** 13 | * Load sounds configuration 14 | */ 15 | public SoundsConfig() { 16 | saveDefaultSounds(); 17 | } 18 | 19 | private static PluginConfig sounds = new PluginConfig(BedWarsProxy.getPlugin(), "sounds", BedWarsProxy.getPlugin().getDataFolder().getPath()); 20 | 21 | @SuppressWarnings("WeakerAccess") 22 | public static void saveDefaultSounds() { 23 | YamlConfiguration yml = sounds.getYml(); 24 | yml.addDefault("rejoin-denied", String.valueOf(BedWarsProxy.getSoundAdapter().getForCurrentVersion("VILLAGER_NO", "ENTITY_VILLAGER_NO", "ENTITY_VILLAGER_NO"))); 25 | yml.addDefault("rejoin-allowed", String.valueOf(BedWarsProxy.getSoundAdapter().getForCurrentVersion("SLIME_WALK", "ENTITY_SLIME_JUMP", "ENTITY_SLIME_JUMP"))); 26 | yml.addDefault("spectate-denied", String.valueOf(BedWarsProxy.getSoundAdapter().getForCurrentVersion("VILLAGER_NO", "ENTITY_VILLAGER_NO", "ENTITY_VILLAGER_NO"))); 27 | yml.addDefault("spectate-allowed", String.valueOf(BedWarsProxy.getSoundAdapter().getForCurrentVersion("SLIME_WALK", "ENTITY_SLIME_JUMP", "ENTITY_SLIME_JUMP"))); 28 | yml.addDefault("join-denied", String.valueOf(BedWarsProxy.getSoundAdapter().getForCurrentVersion("VILLAGER_NO", "ENTITY_VILLAGER_NO", "ENTITY_VILLAGER_NO"))); 29 | yml.addDefault("join-allowed", String.valueOf(BedWarsProxy.getSoundAdapter().getForCurrentVersion("SLIME_WALK", "ENTITY_SLIME_JUMP", "ENTITY_SLIME_JUMP"))); 30 | yml.addDefault("spectator-gui-click", String.valueOf(BedWarsProxy.getSoundAdapter().getForCurrentVersion("SLIME_WALK", "ENTITY_SLIME_JUMP", "ENTITY_SLIME_JUMP"))); 31 | yml.addDefault("arena-selector-open", String.valueOf(BedWarsProxy.getSoundAdapter().getForCurrentVersion("CHICKEN_EGG_POP", "ENTITY_CHICKEN_EGG", "ENTITY_CHICKEN_EGG"))); 32 | yml.addDefault("stats-gui-open", String.valueOf(BedWarsProxy.getSoundAdapter().getForCurrentVersion("CHICKEN_EGG_POP", "ENTITY_CHICKEN_EGG", "ENTITY_CHICKEN_EGG"))); 33 | yml.options().copyDefaults(true); 34 | sounds.save(); 35 | } 36 | 37 | public static Sound getSound(String path) { 38 | try { 39 | return Sound.valueOf(sounds.getString(path)); 40 | } catch (Exception ex) { 41 | return null; 42 | } 43 | } 44 | 45 | public static void playSound(String path, List players) { 46 | final Sound sound = getSound(path); 47 | if (sound != null) players.forEach(p -> p.playSound(p.getLocation(), sound, 1f, 1f)); 48 | } 49 | 50 | public static void playSound(Sound sound, List players) { 51 | if (sound != null) players.forEach(p -> p.playSound(p.getLocation(), sound, 1f, 1f)); 52 | } 53 | 54 | public static void playSound(String path, Player player) { 55 | final Sound sound = getSound(path); 56 | if (sound != null) player.playSound(player.getLocation(), sound, 1f, 1f); 57 | } 58 | 59 | public static void playSound(Sound sound, Player player) { 60 | if (sound != null) player.playSound(player.getLocation(), sound, 1f, 1f); 61 | } 62 | 63 | public static PluginConfig getSounds() { 64 | return sounds; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/database/CacheListener.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.database; 2 | 3 | import com.andrei1058.bedwars.proxy.BedWarsProxy; 4 | import org.bukkit.Bukkit; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.event.EventHandler; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.event.player.PlayerLoginEvent; 9 | 10 | public class CacheListener implements Listener { 11 | 12 | @EventHandler 13 | // Create cache for player if does not exist yet. 14 | public void onLogin(PlayerLoginEvent e) { 15 | if (e == null) return; 16 | final Player p = e.getPlayer(); 17 | Bukkit.getScheduler().runTaskAsynchronously(BedWarsProxy.getPlugin(), () -> { 18 | //create cache row for player 19 | BedWarsProxy.getStatsCache().createStatsCache(p); 20 | //update local cache for player 21 | BedWarsProxy.getRemoteDatabase().updateLocalCache(p.getUniqueId()); 22 | }); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/database/Database.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.database; 2 | 3 | import java.util.UUID; 4 | 5 | public interface Database { 6 | 7 | /** 8 | * Initialize database. 9 | */ 10 | void init(); 11 | 12 | /** 13 | * Update local cache from remote database. 14 | */ 15 | void updateLocalCache(UUID uuid); 16 | 17 | /** 18 | * Close connection. 19 | */ 20 | void close(); 21 | 22 | /** 23 | * Get a player level and xp. 24 | *

25 | * args 0 is level. 26 | * args 1 is xp. 27 | * args 2 is display name. 28 | * args 3 next level cost. 29 | */ 30 | Object[] getLevelData(UUID player); 31 | 32 | /** 33 | * Set a player level data. 34 | */ 35 | void setLevelData(UUID player, int level, int xp, String displayName, int nextCost); 36 | 37 | /** 38 | * Set a player language. 39 | */ 40 | void setLanguage(UUID player, String iso); 41 | 42 | /** 43 | * Get a player language. 44 | */ 45 | String getLanguage(UUID player); 46 | } 47 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/database/NoDatabase.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.database; 2 | 3 | import java.util.UUID; 4 | 5 | public class NoDatabase implements Database { 6 | @Override 7 | public void init() { 8 | 9 | } 10 | 11 | @Override 12 | public void updateLocalCache(UUID uuid) { 13 | 14 | } 15 | 16 | @Override 17 | public void close() { 18 | 19 | } 20 | 21 | @Override 22 | public Object[] getLevelData(UUID player) { 23 | return new Object[0]; 24 | } 25 | 26 | @Override 27 | public void setLevelData(UUID player, int level, int xp, String displayName, int nextCost) { 28 | 29 | } 30 | 31 | @Override 32 | public void setLanguage(UUID player, String iso) { 33 | 34 | } 35 | 36 | @Override 37 | public String getLanguage(UUID player) { 38 | return null; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/database/SessionKeeper.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.database; 2 | 3 | public class SessionKeeper implements Runnable { 4 | 5 | private MySQL db; 6 | 7 | public SessionKeeper(MySQL db){ 8 | this.db = db; 9 | } 10 | 11 | @Override 12 | public void run() { 13 | if (!db.isConnected()) db.connect(); 14 | db.ping(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/language/English.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.language; 2 | 3 | import com.andrei1058.bedwars.proxy.BedWarsProxy; 4 | import com.andrei1058.bedwars.proxy.api.Messages; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | 7 | import java.util.Arrays; 8 | 9 | public class English extends Language { 10 | public English() { 11 | super(BedWarsProxy.getPlugin(), "en"); 12 | 13 | YamlConfiguration yml = getYml(); 14 | yml.options().copyDefaults(true); 15 | yml.addDefault(Messages.PREFIX, ""); 16 | yml.addDefault("name", "English"); 17 | yml.addDefault(Messages.FORMATTING_STATS_DATE_FORMAT, "yyyy/MM/dd HH:mm"); 18 | yml.addDefault(Messages.ARENA_STATUS_OFFLINE_NAME, "&8Offline"); 19 | yml.addDefault(Messages.ARENA_STATUS_PLAYING_NAME, "&cPlaying"); 20 | yml.addDefault(Messages.ARENA_STATUS_RESTARTING_NAME, "&4Restarting"); 21 | yml.addDefault(Messages.ARENA_STATUS_WAITING_NAME, "&2Waiting"); 22 | yml.addDefault(Messages.ARENA_STATUS_STARTING_NAME, "&6Starting"); 23 | yml.addDefault(Messages.ARENA_GUI_INV_NAME, "&8Click to join"); 24 | yml.addDefault(Messages.ARENA_GUI_ARENA_CONTENT_NAME, "&a&l{name}"); 25 | yml.addDefault(Messages.ARENA_GUI_ARENA_CONTENT_LORE, Arrays.asList("", "&7Status: {status}", "&7Players: &f{on}&7/&f{max}", "&7Type: &a{group}", "", "&aLeft-Click to join.", "&eRight-Click to spectate.")); 26 | 27 | yml.addDefault(Messages.ARENA_JOIN_DENIED_SELECTOR, "{prefix}&cSorry but you can't join this arena at this moment. Use Right-Click to spectate!"); 28 | yml.addDefault(Messages.ARENA_SPECTATE_DENIED_SELECTOR, "{prefix}&cSorry but you can't spectate this arena at this moment. Use Left-Click to join!"); 29 | 30 | yml.addDefault(Messages.COMMAND_NOT_FOUND_OR_INSUFF_PERMS, "{prefix}&cCommand not found or you don't have permission!"); 31 | yml.addDefault(Messages.COMMAND_GUI_DISPLAY, "&8- &f/bw gui &o(group) &eopens the arena selector."); 32 | yml.addDefault(Messages.COMMAND_GUI_HOVER, "&fChoose an arena\n&fand play."); 33 | yml.addDefault(Messages.COMMAND_LANGUAGE_DISPLAY, "&8- &f/bw language &o &echange language."); 34 | yml.addDefault(Messages.COMMAND_LANGUAGE_HOVER, "&fChange your language."); 35 | yml.addDefault(Messages.COMMAND_REJOIN_DISPLAY, "&8- &f/bw rejoin &ereconnect to a game."); 36 | yml.addDefault(Messages.COMMAND_REJOIN_HOVER, "&fReconnect to the game from where you got disconnected."); 37 | yml.addDefault(Messages.COMMAND_TP_DISPLAY, "&8- &f/bw tp &eteleport to a player as spectator."); 38 | yml.addDefault(Messages.COMMAND_TP_HOVER, "&fSpectate on a player. Used for moderators to check hackers."); 39 | 40 | yml.addDefault(Messages.COMMAND_LANG_LIST_HEADER, "{prefix} &2Available languages:"); 41 | yml.addDefault(Messages.COMMAND_LANG_LIST_FORMAT, "&a▪ &7{iso} - &f{name}"); 42 | yml.addDefault(Messages.COMMAND_LANG_USAGE, "{prefix}&7Usage: /lang &f&o"); 43 | yml.addDefault(Messages.COMMAND_LANG_SELECTED_NOT_EXIST, "{prefix}&cThis language doesn't exist!"); 44 | yml.addDefault(Messages.COMMAND_LANG_SELECTED_SUCCESSFULLY, "{prefix}&aLanguage changed!"); 45 | yml.addDefault(Messages.COMMAND_JOIN_USAGE, "&a▪ &7Usage: /bw join &o"); 46 | yml.addDefault(Messages.COMMAND_JOIN_GROUP_OR_ARENA_NOT_FOUND, "{prefix}&cThere isn't any arena or arena group called: {name}"); 47 | yml.addDefault(Messages.COMMAND_JOIN_DENIED_IS_FULL, "{prefix}&cThis arena is full!\n&aPlease consider donating for more features. &7&o(click)"); 48 | yml.addDefault(Messages.COMMAND_JOIN_NO_EMPTY_FOUND, "{prefix}&cThere isn't any arena available right now ;("); 49 | yml.addDefault(Messages.COMMAND_JOIN_DENIED_PARTY_TOO_BIG, "{prefix}&cYour party is too big for joining this arena as a team :("); 50 | yml.addDefault(Messages.COMMAND_JOIN_DENIED_NOT_PARTY_LEADER, "{prefix}&cOnly the leader can choose the arena."); 51 | yml.addDefault(Messages.COMMAND_JOIN_SPECTATOR_DENIED_MSG, "&cSpectators are not allowed in this arena!"); 52 | yml.addDefault(Messages.REJOIN_NO_ARENA, "{prefix}&cThere is no arena to rejoin!"); 53 | yml.addDefault(Messages.REJOIN_DENIED, "{prefix}&cYou can't rejoin the arena anymore. Game ended or bed destroyed."); 54 | yml.addDefault(Messages.REJOIN_ALLOWED, "{prefix}&eJoining arena &a{arena}&e!"); 55 | yml.addDefault(Messages.COMMAND_NOT_FOUND_OR_INSUFF_PERMS, "{prefix}&cCommand not found or you don't have permission!"); 56 | yml.addDefault(Messages.COMMAND_PARTY_HELP, Arrays.asList("&6▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬", 57 | "&aParty Commands:", "&e/party invite &7- &bInvites the player to your party", 58 | "&e/party leave &7- &bLeaves the current party", 59 | "&e/party remove &7- &bRemove the player from the party", 60 | "&e/party accept &7- &bAccept a party invite", "&e/party disband &7- &bDisbands the party")); 61 | yml.addDefault(Messages.COMMAND_PARTY_INVITE_USAGE, "{prefix}&eUsage: &7/party invite "); 62 | yml.addDefault(Messages.COMMAND_PARTY_INVITE_DENIED_PLAYER_OFFLINE, "{prefix}&7{player} &eis not online!"); 63 | yml.addDefault(Messages.COMMAND_PARTY_INVITE_SENT, "{prefix}&eInvite sent to &7{player}&6."); 64 | yml.addDefault(Messages.COMMAND_PARTY_INVITE_SENT_TARGET_RECEIVE_MSG, "{prefix}&b{player} &ehas invited you to a party! &o&7(Click to accept)"); 65 | yml.addDefault(Messages.COMMAND_PARTY_INVITE_DENIED_CANNOT_INVITE_YOURSELF, "{prefix}&cYou cannot invite yourself!"); 66 | yml.addDefault(Messages.COMMAND_PARTY_INVITE_DENIED_PLAYER_OFFLINE, "{prefix}&7{player} &eis offline!"); 67 | yml.addDefault(Messages.COMMAND_PARTY_ACCEPT_DENIED_NO_INVITE, "{prefix}&cThere's no party requests to accept"); 68 | yml.addDefault(Messages.COMMAND_PARTY_ACCEPT_DENIED_ALREADY_IN_PARTY, "{prefix}&eYou're already in a party!"); 69 | yml.addDefault(Messages.COMMAND_PARTY_INSUFFICIENT_PERMISSIONS, "{prefix}&cOnly the party owner can do this!"); 70 | yml.addDefault(Messages.COMMAND_PARTY_ACCEPT_USAGE, "{prefix}&eUsage: &7/party accept "); 71 | yml.addDefault(Messages.COMMAND_PARTY_ACCEPT_SUCCESS, "{prefix}&7{player} &ehas joined the party!"); 72 | yml.addDefault(Messages.COMMAND_PARTY_GENERAL_DENIED_NOT_IN_PARTY, "{prefix}&cYou're not in a party!"); 73 | yml.addDefault(Messages.COMMAND_PARTY_LEAVE_DENIED_IS_OWNER_NEEDS_DISBAND, "{prefix}&cYou can't leave your own party!\n&eTry using: &b/party disband"); 74 | yml.addDefault(Messages.COMMAND_PARTY_LEAVE_SUCCESS, "{prefix}&7{player} &ehas leaved the party!"); 75 | yml.addDefault(Messages.COMMAND_PARTY_DISBAND_SUCCESS, "{prefix}&eParty disbanded!"); 76 | yml.addDefault(Messages.COMMAND_PARTY_REMOVE_USAGE, "{prefix}&7Usage: &e/party remove "); 77 | yml.addDefault(Messages.COMMAND_PARTY_REMOVE_SUCCESS, "{prefix}&7{player} &ewas removed from the party,"); 78 | yml.addDefault(Messages.COMMAND_PARTY_REMOVE_DENIED_TARGET_NOT_PARTY_MEMBER, "{prefix}&7{player} &eis not in your party!"); 79 | yml.addDefault(Messages.COMMAND_TP_USAGE, "{prefix}&7Usage: &e/bw tp "); 80 | yml.addDefault(Messages.COMMAND_TP_NOT_FOUND, "{prefix}&7{player}&e was not found in bed-wars arenas."); 81 | yml.addDefault(Messages.COMMAND_TP_FAIL2, "{prefix}&7{player}&e was found on &7{server}&e but you can't join at this time."); 82 | 83 | yml.addDefault(Messages.SIGN_DYNAMIC_WAITING, Arrays.asList("&4&l[BedWars-{id}]", "&9{group}", "&1{map}", "&5{current}/{max}")); 84 | yml.addDefault(Messages.SIGN_DYNAMIC_STARTING, Arrays.asList("&4&l[BedWars-{id}]", "&9{group}", "&1{map}", "&5{current}/{max}")); 85 | yml.addDefault(Messages.SIGN_DYNAMIC_SEARCHING, Arrays.asList("&4▆▆▆▆▆▆", "&1&lBOOTING", "", "&4▆▆▆▆▆▆")); 86 | yml.addDefault(Messages.SIGN_DYNAMIC_NO_GAMES, Arrays.asList("", "&8&lWaiting for", "&7&lopen lobby", "")); 87 | 88 | yml.addDefault(Messages.SIGN_STATIC_WAITING, Arrays.asList("&4&l[BedWars-{id}]", "&9{group}", "&1{map}", "&5{current}/{max}")); 89 | yml.addDefault(Messages.SIGN_STATIC_STARTING, Arrays.asList("&4&l[BedWars-{id}]", "&9{group}", "&1{map}", "&5{current}/{max}")); 90 | yml.addDefault(Messages.SIGN_STATIC_PLAYING, Arrays.asList("&4&l[BedWars-{id}]", "&9{group}", "&1{map}", "{status}")); 91 | yml.addDefault(Messages.SIGN_STATIC_SEARCHING, Arrays.asList("&4▆▆▆▆▆▆", "&1&lBOOTING", "", "&4▆▆▆▆▆▆")); 92 | yml.addDefault(Messages.SIGN_STATIC_NO_GAMES, Arrays.asList("", "&8&lWaiting for", "&7&lopen lobby", "")); 93 | save(); 94 | setPrefix(getMsg(Messages.PREFIX)); 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/language/LangListeners.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.language; 2 | 3 | import com.andrei1058.bedwars.proxy.BedWarsProxy; 4 | import com.andrei1058.bedwars.proxy.configuration.ConfigPath; 5 | import org.bukkit.Bukkit; 6 | import org.bukkit.entity.Player; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.EventPriority; 9 | import org.bukkit.event.Listener; 10 | import org.bukkit.event.player.PlayerJoinEvent; 11 | import org.bukkit.event.player.PlayerLoginEvent; 12 | 13 | import java.util.HashMap; 14 | import java.util.UUID; 15 | 16 | public class LangListeners implements Listener { 17 | 18 | private static HashMap preLoadedLanguage = new HashMap<>(); 19 | 20 | @EventHandler 21 | public void onLogin(PlayerLoginEvent e) { 22 | if (e == null) return; 23 | Player p = e.getPlayer(); 24 | final UUID u = p.getUniqueId(); 25 | Bukkit.getScheduler().runTaskAsynchronously(BedWarsProxy.getPlugin(), () -> { 26 | String iso = BedWarsProxy.getRemoteDatabase().getLanguage(u); 27 | if (LanguageManager.get().isLanguageExist(iso)) { 28 | if (BedWarsProxy.config.getYml().getStringList(ConfigPath.GENERAL_CONFIGURATION_DISABLED_LANGUAGES).contains(iso)) 29 | iso = LanguageManager.get().getDefaultLanguage().getIso(); 30 | if (preLoadedLanguage.containsKey(u)) { 31 | preLoadedLanguage.replace(u, iso); 32 | } else { 33 | preLoadedLanguage.put(u, iso); 34 | } 35 | } 36 | }); 37 | } 38 | 39 | @EventHandler(priority = EventPriority.HIGH) 40 | public void onJoin(PlayerJoinEvent e) { 41 | if (e == null) return; 42 | final Player p = e.getPlayer(); 43 | if (preLoadedLanguage.containsKey(e.getPlayer().getUniqueId())) { 44 | LanguageManager.get().setPlayerLanguage(e.getPlayer(), preLoadedLanguage.get(e.getPlayer().getUniqueId()), true); 45 | preLoadedLanguage.remove(e.getPlayer().getUniqueId()); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/language/Language.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.language; 2 | 3 | import com.andrei1058.bedwars.proxy.configuration.PluginConfig; 4 | import org.bukkit.ChatColor; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.plugin.Plugin; 7 | 8 | import java.util.*; 9 | import java.util.stream.Collectors; 10 | 11 | public class Language extends PluginConfig implements com.andrei1058.bedwars.proxy.api.Language { 12 | 13 | private String iso, prefix = ""; 14 | 15 | public Language(Plugin plugin, String iso) { 16 | super(plugin, "messages_" + iso, "plugins/" + plugin.getName() + "/Languages"); 17 | this.iso = iso; 18 | LanguageManager.get().addLanguage(this); 19 | } 20 | 21 | public String getLangName() { 22 | return getYml().getString("name"); 23 | } 24 | 25 | public boolean exists(String path) { 26 | return getYml().get(path) != null; 27 | } 28 | 29 | public String getMsg(String path) { 30 | return ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(getYml().getString(path)).replace("{prefix}", prefix)); 31 | } 32 | 33 | public List getList(String path) { 34 | return getYml().getStringList(path).stream().map(s -> s = ChatColor.translateAlternateColorCodes('&', s)).collect(Collectors.toList()); 35 | } 36 | 37 | public void setPrefix(String prefix) { 38 | this.prefix = prefix; 39 | } 40 | 41 | public String getIso() { 42 | return iso; 43 | } 44 | 45 | public static String getMsg(Player p, String m) { 46 | return LanguageManager.get().getMsg(p, m); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/language/LanguageManager.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.language; 2 | 3 | import com.andrei1058.bedwars.proxy.api.BedWars; 4 | import com.andrei1058.bedwars.proxy.api.Language; 5 | import com.andrei1058.bedwars.proxy.api.event.PlayerLangChangeEvent; 6 | import org.bukkit.Bukkit; 7 | import org.bukkit.entity.Player; 8 | 9 | import java.util.ArrayList; 10 | import java.util.HashMap; 11 | import java.util.List; 12 | 13 | public class LanguageManager implements BedWars.LanguageUtil { 14 | 15 | private Language defaultLanguage; 16 | private HashMap langByPlayer = new HashMap<>(); 17 | private List languages = new ArrayList<>(); 18 | private static LanguageManager INSTANCE; 19 | 20 | private LanguageManager(){ 21 | INSTANCE = this; 22 | } 23 | 24 | public static void init(){ 25 | new LanguageManager(); 26 | } 27 | 28 | public static LanguageManager get(){ 29 | return INSTANCE; 30 | } 31 | 32 | @Override 33 | public List getLanguages() { 34 | return languages; 35 | } 36 | 37 | @Override 38 | public String getMsg(Player p, String path) { 39 | return langByPlayer.getOrDefault(p, getDefaultLanguage()).getMsg(path); 40 | } 41 | 42 | @Override 43 | public Language getPlayerLanguage(Player p) { 44 | return langByPlayer.getOrDefault(p, getDefaultLanguage()); 45 | } 46 | 47 | @Override 48 | public List getList(Player p, String path) { 49 | return langByPlayer.getOrDefault(p, getDefaultLanguage()).getList(path); 50 | } 51 | 52 | @Override 53 | public void saveIfNotExists(String path, Object data) { 54 | for (Language l : languages) { 55 | if (!l.exists(path)) { 56 | l.set(path, data); 57 | } 58 | } 59 | } 60 | 61 | @Override 62 | public boolean isLanguageExist(String iso) { 63 | return languages.stream().anyMatch(p -> p.getIso().equalsIgnoreCase(iso)); 64 | } 65 | 66 | @Override 67 | public boolean addLanguage(Language language){ 68 | if (language == null || isLanguageExist(language.getIso())) return false; 69 | return languages.add(language); 70 | } 71 | 72 | @Override 73 | public Language getLang(String iso) { 74 | for (Language l : languages) { 75 | if (l.getIso().equalsIgnoreCase(iso)) { 76 | return l; 77 | } 78 | } 79 | return null; 80 | } 81 | 82 | /** 83 | * Change a player language and refresh 84 | * scoreboard and custom join items. 85 | * @param p target player. 86 | * @param iso language iso. 87 | * @param onLogin if it is requested at login. 88 | */ 89 | public void setPlayerLanguage(Player p, String iso, boolean onLogin) { 90 | 91 | if (onLogin) { 92 | if (getDefaultLanguage().getIso().equalsIgnoreCase(iso)) return; 93 | } 94 | 95 | Language newLang = get().getLang(iso); 96 | 97 | if (!onLogin) { 98 | Language oldLang = langByPlayer.containsKey(p) ? getPlayerLanguage(p) : getLanguages().get(0); 99 | PlayerLangChangeEvent e = new PlayerLangChangeEvent(p, oldLang, newLang); 100 | Bukkit.getPluginManager().callEvent(e); 101 | if (e.isCancelled()) return; 102 | } 103 | 104 | if (langByPlayer.containsKey(p)) { 105 | langByPlayer.replace(p, newLang); 106 | } else { 107 | langByPlayer.put(p, newLang); 108 | } 109 | } 110 | 111 | @Override 112 | public void setDefaultLanguage(Language defaultLanguage) { 113 | this.defaultLanguage = defaultLanguage; 114 | } 115 | 116 | @Override 117 | public Language getDefaultLanguage() { 118 | return defaultLanguage; 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/levels/Level.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.levels; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | public interface Level { 6 | 7 | /** 8 | * Get current player level formatted as string. 9 | */ 10 | String getLevel(Player p); 11 | 12 | 13 | /** 14 | * Get current player level as number. 15 | */ 16 | int getPlayerLevel(Player p); 17 | 18 | /** 19 | * Get required xp as string. 20 | * 2000 - 2k 21 | */ 22 | String getRequiredXpFormatted(Player p); 23 | 24 | /** 25 | * Get current progress bar. 26 | */ 27 | String getProgressBar(Player p); 28 | 29 | /** 30 | * Get current xp. 31 | */ 32 | int getCurrentXp(Player p); 33 | 34 | /** 35 | * Get current xp formatted. 36 | */ 37 | String getCurrentXpFormatted(Player p); 38 | 39 | /** 40 | * Get required xp 41 | */ 42 | int getRequiredXp(Player p); 43 | } 44 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/levels/internal/InternalLevel.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.levels.internal; 2 | 3 | import com.andrei1058.bedwars.proxy.levels.Level; 4 | import org.bukkit.entity.Player; 5 | 6 | public class InternalLevel implements Level { 7 | 8 | @Override 9 | public String getLevel(Player p) { 10 | return PlayerLevel.getLevelByPlayer(p.getUniqueId()).getLevelName(); 11 | } 12 | 13 | @Override 14 | public int getPlayerLevel(Player p) { 15 | return PlayerLevel.getLevelByPlayer(p.getUniqueId()).getPlayerLevel(); 16 | } 17 | 18 | @Override 19 | public String getRequiredXpFormatted(Player p) { 20 | return PlayerLevel.getLevelByPlayer(p.getUniqueId()).getFormattedRequiredXp(); 21 | } 22 | 23 | @Override 24 | public String getProgressBar(Player p) { 25 | return PlayerLevel.getLevelByPlayer(p.getUniqueId()).getProgress(); 26 | } 27 | 28 | @Override 29 | public int getCurrentXp(Player p) { 30 | return PlayerLevel.getLevelByPlayer(p.getUniqueId()).getCurrentXp(); 31 | } 32 | 33 | @Override 34 | public String getCurrentXpFormatted(Player p) { 35 | return PlayerLevel.getLevelByPlayer(p.getUniqueId()).getFormattedCurrentXp(); 36 | } 37 | 38 | @Override 39 | public int getRequiredXp(Player p) { 40 | return PlayerLevel.getLevelByPlayer(p.getUniqueId()).getNextLevelCost(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/levels/internal/LevelListeners.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.levels.internal; 2 | 3 | import com.andrei1058.bedwars.proxy.BedWarsProxy; 4 | import org.bukkit.Bukkit; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.EventPriority; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.event.player.PlayerJoinEvent; 9 | import org.bukkit.event.player.PlayerQuitEvent; 10 | 11 | import java.util.UUID; 12 | 13 | public class LevelListeners implements Listener { 14 | 15 | public static LevelListeners instance; 16 | 17 | public LevelListeners() { 18 | instance = this; 19 | } 20 | 21 | //create new level data on player join 22 | @EventHandler(priority = EventPriority.HIGH) 23 | public void onPlayerJoin(PlayerJoinEvent e) { 24 | final UUID u = e.getPlayer().getUniqueId(); 25 | // create empty level first 26 | new PlayerLevel(u); 27 | Bukkit.getScheduler().runTaskAsynchronously(BedWarsProxy.getPlugin(), () -> { 28 | //if (PlayerLevel.getLevelByPlayer(e.getPlayer().getUniqueId()) != null) return; 29 | Object[] levelData = BedWarsProxy.getRemoteDatabase().getLevelData(u); 30 | if (levelData.length == 0) return; 31 | PlayerLevel.getLevelByPlayer(u).lazyLoad((Integer) levelData[0], (Integer) levelData[1], (String) levelData[2], (Integer)levelData[3]); 32 | //new PlayerLevel(e.getPlayer().getUniqueId(), (Integer)levelData[0], (Integer)levelData[1]); 33 | //Bukkit.broadcastMessage("LAZY LOAD"); 34 | }); 35 | } 36 | 37 | @EventHandler(priority = EventPriority.HIGHEST) 38 | public void onPlayerQuit(PlayerQuitEvent e) { 39 | final UUID u = e.getPlayer().getUniqueId(); 40 | Bukkit.getScheduler().runTaskAsynchronously(BedWarsProxy.getPlugin(), () -> { 41 | PlayerLevel pl = PlayerLevel.getLevelByPlayer(u); 42 | pl.destroy(); 43 | }); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/levels/internal/PlayerLevel.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.levels.internal; 2 | 3 | import com.andrei1058.bedwars.proxy.BedWarsProxy; 4 | import org.bukkit.ChatColor; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | import java.util.HashMap; 8 | import java.util.UUID; 9 | 10 | public class PlayerLevel { 11 | 12 | private UUID uuid; 13 | private int level; 14 | private int nextLevelCost; 15 | private String levelName; 16 | private int currentXp; 17 | private String progressBar; 18 | private String requiredXp; 19 | private String formattedCurrentXp; 20 | 21 | private static HashMap levelByPlayer = new HashMap<>(); 22 | 23 | /** 24 | * Cache a player level. 25 | */ 26 | public PlayerLevel(UUID player) { 27 | level = 0; 28 | currentXp = 0; 29 | 30 | this.uuid = player; 31 | this.levelName = ChatColor.translateAlternateColorCodes('&', BedWarsProxy.config.getString("levels-settings.default-name").replace("{number}", String.valueOf(level))); 32 | this.nextLevelCost = 1000; 33 | 34 | updateProgressBar(); 35 | requiredXp = nextLevelCost >= 1000 ? nextLevelCost % 1000 == 0 ? nextLevelCost / 1000 + "k" : (double) nextLevelCost / 1000 + "k" : String.valueOf(nextLevelCost); 36 | formattedCurrentXp = currentXp >= 1000 ? currentXp % 1000 == 0 ? currentXp / 1000 + "k" : (double) currentXp / 1000 + "k" : String.valueOf(currentXp); 37 | if (!levelByPlayer.containsKey(player)) levelByPlayer.put(player, this); 38 | } 39 | 40 | /** 41 | * Update the player progress bar. 42 | */ 43 | @SuppressWarnings("ConstantConditions") 44 | private void updateProgressBar() { 45 | double l1 = ((nextLevelCost - currentXp) / (double) (nextLevelCost)) * 10; 46 | int locked = (int) l1; 47 | int unlocked = 10 - locked; 48 | if (locked < 0 || unlocked < 0) { 49 | locked = 10; 50 | unlocked = 0; 51 | } 52 | 53 | progressBar = ChatColor.translateAlternateColorCodes('&', BedWarsProxy.config.getYml().getString("levels-settings.progress-bar-format").replace("{progress}", 54 | BedWarsProxy.config.getYml().getString("levels-settings.progress-bar-unlocked-color") + String.valueOf(new char[unlocked]).replace("\0", BedWarsProxy.config.getYml().getString("levels-settings.progress-bar-symbol")) 55 | + BedWarsProxy.config.getYml().getString("levels-settings.progress-bar-locked-color") + String.valueOf(new char[locked]).replace("\0", BedWarsProxy.config.getYml().getString("levels-settings.progress-bar-symbol")))); 56 | requiredXp = nextLevelCost >= 1000 ? nextLevelCost % 1000 == 0 ? nextLevelCost / 1000 + "k" : (double) nextLevelCost / 1000 + "k" : String.valueOf(nextLevelCost); 57 | formattedCurrentXp = currentXp >= 1000 ? currentXp % 1000 == 0 ? currentXp / 1000 + "k" : (double) currentXp / 1000 + "k" : String.valueOf(currentXp); 58 | } 59 | 60 | /** 61 | * Get player current level. 62 | */ 63 | public int getLevel() { 64 | return level; 65 | } 66 | 67 | /** 68 | * Get the amount of xp required to level up. 69 | */ 70 | public int getNextLevelCost() { 71 | return nextLevelCost; 72 | } 73 | 74 | /** 75 | * Get PlayerLevel by player. 76 | */ 77 | public static PlayerLevel getLevelByPlayer(UUID player) { 78 | return levelByPlayer.getOrDefault(player, new PlayerLevel(player)); 79 | } 80 | 81 | /** 82 | * Get player uuid. 83 | */ 84 | public UUID getUuid() { 85 | return uuid; 86 | } 87 | 88 | /** 89 | * Get player current level display name. 90 | */ 91 | public String getLevelName() { 92 | return levelName; 93 | } 94 | 95 | /** 96 | * Get player xp. 97 | */ 98 | public int getCurrentXp() { 99 | return currentXp; 100 | } 101 | 102 | /** 103 | * Get progress bar for player. 104 | */ 105 | public String getProgress() { 106 | return progressBar; 107 | } 108 | 109 | /** 110 | * Get target xp already formatted. 111 | * Like: 2000 is 2k 112 | */ 113 | public String getFormattedRequiredXp() { 114 | return requiredXp; 115 | } 116 | 117 | /** 118 | * Set player xp. 119 | */ 120 | public void setXp(int currentXp) { 121 | this.currentXp = currentXp; 122 | updateProgressBar(); 123 | } 124 | 125 | /** 126 | * Set player level. 127 | */ 128 | public void setLevel(int level) { 129 | this.level = level; 130 | this.levelName = ChatColor.translateAlternateColorCodes('&', levelName.replace("{number}", String.valueOf(level))); 131 | requiredXp = nextLevelCost >= 1000 ? nextLevelCost % 1000 == 0 ? nextLevelCost / 1000 + "k" : (double) nextLevelCost / 1000 + "k" : String.valueOf(nextLevelCost); 132 | updateProgressBar(); 133 | } 134 | 135 | /** 136 | * Get player xp already formatted. 137 | * Like: 1000 is 1k 138 | */ 139 | public String getFormattedCurrentXp() { 140 | return formattedCurrentXp; 141 | } 142 | 143 | /** 144 | * Get player level as int. 145 | */ 146 | public int getPlayerLevel() { 147 | return level; 148 | } 149 | 150 | /** 151 | * Destroy data. 152 | */ 153 | public void destroy() { 154 | levelByPlayer.remove(uuid); 155 | //SpigotMain.remoteDatabase.setLevelData(uuid, level, currentXp); 156 | } 157 | 158 | public void lazyLoad(int level, int currentXp, @NotNull String levelName, int nextLevelCost) { 159 | this.levelName = ChatColor.translateAlternateColorCodes('&', levelName.replace("{number}", String.valueOf(level))); 160 | this.nextLevelCost = nextLevelCost; 161 | this.level = level; 162 | if (this.level < 0) this.level = 0; 163 | if (this.currentXp < 0) this.currentXp = 0; 164 | this.currentXp = currentXp; 165 | updateProgressBar(); 166 | } 167 | } 168 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/party/Internal.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.party; 2 | 3 | import com.andrei1058.bedwars.proxy.api.Messages; 4 | import org.bukkit.Bukkit; 5 | import org.bukkit.entity.Player; 6 | 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | import java.util.UUID; 10 | 11 | import static com.andrei1058.bedwars.proxy.language.Language.getMsg; 12 | 13 | public class Internal implements Party { 14 | 15 | static List parties = new ArrayList<>(); 16 | 17 | @Override 18 | public boolean hasParty(UUID p) { 19 | for (InternalParty party : parties) { 20 | if (party.members.contains(p)) return true; 21 | } 22 | return false; 23 | } 24 | 25 | @Override 26 | public int partySize(UUID p) { 27 | for (InternalParty party : parties) { 28 | if (party.members.contains(p)) { 29 | return party.members.size(); 30 | } 31 | } 32 | return 0; 33 | } 34 | 35 | @Override 36 | public boolean isOwner(UUID p) { 37 | for (InternalParty party : parties) { 38 | if (party.members.contains(p)) { 39 | if (party.owner == p) return true; 40 | } 41 | } 42 | return false; 43 | } 44 | 45 | @Override 46 | public List getMembers(UUID owner) { 47 | for (InternalParty party : parties) { 48 | if (party.members.contains(owner)) { 49 | return party.members; 50 | } 51 | } 52 | return null; 53 | } 54 | 55 | @Override 56 | public void createParty(Player owner, Player... members) { 57 | InternalParty p = new InternalParty(owner.getUniqueId()); 58 | p.addMember(owner); 59 | for (Player mem : members) { 60 | p.addMember(mem); 61 | } 62 | } 63 | 64 | @Override 65 | public void addMember(UUID owner, Player member) { 66 | if (owner == null || member == null) return; 67 | InternalParty p = getParty(owner); 68 | if (p == null) return; 69 | p.addMember(member); 70 | 71 | } 72 | 73 | @Override 74 | public void removeFromParty(UUID member) { 75 | for (InternalParty p : parties) { 76 | if (p.owner == member) { 77 | disband(member); 78 | } else if (p.members.contains(member)) { 79 | Player p1, target = Bukkit.getPlayer(member); 80 | if (target != null){ 81 | for (UUID mem : p.members) { 82 | p1 = Bukkit.getPlayer(mem); 83 | if (p1 != null) { 84 | p1.sendMessage(getMsg(p1, Messages.COMMAND_PARTY_LEAVE_SUCCESS).replace("{player}", target.getName())); 85 | } 86 | } 87 | } 88 | p.members.remove(member); 89 | if (p.members.isEmpty() || p.members.size() == 1) { 90 | disband(p.owner); 91 | parties.remove(p); 92 | } 93 | return; 94 | } 95 | } 96 | } 97 | 98 | @Override 99 | public void disband(UUID owner) { 100 | InternalParty party = getParty(owner); 101 | if (party != null) { 102 | Player player; 103 | for (UUID p : party.members) { 104 | player = Bukkit.getPlayer(p); 105 | if (player != null) 106 | player.sendMessage(getMsg(player, Messages.COMMAND_PARTY_DISBAND_SUCCESS)); 107 | } 108 | party.members.clear(); 109 | parties.remove(party); 110 | } 111 | } 112 | 113 | @Override 114 | public boolean isMember(UUID owner, UUID check) { 115 | for (InternalParty p : parties) { 116 | if (p.owner.equals(owner)) { 117 | if (p.members.contains(check)) return true; 118 | } 119 | } 120 | return false; 121 | } 122 | 123 | @Override 124 | public void removePlayer(UUID owner, UUID target) { 125 | InternalParty p = getParty(owner); 126 | if (p != null) { 127 | if (p.members.contains(target)) { 128 | Player pl, t1 = Bukkit.getPlayer(target); 129 | if (t1 != null) { 130 | for (UUID mem : p.members) { 131 | pl = Bukkit.getPlayer(mem); 132 | if (pl != null) { 133 | pl.sendMessage(getMsg(pl, Messages.COMMAND_PARTY_REMOVE_SUCCESS).replace("{player}", t1.getName())); 134 | } 135 | } 136 | } 137 | p.members.remove(target); 138 | if (p.members.isEmpty() || p.members.size() == 1) { 139 | disband(p.owner); 140 | parties.remove(p); 141 | } 142 | } 143 | } 144 | } 145 | 146 | @Override 147 | public boolean isInternal() { 148 | return true; 149 | } 150 | 151 | @Override 152 | public UUID getOwner(UUID player) { 153 | InternalParty p = getParty(player); 154 | if (p == null) return null; 155 | return p.getOwner(); 156 | } 157 | 158 | private InternalParty getParty(UUID owner) { 159 | for (InternalParty p : parties) { 160 | if (p.getOwner().equals(owner)) return p; 161 | } 162 | return null; 163 | } 164 | } 165 | 166 | class InternalParty { 167 | 168 | List members = new ArrayList<>(); 169 | UUID owner; 170 | 171 | public InternalParty(UUID p) { 172 | owner = p; 173 | Internal.parties.add(this); 174 | } 175 | 176 | public UUID getOwner() { 177 | return owner; 178 | } 179 | 180 | void addMember(Player p) { 181 | members.add(p.getUniqueId()); 182 | } 183 | } 184 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/party/NoParty.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.party; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | import java.util.UUID; 8 | 9 | public class NoParty implements Party { 10 | @Override 11 | public boolean hasParty(UUID p) { 12 | return false; 13 | } 14 | 15 | @Override 16 | public int partySize(UUID p) { 17 | return 0; 18 | } 19 | 20 | @Override 21 | public boolean isOwner(UUID p) { 22 | return false; 23 | } 24 | 25 | @Override 26 | public List getMembers(UUID owner) { 27 | return new ArrayList<>(); 28 | } 29 | 30 | @Override 31 | public void createParty(Player owner, Player... members) { 32 | 33 | } 34 | 35 | @Override 36 | public void addMember(UUID owner, Player member) { 37 | 38 | } 39 | 40 | @Override 41 | public void removeFromParty(UUID member) { 42 | 43 | } 44 | 45 | @Override 46 | public void disband(UUID owner) { 47 | 48 | } 49 | 50 | @Override 51 | public boolean isMember(UUID owner, UUID check) { 52 | return false; 53 | } 54 | 55 | @Override 56 | public void removePlayer(UUID owner, UUID target) { 57 | 58 | } 59 | 60 | @Override 61 | public boolean isInternal() { 62 | return false; 63 | } 64 | 65 | @Override 66 | public UUID getOwner(UUID player) { 67 | return null; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/party/PAF.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.party; 2 | 3 | import de.simonsator.partyandfriends.api.pafplayers.OnlinePAFPlayer; 4 | import de.simonsator.partyandfriends.api.pafplayers.PAFPlayerManager; 5 | import de.simonsator.partyandfriends.api.party.PlayerParty; 6 | import de.simonsator.partyandfriends.api.party.PartyManager; 7 | import org.bukkit.Bukkit; 8 | import org.bukkit.entity.Player; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | import java.util.UUID; 13 | 14 | public class PAF implements Party{ //Party And Friends Support Added by JT122406 15 | 16 | private PlayerParty getPAFParty(UUID p) { 17 | OnlinePAFPlayer pafPlayer = PAFPlayerManager.getInstance().getPlayer(Bukkit.getPlayer(p)); 18 | return PartyManager.getInstance().getParty(pafPlayer); 19 | } 20 | 21 | @Override 22 | public boolean hasParty(UUID p) { 23 | return getPAFParty(p) != null; 24 | } 25 | 26 | @Override 27 | public int partySize(UUID p) {return getPAFParty(p).getAllPlayers().size();} 28 | 29 | @Override 30 | public boolean isOwner(UUID p) { 31 | OnlinePAFPlayer pafPlayer = PAFPlayerManager.getInstance().getPlayer(Bukkit.getPlayer(p)); 32 | return PartyManager.getInstance().getParty(pafPlayer).isLeader(pafPlayer); 33 | } 34 | 35 | @Override 36 | public List getMembers(UUID owner) { 37 | ArrayList playerList = new ArrayList<>(); 38 | PlayerParty party = getPAFParty(owner); 39 | for (OnlinePAFPlayer players : party.getAllPlayers()) { 40 | playerList.add(players.getPlayer().getUniqueId()); 41 | } 42 | return playerList; 43 | } 44 | 45 | @Override 46 | public void createParty(Player owner, Player... members) { 47 | OnlinePAFPlayer pafPlayer = PAFPlayerManager.getInstance().getPlayer(owner); 48 | PlayerParty party = PartyManager.getInstance().createParty(pafPlayer); 49 | party.setPrivateState(false); 50 | for (Player p1 : members){ 51 | party.addPlayer(PAFPlayerManager.getInstance().getPlayer(p1)); 52 | } 53 | party.setPrivateState(true); 54 | } 55 | 56 | @Override 57 | public void addMember(UUID owner, Player member) { 58 | PlayerParty party = PAFPlayerManager.getInstance().getPlayer(Bukkit.getPlayer(owner)).getParty(); 59 | party.setPrivateState(false); 60 | party.addPlayer(PAFPlayerManager.getInstance().getPlayer(member)); 61 | party.setPrivateState(true); 62 | } 63 | 64 | @Override 65 | public void removeFromParty(UUID member) { 66 | PlayerParty p = PAFPlayerManager.getInstance().getPlayer(Bukkit.getPlayer(member)).getParty(); 67 | p.leaveParty(PAFPlayerManager.getInstance().getPlayer(member)); 68 | } 69 | 70 | @Override 71 | public void disband(UUID owner) { 72 | PartyManager.getInstance().deleteParty(PartyManager.getInstance().getParty(PAFPlayerManager.getInstance().getPlayer(Bukkit.getPlayer(owner)))); 73 | } 74 | 75 | @Override 76 | public boolean isMember(UUID owner, UUID check) { 77 | return getPAFParty(owner).isInParty(PAFPlayerManager.getInstance().getPlayer(Bukkit.getPlayer(check))); 78 | } 79 | 80 | @Override 81 | public void removePlayer(UUID owner, UUID target) { 82 | getPAFParty(owner).leaveParty(PAFPlayerManager.getInstance().getPlayer(target)); 83 | } 84 | 85 | @Override 86 | public boolean isInternal() { 87 | return false; 88 | } 89 | 90 | @Override 91 | public UUID getOwner(UUID player) { 92 | return getPAFParty(player).getLeader().getUniqueId(); 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/party/PAFBungeeCordParty.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.party; 2 | 3 | import de.simonsator.partyandfriends.spigot.api.pafplayers.PAFPlayer; 4 | import de.simonsator.partyandfriends.spigot.api.pafplayers.PAFPlayerManager; 5 | import de.simonsator.partyandfriends.spigot.api.party.PartyManager; 6 | import de.simonsator.partyandfriends.spigot.api.party.PlayerParty; 7 | import org.bukkit.entity.Player; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | import java.util.UUID; 12 | 13 | public class PAFBungeeCordParty implements Party { 14 | 15 | private PlayerParty getPAFParty(UUID p) { 16 | PAFPlayer pafPlayer = PAFPlayerManager.getInstance().getPlayer(p); 17 | return PartyManager.getInstance().getParty(pafPlayer); 18 | } 19 | 20 | @Override 21 | public boolean hasParty(UUID p) { 22 | return getPAFParty(p) != null; 23 | } 24 | 25 | @Override 26 | public int partySize(UUID p) { 27 | return getMembers(p).size(); 28 | } 29 | 30 | @Override 31 | public boolean isOwner(UUID p) { 32 | PAFPlayer pafPlayer = PAFPlayerManager.getInstance().getPlayer(p); 33 | return PartyManager.getInstance().getParty(pafPlayer).isLeader(pafPlayer); 34 | } 35 | 36 | @Override 37 | public List getMembers(UUID owner) { 38 | ArrayList playerList = new ArrayList<>(); 39 | PlayerParty party = getPAFParty(owner); 40 | for (PAFPlayer players : party.getAllPlayers()) { 41 | playerList.add(players.getUniqueId()); 42 | } 43 | return playerList; 44 | } 45 | 46 | @Override 47 | public void createParty(Player owner, Player... members) { 48 | } 49 | 50 | @Override 51 | public void addMember(UUID owner, Player member) { 52 | } 53 | 54 | @Override 55 | public void removeFromParty(UUID member) { 56 | } 57 | 58 | @Override 59 | public void disband(UUID owner) { 60 | } 61 | 62 | @Override 63 | public boolean isMember(UUID owner, UUID check) { 64 | return getPAFParty(owner).isInParty(PAFPlayerManager.getInstance().getPlayer(check)); 65 | } 66 | 67 | @Override 68 | public void removePlayer(UUID owner, UUID target) { 69 | } 70 | 71 | @Override 72 | public boolean isInternal() { 73 | return false; 74 | } 75 | 76 | @Override 77 | public UUID getOwner(UUID player) { 78 | return getPAFParty(player).getLeader().getUniqueId(); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/party/Parties.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.party; 2 | 3 | import com.alessiodp.parties.api.interfaces.PartiesAPI; 4 | import com.alessiodp.parties.api.interfaces.PartyPlayer; 5 | import com.andrei1058.bedwars.proxy.api.Messages; 6 | import org.bukkit.Bukkit; 7 | import org.bukkit.entity.Player; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | import java.util.UUID; 12 | 13 | import static com.andrei1058.bedwars.proxy.language.Language.getMsg; 14 | 15 | public class Parties implements Party { 16 | 17 | //Support for Parties by AlessioDP 18 | PartiesAPI api = com.alessiodp.parties.api.Parties.getApi(); 19 | 20 | @Override 21 | public boolean hasParty(UUID p) { 22 | PartyPlayer pp = api.getPartyPlayer(p); 23 | return pp != null && pp.isInParty(); 24 | } 25 | 26 | @Override 27 | public int partySize(UUID p) { 28 | PartyPlayer pp = api.getPartyPlayer(p); 29 | if (pp == null) return 0; 30 | if (pp.getPartyId() == null) return 0; 31 | com.alessiodp.parties.api.interfaces.Party party = api.getParty(pp.getPartyId()); 32 | if (party == null) return 0; 33 | return party.getMembers().size(); 34 | } 35 | 36 | @Override 37 | public boolean isOwner(UUID p) { 38 | PartyPlayer pp = api.getPartyPlayer(p); 39 | if (pp == null) return false; 40 | if (pp.getPartyId() == null) return false; 41 | com.alessiodp.parties.api.interfaces.Party party = api.getParty(pp.getPartyId()); 42 | if (party == null) return false; 43 | if (party.getLeader() == null) return false; 44 | return party.getLeader().equals(p); 45 | } 46 | 47 | @Override 48 | public List getMembers(UUID p) { 49 | ArrayList players = new ArrayList<>(); 50 | PartyPlayer pp = api.getPartyPlayer(p); 51 | if (pp == null) return players; 52 | if (pp.getPartyId() == null) return players; 53 | com.alessiodp.parties.api.interfaces.Party party = api.getParty(pp.getPartyId()); 54 | if (party == null) return players; 55 | players.addAll(party.getMembers()); 56 | return players; 57 | } 58 | 59 | @Override 60 | public void createParty(Player owner, Player... members) { 61 | } 62 | 63 | @Override 64 | public void addMember(UUID owner, Player member) { 65 | } 66 | 67 | @Override 68 | public void removeFromParty(UUID member) { 69 | PartyPlayer pp = api.getPartyPlayer(member); 70 | if (pp == null) return; 71 | if (pp.getPartyId() == null) return; 72 | com.alessiodp.parties.api.interfaces.Party party = api.getParty(pp.getPartyId()); 73 | if (party == null) return; 74 | if (party.getLeader() != null && party.getLeader().equals(member)){ 75 | disband(member); 76 | } else { 77 | party.removeMember(pp); 78 | Player target = Bukkit.getPlayer(member); 79 | if (target != null) { 80 | for (UUID mem : party.getMembers()) { 81 | Player p = Bukkit.getPlayer(mem); 82 | if (p == null) continue; 83 | if (!p.isOnline()) continue; 84 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_LEAVE_SUCCESS).replace("{player}", target.getName())); 85 | } 86 | } 87 | } 88 | } 89 | 90 | @Override 91 | public void disband(UUID owner) { 92 | PartyPlayer pp = api.getPartyPlayer(owner); 93 | if (pp == null) return; 94 | if (pp.getPartyId() == null) return; 95 | com.alessiodp.parties.api.interfaces.Party party = api.getParty(pp.getPartyId()); 96 | if (party == null) return; 97 | for (UUID mem : party.getMembers()) { 98 | Player p = Bukkit.getPlayer(mem); 99 | if (p == null) continue; 100 | if (!p.isOnline()) continue; 101 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_DISBAND_SUCCESS)); 102 | } 103 | party.delete(); 104 | } 105 | 106 | @Override 107 | public boolean isMember(UUID owner, UUID check) { 108 | PartyPlayer pp = api.getPartyPlayer(owner); 109 | if (pp == null) return false; 110 | if (pp.getPartyId() == null) return false; 111 | com.alessiodp.parties.api.interfaces.Party party = api.getParty(pp.getPartyId()); 112 | if (party == null) return false; 113 | return party.getMembers().contains(check); 114 | } 115 | 116 | @Override 117 | public void removePlayer(UUID owner, UUID target) { 118 | PartyPlayer pp = api.getPartyPlayer(target); 119 | if (pp == null) return; 120 | if (pp.getPartyId() == null) return; 121 | com.alessiodp.parties.api.interfaces.Party party = api.getParty(pp.getPartyId()); 122 | if (party == null) return; 123 | party.removeMember(pp); 124 | for (UUID mem : party.getMembers()) { 125 | Player p = Bukkit.getPlayer(mem); 126 | if (p == null) continue; 127 | if (!p.isOnline()) continue; 128 | p.sendMessage(getMsg(p, Messages.COMMAND_PARTY_REMOVE_SUCCESS)); 129 | } 130 | } 131 | 132 | @Override 133 | public boolean isInternal() { 134 | return false; 135 | } 136 | 137 | @Override 138 | public UUID getOwner(UUID player) { 139 | PartyPlayer pp = api.getPartyPlayer(player); 140 | if (pp == null) return null; 141 | if (pp.getPartyId() == null) return null; 142 | com.alessiodp.parties.api.interfaces.Party party = api.getParty(pp.getPartyId()); 143 | if (party == null) return null; 144 | if (party.getLeader() == null) return null; 145 | return party.getLeader(); 146 | } 147 | } 148 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/party/Party.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.party; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | import java.util.List; 6 | import java.util.UUID; 7 | 8 | public interface Party { 9 | 10 | boolean hasParty(UUID p); 11 | 12 | int partySize(UUID p); 13 | 14 | boolean isOwner(UUID p); 15 | 16 | List getMembers(UUID owner); 17 | 18 | void createParty(Player owner, Player... members); 19 | 20 | void addMember(UUID owner, Player member); 21 | 22 | void removeFromParty(UUID member); 23 | 24 | void disband(UUID owner); 25 | 26 | boolean isMember(UUID owner, UUID check); 27 | 28 | void removePlayer(UUID owner, UUID target); 29 | 30 | boolean isInternal(); 31 | 32 | UUID getOwner(UUID player); 33 | } 34 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/rejoin/RemoteReJoin.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.rejoin; 2 | 3 | import com.andrei1058.bedwars.proxy.api.CachedArena; 4 | 5 | import java.util.UUID; 6 | import java.util.concurrent.ConcurrentHashMap; 7 | 8 | public class RemoteReJoin implements com.andrei1058.bedwars.proxy.api.RemoteReJoin { 9 | 10 | private CachedArena arena; 11 | private UUID uuid; 12 | 13 | private static ConcurrentHashMap rejoinByUUID = new ConcurrentHashMap<>(); 14 | 15 | public RemoteReJoin(UUID player, CachedArena arena){ 16 | this.uuid = player; 17 | this.arena = arena; 18 | rejoinByUUID.put(uuid, this); 19 | } 20 | 21 | public static com.andrei1058.bedwars.proxy.api.RemoteReJoin getReJoin(UUID player){ 22 | return rejoinByUUID.getOrDefault(player, null); 23 | } 24 | 25 | public CachedArena getArena() { 26 | return arena; 27 | } 28 | 29 | public UUID getUUID() { 30 | return uuid; 31 | } 32 | 33 | public void destroy(){ 34 | rejoinByUUID.remove(uuid); 35 | } 36 | 37 | public static ConcurrentHashMap getRejoinByUUID() { 38 | return rejoinByUUID; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/socketmanager/ServerSocketTask.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.socketmanager; 2 | 3 | import org.bukkit.Bukkit; 4 | 5 | import java.io.IOException; 6 | import java.net.ServerSocket; 7 | import java.net.Socket; 8 | 9 | import static com.andrei1058.bedwars.proxy.BedWarsProxy.getPlugin; 10 | 11 | public class ServerSocketTask { 12 | 13 | private static ServerSocketTask instance = null; 14 | 15 | private ServerSocket serverSocket; 16 | public static boolean compute = true; 17 | private int task; 18 | 19 | private ServerSocketTask(int port) throws IOException { 20 | serverSocket = new ServerSocket(port); 21 | instance = this; 22 | compute = true; 23 | task = Bukkit.getScheduler().runTaskAsynchronously(getPlugin(), ()-> { 24 | while (compute){ 25 | try { 26 | Socket s = serverSocket.accept(); 27 | Bukkit.getScheduler().runTaskAsynchronously(getPlugin(), new ArenaSocketTask(s)); 28 | } catch (IOException e) { 29 | e.printStackTrace(); 30 | } 31 | } 32 | }).getTaskId(); 33 | } 34 | 35 | public static boolean init(int port){ 36 | if (instance == null) { 37 | try { 38 | new ServerSocketTask(port); 39 | return true; 40 | } catch (IOException e) { 41 | return false; 42 | } 43 | } 44 | return true; 45 | } 46 | 47 | public static void stopTasks(){ 48 | if (instance != null){ 49 | compute = false; 50 | Bukkit.getScheduler().cancelTask(instance.task); 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/socketmanager/TimeOutTask.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.socketmanager; 2 | 3 | import com.andrei1058.bedwars.proxy.arenamanager.ArenaManager; 4 | import com.andrei1058.bedwars.proxy.api.ArenaStatus; 5 | import com.andrei1058.bedwars.proxy.api.CachedArena; 6 | import com.andrei1058.bedwars.proxy.api.event.ArenaCacheUpdateEvent; 7 | import org.bukkit.Bukkit; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | public class TimeOutTask implements Runnable { 13 | 14 | private static final List toRemove = new ArrayList<>(); 15 | 16 | @Override 17 | public void run() { 18 | long time = System.currentTimeMillis()-5000; 19 | for (CachedArena ca : ArenaManager.getArenas()){ 20 | if (ca.getLastUpdate() < time){ 21 | if (ca.getStatus() != ArenaStatus.RESTARTING && ca.getStatus() != ArenaStatus.UNKNOWN){ 22 | ca.setStatus(ArenaStatus.UNKNOWN); 23 | Bukkit.getPluginManager().callEvent(new ArenaCacheUpdateEvent(ca)); 24 | } else if (ca.getStatus() == ArenaStatus.RESTARTING || ca.getStatus() == ArenaStatus.UNKNOWN){ 25 | if (ca.getLastUpdate()+5000 < time){ 26 | if (ca.getStatus() != ArenaStatus.UNKNOWN) { 27 | ca.setStatus(ArenaStatus.UNKNOWN); 28 | } 29 | toRemove.add(ca); 30 | } 31 | } 32 | } 33 | } 34 | if (!toRemove.isEmpty()){ 35 | toRemove.forEach(ca -> ArenaManager.getInstance().disableArena(ca)); 36 | toRemove.clear(); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/java/com/andrei1058/bedwars/proxy/support/papi/SupportPAPI.java: -------------------------------------------------------------------------------- 1 | package com.andrei1058.bedwars.proxy.support.papi; 2 | 3 | import com.andrei1058.bedwars.proxy.BedWarsProxy; 4 | import com.andrei1058.bedwars.proxy.arenamanager.ArenaManager; 5 | import com.andrei1058.bedwars.proxy.api.CachedArena; 6 | import com.andrei1058.bedwars.proxy.api.Messages; 7 | import me.clip.placeholderapi.expansion.PlaceholderExpansion; 8 | import org.bukkit.entity.Player; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | import java.text.SimpleDateFormat; 12 | 13 | import static com.andrei1058.bedwars.proxy.language.Language.getMsg; 14 | 15 | public class SupportPAPI extends PlaceholderExpansion { 16 | 17 | @Override 18 | public boolean persist() { 19 | return true; 20 | } 21 | 22 | @NotNull 23 | @Override 24 | public String getIdentifier() { 25 | return "bw1058"; 26 | } 27 | 28 | @NotNull 29 | @Override 30 | public String getAuthor() { 31 | return "andrei1058"; 32 | } 33 | 34 | @NotNull 35 | @Override 36 | public String getVersion() { 37 | return BedWarsProxy.getPlugin().getDescription().getVersion(); 38 | } 39 | 40 | @Override 41 | public String onPlaceholderRequest(Player p, String s) { 42 | 43 | if (s.contains("group_count_")){ 44 | String group = s.replace("group_count_", ""); 45 | int amount = ArenaManager.getArenas().stream().filter(a -> a.getArenaGroup().equalsIgnoreCase(group)).mapToInt(CachedArena::getCurrentPlayers).sum(); 46 | return String.valueOf(amount); 47 | } 48 | 49 | String replay = ""; 50 | switch (s){ 51 | case "current_online": 52 | replay = String.valueOf(ArenaManager.getArenas().stream().mapToInt(CachedArena::getCurrentPlayers).sum()); 53 | break; 54 | case "current_arenas": 55 | replay = String.valueOf(ArenaManager.getArenas().size()); 56 | break; 57 | } 58 | if (!replay.isEmpty()) return replay; 59 | if (p == null) return null; 60 | if (p.getUniqueId() == null) return null; 61 | switch (s) { 62 | case "stats_firstplay": 63 | replay = new SimpleDateFormat(getMsg(p, Messages.FORMATTING_STATS_DATE_FORMAT)).format(BedWarsProxy.getStatsCache().getPlayerFirstPlay(p.getUniqueId())); 64 | break; 65 | case "stats_lastplay": 66 | replay = new SimpleDateFormat(getMsg(p, Messages.FORMATTING_STATS_DATE_FORMAT)).format(BedWarsProxy.getStatsCache().getPlayerLastPlay(p.getUniqueId())); 67 | break; 68 | case "stats_kills": 69 | replay = String.valueOf(BedWarsProxy.getStatsCache().getPlayerKills(p.getUniqueId())); 70 | break; 71 | case "stats_total_kills": 72 | replay = String.valueOf(BedWarsProxy.getStatsCache().getPlayerKills(p.getUniqueId()) + BedWarsProxy.getStatsCache().getPlayerFinalKills(p.getUniqueId())); 73 | break; 74 | case "stats_wins": 75 | replay = String.valueOf(BedWarsProxy.getStatsCache().getPlayerWins(p.getUniqueId())); 76 | break; 77 | case "stats_finalkills": 78 | replay = String.valueOf(BedWarsProxy.getStatsCache().getPlayerFinalKills(p.getUniqueId())); 79 | break; 80 | case "stats_deaths": 81 | replay = String.valueOf(BedWarsProxy.getStatsCache().getPlayerDeaths(p.getUniqueId())); 82 | break; 83 | case "stats_losses": 84 | replay = String.valueOf(BedWarsProxy.getStatsCache().getPlayerLoses(p.getUniqueId())); 85 | break; 86 | case "stats_finaldeaths": 87 | replay = String.valueOf(BedWarsProxy.getStatsCache().getPlayerFinalDeaths(p.getUniqueId())); 88 | break; 89 | case "stats_bedsdestroyed": 90 | replay = String.valueOf(BedWarsProxy.getStatsCache().getPlayerBedsDestroyed(p.getUniqueId())); 91 | break; 92 | case "stats_gamesplayed": 93 | replay = String.valueOf(BedWarsProxy.getStatsCache().getPlayerGamesPlayed(p.getUniqueId())); 94 | break; 95 | case "player_level": 96 | replay = BedWarsProxy.getLevelManager().getLevel(p); 97 | break; 98 | case "player_level_raw": 99 | replay = String.valueOf(BedWarsProxy.getLevelManager().getPlayerLevel(p)); 100 | break; 101 | case "player_progress": 102 | replay = BedWarsProxy.getLevelManager().getProgressBar(p); 103 | break; 104 | case "player_xp_formatted": 105 | replay = BedWarsProxy.getLevelManager().getCurrentXpFormatted(p); 106 | break; 107 | case "player_xp": 108 | replay = String.valueOf(BedWarsProxy.getLevelManager().getCurrentXp(p)); 109 | break; 110 | case "player_rerq_xp_formatted": 111 | case "player_req_xp_formatted": 112 | replay = BedWarsProxy.getLevelManager().getRequiredXpFormatted(p); 113 | break; 114 | case "player_rerq_xp": 115 | case "player_req_xp": 116 | replay = String.valueOf(BedWarsProxy.getLevelManager().getRequiredXp(p)); 117 | break; 118 | } 119 | return replay; 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /proxy-plugin/src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | name: BedWarsProxy 2 | version: ${gitVer}${project.version} 3 | description: Arena connecter for BedWars1058 4 | main: com.andrei1058.bedwars.proxy.BedWarsProxy 5 | author: andrei1058 6 | api-version: '1.13' 7 | softdepend: ['PlaceholderAPI', 'Spigot-Party-API-PAF', 'Parties', 'PartyAndFriends'] --------------------------------------------------------------------------------