From 7ccb8c55793ade053ebee0d2d338ab8c0d0bfada Mon Sep 17 00:00:00 2001 From: TheTrouper <93684527+thetrouper@users.noreply.github.com> Date: Thu, 7 Mar 2024 15:56:54 -0600 Subject: [PATCH] Got most of the project working --- README.md | 0 build.gradle | 75 ++++++ build.sh | 48 ++++ gradle.properties | 8 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 63282 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 248 ++++++++++++++++++ gradlew.bat | 92 +++++++ libs/PDK-1.3.4.jar | Bin 0 -> 89914 bytes settings.gradle | 1 + src/main/java/me/trouper/ultrals/UltraLS.java | 101 +++++++ .../trouper/ultrals/cmds/DepositCommand.java | 25 ++ .../ultrals/cmds/GiveHeartCommand.java | 56 ++++ .../trouper/ultrals/cmds/ReviveCommand.java | 20 ++ .../trouper/ultrals/cmds/UltraLSCommand.java | 39 +++ .../trouper/ultrals/cmds/WithdrawCommand.java | 34 +++ .../me/trouper/ultrals/data/BankStorage.java | 20 ++ .../ultrals/data/HeartItemStorage.java | 20 ++ .../java/me/trouper/ultrals/data/Items.java | 12 + .../trouper/ultrals/data/config/Config.java | 48 ++++ .../me/trouper/ultrals/events/ClickEvent.java | 25 ++ .../me/trouper/ultrals/events/DeathEvent.java | 15 ++ .../me/trouper/ultrals/events/JoinEvent.java | 24 ++ .../server/functions/BankFunctions.java | 169 ++++++++++++ .../server/functions/DeathFunctions.java | 33 +++ .../server/functions/StealFunctions.java | 99 +++++++ .../server/functions/TransferFunctions.java | 124 +++++++++ .../ultrals/server/util/CipherUtils.java | 35 +++ .../ultrals/server/util/FileUtils.java | 17 ++ .../ultrals/server/util/MathUtils.java | 58 ++++ .../ultrals/server/util/ServerUtils.java | 104 ++++++++ .../me/trouper/ultrals/server/util/Text.java | 90 +++++++ src/main/resources/plugin.yml | 35 +++ 33 files changed, 1682 insertions(+) create mode 100644 README.md create mode 100644 build.gradle create mode 100644 build.sh create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 libs/PDK-1.3.4.jar create mode 100644 settings.gradle create mode 100644 src/main/java/me/trouper/ultrals/UltraLS.java create mode 100644 src/main/java/me/trouper/ultrals/cmds/DepositCommand.java create mode 100644 src/main/java/me/trouper/ultrals/cmds/GiveHeartCommand.java create mode 100644 src/main/java/me/trouper/ultrals/cmds/ReviveCommand.java create mode 100644 src/main/java/me/trouper/ultrals/cmds/UltraLSCommand.java create mode 100644 src/main/java/me/trouper/ultrals/cmds/WithdrawCommand.java create mode 100644 src/main/java/me/trouper/ultrals/data/BankStorage.java create mode 100644 src/main/java/me/trouper/ultrals/data/HeartItemStorage.java create mode 100644 src/main/java/me/trouper/ultrals/data/Items.java create mode 100644 src/main/java/me/trouper/ultrals/data/config/Config.java create mode 100644 src/main/java/me/trouper/ultrals/events/ClickEvent.java create mode 100644 src/main/java/me/trouper/ultrals/events/DeathEvent.java create mode 100644 src/main/java/me/trouper/ultrals/events/JoinEvent.java create mode 100644 src/main/java/me/trouper/ultrals/server/functions/BankFunctions.java create mode 100644 src/main/java/me/trouper/ultrals/server/functions/DeathFunctions.java create mode 100644 src/main/java/me/trouper/ultrals/server/functions/StealFunctions.java create mode 100644 src/main/java/me/trouper/ultrals/server/functions/TransferFunctions.java create mode 100644 src/main/java/me/trouper/ultrals/server/util/CipherUtils.java create mode 100644 src/main/java/me/trouper/ultrals/server/util/FileUtils.java create mode 100644 src/main/java/me/trouper/ultrals/server/util/MathUtils.java create mode 100644 src/main/java/me/trouper/ultrals/server/util/ServerUtils.java create mode 100644 src/main/java/me/trouper/ultrals/server/util/Text.java create mode 100644 src/main/resources/plugin.yml diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..efbbfcd --- /dev/null +++ b/build.gradle @@ -0,0 +1,75 @@ +plugins { + id 'java' +} + +group = project.group +version = project.version + +jar { + from { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + configurations.runtimeClasspath.collect { + it.isDirectory() ? it : zipTree(it) + } + } +} + +repositories { + mavenCentral() + maven { + name = 'spigotmc-repo' + url = 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' + } + maven { + url = uri("https://repo.papermc.io/repository/maven-public/") + } + maven { + name = 'sonatype' + url = 'https://oss.sonatype.org/content/groups/public/' + } +} + +dependencies { + compileOnly 'io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT' + implementation 'com.google.code.gson:gson:2.10.1' + implementation files("libs/PDK-1.3.4.jar") +} + +def targetJavaVersion = 17 +java { + def javaVersion = JavaVersion.toVersion(targetJavaVersion) + sourceCompatibility = javaVersion + targetCompatibility = javaVersion + toolchain.languageVersion.set(JavaLanguageVersion.of(17)) + if (JavaVersion.current() < javaVersion) { + toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion) + } +} + +tasks.withType(JavaCompile).configureEach { + if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible()) { + options.release = targetJavaVersion + } +} + +tasks.register('copyDeps', Copy) { + from configurations.runtimeClasspath + into 'build/deps' + include '*.jar' +} + + +processResources { + def props = [version: version] + inputs.properties props + filteringCharset 'UTF-8' + filesMatching('plugin.yml') { + expand props + } +} + +compileJava.options.encoding("UTF-8") + +tasks.withType(JavaCompile) { + options.encoding = "UTF-8" +} diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..99e4cb1 --- /dev/null +++ b/build.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# Run Gradle build +./gradlew build + +# Check if the build was successful +if [ $? -eq 0 ]; then + echo "Gradle build successful." + + # SFTP upload + SFTP_HOST="192.168.1.199" + SFTP_USER="trouper" + SFTP_PASSWORD="Trouper12()1" + SFTP_REMOTE_DIR="/home/trouper/docker/data/plugins/" + + # Create a temporary file with a unique name + TEMP_FILE=$(mktemp) + + # Specify the local file to upload + LOCAL_FILE="/run/media/trouper/'1TB drive'/IJ/IdeaProjects/UltraLS/build/libs/UltraLS-0.2.5.jar" + + # Write the SFTP commands to the temporary file + echo "put $LOCAL_FILE $SFTP_REMOTE_DIR" > "$TEMP_FILE" + echo "bye" >> "$TEMP_FILE" + + # Use sftp non-interactively with the specified commands + sftp -oStrictHostKeyChecking=no -oBatchMode=no -b "$TEMP_FILE" "$SFTP_USER@$SFTP_HOST" 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 z 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..38f7c5a --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-rc-2-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..fcb6fca --- /dev/null +++ b/gradlew @@ -0,0 +1,248 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..93e3f59 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/libs/PDK-1.3.4.jar b/libs/PDK-1.3.4.jar new file mode 100644 index 0000000000000000000000000000000000000000..e949bf16cf74b392688d46b6fee0165700ddacd0 GIT binary patch literal 89914 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 $$NX$*d| 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

_0Yn78MiFdUhx34p<+m;((GND%4bo{E{ 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�NsLQ0 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 F{|^dpV>18% literal 0 HcmV?d00001 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..e382a3c --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'UltraLS' diff --git a/src/main/java/me/trouper/ultrals/UltraLS.java b/src/main/java/me/trouper/ultrals/UltraLS.java new file mode 100644 index 0000000..5990e1c --- /dev/null +++ b/src/main/java/me/trouper/ultrals/UltraLS.java @@ -0,0 +1,101 @@ +package me.trouper.ultrals; + +import io.github.itzispyder.pdk.PDK; +import io.github.itzispyder.pdk.utils.misc.JsonSerializable; +import me.trouper.ultrals.cmds.*; +import me.trouper.ultrals.data.BankStorage; +import me.trouper.ultrals.data.HeartItemStorage; +import me.trouper.ultrals.data.config.Config; +import me.trouper.ultrals.events.ClickEvent; +import me.trouper.ultrals.events.DeathEvent; +import me.trouper.ultrals.events.JoinEvent; +import org.bukkit.Bukkit; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.File; +import java.util.logging.Logger; + +public final class UltraLS extends JavaPlugin { + + private static UltraLS instance; + private static final File cfgfile = new File("plugins/UltraLS/main-config.json"); + private static final File bankfile = new File("plugins/UltraLS/banks.json"); + private static final File withdrawfile = new File("plugins/UltraLS/heart-item-storage.json"); + public static Config config = JsonSerializable.load(cfgfile, Config.class, new Config()); + public static BankStorage bank = JsonSerializable.load(bankfile, BankStorage.class, new BankStorage()); + public static HeartItemStorage hearts = JsonSerializable.load(bankfile, HeartItemStorage.class, new HeartItemStorage()); + public static final Logger log = Bukkit.getLogger(); + + /** + * Plugin startup logic + */ + @Override + public void onEnable() { + + log.info("\n]======------ Pre-load started! ------======["); + PDK.init(this); + instance = this; + + log.info("Loading Config..."); + + loadConfig(); + + startup(); + } + + public void startup() { + log.info("\n]======----- Loading UltraLS! -----======["); + + // Plugin startup logic + log.info("Starting Up! (%s)...".formatted(getDescription().getVersion())); + + // Commands + new UltraLSCommand().register(); + new GiveHeartCommand().register(); + new WithdrawCommand().register(); + new ReviveCommand().register(); + new DepositCommand().register(); + + // Events + new DeathEvent().register(); + new ClickEvent().register(); + new JoinEvent().register(); + + log.info(""" + Finished! + _ _ _ _ _ _____\s + | | | | | | | | / ____| + | | | | | |_ _ __ __ _| | | (___ \s + | | | | | __| '__/ _` | | \\___ \\\s + | |__| | | |_| | | (_| | |____ ____) | + \\____/|_|\\__|_| \\__,_|______|_____/\s + ]==-- LifeSteal done correctly --==["""); + } + + public void loadConfig() { + + // Init + config = JsonSerializable.load(cfgfile, Config.class,new Config()); + bank = JsonSerializable.load(bankfile,BankStorage.class,new BankStorage()); + hearts = JsonSerializable.load(withdrawfile, HeartItemStorage.class,new HeartItemStorage()); + // Save + config.save(); + config.save(); + bank.save(); + } + + + /** + * Plugin shutdown logic + */ + @Override + public void onDisable() { + // Plugin shutdown logic + log.info("UltraLS has disabled! (%s)".formatted(getDescription().getVersion())); + } + + public static UltraLS getInstance() { + return instance; + } + +} diff --git a/src/main/java/me/trouper/ultrals/cmds/DepositCommand.java b/src/main/java/me/trouper/ultrals/cmds/DepositCommand.java new file mode 100644 index 0000000..80c0c67 --- /dev/null +++ b/src/main/java/me/trouper/ultrals/cmds/DepositCommand.java @@ -0,0 +1,25 @@ +package me.trouper.ultrals.cmds; + +import io.github.itzispyder.pdk.commands.Args; +import io.github.itzispyder.pdk.commands.CommandRegistry; +import io.github.itzispyder.pdk.commands.CustomCommand; +import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import me.trouper.ultrals.server.functions.BankFunctions; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +@CommandRegistry(value = "deposit",printStackTrace = true) +public class DepositCommand implements CustomCommand { + @Override + public void dispatchCommand(CommandSender sender, Args args) { + Player p = (Player) sender; + int amount = args.get(0).toInt(); + + BankFunctions.depositHeart(p,amount); + } + + @Override + public void dispatchCompletions(CompletionBuilder b) { + b.then(b.arg("")); + } +} diff --git a/src/main/java/me/trouper/ultrals/cmds/GiveHeartCommand.java b/src/main/java/me/trouper/ultrals/cmds/GiveHeartCommand.java new file mode 100644 index 0000000..5de284c --- /dev/null +++ b/src/main/java/me/trouper/ultrals/cmds/GiveHeartCommand.java @@ -0,0 +1,56 @@ +package me.trouper.ultrals.cmds; + +import io.github.itzispyder.pdk.commands.Args; +import io.github.itzispyder.pdk.commands.CommandRegistry; +import io.github.itzispyder.pdk.commands.CustomCommand; +import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import io.github.itzispyder.pdk.utils.ServerUtils; +import me.trouper.ultrals.server.functions.TransferFunctions; +import me.trouper.ultrals.server.util.Text; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; +@CommandRegistry(value = "giveheart",printStackTrace = true) +public class GiveHeartCommand implements CustomCommand { + @Override + public void dispatchCommand(CommandSender sender, Args args) { + Player s = (Player) sender; + Player r = Bukkit.getServer().getPlayer(args.get(0).toString()); + if (r == null) { + s.sendMessage(Text.prefix("&cYou must provide an online player!&7 Use the /revive command to give hearts to a dead player.")); + return; + } + int amount = args.get(1).toInt(); + String to = args.get(2).toString(); + String from = args.get(3).toString(); + if (from.equals("bank")) { + if (to.equals("bank")) { + TransferFunctions.bankToBank(s,r,amount); + return; + } + TransferFunctions.bankToBar(s,r,amount); + return; + } + if (to.equals("bank")) { + TransferFunctions.barToBank(s,r,amount); + } + TransferFunctions.barToBar(s,r,amount); + + } + + @Override + public void dispatchCompletions(CompletionBuilder b) { + List players = new ArrayList<>(); + for (Player player : ServerUtils.players()) { + players.add(player.getName()); + } + + b.then(b.arg(players) + .then(b.arg("") + .then(b.arg("[from: bar | bank]","bank","bar") + .then(b.arg("[to: bar | bank]","bank","bar"))))); + } +} diff --git a/src/main/java/me/trouper/ultrals/cmds/ReviveCommand.java b/src/main/java/me/trouper/ultrals/cmds/ReviveCommand.java new file mode 100644 index 0000000..8cc2cbc --- /dev/null +++ b/src/main/java/me/trouper/ultrals/cmds/ReviveCommand.java @@ -0,0 +1,20 @@ +package me.trouper.ultrals.cmds; + +import io.github.itzispyder.pdk.commands.Args; +import io.github.itzispyder.pdk.commands.CommandRegistry; +import io.github.itzispyder.pdk.commands.CustomCommand; +import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import org.bukkit.command.CommandSender; + +@CommandRegistry(value = "revive") +public class ReviveCommand implements CustomCommand { + @Override + public void dispatchCommand(CommandSender commandSender, Args args) { + + } + + @Override + public void dispatchCompletions(CompletionBuilder completionBuilder) { + + } +} diff --git a/src/main/java/me/trouper/ultrals/cmds/UltraLSCommand.java b/src/main/java/me/trouper/ultrals/cmds/UltraLSCommand.java new file mode 100644 index 0000000..2c1e604 --- /dev/null +++ b/src/main/java/me/trouper/ultrals/cmds/UltraLSCommand.java @@ -0,0 +1,39 @@ +package me.trouper.ultrals.cmds; + +import io.github.itzispyder.pdk.commands.Args; +import io.github.itzispyder.pdk.commands.CommandRegistry; +import io.github.itzispyder.pdk.commands.CustomCommand; +import io.github.itzispyder.pdk.commands.Permission; +import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import me.trouper.ultrals.UltraLS; +import me.trouper.ultrals.server.util.Text; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +@CommandRegistry(value = "ultrals", permission = @Permission("ultrals.admin"), printStackTrace = true) +public class UltraLSCommand implements CustomCommand { + + @Override + public void dispatchCommand(CommandSender sender, Args args) { + Player p = (Player) sender; + + switch (args.get(0).toString()) { + case "toggle" -> { + switch (args.get(1).toString()) { + case "debug" -> { + UltraLS.config.debugMode = !UltraLS.config.debugMode; + UltraLS.config.save(); + p.sendMessage(Text.prefix("Debug mode is now &a%s&7.".formatted(UltraLS.config.debugMode))); + } + } + } + } + } + + @Override + public void dispatchCompletions(CompletionBuilder b) { + b.then(b.arg("toggle") + .then(b.arg("debug"))); + } + +} diff --git a/src/main/java/me/trouper/ultrals/cmds/WithdrawCommand.java b/src/main/java/me/trouper/ultrals/cmds/WithdrawCommand.java new file mode 100644 index 0000000..73ccad7 --- /dev/null +++ b/src/main/java/me/trouper/ultrals/cmds/WithdrawCommand.java @@ -0,0 +1,34 @@ +package me.trouper.ultrals.cmds; + +import io.github.itzispyder.pdk.commands.Args; +import io.github.itzispyder.pdk.commands.CommandRegistry; +import io.github.itzispyder.pdk.commands.CustomCommand; +import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import me.trouper.ultrals.server.functions.BankFunctions; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +@CommandRegistry(value = "withdraw",printStackTrace = true) +public class WithdrawCommand implements CustomCommand { + + @Override + public void dispatchCommand(CommandSender sender, Args args) { + Player p = (Player) sender; + int amount = args.get(0).toInt(); + + switch (args.get(1).toString()) { + case "item" -> { + BankFunctions.withdrawItem(p,amount); + } + default -> { + BankFunctions.withdraw(p,amount); + } + } + } + + @Override + public void dispatchCompletions(CompletionBuilder b) { + b.then(b.arg("") + .then(b.arg("healthbar","item")) + ); + } +} diff --git a/src/main/java/me/trouper/ultrals/data/BankStorage.java b/src/main/java/me/trouper/ultrals/data/BankStorage.java new file mode 100644 index 0000000..e0d00dc --- /dev/null +++ b/src/main/java/me/trouper/ultrals/data/BankStorage.java @@ -0,0 +1,20 @@ +package me.trouper.ultrals.data; + +import io.github.itzispyder.pdk.utils.misc.JsonSerializable; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class BankStorage implements JsonSerializable { + + @Override + public File getFile() { + File file = new File("plugins/UltraLS/banks.json"); + file.getParentFile().mkdirs(); + return file; + } + + public Map balances = new HashMap<>(); +} diff --git a/src/main/java/me/trouper/ultrals/data/HeartItemStorage.java b/src/main/java/me/trouper/ultrals/data/HeartItemStorage.java new file mode 100644 index 0000000..8008eef --- /dev/null +++ b/src/main/java/me/trouper/ultrals/data/HeartItemStorage.java @@ -0,0 +1,20 @@ +package me.trouper.ultrals.data; + +import io.github.itzispyder.pdk.utils.misc.JsonSerializable; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class HeartItemStorage implements JsonSerializable { + + @Override + public File getFile() { + File file = new File("plugins/UltraLS/heart-item-storage.json"); + file.getParentFile().mkdirs(); + return file; + } + + public Map withdrawn = new HashMap<>(); +} diff --git a/src/main/java/me/trouper/ultrals/data/Items.java b/src/main/java/me/trouper/ultrals/data/Items.java new file mode 100644 index 0000000..e87f11d --- /dev/null +++ b/src/main/java/me/trouper/ultrals/data/Items.java @@ -0,0 +1,12 @@ +package me.trouper.ultrals.data; + +import io.github.itzispyder.pdk.Global; +import io.github.itzispyder.pdk.plugin.builders.ItemBuilder; +import me.trouper.ultrals.UltraLS; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; + +public class Items { +} diff --git a/src/main/java/me/trouper/ultrals/data/config/Config.java b/src/main/java/me/trouper/ultrals/data/config/Config.java new file mode 100644 index 0000000..5b55e89 --- /dev/null +++ b/src/main/java/me/trouper/ultrals/data/config/Config.java @@ -0,0 +1,48 @@ +package me.trouper.ultrals.data.config; + +import io.github.itzispyder.pdk.utils.misc.JsonSerializable; + +import java.io.File; + +public class Config implements JsonSerializable { + + @Override + public File getFile() { + File file = new File("plugins/UltraLS/main-config.json"); + file.getParentFile().mkdirs(); + return file; + } + + public String prefix = "&9UltraLS> &7"; + public boolean debugMode = false; + public Plugin plugin = new Plugin(); + public Bank bank = new Bank(); + public NoobProtection noobProtection = new NoobProtection(); + + public class Plugin { + public int maxHP = 40; // maximum hearts a player can have + public int minHP = 2; // Minimum harts a player can have without taking death action. Setting to 0 is best if you plan on spectator mode-ing or banning people. + public int startingHP = 20; // The amount of HP you start with on first join + public boolean deathSpectator = false; // make the player a spectator/ghost when they die + public boolean deathBan = true; // Run the death ban command then they die + public boolean preventSpectatorTeleport = true; // Prevents players from using the spectator menu to leaka bases + public String deathBanCommand = "ban %s You have died!"; // command to be executed when death ban mode is enabled + public String reviveCommand = "pardon %s"; // command to be executed to undo a death ban + public int heartsFromEnvironment = 0; // Hearts lost from mobs/environmental damage such as lava or fall. + public int heartsFromPlayers = 2; // Hearts gained/lost through PvP + public int heartModelData = 6942; + } + + public class Bank { + public int startingBalance = 0; // The amount of hearts that you start with in the bank + public int maxBalance = 120; // The maximum balance a player can hold + public boolean stealDirectlyFromBank = true; // Weather to take hearts from the bank before the health bar + public boolean siphonFromBank = true; // If a player has hearts in their bank, but not in their health bar, hearts will be taken from the bank instead of banning them. + public boolean overflowToBank = true; // If the player is at max hearts, hearts they steal will get stored in their bank + } + + public class NoobProtection { + public int minutesPlayedToGiveHearts = 2; // How much playtime a player must have before they are allowed to give people hearts + public int minutesPlayedToWithdrawItemHearts = 2;// How much playtime a player must have to take out heart items + } +} diff --git a/src/main/java/me/trouper/ultrals/events/ClickEvent.java b/src/main/java/me/trouper/ultrals/events/ClickEvent.java new file mode 100644 index 0000000..6dea57c --- /dev/null +++ b/src/main/java/me/trouper/ultrals/events/ClickEvent.java @@ -0,0 +1,25 @@ +package me.trouper.ultrals.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.ultrals.UltraLS; +import me.trouper.ultrals.server.functions.BankFunctions; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +public class ClickEvent implements CustomListener { + @EventHandler + public void onClick(PlayerInteractEvent e) { + ItemStack i = e.getItem(); + if (!i.isEmpty() && + i.hasItemMeta() && + i.getItemMeta().hasCustomModelData() + && i.getItemMeta().hasLore() + && i.getItemMeta().getCustomModelData() != UltraLS.config.plugin.heartModelData) return; + + switch (e.getAction()) { + case LEFT_CLICK_AIR, LEFT_CLICK_BLOCK -> BankFunctions.depositItem(e.getPlayer(),false); + case RIGHT_CLICK_AIR, RIGHT_CLICK_BLOCK -> BankFunctions.depositItem(e.getPlayer(),true); + } + } +} diff --git a/src/main/java/me/trouper/ultrals/events/DeathEvent.java b/src/main/java/me/trouper/ultrals/events/DeathEvent.java new file mode 100644 index 0000000..216616d --- /dev/null +++ b/src/main/java/me/trouper/ultrals/events/DeathEvent.java @@ -0,0 +1,15 @@ +package me.trouper.ultrals.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.ultrals.server.functions.StealFunctions; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.PlayerDeathEvent; + +public class DeathEvent implements CustomListener { + @EventHandler + public void onDeath(PlayerDeathEvent e) { + StealFunctions.stealHeart(e.getPlayer(),e.getEntity().getKiller()); + } + + +} diff --git a/src/main/java/me/trouper/ultrals/events/JoinEvent.java b/src/main/java/me/trouper/ultrals/events/JoinEvent.java new file mode 100644 index 0000000..c47dc5a --- /dev/null +++ b/src/main/java/me/trouper/ultrals/events/JoinEvent.java @@ -0,0 +1,24 @@ +package me.trouper.ultrals.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.ultrals.UltraLS; +import me.trouper.ultrals.server.util.Text; +import net.kyori.adventure.text.Component; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; + +public class JoinEvent implements CustomListener { + @EventHandler + public void onFirstJoin(PlayerJoinEvent e) { + Player p = e.getPlayer(); + if (UltraLS.bank.balances.containsKey(p.getUniqueId().toString())) return; + UltraLS.bank.balances.put(p.getUniqueId().toString(),UltraLS.config.bank.startingBalance); + p.registerAttribute(Attribute.GENERIC_MAX_HEALTH); + p.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(UltraLS.config.plugin.startingHP); + UltraLS.bank.save(); + p.sendMessage(Component.text(Text.prefix("Welcome! Your HeartBank has been initialized correctly."))); + + } +} diff --git a/src/main/java/me/trouper/ultrals/server/functions/BankFunctions.java b/src/main/java/me/trouper/ultrals/server/functions/BankFunctions.java new file mode 100644 index 0000000..d825b52 --- /dev/null +++ b/src/main/java/me/trouper/ultrals/server/functions/BankFunctions.java @@ -0,0 +1,169 @@ +package me.trouper.ultrals.server.functions; + +import io.github.itzispyder.pdk.Global; +import io.github.itzispyder.pdk.plugin.builders.ItemBuilder; +import me.trouper.ultrals.UltraLS; +import me.trouper.ultrals.data.Items; +import me.trouper.ultrals.server.util.ServerUtils; +import me.trouper.ultrals.server.util.Text; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.UUID; + +public class BankFunctions { + + public static void withdraw(Player p, int amount) { + int bal = UltraLS.bank.balances.get(p.getUniqueId().toString()); + AttributeInstance h = p.getAttribute(Attribute.GENERIC_MAX_HEALTH); + + if (bal - amount < 0) { + p.sendMessage(Text.prefix("&cInsufficient Balance. &7You only have &c%s&7 hearts in your bank.".formatted(bal))); + return; + } + if (h.getBaseValue() + amount > UltraLS.config.plugin.maxHP) { + p.sendMessage(Text.prefix("&cInsufficient Space. &7You would go over the max health. (&e%s&7)".formatted(UltraLS.config.plugin.maxHP))); + return; + } + + UltraLS.bank.balances.put(p.getUniqueId().toString(), bal - amount); + UltraLS.bank.save(); + h.setBaseValue(h.getBaseValue() + amount); + + p.sendMessage(Text.prefix("&7Withdrew &a%s&7 hearts from your bank. Your balance is now &e%s&7.".formatted(amount,bal - amount))); + } + + public static void withdrawItem(Player p, int amount) { + int bal = UltraLS.bank.balances.get(p.getUniqueId().toString()); + + if (bal - amount < 0) { + p.sendMessage(Text.prefix("&cInsufficient Balance. &7You only have &c%s&7 hearts in your bank.".formatted(bal))); + return; + } + + UltraLS.bank.balances.put(p.getUniqueId().toString(), bal - amount); + UltraLS.bank.save(); + + UUID withdrawID = UUID.randomUUID(); + + ServerUtils.verbose("UUID of Withdrawn item: %s".formatted(withdrawID.toString())); + + UltraLS.hearts.withdrawn.put(withdrawID.toString(),amount); + UltraLS.hearts.save(); + + ItemStack heartItem = ItemBuilder.create() + .material(Material.RED_DYE) + .name(Global.instance.color("&c%s &c&lHearts".formatted(amount))) + .lore(Global.instance.color("&4➥&7 (Right-Click) Deposit to bank")) + .lore(Global.instance.color("&4➥&7 (Left-Click) Deposit to health bar")) + .lore("") + .lore(Global.instance.color("&7ID: &8%s".formatted(withdrawID.toString()))) + .lore(Global.instance.color("&7Owner: &8%s".formatted(p.getName()))) + .enchant(Enchantment.LURE,1) + .customModelData(UltraLS.config.plugin.heartModelData) + .flag(ItemFlag.HIDE_ENCHANTS) + .build(); + + p.getInventory().addItem(heartItem); + p.sendMessage(Text.prefix("&7Withdrew &c%s&7 hearts.".formatted(amount))); + } + + public static void depositItem(Player p, boolean toBank) { + ItemStack i = p.getInventory().getItemInMainHand(); + + if (i.hasItemMeta() && i.getItemMeta().hasCustomModelData() && i.getItemMeta().hasLore() && i.getItemMeta().getCustomModelData() != UltraLS.config.plugin.heartModelData) { + p.sendMessage(Text.prefix("&cThat item is not a heart!")); + return; + } + + String idString = "NOT HEART"; + + for (String s : i.getLore()) { + ServerUtils.verbose(s); + if (s.contains(Text.color("&7ID: &8"))) { + s = s.replaceAll(Text.color("&7ID: &8"),""); + idString = s; + } + } + + if (idString.equals("NOT HEART")) { + p.sendMessage(Text.prefix("&cThat ID is invalid!")); + return; + } + + ServerUtils.verbose("UUID of Deposit item: %s".formatted(idString)); + UUID typeID = UUID.fromString(idString); + + if (!UltraLS.hearts.withdrawn.containsKey(typeID.toString())) { + p.sendMessage(Text.prefix("&cThat heart has already been redeemed!")); + return; + } + + int amount = UltraLS.hearts.withdrawn.get(typeID.toString()); + + p.getInventory().removeItem(i); + UltraLS.hearts.withdrawn.remove(typeID.toString()); + UltraLS.hearts.save(); + + + if (toBank) { + addToBank(p,amount); + } else { + addToBar(p,amount); + } + } + + public static void depositHeart(Player p, int amount) { + AttributeInstance h = p.getAttribute(Attribute.GENERIC_MAX_HEALTH); + + if (h.getBaseValue() - amount < UltraLS.config.plugin.minHP) { + p.sendMessage(Text.prefix("&cInsufficient Health. &7You would go below the minimum health and die! (&e%s&7)" + .formatted(UltraLS.config.plugin.minHP) + )); + return; + } + + h.setBaseValue(h.getBaseValue() - amount); + addToBank(p,amount); + } + + public static void addToBar(Player p, int amount) { + AttributeInstance h = p.getAttribute(Attribute.GENERIC_MAX_HEALTH); + + if (h.getBaseValue() + amount > UltraLS.config.plugin.maxHP) { + p.sendMessage(Text.prefix("&cInsufficient Space. &7You would go over the maximum health. (&e%s&7)" + .formatted(UltraLS.config.plugin.maxHP) + )); + return; + } + + h.setBaseValue(h.getBaseValue() + amount); + + p.sendMessage(Text.prefix("Deposited &c%s&7 hearts into your health bar." + .formatted(amount) + )); + } + + public static void addToBank(Player p, int amount) { + if (UltraLS.bank.balances.get(p.getUniqueId().toString()) + amount > UltraLS.config.bank.maxBalance) { + p.sendMessage(Text.prefix("&cInsufficient Space. &7You would go over the maximum balance. (&e%s&7)" + .formatted(UltraLS.config.bank.maxBalance) + )); + return; + } + + UltraLS.bank.balances.put(p.getUniqueId().toString(), UltraLS.bank.balances.get(p.getUniqueId().toString()) + amount); + UltraLS.bank.save(); + + p.sendMessage(Text.prefix("Deposited &c%s&7 hearts into your heart bank. Your new balance is &c%s&7." + .formatted(amount,UltraLS.bank.balances.get(p.getUniqueId().toString())) + )); + } +} diff --git a/src/main/java/me/trouper/ultrals/server/functions/DeathFunctions.java b/src/main/java/me/trouper/ultrals/server/functions/DeathFunctions.java new file mode 100644 index 0000000..b75968e --- /dev/null +++ b/src/main/java/me/trouper/ultrals/server/functions/DeathFunctions.java @@ -0,0 +1,33 @@ +package me.trouper.ultrals.server.functions; + +import me.trouper.ultrals.UltraLS; +import me.trouper.ultrals.server.util.ServerUtils; +import me.trouper.ultrals.server.util.Text; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; + +public class DeathFunctions { + + public static void unBan(OfflinePlayer p, String who) { + ServerUtils.sendCommand(UltraLS.config.plugin.reviveCommand.formatted(p.getName())); + Bukkit.broadcast(Component.text(Text.prefix("&a%s&7 has been revived by &e%s&7!".formatted(p.getName(),who)))); + } + + public static void ban(Player p) { + ServerUtils.sendCommand(UltraLS.config.plugin.deathBanCommand.formatted(p.getName())); + Bukkit.broadcast(Component.text(Text.prefix("&a%s&7 is now dead!".formatted(p.getName())))); + } + + public static void unSpectator(Player p) { + p.removeScoreboardTag("ULTRALS_dead"); + p.setGameMode(GameMode.SURVIVAL); + } + + public static void spectator(Player p) { + p.addScoreboardTag("ULTRALS_dead"); + p.setGameMode(GameMode.SPECTATOR); + } +} diff --git a/src/main/java/me/trouper/ultrals/server/functions/StealFunctions.java b/src/main/java/me/trouper/ultrals/server/functions/StealFunctions.java new file mode 100644 index 0000000..507ed7b --- /dev/null +++ b/src/main/java/me/trouper/ultrals/server/functions/StealFunctions.java @@ -0,0 +1,99 @@ +package me.trouper.ultrals.server.functions; + +import me.trouper.ultrals.UltraLS; +import me.trouper.ultrals.server.util.Text; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; +import org.bukkit.entity.Player; + +public class StealFunctions { + + public static void stealHeart(Player v, Player k) { + // If set to steal from bank first, do that + if (UltraLS.config.bank.stealDirectlyFromBank) { + stealFromBank(v,k,true); + return; + } + stealFromBar(v,k,UltraLS.config.bank.siphonFromBank); + } + + public static void stealFromBank(Player v, Player k, boolean defaultBar) { + // Start at both player's bank + // Check that k is not max, and that v has hearts + // if v does not have hearts, steal from bar + int vb = UltraLS.bank.balances.getOrDefault(v.getUniqueId().toString(),0); + int kb = UltraLS.bank.balances.getOrDefault(k.getUniqueId().toString(),0); + + if (kb + UltraLS.config.plugin.heartsFromPlayers > UltraLS.config.bank.maxBalance) { + // Killer does not have space for hearts in the bank + if (defaultBar) { + k.sendMessage(Text.prefix("Your bank is full! Hearts will be added to your bar")); + stealFromBar(v,k,false); + return; + } + k.sendMessage(Text.prefix("Your bank is full!")); + return; + } + + if (vb - UltraLS.config.plugin.heartsFromPlayers <= 0) { + // Victim does not have any hearts in the bank + if (defaultBar) { + v.sendMessage("Your bank was empty! Hearts will been taken from your bar."); + stealFromBar(v,k,false); + return; + } + v.sendMessage("Your bank was empty!"); + return; + } + + UltraLS.bank.balances.put(v.getUniqueId().toString(), vb - UltraLS.config.plugin.heartsFromPlayers); + UltraLS.bank.balances.put(k.getUniqueId().toString(), kb + UltraLS.config.plugin.heartsFromPlayers); + + UltraLS.bank.save(); + + k.sendMessage(Text.prefix("You stole &a%s&7 heart(s) from &e%s&7.".formatted(UltraLS.config.plugin.heartsFromPlayers,v.getName()))); + v.sendMessage(Text.prefix("%s stole &a%s&7 heart(s) from you.".formatted(k.getName(),UltraLS.config.plugin.heartsFromPlayers))); + } + + public static void stealFromBar(Player v, Player k, boolean defaultBank) { + // Start at both player's attributes + // Check that k is not max, and that v has enough hearts + // if v does not have enough hearts, steal from bank + AttributeInstance vh = v.getAttribute(Attribute.GENERIC_MAX_HEALTH); + AttributeInstance kh = k.getAttribute(Attribute.GENERIC_MAX_HEALTH); + + if (kh.getBaseValue() + UltraLS.config.plugin.heartsFromPlayers > UltraLS.config.plugin.maxHP) { + // Killer does not have space for hearts + if (defaultBank) { + k.sendMessage(Text.prefix("Your health bar is full! Hearts will be added to your bank.")); + stealFromBank(v,k,false); + return; + } + k.sendMessage(Text.prefix("Your health bar is full!")); + return; + } + + if (vh.getBaseValue() - UltraLS.config.plugin.heartsFromPlayers <= UltraLS.config.plugin.minHP && !UltraLS.config.plugin.deathBan && !UltraLS.config.plugin.deathSpectator) { + // Victim does not have any hearts in their health bar, and the plugin is set to not spectator, or not ban them + if (defaultBank) { + v.sendMessage("You dont have enough hearts in your health bar! Hearts will been taken from your bank."); + stealFromBank(v,k,false); + return; + } + v.sendMessage("Your health bar does not have enough hearts to be stolen from."); + return; + } else if (vh.getBaseValue() - UltraLS.config.plugin.heartsFromPlayers <= UltraLS.config.plugin.minHP && UltraLS.config.plugin.deathBan) { + DeathFunctions.ban(v); + return; // Return, because we don't want to make them have negative hearts when they rejoin + } else if (vh.getBaseValue() - UltraLS.config.plugin.heartsFromPlayers <= UltraLS.config.plugin.minHP && UltraLS.config.plugin.deathSpectator) { + DeathFunctions.spectator(v); + return; + } + + vh.setBaseValue(vh.getBaseValue() - UltraLS.config.plugin.heartsFromPlayers); + kh.setBaseValue(kh.getBaseValue() + UltraLS.config.plugin.heartsFromPlayers); + + k.sendMessage(Text.prefix("You stole &a%s&7 heart(s) from &e%s&7.".formatted(UltraLS.config.plugin.heartsFromPlayers,v.getName()))); + v.sendMessage(Text.prefix("&c%s&7 stole &a%s&7 heart(s) from you.".formatted(k.getName(),UltraLS.config.plugin.heartsFromPlayers))); + } +} diff --git a/src/main/java/me/trouper/ultrals/server/functions/TransferFunctions.java b/src/main/java/me/trouper/ultrals/server/functions/TransferFunctions.java new file mode 100644 index 0000000..728730f --- /dev/null +++ b/src/main/java/me/trouper/ultrals/server/functions/TransferFunctions.java @@ -0,0 +1,124 @@ +package me.trouper.ultrals.server.functions; + +import me.trouper.ultrals.UltraLS; +import me.trouper.ultrals.server.util.Text; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; +import org.bukkit.entity.Player; + +public class TransferFunctions { + + public static void bankToBank(Player s, Player r, int amount) { + int sb = UltraLS.bank.balances.get(s.getUniqueId().toString()); + int rb = UltraLS.bank.balances.get(r.getUniqueId().toString()); + + if (sb - amount < 0) { + s.sendMessage(Text.prefix("&cInsufficient Balance!&7 You only have &e%s&7 hearts in your bank.".formatted(sb))); + return; + } + + if (rb + amount > UltraLS.config.bank.maxBalance) { + s.sendMessage(Text.prefix("&cCould not wire hearts! &e%s&7's bank would overflow.".formatted(r.getName()))); + r.sendMessage(Text.prefix("&e%s&7 tried to wire &c%s&7 hearts to you, but your bank was full!".formatted(s.getName(),amount))); + return; + } + + UltraLS.bank.balances.put(s.getUniqueId().toString(),sb - amount); + UltraLS.bank.balances.put(r.getUniqueId().toString(),rb + amount); + + s.sendMessage(Text.prefix("&7You have wired &a%s&7 hearts to &e%s&7. Your new balance is &a%s&7." + .formatted(amount, + r.getName(), + UltraLS.bank.balances.get(s.getUniqueId().toString())))); + r.sendMessage(Text.prefix("&e%s&7 has wired &a%s&7 hearts to you. Your new balance is &a%s&7." + .formatted(s.getName(), + amount, + UltraLS.bank.balances.get(r.getUniqueId().toString())))); + } + + public static void bankToBar(Player s, Player r, int amount) { + int sb = UltraLS.bank.balances.get(s.getUniqueId().toString()); + AttributeInstance ra = r.getAttribute(Attribute.GENERIC_MAX_HEALTH); + + if (sb - amount < 0) { + s.sendMessage(Text.prefix("&cInsufficient Balance!&7 You only have &e%s&7 hearts in your bank.".formatted(sb))); + return; + } + + if (ra.getBaseValue() + amount > UltraLS.config.plugin.maxHP) { + s.sendMessage(Text.prefix("&cCould not transfer hearts! &e%s&7's health bar would overflow.".formatted(r.getName()))); + r.sendMessage(Text.prefix("&e%s&7 tried to transfer &c%s&7 hearts to you, but your health bar was full!".formatted(s.getName(),amount))); + return; + } + + UltraLS.bank.balances.put(s.getUniqueId().toString(),sb - amount); + ra.setBaseValue(ra.getBaseValue() + amount); + + s.sendMessage(Text.prefix("&7You have transferred &a%s&7 hearts to &e%s&7. Your new balance is &a%s&7." + .formatted(amount, + r.getName(), + UltraLS.bank.balances.get(s.getUniqueId().toString()) + ))); + r.sendMessage(Text.prefix("&e%s&7 has transferred &a%s&7 hearts to you." + .formatted(s.getName(), + amount + ))); + } + + public static void barToBank(Player s, Player r, int amount) { + int rb = UltraLS.bank.balances.get(r.getUniqueId().toString()); + AttributeInstance sa = s.getAttribute(Attribute.GENERIC_MAX_HEALTH); + + if (sa.getBaseValue() - amount < UltraLS.config.plugin.minHP) { + s.sendMessage(Text.prefix("&cInsufficient Hearts.&7 You would run out and die!")); + return; + } + + if (rb + amount > UltraLS.config.bank.maxBalance) { + s.sendMessage(Text.prefix("&cCould not transfer hearts! &e%s&7's bank would overflow.".formatted(r.getName()))); + r.sendMessage(Text.prefix("&e%s&7 tried to transfer &c%s&7 hearts to you, but your bank was full!".formatted(s.getName(),amount))); + return; + } + + sa.setBaseValue(sa.getBaseValue() - amount); + UltraLS.bank.balances.put(s.getUniqueId().toString(),rb + amount); + + s.sendMessage(Text.prefix("&7You have transferred &a%s&7 hearts to &e%s&7." + .formatted(amount, + r.getName() + ))); + r.sendMessage(Text.prefix("&e%s&7 has transferred &a%s&7 hearts to you. You new balance is &a%s&7." + .formatted(s.getName(), + amount, + UltraLS.bank.balances.get(r.getUniqueId().toString()) + ))); + } + + public static void barToBar(Player s, Player r, int amount) { + AttributeInstance ra = r.getAttribute(Attribute.GENERIC_MAX_HEALTH); + AttributeInstance sa = s.getAttribute(Attribute.GENERIC_MAX_HEALTH); + + if (sa.getBaseValue() - amount < UltraLS.config.plugin.minHP) { + s.sendMessage(Text.prefix("&cInsufficient Hearts.&7 You would run out and die!")); + return; + } + + if (ra.getBaseValue() + amount > UltraLS.config.plugin.maxHP) { + s.sendMessage(Text.prefix("&cCould not give &e%s&7 hearts! Their health bar would overflow.".formatted(r.getName()))); + r.sendMessage(Text.prefix("&e%s&7 tried to give &c%s&7 hearts to you, but your health bar was full!".formatted(s.getName(),amount))); + return; + } + + sa.setBaseValue(sa.getBaseValue() - amount); + ra.setBaseValue(ra.getBaseValue() + amount); + + s.sendMessage(Text.prefix("&7You have given &a%s&7 hearts to &e%s&7." + .formatted(amount, + r.getName() + ))); + r.sendMessage(Text.prefix("&e%s&7 has given &a%s&7 hearts to you." + .formatted(s.getName(), + amount + ))); + } +} diff --git a/src/main/java/me/trouper/ultrals/server/util/CipherUtils.java b/src/main/java/me/trouper/ultrals/server/util/CipherUtils.java new file mode 100644 index 0000000..98dabb4 --- /dev/null +++ b/src/main/java/me/trouper/ultrals/server/util/CipherUtils.java @@ -0,0 +1,35 @@ +package me.trouper.ultrals.server.util; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import java.util.Base64; + +public class CipherUtils { + private static final String secretKey = "aYN8iuz1kMHU2af8iMv7UY0HTmiqr2yqserThqQQufNO8E9jBMFdgAbo5deLVM7B"; // 16, 24, or 32 bytes + private static final String algorithm = "AES"; + public static String encrypt(String strToEncrypt) { + try { + SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), algorithm); + Cipher cipher = Cipher.getInstance(algorithm); + cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); + byte[] encryptedBytes = cipher.doFinal(strToEncrypt.getBytes()); + return Base64.getEncoder().encodeToString(encryptedBytes); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static String decrypt(String strToDecrypt) { + try { + SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), algorithm); + Cipher cipher = Cipher.getInstance(algorithm); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); + byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)); + return new String(decryptedBytes); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/src/main/java/me/trouper/ultrals/server/util/FileUtils.java b/src/main/java/me/trouper/ultrals/server/util/FileUtils.java new file mode 100644 index 0000000..1d85be8 --- /dev/null +++ b/src/main/java/me/trouper/ultrals/server/util/FileUtils.java @@ -0,0 +1,17 @@ +package me.trouper.ultrals.server.util; + +import me.trouper.ultrals.UltraLS; + +import java.io.File; +public class FileUtils { + public static boolean folderExists(String folderName) { + File folder = new File(UltraLS.getInstance().getDataFolder(), folderName); + return folder.exists() && folder.isDirectory(); + } + public static void createFolder(String folderName) { + File folder = new File(UltraLS.getInstance().getDataFolder(), folderName); + if (!folder.exists()) { + folder.mkdirs(); + } + } +} diff --git a/src/main/java/me/trouper/ultrals/server/util/MathUtils.java b/src/main/java/me/trouper/ultrals/server/util/MathUtils.java new file mode 100644 index 0000000..f5af139 --- /dev/null +++ b/src/main/java/me/trouper/ultrals/server/util/MathUtils.java @@ -0,0 +1,58 @@ +package me.trouper.ultrals.server.util; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +public final class MathUtils { + + public static double avg(Integer... ints) { + final List list = Arrays.stream(ints).filter(Objects::nonNull).toList(); + return avg(list); + } + + public static double avg(List ints) { + double sum = 0.0; + for (Integer i : ints) sum += i; + return sum / ints.size(); + } + + public static double round(double value, int nthPlace) { + return Math.floor(value * nthPlace) / nthPlace; + } + + public static String bytesToHex(byte[] bytes) { + StringBuilder result = new StringBuilder(); + for (byte b : bytes) { + result.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1)); + } + return result.toString(); + } + + public static String SHA512(String input) { + try { + + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + + + byte[] encodedHash = digest.digest(input.getBytes(StandardCharsets.UTF_8)); + + StringBuilder hexString = new StringBuilder(2 * encodedHash.length); + for (byte b : encodedHash) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + + return hexString.toString(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/src/main/java/me/trouper/ultrals/server/util/ServerUtils.java b/src/main/java/me/trouper/ultrals/server/util/ServerUtils.java new file mode 100644 index 0000000..bbeba8a --- /dev/null +++ b/src/main/java/me/trouper/ultrals/server/util/ServerUtils.java @@ -0,0 +1,104 @@ +package me.trouper.ultrals.server.util; + +import me.trouper.ultrals.UltraLS; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.metadata.MetadataValue; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Predicate; + +public class ServerUtils { + public static void sendCommand(String command) { + ServerUtils.verbose("Getting scheduler"); + Bukkit.getScheduler().scheduleSyncDelayedTask(UltraLS.getInstance(), () -> { + try { + ServerUtils.verbose("Attempting to run command..."); + Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), command); + } catch (Exception e) { + e.printStackTrace(); + } + },1); + } + public static void verbose(String message) { + if (UltraLS.config.debugMode) { + String log = "[UltraLS] [DEBUG]: " + message; + UltraLS.log.info(log); + for (Player trustedPlayer : Bukkit.getOnlinePlayers()) { + if (trustedPlayer.isOp()) { + trustedPlayer.sendMessage("§d§lUltraDupe §7[§bDEBUG§7] §8» §7" + message); + } + } + } + } + + public static List getPlayers() { + return new ArrayList<>(Bukkit.getOnlinePlayers()); + } + + public static List getStaff() { + return getPlayers().stream().filter(Player -> Player.hasPermission("ultrals.staff")).toList(); + } + + public static void forEachPlayer(Consumer consumer) { + getPlayers().forEach(consumer); + } + + public static void forEachStaff(Consumer consumer) { + getStaff().forEach(consumer); + } + + public static void dmEachPlayer(Predicate condition, String dm) { + forEachPlayer(p -> { + if (condition.test(p)) p.sendMessage(dm); + }); + } + + public static void dmEachPlayer(String dm) { + forEachPlayer(p -> p.sendMessage(dm)); + } + + public static void forEachSpecified(Iterable players, Consumer consumer) { + players.forEach(consumer); + } + + public static void forEachSpecified(Consumer consumer, Player... players) { + Arrays.stream(players).forEach(consumer); + } + public static void forEachPlayerRun(Predicate condition, Consumer task) { + forEachPlayer(p -> { + if (condition.test(p)) { + task.accept(p); + } + }); + } + public static void sendActionBar(Player p, String msg) { + p.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(msg)); + } + + public static boolean hasBlockBelow(Player player, Material material) { + for (int y = player.getLocation().getBlockY() - 1; y >= player.getLocation().getBlockY() - 12; y--) { + if (player.getWorld().getBlockAt(player.getLocation().getBlockX(), y, player.getLocation().getBlockZ()).getType() == material) { + return true; + } + } + return false; + } + + public static boolean isVanished(Player player) { + for (MetadataValue meta : player.getMetadata("vanished")) { + if (meta.asBoolean()) return true; + } + return false; + } + + public static String[] unVanishedPlayers() { + return io.github.itzispyder.pdk.utils.ServerUtils.players(ServerUtils::isVanished).stream().map(Player::getName).toArray(String[]::new); + } +} diff --git a/src/main/java/me/trouper/ultrals/server/util/Text.java b/src/main/java/me/trouper/ultrals/server/util/Text.java new file mode 100644 index 0000000..a94e9bf --- /dev/null +++ b/src/main/java/me/trouper/ultrals/server/util/Text.java @@ -0,0 +1,90 @@ +package me.trouper.ultrals.server.util; + + +import me.trouper.ultrals.UltraLS; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Text { + + public static String regexHighlighter(String input, String regex, String startString, String endString) { + // Create a Pattern object + Pattern pattern = Pattern.compile(regex); + + // Create a Matcher object + Matcher matcher = pattern.matcher(input); + + // StringBuffer to store the result + StringBuffer result = new StringBuffer(); + + // Find and append matches + while (matcher.find()) { + matcher.appendReplacement(result, startString + matcher.group() + endString); + } + + // Append the remainder of the input + matcher.appendTail(result); + + return result.toString(); + } + + public static final char SECTION_SYMBOL = (char)167; + + public static String color(String msg) { + return msg.replace('&', SECTION_SYMBOL); + } + public static String prefix(String text) { + String prefix = UltraLS.config.prefix; + return color(prefix + text); + } + public static String removeFirstColor(String input) { + if (input.startsWith("\u00a7")) { + if (input.length() > 2) { + return input.substring(2); + } else { + return ""; + } + } else { + return input; + } + } + public static String replaceRepeatingLetters(String input) { + if (input == null || input.isEmpty()) { + return input; + } + + StringBuilder simplifiedText = new StringBuilder(); + char currentChar = input.charAt(0); + int count = 1; + + for (int i = 1; i < input.length(); i++) { + char nextChar = input.charAt(i); + + if (Character.toLowerCase(nextChar) == Character.toLowerCase(currentChar)) { + count++; + } else { + simplifiedText.append(currentChar); + + if (count > 1) { + simplifiedText.append(currentChar); + } + + currentChar = nextChar; + count = 1; + } + } + + simplifiedText.append(currentChar); + + if (count > 1) { + simplifiedText.append(currentChar); + } + + return simplifiedText.toString(); + } + + public static String cleanName(String type) { + return type.replaceAll("_"," ").toLowerCase(); + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..ac95c4f --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,35 @@ +name: UltraLS +version: '${version}' +main: me.trouper.ultrals.UltraLS +api-version: 1.19 +authors: [ TheTrouper ] +description: The only acceptable dupe plugin. +website: https://thetrouper.github.io/ +permissions: + ultrals.admin: + default: op + description: Access to give and take hearts from players + +commands: + ultrals: + description: Admin command to edit people's hearts + usage: /ultrals + permission: ultrals.admin + aliases: + - lsadmin + - adminls + - ls + - uls + deposit: + description: put hearts from you healthbar into your bank + permission: ultrals.deposit + usage: /deposit + withdraw: + description: put hearts from you bank into your health bar or inventory + permission: ultrals.withdraw + usage: /withdraw [bank|item] + giveheart: + description: Give hearts to players + permission: ultrals.giveheart + usage: /giveheart [from your; bank|bar] [to their; bank|bar] +