@@ -0,0 +1,3 @@ | |||
.idea/ | |||
build/ | |||
.gradle/ |
@@ -0,0 +1,63 @@ | |||
buildscript { | |||
repositories { | |||
maven { url 'https://maven.aliyun.com/mvn/central' } | |||
// mavenCentral() | |||
maven { | |||
url = "https://maven.covertdragon.team/repository/internal" | |||
} | |||
maven { | |||
name = "sonatype" | |||
url = "http://maven.aliyun.com/nexus/content/groups/public" | |||
} | |||
} | |||
dependencies { | |||
classpath 'cn.yesterday17.forge:ForgeGradle:1.2.0.2' | |||
classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.4' | |||
} | |||
} | |||
apply plugin: 'forge' | |||
// apply plugin: 'com.github.johnrengelman.shadow' | |||
version = "1.0.0" | |||
group = "top.seraphjack.ofhcmc" | |||
archivesBaseName = "ofhcmc" | |||
sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' | |||
allprojects { | |||
repositories { | |||
maven { url 'https://maven.aliyun.com/mvn/central' } | |||
// mavenCentral() | |||
maven { | |||
name = "sonatype" | |||
url = "http://maven.aliyun.com/nexus/content/groups/public" | |||
} | |||
maven { | |||
url = "https://maven.covertdragon.team/repository/internal" | |||
} | |||
} | |||
} | |||
minecraft { | |||
version = "1.7.10-10.13.4.1614-1.7.10" | |||
runDir = "run" | |||
} | |||
dependencies { | |||
} | |||
processResources{ | |||
inputs.property "version", project.version | |||
inputs.property "mcversion", project.minecraft.version | |||
from(sourceSets.main.resources.srcDirs) { | |||
include 'mcmod.info' | |||
expand 'version': project.version, 'mcversion': project.minecraft.version | |||
} | |||
from(sourceSets.main.resources.srcDirs) { | |||
exclude 'mcmod.info' | |||
} | |||
} |
@@ -0,0 +1,6 @@ | |||
#Sun Feb 23 13:12:03 CST 2020 | |||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-all.zip | |||
distributionBase=GRADLE_USER_HOME | |||
distributionPath=wrapper/dists | |||
zipStorePath=wrapper/dists | |||
zipStoreBase=GRADLE_USER_HOME |
@@ -0,0 +1,164 @@ | |||
#!/usr/bin/env bash | |||
############################################################################## | |||
## | |||
## Gradle start up script for UN*X | |||
## | |||
############################################################################## | |||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | |||
DEFAULT_JVM_OPTS="" | |||
APP_NAME="Gradle" | |||
APP_BASE_NAME=`basename "$0"` | |||
# Use the maximum available, or set MAX_FD != -1 to use that value. | |||
MAX_FD="maximum" | |||
warn ( ) { | |||
echo "$*" | |||
} | |||
die ( ) { | |||
echo | |||
echo "$*" | |||
echo | |||
exit 1 | |||
} | |||
# OS specific support (must be 'true' or 'false'). | |||
cygwin=false | |||
msys=false | |||
darwin=false | |||
case "`uname`" in | |||
CYGWIN* ) | |||
cygwin=true | |||
;; | |||
Darwin* ) | |||
darwin=true | |||
;; | |||
MINGW* ) | |||
msys=true | |||
;; | |||
esac | |||
# For Cygwin, ensure paths are in UNIX format before anything is touched. | |||
if $cygwin ; then | |||
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` | |||
fi | |||
# Attempt to set APP_HOME | |||
# Resolve links: $0 may be a link | |||
PRG="$0" | |||
# Need this for relative symlinks. | |||
while [ -h "$PRG" ] ; do | |||
ls=`ls -ld "$PRG"` | |||
link=`expr "$ls" : '.*-> \(.*\)$'` | |||
if expr "$link" : '/.*' > /dev/null; then | |||
PRG="$link" | |||
else | |||
PRG=`dirname "$PRG"`"/$link" | |||
fi | |||
done | |||
SAVED="`pwd`" | |||
cd "`dirname \"$PRG\"`/" >&- | |||
APP_HOME="`pwd -P`" | |||
cd "$SAVED" >&- | |||
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" | |||
which java >/dev/null 2>&1 || 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 | |||
# Increase the maximum file descriptors if we can. | |||
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then | |||
MAX_FD_LIMIT=`ulimit -H -n` | |||
if [ $? -eq 0 ] ; then | |||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then | |||
MAX_FD="$MAX_FD_LIMIT" | |||
fi | |||
ulimit -n $MAX_FD | |||
if [ $? -ne 0 ] ; then | |||
warn "Could not set maximum file descriptor limit: $MAX_FD" | |||
fi | |||
else | |||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" | |||
fi | |||
fi | |||
# 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, switch paths to Windows format before running java | |||
if $cygwin ; then | |||
APP_HOME=`cygpath --path --mixed "$APP_HOME"` | |||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` | |||
# 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 | |||
fi | |||
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules | |||
function splitJvmOpts() { | |||
JVM_OPTS=("$@") | |||
} | |||
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS | |||
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" | |||
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" |
@@ -0,0 +1,90 @@ | |||
@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 | |||
@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= | |||
set DIRNAME=%~dp0 | |||
if "%DIRNAME%" == "" set DIRNAME=. | |||
set APP_BASE_NAME=%~n0 | |||
set APP_HOME=%DIRNAME% | |||
@rem Find java.exe | |||
if defined JAVA_HOME goto findJavaFromJavaHome | |||
set JAVA_EXE=java.exe | |||
%JAVA_EXE% -version >NUL 2>&1 | |||
if "%ERRORLEVEL%" == "0" goto init | |||
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 init | |||
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 | |||
:init | |||
@rem Get command-line arguments, handling Windowz variants | |||
if not "%OS%" == "Windows_NT" goto win9xME_args | |||
if "%@eval[2+2]" == "4" goto 4NT_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=%* | |||
goto execute | |||
:4NT_args | |||
@rem Get arguments from the 4NT Shell from JP Software | |||
set CMD_LINE_ARGS=%$ | |||
: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 %CMD_LINE_ARGS% | |||
:end | |||
@rem End local scope for the variables with windows NT shell | |||
if "%ERRORLEVEL%"=="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! | |||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 | |||
exit /b 1 | |||
:mainEnd | |||
if "%OS%"=="Windows_NT" endlocal | |||
:omega |
@@ -0,0 +1,16 @@ | |||
package top.seraphjack.ofhcmc; | |||
import cpw.mods.fml.common.Mod; | |||
import cpw.mods.fml.common.event.FMLPreInitializationEvent; | |||
import org.apache.logging.log4j.LogManager; | |||
import org.apache.logging.log4j.Logger; | |||
@Mod(modid = "ofhcmc") | |||
public class ModContainer { | |||
public static final Logger logger = LogManager.getLogger("ofhcmc"); | |||
@Mod.EventHandler | |||
public void preInit(FMLPreInitializationEvent e) { | |||
// TODO | |||
} | |||
} |
@@ -0,0 +1,14 @@ | |||
package top.seraphjack.ofhcmc.ofhc; | |||
import com.google.gson.annotations.SerializedName; | |||
public class Field { | |||
public int dim; | |||
public int x; | |||
public int z; | |||
@SerializedName("min_product") | |||
public int minProduct; | |||
@SerializedName("max_product") | |||
public int maxProduct; | |||
public String fluid; | |||
} |
@@ -0,0 +1,156 @@ | |||
package top.seraphjack.ofhcmc.ofhc; | |||
import com.google.gson.Gson; | |||
import com.google.gson.JsonObject; | |||
import com.google.gson.reflect.TypeToken; | |||
import org.apache.commons.io.IOUtils; | |||
import org.apache.http.HttpResponse; | |||
import org.apache.http.client.HttpClient; | |||
import org.apache.http.client.methods.HttpDelete; | |||
import org.apache.http.client.methods.HttpGet; | |||
import org.apache.http.client.methods.HttpPost; | |||
import org.apache.http.client.utils.HttpClientUtils; | |||
import org.apache.http.entity.StringEntity; | |||
import org.apache.http.impl.client.HttpClients; | |||
import java.io.InputStreamReader; | |||
import java.net.URL; | |||
import java.net.URLConnection; | |||
import java.util.List; | |||
import static top.seraphjack.ofhcmc.ModContainer.logger; | |||
public class FieldsManager { | |||
private final String url; | |||
private final String authKey; | |||
private final Gson gson = new Gson(); | |||
private final HttpClient client = HttpClients.createDefault(); | |||
public FieldsManager(String url, String authKey) { | |||
this.url = url.endsWith("/") ? url : url + '/'; | |||
this.authKey = authKey; | |||
} | |||
public Field getField(int dim, int x, int z) { | |||
try { | |||
URL url = new URL(this.url + "/fields/" + dim + "/" + x + "," + z); | |||
URLConnection connection = url.openConnection(); | |||
connection.setConnectTimeout(5000); | |||
return gson.fromJson(new InputStreamReader(connection.getInputStream()), Field.class); | |||
} catch (Exception e) { | |||
logger.error("Failed to get field: ", e); | |||
return null; | |||
} | |||
} | |||
public List<Field> getFields(int dim) { | |||
try { | |||
URL url = new URL(this.url + "/fields/" + dim); | |||
URLConnection connection = url.openConnection(); | |||
connection.setConnectTimeout(5000); | |||
return gson.fromJson(new InputStreamReader(connection.getInputStream()), new TypeToken<List<Field>>() { | |||
}.getType()); | |||
} catch (Exception e) { | |||
logger.error("Failed to get fields: ", e); | |||
return null; | |||
} | |||
} | |||
public boolean createField(Field f) { | |||
HttpPost postMethod = new HttpPost(url + "fields"); | |||
postMethod.addHeader("Content-Type", "application/json"); | |||
postMethod.addHeader("Authorization", authKey); | |||
HttpResponse res = null; | |||
try { | |||
postMethod.setEntity(new StringEntity(gson.toJson(f))); | |||
res = client.execute(postMethod); | |||
if (res.getStatusLine().getStatusCode() != 201) { | |||
logger.error("Failed to create field: " + res.getStatusLine().getStatusCode() + "\n" + IOUtils.toString(res.getEntity().getContent())); | |||
HttpClientUtils.closeQuietly(res); | |||
return false; | |||
} | |||
} catch (Exception e) { | |||
logger.error("Failed to create field", e); | |||
return false; | |||
} finally { | |||
HttpClientUtils.closeQuietly(res); | |||
} | |||
return true; | |||
} | |||
public boolean deleteField(int dim, int x, int z) { | |||
HttpDelete deleteMethod = new HttpDelete(url + "fields/" + dim + "/" + x + "," + z); | |||
deleteMethod.addHeader("Authorization", authKey); | |||
HttpResponse res = null; | |||
try { | |||
res = client.execute(deleteMethod); | |||
if (res.getStatusLine().getStatusCode() != 200) { | |||
logger.error("Failed to delete field: " + res.getStatusLine().getStatusCode() + "\n" + IOUtils.toString(res.getEntity().getContent())); | |||
HttpClientUtils.closeQuietly(res); | |||
return false; | |||
} | |||
} catch (Exception e) { | |||
logger.error("Failed to delete field", e); | |||
return false; | |||
} finally { | |||
HttpClientUtils.closeQuietly(res); | |||
} | |||
return true; | |||
} | |||
public boolean isChunkHarvested(int dim, int x, int z) { | |||
HttpGet getMethod = new HttpGet(url + "harvestedChunks/" + dim + "/" + x + "," + z); | |||
HttpResponse res = null; | |||
try { | |||
res = client.execute(getMethod); | |||
JsonObject obj = gson.fromJson(new InputStreamReader(res.getEntity().getContent()), JsonObject.class); | |||
HttpClientUtils.closeQuietly(res); | |||
return obj.get("harvested").getAsBoolean(); | |||
} catch (Exception e) { | |||
logger.error("Failed to check chunk availability", e); | |||
return false; | |||
} finally { | |||
HttpClientUtils.closeQuietly(res); | |||
} | |||
} | |||
public boolean setChunkHarvested(int dim, int x, int z, boolean harvested) { | |||
if (harvested) { | |||
HttpPost postMethod = new HttpPost(url + "harvestedChunks/" + dim + "/" + x + "," + z); | |||
postMethod.addHeader("Authorization", authKey); | |||
HttpResponse res = null; | |||
try { | |||
res = client.execute(postMethod); | |||
boolean ok = res.getStatusLine().getStatusCode() == 201; | |||
if (!ok) { | |||
logger.error("Failed to set chunk harvested: " + res.getStatusLine().getStatusCode() + "\n" + IOUtils.toString(res.getEntity().getContent())); | |||
} | |||
HttpClientUtils.closeQuietly(res); | |||
return ok; | |||
} catch (Exception e) { | |||
logger.error("Failed to set chunk harvested: ", e); | |||
return false; | |||
} finally { | |||
HttpClientUtils.closeQuietly(res); | |||
} | |||
} else { | |||
HttpDelete deleteMethod = new HttpDelete(url + "harvestedChunks/" + dim + "/" + x + "," + z); | |||
deleteMethod.addHeader("Authorization", authKey); | |||
HttpResponse res = null; | |||
try { | |||
res = client.execute(deleteMethod); | |||
boolean ok = res.getStatusLine().getStatusCode() == 201; | |||
if (!ok) { | |||
logger.error("Failed to set chunk harvested: " + res.getStatusLine().getStatusCode() + "\n" + IOUtils.toString(res.getEntity().getContent())); | |||
} | |||
HttpClientUtils.closeQuietly(res); | |||
return ok; | |||
} catch (Exception e) { | |||
logger.error("Failed to set chunk harvested: ", e); | |||
return false; | |||
} finally { | |||
HttpClientUtils.closeQuietly(res); | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,47 @@ | |||
package top.seraphjack.ofhcmc.utils; | |||
public class ChunkPos { | |||
private final int x, z; | |||
public ChunkPos(int x, int z) { | |||
this.x = x; | |||
this.z = z; | |||
} | |||
public ChunkPos(int posX, int posY, int posZ) { | |||
this.x = posX >> 4; | |||
this.z = posZ >> 4; | |||
} | |||
public int getX() { | |||
return x; | |||
} | |||
public int getZ() { | |||
return z; | |||
} | |||
public int getCentralX() { | |||
return this.x * 16 + 7; | |||
} | |||
public int getCentralZ() { | |||
return this.z * 16 + 7; | |||
} | |||
public int getMinX() { | |||
return this.x * 16; | |||
} | |||
public int getMinZ() { | |||
return this.z * 16; | |||
} | |||
public int getMaxX() { | |||
return this.x * 16 + 15; | |||
} | |||
public int getMaxZ() { | |||
return this.z * 16 + 15; | |||
} | |||
} |
@@ -0,0 +1,82 @@ | |||
package top.seraphjack.ofhcmc.utils; | |||
public class FieldPos { | |||
private final int x, z; | |||
public FieldPos(int x, int z) { | |||
this.x = x; | |||
this.z = z; | |||
} | |||
public FieldPos(ChunkPos pos) { | |||
this.x = pos.getX() >> 3; | |||
this.z = pos.getZ() >> 3; | |||
} | |||
public int getX() { | |||
return x; | |||
} | |||
public int getZ() { | |||
return z; | |||
} | |||
public int getMinChunkX() { | |||
return x * 8; | |||
} | |||
public int getMinChunkZ() { | |||
return z * 8; | |||
} | |||
public int getMaxChunkX() { | |||
return x * 8 + 7; | |||
} | |||
public int getMaxChunkZ() { | |||
return z * 8 + 7; | |||
} | |||
public int getMinBlockX() { | |||
return getMinChunkX() * 16; | |||
} | |||
public int getMinBlockZ() { | |||
return getMinChunkZ() * 16; | |||
} | |||
public FieldPos resolve(int n) { | |||
switch (n) { | |||
case 1: { | |||
return new FieldPos(x - 1, z - 1); | |||
} | |||
case 2: { | |||
return new FieldPos(x, z - 1); | |||
} | |||
case 3: { | |||
return new FieldPos(x + 1, z - 1); | |||
} | |||
case 4: { | |||
return new FieldPos(x - 1, z); | |||
} | |||
case 5: { | |||
return this; | |||
} | |||
case 6: { | |||
return new FieldPos(x + 1, z); | |||
} | |||
case 7: { | |||
return new FieldPos(x - 1, z + 1); | |||
} | |||
case 8: { | |||
return new FieldPos(x, z + 1); | |||
} | |||
case 9: { | |||
return new FieldPos(x + 1, z + 1); | |||
} | |||
default: { | |||
throw new IllegalArgumentException("Invalid number of field"); | |||
} | |||
} | |||
} | |||
} |