Compare commits

..

18 Commits

Author SHA1 Message Date
dcbe55fc80 ci: use java 21
All checks were successful
Build and Upload JAR / build (push) Successful in 26s
2024-10-10 20:00:30 +02:00
df6f1f293e feat: update plugin to spigot 1.21.1
Some checks failed
Build and Upload JAR / build (push) Failing after 17s
2024-10-10 19:59:05 +02:00
4db0401d34 fix: memory leak caused by inactive listener
All checks were successful
Build and Upload JAR / build (push) Successful in 26s
2024-10-10 19:46:35 +02:00
43e7c7e716 build: update grade
All checks were successful
Build and Upload JAR / build (push) Successful in 24s
2024-10-10 19:42:51 +02:00
d893742f90 ci: use java 17
Some checks failed
Build and Upload JAR / build (push) Failing after 26s
2024-10-10 19:37:37 +02:00
836133484d ci: use java 11
All checks were successful
Build and Upload JAR / build (push) Successful in 35s
2024-10-10 19:34:33 +02:00
001a39dbf5 ci: use java 8
Some checks failed
Build and Upload JAR / build (push) Failing after 29s
2024-10-10 19:31:50 +02:00
0468c4c342 ci: add build and upload jobs
Some checks failed
Build and Upload JAR / build (push) Failing after 13s
2024-10-10 19:25:46 +02:00
bb7f49ed99 Add knock back 1 to the elf's bow 2021-12-12 23:46:50 +01:00
fdcbf027f9 Cancel interact event if clearing a class item 2021-12-12 22:38:40 +01:00
7452aef50a Increase elf's bow's melee damage 2021-12-12 22:23:36 +01:00
6be08365b5 Increase elf's bow's melee damage 2021-12-12 22:11:46 +01:00
4b8304934f Add the possibility to disenchant a class item 2021-12-12 21:50:58 +01:00
3a321fd49b Naga take way more damages if in fire 2021-12-12 20:43:58 +01:00
9095707d77 Implement the Naga class and update some behaviors and effects of other classes 2021-12-12 20:22:38 +01:00
f89bf5a010 Working on 2021-12-11 21:56:49 +01:00
2e9f397155 Working on 2021-12-11 21:38:42 +01:00
6a089d9f66 Working on 2021-12-11 20:54:22 +01:00
28 changed files with 763 additions and 312 deletions

View File

