Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'master' of https://github.com/retromcorg/Project-Poseidon into retromcorg-master

+738 -229
+39
.github/workflows/java21-buld-test.yaml
··· 1 + name: Java-Compatibility 2 + on: 3 + pull_request: 4 + types: 5 + - opened 6 + - synchronize 7 + - reopened 8 + push: 9 + branches: 10 + - master 11 + - main 12 + 13 + jobs: 14 + build: 15 + runs-on: ubuntu-latest 16 + strategy: 17 + matrix: 18 + # Java 8 is tested as a part of the build-and-test workflow 19 + java-version: ['17', '21' ] 20 + steps: 21 + - name: Checkout 22 + uses: actions/checkout@v3 23 + 24 + - name: Set up Java ${{ matrix.java-version }} 25 + uses: actions/setup-java@v2 26 + with: 27 + java-version: ${{ matrix.java-version }} 28 + distribution: temurin 29 + java-package: jdk 30 + 31 + - name: Set up Maven 32 + uses: stCarolas/setup-maven@v4.5 33 + with: 34 + maven-version: 3.9.1 35 + 36 + - name: Build application 37 + shell: bash 38 + run: | 39 + mvn clean install
+97
.github/workflows/release.yml
··· 1 + name: Release Workflow 2 + 3 + on: 4 + push: 5 + branches: 6 + - main 7 + - master 8 + 9 + jobs: 10 + build: 11 + runs-on: ubuntu-latest 12 + 13 + steps: 14 + # Step 1: Checkout the repository 15 + - name: Checkout 16 + uses: actions/checkout@v4 17 + 18 + # Step 2: Set up JDK 1.8 19 + - name: Set up JDK 1.8 20 + uses: actions/setup-java@v2 21 + with: 22 + distribution: 'temurin' 23 + java-version: 8 24 + 25 + # Step 3: Get the version from pom.xml 26 + - name: Get the version from pom.xml 27 + id: get_version 28 + run: echo "PROJECT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV 29 + 30 + # Step 4: Fail if snapshot version 31 + - name: Fail if snapshot version 32 + run: | 33 + if [[ $PROJECT_VERSION == *"-SNAPSHOT"* ]]; then 34 + echo "Snapshot versions are not releasable" 35 + exit 0 36 + fi 37 + 38 + # Step 5: Generate custom release version 39 + - name: Generate Release Version 40 + id: release_version 41 + run: | 42 + DATE=$(date +'%y%m%d-%H%M') 43 + SHA=$(echo $GITHUB_SHA | cut -c1-7) 44 + RELEASE_VERSION="${PROJECT_VERSION}-${DATE}-${SHA}" 45 + echo "RELEASE_VERSION=$RELEASE_VERSION" >> $GITHUB_ENV 46 + 47 + # Step 6: Create version.properties file 48 + - name: Create version.properties file 49 + run: | 50 + mkdir -p src/main/resources 51 + 52 + # Application Information 53 + APP_NAME=$(mvn help:evaluate -Dexpression=project.name -q -DforceStdout) 54 + 55 + # Core Metadata 56 + echo "version=${{ env.RELEASE_VERSION }}" >> src/main/resources/version.properties 57 + echo "build_timestamp=$(date --utc +'%Y-%m-%dT%H:%M:%SZ')" >> src/main/resources/version.properties 58 + echo "git_branch=${{ github.ref_name }}" >> src/main/resources/version.properties 59 + echo "git_commit=${GITHUB_SHA}" >> src/main/resources/version.properties 60 + 61 + echo "app_name=${APP_NAME}" >> src/main/resources/version.properties 62 + echo "release_version=${{ env.RELEASE_VERSION }}" >> src/main/resources/version.properties 63 + echo "maven_version=${{ env.PROJECT_VERSION }}" >> src/main/resources/version.properties 64 + 65 + # Build Type 66 + if [[ "${{ github.ref }}" == "refs/heads/master" || "${{ github.ref }}" == "refs/heads/main" ]]; then 67 + BUILD_TYPE="production" 68 + elif [[ "${{ github.event_name }}" == "pull_request" ]]; then 69 + BUILD_TYPE="pull_request" 70 + else 71 + BUILD_TYPE="development" 72 + fi 73 + echo "build_type=${BUILD_TYPE}" >> src/main/resources/version.properties 74 + 75 + # CI/CD Metadata 76 + echo "workflow_name=${{ github.workflow }}" >> src/main/resources/version.properties 77 + echo "workflow_run_id=${{ github.run_id }}" >> src/main/resources/version.properties 78 + echo "workflow_run_number=${{ github.run_number }}" >> src/main/resources/version.properties 79 + 80 + # Team or Author Information 81 + echo "build_author=${{ github.actor }}" >> src/main/resources/version.properties 82 + 83 + # Step 7: Build with Maven 84 + - name: Build with Maven 85 + run: mvn clean package 86 + 87 + # Step 8: Create GitHub Release 88 + - name: Create GitHub Release 89 + if: ${{ !endsWith(env.PROJECT_VERSION, '-SNAPSHOT') }} 90 + uses: softprops/action-gh-release@v1 91 + with: 92 + tag_name: ${{ env.RELEASE_VERSION }} 93 + name: ${{ env.RELEASE_VERSION }} 94 + files: | 95 + target/*.jar 96 + env: 97 + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+2
README.md
··· 46 46 You can download the latest build through [GitHub actions](https://github.com/Moresteck/Project-Poseidon-Uberbukkit/actions/workflows/build-and-test.yaml) (You need to be logged in on GitHub) <br> 47 47 or get it from [betacraft.uk](https://betacraft.uk/utilities) along with **pre-made configuration files**. 48 48 49 + Please note, download the artifact (JAR) without `original` in the name, eg. `uberbukkit-2.0.2.jar`. 50 + 49 51 ## Licensing 50 52 CraftBukkit and Bukkit are licensed under GNU General Public License v3.0<br> 51 53 Any future commits to this repository will remain under the same GNU General Public License v3.0<br>
+11 -11
pom.xml
··· 112 112 <dependency> 113 113 <groupId>org.yaml</groupId> 114 114 <artifactId>snakeyaml</artifactId> 115 - <version>1.7</version> 115 + <version>2.0</version> 116 116 <type>jar</type> 117 117 <scope>provided</scope> 118 118 </dependency> ··· 133 133 <dependency> 134 134 <groupId>com.google.guava</groupId> 135 135 <artifactId>guava</artifactId> 136 - <version>30.1.1-jre</version> 136 + <version>32.0.0-jre</version> 137 137 <type>jar</type> 138 138 <scope>compile</scope> 139 139 </dependency> ··· 153 153 <!-- This builds a completely 'ready to start' jar with all dependencies inside --> 154 154 <build> 155 155 <defaultGoal>clean install</defaultGoal> 156 - <!-- <sourceDirectory>src</sourceDirectory>--> 157 - <!-- <resources>--> 158 - <!-- <resource>--> 159 - <!-- <directory>src</directory>--> 160 - <!-- <excludes>--> 161 - <!-- <exclude>**/*.java</exclude>--> 162 - <!-- </excludes>--> 163 - <!-- </resource>--> 164 - <!-- </resources>--> 156 + <!-- <sourceDirectory>src</sourceDirectory>--> 157 + <!-- <resources>--> 158 + <!-- <resource>--> 159 + <!-- <directory>src</directory>--> 160 + <!-- <excludes>--> 161 + <!-- <exclude>**/*.java</exclude>--> 162 + <!-- </excludes>--> 163 + <!-- </resource>--> 164 + <!-- </resources>--> 165 165 <plugins> 166 166 <plugin> 167 167 <groupId>org.apache.maven.plugins</groupId>
+15 -1
src/main/java/com/legacyminecraft/poseidon/Poseidon.java
··· 1 1 package com.legacyminecraft.poseidon; 2 2 3 3 import org.bukkit.Bukkit; 4 + import org.bukkit.Server; 4 5 import org.bukkit.craftbukkit.CraftServer; 5 6 6 7 import java.util.LinkedList; 7 8 8 - public class Poseidon { 9 + public final class Poseidon { 10 + private static PoseidonServer server; 9 11 10 12 /** 11 13 * Returns a list of the server's TPS (Ticks Per Second) records for performance monitoring. ··· 15 17 */ 16 18 public static LinkedList<Double> getTpsRecords() { 17 19 return ((CraftServer) Bukkit.getServer()).getServer().getTpsRecords(); 20 + } 21 + 22 + public static PoseidonServer getServer() { 23 + return server; 24 + } 25 + 26 + public static void setServer(PoseidonServer server) { 27 + if (Poseidon.server != null) { 28 + throw new UnsupportedOperationException("Cannot redefine singleton Server"); 29 + } 30 + 31 + Poseidon.server = server; 18 32 } 19 33 20 34
+12
src/main/java/com/legacyminecraft/poseidon/PoseidonConfig.java
··· 134 134 generateConfigOption("world.settings.block-tree-growth.info", "This setting allows for server owners to easily block trees growing from automatically destroying certain blocks. The list must be a string with numerical item ids separated by commas."); 135 135 generateConfigOption("world.settings.block-pistons-pushing-furnaces.info", "This workaround prevents pistons from pushing furnaces which prevents a malicious server crash."); 136 136 generateConfigOption("world.settings.block-pistons-pushing-furnaces.enabled", true); 137 + generateConfigOption("world.settings.pistons.transmutation-fix.enabled", true); 138 + generateConfigOption("world.settings.pistons.transmutation-fix.info", "This setting fixes block transmutation exploits."); 139 + generateConfigOption("world.settings.pistons.sand-gravel-duping-fix.enabled", true); 140 + generateConfigOption("world.settings.pistons.sand-gravel-duping-fix.info", "This setting fixes sand/gravel duplication exploits."); 141 + generateConfigOption("world.settings.pistons.other-fixes.enabled", true); 142 + generateConfigOption("world.settings.pistons.other-fixes.info", "This setting fixes various other piston exploits like creating illegal pistons, breaking bedrock and duplicating redstone torches."); 137 143 generateConfigOption("world.settings.skeleton-shooting-sound-fix.info", "This setting fixes the sound of skeletons and players shooting not playing on clients."); 138 144 generateConfigOption("world.settings.skeleton-shooting-sound-fix.enabled", true); 139 145 generateConfigOption("world.settings.speed-hack-check.enable", true); ··· 172 178 generateConfigOption("emergency.debug.regenerate-corrupt-chunks.enable", false); 173 179 generateConfigOption("emergency.debug.regenerate-corrupt-chunks.info", "This setting allows you to automatically regenerate corrupt chunks. This is useful after a ungraceful shutdown while a file is being written to or out of memory exception."); 174 180 181 + generateConfigOption("settings.update-checker.enabled", true); 182 + generateConfigOption("settings.update-checker.info", "This setting allows you to disable the update checker. This is useful if you have a custom build of Poseidon or don't want to be notified of updates."); 183 + generateConfigOption("settings.update-checker.notify-staff.enabled", true); 184 + generateConfigOption("settings.update-checker.notify-staff.info", "This setting notifies operators and players with the permission poseidon.update when a new version of Poseidon is available on join."); 185 + 175 186 //Messages 176 187 generateConfigOption("message.kick.banned", "You are banned from this server!"); 177 188 generateConfigOption("message.kick.ip-banned", "Your IP address is banned from this server!"); ··· 181 192 generateConfigOption("message.kick.already-online", "\u00A7cA player with your username or uuid is already online, try reconnecting in a minute."); 182 193 generateConfigOption("message.player.join", "\u00A7e%player% joined the game."); 183 194 generateConfigOption("message.player.leave", "\u00A7e%player% left the game."); 195 + generateConfigOption("message.update.available", "\u00A7dA newer version of Poseidon is available: %newversion%"); 184 196 185 197 //Optional Poseidon Commands 186 198 generateConfigOption("command.info", "This section allows you to enable or disable optional Poseidon commands. This is useful if you have a plugin that conflicts with a Poseidon command.");
+200
src/main/java/com/legacyminecraft/poseidon/PoseidonServer.java
··· 1 + package com.legacyminecraft.poseidon; 2 + 3 + import com.legacyminecraft.poseidon.utility.PoseidonVersionChecker; 4 + import com.legacyminecraft.poseidon.watchdog.WatchDogThread; 5 + import com.projectposeidon.johnymuffin.UUIDManager; 6 + import net.minecraft.server.MinecraftServer; 7 + import net.minecraft.server.NetServerHandler; 8 + import org.bukkit.Bukkit; 9 + import org.bukkit.craftbukkit.CraftServer; 10 + 11 + import java.io.IOException; 12 + import java.io.InputStream; 13 + import java.util.ArrayList; 14 + import java.util.Arrays; 15 + import java.util.List; 16 + import java.util.Properties; 17 + import java.util.logging.Logger; 18 + 19 + public final class PoseidonServer { 20 + private final MinecraftServer server; 21 + private final CraftServer craftServer; 22 + 23 + private final List<String> hiddenCommands = new ArrayList<>(); 24 + private final Properties versionProperties = new Properties(); 25 + 26 + private boolean serverInitialized = false; 27 + 28 + private PoseidonVersionChecker poseidonVersionChecker; 29 + private WatchDogThread watchDogThread; 30 + 31 + public PoseidonServer(MinecraftServer server, CraftServer craftServer) { 32 + this.server = server; 33 + this.craftServer = craftServer; 34 + 35 + loadVersionProperties(); 36 + 37 + addHiddenCommands(Arrays.asList("login", "l", "register", "reg", "unregister", "changepassword", "changepw")); 38 + } 39 + 40 + private void loadVersionProperties() { 41 + try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("version.properties")) { 42 + if (inputStream != null) { 43 + versionProperties.load(inputStream); 44 + } 45 + } catch (IOException e) { 46 + getLogger().warning("Failed to load version.properties: " + e.getMessage()); 47 + } 48 + } 49 + 50 + public void initializeServer() { 51 + if (serverInitialized) { 52 + throw new UnsupportedOperationException("Server already initialized"); 53 + } 54 + 55 + getLogger().info("[Poseidon] Starting Project Poseidon Modules!"); 56 + 57 + PoseidonConfig.getInstance(); 58 + UUIDManager.getInstance(); 59 + 60 + initializeUpdateChecker(); 61 + 62 + //Start Watchdog 63 + watchDogThread = new WatchDogThread(Thread.currentThread()); 64 + if (PoseidonConfig.getInstance().getBoolean("settings.enable-watchdog", true)) { 65 + getLogger().info("[Poseidon] Starting Watchdog to detect any server hangs!"); 66 + watchDogThread.start(); 67 + watchDogThread.tickUpdate(); 68 + } 69 + 70 + serverInitialized = true; 71 + getLogger().info("[Poseidon] Finished loading Project Poseidon Modules!"); 72 + } 73 + 74 + private void initializeUpdateChecker() { 75 + if (!PoseidonConfig.getInstance().getConfigBoolean("settings.update-checker.enabled", true)) { 76 + getLogger().info("[Poseidon] Version checker disabled. The server will not check for updates."); 77 + return; 78 + } 79 + 80 + String releaseVersion = getReleaseVersion(); 81 + 82 + if (releaseVersion == null) { 83 + getLogger().warning("[Poseidon] Version checker is disabled as no version.properties file was found."); 84 + return; 85 + } 86 + 87 + if(!getBuildType().equalsIgnoreCase("production")) { 88 + getLogger().warning("[Poseidon] Version checker is disabled as this is a " + getBuildType() + " build. The updater will only check for updates on production builds."); 89 + return; 90 + } 91 + 92 + poseidonVersionChecker = new PoseidonVersionChecker(craftServer, releaseVersion); 93 + 94 + getLogger().info("[Poseidon] Version checker enabled. The server will check for updates every hour."); 95 + // Run the version checker in a separate thread every hour 96 + Bukkit.getScheduler().scheduleSyncRepeatingTask(new PoseidonPlugin(), new Runnable() { 97 + @Override 98 + public void run() { 99 + poseidonVersionChecker.fetchLatestVersion(); 100 + } 101 + }, 0, 20 * 60 * 60); 102 + } 103 + 104 + public void shutdownServer() { 105 + if (!serverInitialized) { 106 + throw new UnsupportedOperationException("Server not initialized"); 107 + } 108 + 109 + getLogger().info("[Poseidon] Stopping Project Poseidon Modules!"); 110 + 111 + UUIDManager.getInstance().saveJsonArray(); 112 + 113 + if (watchDogThread != null) { 114 + getLogger().info("[Poseidon] Stopping Watchdog!"); 115 + watchDogThread.interrupt(); 116 + } 117 + 118 + serverInitialized = false; 119 + getLogger().info("[Poseidon] Finished unloading Project Poseidon Modules!"); 120 + } 121 + 122 + public Logger getLogger() { 123 + return MinecraftServer.log; 124 + } 125 + 126 + public String getAppName() { 127 + return versionProperties.getProperty("app_name", "Unknown"); 128 + } 129 + 130 + public String getReleaseVersion() { 131 + return versionProperties.getProperty("release_version", "Unknown"); 132 + } 133 + 134 + public String getMavenVersion() { 135 + return versionProperties.getProperty("maven_version", "Unknown"); 136 + } 137 + 138 + public String getBuildTimestamp() { 139 + return versionProperties.getProperty("build_timestamp", "Unknown"); 140 + } 141 + 142 + public String getGitCommit() { 143 + return versionProperties.getProperty("git_commit", "Unknown"); 144 + } 145 + 146 + public String getBuildType() { 147 + return versionProperties.getProperty("build_type", "Unknown"); 148 + } 149 + 150 + public boolean isUpdateAvailable() { 151 + return poseidonVersionChecker != null && poseidonVersionChecker.isUpdateAvailable(); 152 + } 153 + 154 + public String getNewestVersion() { 155 + return poseidonVersionChecker == null ? "Unknown" : poseidonVersionChecker.getLatestVersion(); 156 + } 157 + 158 + public WatchDogThread getWatchDogThread() { 159 + return watchDogThread; 160 + } 161 + 162 + /** 163 + * Returns the current hide state of the command from param (Hide from console) 164 + * 165 + * @param cmdName Command name 166 + * @return True if the command from param is hidden and false otherwise 167 + */ 168 + public boolean isCommandHidden(String cmdName) { 169 + return hiddenCommands.contains(cmdName.toLowerCase()); 170 + } 171 + 172 + 173 + /** 174 + * Hides the command from param from being logged to server console 175 + * 176 + * @param cmd Command name 177 + */ 178 + public void addHiddenCommand(String cmd) { 179 + cmd = cmd.toLowerCase(); 180 + 181 + if (hiddenCommands.contains(cmd)) { 182 + Logger.getLogger(NetServerHandler.class.getName()).warning("List of Hidden commands already contains " + cmd); 183 + return; 184 + } 185 + 186 + hiddenCommands.add(cmd); 187 + } 188 + 189 + /** 190 + * Hides the commands from param from being logged to server console 191 + * 192 + * @param commands List of command names 193 + */ 194 + public void addHiddenCommands(List<String> commands) { 195 + for (String cmd : commands) { 196 + addHiddenCommand(cmd); 197 + } 198 + } 199 + 200 + }
+95
src/main/java/com/legacyminecraft/poseidon/commands/PoseidonCommand.java
··· 1 + package com.legacyminecraft.poseidon.commands; 2 + 3 + import com.legacyminecraft.poseidon.Poseidon; 4 + import com.projectposeidon.api.PoseidonUUID; 5 + import com.projectposeidon.api.UUIDType; 6 + import org.bukkit.Bukkit; 7 + import org.bukkit.ChatColor; 8 + import org.bukkit.command.Command; 9 + import org.bukkit.command.CommandSender; 10 + 11 + import java.io.IOException; 12 + import java.io.InputStream; 13 + import java.util.Arrays; 14 + import java.util.Properties; 15 + import java.util.UUID; 16 + 17 + public class PoseidonCommand extends Command { 18 + 19 + private final Properties versionProperties = new Properties(); 20 + 21 + public PoseidonCommand(String name) { 22 + super(name); 23 + this.description = "Show data regarding the server's version of Project Poseidon"; 24 + this.usageMessage = "/poseidon"; 25 + this.setAliases(Arrays.asList("projectposeidon")); 26 + } 27 + 28 + @Override 29 + public boolean execute(CommandSender sender, String currentAlias, String[] args) { 30 + if (args.length == 0) { 31 + String appName = Poseidon.getServer().getAppName(); 32 + String releaseVersion = Poseidon.getServer().getReleaseVersion(); 33 + String mavenVersion = Poseidon.getServer().getMavenVersion(); 34 + String buildTimestamp = Poseidon.getServer().getBuildTimestamp(); 35 + String gitCommit = Poseidon.getServer().getGitCommit(); 36 + String buildType = Poseidon.getServer().getBuildType(); 37 + 38 + // Shorten the git commit hash to 7 characters 39 + if (gitCommit.length() > 7) { 40 + gitCommit = gitCommit.substring(0, 7); 41 + } 42 + 43 + if ("Unknown".equals(releaseVersion)) { 44 + sender.sendMessage(ChatColor.RED + "Warning: version.properties not found. This is a local or unconfigured build."); 45 + } else { 46 + sender.sendMessage(ChatColor.GRAY + "This server is running " + ChatColor.AQUA + appName + ChatColor.GRAY + ":"); 47 + sender.sendMessage(ChatColor.GRAY + " - Version: " + ChatColor.YELLOW + releaseVersion); 48 + sender.sendMessage(ChatColor.GRAY + " - Built at: " + ChatColor.YELLOW + buildTimestamp); 49 + sender.sendMessage(ChatColor.GRAY + " - Git SHA: " + ChatColor.YELLOW + gitCommit); 50 + 51 + if ("production".equalsIgnoreCase(buildType)) { 52 + sender.sendMessage(ChatColor.GREEN + "This is a release build."); 53 + } else if ("pull_request".equalsIgnoreCase(buildType)) { 54 + sender.sendMessage(ChatColor.BLUE + "This is a pull request build."); 55 + } else { 56 + sender.sendMessage(ChatColor.GRAY + "This is a development build."); 57 + } 58 + } 59 + } else if (args.length == 1) { 60 + if (args[0].equalsIgnoreCase("uuid")) { 61 + sender.sendMessage(ChatColor.GRAY + "Please specify a user /poseidon uuid (username)"); 62 + } else { 63 + sender.sendMessage(ChatColor.GRAY + "Unknown sub command."); 64 + } 65 + } else { 66 + if (!args[0].equalsIgnoreCase("uuid")) { 67 + sender.sendMessage(ChatColor.GRAY + "Unknown sub command."); 68 + } else { 69 + UUID uuid = PoseidonUUID.getPlayerUUIDFromCache(args[1], true); 70 + if (uuid == null) { 71 + uuid = PoseidonUUID.getPlayerUUIDFromCache(args[1], false); 72 + } 73 + 74 + if (uuid == null) { 75 + sender.sendMessage(ChatColor.GRAY + "Unable to locate the UUID of the player called: " + ChatColor.WHITE + args[1] + ChatColor.GRAY + ". Please remember usernames are cap sensitive"); 76 + } else { 77 + sender.sendMessage(ChatColor.GRAY + "Username: " + args[1]); 78 + sender.sendMessage(ChatColor.GRAY + "UUID: " + uuid.toString()); 79 + UUIDType uuidType = PoseidonUUID.getPlayerUUIDCacheStatus(args[1]); 80 + if (uuidType.equals(UUIDType.ONLINE)) { 81 + sender.sendMessage(ChatColor.GRAY + "UUID Type: " + ChatColor.GREEN + "Online"); 82 + } else if (uuidType.equals(UUIDType.OFFLINE)) { 83 + sender.sendMessage(ChatColor.GRAY + "UUID Type: " + ChatColor.RED + "Offline"); 84 + } else { 85 + sender.sendMessage(ChatColor.GRAY + "UUID Type: " + ChatColor.DARK_RED + "UNKNOWN"); 86 + } 87 + } 88 + } 89 + } 90 + 91 + return true; 92 + 93 + } 94 + 95 + }
+94
src/main/java/com/legacyminecraft/poseidon/utility/PoseidonVersionChecker.java
··· 1 + package com.legacyminecraft.poseidon.utility; 2 + 3 + import org.bukkit.craftbukkit.CraftServer; 4 + import org.json.simple.JSONObject; 5 + import org.json.simple.parser.JSONParser; 6 + 7 + import java.io.BufferedReader; 8 + import java.io.InputStreamReader; 9 + import java.net.HttpURLConnection; 10 + import java.net.URL; 11 + import java.util.concurrent.atomic.AtomicBoolean; 12 + import java.util.logging.Level; 13 + 14 + public class PoseidonVersionChecker { 15 + 16 + private static final String GITHUB_API_URL = "https://api.github.com/repos/retromcorg/Project-Poseidon/releases/latest"; 17 + private static final String releaseUrl = "https://github.com/retromcorg/Project-Poseidon/releases"; 18 + private final String currentVersion; 19 + private volatile String latestVersion; 20 + private CraftServer server; 21 + 22 + public PoseidonVersionChecker(CraftServer server, String currentVersion) { 23 + this.currentVersion = currentVersion; 24 + this.latestVersion = currentVersion; // Assume the latest version is the current version until checked 25 + this.server = server; 26 + } 27 + 28 + /** 29 + * Checks if a new version is available. 30 + * 31 + * @return true if a newer version is available, false otherwise. 32 + */ 33 + public synchronized boolean isUpdateAvailable() { 34 + return latestVersion != null && !currentVersion.equalsIgnoreCase(latestVersion); 35 + } 36 + 37 + /** 38 + * Fetches the latest release version from GitHub API. 39 + * 40 + * @return the latest version as a String or null if fetching fails. 41 + */ 42 + public void fetchLatestVersion() { 43 + HttpURLConnection connection = null; 44 + try { 45 + URL url = new URL(GITHUB_API_URL); 46 + connection = (HttpURLConnection) url.openConnection(); 47 + connection.setRequestMethod("GET"); 48 + connection.setRequestProperty("Accept", "application/json"); 49 + connection.setConnectTimeout(5000); 50 + connection.setReadTimeout(5000); 51 + 52 + int responseCode = connection.getResponseCode(); 53 + if (responseCode != HttpURLConnection.HTTP_OK) { 54 + server.getLogger().log(Level.WARNING, "[Poseidon] Failed to check GitHub for latest version. HTTP Response Code: " + responseCode); 55 + } 56 + 57 + BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 58 + StringBuilder response = new StringBuilder(); 59 + String line; 60 + 61 + while ((line = reader.readLine()) != null) { 62 + response.append(line); 63 + } 64 + reader.close(); 65 + 66 + JSONParser parser = new JSONParser(); 67 + JSONObject json = (JSONObject) parser.parse(response.toString()); 68 + 69 + this.latestVersion = (String) json.get("tag_name"); 70 + 71 + if (isUpdateAvailable()) { 72 + server.getLogger().log(Level.INFO, "[Poseidon] A new version is available: " + latestVersion); 73 + server.getLogger().log(Level.INFO, "[Poseidon] You are currently running version: " + currentVersion); 74 + server.getLogger().log(Level.INFO, "[Poseidon] Download the latest version here: " + releaseUrl); 75 + } else { 76 + server.getLogger().log(Level.INFO, "[Poseidon] You are running the latest version (" + currentVersion + ") of Project Poseidon."); 77 + } 78 + } catch (Exception e) { 79 + server.getLogger().log(Level.WARNING, "[Poseidon] Failed to check GitHub for latest version.", e); 80 + } finally { 81 + if (connection != null) { 82 + connection.disconnect(); 83 + } 84 + } 85 + } 86 + 87 + public String getCurrentVersion() { 88 + return currentVersion; 89 + } 90 + 91 + public String getLatestVersion() { 92 + return latestVersion; 93 + } 94 + }
+5 -1
src/main/java/net/minecraft/server/BlockPiston.java
··· 340 340 } 341 341 342 342 Block.byId[i2].g(world, i1, j1, k1, world.getData(i1, j1, k1)); 343 - world.setTypeId(i1, j1, k1, 0); 343 + if (PoseidonConfig.getInstance().getConfigBoolean("world.settings.pistons.other-fixes.enabled", true)) { 344 + world.setRawTypeId(i1, j1, k1, 0); 345 + } else { 346 + world.setTypeId(i1, j1, k1, 0); 347 + } 344 348 } 345 349 } 346 350
+1 -1
src/main/java/net/minecraft/server/BlockPistonExtension.java
··· 16 16 public void remove(World world, int i, int j, int k) { 17 17 super.remove(world, i, j, k); 18 18 int l = world.getData(i, j, k); 19 - if (l > 5 || l < 0) return; // CraftBukkit - fixed a piston AIOOBE issue. 19 + if (l < 0 || l == 6 || l == 7 || l > 13) return; // CraftBukkit - fixed a piston AIOOBE issue. 20 20 int i1 = PistonBlockTextures.a[b(l)]; 21 21 22 22 i += PistonBlockTextures.b[i1];
+2 -1
src/main/java/net/minecraft/server/BlockRedstoneTorch.java
··· 1 1 package net.minecraft.server; 2 2 3 + import com.legacyminecraft.poseidon.PoseidonConfig; 3 4 import org.bukkit.event.block.BlockRedstoneEvent; 4 5 5 6 import java.util.ArrayList; ··· 62 63 } 63 64 64 65 public void remove(World world, int i, int j, int k) { 65 - if (this.isOn) { 66 + if (this.isOn && (!PoseidonConfig.getInstance().getConfigBoolean("world.settings.pistons.transmutation-fix.enabled", true) || world.getTypeId(i, j, k) == this.id || world.getTypeId(i, j, k) == 75)) { 66 67 world.applyPhysics(i, j - 1, k, this.id); 67 68 world.applyPhysics(i, j + 1, k, this.id); 68 69 world.applyPhysics(i - 1, j, k, this.id);
+5
src/main/java/net/minecraft/server/BlockSand.java
··· 1 1 package net.minecraft.server; 2 2 3 + import com.legacyminecraft.poseidon.PoseidonConfig; 4 + 3 5 import java.util.Random; 4 6 5 7 public class BlockSand extends Block { ··· 27 29 byte b0 = 32; 28 30 29 31 if (!instaFall && world.a(i - b0, j - b0, k - b0, i + b0, j + b0, k + b0)) { 32 + if (PoseidonConfig.getInstance().getConfigBoolean("world.settings.pistons.sand-gravel-duping-fix.enabled", true)) { 33 + world.setTypeId(i, j, k, 0); 34 + } 30 35 EntityFallingSand entityfallingsand = new EntityFallingSand(world, i + 0.5D, j + 0.5D, k + 0.5D, this.id); 31 36 32 37 world.addEntity(entityfallingsand);
+4 -1
src/main/java/net/minecraft/server/BlockTorch.java
··· 1 1 package net.minecraft.server; 2 2 3 + import com.legacyminecraft.poseidon.PoseidonConfig; 4 + 3 5 import java.util.Random; 4 6 5 7 import uk.betacraft.uberbukkit.UberbukkitConfig; ··· 34 36 } 35 37 36 38 public void postPlace(World world, int i, int j, int k, int l) { 39 + if (PoseidonConfig.getInstance().getConfigBoolean("world.settings.pistons.transmutation-fix.enabled", true) && world.getTypeId(i, j, k) != this.id) return; 37 40 int i1 = world.getData(i, j, k); 38 41 39 42 if (l == 1 && this.g(world, i, j - 1, k)) { ··· 115 118 } 116 119 117 120 private boolean h(World world, int i, int j, int k) { 118 - if (!this.canPlace(world, i, j, k)) { 121 + if (!this.canPlace(world, i, j, k) && (!PoseidonConfig.getInstance().getConfigBoolean("world.settings.pistons.other-fixes.enabled") || world.getTypeId(i, j, k) == this.id)) { 119 122 this.g(world, i, j, k, world.getData(i, j, k)); 120 123 world.setTypeId(i, j, k, 0); 121 124 return false;
+12 -4
src/main/java/net/minecraft/server/Chunk.java
··· 1 1 package net.minecraft.server; 2 2 3 + import com.legacyminecraft.poseidon.PoseidonConfig; 4 + 3 5 import java.util.*; 4 6 5 7 public class Chunk { ··· 235 237 int i2 = this.z * 16 + k; 236 238 237 239 this.b[i << 11 | k << 7 | j] = (byte) (b0 & 255); 238 - if (k1 != 0 && !this.world.isStatic) { 239 - Block.byId[k1].remove(this.world, l1, j, i2); 240 + if (PoseidonConfig.getInstance().getConfigBoolean("world.settings.pistons.transmutation-fix.enabled", true)) { 241 + this.e.a(i, j, k, i1); 242 + if (k1 != 0 && !this.world.isStatic) { 243 + Block.byId[k1].remove(this.world, l1, j, i2); 244 + } 245 + } else { 246 + if (k1 != 0 && !this.world.isStatic) { 247 + Block.byId[k1].remove(this.world, l1, j, i2); 248 + } 249 + this.e.a(i, j, k, i1); 240 250 } 241 251 242 - this.e.a(i, j, k, i1); 243 252 if (!this.world.worldProvider.e) { 244 253 if (Block.q[b0 & 255] != 0) { 245 254 if (j >= j1) { ··· 254 263 255 264 this.world.a(EnumSkyBlock.BLOCK, l1, j, i2, l1, j, i2); 256 265 this.c(i, k); 257 - this.e.a(i, j, k, i1); 258 266 if (l != 0) { 259 267 Block.byId[l].c(this.world, l1, j, i2); 260 268 }
+7
src/main/java/net/minecraft/server/EntityPlayer.java
··· 15 15 import org.bukkit.craftbukkit.inventory.CraftItemStack; 16 16 import org.bukkit.entity.Player; 17 17 import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; 18 + import org.bukkit.event.inventory.ChestOpenedEvent; 18 19 19 20 import com.legacyminecraft.poseidon.PoseidonConfig; 20 21 import com.legacyminecraft.poseidon.event.PlayerDeathEvent; ··· 498 499 499 500 public void a(IInventory iinventory) { 500 501 this.ai(); 502 + 503 + // Poseidon start 504 + ChestOpenedEvent event = new ChestOpenedEvent((org.bukkit.entity.Player) this.getBukkitEntity(), iinventory.getContents()); 505 + this.world.getServer().getPluginManager().callEvent(event); 506 + if (event.isCancelled()) return; 507 + // Poseidon end 501 508 502 509 this.netServerHandler.sendPacket(new Packet100OpenWindow(this.bO, 0, iinventory.getName(), iinventory.getSize())); 503 510 this.activeContainer = new ContainerChest(this.inventory, iinventory);
+1 -1
src/main/java/net/minecraft/server/IInventory.java
··· 18 18 19 19 boolean a_(EntityHuman entityhuman); 20 20 21 - public abstract ItemStack[] getContents(); // CraftBukkit 21 + ItemStack[] getContents(); // CraftBukkit 22 22 }
+11 -5
src/main/java/net/minecraft/server/ItemBlock.java
··· 1 1 package net.minecraft.server; 2 2 3 3 // CraftBukkit start 4 - 4 + import com.legacyminecraft.poseidon.PoseidonConfig; 5 5 import org.bukkit.craftbukkit.block.CraftBlockState; 6 6 import org.bukkit.craftbukkit.event.CraftEventFactory; 7 7 import org.bukkit.event.block.BlockPlaceEvent; ··· 103 103 return true; 104 104 105 105 } 106 - world.update(i, j, k, this.id); // <-- world.setTypeIdAndData does this on success (tell the world) 107 - 108 106 // CraftBukkit end 109 107 110 - Block.byId[this.id].postPlace(world, i, j, k, l); 111 - Block.byId[this.id].postPlace(world, i, j, k, entityhuman); 108 + if (PoseidonConfig.getInstance().getConfigBoolean("world.settings.pistons.other-fixes.enabled", true) && (this.id == 29 || this.id == 33)) { 109 + Block.byId[this.id].postPlace(world, i, j, k, l); 110 + Block.byId[this.id].postPlace(world, i, j, k, entityhuman); 111 + world.update(i, j, k, this.id); // <-- world.setTypeIdAndData does this on success (tell the world) 112 + } else { 113 + world.update(i, j, k, this.id); 114 + Block.byId[this.id].postPlace(world, i, j, k, l); 115 + Block.byId[this.id].postPlace(world, i, j, k, entityhuman); 116 + } 117 + 112 118 world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), block.stepSound.getName(), (block.stepSound.getVolume1() + 1.0F) / 2.0F, block.stepSound.getVolume2() * 0.8F); 113 119 --itemstack.count; 114 120 }
+1 -8
src/main/java/net/minecraft/server/ItemInWorldManager.java
··· 283 283 boolean flag = this.b(i, j, k); 284 284 ItemStack itemstack = this.player.G(); 285 285 286 - if (itemstack != null) { 287 - itemstack.a(l, i, j, k, this.player); 288 - // Uberbukkit - ref1 289 - } 290 - 291 286 if (flag && this.player.b(Block.byId[l])) { 292 287 Block.byId[l].a(this.world, this.player, i, j, k, i1); 293 288 ((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, this.world)); 294 289 } 295 290 296 - // Uberbukkit - moved from ref1 297 - // Fix tools not dropping the block on their last use 298 - // TODO maybe make it optional? 299 291 if (itemstack != null) { 292 + itemstack.a(l, i, j, k, this.player); 300 293 if (itemstack.count == 0) { 301 294 itemstack.a(this.player); 302 295 this.player.H();
+10 -29
src/main/java/net/minecraft/server/MinecraftServer.java
··· 1 1 package net.minecraft.server; 2 2 3 + import com.legacyminecraft.poseidon.Poseidon; 3 4 import com.legacyminecraft.poseidon.PoseidonConfig; 4 5 import com.legacyminecraft.poseidon.util.CrackedAllowlist; 5 6 import com.legacyminecraft.poseidon.util.ServerLogRotator; 6 - import com.projectposeidon.johnymuffin.UUIDManager; 7 7 import com.legacyminecraft.poseidon.watchdog.WatchDogThread; 8 8 import jline.ConsoleReader; 9 9 import joptsimple.OptionSet; ··· 66 66 // CraftBukkit end 67 67 68 68 //Poseidon Start 69 - private WatchDogThread watchDogThread; 69 + // private WatchDogThread watchDogThread; 70 70 private boolean modLoaderSupport = false; 71 + // private PoseidonVersionChecker poseidonVersionChecker; 71 72 //Poseidon End 72 73 73 74 public MinecraftServer(OptionSet options) { // CraftBukkit - adds argument OptionSet ··· 173 174 this.a(new WorldLoaderServer(new File(".")), s1, k); 174 175 175 176 //Project Poseidon Start 176 - log.info("[Poseidon] Starting Project Poseidon Modules!"); 177 - 178 - PoseidonConfig.getInstance(); 179 - UUIDManager.getInstance(); 180 - 181 - //Start Watchdog 182 - watchDogThread = new WatchDogThread(Thread.currentThread()); 183 - if (PoseidonConfig.getInstance().getBoolean("settings.enable-watchdog", true)) { 184 - log.info("[Poseidon] Starting Watchdog to detect any server hangs!"); 185 - watchDogThread.start(); 186 - watchDogThread.tickUpdate(); 187 - } 188 - //Start Poseidon Statistics 189 - if (PoseidonConfig.getInstance().getBoolean("settings.settings.statistics.enabled", true)) { 190 - // new PoseidonStatisticsAgent(this, this.server); 191 - } else { 192 - log.info("[Poseidon] Please consider enabling statistics in Poseidon.yml. It helps us see how many servers are running Poseidon, and what versions."); 193 - } 194 - 195 - log.info("[Poseidon] Finished loading Project Poseidon Modules!"); 177 + Poseidon.getServer().initializeServer(); 196 178 //Project Poseidon End 197 179 198 180 // CraftBukkit start ··· 374 356 log.info("Stopping server"); 375 357 376 358 //Project Poseidon Start 377 - UUIDManager.getInstance().saveJsonArray(); 359 + 360 + // This is done before disablePlugins() to ensure the watchdog doesn't detect plugins disabling as a server hang 361 + Poseidon.getServer().shutdownServer(); 362 + 378 363 CrackedAllowlist.get().saveAllowlist(); 379 - if (watchDogThread != null) { 380 - log.info("Stopping Poseidon Watchdog"); 381 - watchDogThread.interrupt(); 382 - } 383 364 //Project Poseidon End 384 365 385 366 // CraftBukkit start ··· 436 417 } else { 437 418 while (j > 50L) { 438 419 MinecraftServer.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit 439 - watchDogThread.tickUpdate(); // Project Poseidon 420 + getWatchdog().tickUpdate(); // Project Poseidon 440 421 j -= 50L; 441 422 this.h(); 442 423 } ··· 654 635 } 655 636 656 637 public WatchDogThread getWatchdog() { 657 - return this.watchDogThread; 638 + return Poseidon.getServer().getWatchDogThread(); 658 639 } 659 640 }
+20 -17
src/main/java/net/minecraft/server/NetServerHandler.java
··· 1 1 package net.minecraft.server; 2 2 3 + import com.legacyminecraft.poseidon.Poseidon; 4 + import com.legacyminecraft.poseidon.event.PlayerSendPacketEvent; 5 + import com.projectposeidon.ConnectionType; 6 + import com.legacyminecraft.poseidon.PoseidonConfig; 3 7 import java.util.ArrayList; 4 8 import java.util.HashMap; 5 9 import java.util.Map; ··· 23 27 import org.bukkit.event.block.BlockDamageEvent; 24 28 import org.bukkit.event.block.BlockRedstoneEvent; 25 29 import org.bukkit.event.block.SignChangeEvent; 26 - import org.bukkit.event.packet.PacketReceivedEvent; 27 - import org.bukkit.event.packet.PacketSentEvent; 28 - import org.bukkit.event.player.PlayerAnimationEvent; 29 - import org.bukkit.event.player.PlayerChatEvent; 30 - import org.bukkit.event.player.PlayerCommandPreprocessEvent; 31 - import org.bukkit.event.player.PlayerInteractEntityEvent; 32 - import org.bukkit.event.player.PlayerInteractEvent; 33 - import org.bukkit.event.player.PlayerItemHeldEvent; 34 - import org.bukkit.event.player.PlayerKickEvent; 35 - import org.bukkit.event.player.PlayerMoveEvent; 36 - import org.bukkit.event.player.PlayerTeleportEvent; 37 - import org.bukkit.event.player.PlayerToggleSneakEvent; 38 - 39 - import com.legacyminecraft.poseidon.PoseidonConfig; 40 - import com.legacyminecraft.poseidon.event.PlayerSendPacketEvent; 41 - import com.projectposeidon.ConnectionType; 30 + import org.bukkit.event.packet.*; 31 + import org.bukkit.event.player.*; 42 32 43 33 import me.devcody.uberbukkit.nms.patch.IllegalContainerInteractionFix; 44 34 import uk.betacraft.uberbukkit.UberbukkitConfig; ··· 349 339 if (packet10flying.h && packet10flying.y == -999.0D && packet10flying.stance == -999.0D) { 350 340 d5 = packet10flying.x; 351 341 d4 = packet10flying.z; 342 + 343 + // Project Poseidon - Start 344 + // Boat crash fix ported from UberBukkit 345 + 346 + double d8 = d5 * d5 + d4 * d4; 347 + if (d8 > 100.0D) { 348 + a.warning("[Poseidon]" + this.player.name + " tried crashing server on entity " + this.player.vehicle.toString() + ". They have been kicked."); 349 + player.kickPlayer("Boat crash attempt detected!"); 350 + return; 351 + } 352 + 353 + // Project Poseidon - End 354 + 352 355 } 353 356 354 357 this.player.onGround = packet10flying.g; ··· 1168 1171 //Hide commands from being logged in console 1169 1172 String cmdName = s.split(" ")[0].replaceAll("/", ""); 1170 1173 1171 - if (server.isCommandHidden(cmdName)) { 1174 + if (Poseidon.getServer().isCommandHidden(cmdName)) { 1172 1175 a.info(player.getName() + " issued server command: COMMAND REDACTED"); 1173 1176 } else { 1174 1177 a.info(player.getName() + " issued server command: " + s);
+15 -1
src/main/java/net/minecraft/server/ServerConfigurationManager.java
··· 1 1 package net.minecraft.server; 2 2 3 + import com.legacyminecraft.poseidon.Poseidon; 3 4 import com.legacyminecraft.poseidon.PoseidonConfig; 4 5 5 6 import uk.betacraft.uberbukkit.packet.Packet62Sound; ··· 120 121 } 121 122 122 123 // CraftBukkit start 123 - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent(this.cserver.getPlayer(entityplayer), msgPlayerJoin.replace("%player%", entityplayer.name)); 124 + Player player = this.cserver.getPlayer(entityplayer); 125 + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent(player, msgPlayerJoin.replace("%player%", entityplayer.name)); 124 126 this.cserver.getPluginManager().callEvent(playerJoinEvent); 125 127 126 128 String joinMessage = playerJoinEvent.getJoinMessage(); ··· 129 131 this.server.serverConfigurationManager.sendAll(new Packet3Chat(joinMessage)); 130 132 } 131 133 // CraftBukkit end 134 + 135 + // Poseidon Start 136 + // Notify staff of Poseidon update if they are op or have poseidon.update permission 137 + if(PoseidonConfig.getInstance().getConfigBoolean("settings.update-checker.notify-staff.enabled", true) && Poseidon.getServer().isUpdateAvailable()) { 138 + if (player.isOp() || player.hasPermission("poseidon.update")) { 139 + String updateMessage = PoseidonConfig.getInstance().getConfigString("message.update.available"); 140 + updateMessage = updateMessage.replace("%newversion%", Poseidon.getServer().getNewestVersion()); 141 + updateMessage = updateMessage.replace("%currentversion%", Poseidon.getServer().getReleaseVersion()); 142 + player.sendMessage(updateMessage); 143 + } 144 + } 145 + // Poseidon End 132 146 133 147 worldserver.addEntity(entityplayer); 134 148 this.getPlayerManager(entityplayer.dimension).addPlayer(entityplayer);
-21
src/main/java/org/bukkit/Server.java
··· 471 471 */ 472 472 public Set<OfflinePlayer> getBannedPlayers(); 473 473 474 - /** 475 - * Returns the current hide state of the command from param (Hide from console) 476 - * 477 - * @param cmdName Command name 478 - * @return True if the command from param is hidden and false otherwise 479 - */ 480 - public boolean isCommandHidden(String cmdName); 481 - 482 - /** 483 - * Hides the command from param from being logged to server console 484 - * 485 - * @param cmd Command name 486 - */ 487 - public void addHiddenCommand(String cmd); 488 - 489 - /** 490 - * Hides the commands from param from being logged to server console 491 - * 492 - * @param commands List of command names 493 - */ 494 - public void addHiddenCommands(List<String> commands); 495 474 }
+1
src/main/java/org/bukkit/command/SimpleCommandMap.java
··· 1 1 package org.bukkit.command; 2 2 3 3 import com.legacyminecraft.poseidon.PoseidonConfig; 4 + import com.legacyminecraft.poseidon.commands.PoseidonCommand; 4 5 import com.legacyminecraft.poseidon.commands.TPSCommand; 5 6 import org.bukkit.Server; 6 7 import org.bukkit.command.defaults.*;
-62
src/main/java/org/bukkit/command/defaults/PoseidonCommand.java
··· 1 - package org.bukkit.command.defaults; 2 - 3 - import com.projectposeidon.api.PoseidonUUID; 4 - import com.projectposeidon.api.UUIDType; 5 - import org.bukkit.Bukkit; 6 - import org.bukkit.ChatColor; 7 - import org.bukkit.command.Command; 8 - import org.bukkit.command.CommandSender; 9 - 10 - import java.util.Arrays; 11 - import java.util.UUID; 12 - 13 - public class PoseidonCommand extends Command { 14 - 15 - public PoseidonCommand(String name) { 16 - super(name); 17 - this.description = "Show data regarding the servers version of Project Poseidon"; 18 - this.usageMessage = "/poseidon"; 19 - this.setAliases(Arrays.asList("projectposeidon")); 20 - } 21 - 22 - @Override 23 - public boolean execute(CommandSender sender, String currentAlias, String[] args) { 24 - if (args.length == 0) { 25 - sender.sendMessage(ChatColor.GRAY + "This server is running " + ChatColor.AQUA + "Project Poseidon" + ChatColor.GRAY + " Version: " + ChatColor.RED + Bukkit.getServer().getPoseidonVersion()); 26 - } else if (args.length == 1) { 27 - if (args[0].equalsIgnoreCase("uuid")) { 28 - sender.sendMessage(ChatColor.GRAY + "Please specify a user /poseidon uuid (username)"); 29 - } else { 30 - sender.sendMessage(ChatColor.GRAY + "Unknown sub command."); 31 - } 32 - } else { 33 - if (!args[0].equalsIgnoreCase("uuid")) { 34 - sender.sendMessage(ChatColor.GRAY + "Unknown sub command."); 35 - } else { 36 - UUID uuid = PoseidonUUID.getPlayerUUIDFromCache(args[1], true); 37 - if (uuid == null) { 38 - uuid = PoseidonUUID.getPlayerUUIDFromCache(args[1], false); 39 - } 40 - 41 - if (uuid == null) { 42 - sender.sendMessage(ChatColor.GRAY + "Unable to locate the UUID of the player called: " + ChatColor.WHITE + args[1] + ChatColor.GRAY + ". Please remember usernames are cap sensitive"); 43 - } else { 44 - sender.sendMessage(ChatColor.GRAY + "Username: " + args[1]); 45 - sender.sendMessage(ChatColor.GRAY + "UUID: " + uuid.toString()); 46 - UUIDType uuidType = PoseidonUUID.getPlayerUUIDCacheStatus(args[1]); 47 - if (uuidType.equals(UUIDType.ONLINE)) { 48 - sender.sendMessage(ChatColor.GRAY + "UUID Type: " + ChatColor.GREEN + "Online"); 49 - } else if (uuidType.equals(UUIDType.OFFLINE)) { 50 - sender.sendMessage(ChatColor.GRAY + "UUID Type: " + ChatColor.RED + "Offline"); 51 - } else { 52 - sender.sendMessage(ChatColor.GRAY + "UUID Type: " + ChatColor.DARK_RED + "UNKNOWN"); 53 - } 54 - } 55 - } 56 - } 57 - 58 - return true; 59 - 60 - } 61 - 62 - }
+11 -26
src/main/java/org/bukkit/craftbukkit/CraftServer.java
··· 4 4 import com.avaje.ebean.config.ServerConfig; 5 5 import com.avaje.ebean.config.dbplatform.SQLitePlatform; 6 6 import com.avaje.ebeaninternal.server.lib.sql.TransactionIsolation; 7 + import com.legacyminecraft.poseidon.Poseidon; 8 + import com.legacyminecraft.poseidon.PoseidonConfig; 9 + import com.legacyminecraft.poseidon.PoseidonPlugin; 10 + import com.legacyminecraft.poseidon.PoseidonServer; 11 + import com.legacyminecraft.poseidon.utility.PoseidonVersionChecker; 7 12 import jline.ConsoleReader; 8 13 import net.minecraft.server.*; 9 14 import org.bukkit.Bukkit; ··· 55 60 private final String serverName = "Project Poseidon Craftbukkit"; 56 61 //Poseidon Versions 57 62 private final String serverEnvironment = "POSEIDON"; 58 - private final String serverVersion = "1.1.8"; 63 + private final String serverVersion = "1.1.10"; 59 64 private final String releaseType = "DEVELOPMENT"; 60 65 private final String protocolVersion = "1.7.3"; 61 66 private final String GameVersion = "b1.7.3"; ··· 78 83 79 84 Bukkit.setServer(this); 80 85 86 + //Project Poseidon Start 87 + PoseidonServer poseidonServer = new PoseidonServer(console, this); 88 + Poseidon.setServer(poseidonServer); 89 + //Project Poseidon End 90 + 81 91 configuration = new Configuration((File) console.options.valueOf("bukkit-settings")); 82 92 loadConfig(); 83 93 loadPlugins(); 84 94 enablePlugins(PluginLoadOrder.STARTUP); 85 95 86 96 ChunkCompressionThread.startThread(); 87 - 88 - // Project Poseidon start 89 - addHiddenCommands(Arrays.asList("login", "l", "register", "reg", "unregister", "changepassword", "changepw")); 90 - // Project Poseidon end 91 97 } 92 98 93 99 private void loadConfig() { ··· 847 853 848 854 public void setShuttingdown(boolean shuttingdown) { 849 855 this.shuttingdown = shuttingdown; 850 - } 851 - 852 - public boolean isCommandHidden(String cmdName) { 853 - return hiddenCommands.contains(cmdName.toLowerCase()); 854 - } 855 - 856 - public void addHiddenCommand(String cmd) { 857 - cmd = cmd.toLowerCase(); 858 - 859 - if (hiddenCommands.contains(cmd)) { 860 - Logger.getLogger(NetServerHandler.class.getName()).warning("List of Hidden commands already contains " + cmd); 861 - return; 862 - } 863 - 864 - hiddenCommands.add(cmd); 865 - } 866 - 867 - public void addHiddenCommands(List<String> commands) { 868 - for (String cmd : commands) { 869 - addHiddenCommand(cmd); 870 - } 871 856 } 872 857 873 858 // public GameMode getDefaultGameMode() {
+8 -27
src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java
··· 1 1 package org.bukkit.craftbukkit.inventory; 2 2 3 3 import net.minecraft.server.InventoryPlayer; 4 - import org.bukkit.Material; 5 4 import org.bukkit.inventory.ItemStack; 6 5 import org.bukkit.inventory.PlayerInventory; 7 - 8 - import java.util.ArrayList; 9 6 10 7 public class CraftInventoryPlayer extends CraftInventory implements PlayerInventory { 11 8 public CraftInventoryPlayer(net.minecraft.server.InventoryPlayer inventory) { ··· 45 42 } 46 43 47 44 public ItemStack getBoots() { 48 - return getItem(getSize()); 45 + return getItem(getSize() + 0); 49 46 } 50 47 51 48 public void setHelmet(ItemStack helmet) { ··· 61 58 } 62 59 63 60 public void setBoots(ItemStack boots) { 64 - setItem(getSize(), boots); 61 + setItem(getSize() + 0, boots); 65 62 } 66 63 67 - public ItemStack[] getArmorContents() { 68 - ArrayList<ItemStack> contents = new ArrayList<>(); 64 + public CraftItemStack[] getArmorContents() { 65 + net.minecraft.server.ItemStack[] mcItems = getInventory().getArmorContents(); 66 + CraftItemStack[] ret = new CraftItemStack[mcItems.length]; 69 67 70 - ItemStack boots = getItem(getSize()); 71 - if (boots != null && boots.getType() != Material.AIR) { 72 - contents.add(boots); 68 + for (int i = 0; i < mcItems.length; i++) { 69 + ret[i] = new CraftItemStack(mcItems[i]); 73 70 } 74 - 75 - ItemStack leggings = getItem(getSize() + 1); 76 - if (leggings != null && leggings.getType() != Material.AIR) { 77 - contents.add(leggings); 78 - } 79 - 80 - ItemStack chestplate = getItem(getSize() + 2); 81 - if (chestplate != null && chestplate.getType() != Material.AIR) { 82 - contents.add(chestplate); 83 - } 84 - 85 - ItemStack helmet = getItem(getSize() + 3); 86 - if (helmet != null && helmet.getType() != Material.AIR) { 87 - contents.add(helmet); 88 - } 89 - 90 - return contents.toArray(new ItemStack[0]); 71 + return ret; 91 72 } 92 73 93 74 public void setArmorContents(ItemStack[] items) {
+2 -1
src/main/java/org/bukkit/event/Event.java
··· 140 140 /** 141 141 * Provides a lookup for all core events 142 142 * 143 - * @see org.bukkit.event. 143 + * @see org.bukkit.event 144 144 */ 145 145 public enum Type { 146 146 ··· 156 156 157 157 PACKET_SENT(Category.PACKET), 158 158 159 + CHEST_OPENED(Category.BLOCK), 159 160 160 161 /** 161 162 * Called when a player first starts their connection. Called before UUID is known.
+34
src/main/java/org/bukkit/event/inventory/ChestOpenedEvent.java
··· 1 + package org.bukkit.event.inventory; 2 + 3 + import net.minecraft.server.ItemStack; 4 + import org.bukkit.entity.Player; 5 + import org.bukkit.event.Cancellable; 6 + import org.bukkit.event.Event; 7 + 8 + public class ChestOpenedEvent extends Event implements Cancellable { 9 + private boolean cancelled; 10 + private Player player; 11 + private ItemStack[] contents; 12 + 13 + public ChestOpenedEvent(Player player, ItemStack[] contents) { 14 + super(Type.CHEST_OPENED); 15 + this.player = player; 16 + this.contents = contents; 17 + } 18 + 19 + public Player getPlayer() { 20 + return player; 21 + } 22 + 23 + public ItemStack[] getContents() { 24 + return contents; 25 + } 26 + 27 + public boolean isCancelled() { 28 + return cancelled; 29 + } 30 + 31 + public void setCancelled(boolean cancel) { 32 + this.cancelled = cancel; 33 + } 34 + }
+17 -8
src/main/java/org/bukkit/plugin/RegisteredListener.java
··· 1 1 package org.bukkit.plugin; 2 2 3 + import org.bukkit.event.Cancellable; 3 4 import org.bukkit.event.Event; 4 5 import org.bukkit.event.Listener; 5 6 ··· 11 12 private final Event.Priority priority; 12 13 private final Plugin plugin; 13 14 private final EventExecutor executor; 15 + private final boolean ignoreCancelled; 14 16 15 17 public RegisteredListener(final Listener pluginListener, final EventExecutor eventExecutor, final Event.Priority eventPriority, final Plugin registeredPlugin) { 16 - listener = pluginListener; 17 - priority = eventPriority; 18 - plugin = registeredPlugin; 19 - executor = eventExecutor; 18 + this(pluginListener, eventExecutor, eventPriority, registeredPlugin, false); 19 + } 20 + 21 + public RegisteredListener(final Listener pluginListener, final EventExecutor eventExecutor, final Event.Priority eventPriority, final Plugin registeredPlugin, final boolean ignoreCancelled) { 22 + this.listener = pluginListener; 23 + this.priority = eventPriority; 24 + this.plugin = registeredPlugin; 25 + this.executor = eventExecutor; 26 + this.ignoreCancelled = ignoreCancelled; 20 27 } 21 28 22 29 public RegisteredListener(final Listener pluginListener, final Event.Priority eventPriority, final Plugin registeredPlugin, Event.Type type) { 23 - listener = pluginListener; 24 - priority = eventPriority; 25 - plugin = registeredPlugin; 26 - executor = registeredPlugin.getPluginLoader().createExecutor(type, pluginListener); 30 + this(pluginListener, registeredPlugin.getPluginLoader().createExecutor(type, pluginListener), eventPriority, registeredPlugin, false); 27 31 } 28 32 29 33 public void registerAll() { ··· 63 67 * @return Registered Priority 64 68 */ 65 69 public void callEvent(Event event) { 70 + if(event instanceof Cancellable) { 71 + if(((Cancellable) event).isCancelled() && ignoreCancelled) { 72 + return; 73 + } 74 + } 66 75 executor.execute(listener, event); 67 76 } 68 77 }
+5 -2
src/main/java/org/bukkit/plugin/SimplePluginManager.java
··· 2 2 3 3 import com.google.common.collect.ImmutableSet; 4 4 import com.google.common.collect.MapMaker; 5 + import com.legacyminecraft.poseidon.Poseidon; 5 6 import com.legacyminecraft.poseidon.event.PoseidonCustomListener; 6 7 import org.bukkit.Server; 7 8 import org.bukkit.command.Command; ··· 290 291 if (!pluginCommands.isEmpty()) { 291 292 commandMap.registerAll(plugin.getDescription().getName(), pluginCommands); 292 293 294 + // Project Poseidon - Start - Hide commands 293 295 for (Command c : pluginCommands) { 294 296 if (c.isHidden()) { 295 - server.addHiddenCommand(c.getLabel()); 296 - server.addHiddenCommands(c.getAliases()); 297 + Poseidon.getServer().addHiddenCommand(c.getLabel()); 298 + Poseidon.getServer().addHiddenCommands(c.getAliases()); 297 299 } 298 300 } 301 + // Project Poseidon - End - Hide commands 299 302 } 300 303 301 304 try {
+1 -1
src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
··· 232 232 e.printStackTrace(); 233 233 } 234 234 }; 235 - eventSet.add(new RegisteredListener(listener, executor, eh.priority(), plugin)); 235 + eventSet.add(new RegisteredListener(listener, executor, eh.priority(), plugin, eh.ignoreCancelled())); 236 236 } 237 237 return ret; 238 238 }