aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkuba6000 <kuba.123123.6000@gmail.com>2022-08-23 00:18:07 +0200
committerkuba6000 <kuba.123123.6000@gmail.com>2022-08-23 00:18:07 +0200
commitb89c1fbff7d44ddca4101a191b5ed554a890b7d4 (patch)
tree3c667863749bd5d9be38c830b19f6b3fff78be63
parentcf53d79d84bc5c4ebe5dab856f7cb94f7bd43820 (diff)
parent5d1286092eac1545f819babbee27244504a212f0 (diff)
downloadGT5-Unofficial-b89c1fbff7d44ddca4101a191b5ed554a890b7d4.tar.gz
GT5-Unofficial-b89c1fbff7d44ddca4101a191b5ed554a890b7d4.tar.bz2
GT5-Unofficial-b89c1fbff7d44ddca4101a191b5ed554a890b7d4.zip
Merge branch 'master' into buf
-rw-r--r--build.gradle492
-rw-r--r--dependencies.gradle5
-rw-r--r--settings.gradle2
-rw-r--r--src/main/java/kubatech/CommonProxy.java1
-rw-r--r--src/main/java/kubatech/api/ConstructableItemStack.java97
-rw-r--r--src/main/java/kubatech/api/LoaderReference.java1
-rw-r--r--src/main/java/kubatech/api/mobhandler/MobDrop.java99
-rw-r--r--src/main/java/kubatech/api/network/LoadConfigPacket.java21
-rw-r--r--src/main/java/kubatech/api/utils/GSONUtils.java33
-rw-r--r--src/main/java/kubatech/commands/CommandConfig.java2
-rw-r--r--src/main/java/kubatech/config/Config.java (renamed from src/main/java/kubatech/Config.java)3
-rw-r--r--src/main/java/kubatech/config/OverridesConfig.java212
-rw-r--r--src/main/java/kubatech/loaders/MobRecipeLoader.java258
-rw-r--r--src/main/java/kubatech/nei/Mob_Handler.java31
-rw-r--r--src/main/resources/assets/kubatech/lang/en_US.lang2
15 files changed, 952 insertions, 307 deletions
diff --git a/build.gradle b/build.gradle
index 046db33f4a..997b94dc30 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,4 +1,4 @@
-//version: 1660491897
+//version: 1661114848
/*
DO NOT CHANGE THIS FILE!
Also, you may replace this file at any time if there is an update available.
@@ -27,6 +27,11 @@ buildscript {
url 'https://maven.minecraftforge.net'
}
maven {
+ // GTNH ForgeGradle Fork
+ name = "GTNH Maven"
+ url = "http://jenkins.usrv.eu:8081/nexus/content/groups/public/"
+ }
+ maven {
name 'sonatype'
url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
@@ -34,13 +39,9 @@ buildscript {
name 'Scala CI dependencies'
url 'https://repo1.maven.org/maven2/'
}
- maven {
- name 'jitpack'
- url 'https://jitpack.io'
- }
}
dependencies {
- classpath 'com.github.GTNewHorizons:ForgeGradle:1.2.7'
+ classpath 'net.minecraftforge.gradle:ForgeGradle:1.2.9'
}
}
plugins {
@@ -49,17 +50,20 @@ plugins {
id 'eclipse'
id 'scala'
id 'maven-publish'
- id 'org.jetbrains.kotlin.jvm' version '1.5.30' apply false
- id 'org.jetbrains.kotlin.kapt' version '1.5.30' apply false
- id 'com.google.devtools.ksp' version '1.5.30-1.0.0' apply false
- id 'org.ajoberstar.grgit' version '4.1.1'
+ id 'org.jetbrains.kotlin.jvm' version '1.5.30' apply false
+ id 'org.jetbrains.kotlin.kapt' version '1.5.30' apply false
+ id 'com.google.devtools.ksp' version '1.5.30-1.0.0' apply false
+ id 'org.ajoberstar.grgit' version '4.1.1'
id 'com.github.johnrengelman.shadow' version '4.0.4'
- id 'com.palantir.git-version' version '0.13.0' apply false
- id 'de.undercouch.download' version '5.0.1'
- id 'com.github.gmazzo.buildconfig' version '3.0.3' apply false
- id "com.diffplug.spotless" version "6.7.2"
+ id 'com.palantir.git-version' version '0.13.0' apply false
+ id 'de.undercouch.download' version '5.0.1'
+ id 'com.github.gmazzo.buildconfig' version '3.0.3' apply false
+ id 'com.diffplug.spotless' version '6.7.2' apply false
}
-verifySettingsGradle()
+boolean settingsupdated = verifySettingsGradle()
+settingsupdated = verifyGitAttributes() || settingsupdated
+if (settingsupdated)
+ throw new GradleException("Settings has been updated, please re-run task.")
dependencies {
implementation 'com.diffplug:blowdryer:1.6.0'
@@ -90,9 +94,15 @@ idea {
downloadSources = true
}
}
-apply from: Blowdryer.file('spotless.gradle')
-if(JavaVersion.current() != JavaVersion.VERSION_1_8) {
+boolean disableSpotless = project.hasProperty("disableSpotless") ? project.disableSpotless.toBoolean() : false
+
+if (!disableSpotless) {
+ apply plugin: 'com.diffplug.spotless'
+ apply from: Blowdryer.file('spotless.gradle')
+}
+
+if (JavaVersion.current() != JavaVersion.VERSION_1_8) {
throw new GradleException("This project requires Java 8, but it's running on " + JavaVersion.current())
}
@@ -129,53 +139,53 @@ String kotlinSourceDir = "src/main/kotlin/"
String targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/")
String targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/")
String targetPackageKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/")
-if(!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) {
+if (!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) {
throw new GradleException("Could not resolve \"modGroup\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin)
}
-if(apiPackage) {
+if (apiPackage) {
targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/")
targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/")
targetPackageKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/")
- if(!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) {
+ if (!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) {
throw new GradleException("Could not resolve \"apiPackage\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin)
}
}
-if(accessTransformersFile) {
+if (accessTransformersFile) {
String targetFile = "src/main/resources/META-INF/" + accessTransformersFile
- if(!getFile(targetFile).exists()) {
+ if (!getFile(targetFile).exists()) {
throw new GradleException("Could not resolve \"accessTransformersFile\"! Could not find " + targetFile)
}
}
-if(usesMixins.toBoolean()) {
- if(mixinsPackage.isEmpty() || mixinPlugin.isEmpty()) {
+if (usesMixins.toBoolean()) {
+ if (mixinsPackage.isEmpty() || mixinPlugin.isEmpty()) {
throw new GradleException("\"mixinPlugin\" requires \"mixinsPackage\" and \"mixinPlugin\" to be set!")
}
targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinsPackage.toString().replaceAll("\\.", "/")
targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinsPackage.toString().replaceAll("\\.", "/")
targetPackageKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinsPackage.toString().replaceAll("\\.", "/")
- if(!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) {
- throw new GradleException("Could not resolve \"mixinsPackage\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin)
+ if (!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) {
+ throw new GradleException("Could not resolve \"mixinsPackage\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin)
}
String targetFileJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinPlugin.toString().replaceAll("\\.", "/") + ".java"
String targetFileScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinPlugin.toString().replaceAll("\\.", "/") + ".scala"
String targetFileScalaJava = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinPlugin.toString().replaceAll("\\.", "/") + ".java"
String targetFileKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinPlugin.toString().replaceAll("\\.", "/") + ".kt"
- if(!(getFile(targetFileJava).exists() || getFile(targetFileScala).exists() || getFile(targetFileScalaJava).exists() || getFile(targetFileKotlin).exists())) {
+ if (!(getFile(targetFileJava).exists() || getFile(targetFileScala).exists() || getFile(targetFileScalaJava).exists() || getFile(targetFileKotlin).exists())) {
throw new GradleException("Could not resolve \"mixinPlugin\"! Could not find " + targetFileJava + " or " + targetFileScala + " or " + targetFileScalaJava + " or " + targetFileKotlin)
}
}
-if(coreModClass) {
+if (coreModClass) {
String targetFileJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + coreModClass.toString().replaceAll("\\.", "/") + ".java"
String targetFileScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + coreModClass.toString().replaceAll("\\.", "/") + ".scala"
String targetFileScalaJava = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + coreModClass.toString().replaceAll("\\.", "/") + ".java"
String targetFileKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + coreModClass.toString().replaceAll("\\.", "/") + ".kt"
- if(!(getFile(targetFileJava).exists() || getFile(targetFileScala).exists() || getFile(targetFileScalaJava).exists() || getFile(targetFileKotlin).exists())) {
+ if (!(getFile(targetFileJava).exists() || getFile(targetFileScala).exists() || getFile(targetFileScalaJava).exists() || getFile(targetFileKotlin).exists())) {
throw new GradleException("Could not resolve \"coreModClass\"! Could not find " + targetFileJava + " or " + targetFileScala + " or " + targetFileScalaJava + " or " + targetFileKotlin)
}
}
@@ -204,10 +214,10 @@ try {
}
catch (Exception ignored) {
out.style(Style.Failure).text(
- 'This mod must be version controlled by Git AND the repository must provide at least one tag,\n' +
+ 'This mod must be version controlled by Git AND the repository must provide at least one tag,\n' +
'or the VERSION override must be set! ').style(Style.SuccessHeader).text('(Do NOT download from GitHub using the ZIP option, instead\n' +
- 'clone the repository, see ').style(Style.Info).text('https://gtnh.miraheze.org/wiki/Development').style(Style.SuccessHeader).println(' for details.)'
- )
+ 'clone the repository, see ').style(Style.Info).text('https://gtnh.miraheze.org/wiki/Development').style(Style.SuccessHeader).println(' for details.)'
+ )
versionOverride = 'NO-GIT-TAG-SET'
identifiedVersion = versionOverride
}
@@ -216,15 +226,14 @@ ext {
modVersion = identifiedVersion
}
-if(identifiedVersion == versionOverride) {
+if (identifiedVersion == versionOverride) {
out.style(Style.Failure).text('Override version to ').style(Style.Identifier).text(modVersion).style(Style.Failure).println('!\7')
}
group = modGroup
-if(project.hasProperty("customArchiveBaseName") && customArchiveBaseName) {
+if (project.hasProperty("customArchiveBaseName") && customArchiveBaseName) {
archivesBaseName = customArchiveBaseName
-}
-else {
+} else {
archivesBaseName = modId
}
@@ -250,16 +259,16 @@ minecraft {
if (replaceGradleTokenInFile) {
replaceIn replaceGradleTokenInFile
- if(gradleTokenModId) {
+ if (gradleTokenModId) {
replace gradleTokenModId, modId
}
- if(gradleTokenModName) {
+ if (gradleTokenModName) {
replace gradleTokenModName, modName
}
- if(gradleTokenVersion) {
+ if (gradleTokenVersion) {
replace gradleTokenVersion, modVersion
}
- if(gradleTokenGroupName) {
+ if (gradleTokenGroupName) {
replace gradleTokenGroupName, modGroup
}
}
@@ -268,7 +277,7 @@ minecraft {
args(arguments)
jvmArgs(jvmArguments)
- if(developmentEnvironmentUserName) {
+ if (developmentEnvironmentUserName) {
args("--username", developmentEnvironmentUserName)
}
}
@@ -279,7 +288,7 @@ minecraft {
}
}
-if(file('addon.gradle').exists()) {
+if (file('addon.gradle').exists()) {
apply from: 'addon.gradle'
}
@@ -296,7 +305,7 @@ repositories {
name 'Overmind forge repo mirror'
url 'https://gregtech.overminddl1.com/'
}
- if(usesMixins.toBoolean() || forceEnableMixins) {
+ if (usesMixins.toBoolean() || forceEnableMixins) {
maven {
name 'sponge'
url 'https://repo.spongepowered.org/repository/maven-public'
@@ -308,13 +317,13 @@ repositories {
}
dependencies {
- if(usesMixins.toBoolean()) {
+ if (usesMixins.toBoolean()) {
annotationProcessor('org.ow2.asm:asm-debug-all:5.0.3')
annotationProcessor('com.google.guava:guava:24.1.1-jre')
annotationProcessor('com.google.code.gson:gson:2.8.6')
annotationProcessor('org.spongepowered:mixin:0.8-SNAPSHOT')
}
- if(usesMixins.toBoolean() || forceEnableMixins) {
+ if (usesMixins.toBoolean() || forceEnableMixins) {
// using 0.8 to workaround a issue in 0.7 which fails mixin application
compile('com.github.GTNewHorizons:SpongePoweredMixin:0.7.12-GTNH') {
// Mixin includes a lot of dependencies that are too up-to-date
@@ -390,20 +399,20 @@ jar {
attributes(getManifestAttributes())
}
- if(usesShadowedDependencies.toBoolean()) {
+ if (usesShadowedDependencies.toBoolean()) {
dependsOn(shadowJar)
enabled = false
}
}
reobf {
- if(usesMixins.toBoolean() && file(mixinSrg).exists()) {
+ if (usesMixins.toBoolean()) {
addExtraSrgFile mixinSrg
}
}
afterEvaluate {
- if(usesMixins.toBoolean()) {
+ if (usesMixins.toBoolean()) {
tasks.compileJava {
options.compilerArgs += [
"-AreobfSrgFile=${tasks.reobf.srg}",
@@ -418,7 +427,7 @@ afterEvaluate {
}
runClient {
- if(developmentEnvironmentUserName) {
+ if (developmentEnvironmentUserName) {
arguments += [
"--username",
developmentEnvironmentUserName
@@ -436,10 +445,10 @@ runServer {
tasks.withType(JavaExec).configureEach {
javaLauncher.set(
- javaToolchains.launcherFor {
- languageVersion = projectJavaVersion
- }
- )
+ javaToolchains.launcherFor {
+ languageVersion = projectJavaVersion
+ }
+ )
}
processResources {
@@ -454,12 +463,12 @@ processResources {
// replace modVersion and minecraftVersion
expand "minecraftVersion": project.minecraft.version,
- "modVersion": modVersion,
- "modId": modId,
- "modName": modName
+ "modVersion": modVersion,
+ "modId": modId,
+ "modName": modName
}
- if(usesMixins.toBoolean()) {
+ if (usesMixins.toBoolean()) {
from refMap
}
@@ -472,31 +481,31 @@ processResources {
def getManifestAttributes() {
def manifestAttributes = [:]
- if(!containsMixinsAndOrCoreModOnly.toBoolean() && (usesMixins.toBoolean() || coreModClass)) {
+ if (!containsMixinsAndOrCoreModOnly.toBoolean() && (usesMixins.toBoolean() || coreModClass)) {
manifestAttributes += ["FMLCorePluginContainsFMLMod": true]
}
- if(accessTransformersFile) {
- manifestAttributes += ["FMLAT" : accessTransformersFile.toString()]
+ if (accessTransformersFile) {
+ manifestAttributes += ["FMLAT": accessTransformersFile.toString()]
}
- if(coreModClass) {
+ if (coreModClass) {
manifestAttributes += ["FMLCorePlugin": modGroup + "." + coreModClass]
}
- if(usesMixins.toBoolean()) {
+ if (usesMixins.toBoolean()) {
manifestAttributes += [
- "TweakClass" : "org.spongepowered.asm.launch.MixinTweaker",
- "MixinConfigs" : "mixins." + modId + ".json",
- "ForceLoadAsMod" : !containsMixinsAndOrCoreModOnly.toBoolean()
+ "TweakClass" : "org.spongepowered.asm.launch.MixinTweaker",
+ "MixinConfigs" : "mixins." + modId + ".json",
+ "ForceLoadAsMod": !containsMixinsAndOrCoreModOnly.toBoolean()
]
}
return manifestAttributes
}
task sourcesJar(type: Jar) {
- from (sourceSets.main.allSource)
- from (file("$projectDir/LICENSE"))
+ from(sourceSets.main.allSource)
+ from(file("$projectDir/LICENSE"))
getArchiveClassifier().set('sources')
}
@@ -546,22 +555,22 @@ task devJar(type: Jar) {
attributes(getManifestAttributes())
}
- if(usesShadowedDependencies.toBoolean()) {
+ if (usesShadowedDependencies.toBoolean()) {
dependsOn(circularResolverJar)
enabled = false
}
}
task apiJar(type: Jar) {
- from (sourceSets.main.allSource) {
+ from(sourceSets.main.allSource) {
include modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/") + '/**'
}
- from (sourceSets.main.output) {
+ from(sourceSets.main.output) {
include modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/") + '/**'
}
- from (sourceSets.main.resources.srcDirs) {
+ from(sourceSets.main.resources.srcDirs) {
include("LICENSE")
}
@@ -569,11 +578,11 @@ task apiJar(type: Jar) {
}
artifacts {
- if(!noPublishedSources) {
+ if (!noPublishedSources) {
archives sourcesJar
}
archives devJar
- if(apiPackage) {
+ if (apiPackage) {
archives apiJar
}
}
@@ -591,10 +600,10 @@ publishing {
publications {
maven(MavenPublication) {
from components.java
- if(usesShadowedDependencies.toBoolean()) {
+ if (usesShadowedDependencies.toBoolean()) {
artifact source: shadowJar, classifier: ""
}
- if(!noPublishedSources) {
+ if (!noPublishedSources) {
artifact source: sourcesJar, classifier: "sources"
}
artifact source: usesShadowedDependencies.toBoolean() ? shadowDevJar : devJar, classifier: "dev"
@@ -609,11 +618,11 @@ publishing {
// remove extra garbage from minecraft and minecraftDeps configuration
pom.withXml {
- def badArtifacts = [:].withDefault {[] as Set<String>}
+ def badArtifacts = [:].withDefault { [] as Set<String> }
for (configuration in [
- projectConfigs.minecraft,
- projectConfigs.minecraftDeps
- ]) {
+ projectConfigs.minecraft,
+ projectConfigs.minecraftDeps
+ ]) {
for (dependency in configuration.allDependencies) {
badArtifacts[dependency.group == null ? "" : dependency.group] += dependency.name
}
@@ -647,7 +656,7 @@ task updateBuildScript {
doLast {
if (performBuildScriptUpdate(projectDir.toString())) return
- print("Build script already up-to-date!")
+ print("Build script already up-to-date!")
}
}
@@ -660,20 +669,40 @@ if (!project.getGradle().startParameter.isOffline() && isNewBuildScriptVersionAv
}
static URL availableBuildScriptUrl() {
- new URL("https://raw.githubusercontent.com/GTNewHorizons/ExampleMod1.7.10/main/build.gradle")
+ new URL("https://raw.githubusercontent.com/GTNewHorizons/ExampleMod1.7.10/master/build.gradle")
}
+
static URL exampleSettingsGradleUrl() {
- new URL("https://raw.githubusercontent.com/GTNewHorizons/ExampleMod1.7.10/main/settings.gradle.example")
+ new URL("https://raw.githubusercontent.com/GTNewHorizons/ExampleMod1.7.10/master/settings.gradle.example")
}
+static URL exampleGitAttributesUrl() {
+ new URL("https://raw.githubusercontent.com/GTNewHorizons/ExampleMod1.7.10/master/.gitattributes")
+}
-def verifySettingsGradle() {
+
+boolean verifyGitAttributes() {
+ def gitattributesFile = getFile(".gitattributes")
+ if (!gitattributesFile.exists()) {
+ println("Downloading default .gitattributes")
+ exampleGitAttributesUrl().withInputStream { i -> gitattributesFile.withOutputStream { it << i } }
+ exec {
+ workingDir '.'
+ commandLine 'git', 'add', '--renormalize', '.'
+ }
+ return true
+ }
+ return false
+}
+
+boolean verifySettingsGradle() {
def settingsFile = getFile("settings.gradle")
if (!settingsFile.exists()) {
println("Downloading default settings.gradle")
exampleSettingsGradleUrl().withInputStream { i -> settingsFile.withOutputStream { it << i } }
- throw new GradleException("Settings.gradle has been updated, please re-run task.")
+ return true
}
+ return false
}
boolean performBuildScriptUpdate(String projectDir) {
@@ -681,7 +710,10 @@ boolean performBuildScriptUpdate(String projectDir) {
def buildscriptFile = getFile("build.gradle")
availableBuildScriptUrl().withInputStream { i -> buildscriptFile.withOutputStream { it << i } }
out.style(Style.Success).print("Build script updated. Please REIMPORT the project or RESTART your IDE!")
- verifySettingsGradle()
+ boolean settingsupdated = verifySettingsGradle()
+ settingsupdated = verifyGitAttributes() || settingsupdated
+ if (settingsupdated)
+ throw new GradleException("Settings has been updated, please re-run task.")
return true
}
return false
@@ -701,7 +733,7 @@ boolean isNewBuildScriptVersionAvailable(String projectDir) {
static String getVersionHash(String buildScriptContent) {
String versionLine = buildScriptContent.find("^//version: [a-z0-9]*")
- if(versionLine != null) {
+ if (versionLine != null) {
return versionLine.split(": ").last()
}
return ""
@@ -727,210 +759,210 @@ task deobfParams {
overwrite false
}
- if(!file(paramsCSV).exists()) {
+ if (!file(paramsCSV).exists()) {
println("Extracting MCP archive ...")
unzip(mcpZIP, mcpDir)
}
println("Parsing params.csv ...")
Map<String, String> params = new HashMap<>()
- Files.lines(Paths.get(paramsCSV)).forEach{line ->
+ Files.lines(Paths.get(paramsCSV)).forEach { line ->
String[] cells = line.split(",")
- if(cells.length > 2 && cells[0].matches("p_i?\\d+_\\d+_")) {
+ if (cells.length > 2 && cells[0].matches("p_i?\\d+_\\d+_")) {
params.put(cells[0], cells[1])
}
}
out.style(Style.Success).println("Modified ${replaceParams(file("$projectDir/src/main/java"), params)} files!")
- out.style(Style.Failure).println("Don't forget to verify that the code still works as before!\n It could be broken due to duplicate variables existing now\n or parameters taking priority over other variables.")
-}
+ out.style(Style.Failure).println("Don't forget to verify that the code still works as before!\n It could be broken due to duplicate variables existing now\n or parameters taking priority over other variables.")
+ }
}
static int replaceParams(File file, Map<String, String> params) {
-int fileCount = 0
+ int fileCount = 0
-if(file.isDirectory()) {
- for(File f : file.listFiles()) {
- fileCount += replaceParams(f, params)
- }
- return fileCount
-}
-println("Visiting ${file.getName()} ...")
-try {
- String content = new String(Files.readAllBytes(file.toPath()))
- int hash = content.hashCode()
- params.forEach{key, value ->
- content = content.replaceAll(key, value)
- }
- if(hash != content.hashCode()) {
- Files.write(file.toPath(), content.getBytes("UTF-8"))
- return 1
+ if (file.isDirectory()) {
+ for (File f : file.listFiles()) {
+ fileCount += replaceParams(f, params)
+ }
+ return fileCount
+ }
+ println("Visiting ${file.getName()} ...")
+ try {
+ String content = new String(Files.readAllBytes(file.toPath()))
+ int hash = content.hashCode()
+ params.forEach { key, value ->
+ content = content.replaceAll(key, value)
+ }
+ if (hash != content.hashCode()) {
+ Files.write(file.toPath(), content.getBytes("UTF-8"))
+ return 1
+ }
+ } catch (Exception e) {
+ e.printStackTrace()
}
-} catch(Exception e) {
- e.printStackTrace()
-}
-return 0
+ return 0
}
// Credit: bitsnaps (https://gist.github.com/bitsnaps/00947f2dce66f4bbdabc67d7e7b33681)
static unzip(String zipFileName, String outputDir) {
-byte[] buffer = new byte[16384]
-ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFileName))
-ZipEntry zipEntry = zis.getNextEntry()
-while (zipEntry != null) {
- File newFile = new File(outputDir + File.separator, zipEntry.name)
- if (zipEntry.isDirectory()) {
- if (!newFile.isDirectory() && !newFile.mkdirs()) {
- throw new IOException("Failed to create directory $newFile")
- }
- } else {
- // fix for Windows-created archives
- File parent = newFile.parentFile
- if (!parent.isDirectory() && !parent.mkdirs()) {
- throw new IOException("Failed to create directory $parent")
- }
- // write file content
- FileOutputStream fos = new FileOutputStream(newFile)
- int len = 0
- while ((len = zis.read(buffer)) > 0) {
- fos.write(buffer, 0, len)
+ byte[] buffer = new byte[16384]
+ ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFileName))
+ ZipEntry zipEntry = zis.getNextEntry()
+ while (zipEntry != null) {
+ File newFile = new File(outputDir + File.separator, zipEntry.name)
+ if (zipEntry.isDirectory()) {
+ if (!newFile.isDirectory() && !newFile.mkdirs()) {
+ throw new IOException("Failed to create directory $newFile")
+ }
+ } else {
+ // fix for Windows-created archives
+ File parent = newFile.parentFile
+ if (!parent.isDirectory() && !parent.mkdirs()) {
+ throw new IOException("Failed to create directory $parent")
+ }
+ // write file content
+ FileOutputStream fos = new FileOutputStream(newFile)
+ int len = 0
+ while ((len = zis.read(buffer)) > 0) {
+ fos.write(buffer, 0, len)
+ }
+ fos.close()
}
- fos.close()
+ zipEntry = zis.getNextEntry()
}
- zipEntry = zis.getNextEntry()
-}
-zis.closeEntry()
-zis.close()
+ zis.closeEntry()
+ zis.close()
}
configure(deobfParams) {
-group = 'forgegradle'
-description = 'Rename all obfuscated parameter names inherited from Minecraft classes'
+ group = 'forgegradle'
+ description = 'Rename all obfuscated parameter names inherited from Minecraft classes'
}
// Dependency Deobfuscation
def deobf(String sourceURL) {
-try {
- URL url = new URL(sourceURL)
- String fileName = url.getFile()
+ try {
+ URL url = new URL(sourceURL)
+ String fileName = url.getFile()
+
+ //get rid of directories:
+ int lastSlash = fileName.lastIndexOf("/")
+ if (lastSlash > 0) {
+ fileName = fileName.substring(lastSlash + 1)
+ }
+ //get rid of extension:
+ if (fileName.endsWith(".jar") || fileName.endsWith(".litemod")) {
+ fileName = fileName.substring(0, fileName.lastIndexOf("."))
+ }
- //get rid of directories:
- int lastSlash = fileName.lastIndexOf("/")
- if(lastSlash > 0) {
- fileName = fileName.substring(lastSlash + 1)
- }
- //get rid of extension:
- if(fileName.endsWith(".jar") || fileName.endsWith(".litemod")) {
- fileName = fileName.substring(0, fileName.lastIndexOf("."))
- }
+ String hostName = url.getHost()
+ if (hostName.startsWith("www.")) {
+ hostName = hostName.substring(4)
+ }
+ List parts = Arrays.asList(hostName.split("\\."))
+ Collections.reverse(parts)
+ hostName = String.join(".", parts)
- String hostName = url.getHost()
- if(hostName.startsWith("www.")) {
- hostName = hostName.substring(4)
+ return deobf(sourceURL, "$hostName/$fileName")
+ } catch (Exception e) {
+ return deobf(sourceURL, "deobf/${sourceURL.hashCode()}")
}
- List parts = Arrays.asList(hostName.split("\\."))
- Collections.reverse(parts)
- hostName = String.join(".", parts)
-
- return deobf(sourceURL, "$hostName/$fileName")
-} catch(Exception e) {
- return deobf(sourceURL, "deobf/${sourceURL.hashCode()}")
-}
}
// The method above is to be preferred. Use this method if the filename is not at the end of the URL.
def deobf(String sourceURL, String rawFileName) {
-String bon2Version = "2.5.1"
-String fileName = URLDecoder.decode(rawFileName, "UTF-8")
-String cacheDir = "$project.gradle.gradleUserHomeDir/caches"
-String bon2Dir = "$cacheDir/forge_gradle/deobf"
-String bon2File = "$bon2Dir/BON2-${bon2Version}.jar"
-String obfFile = "$cacheDir/modules-2/files-2.1/${fileName}.jar"
-String deobfFile = "$cacheDir/modules-2/files-2.1/${fileName}-deobf.jar"
-
-if(file(deobfFile).exists()) {
- return files(deobfFile)
-}
+ String bon2Version = "2.5.1"
+ String fileName = URLDecoder.decode(rawFileName, "UTF-8")
+ String cacheDir = "$project.gradle.gradleUserHomeDir/caches"
+ String bon2Dir = "$cacheDir/forge_gradle/deobf"
+ String bon2File = "$bon2Dir/BON2-${bon2Version}.jar"
+ String obfFile = "$cacheDir/modules-2/files-2.1/${fileName}.jar"
+ String deobfFile = "$cacheDir/modules-2/files-2.1/${fileName}-deobf.jar"
-String mappingsVer
-String remoteMappings = project.hasProperty('remoteMappings') ? project.remoteMappings : 'https://raw.githubusercontent.com/MinecraftForge/FML/1.7.10/conf/'
-if(remoteMappings) {
- String id = "${forgeVersion.split("\\.")[3]}-$minecraftVersion"
- String mappingsZIP = "$cacheDir/forge_gradle/maven_downloader/de/oceanlabs/mcp/mcp_snapshot_nodoc/$id/mcp_snapshot_nodoc-${id}.zip"
+ if (file(deobfFile).exists()) {
+ return files(deobfFile)
+ }
- zipMappings(mappingsZIP, remoteMappings, bon2Dir)
+ String mappingsVer
+ String remoteMappings = project.hasProperty('remoteMappings') ? project.remoteMappings : 'https://raw.githubusercontent.com/MinecraftForge/FML/1.7.10/conf/'
+ if (remoteMappings) {
+ String id = "${forgeVersion.split("\\.")[3]}-$minecraftVersion"
+ String mappingsZIP = "$cacheDir/forge_gradle/maven_downloader/de/oceanlabs/mcp/mcp_snapshot_nodoc/$id/mcp_snapshot_nodoc-${id}.zip"
- mappingsVer = "snapshot_$id"
-} else {
- mappingsVer = "${channel}_$mappingsVersion"
-}
+ zipMappings(mappingsZIP, remoteMappings, bon2Dir)
-download.run {
- src "http://jenkins.usrv.eu:8081/nexus/content/repositories/releases/com/github/parker8283/BON2/$bon2Version-CUSTOM/BON2-$bon2Version-CUSTOM-all.jar"
- dest bon2File
- quiet true
- overwrite false
-}
+ mappingsVer = "snapshot_$id"
+ } else {
+ mappingsVer = "${channel}_$mappingsVersion"
+ }
-download.run {
- src sourceURL
- dest obfFile
- quiet true
- overwrite false
-}
+ download.run {
+ src "http://jenkins.usrv.eu:8081/nexus/content/repositories/releases/com/github/parker8283/BON2/$bon2Version-CUSTOM/BON2-$bon2Version-CUSTOM-all.jar"
+ dest bon2File
+ quiet true
+ overwrite false
+ }
-exec {
- commandLine 'java', '-jar', bon2File, '--inputJar', obfFile, '--outputJar', deobfFile, '--mcVer', minecraftVersion, '--mappingsVer', mappingsVer, '--notch'
- workingDir bon2Dir
- standardOutput = new FileOutputStream("${deobfFile}.log")
-}
+ download.run {
+ src sourceURL
+ dest obfFile
+ quiet true
+ overwrite false
+ }
+
+ exec {
+ commandLine 'java', '-jar', bon2File, '--inputJar', obfFile, '--outputJar', deobfFile, '--mcVer', minecraftVersion, '--mappingsVer', mappingsVer, '--notch'
+ workingDir bon2Dir
+ standardOutput = new FileOutputStream("${deobfFile}.log")
+ }
-return files(deobfFile)
+ return files(deobfFile)
}
def zipMappings(String zipPath, String url, String bon2Dir) {
-File zipFile = new File(zipPath)
-if(zipFile.exists()) {
- return
-}
+ File zipFile = new File(zipPath)
+ if (zipFile.exists()) {
+ return
+ }
-String fieldsCache = "$bon2Dir/data/fields.csv"
-String methodsCache = "$bon2Dir/data/methods.csv"
+ String fieldsCache = "$bon2Dir/data/fields.csv"
+ String methodsCache = "$bon2Dir/data/methods.csv"
-download.run {
- src "${url}fields.csv"
- dest fieldsCache
- quiet true
-}
-download.run {
- src "${url}methods.csv"
- dest methodsCache
- quiet true
-}
+ download.run {
+ src "${url}fields.csv"
+ dest fieldsCache
+ quiet true
+ }
+ download.run {
+ src "${url}methods.csv"
+ dest methodsCache
+ quiet true
+ }
-zipFile.getParentFile().mkdirs()
-ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile))
+ zipFile.getParentFile().mkdirs()
+ ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile))
-zos.putNextEntry(new ZipEntry("fields.csv"))
-Files.copy(Paths.get(fieldsCache), zos)
-zos.closeEntry()
+ zos.putNextEntry(new ZipEntry("fields.csv"))
+ Files.copy(Paths.get(fieldsCache), zos)
+ zos.closeEntry()
-zos.putNextEntry(new ZipEntry("methods.csv"))
-Files.copy(Paths.get(methodsCache), zos)
-zos.closeEntry()
+ zos.putNextEntry(new ZipEntry("methods.csv"))
+ Files.copy(Paths.get(methodsCache), zos)
+ zos.closeEntry()
-zos.close()
+ zos.close()
}
// Helper methods
def checkPropertyExists(String propertyName) {
-if (!project.hasProperty(propertyName)) {
- throw new GradleException("This project requires a property \"" + propertyName + "\"! Please add it your \"gradle.properties\". You can find all properties and their description here: https://github.com/GTNewHorizons/ExampleMod1.7.10/blob/main/gradle.properties")
-}
+ if (!project.hasProperty(propertyName)) {
+ throw new GradleException("This project requires a property \"" + propertyName + "\"! Please add it your \"gradle.properties\". You can find all properties and their description here: https://github.com/GTNewHorizons/ExampleMod1.7.10/blob/main/gradle.properties")
+ }
}
def getFile(String relativePath) {
-return new File(projectDir, relativePath)
+ return new File(projectDir, relativePath)
}
diff --git a/dependencies.gradle b/dependencies.gradle
index 77f994b5c0..ad722e5fab 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -21,10 +21,15 @@ dependencies {
{
transitive = false
}
+ compileOnly("com.github.GTNewHorizons:NewHorizonsCoreMod:1.9.52:dev")
+ {
+ transitive = false
+ }
runtime("com.github.GTNewHorizons:Baubles:1.0.1.14:dev")
runtime("curse.maven:cofh-core-69162:2388751")
// For testing
+ //runtime("com.github.GTNewHorizons:NewHorizonsCoreMod:1.9.52:dev")
//runtime("com.github.GTNewHorizons:OpenBlocks:1.6.9-GTNH:dev")
//runtime("com.github.GTNewHorizons:bartworks:0.5.67:dev")
//runtime("com.github.GTNewHorizons:CraftTweaker:3.2.9:dev")
diff --git a/settings.gradle b/settings.gradle
index 97d8f71c52..93c852a12c 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -5,6 +5,6 @@ plugins {
apply plugin: 'com.diffplug.blowdryerSetup'
blowdryerSetup {
- github('GTNewHorizons/ExampleMod1.7.10', 'tag', '0.1.4')
+ github('GTNewHorizons/ExampleMod1.7.10', 'tag', '0.1.5')
//devLocal '.' // Use this when testing config updates locally
}
diff --git a/src/main/java/kubatech/CommonProxy.java b/src/main/java/kubatech/CommonProxy.java
index 5f1ec40cad..db752f9fa0 100644
--- a/src/main/java/kubatech/CommonProxy.java
+++ b/src/main/java/kubatech/CommonProxy.java
@@ -24,6 +24,7 @@ import cpw.mods.fml.common.event.*;
import kubatech.commands.CommandConfig;
import kubatech.commands.CommandHandler;
import kubatech.commands.CommandHelp;
+import kubatech.config.Config;
import kubatech.loaders.RecipeLoader;
public class CommonProxy {
diff --git a/src/main/java/kubatech/api/ConstructableItemStack.java b/src/main/java/kubatech/api/ConstructableItemStack.java
new file mode 100644
index 0000000000..668d21d803
--- /dev/null
+++ b/src/main/java/kubatech/api/ConstructableItemStack.java
@@ -0,0 +1,97 @@
+package kubatech.api;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import java.nio.charset.StandardCharsets;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.CompressedStreamTools;
+import net.minecraft.nbt.NBTSizeTracker;
+import net.minecraft.nbt.NBTTagCompound;
+
+public class ConstructableItemStack {
+ public final GameRegistry.UniqueIdentifier itemIdentifier;
+ public final int meta;
+ public final int size;
+ public final NBTTagCompound tagCompound;
+
+ private ConstructableItemStack(
+ GameRegistry.UniqueIdentifier itemIdentifier, int meta, int size, NBTTagCompound tagCompound) {
+ this.itemIdentifier = itemIdentifier;
+ this.meta = meta;
+ this.size = size;
+ this.tagCompound = tagCompound;
+ }
+
+ public ConstructableItemStack(ItemStack stack) {
+ itemIdentifier = GameRegistry.findUniqueIdentifierFor(stack.getItem());
+ meta = stack.getItemDamage();
+ size = stack.stackSize;
+ tagCompound = stack.stackTagCompound;
+ }
+
+ public ItemStack construct() {
+ if (itemIdentifier == null) return null;
+ Item it = GameRegistry.findItem(itemIdentifier.modId, itemIdentifier.name);
+ if (it == null) return null;
+ ItemStack stack = new ItemStack(it, size, meta);
+ stack.stackTagCompound = tagCompound;
+ return stack;
+ }
+
+ public boolean isSame(ConstructableItemStack stack, boolean ignoreSize) {
+ if (!stack.itemIdentifier.modId.equals(itemIdentifier.modId)) return false;
+ if (!stack.itemIdentifier.name.equals(itemIdentifier.name)) return false;
+ return ignoreSize || stack.size == size;
+ }
+
+ private static final ByteBuf BufHelper = Unpooled.buffer();
+
+ public void writeToByteBuf(ByteBuf byteBuf) {
+ BufHelper.clear();
+ byte[] bytes = itemIdentifier.modId.getBytes(StandardCharsets.UTF_8);
+ BufHelper.writeInt(bytes.length);
+ BufHelper.writeBytes(bytes);
+ bytes = itemIdentifier.name.getBytes(StandardCharsets.UTF_8);
+ BufHelper.writeInt(bytes.length);
+ BufHelper.writeBytes(bytes);
+ BufHelper.writeInt(meta);
+ BufHelper.writeInt(size);
+ BufHelper.writeBoolean(tagCompound != null);
+ if (tagCompound != null) {
+ try {
+ bytes = CompressedStreamTools.compress(tagCompound);
+ } catch (Exception ignored) {
+ bytes = new byte[0];
+ }
+ BufHelper.writeInt(bytes.length);
+ BufHelper.writeBytes(bytes);
+ }
+ byteBuf.writeInt(BufHelper.readableBytes());
+ byteBuf.writeBytes(BufHelper);
+ }
+
+ public static ConstructableItemStack readFromByteBuf(ByteBuf byteBuf) {
+ int size = byteBuf.readInt();
+ byte[] bytes = new byte[byteBuf.readInt()];
+ byteBuf.readBytes(bytes);
+ String modid = new String(bytes, StandardCharsets.UTF_8);
+ bytes = new byte[byteBuf.readInt()];
+ byteBuf.readBytes(bytes);
+ String name = new String(bytes, StandardCharsets.UTF_8);
+ int meta = byteBuf.readInt();
+ int stacksize = byteBuf.readInt();
+ NBTTagCompound nbtTagCompound = null;
+ if (byteBuf.readBoolean()) {
+ bytes = new byte[byteBuf.readInt()];
+ byteBuf.readBytes(bytes);
+ try {
+ nbtTagCompound = CompressedStreamTools.func_152457_a(bytes, new NBTSizeTracker(2097152L));
+ } catch (Exception ignored) {
+ }
+ }
+ return new ConstructableItemStack(
+ new GameRegistry.UniqueIdentifier(modid + ":" + name), meta, stacksize, nbtTagCompound);
+ }
+}
diff --git a/src/main/java/kubatech/api/LoaderReference.java b/src/main/java/kubatech/api/LoaderReference.java
index 418fe4a7ab..b41db59904 100644
--- a/src/main/java/kubatech/api/LoaderReference.java
+++ b/src/main/java/kubatech/api/LoaderReference.java
@@ -10,4 +10,5 @@ public class LoaderReference {
public static final boolean Thaumcraft = Loader.isModLoaded("Thaumcraft");
public static final boolean MineTweaker = Loader.isModLoaded("MineTweaker3");
public static final boolean Bartworks = Loader.isModLoaded("bartworks");
+ public static final boolean GTNHCoreMod = Loader.isModLoaded("dreamcraft");
}
diff --git a/src/main/java/kubatech/api/mobhandler/MobDrop.java b/src/main/java/kubatech/api/mobhandler/MobDrop.java
new file mode 100644
index 0000000000..76942b3148
--- /dev/null
+++ b/src/main/java/kubatech/api/mobhandler/MobDrop.java
@@ -0,0 +1,99 @@
+package kubatech.api.mobhandler;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import java.util.HashMap;
+import kubatech.api.ConstructableItemStack;
+import kubatech.api.utils.GSONUtils;
+import net.minecraft.item.ItemStack;
+
+public class MobDrop {
+ public enum DropType {
+ Normal,
+ Rare,
+ Additional,
+ Infernal;
+ private static final DropType[] values = values();
+
+ public static DropType get(int ordinal) {
+ return values[ordinal];
+ }
+ }
+
+ @GSONUtils.SkipGSON
+ public ItemStack stack;
+
+ public ConstructableItemStack reconstructableStack;
+ public DropType type;
+ public int chance;
+ public Integer enchantable;
+ public HashMap<Integer, Integer> damages;
+ public boolean lootable = false;
+ public boolean playerOnly = false;
+
+ private MobDrop() {}
+
+ public MobDrop(
+ ItemStack stack,
+ DropType type,
+ int chance,
+ Integer enchantable,
+ HashMap<Integer, Integer> damages,
+ boolean lootable,
+ boolean playerOnly) {
+ this.stack = stack;
+ this.reconstructableStack = new ConstructableItemStack(stack);
+ this.type = type;
+ this.chance = chance;
+ this.enchantable = enchantable;
+ this.damages = damages;
+ this.lootable = lootable;
+ this.playerOnly = playerOnly;
+ }
+
+ public void reconstructStack() {
+ this.stack = reconstructableStack.construct();
+ }
+
+ private static final ByteBuf BufHelper = Unpooled.buffer();
+
+ public void writeToByteBuf(ByteBuf byteBuf) {
+ BufHelper.clear();
+ reconstructableStack.writeToByteBuf(BufHelper);
+ BufHelper.writeInt(type.ordinal());
+ BufHelper.writeInt(chance);
+ BufHelper.writeBoolean(enchantable != null);
+ if (enchantable != null) BufHelper.writeInt(enchantable);
+ BufHelper.writeBoolean(damages != null);
+ if (damages != null) {
+ BufHelper.writeInt(damages.size());
+ damages.forEach((k, v) -> {
+ BufHelper.writeInt(k);
+ BufHelper.writeInt(v);
+ });
+ }
+ BufHelper.writeBoolean(lootable);
+ BufHelper.writeBoolean(playerOnly);
+ byteBuf.writeInt(BufHelper.readableBytes());
+ byteBuf.writeBytes(BufHelper);
+ }
+
+ public static MobDrop readFromByteBuf(ByteBuf byteBuf) {
+ MobDrop mobDrop = new MobDrop();
+ int size = byteBuf.readInt();
+ mobDrop.reconstructableStack = ConstructableItemStack.readFromByteBuf(byteBuf);
+ mobDrop.type = DropType.get(byteBuf.readInt());
+ mobDrop.chance = byteBuf.readInt();
+ if (byteBuf.readBoolean()) mobDrop.enchantable = byteBuf.readInt();
+ else mobDrop.enchantable = null;
+ if (byteBuf.readBoolean()) {
+ mobDrop.damages = new HashMap<>();
+ int damagessize = byteBuf.readInt();
+ for (int i = 0; i < damagessize; i++) mobDrop.damages.put(byteBuf.readInt(), byteBuf.readInt());
+ } else mobDrop.damages = null;
+ mobDrop.lootable = byteBuf.readBoolean();
+ mobDrop.playerOnly = byteBuf.readBoolean();
+ mobDrop.reconstructStack();
+ return mobDrop;
+ }
+}
diff --git a/src/main/java/kubatech/api/network/LoadConfigPacket.java b/src/main/java/kubatech/api/network/LoadConfigPacket.java
index f38293642e..2199eb2db9 100644
--- a/src/main/java/kubatech/api/network/LoadConfigPacket.java
+++ b/src/main/java/kubatech/api/network/LoadConfigPacket.java
@@ -24,8 +24,10 @@ import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import io.netty.buffer.ByteBuf;
import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
import java.util.HashSet;
-import kubatech.Config;
+import kubatech.config.Config;
+import kubatech.config.OverridesConfig;
import kubatech.kubatech;
import kubatech.loaders.MobRecipeLoader;
@@ -34,6 +36,7 @@ public class LoadConfigPacket implements IMessage {
public static final LoadConfigPacket instance = new LoadConfigPacket();
public final HashSet<String> mobsToLoad = new HashSet<>();
+ public final HashMap<String, OverridesConfig.MobOverride> mobsOverrides = new HashMap<>();
@Override
public void fromBytes(ByteBuf buf) {
@@ -46,6 +49,13 @@ public class LoadConfigPacket implements IMessage {
buf.readBytes(sbytes);
mobsToLoad.add(new String(sbytes, StandardCharsets.UTF_8));
}
+ int overridessize = buf.readInt();
+ for (int i = 0; i < overridessize; i++) {
+ byte[] sbytes = new byte[buf.readInt()];
+ buf.readBytes(sbytes);
+ mobsOverrides.put(
+ new String(sbytes, StandardCharsets.UTF_8), OverridesConfig.MobOverride.readFromByteBuf(buf));
+ }
}
}
@@ -60,6 +70,13 @@ public class LoadConfigPacket implements IMessage {
buf.writeInt(sbytes.length);
buf.writeBytes(sbytes);
});
+ buf.writeInt(mobsOverrides.size());
+ mobsOverrides.forEach((k, v) -> {
+ byte[] sbytes = k.getBytes(StandardCharsets.UTF_8);
+ buf.writeInt(sbytes.length);
+ buf.writeBytes(sbytes);
+ v.writeToByteBuf(buf);
+ });
}
}
@@ -67,7 +84,7 @@ public class LoadConfigPacket implements IMessage {
@Override
public IMessage onMessage(LoadConfigPacket message, MessageContext ctx) {
kubatech.info("Received Mob Handler config, parsing");
- MobRecipeLoader.processMobRecipeMap(message.mobsToLoad);
+ MobRecipeLoader.processMobRecipeMap(message.mobsToLoad, message.mobsOverrides);
return null;
}
}
diff --git a/src/main/java/kubatech/api/utils/GSONUtils.java b/src/main/java/kubatech/api/utils/GSONUtils.java
index 1c0e7ec3f4..90f777000c 100644
--- a/src/main/java/kubatech/api/utils/GSONUtils.java
+++ b/src/main/java/kubatech/api/utils/GSONUtils.java
@@ -1,12 +1,16 @@
package kubatech.api.utils;
import com.google.gson.*;
+import java.io.File;
import java.io.IOException;
+import java.io.Reader;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Type;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTSizeTracker;
import net.minecraft.nbt.NBTTagCompound;
@@ -66,5 +70,32 @@ public class GSONUtils {
.addSerializationExclusionStrategy(GSONStrategy)
.addDeserializationExclusionStrategy(GSONStrategy)
.registerTypeAdapter(NBTTagCompound.class, NBTTagCompoundDeserializer)
- .registerTypeAdapter(NBTTagCompound.class, NBTTagCompoundSerializer);
+ .registerTypeAdapter(NBTTagCompound.class, NBTTagCompoundSerializer)
+ .serializeNulls();
+ public static final GsonBuilder GSON_BUILDER_PRETTY = new GsonBuilder()
+ .addSerializationExclusionStrategy(GSONStrategy)
+ .addDeserializationExclusionStrategy(GSONStrategy)
+ .registerTypeAdapter(NBTTagCompound.class, NBTTagCompoundDeserializer)
+ .registerTypeAdapter(NBTTagCompound.class, NBTTagCompoundSerializer)
+ .serializeNulls()
+ .setPrettyPrinting();
+
+ public static <T> T readFile(Gson gson, File file, Class<T> tClass) {
+ if (!file.exists()) return null;
+ if (!file.isFile()) return null;
+ T t = null;
+ Reader reader = null;
+ try {
+ reader = Files.newBufferedReader(file.toPath(), StandardCharsets.UTF_8);
+ t = gson.fromJson(reader, tClass);
+ } catch (Exception ignored) {
+ } finally {
+ if (reader != null)
+ try {
+ reader.close();
+ } catch (Exception ignored) {
+ }
+ }
+ return t;
+ }
}
diff --git a/src/main/java/kubatech/commands/CommandConfig.java b/src/main/java/kubatech/commands/CommandConfig.java
index a1c3659165..0c33c3dedf 100644
--- a/src/main/java/kubatech/commands/CommandConfig.java
+++ b/src/main/java/kubatech/commands/CommandConfig.java
@@ -21,8 +21,8 @@ package kubatech.commands;
import static kubatech.commands.CommandConfig.Translations.*;
-import kubatech.Config;
import kubatech.api.network.LoadConfigPacket;
+import kubatech.config.Config;
import kubatech.kubatech;
import kubatech.loaders.MobRecipeLoader;
import net.minecraft.command.CommandBase;
diff --git a/src/main/java/kubatech/Config.java b/src/main/java/kubatech/config/Config.java
index feb8f96dae..72044ae899 100644
--- a/src/main/java/kubatech/Config.java
+++ b/src/main/java/kubatech/config/Config.java
@@ -17,9 +17,10 @@
*
*/
-package kubatech;
+package kubatech.config;
import java.io.File;
+import kubatech.Tags;
import net.minecraftforge.common.config.Configuration;
public class Config {
diff --git a/src/main/java/kubatech/config/OverridesConfig.java b/src/main/java/kubatech/config/OverridesConfig.java
new file mode 100644
index 0000000000..9c1ca6170c
--- /dev/null
+++ b/src/main/java/kubatech/config/OverridesConfig.java
@@ -0,0 +1,212 @@
+package kubatech.config;
+
+import com.dreammaster.main.MainRegistry;
+import com.dreammaster.modcustomdrops.CustomDrops;
+import com.google.common.io.Files;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import cpw.mods.fml.common.registry.GameRegistry;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import java.io.File;
+import java.io.Reader;
+import java.io.Writer;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import kubatech.Tags;
+import kubatech.api.ConstructableItemStack;
+import kubatech.api.LoaderReference;
+import kubatech.api.mobhandler.MobDrop;
+import kubatech.api.utils.GSONUtils;
+import kubatech.api.utils.ReflectionHelper;
+import net.minecraft.entity.EntityList;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.JsonToNBT;
+import net.minecraft.nbt.NBTTagCompound;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class OverridesConfig {
+
+ private static final Logger LOG = LogManager.getLogger(Tags.MODID + "[Config-Overrides]");
+
+ public static class MobDropSimplified {
+ @GSONUtils.SkipGSON
+ ItemStack stack;
+
+ ConstructableItemStack reconstructableStack;
+ MobDrop.DropType type;
+
+ private MobDropSimplified() {}
+
+ public MobDropSimplified(ItemStack stack, MobDrop.DropType type) {
+ reconstructableStack = new ConstructableItemStack(stack);
+ this.type = type;
+ }
+
+ public void reconstructStack() {
+ stack = reconstructableStack.construct();
+ }
+
+ public boolean isMatching(MobDrop drop) {
+ return reconstructableStack.isSame(drop.reconstructableStack, true);
+ }
+
+ private static final ByteBuf BufHelper = Unpooled.buffer();
+
+ public void writeToByteBuf(ByteBuf byteBuf) {
+ BufHelper.clear();
+ reconstructableStack.writeToByteBuf(BufHelper);
+ BufHelper.writeInt(type.ordinal());
+ byteBuf.writeInt(BufHelper.readableBytes());
+ byteBuf.writeBytes(BufHelper);
+ }
+
+ public static MobDropSimplified readFromByteBuf(ByteBuf byteBuf) {
+ MobDropSimplified mobDropSimplified = new MobDropSimplified();
+ int size = byteBuf.readInt();
+ mobDropSimplified.reconstructableStack = ConstructableItemStack.readFromByteBuf(byteBuf);
+ mobDropSimplified.type = MobDrop.DropType.get(byteBuf.readInt());
+ mobDropSimplified.reconstructStack();
+ return mobDropSimplified;
+ }
+ }
+
+ public static class MobOverride {
+ public boolean removeAll = false;
+ public List<MobDrop> additions = new ArrayList<>();
+ public List<MobDropSimplified> removals = new ArrayList<>();
+
+ private static final ByteBuf BufHelper = Unpooled.buffer();
+
+ public void writeToByteBuf(ByteBuf byteBuf) {
+ BufHelper.clear();
+ BufHelper.writeBoolean(removeAll);
+ BufHelper.writeInt(additions.size());
+ additions.forEach(drop -> drop.writeToByteBuf(BufHelper));
+ BufHelper.writeInt(removals.size());
+ removals.forEach(drop -> drop.writeToByteBuf(BufHelper));
+ byteBuf.writeInt(BufHelper.readableBytes());
+ byteBuf.writeBytes(BufHelper);
+ }
+
+ public static MobOverride readFromByteBuf(ByteBuf byteBuf) {
+ int size = byteBuf.readInt();
+ MobOverride mobOverride = new MobOverride();
+ mobOverride.removeAll = byteBuf.readBoolean();
+ int additionssize = byteBuf.readInt();
+ for (int i = 0; i < additionssize; i++) mobOverride.additions.add(MobDrop.readFromByteBuf(byteBuf));
+ int removalssize = byteBuf.readInt();
+ for (int i = 0; i < removalssize; i++) mobOverride.removals.add(MobDropSimplified.readFromByteBuf(byteBuf));
+ return mobOverride;
+ }
+ }
+
+ public static Map<String, MobOverride> overrides = new HashMap<>();
+ private static File overrideFile = null;
+
+ private static final Gson gson = GSONUtils.GSON_BUILDER_PRETTY.create();
+
+ @SuppressWarnings("UnstableApiUsage")
+ public static void LoadConfig() {
+ LOG.info("Loading Config");
+ if (overrideFile == null) overrideFile = Config.getConfigFile("MobOverrides.cfg");
+ if (!overrideFile.exists()) writeExampleFile();
+ Reader reader = null;
+ try {
+ reader = Files.newReader(overrideFile, StandardCharsets.UTF_8);
+ overrides = gson.fromJson(reader, new TypeToken<Map<String, MobOverride>>() {}.getType());
+ overrides.remove("ExampleMob");
+ if (LoaderReference.GTNHCoreMod) {
+ LOG.info("Detected GTNH Core Mod, parsing custom drops from there.");
+ CustomDrops coredrops =
+ ReflectionHelper.getField(MainRegistry.Module_CustomDrops, "_mCustomDrops", null);
+ if (coredrops != null) {
+ @SuppressWarnings("unchecked")
+ ArrayList<CustomDrops.CustomDrop> customdrops = (ArrayList<CustomDrops.CustomDrop>)
+ ((ArrayList<CustomDrops.CustomDrop>) coredrops.getCustomDrops()).clone();
+ for (CustomDrops.CustomDrop customdrop : customdrops) {
+ try {
+ Class<?> eclass = Class.forName(customdrop.getEntityName());
+ if (!EntityLiving.class.isAssignableFrom(eclass)) continue;
+ String ename = (String) EntityList.classToStringMapping.get(eclass);
+ if (ename == null) continue;
+ MobOverride override = overrides.computeIfAbsent(ename, k -> new MobOverride());
+ for (CustomDrops.CustomDrop.Drop drop : customdrop.getDrops()) {
+ String[] parts = drop.getItemName().split(":");
+ ItemStack stack = GameRegistry.findItemStack(parts[0], parts[1], 1);
+ if (stack == null) continue;
+ if (parts.length > 2) stack.setItemDamage(Integer.parseInt(parts[2]));
+ String pNBT = ReflectionHelper.getField(drop, "mTag", null);
+ if (pNBT != null && !pNBT.isEmpty()) {
+ try {
+ stack.stackTagCompound = (NBTTagCompound) JsonToNBT.func_150315_a(pNBT);
+ } catch (Exception ignored) {
+ }
+ }
+ int chance = drop.getChance() * 100;
+ int amount = drop.getAmount();
+ if (drop.getIsRandomAmount()) {
+ // average chance formula
+ // chance *= ((((amount * (amount + 1d)) / 2d)) + 1d) / (amount + 1d);
+ chance *= (2d + (amount * amount) + amount) / (2d * (amount + 1d));
+ amount = 1;
+ if (chance > 10000) {
+ int div = (int) Math.ceil(chance / 10000d);
+ amount *= div;
+ chance /= div;
+ }
+ }
+ stack.stackSize = amount;
+ // Drops from coremod are player only
+ override.additions.add(
+ new MobDrop(stack, MobDrop.DropType.Normal, chance, null, null, false, true));
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ } finally {
+ if (reader != null)
+ try {
+ reader.close();
+ } catch (Exception ignored) {
+ }
+ }
+ }
+
+ @SuppressWarnings("UnstableApiUsage")
+ private static void writeExampleFile() {
+ LOG.info("No config has been detected, writing an example one");
+ Writer writer = null;
+ try {
+ writer = Files.newWriter(overrideFile, StandardCharsets.UTF_8);
+ Map<String, MobOverride> example = new HashMap<>(1);
+ MobOverride ex1 = new MobOverride();
+ ex1.removals.add(new MobDropSimplified(new ItemStack(Items.rotten_flesh, 1), MobDrop.DropType.Normal));
+ HashMap<Integer, Integer> exdamages = new HashMap<>(3);
+ exdamages.put(1, 1);
+ exdamages.put(2, 5);
+ exdamages.put(3, 10);
+ ex1.additions.add(new MobDrop(
+ new ItemStack(Items.diamond_sword), MobDrop.DropType.Rare, 500, 20, exdamages, true, false));
+ example.put("ExampleMob", ex1);
+ gson.toJson(example, writer);
+ writer.flush();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ } finally {
+ if (writer != null)
+ try {
+ writer.close();
+ } catch (Exception ignored) {
+ }
+ }
+ }
+}
diff --git a/src/main/java/kubatech/loaders/MobRecipeLoader.java b/src/main/java/kubatech/loaders/MobRecipeLoader.java
index eb4d571819..1374c94d75 100644
--- a/src/main/java/kubatech/loaders/MobRecipeLoader.java
+++ b/src/main/java/kubatech/loaders/MobRecipeLoader.java
@@ -42,13 +42,15 @@ import java.lang.reflect.Modifier;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
-import kubatech.Config;
import kubatech.Tags;
import kubatech.api.LoaderReference;
+import kubatech.api.mobhandler.MobDrop;
import kubatech.api.network.LoadConfigPacket;
import kubatech.api.utils.GSONUtils;
import kubatech.api.utils.InfernalHelper;
import kubatech.api.utils.ModUtils;
+import kubatech.config.Config;
+import kubatech.config.OverridesConfig;
import kubatech.nei.Mob_Handler;
import kubatech.tileentity.gregtech.multiblock.GT_MetaTileEntity_ExtremeExterminationChamber;
import minetweaker.MineTweakerAPI;
@@ -189,9 +191,14 @@ public class MobRecipeLoader {
alwaysinfernal = InfernalHelper.checkEntityClassForced(e);
isPeacefulAllowed = !(e instanceof IMob);
- mOutputs = outputs;
+ mOutputs = (ArrayList<MobDrop>) outputs.clone();
int maxdamagechance = 0;
- for (MobDrop o : mOutputs) {
+ for (Iterator<MobDrop> iterator = mOutputs.iterator(); iterator.hasNext(); ) {
+ MobDrop o = iterator.next();
+ if (o.playerOnly) {
+ iterator.remove();
+ continue;
+ }
if (o.damages != null) for (int v : o.damages.values()) maxdamagechance += v;
}
mMaxDamageChance = maxdamagechance;
@@ -264,38 +271,6 @@ public class MobRecipeLoader {
}
}
- public static class MobDrop {
- public enum DropType {
- Normal,
- Rare,
- Additional,
- Infernal
- }
-
- @GSONUtils.SkipGSON
- public ItemStack stack;
-
- public NBTTagCompound reconstructableStack;
- public DropType type;
- public int chance;
- public Integer enchantable;
- public HashMap<Integer, Integer> damages;
-
- public MobDrop(
- ItemStack stack, DropType type, int chance, Integer enchantable, HashMap<Integer, Integer> damages) {
- this.stack = stack;
- this.reconstructableStack = stack.writeToNBT(new NBTTagCompound());
- this.type = type;
- this.chance = chance;
- this.enchantable = enchantable;
- this.damages = damages;
- }
-
- public void reconstructStack() {
- this.stack = ItemStack.loadItemStackFromNBT(this.reconstructableStack);
- }
- }
-
public static class fakeRand extends Random {
private static class nexter {
private final int type;
@@ -495,6 +470,7 @@ public class MobRecipeLoader {
if (randomchomenchantdetected) {
randomenchantmentlevel = ostack.stackTagCompound.getInteger(randomEnchantmentDetectedString);
ostack.stackTagCompound.removeTag("ench");
+ ostack.stackTagCompound.setInteger(randomEnchantmentDetectedString, 0);
}
if ((booksAlwaysRandomlyEnchanted || randomchomenchantdetected)
&& Items.enchanted_book == ostack.getItem()) {
@@ -722,7 +698,9 @@ public class MobRecipeLoader {
droplist drops = new droplist();
droplist raredrops = new droplist();
+ droplist superraredrops = new droplist();
droplist additionaldrops = new droplist();
+ droplist dropslooting = new droplist();
LOG.info("Generating normal drops");
@@ -753,6 +731,7 @@ public class MobRecipeLoader {
e.capturedDrops.clear();
}
+ boolean second = false;
do {
try {
dropFewItems.invoke(e, true, 0);
@@ -762,10 +741,58 @@ public class MobRecipeLoader {
}
collector.addDrop(drops, e.capturedDrops, frand.chance);
- if (frand.chance < 0.0000001d) {
+ if (second && frand.chance < 0.0000001d) {
+ LOG.info("Skipping " + k + " normal dropmap because it's too randomized");
+ break;
+ }
+ second = true;
+
+ } while (frand.nextRound());
+
+ LOG.info("Generating normal drops with looting");
+
+ frand.newRound();
+ collector.newRound();
+
+ if (v.getName().startsWith("com.emoniph.witchery")) {
+ try {
+ dropFewItems.invoke(e, true, 0);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ return;
+ }
+ frand.newRound();
+ frand.exceptionOnEnchantTry = true;
+ boolean enchantmentDetected = false;
+ try {
+ dropFewItems.invoke(e, true, 0);
+ } catch (Exception ex) {
+ enchantmentDetected = true;
+ }
+ int w = frand.walkCounter;
+ frand.newRound();
+ if (enchantmentDetected) {
+ frand.maxWalkCount = w;
+ collector.booksAlwaysRandomlyEnchanted = true;
+ }
+ e.capturedDrops.clear();
+ }
+
+ second = false;
+ do {
+ try {
+ dropFewItems.invoke(e, true, 1);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ return;
+ }
+ collector.addDrop(dropslooting, e.capturedDrops, frand.chance);
+
+ if (second && frand.chance < 0.0000001d) {
LOG.info("Skipping " + k + " normal dropmap because it's too randomized");
break;
}
+ second = true;
} while (frand.nextRound());
@@ -774,6 +801,7 @@ public class MobRecipeLoader {
frand.newRound();
collector.newRound();
+ second = false;
do {
try {
dropRareDrop.invoke(e, 0);
@@ -783,10 +811,35 @@ public class MobRecipeLoader {
}
collector.addDrop(raredrops, e.capturedDrops, frand.chance);
- if (frand.chance < 0.0000001d) {
+ if (second && frand.chance < 0.0000001d) {
LOG.info("Skipping " + k + " rare dropmap because it's too randomized");
break;
}
+ second = true;
+
+ } while (frand.nextRound());
+
+ LOG.info("Generating super rare drops");
+
+ frand.newRound();
+ collector.newRound();
+
+ second = false;
+ do {
+ try {
+ dropRareDrop.invoke(e, 1);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ return;
+ }
+ collector.addDrop(superraredrops, e.capturedDrops, frand.chance);
+
+ if (second && frand.chance < 0.0000001d) {
+ LOG.info("Skipping " + k + " rare dropmap because it's too randomized");
+ break;
+ }
+ second = true;
+
} while (frand.nextRound());
LOG.info("Generating additional drops");
@@ -823,6 +876,7 @@ public class MobRecipeLoader {
frand.forceFloatValue = 0f;
chanceModifierLocal = 0.25f;
}
+ second = false;
do {
addRandomArmor.invoke(e);
if (!usingVanillaEnchantingMethod) enchantEquipment.invoke(e);
@@ -870,10 +924,11 @@ public class MobRecipeLoader {
}
Arrays.fill(e.getLastActiveItems(), null);
- if (frand.chance < 0.0000001d) {
+ if (second && frand.chance < 0.0000001d) {
LOG.info("Skipping " + k + " additional dropmap because it's too randomized");
break;
}
+ second = true;
} while (frand.nextRound());
} catch (Exception ignored) {
@@ -894,46 +949,91 @@ public class MobRecipeLoader {
ItemStack stack = drop.stack;
if (stack.hasTagCompound()) stack.stackTagCompound.removeTag(randomEnchantmentDetectedString);
int chance = drop.getchance(10000);
- while (chance > 10000) {
- stack.stackSize *= 2;
- chance /= 2;
+ if (chance > 10000) {
+ int div = (int) Math.ceil(chance / 10000d);
+ stack.stackSize *= div;
+ chance /= div;
+ }
+ if (chance == 0) {
+ LOG.warn("Detected 0% loot, setting to 0.01%");
+ chance = 1;
}
+ dropinstance dlooting = dropslooting.get(drop);
moboutputs.add(new MobDrop(
stack,
MobDrop.DropType.Normal,
chance,
drop.isEnchatmentRandomized ? drop.enchantmentLevel : null,
- drop.isDamageRandomized ? drop.damagesPossible : null));
+ drop.isDamageRandomized ? drop.damagesPossible : null,
+ dlooting != null && dlooting.dropcount > drop.dropcount,
+ false));
}
for (dropinstance drop : raredrops.drops) {
ItemStack stack = drop.stack;
if (stack.hasTagCompound()) stack.stackTagCompound.removeTag(randomEnchantmentDetectedString);
int chance = drop.getchance(250);
- while (chance > 10000) {
- stack.stackSize *= 2;
- chance /= 2;
+ if (chance > 10000) {
+ int div = (int) Math.ceil(chance / 10000d);
+ stack.stackSize *= div;
+ chance /= div;
+ }
+ if (chance == 0) {
+ LOG.warn("Detected 0% loot, setting to 0.01%");
+ chance = 1;
+ }
+ moboutputs.add(new MobDrop(
+ stack,
+ MobDrop.DropType.Rare,
+ chance,
+ drop.isEnchatmentRandomized ? drop.enchantmentLevel : null,
+ drop.isDamageRandomized ? drop.damagesPossible : null,
+ false,
+ false));
+ }
+ for (dropinstance drop : superraredrops.drops) {
+ if (raredrops.contains(drop)) continue;
+ ItemStack stack = drop.stack;
+ if (stack.hasTagCompound()) stack.stackTagCompound.removeTag(randomEnchantmentDetectedString);
+ int chance = drop.getchance(50);
+ if (chance > 10000) {
+ int div = (int) Math.ceil(chance / 10000d);
+ stack.stackSize *= div;
+ chance /= div;
+ }
+ if (chance == 0) {
+ LOG.warn("Detected 0% loot, setting to 0.01%");
+ chance = 1;
}
moboutputs.add(new MobDrop(
stack,
MobDrop.DropType.Rare,
chance,
drop.isEnchatmentRandomized ? drop.enchantmentLevel : null,
- drop.isDamageRandomized ? drop.damagesPossible : null));
+ drop.isDamageRandomized ? drop.damagesPossible : null,
+ false,
+ false));
}
for (dropinstance drop : additionaldrops.drops) {
ItemStack stack = drop.stack;
if (stack.hasTagCompound()) stack.stackTagCompound.removeTag(randomEnchantmentDetectedString);
int chance = drop.getchance(850);
- while (chance > 10000) {
- stack.stackSize *= 2;
- chance /= 2;
+ if (chance > 10000) {
+ int div = (int) Math.ceil(chance / 10000d);
+ stack.stackSize *= div;
+ chance /= div;
+ }
+ if (chance == 0) {
+ LOG.warn("Detected 0% loot, setting to 0.01%");
+ chance = 1;
}
moboutputs.add(new MobDrop(
stack,
MobDrop.DropType.Additional,
chance,
drop.isEnchatmentRandomized ? drop.enchantmentLevel : null,
- drop.isDamageRandomized ? drop.damagesPossible : null));
+ drop.isDamageRandomized ? drop.damagesPossible : null,
+ false,
+ false));
}
GeneralMobList.put(k, new GeneralMappedMob(e, new MobRecipe(e, moboutputs), moboutputs));
@@ -973,13 +1073,18 @@ public class MobRecipeLoader {
public static void processMobRecipeMap() {
LOG.info("Loading config");
+ OverridesConfig.LoadConfig();
+
if (isClientSided) Mob_Handler.clearRecipes();
MobNameToRecipeMap.clear();
LoadConfigPacket.instance.mobsToLoad.clear();
- GeneralMobList.forEach((k, v) -> {
+ LoadConfigPacket.instance.mobsOverrides.clear();
+ for (Map.Entry<String, GeneralMappedMob> entry : GeneralMobList.entrySet()) {
+ String k = entry.getKey();
+ GeneralMappedMob v = entry.getValue();
if (Arrays.asList(Config.mobBlacklist).contains(k)) {
LOG.info("Entity " + k + " is blacklisted, skipping");
- return;
+ continue;
}
MobRecipe recipe = v.recipe;
@@ -992,21 +1097,38 @@ public class MobRecipeLoader {
Optionals.parseMTAdditions(k, drops, recipe);
}
+ OverridesConfig.MobOverride override = null;
+ if ((override = OverridesConfig.overrides.get(k)) != null) {
+ if (override.removeAll) drops.clear();
+ else
+ for (OverridesConfig.MobDropSimplified removal : override.removals) {
+ drops.removeIf(removal::isMatching);
+ if (recipe != null) recipe.mOutputs.removeIf(removal::isMatching);
+ }
+ drops.addAll(override.additions);
+ if (recipe != null)
+ recipe.mOutputs.addAll(override.additions.stream()
+ .filter(d -> !d.playerOnly)
+ .collect(Collectors.toList()));
+ LoadConfigPacket.instance.mobsOverrides.put(k, override);
+ }
+
if (drops.isEmpty()) {
LOG.info("Entity " + k + " doesn't drop any items, skipping EEC map");
- if (!Config.includeEmptyMobs) return;
+ if (!Config.includeEmptyMobs) continue;
LoadConfigPacket.instance.mobsToLoad.add(k);
LOG.info("Registered " + k);
- return;
+ continue;
}
if (v.recipe != null) MobNameToRecipeMap.put(k, recipe);
LoadConfigPacket.instance.mobsToLoad.add(k);
LOG.info("Registered " + k);
- });
+ }
}
@SideOnly(Side.CLIENT)
- public static void processMobRecipeMap(HashSet<String> mobs) {
+ public static void processMobRecipeMap(
+ HashSet<String> mobs, HashMap<String, OverridesConfig.MobOverride> overrides) {
if (isClientSided) Mob_Handler.clearRecipes();
MobNameToRecipeMap.clear();
mobs.forEach(k -> {
@@ -1021,6 +1143,22 @@ public class MobRecipeLoader {
Optionals.parseMTAdditions(k, drops, recipe);
}
+ OverridesConfig.MobOverride override = null;
+ if ((override = overrides.get(k)) != null) {
+ if (override.removeAll) drops.clear();
+ else
+ for (OverridesConfig.MobDropSimplified removal : override.removals) {
+ drops.removeIf(removal::isMatching);
+ if (recipe != null) recipe.mOutputs.removeIf(removal::isMatching);
+ }
+ drops.addAll(override.additions);
+ if (recipe != null)
+ recipe.mOutputs.addAll(override.additions.stream()
+ .filter(d -> !d.playerOnly)
+ .collect(Collectors.toList()));
+ drops.sort(Comparator.comparing(d -> d.type)); // Fix gui
+ }
+
Mob_Handler.addRecipe(v.mob, drops);
if (recipe != null) MobNameToRecipeMap.put(k, recipe);
LOG.info("Registered " + k);
@@ -1040,9 +1178,9 @@ public class MobRecipeLoader {
if (r.getFrom() == 0 && r.getTo() == 0) chance = 1d;
else chance = (((double) r.getTo() - (double) r.getFrom()) / 2d) + (double) r.getFrom();
ItemStack stack = ((ItemStack) entry.getKey().getInternal()).copy();
- MobDrop drop = new MobDrop(stack, MobDrop.DropType.Normal, (int) (chance * 10000), null, null);
+ MobDrop drop = new MobDrop(
+ stack, MobDrop.DropType.Normal, (int) (chance * 10000), null, null, false, true);
drops.add(drop);
- if (recipe != null) recipe.mOutputs.add(drop);
}
for (Map.Entry<IItemStack, IntRange> entry :
ie.getDropsToAddPlayerOnly().entrySet()) {
@@ -1052,9 +1190,9 @@ public class MobRecipeLoader {
if (r.getFrom() == 0 && r.getTo() == 0) chance = 1d;
else chance = (((double) r.getTo() - (double) r.getFrom()) / 2d) + (double) r.getFrom();
ItemStack stack = ((ItemStack) entry.getKey().getInternal()).copy();
- MobDrop drop = new MobDrop(stack, MobDrop.DropType.Normal, (int) (chance * 10000), null, null);
+ MobDrop drop = new MobDrop(
+ stack, MobDrop.DropType.Normal, (int) (chance * 10000), null, null, false, true);
drops.add(drop);
- if (recipe != null) recipe.mOutputs.add(drop);
}
for (IItemStack istack : ie.getDropsToRemove()) {
List<MobDrop> toRemove = drops.stream()
diff --git a/src/main/java/kubatech/nei/Mob_Handler.java b/src/main/java/kubatech/nei/Mob_Handler.java
index 5418aa1488..36fbb97231 100644
--- a/src/main/java/kubatech/nei/Mob_Handler.java
+++ b/src/main/java/kubatech/nei/Mob_Handler.java
@@ -36,6 +36,7 @@ import java.nio.FloatBuffer;
import java.util.*;
import java.util.List;
import kubatech.api.LoaderReference;
+import kubatech.api.mobhandler.MobDrop;
import kubatech.api.utils.FastRandom;
import kubatech.api.utils.InfernalHelper;
import kubatech.api.utils.MobUtils;
@@ -78,6 +79,8 @@ public class Mob_Handler extends TemplateRecipeHandler {
AVERAGE_REMINDER,
MOD,
MAX_HEALTH,
+ LOOTABLE,
+ PLAYER_ONLY,
;
final String key;
@@ -108,7 +111,7 @@ public class Mob_Handler extends TemplateRecipeHandler {
public static int cycleTicksStatic = Math.abs((int) System.currentTimeMillis());
private static final int itemsPerRow = 8, itemXShift = 18, itemYShift = 18, nextRowYShift = 35;
- public static void addRecipe(EntityLiving e, List<MobRecipeLoader.MobDrop> drop) {
+ public static void addRecipe(EntityLiving e, List<MobDrop> drop) {
List<MobPositionedStack> positionedStacks = new ArrayList<>();
int xorigin = 7,
xoffset = xorigin,
@@ -117,8 +120,8 @@ public class Mob_Handler extends TemplateRecipeHandler {
raredrops = 0,
additionaldrops = 0,
infernaldrops = 0;
- MobRecipeLoader.MobDrop.DropType i = null;
- for (MobRecipeLoader.MobDrop d : drop) {
+ MobDrop.DropType i = null;
+ for (MobDrop d : drop) {
if (i == d.type) {
xoffset += itemXShift;
if (xoffset >= xorigin + (itemXShift * itemsPerRow)) {
@@ -131,10 +134,10 @@ public class Mob_Handler extends TemplateRecipeHandler {
yoffset += nextRowYShift;
}
i = d.type;
- if (d.type == MobRecipeLoader.MobDrop.DropType.Normal) normaldrops++;
- else if (d.type == MobRecipeLoader.MobDrop.DropType.Rare) raredrops++;
- else if (d.type == MobRecipeLoader.MobDrop.DropType.Additional) additionaldrops++;
- else if (d.type == MobRecipeLoader.MobDrop.DropType.Infernal) break; // dont render infernal drops
+ if (d.type == MobDrop.DropType.Normal) normaldrops++;
+ else if (d.type == MobDrop.DropType.Rare) raredrops++;
+ else if (d.type == MobDrop.DropType.Additional) additionaldrops++;
+ else if (d.type == MobDrop.DropType.Infernal) break; // dont render infernal drops
positionedStacks.add(new MobPositionedStack(
d.stack.copy(),
xoffset,
@@ -142,7 +145,9 @@ public class Mob_Handler extends TemplateRecipeHandler {
d.type,
d.chance,
d.enchantable,
- d.damages != null ? new ArrayList<>(d.damages.keySet()) : null));
+ d.damages != null ? new ArrayList<>(d.damages.keySet()) : null,
+ d.lootable,
+ d.playerOnly));
}
instance.addRecipeInt(e, positionedStacks, normaldrops, raredrops, additionaldrops, infernaldrops);
}
@@ -424,7 +429,7 @@ public class Mob_Handler extends TemplateRecipeHandler {
public static class MobPositionedStack extends PositionedStack {
- public final MobRecipeLoader.MobDrop.DropType type;
+ public final MobDrop.DropType type;
public final int chance;
public final boolean enchantable;
public final boolean randomdamage;
@@ -436,10 +441,12 @@ public class Mob_Handler extends TemplateRecipeHandler {
Object object,
int x,
int y,
- MobRecipeLoader.MobDrop.DropType type,
+ MobDrop.DropType type,
int chance,
Integer enchantable,
- List<Integer> damages) {
+ List<Integer> damages,
+ boolean lootable,
+ boolean isPlayerOnly) {
super(object, x, y, false);
rand = new FastRandom();
this.type = type;
@@ -455,6 +462,8 @@ public class Mob_Handler extends TemplateRecipeHandler {
if (chance != 10000)
extratooltip.appendTag(new NBTTagString(
EnumChatFormatting.RESET + CHANCE.get() + (chance / 100) + "." + (chance % 100) + "%"));
+ if (lootable) extratooltip.appendTag(new NBTTagString(EnumChatFormatting.RESET + LOOTABLE.get()));
+ if (isPlayerOnly) extratooltip.appendTag(new NBTTagString(EnumChatFormatting.RESET + PLAYER_ONLY.get()));
extratooltip.appendTag(new NBTTagString(EnumChatFormatting.RESET + AVERAGE_REMINDER.get()));
NBTTagCompound itemtag = this.items[0].getTagCompound();
diff --git a/src/main/resources/assets/kubatech/lang/en_US.lang b/src/main/resources/assets/kubatech/lang/en_US.lang
index be22ffc8a2..c5a1658798 100644
--- a/src/main/resources/assets/kubatech/lang/en_US.lang
+++ b/src/main/resources/assets/kubatech/lang/en_US.lang
@@ -12,6 +12,8 @@ mobhandler.mod=Mod:
mobhandler.max_health=Max health:
mobhandler.chance=Chance:
mobhandler.average_reminder=§7§oPlease remember that these are average drops.
+mobhandler.lootable=Looting is applied
+mobhandler.player_only=§7Does not drop in EEC
#Commands
commandhandler.invalid=§cInvalid use ! The proper use of this command is /%s