@@ -0,0 +1,31 @@
name: Build and Upload JAR
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
runs-on: [ubuntu-latest]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
- name: Build with Gradle
run: chmod +x gradlew && ./gradlew clean build
- name: Upload JAR artifact
uses: christopherhx/gitea-upload-artifact@v4
with:
name: mineclass
path: build/libs/*.jar

View File

@@ -2,34 +2,48 @@ import org.apache.tools.ant.filters.ReplaceTokens
apply plugin: 'java' apply plugin: 'java'
group = 'net.rawmod' group = 'dev.rawleenc'
version = '0.1.5' version = '0.2.0'
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
repositories { repositories {
mavenCentral() mavenCentral()
maven { maven {
name = 'spigotmc-repo' name = "spigotmc-repo"
url = 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' url = "https://hub.spigotmc.org/nexus/content/repositories/snapshots/"
} }
maven { maven {
name = 'sonatype' name = "sonatype"
url = 'https://oss.sonatype.org/content/groups/public/' url = "https://oss.sonatype.org/content/groups/public/"
} }
} }
dependencies { dependencies {
compileOnly 'org.spigotmc:spigot-api:1.18.1-R0.1-SNAPSHOT' compileOnly("org.spigotmc:spigot-api:1.21.1-R0.1-SNAPSHOT")
}
def targetJavaVersion = 21
java {
def javaVersion = JavaVersion.toVersion(targetJavaVersion)
sourceCompatibility = javaVersion
targetCompatibility = javaVersion
if (JavaVersion.current() < javaVersion) {
toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion)
}
}
tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8'
if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible()) {
options.release.set(targetJavaVersion)
}
} }
processResources { processResources {
from(sourceSets.main.resources.srcDirs) { def props = [version: version]
filter ReplaceTokens, tokens: [version: version] inputs.properties props
filteringCharset 'UTF-8'
filesMatching('plugin.yml') {
expand props
} }
} }
jar {
archiveName "MineClass.jar"
}

Binary file not shown.

View File

@@ -1,5 +1,7 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

295
gradlew vendored
View File

@@ -1,7 +1,7 @@
#!/usr/bin/env sh #!/bin/sh
# #
# Copyright 2015 the original author or authors. # Copyright © 2015-2021 the original authors.
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@@ -17,78 +17,111 @@
# #
############################################################################## ##############################################################################
## #
## Gradle start up script for UN*X # 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/platforms/jvm/plugins-application/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 # Attempt to set APP_HOME
# Resolve links: $0 may be a link # Resolve links: $0 may be a link
PRG="$0" app_path=$0
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do # Need this for daisy-chained symlinks.
ls=`ls -ld "$PRG"` while
link=`expr "$ls" : '.*-> \(.*\)$'` APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
if expr "$link" : '/.*' > /dev/null; then [ -h "$app_path" ]
PRG="$link" do
else ls=$( ls -ld "$app_path" )
PRG=`dirname "$PRG"`"/$link" link=${ls#*' -> '}
fi case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle" # This is normally unused
APP_BASE_NAME=`basename "$0"` # shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum" MAX_FD=maximum
warn () { warn () {
echo "$*" echo "$*"
} } >&2
die () { die () {
echo echo
echo "$*" echo "$*"
echo echo
exit 1 exit 1
} } >&2
# OS specific support (must be 'true' or 'false'). # OS specific support (must be 'true' or 'false').
cygwin=false cygwin=false
msys=false msys=false
darwin=false darwin=false
nonstop=false nonstop=false
case "`uname`" in case "$( uname )" in #(
CYGWIN* ) CYGWIN* ) cygwin=true ;; #(
cygwin=true Darwin* ) darwin=true ;; #(
;; MSYS* | MINGW* ) msys=true ;; #(
Darwin* ) NONSTOP* ) nonstop=true ;;
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM. # Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables # IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java" JAVACMD=$JAVA_HOME/jre/sh/java
else else
JAVACMD="$JAVA_HOME/bin/java" JAVACMD=$JAVA_HOME/bin/java
fi fi
if [ ! -x "$JAVACMD" ] ; then if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -97,92 +130,120 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi fi
else else
JAVACMD="java" JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 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 Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi fi
fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
MAX_FD_LIMIT=`ulimit -H -n` case $MAX_FD in #(
if [ $? -eq 0 ] ; then max*)
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
MAX_FD="$MAX_FD_LIMIT" # shellcheck disable=SC2039,SC3045
fi MAX_FD=$( ulimit -H -n ) ||
ulimit -n $MAX_FD warn "Could not query maximum file descriptor limit"
if [ $? -ne 0 ] ; then esac
warn "Could not set maximum file descriptor limit: $MAX_FD" case $MAX_FD in #(
fi '' | soft) :;; #(
else *)
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
fi # shellcheck disable=SC2039,SC3045
fi ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac esac
fi fi
# Escape application args # Collect all arguments for the java command, stacking in reverse order:
save () { # * args from the command line
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done # * the main class name
echo " " # * -classpath
} # * -D...appname settings
APP_ARGS=$(save "$@") # * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# Collect all arguments for the java command, following the shell quoting and substitution rules # For Cygwin or MSYS, switch paths to Windows format before running java
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong JAVACMD=$( cygpath --unix "$JAVACMD" )
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")" # 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 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, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
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" "$@" exec "$JAVACMD" "$@"

54
gradlew.bat vendored
View File

@@ -26,9 +26,13 @@ if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0 set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=. if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0 set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME% 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. @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" set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@@ -37,13 +41,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init if %ERRORLEVEL% equ 0 goto execute
echo. echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail
@@ -51,48 +55,36 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=% set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init if exist "%JAVA_EXE%" goto execute
echo. echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute :execute
@rem Setup the command line @rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle @rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end :end
@rem End local scope for the variables with windows NT shell @rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd if %ERRORLEVEL% equ 0 goto mainEnd
:fail :fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code! rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 set EXIT_CODE=%ERRORLEVEL%
exit /b 1 if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd :mainEnd
if "%OS%"=="Windows_NT" endlocal if "%OS%"=="Windows_NT" endlocal

View File

@@ -1,8 +1,8 @@
package net.rawmod.mineclass; package dev.rawleenc.mineclass;
import net.rawmod.mineclass.classes.MineClassFactory; import dev.rawleenc.mineclass.classes.MineClassFactory;
import net.rawmod.mineclass.commands.CommandClass; import dev.rawleenc.mineclass.commands.CommandClass;
import net.rawmod.mineclass.listeners.MineClassListeners; import dev.rawleenc.mineclass.listeners.MineClassListeners;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.PluginCommand; import org.bukkit.command.PluginCommand;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;

View File

@@ -1,6 +1,6 @@
package net.rawmod.mineclass.classes; package dev.rawleenc.mineclass.classes;
import net.rawmod.mineclass.utils.Pair; import dev.rawleenc.mineclass.utils.Pair;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -29,7 +29,7 @@ public class BeastMasterClass extends MineClassImpl {
Stream.of( Stream.of(
new Object[][] { new Object[][] {
{PotionEffectType.NIGHT_VISION, 1}, {PotionEffectType.NIGHT_VISION, 1},
{PotionEffectType.SLOW, 1}, {PotionEffectType.SLOWNESS, 1},
{PotionEffectType.WEAKNESS, 1}, {PotionEffectType.WEAKNESS, 1},
}) })
.collect(Collectors.toMap(data -> (PotionEffectType) data[0], data -> (Integer) data[1])); .collect(Collectors.toMap(data -> (PotionEffectType) data[0], data -> (Integer) data[1]));
@@ -50,7 +50,7 @@ public class BeastMasterClass extends MineClassImpl {
} }
@Override @Override
public Map<PotionEffectType, Integer> getPotionEffects() { public Map<PotionEffectType, Integer> getPotionEffects(Player player) {
return potionEffects; return potionEffects;
} }
@@ -64,21 +64,26 @@ public class BeastMasterClass extends MineClassImpl {
return "beast_master"; return "beast_master";
} }
@Override
public String getName() {
return "Beast master";
}
@Override @Override
public void giveItems(Player player) { public void giveItems(Player player) {
if (!player.getInventory().contains(Material.BONE)) { if (!player.getInventory().contains(Material.BONE)) {
ItemStack itemStack = new ItemStack(Material.BONE, 1); ItemStack itemStack = new ItemStack(Material.BONE, 1);
enchantItem(itemStack); enchantItem(itemStack, player);
player.getInventory().addItem(itemStack); player.getInventory().addItem(itemStack);
} }
if (!player.getInventory().contains(Material.SALMON)) { if (!player.getInventory().contains(Material.SALMON)) {
ItemStack itemStack = new ItemStack(Material.SALMON, 1); ItemStack itemStack = new ItemStack(Material.SALMON, 1);
enchantItem(itemStack); enchantItem(itemStack, player);
player.getInventory().addItem(itemStack); player.getInventory().addItem(itemStack);
} }
if (!player.getInventory().contains(Material.SADDLE)) { if (!player.getInventory().contains(Material.SADDLE)) {
ItemStack itemStack = new ItemStack(Material.SADDLE, 1); ItemStack itemStack = new ItemStack(Material.SADDLE, 1);
enchantItem(itemStack); enchantItem(itemStack, player);
player.getInventory().addItem(itemStack); player.getInventory().addItem(itemStack);
} }
} }

View File

@@ -1,6 +1,6 @@
package net.rawmod.mineclass.classes; package dev.rawleenc.mineclass.classes;
import net.rawmod.mineclass.utils.Pair; import dev.rawleenc.mineclass.utils.Pair;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -32,9 +32,9 @@ public class DwarfClass extends MineClassImpl {
Stream.of( Stream.of(
new Object[][] { new Object[][] {
{PotionEffectType.HEALTH_BOOST, 2}, {PotionEffectType.HEALTH_BOOST, 2},
{PotionEffectType.DAMAGE_RESISTANCE, 1}, {PotionEffectType.RESISTANCE, 1},
{PotionEffectType.HERO_OF_THE_VILLAGE, 1}, {PotionEffectType.HERO_OF_THE_VILLAGE, 1},
{PotionEffectType.FAST_DIGGING, 1}, {PotionEffectType.HASTE, 1},
{PotionEffectType.NIGHT_VISION, 1}, {PotionEffectType.NIGHT_VISION, 1},
}) })
.collect(Collectors.toMap(data -> (PotionEffectType) data[0], data -> (Integer) data[1])); .collect(Collectors.toMap(data -> (PotionEffectType) data[0], data -> (Integer) data[1]));
@@ -44,33 +44,33 @@ public class DwarfClass extends MineClassImpl {
new AbstractMap.SimpleEntry<>( new AbstractMap.SimpleEntry<>(
Material.NETHERITE_PICKAXE, Material.NETHERITE_PICKAXE,
Arrays.asList( Arrays.asList(
new Pair<>(Enchantment.DIG_SPEED, 8), new Pair<>(Enchantment.EFFICIENCY, 8),
new Pair<>(Enchantment.LOOT_BONUS_BLOCKS, 2))), new Pair<>(Enchantment.FORTUNE, 2))),
new AbstractMap.SimpleEntry<>( new AbstractMap.SimpleEntry<>(
Material.DIAMOND_PICKAXE, Material.DIAMOND_PICKAXE,
Arrays.asList( Arrays.asList(
new Pair<>(Enchantment.DIG_SPEED, 8), new Pair<>(Enchantment.EFFICIENCY, 8),
new Pair<>(Enchantment.LOOT_BONUS_BLOCKS, 2))), new Pair<>(Enchantment.FORTUNE, 2))),
new AbstractMap.SimpleEntry<>( new AbstractMap.SimpleEntry<>(
Material.IRON_PICKAXE, Material.IRON_PICKAXE,
Arrays.asList( Arrays.asList(
new Pair<>(Enchantment.DIG_SPEED, 8), new Pair<>(Enchantment.EFFICIENCY, 8),
new Pair<>(Enchantment.LOOT_BONUS_BLOCKS, 2))), new Pair<>(Enchantment.FORTUNE, 2))),
new AbstractMap.SimpleEntry<>( new AbstractMap.SimpleEntry<>(
Material.GOLDEN_PICKAXE, Material.GOLDEN_PICKAXE,
Arrays.asList( Arrays.asList(
new Pair<>(Enchantment.DIG_SPEED, 8), new Pair<>(Enchantment.EFFICIENCY, 8),
new Pair<>(Enchantment.LOOT_BONUS_BLOCKS, 2))), new Pair<>(Enchantment.FORTUNE, 2))),
new AbstractMap.SimpleEntry<>( new AbstractMap.SimpleEntry<>(
Material.STONE_PICKAXE, Material.STONE_PICKAXE,
Arrays.asList( Arrays.asList(
new Pair<>(Enchantment.DIG_SPEED, 8), new Pair<>(Enchantment.EFFICIENCY, 8),
new Pair<>(Enchantment.LOOT_BONUS_BLOCKS, 2))), new Pair<>(Enchantment.FORTUNE, 2))),
new AbstractMap.SimpleEntry<>( new AbstractMap.SimpleEntry<>(
Material.WOODEN_PICKAXE, Material.WOODEN_PICKAXE,
Arrays.asList( Arrays.asList(
new Pair<>(Enchantment.DIG_SPEED, 8), new Pair<>(Enchantment.EFFICIENCY, 8),
new Pair<>(Enchantment.LOOT_BONUS_BLOCKS, 2)))) new Pair<>(Enchantment.FORTUNE, 2))))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
@Override @Override
@@ -79,7 +79,7 @@ public class DwarfClass extends MineClassImpl {
} }
@Override @Override
public Map<PotionEffectType, Integer> getPotionEffects() { public Map<PotionEffectType, Integer> getPotionEffects(Player player) {
return potionEffects; return potionEffects;
} }
@@ -93,6 +93,11 @@ public class DwarfClass extends MineClassImpl {
return "dwarf"; return "dwarf";
} }
@Override
public String getName() {
return "Dwarf";
}
@Override @Override
public void giveItems(Player player) {} public void giveItems(Player player) {}
} }

View File

@@ -1,6 +1,6 @@
package net.rawmod.mineclass.classes; package dev.rawleenc.mineclass.classes;
import net.rawmod.mineclass.utils.Pair; import dev.rawleenc.mineclass.utils.Pair;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -37,7 +37,7 @@ public class ElfClass extends MineClassImpl {
Stream.of( Stream.of(
new Object[][] { new Object[][] {
{PotionEffectType.SPEED, 2}, {PotionEffectType.SPEED, 2},
{PotionEffectType.JUMP, 3}, {PotionEffectType.JUMP_BOOST, 3},
{PotionEffectType.LUCK, 1}, {PotionEffectType.LUCK, 1},
{PotionEffectType.NIGHT_VISION, 1}, {PotionEffectType.NIGHT_VISION, 1},
}) })
@@ -48,8 +48,9 @@ public class ElfClass extends MineClassImpl {
new AbstractMap.SimpleEntry<>( new AbstractMap.SimpleEntry<>(
Material.BOW, Material.BOW,
Arrays.asList( Arrays.asList(
new Pair<>(Enchantment.ARROW_INFINITE, 1), new Pair<>(Enchantment.INFINITY, 1),
new Pair<>(Enchantment.ARROW_DAMAGE, 8)))) new Pair<>(Enchantment.POWER, 8),
new Pair<>(Enchantment.KNOCKBACK, 1))))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
@Override @Override
@@ -58,7 +59,7 @@ public class ElfClass extends MineClassImpl {
} }
@Override @Override
public Map<PotionEffectType, Integer> getPotionEffects() { public Map<PotionEffectType, Integer> getPotionEffects(Player player) {
return potionEffects; return potionEffects;
} }
@@ -72,6 +73,11 @@ public class ElfClass extends MineClassImpl {
return "elf"; return "elf";
} }
@Override
public String getName() {
return "Elf";
}
@Override @Override
public void giveItems(Player player) {} public void giveItems(Player player) {}
} }

View File

@@ -1,6 +1,6 @@
package net.rawmod.mineclass.classes; package dev.rawleenc.mineclass.classes;
import net.rawmod.mineclass.utils.Pair; import dev.rawleenc.mineclass.utils.Pair;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
@@ -64,7 +64,7 @@ public class EnderElfClass extends MineClassImpl {
} }
@Override @Override
public Map<PotionEffectType, Integer> getPotionEffects() { public Map<PotionEffectType, Integer> getPotionEffects(Player player) {
return potionEffects; return potionEffects;
} }
@@ -78,13 +78,21 @@ public class EnderElfClass extends MineClassImpl {
return "ender_elf"; return "ender_elf";
} }
@Override
public String getName() {
return "Ender elf";
}
@Override @Override
public void reapplyEffects(Player player) { public void reapplyEffects(Player player) {
super.reapplyEffects(player); super.reapplyEffects(player);
if (player.getWorld().getEnvironment().equals(World.Environment.THE_END)) { if (player.getWorld().getEnvironment().equals(World.Environment.THE_END)) {
PotionEffect saturation = player.addPotionEffect(
new PotionEffect(PotionEffectType.SATURATION, Integer.MAX_VALUE, 9, false, false); new PotionEffect(PotionEffectType.SATURATION, Integer.MAX_VALUE, 0, false, false));
player.addPotionEffect(saturation); player.addPotionEffect(
new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 0, false, false));
player.addPotionEffect(
new PotionEffect(PotionEffectType.RESISTANCE, Integer.MAX_VALUE, 0, false, false));
} }
} }
@@ -92,7 +100,7 @@ public class EnderElfClass extends MineClassImpl {
public void giveItems(Player player) { public void giveItems(Player player) {
if (!player.getInventory().contains(Material.ENDER_PEARL)) { if (!player.getInventory().contains(Material.ENDER_PEARL)) {
ItemStack itemStack = new ItemStack(Material.ENDER_PEARL, 2); ItemStack itemStack = new ItemStack(Material.ENDER_PEARL, 2);
enchantItem(itemStack); enchantItem(itemStack, player);
player.getInventory().addItem(itemStack); player.getInventory().addItem(itemStack);
} }
} }

View File

@@ -1,9 +1,11 @@
package net.rawmod.mineclass.classes; package dev.rawleenc.mineclass.classes;
import net.rawmod.mineclass.utils.Pair; import dev.rawleenc.mineclass.utils.Pair;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
import java.util.*; import java.util.*;
@@ -36,8 +38,8 @@ public class FireDwarfClass extends MineClassImpl {
Stream.of( Stream.of(
new Object[][] { new Object[][] {
{PotionEffectType.FIRE_RESISTANCE, 1}, {PotionEffectType.FIRE_RESISTANCE, 1},
{PotionEffectType.FAST_DIGGING, 1}, {PotionEffectType.HASTE, 1},
{PotionEffectType.JUMP, 2}, {PotionEffectType.JUMP_BOOST, 2},
{PotionEffectType.NIGHT_VISION, 1}, {PotionEffectType.NIGHT_VISION, 1},
{PotionEffectType.HEALTH_BOOST, 2}, {PotionEffectType.HEALTH_BOOST, 2},
}) })
@@ -65,36 +67,49 @@ public class FireDwarfClass extends MineClassImpl {
Collections.singletonList(new Pair<>(Enchantment.FIRE_ASPECT, 2))), Collections.singletonList(new Pair<>(Enchantment.FIRE_ASPECT, 2))),
new AbstractMap.SimpleEntry<>( new AbstractMap.SimpleEntry<>(
Material.NETHERITE_PICKAXE, Material.NETHERITE_PICKAXE,
Collections.singletonList(new Pair<>(Enchantment.DIG_SPEED, 5))), Collections.singletonList(new Pair<>(Enchantment.EFFICIENCY, 5))),
new AbstractMap.SimpleEntry<>( new AbstractMap.SimpleEntry<>(
Material.DIAMOND_PICKAXE, Material.DIAMOND_PICKAXE,
Collections.singletonList(new Pair<>(Enchantment.DIG_SPEED, 5))), Collections.singletonList(new Pair<>(Enchantment.EFFICIENCY, 5))),
new AbstractMap.SimpleEntry<>( new AbstractMap.SimpleEntry<>(
Material.IRON_PICKAXE, Material.IRON_PICKAXE,
Collections.singletonList(new Pair<>(Enchantment.DIG_SPEED, 5))), Collections.singletonList(new Pair<>(Enchantment.EFFICIENCY, 5))),
new AbstractMap.SimpleEntry<>( new AbstractMap.SimpleEntry<>(
Material.GOLDEN_PICKAXE, Material.GOLDEN_PICKAXE,
Collections.singletonList(new Pair<>(Enchantment.DIG_SPEED, 5))), Collections.singletonList(new Pair<>(Enchantment.EFFICIENCY, 5))),
new AbstractMap.SimpleEntry<>( new AbstractMap.SimpleEntry<>(
Material.STONE_PICKAXE, Material.STONE_PICKAXE,
Collections.singletonList(new Pair<>(Enchantment.DIG_SPEED, 5))), Collections.singletonList(new Pair<>(Enchantment.EFFICIENCY, 5))),
new AbstractMap.SimpleEntry<>( new AbstractMap.SimpleEntry<>(
Material.WOODEN_PICKAXE, Material.WOODEN_PICKAXE,
Collections.singletonList(new Pair<>(Enchantment.DIG_SPEED, 5))), Collections.singletonList(new Pair<>(Enchantment.EFFICIENCY, 5))),
new AbstractMap.SimpleEntry<>( new AbstractMap.SimpleEntry<>(
Material.CROSSBOW, Material.CROSSBOW,
Collections.singletonList(new Pair<>(Enchantment.ARROW_INFINITE, 1))), Collections.singletonList(new Pair<>(Enchantment.INFINITY, 1))),
new AbstractMap.SimpleEntry<>( new AbstractMap.SimpleEntry<>(
Material.FLINT_AND_STEEL, new ArrayList<Pair<Enchantment, Integer>>())) Material.FLINT_AND_STEEL, new ArrayList<Pair<Enchantment, Integer>>()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
@Override
public void reapplyEffects(Player player) {
super.reapplyEffects(player);
if (player.getWorld().getEnvironment().equals(World.Environment.NETHER)) {
player.addPotionEffect(
new PotionEffect(PotionEffectType.SATURATION, Integer.MAX_VALUE, 0, false, false));
player.addPotionEffect(
new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 0, false, false));
player.addPotionEffect(
new PotionEffect(PotionEffectType.RESISTANCE, Integer.MAX_VALUE, 0, false, false));
}
}
@Override @Override
public Set<Material> getForbiddenItems() { public Set<Material> getForbiddenItems() {
return forbiddenItems; return forbiddenItems;
} }
@Override @Override
public Map<PotionEffectType, Integer> getPotionEffects() { public Map<PotionEffectType, Integer> getPotionEffects(Player player) {
return potionEffects; return potionEffects;
} }
@@ -108,6 +123,11 @@ public class FireDwarfClass extends MineClassImpl {
return "fire_dwarf"; return "fire_dwarf";
} }
@Override
public String getName() {
return "Fire dwarf";
}
@Override @Override
public void giveItems(Player player) {} public void giveItems(Player player) {}
} }

View File

@@ -1,6 +1,6 @@
package net.rawmod.mineclass.classes; package dev.rawleenc.mineclass.classes;
import net.rawmod.mineclass.utils.Pair; import dev.rawleenc.mineclass.utils.Pair;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -15,7 +15,7 @@ public interface MineClass {
Set<Material> getForbiddenItems(); Set<Material> getForbiddenItems();
Map<PotionEffectType, Integer> getPotionEffects(); Map<PotionEffectType, Integer> getPotionEffects(Player player);
Map<Material, List<Pair<Enchantment, Integer>>> getClassEnchantments(); Map<Material, List<Pair<Enchantment, Integer>>> getClassEnchantments();
@@ -23,11 +23,15 @@ public interface MineClass {
boolean isItemForbidden(Material type); boolean isItemForbidden(Material type);
void enchantItem(ItemStack itemStack); void enchantItem(ItemStack itemStack, Player player);
void disenchantItem(ItemStack itemStack, Player player);
void giveItems(Player player); void giveItems(Player player);
String getCode(); String getCode();
String getName();
void dropForbiddenItems(Player player); void dropForbiddenItems(Player player);
} }

View File

@@ -1,4 +1,4 @@
package net.rawmod.mineclass.classes; package dev.rawleenc.mineclass.classes;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -21,6 +21,7 @@ public class MineClassFactory {
availableClasses.put("fire_dwarf", new FireDwarfClass()); availableClasses.put("fire_dwarf", new FireDwarfClass());
availableClasses.put("ender_elf", new EnderElfClass()); availableClasses.put("ender_elf", new EnderElfClass());
availableClasses.put("beast_master", new BeastMasterClass()); availableClasses.put("beast_master", new BeastMasterClass());
availableClasses.put("naga", new NagaClass());
} }
/** Point d'accès pour l'instance unique du singleton */ /** Point d'accès pour l'instance unique du singleton */
@@ -32,13 +33,24 @@ public class MineClassFactory {
return INSTANCE; return INSTANCE;
} }
public static boolean isSoulBound(ItemStack itemStack) { public static boolean isSimpleSoulBound(ItemStack itemStack) {
if (itemStack.getItemMeta() != null && itemStack.getItemMeta().getLore() != null) { if (itemStack.getItemMeta() != null && itemStack.getItemMeta().getLore() != null) {
return itemStack.getItemMeta().getLore().contains("Soulbound"); return itemStack.getItemMeta().getLore().contains("Soulbound");
} }
return false; return false;
} }
public static boolean isSoulBound(ItemStack itemStack, Player player) {
if (itemStack.getItemMeta() != null && itemStack.getItemMeta().getLore() != null) {
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
return itemStack.getItemMeta().getLore().contains("Soulbound")
&& itemStack.getItemMeta().getLore().contains(player.getName())
&& mineClass.isPresent()
&& itemStack.getItemMeta().getLore().contains(mineClass.get().getName());
}
return false;
}
public static void clearAllClassEffects(Player player) { public static void clearAllClassEffects(Player player) {
for (PotionEffect activePotionEffect : player.getActivePotionEffects()) { for (PotionEffect activePotionEffect : player.getActivePotionEffects()) {
if (activePotionEffect.getDuration() > 32766) { if (activePotionEffect.getDuration() > 32766) {
@@ -47,11 +59,41 @@ public class MineClassFactory {
} }
} }
public static void setUnbreakableAndSoulbound(ItemStack itemStack) { public static void clearClassItem(Player player, ItemStack itemStack) {
ItemMeta itemMeta = itemStack.getItemMeta();
if (itemMeta != null) {
List<String> loreList = itemMeta.getLore();
if (loreList != null && loreList.contains("Soulbound")) {
String mineClassName = loreList.get(2);
System.out.println(mineClassName);
Optional<MineClass> optionalMineClass =
MineClassFactory.getInstance().findClassByName(mineClassName);
optionalMineClass.ifPresent(System.out::println);
optionalMineClass.ifPresent(mineClass -> mineClass.disenchantItem(itemStack, player));
}
}
}
public static void setUnbreakableAndSoulbound(ItemStack itemStack, Player player) {
if (itemStack.getItemMeta() != null) { if (itemStack.getItemMeta() != null) {
ItemMeta itemMeta = itemStack.getItemMeta(); ItemMeta itemMeta = itemStack.getItemMeta();
itemMeta.setUnbreakable(true); itemMeta.setUnbreakable(true);
itemMeta.setLore(Collections.singletonList("Soulbound")); List<String> loreList = new ArrayList<>();
loreList.add("Soulbound");
loreList.add(player.getName());
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
mineClass.ifPresent(aClass -> loreList.add(aClass.getName()));
itemMeta.setLore(loreList);
itemStack.setItemMeta(itemMeta);
}
}
public static void removeUnbreakableAndSoulbound(ItemStack itemStack, Player player) {
if (itemStack.getItemMeta() != null) {
ItemMeta itemMeta = itemStack.getItemMeta();
itemMeta.setUnbreakable(false);
List<String> loreList = new ArrayList<>();
itemMeta.setLore(loreList);
itemStack.setItemMeta(itemMeta); itemStack.setItemMeta(itemMeta);
} }
} }
@@ -82,6 +124,15 @@ public class MineClassFactory {
return Optional.empty(); return Optional.empty();
} }
public synchronized Optional<MineClass> findClassByName(String name) {
for (Map.Entry<String, MineClass> stringMineClassEntry : availableClasses.entrySet()) {
if (name != null && name.equals(stringMineClassEntry.getValue().getName())) {
return Optional.of(stringMineClassEntry.getValue());
}
}
return Optional.empty();
}
public void reapplyEffectsByCode(String code, Player player) { public void reapplyEffectsByCode(String code, Player player) {
availableClasses.get(code).reapplyEffects(player); availableClasses.get(code).reapplyEffects(player);
} }

View File

@@ -1,4 +1,4 @@
package net.rawmod.mineclass.classes; package dev.rawleenc.mineclass.classes;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -12,7 +12,7 @@ public abstract class MineClassImpl implements MineClass {
@Override @Override
public void reapplyEffects(Player player) { public void reapplyEffects(Player player) {
MineClassFactory.clearAllClassEffects(player); MineClassFactory.clearAllClassEffects(player);
getPotionEffects() getPotionEffects(player)
.forEach( .forEach(
(key, value) -> { (key, value) -> {
if (player.hasPotionEffect(key)) { if (player.hasPotionEffect(key)) {
@@ -30,7 +30,7 @@ public abstract class MineClassImpl implements MineClass {
} }
@Override @Override
public void enchantItem(ItemStack itemStack) { public void enchantItem(ItemStack itemStack, Player player) {
if (getClassEnchantments().containsKey(itemStack.getType())) { if (getClassEnchantments().containsKey(itemStack.getType())) {
getClassEnchantments() getClassEnchantments()
.getOrDefault(itemStack.getType(), new ArrayList<>()) .getOrDefault(itemStack.getType(), new ArrayList<>())
@@ -38,7 +38,19 @@ public abstract class MineClassImpl implements MineClass {
enchantmentIntegerPair -> enchantmentIntegerPair ->
itemStack.addUnsafeEnchantment( itemStack.addUnsafeEnchantment(
enchantmentIntegerPair.getFirst(), enchantmentIntegerPair.getSecond())); enchantmentIntegerPair.getFirst(), enchantmentIntegerPair.getSecond()));
MineClassFactory.setUnbreakableAndSoulbound(itemStack); MineClassFactory.setUnbreakableAndSoulbound(itemStack, player);
}
}
@Override
public void disenchantItem(ItemStack itemStack, Player player) {
if (getClassEnchantments().containsKey(itemStack.getType())) {
getClassEnchantments()
.getOrDefault(itemStack.getType(), new ArrayList<>())
.forEach(
enchantmentIntegerPair ->
itemStack.removeEnchantment(enchantmentIntegerPair.getFirst()));
MineClassFactory.removeUnbreakableAndSoulbound(itemStack, player);
} }
} }

View File

@@ -0,0 +1,104 @@
package dev.rawleenc.mineclass.classes;
import dev.rawleenc.mineclass.utils.Pair;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffectType;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class NagaClass extends MineClassImpl {
private static final Set<Material> forbiddenItems =
new HashSet<>() {
{
add(Material.DIAMOND_SWORD);
add(Material.GOLDEN_SWORD);
add(Material.IRON_SWORD);
add(Material.NETHERITE_SWORD);
add(Material.DIAMOND_HOE);
add(Material.GOLDEN_HOE);
add(Material.IRON_HOE);
add(Material.NETHERITE_HOE);
add(Material.DIAMOND_AXE);
add(Material.GOLDEN_AXE);
add(Material.IRON_AXE);
add(Material.NETHERITE_AXE);
add(Material.CROSSBOW);
add(Material.BOW);
}
};
private static final Map<PotionEffectType, Integer> potionEffectsInWater =
Stream.of(
new Object[][] {
{PotionEffectType.WATER_BREATHING, 1},
{PotionEffectType.HEALTH_BOOST, 2},
{PotionEffectType.CONDUIT_POWER, 1},
{PotionEffectType.DOLPHINS_GRACE, 3},
{PotionEffectType.SATURATION, 1},
{PotionEffectType.NIGHT_VISION, 1},
{PotionEffectType.RESISTANCE, 2},
{PotionEffectType.STRENGTH, 2},
{PotionEffectType.HASTE, 10},
})
.collect(Collectors.toMap(data -> (PotionEffectType) data[0], data -> (Integer) data[1]));
private static final Map<PotionEffectType, Integer> potionEffectsOnEarth =
Stream.of(
new Object[][] {
{PotionEffectType.SLOWNESS, 4},
{PotionEffectType.MINING_FATIGUE, 1},
{PotionEffectType.HUNGER, 10},
{PotionEffectType.WEAKNESS, 1},
})
.collect(Collectors.toMap(data -> (PotionEffectType) data[0], data -> (Integer) data[1]));
private static final Map<Material, List<Pair<Enchantment, Integer>>> classEnchantments =
Stream.of(
new AbstractMap.SimpleEntry<>(
Material.TRIDENT,
Arrays.asList(
new Pair<>(Enchantment.LOYALTY, 3),
new Pair<>(Enchantment.CHANNELING, 1),
new Pair<>(Enchantment.IMPALING, 5))))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
@Override
public Set<Material> getForbiddenItems() {
return forbiddenItems;
}
@Override
public Map<PotionEffectType, Integer> getPotionEffects(Player player) {
return player.isInWater() ? potionEffectsInWater : potionEffectsOnEarth;
}
@Override
public Map<Material, List<Pair<Enchantment, Integer>>> getClassEnchantments() {
return classEnchantments;
}
@Override
public String getCode() {
return "naga";
}
@Override
public String getName() {
return "Naga";
}
@Override
public void giveItems(Player player) {
if (!player.getInventory().contains(Material.TRIDENT)) {
ItemStack itemStack = new ItemStack(Material.TRIDENT, 1);
enchantItem(itemStack, player);
player.getInventory().addItem(itemStack);
}
}
}

View File

@@ -1,8 +1,8 @@
package net.rawmod.mineclass.commands; package dev.rawleenc.mineclass.commands;
import net.rawmod.mineclass.classes.MineClassFactory; import dev.rawleenc.mineclass.classes.MineClassFactory;
import net.rawmod.mineclass.utils.InvocationsFinder; import dev.rawleenc.mineclass.utils.InvocationsFinder;
import net.rawmod.mineclass.utils.NumberOfInvocations; import dev.rawleenc.mineclass.utils.NumberOfInvocations;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@@ -40,7 +40,6 @@ public class CommandClass implements CommandExecutor {
MineClassFactory.clearAllClassEffects(player); MineClassFactory.clearAllClassEffects(player);
MineClassFactory.getInstance().reapplyEffectsByCode(args[0], player); MineClassFactory.getInstance().reapplyEffectsByCode(args[0], player);
MineClassFactory.getInstance().giveItemsForClassByCode(args[0], player); MineClassFactory.getInstance().giveItemsForClassByCode(args[0], player);
MineClassFactory.getInstance().dropForbiddenItemsForClassByCode(args[0], player);
MineClassFactory.getInstance().setClassCode(player, args[0]); MineClassFactory.getInstance().setClassCode(player, args[0]);
if (!player.hasPotionEffect(PotionEffectType.SATURATION)) { if (!player.hasPotionEffect(PotionEffectType.SATURATION)) {
player.addPotionEffect(new PotionEffect(PotionEffectType.SATURATION, 200, 9)); player.addPotionEffect(new PotionEffect(PotionEffectType.SATURATION, 200, 9));

View File

@@ -1,9 +1,16 @@
package net.rawmod.mineclass.listeners; package dev.rawleenc.mineclass.listeners;
import net.rawmod.mineclass.Mineclass; import dev.rawleenc.mineclass.Mineclass;
import net.rawmod.mineclass.classes.MineClass; import dev.rawleenc.mineclass.classes.MineClass;
import net.rawmod.mineclass.classes.MineClassFactory; import dev.rawleenc.mineclass.classes.MineClassFactory;
import net.rawmod.mineclass.utils.*; import dev.rawleenc.mineclass.utils.ApplyClassStatusTask;
import dev.rawleenc.mineclass.utils.ClassItemPossessed;
import dev.rawleenc.mineclass.utils.InvocationsFinder;
import dev.rawleenc.mineclass.utils.NumberOfInvocations;
import dev.rawleenc.mineclass.utils.PlayerHitCounter;
import dev.rawleenc.mineclass.utils.PlayerTimerEffects;
import dev.rawleenc.mineclass.utils.PlayerUtils;
import dev.rawleenc.mineclass.utils.SmeltingEngine;
import org.bukkit.DyeColor; import org.bukkit.DyeColor;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Material; import org.bukkit.Material;
@@ -14,16 +21,19 @@ import org.bukkit.event.Event;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.event.block.BlockDropItemEvent; import org.bukkit.event.block.BlockDropItemEvent;
import org.bukkit.event.entity.*; import org.bukkit.event.entity.*;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.CraftItemEvent;
import org.bukkit.event.player.*; import org.bukkit.event.player.*;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.metadata.MetadataValue; import org.bukkit.metadata.MetadataValue;
import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
@@ -32,6 +42,7 @@ import java.util.stream.Collectors;
public class MineClassListeners implements Listener { public class MineClassListeners implements Listener {
private final Mineclass plugin; private final Mineclass plugin;
private final HashMap<Player, PlayerTimerEffects> playerTimerEffectsHashMap = new HashMap<>();
public MineClassListeners(Mineclass plugin) { public MineClassListeners(Mineclass plugin) {
this.plugin = plugin; this.plugin = plugin;
@@ -44,11 +55,26 @@ public class MineClassListeners implements Listener {
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player); Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
if (mineClass.isPresent()) { if (mineClass.isPresent()) {
mineClass.get().reapplyEffects(player); mineClass.get().reapplyEffects(player);
player.sendMessage(String.format("Reminder : You are a %s.", mineClass.get().getCode())); player.sendMessage(String.format("Reminder, your class is : %s.", mineClass.get().getName()));
} else { } else {
player.sendMessage( player.sendMessage(
"Hello ! The amazing MineClass mod is available on this server ! You can pick a class with the /class command."); "Hello ! The amazing MineClass mod is available on this server ! You can pick a class with the /class command.");
} }
if (!playerTimerEffectsHashMap.containsKey(player)) {
PlayerTimerEffects playerTimerEffects = new PlayerTimerEffects(player);
playerTimerEffectsHashMap.put(player, playerTimerEffects);
playerTimerEffects.runTaskTimer(this.plugin, 20, 20);
} else {
playerTimerEffectsHashMap.get(player).runTaskTimer(this.plugin, 20, 20);
}
}
@EventHandler
public void on(PlayerQuitEvent event) {
Player player = event.getPlayer();
if (playerTimerEffectsHashMap.containsKey(player)) {
playerTimerEffectsHashMap.get(player).cancel();
}
} }
@EventHandler @EventHandler
@@ -59,24 +85,70 @@ public class MineClassListeners implements Listener {
} }
@EventHandler @EventHandler
public void on(EntityPickupItemEvent event) { public void on(CraftItemEvent event) {
if (event.getEntity() instanceof Player) { if (event.getWhoClicked() instanceof Player) {
Player player = (Player) event.getEntity(); Player player = (Player) event.getWhoClicked();
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player); Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
if (mineClass.isPresent()) { mineClass.ifPresent(it -> enchantItem(event));
if (mineClass.get().isItemForbidden(event.getItem().getItemStack().getType())) {
event.setCancelled(true);
} }
mineClass.get().enchantItem(event.getItem().getItemStack());
} }
@EventHandler
public void on(BlockDamageEvent event) {
Player player = event.getPlayer();
ItemStack itemInHand = event.getItemInHand();
applyBadEffects(player, itemInHand);
}
private boolean isItemforbidden(Player player, ItemStack itemStack) {
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
return mineClass
.map(
aClass ->
Optional.ofNullable(itemStack.getItemMeta())
.map(ItemMeta::getLore)
.map(it -> it.contains(player.getName()) && !it.contains(aClass.getName()))
.orElse(false))
.orElse(false);
}
private void applyBadEffects(Player player, ItemStack itemInHand) {
if (itemInHand == null) {
return;
}
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
if (mineClass.isPresent() && mineClass.get().isItemForbidden(itemInHand.getType())
|| isItemforbidden(player, itemInHand)) {
player.addPotionEffect(new PotionEffect(PotionEffectType.WEAKNESS, 200, 0));
if (MineClassFactory.getInstance().getClassCode(player).equals("elf")) {
player.addPotionEffect(new PotionEffect(PotionEffectType.SLOWNESS, 200, 3));
} else {
player.addPotionEffect(new PotionEffect(PotionEffectType.SLOWNESS, 200, 1));
}
player.addPotionEffect(new PotionEffect(PotionEffectType.HUNGER, 200, 9));
player.setFoodLevel(Math.max(player.getFoodLevel() - 2, 0));
player.setSaturation(0);
}
}
@EventHandler
public void on(PlayerItemHeldEvent event) {
Player player = event.getPlayer();
ItemStack itemStack = player.getInventory().getItem(event.getNewSlot());
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
if (itemStack != null
&& (mineClass.isPresent() && mineClass.get().isItemForbidden(itemStack.getType())
|| isItemforbidden(player, itemStack))) {
player.sendMessage("Warning : You are unable to use this item efficiently.");
} }
} }
@EventHandler @EventHandler
public void on(PlayerDeathEvent event) { public void on(PlayerDeathEvent event) {
Player player = event.getEntity();
List<ItemStack> itemStackList = List<ItemStack> itemStackList =
event.getDrops().stream() event.getDrops().stream()
.filter(MineClassFactory::isSoulBound) .filter(it -> MineClassFactory.isSoulBound(it, player))
.collect(Collectors.toList()); .collect(Collectors.toList());
event.getDrops().removeAll(itemStackList); event.getDrops().removeAll(itemStackList);
ClassItemPossessed.getInstance().addItems(event.getEntity().getName(), itemStackList); ClassItemPossessed.getInstance().addItems(event.getEntity().getName(), itemStackList);
@@ -91,41 +163,14 @@ public class MineClassListeners implements Listener {
ClassItemPossessed.getInstance().clearItems(event.getPlayer().getName()); ClassItemPossessed.getInstance().clearItems(event.getPlayer().getName());
} }
@EventHandler private void enchantItem(CraftItemEvent event) {
public void on(InventoryClickEvent event) {
if (event.getWhoClicked() instanceof Player) {
if (isForbiddenItem(event)) {
event.setCancelled(true);
return;
}
enchantItem(event);
}
}
private boolean isForbiddenItem(InventoryClickEvent event) {
Player player = (Player) event.getWhoClicked(); Player player = (Player) event.getWhoClicked();
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player); Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
if (mineClass.isPresent()) { if (event.getCurrentItem() != null) {
if (event.getCurrentItem() != null mineClass.ifPresent(it -> it.enchantItem(event.getCurrentItem(), player));
&& mineClass.get().isItemForbidden(event.getCurrentItem().getType())) {
return true;
}
return event.getCursor() != null
&& mineClass.get().isItemForbidden(event.getCursor().getType());
}
return false;
}
private void enchantItem(InventoryClickEvent event) {
Player player = (Player) event.getWhoClicked();
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
if (mineClass.isPresent()) {
if (event.getCurrentItem() != null && !MineClassFactory.isSoulBound(event.getCurrentItem())) {
mineClass.get().enchantItem(event.getCurrentItem());
}
if (event.getCursor() != null && !MineClassFactory.isSoulBound(event.getCursor())) {
mineClass.get().enchantItem(event.getCursor());
} }
if (event.getCursor() != null) {
mineClass.ifPresent(it -> it.enchantItem(event.getCursor(), player));
} }
} }
@@ -149,7 +194,7 @@ public class MineClassListeners implements Listener {
if (event.getEntity() instanceof Player) { if (event.getEntity() instanceof Player) {
Player player = (Player) event.getEntity(); Player player = (Player) event.getEntity();
if (event.getProjectile() instanceof AbstractArrow if (event.getProjectile() instanceof AbstractArrow
&& event.getBow().getEnchantments().containsKey(Enchantment.ARROW_INFINITE)) { && event.getBow().getEnchantments().containsKey(Enchantment.INFINITY)) {
player.getInventory().addItem(new ItemStack(Material.ARROW)); player.getInventory().addItem(new ItemStack(Material.ARROW));
((AbstractArrow) event.getProjectile()) ((AbstractArrow) event.getProjectile())
.setPickupStatus(AbstractArrow.PickupStatus.DISALLOWED); .setPickupStatus(AbstractArrow.PickupStatus.DISALLOWED);
@@ -182,16 +227,17 @@ public class MineClassListeners implements Listener {
public void on(FoodLevelChangeEvent event) { public void on(FoodLevelChangeEvent event) {
if (event.getEntity() instanceof Player) { if (event.getEntity() instanceof Player) {
Player player = (Player) event.getEntity(); Player player = (Player) event.getEntity();
if (MineClassFactory.getInstance().getClassCode(player).equals("elf")) { if (MineClassFactory.getInstance().getClassCode(player).equals("elf")
int difference = player.getFoodLevel() - event.getFoodLevel(); && player.getPotionEffect(PotionEffectType.HUNGER) == null) {
int difference = event.getFoodLevel() - player.getFoodLevel();
if (difference > 0) { if (difference > 0) {
event.setCancelled(true); event.setFoodLevel(player.getFoodLevel() + (difference * 2));
} }
} }
if (MineClassFactory.getInstance().getClassCode(player).equals("ender_elf")) { if (MineClassFactory.getInstance().getClassCode(player).equals("ender_elf")) {
int difference = player.getFoodLevel() - event.getFoodLevel(); int difference = player.getFoodLevel() - event.getFoodLevel();
if (difference > 0) { if (difference > 0) {
event.setFoodLevel(player.getFoodLevel() - (difference * 2)); event.setFoodLevel(Math.max(player.getFoodLevel() - (difference * 2), 0));
} }
} }
} }
@@ -201,13 +247,14 @@ public class MineClassListeners implements Listener {
public void on(EntityDamageByEntityEvent event) { public void on(EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Player) { if (event.getDamager() instanceof Player) {
Player player = (Player) event.getDamager(); Player player = (Player) event.getDamager();
ItemStack itemInMainHand = player.getInventory().getItemInMainHand();
if (MineClassFactory.getInstance().getClassCode(player).equals("ender_elf") if (MineClassFactory.getInstance().getClassCode(player).equals("ender_elf")
&& player.getInventory().getItemInMainHand().getType().equals(Material.ENDER_PEARL)) { && itemInMainHand.getType().equals(Material.ENDER_PEARL)) {
PlayerHitCounter.getInstance().increaseHitCount(player); PlayerHitCounter.getInstance().increaseHitCount(player);
if (player.getAttackCooldown() == 1) { if (player.getAttackCooldown() == 1) {
// Vampirisme // Vampirisme
if (player.getHealth() <= 19) { if (player.getHealth() < 20) {
player.setHealth(player.getHealth() + 1); PlayerUtils.heal(player, 1);
} }
} }
if (PlayerHitCounter.getInstance().getHitCounter(player) == 15) { if (PlayerHitCounter.getInstance().getHitCounter(player) == 15) {
@@ -219,7 +266,10 @@ public class MineClassListeners implements Listener {
player.addPotionEffect(absorption); player.addPotionEffect(absorption);
} }
// Damage // Damage
event.setDamage(event.getDamage() * (player.getAttackCooldown() * 10)); event.setDamage(Math.max(event.getDamage() * (player.getAttackCooldown() * 10), 1));
} else if (MineClassFactory.getInstance().getClassCode(player).equals("elf")
&& itemInMainHand.getType().equals(Material.BOW)) {
event.setDamage(Math.max(event.getDamage() * (player.getAttackCooldown() * 6), 1));
} }
} else if (event.getDamager().hasMetadata("beastMasterWolfType")) { } else if (event.getDamager().hasMetadata("beastMasterWolfType")) {
event.getDamager().getMetadata("beastMasterWolfType").stream() event.getDamager().getMetadata("beastMasterWolfType").stream()
@@ -251,7 +301,7 @@ public class MineClassListeners implements Listener {
if (MineClassFactory.getInstance().getClassCode(player).equals("ender_elf") if (MineClassFactory.getInstance().getClassCode(player).equals("ender_elf")
&& event.getEntity() instanceof EnderPearl) { && event.getEntity() instanceof EnderPearl) {
ItemStack itemStack = new ItemStack(Material.ENDER_PEARL, 1); ItemStack itemStack = new ItemStack(Material.ENDER_PEARL, 1);
MineClassFactory.setUnbreakableAndSoulbound(itemStack); MineClassFactory.setUnbreakableAndSoulbound(itemStack, player);
player.getInventory().addItem(itemStack); player.getInventory().addItem(itemStack);
} }
} }
@@ -268,40 +318,64 @@ public class MineClassListeners implements Listener {
@EventHandler @EventHandler
public void on(PlayerInteractEvent event) { public void on(PlayerInteractEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
ItemStack itemInHand = event.getItem();
boolean effect = false;
if (player.isSneaking() if (player.isSneaking()
&& event.getAction().equals(Action.RIGHT_CLICK_BLOCK) && event.getAction().equals(Action.RIGHT_CLICK_BLOCK)
&& event.useInteractedBlock().equals(Event.Result.ALLOW) && event.useInteractedBlock().equals(Event.Result.ALLOW)
&& MineClassFactory.getInstance().getClassCode(player).equals("beast_master") && MineClassFactory.getInstance().getClassCode(player).equals("beast_master")
&& event.getClickedBlock() != null && event.getClickedBlock() != null
&& event.getItem() != null) { && itemInHand != null) {
event.setCancelled(true); event.setCancelled(true);
ItemStack itemStack = event.getItem(); switch (itemInHand.getType()) {
switch (itemStack.getType()) {
case SADDLE: case SADDLE:
invokeHorse(event, player); invokeHorse(event, player);
break; break;
case BONE: case BONE:
try { try {
invokeWolf(event, player, itemStack); invokeWolf(event, player, itemInHand);
} catch (IllegalStateException e) { } catch (IllegalStateException e) {
player.sendMessage(e.getMessage()); player.sendMessage(e.getMessage());
} }
break; break;
case SALMON: case SALMON:
invokeCat(event, player, itemStack); invokeCat(event, player, itemInHand);
break; break;
default: default:
break; break;
} }
effect = true;
} }
if (player.isSneaking() if (player.isSneaking()
&& (event.getAction().equals(Action.RIGHT_CLICK_BLOCK) && (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)
|| event.getAction().equals(Action.RIGHT_CLICK_AIR)) || event.getAction().equals(Action.RIGHT_CLICK_AIR))
&& MineClassFactory.getInstance().getClassCode(player).equals("ender_elf") && MineClassFactory.getInstance().getClassCode(player).equals("ender_elf")
&& event.getItem() != null && itemInHand != null
&& event.getItem().getType().equals(Material.ENDER_PEARL)) { && itemInHand.getType().equals(Material.ENDER_PEARL)) {
player.openInventory(player.getEnderChest()); player.openInventory(player.getEnderChest());
event.setCancelled(true); event.setCancelled(true);
effect = true;
}
if (player.isSneaking()
&& (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)
|| event.getAction().equals(Action.RIGHT_CLICK_AIR))
&& itemInHand != null) {
System.out.println(itemInHand);
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
if (MineClassFactory.isSimpleSoulBound(itemInHand)) {
System.out.println("Clearing");
MineClassFactory.clearClassItem(player, itemInHand);
event.setCancelled(true);
} else {
if (mineClass.isPresent()) {
mineClass.get().enchantItem(itemInHand, player);
event.setCancelled(true);
}
}
effect = true;
}
if (!effect) {
applyBadEffects(player, itemInHand);
} }
} }
@@ -376,7 +450,7 @@ public class MineClassListeners implements Listener {
wolf.setMetadata("beastMasterWolfType", new FixedMetadataValue(this.plugin, 1)); wolf.setMetadata("beastMasterWolfType", new FixedMetadataValue(this.plugin, 1));
wolf.setCustomName(String.format("%s's Beast Master Wolf", player.getName())); wolf.setCustomName(String.format("%s's Beast Master Wolf", player.getName()));
wolf.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, Integer.MAX_VALUE, 3)); wolf.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, Integer.MAX_VALUE, 3));
wolf.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, Integer.MAX_VALUE, 1)); wolf.addPotionEffect(new PotionEffect(PotionEffectType.STRENGTH, Integer.MAX_VALUE, 1));
wolf.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 2)); wolf.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 2));
} }
@@ -384,7 +458,7 @@ public class MineClassListeners implements Listener {
wolf.setMetadata("beastMasterWolfType", new FixedMetadataValue(this.plugin, 2)); wolf.setMetadata("beastMasterWolfType", new FixedMetadataValue(this.plugin, 2));
wolf.setCustomName(String.format("%s's Beast Master Hellhound", player.getName())); wolf.setCustomName(String.format("%s's Beast Master Hellhound", player.getName()));
wolf.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, Integer.MAX_VALUE, 4)); wolf.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, Integer.MAX_VALUE, 4));
wolf.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, Integer.MAX_VALUE, 2)); wolf.addPotionEffect(new PotionEffect(PotionEffectType.STRENGTH, Integer.MAX_VALUE, 2));
wolf.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 4)); wolf.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 4));
wolf.addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE, Integer.MAX_VALUE, 0)); wolf.addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE, Integer.MAX_VALUE, 0));
} }

View File

@@ -1,6 +1,6 @@
package net.rawmod.mineclass.utils; package dev.rawleenc.mineclass.utils;
import net.rawmod.mineclass.classes.MineClassFactory; import dev.rawleenc.mineclass.classes.MineClassFactory;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;

View File

@@ -1,4 +1,4 @@
package net.rawmod.mineclass.utils; package dev.rawleenc.mineclass.utils;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;

View File

@@ -1,4 +1,4 @@
package net.rawmod.mineclass.utils; package dev.rawleenc.mineclass.utils;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@@ -1,4 +1,4 @@
package net.rawmod.mineclass.utils; package dev.rawleenc.mineclass.utils;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@@ -1,4 +1,4 @@
package net.rawmod.mineclass.utils; package dev.rawleenc.mineclass.utils;
public class Pair<F, S> { public class Pair<F, S> {
private F first; private F first;

View File

@@ -1,4 +1,4 @@
package net.rawmod.mineclass.utils; package dev.rawleenc.mineclass.utils;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@@ -0,0 +1,49 @@
package dev.rawleenc.mineclass.utils;
import dev.rawleenc.mineclass.classes.MineClass;
import dev.rawleenc.mineclass.classes.MineClassFactory;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.Optional;
public class PlayerTimerEffects extends BukkitRunnable {
private final Player player;
private boolean inWater;
public PlayerTimerEffects(Player player) {
this.player = player;
this.inWater = player.isInWater();
}
@Override
public void run() {
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
if (mineClass.isPresent() && mineClass.get().getCode().equals("naga")) {
if (!player.isInWater()) {
player.damage(1);
}
if (player.isInWater() != inWater) {
inWater = player.isInWater();
mineClass.get().reapplyEffects(player);
}
if (player.getFireTicks() > 0) {
player.damage(4);
}
}
if (mineClass.isPresent() && mineClass.get().getCode().equals("fire_dwarf")) {
if (player.getFireTicks() > 0) {
PlayerUtils.heal(player, 2);
player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 40, 3));
player.addPotionEffect(new PotionEffect(PotionEffectType.STRENGTH, 40, 1));
player.addPotionEffect(new PotionEffect(PotionEffectType.RESISTANCE, 40, 1));
}
if (player.isInWater()) {
player.damage(1);
}
}
}
}

View File

@@ -0,0 +1,14 @@
package dev.rawleenc.mineclass.utils;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeInstance;
import org.bukkit.entity.Player;
public class PlayerUtils {
public static void heal(Player player, double amount) {
AttributeInstance maxHealh = player.getAttribute(Attribute.GENERIC_MAX_HEALTH);
if (maxHealh != null) {
player.setHealth(Math.min(player.getHealth() + amount, maxHealh.getValue()));
}
}
}

View File

@@ -1,4 +1,4 @@
package net.rawmod.mineclass.utils; package dev.rawleenc.mineclass.utils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;

View File

@@ -1,6 +1,6 @@
name: Mineclass name: Mineclass
version: @version@ version: @version@
main: net.rawmod.mineclass.Mineclass main: dev.rawleenc.mineclass.Mineclass
api-version: 1.16 api-version: 1.16
authors: [ Barazok ] authors: [ Barazok ]
commands: commands: