Compare commits

..
25 Commits
Author SHA1 Message Date
slprime fb9d517f78 Added keyboard shortcuts to NEI And More... (#271)
* Added keyboard shortcuts to NEI

* OptionButton: Add Tooltip to long prefix

* fix formatting

* Tooltip shown when shift is held
2022-08-19 14:03:42 +02:00
miozune 529f4374d6 Add catalysts for large boiler fuel (#270) 2022-08-10 01:43:05 +02:00
miozune 0bf369a996 Purge OpV (#269) 2022-08-03 11:32:22 +07:00
Jason Mitchell 1897dba35a [ci skip] Migrate github actions to GTNH-Actions-Workflows 2022-07-16 10:50:05 -07:00
YannickMG 5bbf275980 Focus the previous recipe if it's still visible when loading usage re… (#263)
* Focus the previous recipe if it's still visible when loading usage recipes.

* Reduced code duplication by extracting getRecipeHandlers

* Moved RecipeHandlerQuery to its own package-private file

* Refactored RecipeHandlerQuery methods

* Saving the current recipe when left clicking a machine's "Recipes" button

* Restored prevScreen so we can restore it with overlay

* Genericized GuiRecipe so that currentHandlers is no longer hidden in subclasses

* Cleaned up overlay handling

* Fixed trivial IDE warnings & bad JavaDoc on files I touched
2022-06-29 20:18:48 +02:00
Raven Szewczyk f7a900e910 Update buildscript & apply automatic formatting rules 2022-06-27 10:23:18 -07:00
slprime a7683b885d Add another bookmark view mode (#261)
* add another bookmark view mode

* enum BookmarkViewMode
2022-06-23 00:03:29 +02:00
glowredman fe4566901a Update handlers and catalysts (#259)
New:
- Ex Astris
- Ex Compressum
- RFTools
- Steves Carts
- Thaumcraft NEI Plugin
- TC NEI Additions
- Bibliocraft
- ComputerCraft

Updated:
- Thermal Expansion
- Project Red
2022-06-08 16:12:47 +02:00
embeddedt de2b2ece69 Fix minor memory leaks (#258)
* Fix memory leak caused by mob spawner items

* Use a weak hash map instead of manually clearing the map

* Clear manager reference to prevent holding a WorldClient reference through the GUI

* Revert "Use a weak hash map instead of manually clearing the map"

This reverts commit 91bb997250.
2022-06-06 17:05:02 +02:00
Kiwiand[Kiwi233] d20a80a77c Update zh_CN.lang (#257)
* Update zh_CN.lang

* Update zh_CN.lang

* Update zh_CN.lang

* Update zh_CN.lang

* Update zh_CN.lang

* Update zh_CN.lang

Co-authored-by: [Kiwi233] <[[email protected]]>
2022-06-04 22:57:15 +02:00
Jerome226 6cced8dea0 Added compat for TFC+, IE and other mods 2022-05-31 21:16:48 -07:00
miozune 68b9453328 Add config to ignore overlap with potion effect HUD (#255) 2022-05-31 16:38:14 +02:00
embeddedt ae21012ea2 Use a proper key implementation for the search cache (#254)
* Use a proper key implementation for the search cache
* Synchronize itemSearchNames accesses to prevent CMEs
* Use a ConcurrentHashMap instead of synchronizing
  This allows multiple threads to read at the same time, which is the more common scenario.
2022-05-29 12:25:39 -07:00
miozune 2b31129ef9 Use OverlayIdentifier for GT4 2022-05-29 11:32:49 -07:00
Raven Szewczyk ba77a63545 Make sure to use utf-8 for bookmark reading as well as writing (#253) 2022-05-27 19:38:54 +02:00
embeddedt 8f7d698e7d Add option to cache item grid rendering (#250)
* Add option to cache item grid rendering

* Fix highlighting for bookmarks

* Tweak GL state slightly

* Fix focus box being in the wrong place

* Fix flickering for one frame when searching

* Prevent potion effects from rendering over NEI slots

Fixes #231

* Invalidate the buffer if `invalidSlotMap` changes

* Clean up imports

* Delay blitting until after the buffer is refreshed

but still avoid waiting for the next frame

* Refactor slot focus logic to handle highlighting multiple slots

* Refresh grid when sorting bookmarks

* Minor code cleanup, fix some more hovering issues

* Remove `slotNeedsOutline`, it is now redundant

* Remove focus parameter from drawItem
2022-05-27 13:42:41 +02:00
glowredman 72d44fd711 Fix AppleCore's reflection
AppleCore accesses `getStackMouseOver` via reflection but it has been moved to the `PanelWidget` class -> the reflection fails
2022-05-16 10:40:12 -07:00
MuXiu1997 d735cc2a38 Use shortcut key to trigger overlay recipe (#248)
* Use shortcut key to trigger overlay recipe

* Add a way to remove overlay renderer

* Change of implementation

* Fix crash
2022-05-16 17:57:00 +02:00
slprimeandSerghei Borovetchi 91e9b2a5ae Panel settings (#240)
* panel settings

* Highlight hidden items; mark item with recipe

* open gui usage with recipeId

* small  changes

* restore gl after draw item

Co-authored-by: Serghei Borovetchi <[email protected]>
2022-05-06 21:41:45 +02:00
miozune 96e4fe55e8 Send chat to player when recipe loading was errored (#241) 2022-05-03 20:42:09 +02:00
miozune 8717df0cbb Fix scrolling recipes when hovering over ingredients changes stack size (#237) 2022-04-28 15:46:01 +02:00
miozune d6a6551561 Allow GuiRecipe to back to general GuiScreen (#236) 2022-04-25 15:31:50 +02:00
Jason Mitchell 995ed24056 Fix catalysts for gt6 2022-04-20 08:19:47 -07:00
Kiwiand[Kiwi233] 2917f2a4c9 Update zh_CN.lang (#235)
* Update zh_CN.lang

* Update zh_CN.lang

* Update zh_CN.lang

* Update zh_CN.lang

* Update zh_CN.lang

Co-authored-by: [Kiwi233] <[[email protected]]>
2022-04-14 20:04:31 +02:00
NoXъ 5b2ff42d4f typo correction, russification (#234) 2022-04-09 18:11:15 +02:00
182 changed files with 7545 additions and 6414 deletions

No files matched your search

-9
View File
@@ -1,9 +0,0 @@
directory="run/crash-reports"
if [ -d $directory ]; then
echo "Crash reports detected:"
cat $directory/*
exit 1
else
echo "No crash reports detected"
exit 0
fi
+2 -34
View File
@@ -1,5 +1,3 @@
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Build and test
@@ -11,35 +9,5 @@ on:
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Set up JDK 8
uses: actions/setup-java@v2
with:
java-version: '8'
distribution: 'adopt'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Setup the workspace
run: ./gradlew setupCIWorkspace
- name: Build the mod
run: ./gradlew build
- name: Run server for 1 minute
run: |
mkdir run
echo "eula=true" > run/eula.txt
timeout 10 ./gradlew runServer || true
- name: Test no crashes happend
run: |
chmod +x .github/scripts/test-no-crash-reports.sh
.github/scripts/test-no-crash-reports.sh
uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/build-and-test.yml@master
secrets: inherit
+7 -44
View File
@@ -1,51 +1,14 @@
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Release tagged build
on:
push:
tags:
- '*'
tags: [ '*' ]
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Set release version
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: Set up JDK 8
uses: actions/setup-java@v2
with:
java-version: '8'
distribution: 'adopt'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Setup the workspace
run: ./gradlew setupCIWorkspace
- name: Build the mod
run: ./gradlew build
- name: Release under current tag
uses: "marvinpinto/action-automatic-releases@latest"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: "${{ env.RELEASE_VERSION }}"
prerelease: false
title: "${{ env.RELEASE_VERSION }}"
files: build/libs/*.jar
- name: Publish to Maven
run: ./gradlew publish
env:
MAVEN_USER: ${{ secrets.MAVEN_USER }}
MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}
release-tags:
uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/release-tags.yml@master
secrets: inherit
+4 -4
View File
@@ -8,18 +8,18 @@ If you have issues with NEI outside of the GTNH modpack you may report them in t
## New Features:
* Speed
* Speed
- Uses a parallel stream to search the item list over multiple cores, resulting in 2-6x faster searches on average
- Loads the recipe handlers in parallel
- Loads the recipe handlers in parallel
* A textbox for search with most of the features you'd expect - moving forward, backwards, selection, etc
* Bookmarks! What are you in the process of crafting? Bookmark it using either 'A' or configure your own key.
* Toggle bookmark pane. Default shortcut key `B`. Item Subsets menu is only available if bookmarks are not visible.
* Utility/Cheat buttons line up and wrap based on GUI size
* ItemList is no longer regenerated from the ItemRegistry on every inventory load
* JEI (Or Creative) Style tabs [Optional] Note: Requires explicit support to be added for an ItemStack to render, otherwise falls back to the first two letters of the handler name.
* JEI (Or Creative) Style tabs [Optional] Note: Requires explicit support to be added for an ItemStack to render, otherwise falls back to the first two letters of the handler name.
* Tabs/Handlers are loaded from a CSV config in the JAR (or optionally from the config folder). NBT IMCEvents `registerHandlerInfo` and `removeHandlerInfo` are available for mod authors to add handler information, using the same fields as the CSV file
* `@[Mod]->[item]` searching. ex: `@Mod.gregtech->iron ingot`
* Cycle between Recipe, Utility, and Cheat mode by ctrl clicking on the Wrench Icon
* Cycle between Recipe, Utility, and Cheat mode by ctrl clicking on the Wrench Icon
* GT5u Tools/Items and GT6 tools should now properly work with the Overlay Recipe Transfer
## Other items of note:
+1 -1
View File
@@ -1,3 +1,3 @@
compileJava {
options.encoding = "UTF-8"
options.encoding = "UTF-8"
}
+265 -62
View File
@@ -1,4 +1,4 @@
//version: 1644510936
//version: 1656003794
/*
DO NOT CHANGE THIS FILE!
@@ -6,14 +6,18 @@ Also, you may replace this file at any time if there is an update available.
Please check https://github.com/GTNewHorizons/ExampleMod1.7.10/blob/main/build.gradle for updates.
*/
import org.gradle.internal.logging.text.StyledTextOutput
import org.gradle.internal.logging.text.StyledTextOutputFactory
import org.gradle.internal.logging.text.StyledTextOutput.Style
import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.gradle.internal.logging.text.StyledTextOutput.Style
import org.gradle.internal.logging.text.StyledTextOutputFactory
import java.nio.file.Files
import java.nio.file.Paths
import java.util.concurrent.TimeUnit
import java.util.zip.ZipEntry
import java.util.zip.ZipInputStream
import java.util.zip.ZipOutputStream
buildscript {
repositories {
@@ -45,18 +49,22 @@ plugins {
id 'eclipse'
id 'scala'
id 'maven-publish'
id('org.jetbrains.kotlin.jvm') version ('1.6.10') 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 '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"
}
if (project.file('.git/HEAD').isFile()) {
apply plugin: 'com.palantir.git-version'
}
def out = services.get(StyledTextOutputFactory).create("an-output")
def out = services.get(StyledTextOutputFactory).create('an-output')
apply plugin: 'forge'
@@ -76,6 +84,37 @@ idea {
}
}
// Spotless autoformatter
// See https://github.com/diffplug/spotless/tree/main/plugin-gradle
// Can be locally toggled via spotless:off/spotless:on comments
spotless {
encoding 'UTF-8'
format 'misc', {
target '*.md', '.gitignore'
trimTrailingWhitespace()
indentWithSpaces(4)
endWithNewline()
}
java {
toggleOffOn()
importOrder()
removeUnusedImports()
palantirJavaFormat('1.1.0') // last version supporting jvm 8
}
kotlin {
toggleOffOn()
ktfmt('0.39')
}
groovyGradle {
toggleOffOn()
importOrder()
target '*.gradle'
greclipse('4.19.0') // last version supporting jvm 8
}
}
if(JavaVersion.current() != JavaVersion.VERSION_1_8) {
throw new GradleException("This project requires Java 8, but it's running on " + JavaVersion.current())
}
@@ -102,6 +141,10 @@ checkPropertyExists("usesShadowedDependencies")
checkPropertyExists("developmentEnvironmentUserName")
boolean noPublishedSources = project.findProperty("noPublishedSources") ? project.noPublishedSources.toBoolean() : false
boolean usesMixinDebug = project.findProperty('usesMixinDebug') ?: project.usesMixins.toBoolean()
String channel = project.findProperty('channel') ? project.channel : 'stable'
String mappingsVersion = project.findProperty('mappingsVersion') ? project.mappingsVersion : '12'
String remoteMappings = project.findProperty('remoteMappings') ? project.remoteMappings : 'https://raw.githubusercontent.com/MinecraftForge/FML/1.7.10/conf/'
String javaSourceDir = "src/main/java/"
String scalaSourceDir = "src/main/scala/"
@@ -173,7 +216,7 @@ configurations.all {
try {
'git config core.fileMode false'.execute()
}
catch (Exception e) {
catch (Exception ignored) {
out.style(Style.Failure).println("git isn't installed at all")
}
@@ -183,19 +226,21 @@ String versionOverride = System.getenv("VERSION") ?: null
try {
identifiedVersion = versionOverride == null ? gitVersion() : versionOverride
}
catch (Exception e) {
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' +
'or the VERSION override must be set! ').style(Style.SuccessHeader).text('(Do NOT download from GitHub using the ZIP option, instead\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.)'
)
versionOverride = 'NO-GIT-TAG-SET'
identifiedVersion = versionOverride
}
version = minecraftVersion + '-' + identifiedVersion
String modVersion = identifiedVersion
ext {
modVersion = identifiedVersion
}
if( identifiedVersion.equals(versionOverride) ) {
if(identifiedVersion == versionOverride) {
out.style(Style.Failure).text('Override version to ').style(Style.Identifier).text(modVersion).style(Style.Failure).println('!\7')
}
@@ -207,22 +252,25 @@ else {
archivesBaseName = modId
}
def arguments = []
def jvmArguments = []
if(usesMixins.toBoolean()) {
if (usesMixins.toBoolean()) {
arguments += [
"--tweakClass org.spongepowered.asm.launch.MixinTweaker"
]
jvmArguments += [
"-Dmixin.debug.countInjections=true", "-Dmixin.debug.verbose=true", "-Dmixin.debug.export=true"
"--tweakClass org.spongepowered.asm.launch.MixinTweaker"
]
if (usesMixinDebug.toBoolean()) {
jvmArguments += [
"-Dmixin.debug.countInjections=true",
"-Dmixin.debug.verbose=true",
"-Dmixin.debug.export=true"
]
}
}
minecraft {
version = minecraftVersion + "-" + forgeVersion + "-" + minecraftVersion
runDir = "run"
version = minecraftVersion + '-' + forgeVersion + '-' + minecraftVersion
runDir = 'run'
if (replaceGradleTokenInFile) {
replaceIn replaceGradleTokenInFile
@@ -255,8 +303,8 @@ minecraft {
}
}
if(file("addon.gradle").exists()) {
apply from: "addon.gradle"
if(file('addon.gradle').exists()) {
apply from: 'addon.gradle'
}
apply from: 'repositories.gradle'
@@ -304,23 +352,28 @@ dependencies {
apply from: 'dependencies.gradle'
def mixingConfigRefMap = "mixins." + modId + ".refmap.json"
def mixingConfigRefMap = 'mixins.' + modId + '.refmap.json'
def refMap = "${tasks.compileJava.temporaryDir}" + File.separator + mixingConfigRefMap
def mixinSrg = "${tasks.reobf.temporaryDir}" + File.separator + "mixins.srg"
task generateAssets {
if(usesMixins.toBoolean()) {
getFile("/src/main/resources/mixins." + modId + ".json").text = """{
if (usesMixins.toBoolean()) {
def mixinConfigFile = getFile("/src/main/resources/mixins." + modId + ".json");
if (!mixinConfigFile.exists()) {
mixinConfigFile.text = """{
"required": true,
"minVersion": "0.7.11",
"package": "${modGroup}.${mixinsPackage}",
"plugin": "${modGroup}.${mixinPlugin}",
"refmap": "${mixingConfigRefMap}",
"target": "@env(DEFAULT)",
"compatibilityLevel": "JAVA_8"
"compatibilityLevel": "JAVA_8",
"mixins": [],
"client": [],
"server": []
}
"""
}
}
}
@@ -408,12 +461,11 @@ tasks.withType(JavaExec).configureEach {
)
}
processResources
{
processResources {
// this will ensure that this task is redone when the versions change.
inputs.property "version", project.version
inputs.property "mcversion", project.minecraft.version
// replace stuff in mcmod.info, nothing else
from(sourceSets.main.resources.srcDirs) {
include 'mcmod.info'
@@ -437,7 +489,7 @@ processResources
def getManifestAttributes() {
def manifestAttributes = [:]
if(containsMixinsAndOrCoreModOnly.toBoolean() == false && (usesMixins.toBoolean() || coreModClass)) {
if(!containsMixinsAndOrCoreModOnly.toBoolean() && (usesMixins.toBoolean() || coreModClass)) {
manifestAttributes += ["FMLCorePluginContainsFMLMod": true]
}
@@ -453,14 +505,14 @@ def getManifestAttributes() {
manifestAttributes += [
"TweakClass" : "org.spongepowered.asm.launch.MixinTweaker",
"MixinConfigs" : "mixins." + modId + ".json",
"ForceLoadAsMod" : containsMixinsAndOrCoreModOnly.toBoolean() == false
"ForceLoadAsMod" : !containsMixinsAndOrCoreModOnly.toBoolean()
]
}
return manifestAttributes
}
task sourcesJar(type: Jar) {
from (sourceSets.main.allJava)
from (sourceSets.main.allSource)
from (file("$projectDir/LICENSE"))
getArchiveClassifier().set('sources')
}
@@ -515,7 +567,7 @@ task devJar(type: Jar) {
}
task apiJar(type: Jar) {
from (sourceSets.main.allJava) {
from (sourceSets.main.allSource) {
include modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/") + '/**'
}
@@ -540,12 +592,15 @@ artifacts {
}
}
// The gradle metadata includes all of the additional deps that we disabled from POM generation (including forgeBin with no groupID),
// The gradle metadata includes all of the additional deps that we disabled from POM generation (including forgeBin with no groupID),
// and isn't strictly needed with the POM so just disable it.
tasks.withType(GenerateModuleMetadata) {
enabled = false
}
// workaround variable hiding in pom processing
def projectConfigs = project.configurations
publishing {
publications {
maven(MavenPublication) {
@@ -554,7 +609,7 @@ publishing {
artifact source: shadowJar, classifier: ""
}
if(!noPublishedSources) {
artifact source: sourcesJar, classifier: "src"
artifact source: sourcesJar, classifier: "sources"
}
artifact source: usesShadowedDependencies.toBoolean() ? shadowDevJar : devJar, classifier: "dev"
if (apiPackage) {
@@ -565,17 +620,21 @@ publishing {
artifactId = System.getenv("ARTIFACT_ID") ?: project.name
// Using the identified version, not project.version as it has the prepended 1.7.10
version = System.getenv("RELEASE_VERSION") ?: identifiedVersion
// remove extra garbage from who knows where
// remove extra garbage from minecraft and minecraftDeps configuration
pom.withXml {
def badPomGroup = ['net.minecraft', 'com.google.code.findbugs', 'org.ow2.asm', 'com.typesafe.akka', 'com.typesafe', 'org.scala-lang',
'org.scala-lang.plugins', 'net.sf.jopt-simple', 'lzma', 'com.mojang', 'org.apache.commons', 'org.apache.httpcomponents',
'commons-logging', 'java3d', 'net.sf.trove4j', 'com.ibm.icu', 'com.paulscode', 'io.netty', 'com.google.guava',
'commons-io', 'commons-codec', 'net.java.jinput', 'net.java.jutils', 'com.google.code.gson', 'org.apache.logging.log4j',
'org.lwjgl.lwjgl', 'tv.twitch', '']
def badArtifacts = [:].withDefault {[] as Set<String>}
for (configuration in [projectConfigs.minecraft, projectConfigs.minecraftDeps]) {
for (dependency in configuration.allDependencies) {
badArtifacts[dependency.group == null ? "" : dependency.group] += dependency.name
}
}
// example for specifying extra stuff to ignore
// badArtifacts["org.example.group"] += "artifactName"
Node pomNode = asNode()
pomNode.dependencies.'*'.findAll() {
badPomGroup.contains(it.groupId.text())
badArtifacts[it.groupId.text()].contains(it.artifactId.text())
}.each() {
it.parent().remove(it)
}
@@ -650,7 +709,103 @@ configure(updateBuildScript) {
description = 'Updates the build script to the latest version'
}
// Deobfuscation
// Parameter Deobfuscation
task deobfParams {
doLast {
String mcpDir = "$project.gradle.gradleUserHomeDir/caches/minecraft/de/oceanlabs/mcp/mcp_$channel/$mappingsVersion"
String mcpZIP = "$mcpDir/mcp_$channel-$mappingsVersion-${minecraftVersion}.zip"
String paramsCSV = "$mcpDir/params.csv"
download.run {
src "https://maven.minecraftforge.net/de/oceanlabs/mcp/mcp_$channel/$mappingsVersion-$minecraftVersion/mcp_$channel-$mappingsVersion-${minecraftVersion}.zip"
dest mcpZIP
overwrite false
}
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 ->
String[] cells = line.split(",")
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.")
}
}
static int replaceParams(File file, Map<String, String> params) {
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
}
} catch(Exception e) {
e.printStackTrace()
}
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)
}
fos.close()
}
zipEntry = zis.getNextEntry()
}
zis.closeEntry()
zis.close()
}
configure(deobfParams) {
group = 'forgegradle'
description = 'Rename all obfuscated parameter names inherited from Minecraft classes'
}
// Dependency Deobfuscation
def deobf(String sourceURL) {
try {
@@ -663,7 +818,7 @@ def deobf(String sourceURL) {
fileName = fileName.substring(lastSlash + 1)
}
//get rid of extension:
if(fileName.endsWith(".jar")) {
if(fileName.endsWith(".jar") || fileName.endsWith(".litemod")) {
fileName = fileName.substring(0, fileName.lastIndexOf("."))
}
@@ -675,26 +830,40 @@ def deobf(String sourceURL) {
Collections.reverse(parts)
hostName = String.join(".", parts)
return deobf(sourceURL, hostName + "/" + fileName)
return deobf(sourceURL, "$hostName/$fileName")
} catch(Exception e) {
return deobf(sourceURL, "deobf/" + String.valueOf(sourceURL.hashCode()))
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 fileName) {
String cacheDir = System.getProperty("user.home") + "/.gradle/caches/"
String bon2Dir = cacheDir + "forge_gradle/deobf"
String bon2File = bon2Dir + "/BON2-2.5.0.jar"
String obfFile = cacheDir + "modules-2/files-2.1/" + fileName + ".jar"
String deobfFile = cacheDir + "modules-2/files-2.1/" + fileName + "-deobf.jar"
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 mappingsVer
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"
zipMappings(mappingsZIP, remoteMappings, bon2Dir)
mappingsVer = "snapshot_$id"
} else {
mappingsVer = "${channel}_$mappingsVersion"
}
download.run {
src 'https://github.com/GTNewHorizons/BON2/releases/download/2.5.0/BON2-2.5.0.CUSTOM-all.jar'
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
@@ -708,18 +877,52 @@ def deobf(String sourceURL, String fileName) {
}
exec {
commandLine 'java', '-jar', bon2File, '--inputJar', obfFile, '--outputJar', deobfFile, '--mcVer', '1.7.10', '--mappingsVer', 'stable_12', '--notch'
commandLine 'java', '-jar', bon2File, '--inputJar', obfFile, '--outputJar', deobfFile, '--mcVer', minecraftVersion, '--mappingsVer', mappingsVer, '--notch'
workingDir bon2Dir
standardOutput = new ByteArrayOutputStream()
standardOutput = new FileOutputStream("${deobfFile}.log")
}
return files(deobfFile)
}
def zipMappings(String zipPath, String url, String bon2Dir) {
File zipFile = new File(zipPath)
if(zipFile.exists()) {
return
}
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
}
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("methods.csv"))
Files.copy(Paths.get(methodsCache), zos)
zos.closeEntry()
zos.close()
}
// Helper methods
def checkPropertyExists(String propertyName) {
if (project.hasProperty(propertyName) == false) {
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")
}
}
+3 -3
View File
@@ -1,7 +1,7 @@
// Add your dependencies here
dependencies {
compile('com.github.GTNewHorizons:CodeChickenLib:1.1.5.3:dev')
compile('com.github.GTNewHorizons:CodeChickenCore:1.1.3:dev')
shadowImplementation('org.apache.commons:commons-csv:1.8')
compile('com.github.GTNewHorizons:CodeChickenLib:1.1.5.3:dev')
compile('com.github.GTNewHorizons:CodeChickenCore:1.1.3:dev')
shadowImplementation('org.apache.commons:commons-csv:1.8')
}
+14 -14
View File
@@ -1,18 +1,18 @@
// Add any additional repositiroes for your dependencies here
repositories {
mavenCentral()
maven {
name 'GTNH Maven'
url 'http://jenkins.usrv.eu:8081/nexus/content/groups/public/'
}
maven {
url 'https://cursemaven.com'
content {
includeGroup 'curse.maven'
}
}
maven {
url 'https://jitpack.io'
}
mavenCentral()
maven {
name 'GTNH Maven'
url 'http://jenkins.usrv.eu:8081/nexus/content/groups/public/'
}
maven {
url 'https://cursemaven.com'
content {
includeGroup 'curse.maven'
}
}
maven {
url 'https://jitpack.io'
}
}
File diff suppressed because it is too large. Load diff
+10 -15
View File
@@ -1,11 +1,10 @@
package codechicken.nei;
import java.util.List;
import static codechicken.lib.gui.GuiDraw.getStringWidth;
public abstract class Button extends Widget
{
import java.util.List;
public abstract class Button extends Widget {
public Button(String s) {
label = s;
}
@@ -25,9 +24,7 @@ public abstract class Button extends Widget
@Override
public boolean handleClick(int mx, int my, int button) {
if (button == 1 || button == 0)
if (onButtonPress(button == 1))
NEIClientUtils.playClickSound();
if (button == 1 || button == 0) if (onButtonPress(button == 1)) NEIClientUtils.playClickSound();
return true;
}
@@ -39,23 +36,21 @@ public abstract class Button extends Widget
@Override
public List<String> handleTooltip(int mx, int my, List<String> tooltip) {
if (!contains(mx, my))
return tooltip;
if (!contains(mx, my)) return tooltip;
final String tip = getButtonTip();
if (tip != null)
tooltip.add(tip);
if (tip != null) tooltip.add(tip);
addTooltips(tooltip);
return tooltip;
}
public String getButtonTip() {
return null;
}
public void addTooltips(List<String> tooltip) {}
public void addTooltips(List<String> tooltip) {}
public String getRenderLabel() {
return label;
@@ -1,20 +1,20 @@
package codechicken.nei;
public abstract class ButtonCycled extends Button
{
public abstract class ButtonCycled extends Button {
public ButtonCycled() {}
public ButtonCycled(int num) {
icons = new Image[num];
init();
}
@Override
public Image getRenderIcon()
{
public Image getRenderIcon() {
return icons[index];
}
public void init() {}
public int index;
public Image[] icons;
}
@@ -7,7 +7,6 @@ import codechicken.nei.api.API;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.recipe.GuiRecipeTab;
import codechicken.nei.recipe.StackInfo;
import com.google.common.collect.Lists;
import cpw.mods.fml.client.CustomModLoadingErrorDisplayException;
import cpw.mods.fml.common.FMLCommonHandler;
@@ -15,6 +14,23 @@ import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import cpw.mods.fml.common.gameevent.TickEvent.Phase;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.gui.FontRenderer;
@@ -33,47 +49,26 @@ import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.apache.commons.io.IOUtils;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class ClientHandler
{
private static String[] defaultSerialHandlers = {
"WayofTime.alchemicalWizardry.client.nei.NEIAlchemyRecipeHandler"
};
public class ClientHandler {
private static String[] defaultSerialHandlers = {"WayofTime.alchemicalWizardry.client.nei.NEIAlchemyRecipeHandler"};
private static String[] defaultHeightHackHandlerRegex = {
"buildcraft.compat.nei.*",
"cofh.thermalexpansion.plugins.nei.handlers.*",
"crazypants.enderio.nei.*",
"forestry.factory.recipes.nei.*",
"ic2.neiIntegration.core.recipehandler.*",
"mariculture.plugins.nei.*",
"redgear.brewcraft.plugins.nei.*",
"tconstruct.plugins.nei.*",
"WayofTime.alchemicalWizardry.client.nei.*",
"buildcraft.compat.nei.*",
"cofh.thermalexpansion.plugins.nei.handlers.*",
"crazypants.enderio.nei.*",
"forestry.factory.recipes.nei.*",
"ic2.neiIntegration.core.recipehandler.*",
"mariculture.plugins.nei.*",
"redgear.brewcraft.plugins.nei.*",
"tconstruct.plugins.nei.*",
"WayofTime.alchemicalWizardry.client.nei.*",
};
private static String[] defaultHandlerOrdering = {
"# Each line in this file should either be a comment (starts with '#') or an ordering.",
"# Ordering lines are <handler ID>,<ordering number>.",
"# Handlers will be sorted in order of number ascending, so smaller numbers first.",
"# Any handlers that are missing from this file will be assigned to 0.",
"# Negative numbers are fine.",
"# If you delete this file, it will be regenerated with all registered handler IDs.",
"# Each line in this file should either be a comment (starts with '#') or an ordering.",
"# Ordering lines are <handler ID>,<ordering number>.",
"# Handlers will be sorted in order of number ascending, so smaller numbers first.",
"# Any handlers that are missing from this file will be assigned to 0.",
"# Negative numbers are fine.",
"# If you delete this file, it will be regenerated with all registered handler IDs.",
};
private static ClientHandler instance;
@@ -104,7 +99,8 @@ public class ClientHandler
if (world.isRemote) {
items = SMPmagneticItems;
} else {
items = world.getEntitiesWithinAABB(EntityItem.class, player.boundingBox.expand(distancexz, distancey, distancexz));
items = world.getEntitiesWithinAABB(
EntityItem.class, player.boundingBox.expand(distancexz, distancey, distancexz));
}
for (Iterator<EntityItem> iterator = items.iterator(); iterator.hasNext(); ) {
EntityItem item = iterator.next();
@@ -164,13 +160,15 @@ public class ClientHandler
ItemInfo.preInit();
StackInfo.loadGuidFilters();
}
public static void loadSerialHandlers() {
File file = NEIClientConfig.serialHandlersFile;
if(!file.exists()) {
try(FileWriter writer = new FileWriter(file)) {
if (!file.exists()) {
try (FileWriter writer = new FileWriter(file)) {
NEIClientConfig.logger.info("Creating default serial handlers list {}", file);
Collection<String> toSave = Loader.isModLoaded("dreamcraft") ? Collections.singletonList("") : Arrays.asList(defaultSerialHandlers);
Collection<String> toSave = Loader.isModLoaded("dreamcraft")
? Collections.singletonList("")
: Arrays.asList(defaultSerialHandlers);
IOUtils.writeLines(toSave, "\n", writer);
} catch (IOException e) {
NEIClientConfig.logger.error("Failed to save default serial handlers list to file {}", file, e);
@@ -198,10 +196,9 @@ public class ClientHandler
try (FileReader reader = new FileReader(file)) {
NEIClientConfig.logger.info("Loading height hack handlers from file {}", file);
NEIClientConfig.heightHackHandlerRegex =
IOUtils.readLines(reader).stream()
.map(Pattern::compile)
.collect(Collectors.toCollection(HashSet::new));
NEIClientConfig.heightHackHandlerRegex = IOUtils.readLines(reader).stream()
.map(Pattern::compile)
.collect(Collectors.toCollection(HashSet::new));
} catch (IOException e) {
NEIClientConfig.logger.error("Failed to load height hack handlers from file {}", file, e);
}
@@ -274,49 +271,44 @@ public class ClientHandler
@SubscribeEvent
public void tickEvent(TickEvent.ClientTickEvent event) {
if(event.phase == Phase.END)
return;
if (event.phase == Phase.END) return;
Minecraft mc = Minecraft.getMinecraft();
if(mc.theWorld != null) {
if (mc.theWorld != null) {
loadWorld(mc.theWorld, false);
if (!NEIClientConfig.isEnabled())
return;
if (!NEIClientConfig.isEnabled()) return;
KeyManager.tickKeyStates();
NEIController.updateUnlimitedItems(mc.thePlayer.inventory);
if (mc.currentScreen == null)
NEIController.processCreativeCycling(mc.thePlayer.inventory);
if (mc.currentScreen == null) NEIController.processCreativeCycling(mc.thePlayer.inventory);
updateMagnetMode(mc.theWorld, mc.thePlayer);
}
GuiScreen gui = mc.currentScreen;
if (gui != lastGui) {
if (gui instanceof GuiMainMenu)
lastworld = null;
else if (gui instanceof GuiSelectWorld)
NEIClientConfig.reloadSaves();
if (gui instanceof GuiMainMenu) lastworld = null;
else if (gui instanceof GuiSelectWorld) NEIClientConfig.reloadSaves();
else if (gui == null) {
/* prevent WorldClient reference being held in the Gui */
NEIController.manager = null;
}
}
lastGui = gui;
}
@SubscribeEvent
public void tickEvent(TickEvent.RenderTickEvent event) {
if(event.phase == Phase.END && NEIClientConfig.isEnabled())
HUDRenderer.renderOverlay();
if (event.phase == Phase.END && NEIClientConfig.isEnabled()) HUDRenderer.renderOverlay();
}
@SubscribeEvent
public void renderLastEvent(RenderWorldLastEvent event) {
if (NEIClientConfig.isEnabled())
WorldOverlayRenderer.render(event.partialTicks);
if (NEIClientConfig.isEnabled()) WorldOverlayRenderer.render(event.partialTicks);
}
public void loadWorld(World world, boolean fromServer) {
if (world != lastworld) {
SMPmagneticItems.clear();
@@ -326,8 +318,10 @@ public class ClientHandler
NEIClientConfig.setHasSMPCounterPart(false);
NEIClientConfig.setInternalEnabled(false);
if (!Minecraft.getMinecraft().isSingleplayer())//wait for server to initiate in singleplayer
NEIClientConfig.loadWorld("remote/" + ClientUtils.getServerIP().replace(':', '~'));
if (!Minecraft.getMinecraft().isSingleplayer()) // wait for server to initiate in singleplayer
NEIClientConfig.loadWorld("remote/" + ClientUtils.getServerIP().replace(':', '~'));
ItemMobSpawner.clearEntityReferences(world);
}
lastworld = world;
@@ -339,8 +333,7 @@ public class ClientHandler
}
public static RuntimeException throwCME(final String message) {
final GuiScreen errorGui = new GuiErrorScreen(null, null)
{
final GuiScreen errorGui = new GuiErrorScreen(null, null) {
@Override
public void handleMouseInput() {}
@@ -357,15 +350,19 @@ public class ClientHandler
};
@SuppressWarnings("serial")
CustomModLoadingErrorDisplayException e = new CustomModLoadingErrorDisplayException()
{
CustomModLoadingErrorDisplayException e = new CustomModLoadingErrorDisplayException() {
@Override
public void initGui(GuiErrorScreen errorScreen, FontRenderer fontRenderer) {
Minecraft.getMinecraft().displayGuiScreen(errorGui);
}
@Override
public void drawScreen(GuiErrorScreen errorScreen, FontRenderer fontRenderer, int mouseRelX, int mouseRelY, float tickTime) {}
public void drawScreen(
GuiErrorScreen errorScreen,
FontRenderer fontRenderer,
int mouseRelX,
int mouseRelY,
float tickTime) {}
};
throw e;
}
@@ -11,10 +11,8 @@ import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
public class ContainerCreativeInv extends Container
{
private class SlotArmor extends Slot
{
public class ContainerCreativeInv extends Container {
private class SlotArmor extends Slot {
final int armorType;
public SlotArmor(IInventory inv, int x, int y, int slot, int armor) {
@@ -39,15 +37,15 @@ public class ContainerCreativeInv extends Container
}
}
private class SlotBlockArmor extends SlotArmor
{
private class SlotBlockArmor extends SlotArmor {
public SlotBlockArmor(IInventory inv, int x, int y, int slot, int armor) {
super(inv, x, y, slot, armor);
}
@Override
public boolean isItemValid(ItemStack stack) {
return super.isItemValid(stack) || stack != null;// && Block.getBlockFromItem(stack.getItem()) != Blocks.air;
return super.isItemValid(stack)
|| stack != null; // && Block.getBlockFromItem(stack.getItem()) != Blocks.air;
}
}
@@ -64,12 +62,12 @@ public class ContainerCreativeInv extends Container
for (int col = 0; col < 9; ++col)
addSlotToContainer(new Slot(invPlayer, col + row * 9 + 9, 8 + col * 18, 118 + row * 18));
for (int col = 0; col < 9; ++col)
addSlotToContainer(new Slot(invPlayer, col, 8 + col * 18, 176));
for (int col = 0; col < 9; ++col) addSlotToContainer(new Slot(invPlayer, col, 8 + col * 18, 176));
addSlotToContainer(new SlotBlockArmor(invPlayer, invPlayer.getSizeInventory() - 1, -15, 23, 0));
for (int armorType = 1; armorType < 4; armorType++)
addSlotToContainer(new SlotArmor(invPlayer, invPlayer.getSizeInventory() - 1 - armorType, -15, 23 + armorType * 18, armorType));
addSlotToContainer(new SlotArmor(
invPlayer, invPlayer.getSizeInventory() - 1 - armorType, -15, 23 + armorType * 18, armorType));
}
@Override
@@ -91,16 +89,13 @@ public class ContainerCreativeInv extends Container
}
if (slotIndex < 54) {
if (!this.mergeItemStack(stack, 54, 90, true))
return null;
if (!this.mergeItemStack(stack, 54, 90, true)) return null;
} else if (!this.mergeItemStack(stack, 0, 54, false)) {
return null;
}
if (stack.stackSize == 0)
slot.putStack(null);
else
slot.onSlotChanged();
if (stack.stackSize == 0) slot.putStack(null);
else slot.onSlotChanged();
}
return transferredStack;
@@ -1,6 +1,7 @@
package codechicken.nei;
import codechicken.lib.render.CCRenderState;
import java.util.ArrayList;
import net.minecraft.client.gui.Gui;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.entity.player.EntityPlayer;
@@ -14,15 +15,11 @@ import net.minecraft.nbt.NBTTagList;
import net.minecraft.world.World;
import org.lwjgl.opengl.GL11;
import java.util.ArrayList;
/**
* This is crap code, don't ever do this.
*/
public class ContainerEnchantmentModifier extends ContainerEnchantment
{
public static class EnchantmentHash
{
public class ContainerEnchantmentModifier extends ContainerEnchantment {
public static class EnchantmentHash {
public EnchantmentHash(Enchantment e, int i, int l) {
enchantment = e;
state = i;
@@ -104,10 +101,13 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment
int barempty = height - getScrollBarHeight();
int sbary = rely + (int) (barempty * percentscrolled + 0.5);
if (button == 0 &&
getScrollBarHeight() < height && //the scroll bar can move (not full length)
mousex >= relx + cwidth && mousex < relx + cwidth + getScrollBarWidth() &&
mousey >= rely && mousey < rely + height)//in the scroll pane
if (button == 0
&& getScrollBarHeight() < height
&& // the scroll bar can move (not full length)
mousex >= relx + cwidth
&& mousex < relx + cwidth + getScrollBarWidth()
&& mousey >= rely
&& mousey < rely + height) // in the scroll pane
{
if (mousey < sbary) {
percentscrolled = (mousey - rely) / (float) barempty;
@@ -126,7 +126,7 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment
}
public void mouseUp(int mousex, int mousey, int button) {
if (scrollclicky >= 0 && button == 0)//we were scrolling and we released mouse
if (scrollclicky >= 0 && button == 0) // we were scrolling and we released mouse
{
scrollclicky = -1;
}
@@ -135,8 +135,7 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment
public boolean clickButton(int mousex, int mousey, int button) {
mousex -= parentscreen.guiLeft;
mousey -= parentscreen.guiTop;
if (mousex >= relx && mousex < relx + cwidth &&
mousey >= rely && mousey <= rely + height)//in the box
if (mousex >= relx && mousex < relx + cwidth && mousey >= rely && mousey <= rely + height) // in the box
{
int slot = getClickedSlot(mousey);
if (slot >= getNumSlots()) return false;
@@ -176,10 +175,8 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment
int ID = nbttaglist.getCompoundTagAt(i).getShort("id");
if (ID == e) {
nbttaglist.removeTag(i);
if (nbttaglist.tagCount() == 0)
stack.getTagCompound().removeTag("ench");
if (stack.getTagCompound().hasNoTags())
stack.setTagCompound(null);
if (nbttaglist.tagCount() == 0) stack.getTagCompound().removeTag("ench");
if (stack.getTagCompound().hasNoTags()) stack.setTagCompound(null);
return;
}
}
@@ -191,8 +188,7 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment
}
public void onCraftMatrixChanged(IInventory iinventory) {
if (parentscreen != null)
updateEnchantmentOptions(GuiEnchantmentModifier.validateEnchantments());
if (parentscreen != null) updateEnchantmentOptions(GuiEnchantmentModifier.validateEnchantments());
}
public void updateEnchantmentOptions(boolean validate) {
@@ -221,7 +217,8 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment
if (NEIServerUtils.stackHasEnchantment(toolstack, e.effectId)) {
state = 2;
level = NEIServerUtils.getEnchantmentLevel(toolstack, e.effectId);
} else if (NEIServerUtils.doesEnchantmentConflict(NEIServerUtils.getEnchantments(toolstack), e) && validate) {
} else if (NEIServerUtils.doesEnchantmentConflict(NEIServerUtils.getEnchantments(toolstack), e)
&& validate) {
state = 1;
}
slotEnchantment.add(new EnchantmentHash(e, state, level));
@@ -257,10 +254,18 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment
CCRenderState.changeTexture("textures/gui/container/enchanting_table.png");
GL11.glColor3f(1, 1, 1);
if (hasScrollBar()) {
gui.drawTexturedModalRect(relx, rely + slot * slotheight, 0, gui.ySize + slotheight * shade, cwidth - 30, slotheight);
gui.drawTexturedModalRect(relx + cwidth - 30, rely + slot * slotheight, cwidth - 23, gui.ySize + slotheight * shade, 30, slotheight);
gui.drawTexturedModalRect(
relx, rely + slot * slotheight, 0, gui.ySize + slotheight * shade, cwidth - 30, slotheight);
gui.drawTexturedModalRect(
relx + cwidth - 30,
rely + slot * slotheight,
cwidth - 23,
gui.ySize + slotheight * shade,
30,
slotheight);
} else {
gui.drawTexturedModalRect(relx, rely + slot * slotheight, 0, gui.ySize + slotheight * shade, cwidth + 7, slotheight);
gui.drawTexturedModalRect(
relx, rely + slot * slotheight, 0, gui.ySize + slotheight * shade, cwidth + 7, slotheight);
}
gui.getFontRenderer().drawString(text, relx + 4, rely + slot * slotheight + 5, textColourFromState(shade));
@@ -277,18 +282,36 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment
int sbary = rely + (int) ((height - getScrollBarHeight()) * percentscrolled + 0.5);
int sbarx = relx + cwidth;
Gui.drawRect(sbarx, rely, sbarx + getScrollBarWidth(), rely + height, 0xFF202020);//background
Gui.drawRect(sbarx, sbary, sbarx + getScrollBarWidth(), sbary + getScrollBarHeight(), 0xFF8B8B8B);//corners
Gui.drawRect(sbarx, sbary, sbarx + getScrollBarWidth() - 1, sbary + getScrollBarHeight() - 1, 0xFFF0F0F0);//topleft up
Gui.drawRect(sbarx + 1, sbary + 1, sbarx + getScrollBarWidth() - 1, sbary + getScrollBarHeight() - 1, 0xFF555555);//bottom right down
Gui.drawRect(sbarx + 1, sbary + 1, sbarx + getScrollBarWidth() - 2, sbary + getScrollBarHeight() - 2, 0xFFC6C6C6);//scrollbar
Gui.drawRect(sbarx, rely, sbarx + getScrollBarWidth(), rely + height, 0xFF202020); // background
Gui.drawRect(sbarx, sbary, sbarx + getScrollBarWidth(), sbary + getScrollBarHeight(), 0xFF8B8B8B); // corners
Gui.drawRect(
sbarx,
sbary,
sbarx + getScrollBarWidth() - 1,
sbary + getScrollBarHeight() - 1,
0xFFF0F0F0); // topleft up
Gui.drawRect(
sbarx + 1,
sbary + 1,
sbarx + getScrollBarWidth() - 1,
sbary + getScrollBarHeight() - 1,
0xFF555555); // bottom right down
Gui.drawRect(
sbarx + 1,
sbary + 1,
sbarx + getScrollBarWidth() - 2,
sbary + getScrollBarHeight() - 2,
0xFFC6C6C6); // scrollbar
}
private int textColourFromState(int shade) {
switch(shade) {
case 0: return 0x685e4a;
case 1: return 0x407f10;
default: return 0xffff80;
switch (shade) {
case 0:
return 0x685e4a;
case 1:
return 0x407f10;
default:
return 0xffff80;
}
}
@@ -16,10 +16,8 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.potion.PotionEffect;
public class ContainerPotionCreator extends ContainerExtended
{
public class SlotPotion extends Slot
{
public class ContainerPotionCreator extends ContainerExtended {
public class SlotPotion extends Slot {
public SlotPotion(IInventory inv, int slotIndex, int x, int y) {
super(inv, slotIndex, x, y);
}
@@ -34,16 +32,14 @@ public class ContainerPotionCreator extends ContainerExtended
super.onSlotChanged();
if (getHasStack()) {
ItemStack stack = getStack();
if (!stack.hasTagCompound())
stack.setTagCompound(new NBTTagCompound());
if (!stack.hasTagCompound()) stack.setTagCompound(new NBTTagCompound());
if (!stack.getTagCompound().hasKey("CustomPotionEffects"))
stack.getTagCompound().setTag("CustomPotionEffects", new NBTTagList());
}
}
}
public class SlotPotionStore extends SlotHandleClicks
{
public class SlotPotionStore extends SlotHandleClicks {
public SlotPotionStore(IInventory inv, int slotIndex, int x, int y) {
super(inv, slotIndex, x, y);
}
@@ -60,8 +56,7 @@ public class ContainerPotionCreator extends ContainerExtended
putStack(InventoryUtils.copyStack(held, 1));
player.inventory.setItemStack(null);
}
} else if (getHasStack())
player.inventory.setItemStack(getStack());
} else if (getHasStack()) player.inventory.setItemStack(getStack());
return null;
}
@@ -72,8 +67,7 @@ public class ContainerPotionCreator extends ContainerExtended
}
}
public static class InventoryPotionStore extends InventoryNBT
{
public static class InventoryPotionStore extends InventoryNBT {
public InventoryPotionStore() {
super(9, NEIClientConfig.global.nbt.getCompoundTag("potionStore"));
}
@@ -96,15 +90,13 @@ public class ContainerPotionCreator extends ContainerExtended
this.potionStoreInv = potionStoreInv;
addSlotToContainer(new SlotPotion(potionInv, 0, 25, 102));
for (int i = 0; i < 9; i++)
addSlotToContainer(new SlotPotionStore(potionStoreInv, i, 8 + i * 18, 14));
for (int i = 0; i < 9; i++) addSlotToContainer(new SlotPotionStore(potionStoreInv, i, 8 + i * 18, 14));
bindPlayerInventory(inventoryPlayer, 8, 125);
}
@Override
public boolean doMergeStackAreas(int slotIndex, ItemStack stack) {
if (slotIndex < 10)
return mergeItemStack(stack, 10, 46, true);
if (slotIndex < 10) return mergeItemStack(stack, 10, 46, true);
return mergeItemStack(stack, 0, 1, false);
}
@@ -117,30 +109,28 @@ public class ContainerPotionCreator extends ContainerExtended
public void onContainerClosed(EntityPlayer player) {
super.onContainerClosed(player);
if (!player.worldObj.isRemote)
InventoryUtils.dropOnClose(player, potionInv);
if (!player.worldObj.isRemote) InventoryUtils.dropOnClose(player, potionInv);
}
@SuppressWarnings("unchecked")
@Override
public void handleServerPacket(PacketCustom packet) {
ItemStack potion = potionInv.getStackInSlot(0);
if (potion == null)
return;
if (potion == null) return;
boolean add = packet.getType() == 3;
int effectID = packet.readUByte();
NBTTagList effects = potion.getTagCompound().getTagList("CustomPotionEffects", 10);
NBTTagList newEffects = new NBTTagList();
for(int i = 0; i < effects.tagCount(); i++) {
for (int i = 0; i < effects.tagCount(); i++) {
NBTTagCompound tag = effects.getCompoundTagAt(i);
PotionEffect e = PotionEffect.readCustomPotionEffectFromNBT(tag);
if(e.getPotionID() != effectID)
newEffects.appendTag(tag);
if (e.getPotionID() != effectID) newEffects.appendTag(tag);
}
if(add)
newEffects.appendTag(new PotionEffect(effectID, packet.readInt(), packet.readUByte()).writeCustomPotionEffectToNBT(new NBTTagCompound()));
if (add)
newEffects.appendTag(new PotionEffect(effectID, packet.readInt(), packet.readUByte())
.writeCustomPotionEffectToNBT(new NBTTagCompound()));
potion.getTagCompound().setTag("CustomPotionEffects", newEffects);
}
@@ -157,4 +147,4 @@ public class ContainerPotionCreator extends ContainerExtended
packet.writeByte(effectID);
packet.sendToServer();
}
}
}
@@ -3,33 +3,35 @@ package codechicken.nei;
import codechicken.nei.api.IHighlightHandler;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.guihook.GuiContainerManager;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.World;
import java.util.List;
public class DefaultHighlightHandler implements IHighlightHandler
{
public class DefaultHighlightHandler implements IHighlightHandler {
@Override
public List<String> handleTextData(ItemStack stack, World world, EntityPlayer player, MovingObjectPosition mop, List<String> currenttip, ItemInfo.Layout layout) {
public List<String> handleTextData(
ItemStack stack,
World world,
EntityPlayer player,
MovingObjectPosition mop,
List<String> currenttip,
ItemInfo.Layout layout) {
String name = null;
try {
String s = GuiContainerManager.itemDisplayNameShort(stack);
if (s != null && !s.endsWith("Unnamed"))
name = s;
if (s != null && !s.endsWith("Unnamed")) name = s;
if (name != null)
currenttip.add(name);
} catch (Exception ignored) {}
if (name != null) currenttip.add(name);
} catch (Exception ignored) {
}
if (name != null && stack.getItem() == Items.redstone) {
int md = world.getBlockMetadata(mop.blockX, mop.blockY, mop.blockZ);
String s = "" + md;
if (s.length() < 2)
s = " " + s;
if (s.length() < 2) s = " " + s;
currenttip.set(currenttip.size() - 1, name + " " + s);
}
@@ -6,15 +6,15 @@ import net.minecraft.item.ItemStack;
public class DoubleFilteredFilter implements ItemFilter {
private ItemFilter filter;
private ItemList.PatternItemFilter patternFilter;
public DoubleFilteredFilter(ItemFilter filter, String itemFilter) {
this.filter = filter;
this.filter = filter;
this.patternFilter = new ItemList.PatternItemFilter(SearchField.getPattern(itemFilter));
}
@Override
public boolean matches(ItemStack item) {
if(filter.matches(item)) {
if (filter.matches(item)) {
return patternFilter.matches(item);
}
return false;
@@ -5,8 +5,7 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
public class ExtendedCreativeInv implements IInventory
{
public class ExtendedCreativeInv implements IInventory {
final PlayerSave playerSave;
final Side side;
@@ -22,8 +21,7 @@ public class ExtendedCreativeInv implements IInventory
@Override
public ItemStack getStackInSlot(int slot) {
if (side.isClient())
return NEIClientConfig.creativeInv[slot];
if (side.isClient()) return NEIClientConfig.creativeInv[slot];
return playerSave.creativeInv[slot];
}
@@ -58,10 +56,8 @@ public class ExtendedCreativeInv implements IInventory
@Override
public void setInventorySlotContents(int slot, ItemStack stack) {
if (side.isClient())
NEIClientConfig.creativeInv[slot] = stack;
else
playerSave.creativeInv[slot] = stack;
if (side.isClient()) NEIClientConfig.creativeInv[slot] = stack;
else playerSave.creativeInv[slot] = stack;
markDirty();
}
@@ -78,8 +74,7 @@ public class ExtendedCreativeInv implements IInventory
@Override
public void markDirty() {
if (side.isServer())
playerSave.setCreativeDirty();
if (side.isServer()) playerSave.setCreativeDirty();
}
@Override
@@ -88,12 +83,10 @@ public class ExtendedCreativeInv implements IInventory
}
@Override
public void openInventory() {
}
public void openInventory() {}
@Override
public void closeInventory() {
}
public void closeInventory() {}
@Override
public boolean isItemValidForSlot(int slot, ItemStack stack) {
@@ -104,5 +97,4 @@ public class ExtendedCreativeInv implements IInventory
public boolean hasCustomInventoryName() {
return true;
}
}
@@ -1,27 +1,24 @@
package codechicken.nei;
import codechicken.nei.guihook.GuiContainerManager;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import static codechicken.nei.NEIServerUtils.areStacksIdentical;
import static codechicken.nei.NEIServerUtils.areStacksSameType;
import static codechicken.nei.NEIServerUtils.copyStack;
public class FastTransferManager
{
import codechicken.nei.guihook.GuiContainerManager;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
public class FastTransferManager {
/**
* Based on the general assumption that we want to fill top to bottom, left to right
*/
public static class SlotPositionComparator implements Comparator<Integer>
{
public static class SlotPositionComparator implements Comparator<Integer> {
final Container container;
public SlotPositionComparator(Container c) {
@@ -47,8 +44,7 @@ public class FastTransferManager
stack.stackSize = 1;
for (int slotNo = 0; slotNo < container.inventorySlots.size(); slotNo++) {
if (slotZoneMap.containsKey(slotNo) || !container.getSlot(slotNo).isItemValid(stack))
continue;
if (slotZoneMap.containsKey(slotNo) || !container.getSlot(slotNo).isItemValid(stack)) continue;
HashSet<Integer> connectedSlots = new HashSet<>();
findConnectedSlots(container, slotNo, connectedSlots);
@@ -69,11 +65,11 @@ public class FastTransferManager
final int threshold = 18;
for (int i = 0; i < container.inventorySlots.size(); i++) {
if (connectedSlots.contains(i))
continue;
if (connectedSlots.contains(i)) continue;
Slot slot1 = container.getSlot(i);
if (Math.abs(slot.xDisplayPosition - slot1.xDisplayPosition) <= threshold && Math.abs(slot.yDisplayPosition - slot1.yDisplayPosition) <= threshold) {
if (Math.abs(slot.xDisplayPosition - slot1.xDisplayPosition) <= threshold
&& Math.abs(slot.yDisplayPosition - slot1.yDisplayPosition) <= threshold) {
findConnectedSlots(container, i, connectedSlots);
}
}
@@ -82,8 +78,7 @@ public class FastTransferManager
public static int findSlotWithItem(Container container, ItemStack teststack) {
for (int slotNo = 0; slotNo < container.inventorySlots.size(); slotNo++) {
ItemStack stack = container.getSlot(slotNo).getStack();
if (areStacksSameType(stack, teststack))
return slotNo;
if (areStacksSameType(stack, teststack)) return slotNo;
}
return -1;
}
@@ -99,20 +94,17 @@ public class FastTransferManager
Integer fromZone = slotZoneMap.get(fromSlot);
Integer toZone = slotZoneMap.get(toSlot);
if (fromZone == null || toZone == null || fromZone.equals(toZone))
return;
if (fromZone == null || toZone == null || fromZone.equals(toZone)) return;
if (NEIClientUtils.getHeldItem() != null && !areStacksSameType(heldStack, NEIClientUtils.getHeldItem()))
return;
if (NEIClientUtils.getHeldItem() != null && !areStacksSameType(heldStack, NEIClientUtils.getHeldItem())) return;
if (!fillZoneWithHeldItem(window, toZone))
return;
if (!fillZoneWithHeldItem(window, toZone)) return;
for (int transferFrom : slotZones.get(fromZone)) {
ItemStack transferStack = window.inventorySlots.getSlot(transferFrom).getStack();
ItemStack transferStack =
window.inventorySlots.getSlot(transferFrom).getStack();
if (!areStacksSameType(heldStack, transferStack))
continue;
if (!areStacksSameType(heldStack, transferStack)) continue;
clickSlot(window, transferFrom);
if (!fillZoneWithHeldItem(window, toZone)) {
@@ -130,8 +122,7 @@ public class FastTransferManager
Slot slot = container.getSlot(fromSlot);
ItemStack stack = slot.getStack();
if (stack == null)
return -1;
if (stack == null) return -1;
stack.stackSize = 1;
slot.putStack(stack.copy());
@@ -141,20 +132,22 @@ public class FastTransferManager
LinkedList<ItemStack> compareAfter = saveContainer(container);
try {
//if(compareAfter.get(fromSlot) != null)//transfer failed
//return -1;
// if(compareAfter.get(fromSlot) != null)//transfer failed
// return -1;
for (int i = 0; i < compareBefore.size(); i++) {
if (i == fromSlot)
continue;
if (i == fromSlot) continue;
ItemStack before = compareBefore.get(i);
ItemStack after = compareAfter.get(i);
if (!areStacksIdentical(before, after) && after != null)
if (before == null ? areStacksSameType(stack, after) ://transfered into this empty slot
areStacksSameType(stack, after) && after.stackSize - before.stackSize > 0)//it added to this stack
return i;
if (before == null
? areStacksSameType(stack, after)
: // transfered into this empty slot
areStacksSameType(stack, after)
&& after.stackSize - before.stackSize > 0) // it added to this stack
return i;
}
return -1;
@@ -181,46 +174,43 @@ public class FastTransferManager
public void transferItem(GuiContainer window, int fromSlot) {
int toSlot = findShiftClickDestinationSlot(window.inventorySlots, fromSlot);
if (toSlot == -1)
return;
if (toSlot == -1) return;
Slot from = window.inventorySlots.getSlot(fromSlot);
if (from.isItemValid(from.getStack()))
moveOneItem(window, fromSlot, toSlot);
else//slots that you can't put stuff in
moveOutputSet(window, fromSlot, toSlot);
if (from.isItemValid(from.getStack())) moveOneItem(window, fromSlot, toSlot);
else // slots that you can't put stuff in
moveOutputSet(window, fromSlot, toSlot);
}
public void moveOutputSet(GuiContainer window, int fromSlot, int toSlot) {
if (NEIClientUtils.getHeldItem() != null)
return;
if (NEIClientUtils.getHeldItem() != null) return;
clickSlot(window, fromSlot);//pickup fromSlot
if (NEIClientUtils.getHeldItem() == null)//maybe this container does auto transfers. No need to pick up the final item
return;
clickSlot(window, toSlot);//place one in toSlot
clickSlot(window, fromSlot); // pickup fromSlot
if (NEIClientUtils.getHeldItem()
== null) // maybe this container does auto transfers. No need to pick up the final item
return;
clickSlot(window, toSlot); // place one in toSlot
}
public void moveOneItem(GuiContainer window, int fromSlot, int toSlot) {
clickSlot(window, fromSlot);//pickup fromSlot
clickSlot(window, toSlot, 1);//place one in toSlot
clickSlot(window, fromSlot);//place down in fromSlot
clickSlot(window, fromSlot); // pickup fromSlot
clickSlot(window, toSlot, 1); // place one in toSlot
clickSlot(window, fromSlot); // place down in fromSlot
}
public void retrieveItem(GuiContainer window, int toSlot) {
Slot slot = window.inventorySlots.getSlot(toSlot);
ItemStack slotStack = slot.getStack();
if (slotStack == null ||
slotStack.stackSize == slot.getSlotStackLimit() ||
slotStack.stackSize == slotStack.getMaxStackSize())
return;
if (slotStack == null
|| slotStack.stackSize == slot.getSlotStackLimit()
|| slotStack.stackSize == slotStack.getMaxStackSize()) return;
generateSlotMap(window.inventorySlots, slotStack);
Integer destZone = slotZoneMap.get(toSlot);
if (destZone == null)//slots that don't accept
return;
if (destZone == null) // slots that don't accept
return;
int firstZoneSlot = findShiftClickDestinationSlot(window.inventorySlots, toSlot);
int firstZone = -1;
@@ -228,17 +218,14 @@ public class FastTransferManager
Integer integer = slotZoneMap.get(firstZoneSlot);
if (integer != null) {
firstZone = integer;
if (retrieveItemFromZone(window, firstZone, toSlot))
return;
if (retrieveItemFromZone(window, firstZone, toSlot)) return;
}
}
for (int zone = 0; zone < slotZones.size(); zone++) {
if (zone == destZone || zone == firstZone)
continue;
if (zone == destZone || zone == firstZone) continue;
if (retrieveItemFromZone(window, zone, toSlot))
return;
if (retrieveItemFromZone(window, zone, toSlot)) return;
}
retrieveItemFromZone(window, destZone, toSlot);
@@ -247,14 +234,14 @@ public class FastTransferManager
private boolean retrieveItemFromZone(GuiContainer window, int zone, int toSlot) {
ItemStack stack = window.inventorySlots.getSlot(toSlot).getStack();
for (int i : slotZones.get(zone)) {
if (i == toSlot)
continue;
if (i == toSlot) continue;
Slot slot = window.inventorySlots.getSlot(i);
ItemStack stack1 = slot.getStack();
if (areStacksSameType(stack, stack1) &&
stack1.stackSize != slot.getSlotStackLimit() && //get from full stacks on second pass
if (areStacksSameType(stack, stack1)
&& stack1.stackSize != slot.getSlotStackLimit()
&& // get from full stacks on second pass
stack1.stackSize != stack1.getMaxStackSize()) {
moveOneItem(window, i, toSlot);
return true;
@@ -262,8 +249,7 @@ public class FastTransferManager
}
for (int i : slotZones.get(zone)) {
if (i == toSlot)
continue;
if (i == toSlot) continue;
Slot slot = window.inventorySlots.getSlot(i);
ItemStack stack1 = slot.getStack();
@@ -292,28 +278,24 @@ public class FastTransferManager
for (int transferTo : slotZones.get(zoneIndex)) {
ItemStack held = NEIClientUtils.getHeldItem();
if (held == null)
break;
if (held == null) break;
ItemStack inToSlot = window.inventorySlots.getSlot(transferTo).getStack();
if (!areStacksSameType(inToSlot, held))
continue;
if (!areStacksSameType(inToSlot, held)) continue;
clickSlot(window, transferTo);
}
for (int transferTo : slotZones.get(zoneIndex))//repeat on empty slots
for (int transferTo : slotZones.get(zoneIndex)) // repeat on empty slots
{
ItemStack held = NEIClientUtils.getHeldItem();
if (held == null)
break;
if (held == null) break;
ItemStack inToSlot = window.inventorySlots.getSlot(transferTo).getStack();
if (inToSlot != null)
continue;
if (inToSlot != null) continue;
clickSlot(window, transferTo);
}
@@ -323,15 +305,14 @@ public class FastTransferManager
public void throwAll(GuiContainer window, int pickedUpFromSlot) {
ItemStack held = NEIClientUtils.getHeldItem();
if (held == null)
return;
if (held == null) return;
clickSlot(window, -999);
generateSlotMap(window.inventorySlots, held);
Integer zone = slotZoneMap.get(pickedUpFromSlot);
if(zone == null) //something went wrong and we can't work out where the item was picked up from
return;
if (zone == null) // something went wrong and we can't work out where the item was picked up from
return;
for (int slotIndex : slotZones.get(zone)) {
Slot slot = window.inventorySlots.getSlot(slotIndex);
@@ -1,5 +1,7 @@
package codechicken.nei;
import static codechicken.nei.NEIClientUtils.translate;
import codechicken.lib.render.CCRenderState;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiButton;
@@ -8,10 +10,7 @@ import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.world.World;
import org.lwjgl.opengl.GL11;
import static codechicken.nei.NEIClientUtils.translate;
public class GuiEnchantmentModifier extends GuiContainer
{
public class GuiEnchantmentModifier extends GuiContainer {
final ContainerEnchantmentModifier container;
public GuiEnchantmentModifier(InventoryPlayer inventoryplayer, World world, int i, int j, int k) {
@@ -1,18 +1,18 @@
package codechicken.nei;
import codechicken.lib.render.CCRenderState;
import codechicken.lib.vec.Rectangle4i;
import codechicken.nei.api.INEIGuiHandler;
import codechicken.nei.api.TaggedInventoryArea;
import java.util.Collections;
import java.util.List;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import org.lwjgl.opengl.GL11;
import java.util.Collections;
import java.util.List;
public class GuiExtendedCreativeInv extends GuiContainer implements INEIGuiHandler
{
public class GuiExtendedCreativeInv extends GuiContainer implements INEIGuiHandler {
public GuiExtendedCreativeInv(Container par1Container) {
super(par1Container);
ySize = 198;
@@ -51,6 +51,17 @@ public class GuiExtendedCreativeInv extends GuiContainer implements INEIGuiHandl
@Override
public boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h) {
return false;
return (new Rectangle4i(guiLeft - 15, guiTop + 18, 18, 18 * 4 + 4)).intersects(new Rectangle4i(x, y, w, h));
}
@Override
protected void handleMouseClick(Slot p_146984_1_, int p_146984_2_, int p_146984_3_, int p_146984_4_) {
// Hack for armor slots, because they are outside the container
if (p_146984_1_ != null && p_146984_4_ == 4 && p_146984_1_.xDisplayPosition < 0) {
p_146984_4_ = 0;
}
super.handleMouseClick(p_146984_1_, p_146984_2_, p_146984_3_, p_146984_4_);
}
}
+32 -20
View File
@@ -6,36 +6,48 @@ import net.minecraft.client.gui.GuiButton;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
public class GuiNEIButton extends GuiButton
{
public class GuiNEIButton extends GuiButton {
protected static final ResourceLocation guiTex = new ResourceLocation("textures/gui/widgets.png");
public GuiNEIButton(int i, int j, int k, int l, int i1, String s)
{
public GuiNEIButton(int i, int j, int k, int l, int i1, String s) {
super(i, j, k, l, i1, s);
}
public void drawButton(Minecraft minecraft, int i, int j)
{
if(!visible)
return;
public void drawButton(Minecraft minecraft, int i, int j) {
if (!visible) return;
FontRenderer fontrenderer = minecraft.fontRenderer;
minecraft.renderEngine.bindTexture(guiTex);
GL11.glColor4f(1, 1, 1, 1);
boolean flag = i >= xPosition && j >= yPosition && i < xPosition + width && j < yPosition + height;
int k = getHoverState(flag);
drawTexturedModalRect(xPosition, yPosition, 0, 46 + k * 20, width / 2, height / 2);//top left
drawTexturedModalRect(xPosition + width / 2, yPosition, 200 - width / 2, 46 + k * 20, width / 2, height / 2);//top right
drawTexturedModalRect(xPosition, yPosition + height / 2, 0, 46 + k * 20 + 20 - height / 2, width / 2, height / 2);//bottom left
drawTexturedModalRect(xPosition + width / 2, yPosition + height / 2, 200 - width / 2, 46 + k * 20 + 20 - height / 2, width / 2, height / 2);//bottom right
drawTexturedModalRect(xPosition, yPosition, 0, 46 + k * 20, width / 2, height / 2); // top left
drawTexturedModalRect(
xPosition + width / 2, yPosition, 200 - width / 2, 46 + k * 20, width / 2, height / 2); // top right
drawTexturedModalRect(
xPosition,
yPosition + height / 2,
0,
46 + k * 20 + 20 - height / 2,
width / 2,
height / 2); // bottom left
drawTexturedModalRect(
xPosition + width / 2,
yPosition + height / 2,
200 - width / 2,
46 + k * 20 + 20 - height / 2,
width / 2,
height / 2); // bottom right
mouseDragged(minecraft, i, j);
if(!enabled)
drawCenteredString(fontrenderer, displayString, xPosition + width / 2, yPosition + (height - 8) / 2, 0xffa0a0a0);
else if(flag)
drawCenteredString(fontrenderer, displayString, xPosition + width / 2, yPosition + (height - 8) / 2, 0xffffa0);
if (!enabled)
drawCenteredString(
fontrenderer, displayString, xPosition + width / 2, yPosition + (height - 8) / 2, 0xffa0a0a0);
else if (flag)
drawCenteredString(
fontrenderer, displayString, xPosition + width / 2, yPosition + (height - 8) / 2, 0xffffa0);
else
drawCenteredString(fontrenderer, displayString, xPosition + width / 2, yPosition + (height - 8) / 2, 0xe0e0e0);
drawCenteredString(
fontrenderer, displayString, xPosition + width / 2, yPosition + (height - 8) / 2, 0xe0e0e0);
}
}
@@ -1,11 +1,15 @@
package codechicken.nei;
import static codechicken.nei.NEIClientUtils.translate;
import codechicken.core.gui.GuiCCButton;
import codechicken.core.gui.GuiCCTextField;
import codechicken.core.gui.GuiScrollSlot;
import codechicken.core.inventory.GuiContainerWidget;
import codechicken.lib.render.CCRenderState;
import codechicken.lib.render.FontUtils;
import java.awt.Dimension;
import java.util.ArrayList;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagList;
@@ -14,24 +18,15 @@ import net.minecraft.potion.PotionEffect;
import net.minecraft.util.StatCollector;
import org.lwjgl.opengl.GL11;
import java.awt.Dimension;
import java.util.ArrayList;
import static codechicken.nei.NEIClientUtils.translate;
public class GuiPotionCreator extends GuiContainerWidget
{
public class GuiSlotPotionEffects extends GuiScrollSlot
{
public class GuiPotionCreator extends GuiContainerWidget {
public class GuiSlotPotionEffects extends GuiScrollSlot {
public int selectedslot = -1;
public boolean enabled = true;
private final ArrayList<Potion> validPotions = new ArrayList<>();
public GuiSlotPotionEffects(int x, int y) {
super(x, y, 108, 76);
for (Potion p : Potion.potionTypes)
if (p != null)
validPotions.add(p);
for (Potion p : Potion.potionTypes) if (p != null) validPotions.add(p);
setSmoothScroll(false);
setMargins(0, 0, 0, 0);
}
@@ -48,8 +43,7 @@ public class GuiPotionCreator extends GuiContainerWidget
}
@Override
public void drawOverlay(float frame) {
}
public void drawOverlay(float frame) {}
@Override
public int scrollbarGuideAlignment() {
@@ -69,13 +63,13 @@ public class GuiPotionCreator extends GuiContainerWidget
Potion potion = validPotions.get(slot);
PotionEffect effect = getEffect(potion.id);
boolean blank = effect == null;
if (effect == null)
effect = new PotionEffect(potion.id, 1200, 0);
if (effect == null) effect = new PotionEffect(potion.id, 1200, 0);
int shade = selectedslot == slot ? 2 : blank ? 1 : 0;
CCRenderState.changeTexture("textures/gui/container/enchanting_table.png");
drawTexturedModalRect(x, y, 0, 166 + getSlotHeight(slot) * shade, width - 30, getSlotHeight(slot));
drawTexturedModalRect(x + width - 30, y, width - 23, 166 + getSlotHeight(slot) * shade, 30, getSlotHeight(slot));
drawTexturedModalRect(
x + width - 30, y, width - 23, 166 + getSlotHeight(slot) * shade, 30, getSlotHeight(slot));
if (potion.hasStatusIcon()) {
CCRenderState.changeTexture("textures/gui/container/inventory.png");
@@ -100,12 +94,13 @@ public class GuiPotionCreator extends GuiContainerWidget
private PotionEffect getEffect(int id) {
ItemStack potion = container.potionInv.getStackInSlot(0);
if (potion != null && potion.hasTagCompound() && potion.getTagCompound().hasKey("CustomPotionEffects")) {
if (potion != null
&& potion.hasTagCompound()
&& potion.getTagCompound().hasKey("CustomPotionEffects")) {
NBTTagList potionTagList = potion.getTagCompound().getTagList("CustomPotionEffects", 10);
for (int i = 0; i < potionTagList.tagCount(); i++) {
PotionEffect effect = PotionEffect.readCustomPotionEffectFromNBT(potionTagList.getCompoundTagAt(i));
if (effect.getPotionID() == id)
return effect;
if (effect.getPotionID() == id) return effect;
}
}
return null;
@@ -118,8 +113,7 @@ public class GuiPotionCreator extends GuiContainerWidget
@Override
protected void slotClicked(int slot, int button, int mx, int my, int count) {
if (!enabled)
return;
if (!enabled) return;
if (button == 0) {
select(slot);
@@ -145,19 +139,16 @@ public class GuiPotionCreator extends GuiContainerWidget
}
public void setEnabled(boolean b) {
if (b == enabled)
return;
if (b == enabled) return;
enabled = b;
if (!enabled)
deselect();
if (!enabled) deselect();
}
private void select(int slot) {
selectedslot = slot;
durationField.setEnabled(true);
PotionEffect effect = getEffect(validPotions.get(slot).id);
if (effect == null)
effect = new PotionEffect(validPotions.get(slot).id, 1200, 0);
if (effect == null) effect = new PotionEffect(validPotions.get(slot).id, 1200, 0);
durationField.setDurationTicks(effect.getDuration());
amplifier = effect.getAmplifier();
validateInputButtons();
@@ -175,8 +166,7 @@ public class GuiPotionCreator extends GuiContainerWidget
}
}
public class GuiDurationField extends GuiCCTextField
{
public class GuiDurationField extends GuiCCTextField {
private String baseValue;
public GuiDurationField(int x, int y, int width, int height) {
@@ -190,27 +180,22 @@ public class GuiPotionCreator extends GuiContainerWidget
i /= 20;
String minutes = Integer.toString(i / 60);
String seconds = Integer.toString(i % 60);
if (seconds.length() == 1)
seconds = '0' + seconds;
if (seconds.length() == 1) seconds = '0' + seconds;
setText(minutes + seconds);
}
@Override
public void setEnabled(boolean b) {
super.setEnabled(b);
if (!isEnabled())
setText("100");
if (!isEnabled()) setText("100");
}
@Override
public void onFocusChanged() {
if (isFocused())
baseValue = getText();
if (isFocused()) baseValue = getText();
else {
if (!validateValue())
setText(baseValue);
else
applyEffect();
if (!validateValue()) setText(baseValue);
else applyEffect();
}
}
@@ -231,7 +216,8 @@ public class GuiPotionCreator extends GuiContainerWidget
@Override
public void drawText() {
String s = getText();
String seconds = s.substring(Math.max(0, s.length() - 2), Math.max(0, s.length() - 2) + Math.min(s.length(), 2));
String seconds =
s.substring(Math.max(0, s.length() - 2), Math.max(0, s.length() - 2) + Math.min(s.length(), 2));
String minutes = s.length() < 3 ? "" : s.substring(0, s.length() - 2);
int ty = y + height / 2 - 4;
int tcolour = getTextColour();
@@ -316,10 +302,8 @@ public class GuiPotionCreator extends GuiContainerWidget
@Override
public void actionPerformed(String ident, Object... params) {
if (ident.equals("ampDown"))
amplifier--;
else if (ident.equals("ampUp"))
amplifier++;
if (ident.equals("ampDown")) amplifier--;
else if (ident.equals("ampUp")) amplifier++;
applyEffect();
validateInputButtons();
}
+25 -36
View File
@@ -1,9 +1,18 @@
package codechicken.nei;
import static codechicken.lib.gui.GuiDraw.displaySize;
import static codechicken.lib.gui.GuiDraw.drawString;
import static codechicken.lib.gui.GuiDraw.drawTooltipBox;
import static codechicken.lib.gui.GuiDraw.getStringWidth;
import codechicken.lib.config.ConfigTag;
import codechicken.nei.KeyManager.IKeyStateTracker;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.guihook.GuiContainerManager;
import codechicken.nei.recipe.StackInfo;
import java.awt.Dimension;
import java.awt.Point;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.item.ItemStack;
@@ -12,18 +21,7 @@ import net.minecraft.world.World;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import java.awt.Dimension;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
import static codechicken.lib.gui.GuiDraw.displaySize;
import static codechicken.lib.gui.GuiDraw.drawString;
import static codechicken.lib.gui.GuiDraw.drawTooltipBox;
import static codechicken.lib.gui.GuiDraw.getStringWidth;
public class HUDRenderer implements IKeyStateTracker
{
public class HUDRenderer implements IKeyStateTracker {
@Override
public void tickKeyStates() {
if (KeyManager.keyStates.get("world.highlight_tips").down) {
@@ -34,37 +32,29 @@ public class HUDRenderer implements IKeyStateTracker
public static void renderOverlay() {
Minecraft mc = Minecraft.getMinecraft();
if (mc.currentScreen == null &&
mc.theWorld != null &&
!mc.gameSettings.keyBindPlayerList.getIsKeyPressed() &&
NEIClientConfig.getBooleanSetting("world.highlight_tips") &&
mc.objectMouseOver != null &&
mc.objectMouseOver.typeOfHit == MovingObjectType.BLOCK) {
if (mc.currentScreen == null
&& mc.theWorld != null
&& !mc.gameSettings.keyBindPlayerList.getIsKeyPressed()
&& NEIClientConfig.getBooleanSetting("world.highlight_tips")
&& mc.objectMouseOver != null
&& mc.objectMouseOver.typeOfHit == MovingObjectType.BLOCK) {
World world = mc.theWorld;
ArrayList<ItemStack> items = ItemInfo.getIdentifierItems(world, mc.thePlayer, mc.objectMouseOver);
if (items.isEmpty())
return;
ItemStack[] items = ItemInfo.getIdentifierItems(world, mc.thePlayer, mc.objectMouseOver)
.toArray(new ItemStack[0]);
int minDamage = Integer.MAX_VALUE;
ItemStack stack = null;
for(ItemStack astack : items) {
if(astack.getItem() != null && astack.getItemDamage() < minDamage) {
stack = astack;
minDamage = stack.getItemDamage();
}
}
if (items.length == 0) return;
ItemStack stack = StackInfo.getItemStackWithMinimumDamage(items);
renderOverlay(stack, ItemInfo.getText(stack, world, mc.thePlayer, mc.objectMouseOver), getPositioning());
}
}
public static void renderOverlay(ItemStack stack, List<String> textData, Point pos) {
if((stack == null || stack.getItem() == null) && textData.isEmpty())
return;
if ((stack == null || stack.getItem() == null) && textData.isEmpty()) return;
int w = 0;
for (String s : textData)
w = Math.max(w, getStringWidth(s) + 29);
for (String s : textData) w = Math.max(w, getStringWidth(s) + 29);
int h = Math.max(24, 10 + 10 * textData.size());
Dimension size = displaySize();
@@ -85,8 +75,7 @@ public class HUDRenderer implements IKeyStateTracker
RenderHelper.enableGUIStandardItemLighting();
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
if (stack != null && stack.getItem() != null)
GuiContainerManager.drawItem(x + 5, y + h / 2 - 8, stack);
if (stack != null && stack.getItem() != null) GuiContainerManager.drawItem(x + 5, y + h / 2 - 8, stack);
}
private static Point getPositioning() {
@@ -98,4 +87,4 @@ public class HUDRenderer implements IKeyStateTracker
public static void load() {
KeyManager.trackers.add(new HUDRenderer());
}
}
}
+2 -4
View File
@@ -1,14 +1,12 @@
package codechicken.nei;
public class Image
{
public class Image {
public int x;
public int y;
public int width;
public int height;
public Image(int x, int y, int w, int h)
{
public Image(int x, int y, int w, int h) {
this.x = x;
this.y = y;
width = w;
@@ -5,51 +5,41 @@ import codechicken.nei.api.IInfiniteItemHandler;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
public class InfiniteStackSizeHandler implements IInfiniteItemHandler
{
public class InfiniteStackSizeHandler implements IInfiniteItemHandler {
@Override
public void onPickup(ItemStack heldItem)
{
public void onPickup(ItemStack heldItem) {
heldItem.stackSize = 1;
}
@Override
public void onPlaceInfinite(ItemStack heldItem)
{
public void onPlaceInfinite(ItemStack heldItem) {
heldItem.stackSize = 111;
}
@Override
public boolean canHandleItem(ItemStack stack)
{
public boolean canHandleItem(ItemStack stack) {
return !stack.isItemStackDamageable();
}
@Override
public boolean isItemInfinite(ItemStack stack)
{
public boolean isItemInfinite(ItemStack stack) {
return stack.stackSize == -1 || stack.stackSize > 100;
}
@Override
public void replenishInfiniteStack(InventoryPlayer inv, int slotNo)
{
public void replenishInfiniteStack(InventoryPlayer inv, int slotNo) {
ItemStack stack = inv.getStackInSlot(slotNo);
stack.stackSize = 111;
for(int i = 0; i < inv.getSizeInventory(); i++)
{
if(i == slotNo)
continue;
if(NEIServerUtils.areStacksSameType(stack, inv.getStackInSlot(i)))
inv.setInventorySlotContents(i, null);
for (int i = 0; i < inv.getSizeInventory(); i++) {
if (i == slotNo) continue;
if (NEIServerUtils.areStacksSameType(stack, inv.getStackInSlot(i))) inv.setInventorySlotContents(i, null);
}
}
@Override
public ItemStack getInfiniteItem(ItemStack typeStack)
{
public ItemStack getInfiniteItem(ItemStack typeStack) {
return InventoryUtils.copyStack(typeStack, -1);
}
}
@@ -4,8 +4,7 @@ import codechicken.nei.api.IInfiniteItemHandler;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
public class InfiniteToolHandler implements IInfiniteItemHandler
{
public class InfiniteToolHandler implements IInfiniteItemHandler {
@Override
public void onPickup(ItemStack heldItem) {
heldItem.setItemDamage(0);
@@ -4,17 +4,16 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.InventoryCrafting;
public class InventoryCraftingDummy extends InventoryCrafting
{
public InventoryCraftingDummy()
{
super(new Container()
{
@Override
public boolean canInteractWith(EntityPlayer entityplayer)
{
return true;
}
}, 3, 3);
public class InventoryCraftingDummy extends InventoryCrafting {
public InventoryCraftingDummy() {
super(
new Container() {
@Override
public boolean canInteractWith(EntityPlayer entityplayer) {
return true;
}
},
3,
3);
}
}
+44 -55
View File
@@ -7,10 +7,6 @@ import codechicken.nei.api.ItemInfo;
import codechicken.nei.guihook.GuiContainerManager;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
@@ -19,13 +15,15 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
public class ItemList
{
public class ItemList {
/**
* Fields are replaced atomically and contents never modified.
*/
public static volatile List<ItemStack> items = new ArrayList<>();
public static volatile List<ItemStack> items = new ArrayList<>();
/**
* Fields are replaced atomically and contents never modified.
*/
@@ -34,29 +32,27 @@ public class ItemList
* Updates to this should be synchronised on this
*/
public static final List<ItemFilterProvider> itemFilterers = new LinkedList<>();
public static final List<ItemsLoadedCallback> loadCallbacks = new LinkedList<>();
private static final HashSet<Item> erroredItems = new HashSet<>();
private static final HashSet<String> stackTraces = new HashSet<>();
public static class EverythingItemFilter implements ItemFilter
{
public static class EverythingItemFilter implements ItemFilter {
@Override
public boolean matches(ItemStack item) {
return true;
}
}
public static class NothingItemFilter implements ItemFilter
{
public static class NothingItemFilter implements ItemFilter {
@Override
public boolean matches(ItemStack item) {
return false;
}
}
public static class PatternItemFilter implements ItemFilter
{
public static class PatternItemFilter implements ItemFilter {
public Pattern pattern;
public PatternItemFilter(Pattern pattern) {
@@ -69,8 +65,7 @@ public class ItemList
}
}
public static class AllMultiItemFilter implements ItemFilter
{
public static class AllMultiItemFilter implements ItemFilter {
public List<ItemFilter> filters;
public AllMultiItemFilter(List<ItemFilter> filters) {
@@ -83,19 +78,18 @@ public class ItemList
@Override
public boolean matches(ItemStack item) {
for(ItemFilter filter : filters)
for (ItemFilter filter : filters)
try {
if (!filter.matches(item)) return false;
} catch (Exception e) {
NEIClientConfig.logger.error("Exception filtering "+item+" with "+filter, e);
NEIClientConfig.logger.error("Exception filtering " + item + " with " + filter, e);
}
return true;
}
}
public static class AnyMultiItemFilter implements ItemFilter
{
public static class AnyMultiItemFilter implements ItemFilter {
public List<ItemFilter> filters;
public AnyMultiItemFilter(List<ItemFilter> filters) {
@@ -108,29 +102,27 @@ public class ItemList
@Override
public boolean matches(ItemStack item) {
for(ItemFilter filter : filters)
for (ItemFilter filter : filters)
try {
if (filter.matches(item)) return true;
} catch (Exception e) {
NEIClientConfig.logger.error("Exception filtering "+item+" with "+filter, e);
NEIClientConfig.logger.error("Exception filtering " + item + " with " + filter, e);
}
return false;
}
}
public static interface ItemsLoadedCallback
{
public static interface ItemsLoadedCallback {
public void itemsLoaded();
}
public static boolean itemMatchesAll(ItemStack item, List<ItemFilter> filters) {
for(ItemFilter filter : filters) {
for (ItemFilter filter : filters) {
try {
if (!filter.matches(item))
return false;
if (!filter.matches(item)) return false;
} catch (Exception e) {
NEIClientConfig.logger.error("Exception filtering "+item+" with "+filter, e);
NEIClientConfig.logger.error("Exception filtering " + item + " with " + filter, e);
}
}
@@ -152,14 +144,12 @@ public class ItemList
public static List<ItemFilter> getItemFilters() {
LinkedList<ItemFilter> filters = new LinkedList<>();
synchronized (itemFilterers) {
for(ItemFilterProvider p : itemFilterers)
filters.add(p.getFilter());
for (ItemFilterProvider p : itemFilterers) filters.add(p.getFilter());
}
return filters;
}
public static final RestartableTask loadItems = new RestartableTask("NEI Item Loading")
{
public static final RestartableTask loadItems = new RestartableTask("NEI Item Loading") {
private void damageSearch(Item item, List<ItemStack> permutations) {
HashSet<String> damageIconSet = new HashSet<>();
for (int damage = 0; damage < 16; damage++)
@@ -172,12 +162,15 @@ public class ItemList
damageIconSet.add(s);
permutations.add(itemstack);
}
}
catch(TimeoutException t) {
} catch (TimeoutException t) {
throw t;
}
catch(Throwable t) {
NEIServerUtils.logOnce(t, stackTraces, "Ommiting "+item+":"+damage+" "+item.getClass().getSimpleName(), item.toString());
} catch (Throwable t) {
NEIServerUtils.logOnce(
t,
stackTraces,
"Ommiting " + item + ":" + damage + " "
+ item.getClass().getSimpleName(),
item.toString());
}
}
@@ -195,8 +188,7 @@ public class ItemList
for (Item item : (Iterable<Item>) Item.itemRegistry) {
if (interrupted()) return;
if (item == null || erroredItems.contains(item))
continue;
if (item == null || erroredItems.contains(item)) continue;
try {
timer.reset(item);
@@ -204,11 +196,9 @@ public class ItemList
permutations.clear();
permutations.addAll(ItemInfo.itemOverrides.get(item));
if (permutations.isEmpty())
item.getSubItems(item, null, permutations);
if (permutations.isEmpty()) item.getSubItems(item, null, permutations);
if (permutations.isEmpty())
damageSearch(item, permutations);
if (permutations.isEmpty()) damageSearch(item, permutations);
permutations.addAll(ItemInfo.itemVariants.get(item));
@@ -222,19 +212,17 @@ public class ItemList
}
}
if(interrupted()) return;
if (interrupted()) return;
ItemList.items = items;
ItemList.itemMap = itemMap;
for(ItemsLoadedCallback callback : loadCallbacks)
callback.itemsLoaded();
for (ItemsLoadedCallback callback : loadCallbacks) callback.itemsLoaded();
updateFilter.restart();
}
};
public static ForkJoinPool getPool(int poolSize) {
if(poolSize < 1)
poolSize = 1;
if (poolSize < 1) poolSize = 1;
return new ForkJoinPool(poolSize);
}
@@ -242,8 +230,7 @@ public class ItemList
public static final int numProcessors = Runtime.getRuntime().availableProcessors();
public static ForkJoinPool forkJoinPool = getPool(numProcessors * 2 / 3);
public static final RestartableTask updateFilter = new RestartableTask("NEI Item Filtering")
{
public static final RestartableTask updateFilter = new RestartableTask("NEI Item Filtering") {
@Override
public void execute() {
// System.out.println("Executing NEI Item Filtering");
@@ -251,19 +238,21 @@ public class ItemList
ItemFilter filter = getItemListFilter();
try {
filtered = ItemList.forkJoinPool.submit(() -> items.parallelStream()
.filter(PresetsWidget::matches)
.filter(filter::matches)
.collect(Collectors.toCollection(ArrayList::new))).get();
filtered = ItemList.forkJoinPool
.submit(() -> items.parallelStream()
.filter(PresetsWidget::matches)
.filter(filter::matches)
.collect(Collectors.toCollection(ArrayList::new)))
.get();
} catch (InterruptedException | ExecutionException e) {
filtered = new ArrayList<>();
e.printStackTrace();
stop();
}
if(interrupted()) return;
if (interrupted()) return;
ItemSorter.sort(filtered);
if(interrupted()) return;
if (interrupted()) return;
ItemPanel.updateItemList(filtered);
}
};
@@ -1,5 +1,8 @@
package codechicken.nei;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
@@ -16,12 +19,7 @@ import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import net.minecraftforge.client.MinecraftForgeClient;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ItemMobSpawner extends ItemBlock
{
public class ItemMobSpawner extends ItemBlock {
private static Map<Integer, EntityLiving> entityHashMap;
private static Map<Integer, String> IDtoNameMap;
public static int idPig;
@@ -41,6 +39,7 @@ public class ItemMobSpawner extends ItemBlock
* These are ASM translated from BlockMobSpawner
*/
public static int placedX;
public static int placedY;
public static int placedZ;
@@ -49,9 +48,20 @@ public class ItemMobSpawner extends ItemBlock
return Blocks.mob_spawner.getBlockTextureFromSide(0);
}
public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int x, int y, int z, int par7, float par8, float par9, float par10) {
public boolean onItemUse(
ItemStack itemstack,
EntityPlayer entityplayer,
World world,
int x,
int y,
int z,
int par7,
float par8,
float par9,
float par10) {
if (super.onItemUse(itemstack, entityplayer, world, x, y, z, par7, par8, par9, par10) && world.isRemote) {
TileEntityMobSpawner tileentitymobspawner = (TileEntityMobSpawner) world.getTileEntity(placedX, placedY, placedZ);
TileEntityMobSpawner tileentitymobspawner =
(TileEntityMobSpawner) world.getTileEntity(placedX, placedY, placedZ);
if (tileentitymobspawner != null) {
setDefaultTag(itemstack);
String mobtype = IDtoNameMap.get(itemstack.getItemDamage());
@@ -83,12 +93,12 @@ public class ItemMobSpawner extends ItemBlock
loadSpawners(world);
Class<?> clazz = (Class<?>) EntityList.IDtoClassMapping.get(ID);
try {
e = (EntityLiving) clazz.getConstructor(new Class[]{World.class}).newInstance(world);
e = (EntityLiving)
clazz.getConstructor(new Class[] {World.class}).newInstance(world);
} catch (Throwable t) {
if(clazz == null)
NEIClientConfig.logger.error("Null class for entity ("+ID+", "+IDtoNameMap.get(ID));
else
NEIClientConfig.logger.error("Error creating instance of entity: " + clazz.getName(), t);
if (clazz == null)
NEIClientConfig.logger.error("Null class for entity (" + ID + ", " + IDtoNameMap.get(ID));
else NEIClientConfig.logger.error("Error creating instance of entity: " + clazz.getName(), t);
e = getEntity(idPig);
}
entityHashMap.put(ID, e);
@@ -96,46 +106,48 @@ public class ItemMobSpawner extends ItemBlock
return e;
}
public static void clearEntityReferences(World newWorld) {
entityHashMap.values().removeIf(e -> e.worldObj != newWorld);
}
private void setDefaultTag(ItemStack itemstack) {
if (!IDtoNameMap.containsKey(itemstack.getItemDamage()))
itemstack.setItemDamage(idPig);
if (!IDtoNameMap.containsKey(itemstack.getItemDamage())) itemstack.setItemDamage(idPig);
}
public static void loadSpawners(World world) {
if (loaded) return;
loaded = true;
HashMap<Class<Entity>, String> classToStringMapping = (HashMap<Class<Entity>, String>) EntityList.classToStringMapping;
HashMap<Class<Entity>, Integer> classToIDMapping = (HashMap<Class<Entity>, Integer>) EntityList.classToIDMapping;
HashMap<Class<Entity>, String> classToStringMapping =
(HashMap<Class<Entity>, String>) EntityList.classToStringMapping;
HashMap<Class<Entity>, Integer> classToIDMapping =
(HashMap<Class<Entity>, Integer>) EntityList.classToIDMapping;
for (Class<Entity> eclass : classToStringMapping.keySet()) {
if (!EntityLiving.class.isAssignableFrom(eclass))
continue;
if (!EntityLiving.class.isAssignableFrom(eclass)) continue;
try {
EntityLiving entityliving = (EntityLiving) eclass.getConstructor(new Class[]{World.class}).newInstance(world);
EntityLiving entityliving = (EntityLiving)
eclass.getConstructor(new Class[] {World.class}).newInstance(world);
entityliving.isChild();
int id = classToIDMapping.get(eclass);
String name = classToStringMapping.get(eclass);
if (name.equals("EnderDragon"))
continue;
if (name.equals("EnderDragon")) continue;
IDtoNameMap.put(id, name);
if (name.equals("Pig"))
idPig = id;
if (name.equals("Pig")) idPig = id;
} catch (Throwable ignored) {
}
}
IDtoNameMap.entrySet().removeIf(e -> getEntity(e.getKey()).getClass() == EntityPig.class && !e.getValue().equals("Pig"));
IDtoNameMap.entrySet()
.removeIf(e -> getEntity(e.getKey()).getClass() == EntityPig.class
&& !e.getValue().equals("Pig"));
}
@Override
public void getSubItems(Item item, CreativeTabs tab, List list) {
if(!NEIClientConfig.hasSMPCounterPart())
list.add(new ItemStack(item));
else
for(int i : IDtoNameMap.keySet())
list.add(new ItemStack(item, 1, i));
if (!NEIClientConfig.hasSMPCounterPart()) list.add(new ItemStack(item));
else for (int i : IDtoNameMap.keySet()) list.add(new ItemStack(item, 1, i));
}
}
+101 -462
View File
@@ -1,40 +1,19 @@
package codechicken.nei;
import codechicken.lib.vec.Rectangle4i;
import codechicken.nei.api.GuiInfo;
import codechicken.nei.api.INEIGuiHandler;
import codechicken.nei.guihook.GuiContainerManager;
import codechicken.nei.recipe.GuiCraftingRecipe;
import codechicken.nei.recipe.GuiRecipe;
import codechicken.nei.recipe.GuiUsageRecipe;
import codechicken.nei.recipe.StackInfo;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.gui.inventory.GuiContainerCreative;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidContainerItem;
import static codechicken.lib.gui.GuiDraw.drawRect;
import static codechicken.nei.LayoutManager.searchField;
import codechicken.lib.vec.Rectangle4i;
import java.util.ArrayList;
import java.util.regex.Pattern;
import javax.annotation.Nullable;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.item.ItemStack;
public class ItemPanel extends Widget
{
public ItemStack draggedStack;
public int mouseDownSlot = -1;
public Button pagePrev;
public Button pageNext;
public Label pageLabel;
public class ItemPanel extends PanelWidget {
/**
* Backwards compat :-/
*/
@SuppressWarnings("unused")
@Deprecated
private int itemsPerPage = 0;
@@ -44,225 +23,170 @@ public class ItemPanel extends Widget
@Deprecated
public ArrayList<ItemStack> realItems = new ArrayList<>();
protected Pattern SPECIAL_REGEX_CHARS = Pattern.compile("[{}()\\[\\].+*?^$\\\\|]");
public ItemStack getStackMouseOver(int mousex, int mousey) {
// *looks angrily at AppleCore*
return super.getStackMouseOver(mousex, mousey);
}
public static class ItemPanelSlot
{
public Button more;
public Button less;
public ItemQuantityField quantity;
public static class ItemPanelSlot {
public ItemStack item;
public int slotIndex;
public ItemPanelSlot(int idx, ItemStack stack)
{
public ItemPanelSlot(int idx, ItemStack stack) {
slotIndex = idx;
item = stack;
}
@Deprecated
public ItemPanelSlot(int idx)
{
public ItemPanelSlot(int idx) {
this(idx, ItemPanels.itemPanel.getGrid().getItem(idx));
}
}
protected static class ItemPanelGrid extends ItemsGrid
{
protected static class ItemPanelGrid extends ItemsGrid {
public ArrayList<ItemStack> newItems;
public void setItems(ArrayList<ItemStack> items)
{
public void setItems(ArrayList<ItemStack> items) {
newItems = items;
}
public void refresh(GuiContainer gui)
{
public void refresh(GuiContainer gui) {
if (newItems != null) {
realItems = newItems;
newItems = null;
onGridChanged();
}
super.refresh(gui);
}
@Override
protected void drawItem(Rectangle4i rect, int idx, ItemPanelSlot focus)
{
if (PresetsWidget.inEditMode() && !PresetsWidget.isHidden(getItem(idx))) {
drawRect(rect.x, rect.y, rect.w, rect.h, 0xee555555);
protected void drawSlotOutline(@Nullable ItemPanelSlot focused, int slotIdx, Rectangle4i rect) {
if (PresetsWidget.inEditMode()) {
if (!PresetsWidget.isHidden(getItem(slotIdx))) drawRect(rect.x, rect.y, rect.w, rect.h, 0xee555555);
} else {
super.drawSlotOutline(focused, slotIdx, rect);
}
super.drawItem(rect, idx, PresetsWidget.inEditMode()? null: focus);
}
}
protected ItemsGrid grid = new ItemPanelGrid();
public ArrayList<ItemStack> getItems()
{
return grid.getItems();
public ItemPanel() {
grid = new ItemPanelGrid();
}
public static void updateItemList(ArrayList<ItemStack> newItems)
{
public static void updateItemList(ArrayList<ItemStack> newItems) {
((ItemPanelGrid) ItemPanels.itemPanel.getGrid()).setItems(newItems);
ItemPanels.itemPanel.realItems = newItems;
}
@Override
public void init() {
super.init();
more = new Button("+") {
@Override
public boolean onButtonPress(boolean rightclick) {
if (rightclick) return false;
int modifier = NEIClientUtils.controlKey() ? 64 : NEIClientUtils.shiftKey() ? 10 : 1;
int quantity = NEIClientConfig.getItemQuantity() + modifier;
if (quantity < 0) {
quantity = 0;
}
ItemPanels.itemPanel.quantity.setText(Integer.toString(quantity));
return true;
}
};
less = new Button("-") {
@Override
public boolean onButtonPress(boolean rightclick) {
if (rightclick) return false;
int modifier = NEIClientUtils.controlKey() ? -64 : NEIClientUtils.shiftKey() ? -10 : -1;
int quantity = NEIClientConfig.getItemQuantity() + modifier;
if (quantity < 0) {
quantity = 0;
}
ItemPanels.itemPanel.quantity.setText(Integer.toString(quantity));
return true;
}
};
quantity = new ItemQuantityField("quantity");
}
@Deprecated
public void scroll(int i)
{
public void scroll(int i) {
grid.shiftPage(i);
}
public ItemsGrid getGrid()
{
return grid;
public String getLabelText() {
return String.format("(%d/%d)", getPage(), Math.max(1, getNumPages()));
}
public void init() {
pageLabel = new Label("(0/0)", true);
pagePrev = new Button("Prev")
{
public boolean onButtonPress(boolean rightclick) {
if (!rightclick) {
grid.shiftPage(-1);
return true;
}
return false;
}
@Override
public String getRenderLabel() {
return "<";
}
};
pageNext = new Button("Next")
{
public boolean onButtonPress(boolean rightclick) {
if (!rightclick) {
grid.shiftPage(1);
return true;
}
return false;
}
@Override
public String getRenderLabel() {
return ">";
}
};
protected String getPositioningSettingName() {
return "world.panels.items";
}
public int getMarginLeft(GuiContainer gui)
{
if (gui instanceof GuiContainerCreative && NEIClientUtils.getGamemode() == 2) {
//then activate creative+ first render creative gui and oly then creative+
return (gui.width + 176) / 2 + 2;
}
return (gui.width + gui.xSize) / 2 + 2;
public int getMarginLeft(GuiContainer gui) {
return (gui.width + gui.xSize) / 2 + PADDING;
}
public int getMarginTop(GuiContainer gui)
{
return 2;
public int getMarginTop(GuiContainer gui) {
return PADDING;
}
public int getWidth(GuiContainer gui)
{
return LayoutManager.getSideWidth(gui) - getMarginLeft(gui);
public int getWidth(GuiContainer gui) {
return gui.width - (gui.xSize + gui.width) / 2 - PADDING * 2;
}
public int getHeight(GuiContainer gui)
{
// - 19 = 2 + 16 + 1 -> input in bottom
return gui.height - getMarginTop(gui) - 19;
public int getHeight(GuiContainer gui) {
return gui.height - getMarginTop(gui) - PADDING;
}
public String getLabelText()
{
return "(" + getPage() + "/" + Math.max(1, getNumPages()) + ")";
}
protected int resizeFooter(GuiContainer gui) {
if (!NEIClientConfig.showItemQuantityWidget()) return 0;
public void resize(GuiContainer gui)
{
final int marginLeft = getMarginLeft(gui);
final int marginTop = getMarginTop(gui);
final int width = getWidth(gui);
final int height = getHeight(gui);
final int buttonHeight = 16;
final int buttonWidth = 16;
final int BUTTON_SIZE = 16;
pagePrev.w = pageNext.w = buttonWidth;
pagePrev.h = pageNext.h = buttonHeight;
pagePrev.y = pageNext.y = marginTop;
more.w = less.w = BUTTON_SIZE;
more.h = less.h = quantity.h = BUTTON_SIZE;
pagePrev.x = marginLeft;
pageNext.x = marginLeft + width - buttonWidth;
less.x = x;
more.x = x + w - BUTTON_SIZE;
more.y = less.y = quantity.y = y + h - BUTTON_SIZE;
pageLabel.x = marginLeft + width / 2;
pageLabel.y = marginTop + 5;
pageLabel.text = getLabelText();
quantity.x = x + BUTTON_SIZE + 2;
quantity.w = more.x - quantity.x - 2;
y = marginTop + buttonHeight + 2;
x = marginLeft;
w = width;
h = height - buttonHeight - 2;
grid.setGridSize(x, y, w, h);
grid.refresh(gui);
}
public void setVisible()
{
LayoutManager.addWidget(pagePrev);
LayoutManager.addWidget(pageNext);
LayoutManager.addWidget(pageLabel);
return BUTTON_SIZE + 2;
}
@Override
public void draw(int mousex, int mousey)
{
grid.draw(mousex, mousey);
}
public void setVisible() {
super.setVisible();
@Override
public void postDraw(int mousex, int mousey) {
if (draggedStack != null) {
GuiContainerManager.drawItems.zLevel += 100;
GuiContainerManager.drawItem(mousex - 8, mousey - 8, draggedStack, true);
GuiContainerManager.drawItems.zLevel -= 100;
if (grid.getPerPage() > 0 && NEIClientConfig.showItemQuantityWidget()) {
LayoutManager.addWidget(more);
LayoutManager.addWidget(less);
LayoutManager.addWidget(quantity);
}
}
@Override
public void mouseDragged(int mousex, int mousey, int button, long heldTime) {
if (mouseDownSlot >= 0 && draggedStack == null && NEIClientUtils.getHeldItem() == null &&
NEIClientConfig.hasSMPCounterPart() && !GuiInfo.hasCustomSlots(NEIClientUtils.getGuiContainer())) {
ItemPanelSlot mouseOverSlot = getSlotMouseOver(mousex, mousey);
if (mouseOverSlot == null || mouseOverSlot.slotIndex != mouseDownSlot || heldTime > 500) {
draggedStack = getDraggedStackWithQuantity(mouseDownSlot);
mouseDownSlot = -1;
}
}
}
protected ItemStack getDraggedStackWithQuantity(int mouseDownSlot)
{
protected ItemStack getDraggedStackWithQuantity(int mouseDownSlot) {
ItemStack stack = grid.getItem(mouseDownSlot);
if (stack != null) {
int amount = NEIClientConfig.getItemQuantity();
int amount = NEIClientConfig.showItemQuantityWidget() ? NEIClientConfig.getItemQuantity() : 0;
if (amount == 0) {
amount = stack.getMaxStackSize();
@@ -273,289 +197,4 @@ public class ItemPanel extends Widget
return null;
}
@Override
public boolean handleClick(int mousex, int mousey, int button)
{
if (handleClickExt(mousex, mousey, button))
return true;
if (NEIClientUtils.getHeldItem() != null) {
if (!grid.contains(mousex, mousey)) {
return false;
}
if (NEIClientConfig.canPerformAction("delete") && NEIClientConfig.canPerformAction("item"))
if (button == 1)
NEIClientUtils.decreaseSlotStack(-999);
else
NEIClientUtils.deleteHeldItem();
else
NEIClientUtils.dropHeldItem();
return true;
}
ItemPanelSlot hoverSlot = getSlotMouseOver(mousex, mousey);
if (hoverSlot != null) {
if (button == 2) {
if (hoverSlot.item != null) {
draggedStack = getDraggedStackWithQuantity(hoverSlot.slotIndex);
}
} else {
mouseDownSlot = hoverSlot.slotIndex;
}
return true;
}
return false;
}
@Override
public boolean handleClickExt(int mouseX, int mouseY, int button)
{
if (ItemPanels.itemPanel.draggedStack != null) {
return ItemPanels.itemPanel.handleDraggedClick(mouseX, mouseY, button);
}
if (ItemPanels.bookmarkPanel.draggedStack != null) {
return ItemPanels.bookmarkPanel.handleDraggedClick(mouseX, mouseY, button);
}
return false;
}
protected boolean handleDraggedClick(int mouseX, int mouseY, int button)
{
if (draggedStack == null) {
return false;
}
if (handleFillFluidContainerClick(mouseX, mouseY, button)) {
return true;
}
if (handleSearchInputClick(mouseX, mouseY, button)) {
return true;
}
if (handleGUIContainerClick(mouseX, mouseY, button)) {
return true;
}
if (handleCheatItemClick(mouseX, mouseY, button)) {
return true;
}
final GuiContainer gui = NEIClientUtils.getGuiContainer();
if (mouseX < gui.guiLeft || mouseY < gui.guiTop || mouseX >= gui.guiLeft + gui.xSize || mouseY >= gui.guiTop + gui.ySize) {
draggedStack = null;
}
return true;
}
protected boolean handleFillFluidContainerClick(int mouseX, int mouseY, int button)
{
if (button == 2) {
return false;
}
ItemPanelSlot mouseOverSlot = ItemPanels.itemPanel.getSlotMouseOver(mouseX, mouseY);
if (mouseOverSlot == null) {
mouseOverSlot = ItemPanels.bookmarkPanel.getSlotMouseOver(mouseX, mouseY);
}
if (mouseOverSlot != null && draggedStack.getItem() instanceof IFluidContainerItem) {
FluidStack fluidStack = StackInfo.getFluid(mouseOverSlot.item);
if (fluidStack != null) {
final int stackSize = draggedStack.stackSize;
fluidStack = fluidStack.copy();
if (fluidStack.amount == 0) {
fluidStack.amount = 1000;
}
if (mouseOverSlot.item.stackSize > 1) {
fluidStack.amount *= mouseOverSlot.item.stackSize;
}
draggedStack.stackSize = 1;
((IFluidContainerItem) draggedStack.getItem()).fill(draggedStack, fluidStack, true);
draggedStack.stackSize = stackSize;
if (button == 1 && ((IFluidContainerItem) draggedStack.getItem()).getFluid(draggedStack) != null) {
ItemPanels.bookmarkPanel.addOrRemoveItem(draggedStack.copy());
}
}
return true;
}
return false;
}
protected boolean handleGUIContainerClick(int mouseX, int mouseY, int button)
{
final GuiContainer gui = NEIClientUtils.getGuiContainer();
boolean handled = false;
try {
GuiInfo.readLock.lock();
for (INEIGuiHandler handler : GuiInfo.guiHandlers) {
if (handler.handleDragNDrop(gui, mouseX, mouseY, draggedStack, button)) {
handled = true;
break;
}
}
} finally {
GuiInfo.readLock.unlock();
}
if (draggedStack.stackSize == 0) {
draggedStack = null;
}
return handled;
}
protected boolean handleCheatItemClick(int mouseX, int mouseY, int button)
{
final GuiContainer gui = NEIClientUtils.getGuiContainer();
final Slot overSlot = gui.getSlotAtPosition(mouseX, mouseY);
if (overSlot != null && overSlot.isItemValid(draggedStack)) {
if (NEIClientConfig.canCheatItem(draggedStack)) {
int contents = overSlot.getHasStack() ? overSlot.getStack().stackSize : 0;
final int add = button == 0 ? draggedStack.stackSize : 1;
if (overSlot.getHasStack() && !NEIServerUtils.areStacksSameType(draggedStack, overSlot.getStack())) {
contents = 0;
}
final int total = Math.min(contents + add, Math.min(overSlot.getSlotStackLimit(), draggedStack.getMaxStackSize()));
if (total > contents) {
NEIClientUtils.setSlotContents(overSlot.slotNumber, NEIServerUtils.copyStack(draggedStack, total), true);
NEICPH.sendGiveItem(NEIServerUtils.copyStack(draggedStack, total), false, false);
draggedStack.stackSize -= total - contents;
}
if (draggedStack.stackSize == 0) {
draggedStack = null;
}
} else {
draggedStack = null;
}
return true;
}
return false;
}
protected boolean handleSearchInputClick(int mouseX, int mouseY, int button)
{
if (searchField.contains(mouseX, mouseY)) {
final FluidStack fluidStack = StackInfo.getFluid(draggedStack);
if (fluidStack != null) {
searchField.setText(SPECIAL_REGEX_CHARS.matcher(EnumChatFormatting.getTextWithoutFormattingCodes(fluidStack.getLocalizedName())).replaceAll("\\\\$0"));
} else {
searchField.setText(SPECIAL_REGEX_CHARS.matcher(EnumChatFormatting.getTextWithoutFormattingCodes(draggedStack.getDisplayName())).replaceAll("\\\\$0"));
}
return true;
}
return false;
}
@Override
public void mouseUp(int mousex, int mousey, int button) {
ItemPanelSlot hoverSlot = getSlotMouseOver(mousex, mousey);
if (hoverSlot != null && hoverSlot.slotIndex == mouseDownSlot && draggedStack == null) {
ItemStack item = hoverSlot.item;
if (NEIController.manager.window instanceof GuiRecipe || !NEIClientConfig.canCheatItem(item)) {
if (button == 0)
GuiCraftingRecipe.openRecipeGui("item", item);
else if (button == 1)
GuiUsageRecipe.openRecipeGui("item", item);
mouseDownSlot = -1;
return;
}
NEIClientUtils.cheatItem(getDraggedStackWithQuantity(hoverSlot.slotIndex), button, -1);
}
mouseDownSlot = -1;
}
@Override
public boolean onMouseWheel(int i, int mousex, int mousey) {
if (!contains(mousex, mousey))
return false;
grid.shiftPage(-i);
return true;
}
@Override
public boolean handleKeyPress(int keyID, char keyChar) {
if (keyID == NEIClientConfig.getKeyBinding("gui.next")) {
grid.shiftPage(1);
return true;
}
if (keyID == NEIClientConfig.getKeyBinding("gui.prev")) {
grid.shiftPage(-1);
return true;
}
return false;
}
@Override
public ItemStack getStackMouseOver(int mousex, int mousey) {
ItemPanelSlot slot = getSlotMouseOver(mousex, mousey);
return slot == null ? null : slot.item;
}
public ItemPanelSlot getSlotMouseOver(int mousex, int mousey)
{
return grid.getSlotMouseOver(mousex, mousey);
}
public int getPage() {
return grid.page + 1;
}
public int getNumPages() {
return grid.numPages;
}
@Override
public boolean contains(int px, int py)
{
return grid.contains(px, py);
}
}
@@ -1,10 +1,12 @@
package codechicken.nei;
public class ItemQuantityField extends TextField
{
import static codechicken.nei.NEIClientUtils.translate;
public class ItemQuantityField extends TextField {
public ItemQuantityField(String ident) {
super(ident);
centered = true;
field.setDisabledTextColour(0xFF303030);
}
public int intValue() {
@@ -35,4 +37,18 @@ public class ItemQuantityField extends TextField
public void onTextChange(String oldText) {
NEIClientUtils.setItemQuantity(intValue());
}
@Override
public void draw(int mousex, int mousey) {
if (!focused() && intValue() == 0) {
field.setText(translate("itempanel.quantity.default"));
field.setEnabled(false);
super.draw(mousex, mousey);
field.setEnabled(true);
field.setText("0");
} else {
super.draw(mousex, mousey);
}
}
}
+25 -35
View File
@@ -6,19 +6,16 @@ import codechicken.nei.api.API;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.config.GuiItemSorter;
import codechicken.nei.config.OptionOpenGui;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.StatCollector;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.StatCollector;
public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
{
public static class SortEntry
{
public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback {
public static class SortEntry {
public final String name;
public final Comparator<ItemStack> comparator;
@@ -32,7 +29,7 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
}
public String getTooltip() {
String tipname = name+".tip";
String tipname = name + ".tip";
String tip = StatCollector.translateToLocal(tipname);
return !tip.equals(tipname) ? tip : null;
}
@@ -42,12 +39,13 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
public static ArrayList<SortEntry> list = new ArrayList<>();
public static final ItemSorter instance = new ItemSorter();
//optimisations
// optimisations
public HashMap<ItemStack, Integer> ordering = null;
public static void sort(ArrayList<ItemStack> items) {
try {
// items = (ArrayList<ItemStack>) items.parallelStream().sorted(instance).collect(Collectors.toList());
// items = (ArrayList<ItemStack>)
// items.parallelStream().sorted(instance).collect(Collectors.toList());
items.sort(instance);
} catch (Exception e) {
NEIClientConfig.logger.error("Exception sorting item list", e);
@@ -56,9 +54,9 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
@Override
public int compare(ItemStack o1, ItemStack o2) {
for(SortEntry e : list) {
for (SortEntry e : list) {
int c = e.comparator.compare(o1, o2);
if(c != 0) return c;
if (c != 0) return c;
}
return 0;
}
@@ -67,15 +65,12 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
public void itemsLoaded() {
HashMap<ItemStack, Integer> newMap = new HashMap<>();
int i = 0;
for(ItemStack stack : ItemList.items)
newMap.put(stack, i++);
for (ItemStack stack : ItemList.items) newMap.put(stack, i++);
ordering = newMap;
}
public static SortEntry find(String name) {
for(SortEntry e : entries)
if(e.name.equals(name))
return e;
for (SortEntry e : entries) if (e.name.equals(name)) return e;
return null;
}
@@ -89,11 +84,11 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
entries.add(e);
ArrayList<SortEntry> nlist = new ArrayList<>(list);
nlist.add(e);
list = nlist;//concurrency
list = nlist; // concurrency
}
public static void initConfig(ConfigTagParent tag) {
//minecraft, mod, id, default, meta, name
// minecraft, mod, id, default, meta, name
API.addSortOption("nei.itemsort.minecraft", (o1, o2) -> {
boolean m1 = "minecraft".equals(ItemInfo.itemOwners.get(o1.getItem()));
boolean m2 = "minecraft".equals(ItemInfo.itemOwners.get(o2.getItem()));
@@ -102,8 +97,8 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
API.addSortOption("nei.itemsort.mod", (o1, o2) -> {
String mod1 = ItemInfo.itemOwners.get(o1.getItem());
String mod2 = ItemInfo.itemOwners.get(o2.getItem());
if(mod1 == null) return mod2 == null ? 0 : 1;
if(mod2 == null) return -1;
if (mod1 == null) return mod2 == null ? 0 : 1;
if (mod2 == null) return -1;
return mod1.compareTo(mod2);
});
API.addSortOption("nei.itemsort.id", (o1, o2) -> {
@@ -114,8 +109,8 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
API.addSortOption("nei.itemsort.default", (o1, o2) -> {
Integer order1 = instance.ordering.get(o1);
Integer order2 = instance.ordering.get(o2);
if(order1 == null) return order2 == null ? 0 : 1;
if(order2 == null) return -1;
if (order1 == null) return order2 == null ? 0 : 1;
if (order2 == null) return -1;
return compareInt(order1, order2);
});
API.addSortOption("nei.itemsort.damage", (o1, o2) -> {
@@ -141,27 +136,22 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
public static String getSaveString(List<SortEntry> list) {
StringBuilder sb = new StringBuilder();
for(SortEntry e : list) {
if(sb.length() > 0)
sb.append(',');
for (SortEntry e : list) {
if (sb.length() > 0) sb.append(',');
sb.append(e.name);
}
return sb.toString();
}
public static ArrayList<SortEntry> fromSaveString(String s) {
if(s == null)
return new ArrayList<>(entries);
if (s == null) return new ArrayList<>(entries);
ArrayList<SortEntry> list = new ArrayList<>();
for(String s2 : s.split(",")) {
for (String s2 : s.split(",")) {
SortEntry e = find(s2.trim());
if(e != null)
list.add(e);
if (e != null) list.add(e);
}
for(SortEntry e : entries)
if(!list.contains(e))
list.add(e);
for (SortEntry e : entries) if (!list.contains(e)) list.add(e);
return list;
}
+42 -62
View File
@@ -1,26 +1,23 @@
package codechicken.nei;
import com.google.common.base.Objects;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import static codechicken.lib.inventory.InventoryUtils.actualDamage;
import static codechicken.lib.inventory.InventoryUtils.newItemStack;
import static net.minecraftforge.oredict.OreDictionary.WILDCARD_VALUE;
import com.google.common.base.Objects;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
/**
* A maplike class for ItemStack keys with wildcard damage/NBT. Optimised for lookup
*/
public class ItemStackMap<T>
{
public static class StackMetaKey
{
public class ItemStackMap<T> {
public static class StackMetaKey {
public final int damage;
public final NBTTagCompound tag;
@@ -38,15 +35,13 @@ public class ItemStackMap<T>
}
public boolean equals(Object o) {
if (!(o instanceof StackMetaKey))
return false;
if (!(o instanceof StackMetaKey)) return false;
StackMetaKey t = (StackMetaKey) o;
return damage == t.damage && Objects.equal(tag, t.tag);
}
}
public static class Entry<T>
{
public static class Entry<T> {
public final ItemStack key;
public final T value;
@@ -56,8 +51,7 @@ public class ItemStackMap<T>
}
}
public class DetailMap
{
public class DetailMap {
private boolean hasWildcard;
private T wildcard;
private HashMap<Integer, T> damageMap;
@@ -66,8 +60,7 @@ public class ItemStackMap<T>
private int size;
public T get(ItemStack key) {
if (wildcard != null)
return wildcard;
if (wildcard != null) return wildcard;
if (damageMap != null) {
final T ret = damageMap.get(actualDamage(key));
@@ -77,8 +70,7 @@ public class ItemStackMap<T>
final T ret = tagMap.get(key.stackTagCompound);
if (ret != null) return ret;
}
if (metaMap != null)
return metaMap.get(new StackMetaKey(key));
if (metaMap != null) return metaMap.get(new StackMetaKey(key));
return null;
}
@@ -129,45 +121,36 @@ public class ItemStackMap<T>
}
private void updateSize() {
int newSize = (hasWildcard ? 1 : 0) +
(metaMap != null ? metaMap.size() : 0) +
(tagMap != null ? tagMap.size() : 0) +
(damageMap != null ? damageMap.size() : 0);
int newSize = (hasWildcard ? 1 : 0)
+ (metaMap != null ? metaMap.size() : 0)
+ (tagMap != null ? tagMap.size() : 0)
+ (damageMap != null ? damageMap.size() : 0);
if(newSize != size) {
ItemStackMap.this.size += newSize-size;
if (newSize != size) {
ItemStackMap.this.size += newSize - size;
size = newSize;
}
}
public void addKeys(Item item, List<ItemStack> list) {
if (wildcard != null)
list.add(wildcard(item));
if (wildcard != null) list.add(wildcard(item));
if (damageMap != null)
for (int damage : damageMap.keySet())
list.add(newItemStack(item, 1, damage, WILDCARD_TAG));
for (int damage : damageMap.keySet()) list.add(newItemStack(item, 1, damage, WILDCARD_TAG));
if (tagMap != null)
for (NBTTagCompound tag : tagMap.keySet())
list.add(newItemStack(item, 1, WILDCARD_VALUE, tag));
for (NBTTagCompound tag : tagMap.keySet()) list.add(newItemStack(item, 1, WILDCARD_VALUE, tag));
if (metaMap != null)
for (StackMetaKey key : metaMap.keySet())
list.add(newItemStack(item, 1, key.damage, key.tag));
for (StackMetaKey key : metaMap.keySet()) list.add(newItemStack(item, 1, key.damage, key.tag));
}
public void addValues(List<T> list) {
if (wildcard != null)
list.add(wildcard);
if (damageMap != null)
list.addAll(damageMap.values());
if (tagMap != null)
list.addAll(tagMap.values());
if (metaMap != null)
list.addAll(metaMap.values());
if (wildcard != null) list.add(wildcard);
if (damageMap != null) list.addAll(damageMap.values());
if (tagMap != null) list.addAll(tagMap.values());
if (metaMap != null) list.addAll(metaMap.values());
}
public void addEntries(Item item, List<Entry<T>> list) {
if (wildcard != null)
list.add(new Entry<>(newItemStack(item, 1, WILDCARD_VALUE, WILDCARD_TAG), wildcard));
if (wildcard != null) list.add(new Entry<>(newItemStack(item, 1, WILDCARD_VALUE, WILDCARD_TAG), wildcard));
if (damageMap != null)
for (Map.Entry<Integer, T> entry : damageMap.entrySet())
list.add(new Entry<>(newItemStack(item, 1, entry.getKey(), WILDCARD_TAG), entry.getValue()));
@@ -176,16 +159,17 @@ public class ItemStackMap<T>
list.add(new Entry<>(newItemStack(item, 1, WILDCARD_VALUE, entry.getKey()), entry.getValue()));
if (metaMap != null)
for (Map.Entry<StackMetaKey, T> entry : metaMap.entrySet())
list.add(new Entry<>(newItemStack(item, 1, entry.getKey().damage, entry.getKey().tag), entry.getValue()));
list.add(new Entry<>(
newItemStack(item, 1, entry.getKey().damage, entry.getKey().tag), entry.getValue()));
}
}
public static int getKeyType(int damage, NBTTagCompound tag) {
int i = 0;
if (isWildcard(damage)) i = 1;
if (isWildcard(tag)) i |= 2;
return i;
}
int i = 0;
if (isWildcard(damage)) i = 1;
if (isWildcard(tag)) i |= 2;
return i;
}
public static ItemStack wildcard(Item item) {
return newItemStack(item, 1, WILDCARD_VALUE, WILDCARD_TAG);
@@ -219,12 +203,10 @@ public class ItemStackMap<T>
}
public void put(ItemStack key, T value) {
if (key == null || key.getItem() == null)
return;
if (key == null || key.getItem() == null) return;
DetailMap map = itemMap.get(key.getItem());
if (map == null)
itemMap.put(key.getItem(), map = new DetailMap());
if (map == null) itemMap.put(key.getItem(), map = new DetailMap());
map.put(key, value);
}
@@ -233,8 +215,7 @@ public class ItemStackMap<T>
}
public T remove(ItemStack key) {
if (key == null || key.getItem() == null)
return null;
if (key == null || key.getItem() == null) return null;
DetailMap map = itemMap.get(key.getItem());
return map == null ? null : map.remove(key);
@@ -249,8 +230,7 @@ public class ItemStackMap<T>
public List<T> values() {
LinkedList<T> list = new LinkedList<>();
for (DetailMap map : itemMap.values())
map.addValues(list);
for (DetailMap map : itemMap.values()) map.addValues(list);
return list;
}
@@ -5,23 +5,19 @@ import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
public class ItemStackSet extends ItemStackMap<ItemStack> implements ItemFilter
{
public class ItemStackSet extends ItemStackMap<ItemStack> implements ItemFilter {
public ItemStackSet with(ItemStack... items) {
for(ItemStack item : items)
add(item);
for (ItemStack item : items) add(item);
return this;
}
public ItemStackSet with(Item... items) {
for(Item item : items)
add(ItemStackMap.wildcard(item));
for (Item item : items) add(ItemStackMap.wildcard(item));
return this;
}
public ItemStackSet with(Block... blocks) {
for(Block block : blocks)
add(ItemStackMap.wildcard(Item.getItemFromBlock(block)));
for (Block block : blocks) add(ItemStackMap.wildcard(Item.getItemFromBlock(block)));
return this;
}
+187 -106
View File
@@ -1,19 +1,26 @@
package codechicken.nei;
import codechicken.lib.vec.Rectangle4i;
import codechicken.nei.api.GuiInfo;
import codechicken.nei.guihook.GuiContainerManager;
import codechicken.nei.recipe.StackInfo;
import codechicken.nei.ItemPanel.ItemPanelSlot;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.item.ItemStack;
import java.util.ArrayList;
import static codechicken.lib.gui.GuiDraw.drawRect;
public class ItemsGrid
{
import codechicken.lib.vec.Rectangle4i;
import codechicken.nei.ItemPanel.ItemPanelSlot;
import codechicken.nei.api.GuiInfo;
import codechicken.nei.guihook.GuiContainerManager;
import codechicken.nei.recipe.StackInfo;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Nullable;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.shader.Framebuffer;
import net.minecraft.item.ItemStack;
import org.lwjgl.opengl.GL11;
public class ItemsGrid {
public static final int SLOT_SIZE = 18;
protected int width;
@@ -22,37 +29,36 @@ public class ItemsGrid
protected int marginLeft;
protected int marginTop;
protected int paddingLeft;
protected ArrayList<ItemStack> realItems = new ArrayList<>();
protected int page;
protected int perPage;
protected int firstIndex;
protected int numPages;
protected int rows;
protected int columns;
protected boolean[] validSlotMap;
protected boolean[] invalidSlotMap;
public ArrayList<ItemStack> getItems()
{
@Nullable
private Framebuffer framebuffer = null;
protected boolean refreshBuffer = true;
public ArrayList<ItemStack> getItems() {
return realItems;
}
public ItemStack getItem(int idx)
{
public ItemStack getItem(int idx) {
return realItems.get(idx);
}
public int size()
{
public int size() {
return realItems.size();
}
public int indexOf(ItemStack stackA, boolean useNBT)
{
public int indexOf(ItemStack stackA, boolean useNBT) {
for (int idx = 0; idx < realItems.size(); idx++) {
if (StackInfo.equalItemAndNBT(stackA, realItems.get(idx), useNBT)) {
@@ -63,34 +69,31 @@ public class ItemsGrid
return -1;
}
public int getPage()
{
public int getPage() {
return page + 1;
}
public int getPerPage()
{
public int getPerPage() {
return perPage;
}
public int getNumPages()
{
return numPages;
public int getNumPages() {
if (perPage > 0) {
return (int) Math.ceil((float) realItems.size() / (float) perPage);
}
return 0;
}
public int getRows()
{
public int getRows() {
return rows;
}
public int getColumns()
{
public int getColumns() {
return columns;
}
public void setGridSize(int mleft, int mtop, int w, int h)
{
public void setGridSize(int mleft, int mtop, int w, int h) {
marginLeft = mleft;
marginTop = mtop;
@@ -100,18 +103,17 @@ public class ItemsGrid
columns = width / SLOT_SIZE;
rows = height / SLOT_SIZE;
paddingLeft = (width % SLOT_SIZE) / 2;
}
public void shiftPage(int shift)
{
public void shiftPage(int shift) {
if (perPage == 0) {
numPages = 0;
page = 0;
return;
}
numPages = (int) Math.ceil((float) realItems.size() / (float) perPage);
final int numPages = getNumPages();
final int oldPage = page;
page += shift;
if (page >= numPages) {
@@ -123,26 +125,38 @@ public class ItemsGrid
}
page = Math.max(0, Math.min(page, numPages - 1));
if (page != oldPage) {
onGridChanged();
}
}
public void refresh(GuiContainer gui)
{
protected void onGridChanged() {
refreshBuffer = true;
}
public void refresh(GuiContainer gui) {
updateGuiOverlapSlots(gui);
shiftPage(0);
}
private void updateGuiOverlapSlots(GuiContainer gui)
{
protected void updateGuiOverlapSlots(GuiContainer gui) {
final boolean[] oldSlotMap = invalidSlotMap;
final int oldRows = rows;
final int oldColumns = columns;
invalidSlotMap = new boolean[rows * columns];
perPage = columns * rows;
checkGuiOverlap(gui, 0, columns - 2, 1);
checkGuiOverlap(gui, columns - 1, 1, -1);
if (oldRows != rows || oldColumns != columns || !Arrays.equals(oldSlotMap, invalidSlotMap)) {
onGridChanged();
}
}
private void checkGuiOverlap(GuiContainer gui, int start, int end, int dir)
{
private void checkGuiOverlap(GuiContainer gui, int start, int end, int dir) {
boolean validColumn = false;
for (int c = start; c != end && !validColumn; c += dir) {
@@ -150,118 +164,185 @@ public class ItemsGrid
for (int r = 0; r < rows; r++) {
final int idx = columns * r + c;
if (!slotValid(gui, r, c) && idx >= 0 && idx < invalidSlotMap.length && !invalidSlotMap[idx]) {
if (GuiInfo.hideItemPanelSlot(gui, getSlotRect(r, c))
&& idx >= 0
&& idx < invalidSlotMap.length
&& !invalidSlotMap[idx]) {
invalidSlotMap[idx] = true;
validColumn = false;
perPage--;
}
}
}
}
private boolean slotValid(GuiContainer gui, int row, int column)
{
Rectangle4i rect = getSlotRect(row, column);
try {
GuiInfo.readLock.lock();
if (GuiInfo.guiHandlers.stream().anyMatch(handler -> handler.hideItemPanelSlot(gui, rect.x, rect.y, rect.w, rect.h))) {
return false;
public Rectangle4i getItemRect(int idx) {
final List<Integer> mask = getMask();
for (int i = 0; i < mask.size(); i++) {
if (mask.get(i) != null && idx == mask.get(i)) {
return getSlotRect(i);
}
} finally {
GuiInfo.readLock.unlock();
}
return true;
return null;
}
public Rectangle4i getSlotRect(int i)
{
public Rectangle4i getSlotRect(int i) {
return getSlotRect(i / columns, i % columns);
}
public Rectangle4i getSlotRect(int row, int column)
{
return new Rectangle4i(marginLeft + (width % SLOT_SIZE) / 2 + column * SLOT_SIZE, marginTop + row * SLOT_SIZE, SLOT_SIZE, SLOT_SIZE);
public Rectangle4i getSlotRect(int row, int column) {
return new Rectangle4i(
marginLeft + paddingLeft + column * SLOT_SIZE, marginTop + row * SLOT_SIZE, SLOT_SIZE, SLOT_SIZE);
}
public boolean isInvalidSlot(int idx)
{
return invalidSlotMap[idx];
public boolean isInvalidSlot(int index) {
return invalidSlotMap[index];
}
public void draw(int mousex, int mousey)
{
if (getPerPage() == 0) {
return;
}
ItemPanelSlot slot = getSlotMouseOver(mousex, mousey);
GuiContainerManager.enableMatrixStackLogging();
protected List<Integer> getMask() {
List<Integer> mask = new ArrayList<>();
int idx = page * perPage;
for (int i = 0; i < rows * columns && idx < size(); i++) {
mask.add(isInvalidSlot(i) ? null : idx++);
}
if (!invalidSlotMap[i]) {
drawItem(getSlotRect(i), idx, slot);
idx ++;
return mask;
}
private void drawSlotOutlines(int mousex, int mousey) {
ItemPanelSlot focused = getSlotMouseOver(mousex, mousey);
final List<Integer> mask = getMask();
for (int i = 0; i < mask.size(); i++) {
if (mask.get(i) != null) {
drawSlotOutline(focused, mask.get(i), getSlotRect(i));
}
}
}
protected void drawSlotOutline(@Nullable ItemPanelSlot focused, int slotIdx, Rectangle4i rect) {
if (focused != null && focused.slotIndex == slotIdx) {
drawRect(rect.x, rect.y, rect.w, rect.h, 0xee555555); // highlight
}
}
private void blitExistingBuffer() {
Minecraft minecraft = Minecraft.getMinecraft();
GL11.glEnable(GL11.GL_BLEND);
OpenGlHelper.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
getFrameBuffer().bindFramebufferTexture();
GL11.glEnable(GL11.GL_TEXTURE_2D);
ScaledResolution res = new ScaledResolution(minecraft, minecraft.displayWidth, minecraft.displayHeight);
Tessellator tessellator = Tessellator.instance;
tessellator.startDrawingQuads();
tessellator.addVertexWithUV(0, res.getScaledHeight_double(), 0.0, 0, 0);
tessellator.addVertexWithUV(res.getScaledWidth_double(), res.getScaledHeight_double(), 0.0, 1, 0);
tessellator.addVertexWithUV(res.getScaledWidth_double(), 0, 0.0, 1, 1);
tessellator.addVertexWithUV(0, 0, 0, 0, 1);
tessellator.draw();
OpenGlHelper.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
}
private Framebuffer getFrameBuffer() {
if (framebuffer == null) {
framebuffer = new Framebuffer(1, 1, true);
framebuffer.setFramebufferColor(0.0F, 0.0F, 0.0F, 0.0F);
}
return framebuffer;
}
private void drawItems() {
GuiContainerManager.enableMatrixStackLogging();
final List<Integer> mask = getMask();
for (int i = 0; i < mask.size(); i++) {
if (mask.get(i) != null) {
drawItem(getSlotRect(i), mask.get(i));
}
}
GuiContainerManager.disableMatrixStackLogging();
}
protected void drawItem(Rectangle4i rect, int idx, ItemPanelSlot focus)
{
if (focus != null && focus.slotIndex == idx) {
drawRect(rect.x, rect.y, rect.w, rect.h, 0xee555555);//highlight
public void draw(int mousex, int mousey) {
if (getPerPage() == 0) {
return;
}
if (NEIClientConfig.shouldCacheItemRendering()) {
if (refreshBuffer) {
Minecraft minecraft = Minecraft.getMinecraft();
Framebuffer framebuffer = getFrameBuffer();
framebuffer.createBindFramebuffer(minecraft.displayWidth, minecraft.displayHeight);
framebuffer.framebufferClear();
framebuffer.bindFramebuffer(false);
/* Set up some rendering state needed for items to work correctly */
GL11.glDisable(GL11.GL_BLEND);
GL11.glDepthMask(true);
OpenGlHelper.glBlendFunc(
GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
drawItems();
Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(false);
refreshBuffer = false;
}
drawSlotOutlines(mousex, mousey);
blitExistingBuffer();
} else {
drawSlotOutlines(mousex, mousey);
drawItems();
}
}
protected void drawItem(Rectangle4i rect, int idx) {
GuiContainerManager.drawItem(rect.x + 1, rect.y + 1, getItem(idx));
}
public ItemPanelSlot getSlotMouseOver(int mousex, int mousey)
{
public ItemPanelSlot getSlotMouseOver(int mousex, int mousey) {
if (!contains(mousex, mousey)) {
return null;
}
final int overRow = (int) ((mousey - marginTop) / SLOT_SIZE);
final int overColumn = (int) ((mousex - marginLeft - (width % SLOT_SIZE) / 2) / SLOT_SIZE);
final int overColumn = (int) ((mousex - marginLeft - paddingLeft) / SLOT_SIZE);
final int slt = columns * overRow + overColumn;
int idx = page * perPage + slt;
if (overRow >= rows || overColumn >= columns) {
return null;
}
for (int i = 0; i < slt; i++) {
if (invalidSlotMap[i]) {
idx--;
}
final List<Integer> mask = getMask();
if (mask.size() > slt && mask.get(slt) != null) {
final int idx = mask.get(slt);
return new ItemPanelSlot(idx, getItem(idx));
}
return idx < size()? new ItemPanelSlot(idx, realItems.get(idx)): null;
return null;
}
public boolean contains(int px, int py)
{
public boolean contains(int px, int py) {
if (!(new Rectangle4i(marginLeft, marginTop, width, height)).contains(px, py)) {
if (!(new Rectangle4i(marginLeft + paddingLeft, marginTop, columns * SLOT_SIZE, height)).contains(px, py)) {
return false;
}
final int r = (int) ((py - marginTop) / SLOT_SIZE);
final int c = (int) ((px - marginLeft - (width % SLOT_SIZE) / 2) / SLOT_SIZE);
final int c = (int) ((px - marginLeft - paddingLeft) / SLOT_SIZE);
final int slt = columns * r + c;
return r >= rows || c >= columns || !invalidSlotMap[slt];
return r >= rows || c >= columns || !isInvalidSlot(slt);
}
}
}
+16 -26
View File
@@ -1,7 +1,5 @@
package codechicken.nei;
import org.lwjgl.input.Keyboard;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map.Entry;
@@ -9,44 +7,36 @@ import java.util.Map.Entry;
/**
* Good old down/held/up keystate tracker
*/
public class KeyManager
{
public static interface IKeyStateTracker
{
public class KeyManager {
public static interface IKeyStateTracker {
public void tickKeyStates();
}
public static class KeyState
{
public static class KeyState {
public boolean down;
public boolean held;
public boolean up;
}
public static HashMap<String, KeyState> keyStates = new HashMap<>();
public static LinkedList<IKeyStateTracker> trackers = new LinkedList<>();
public static void tickKeyStates()
{
for(Entry<String, KeyState> entry : keyStates.entrySet())
{
int keyCode = NEIClientConfig.getKeyBinding(entry.getKey());
boolean down = keyCode != 0 && Keyboard.isKeyDown(keyCode);
KeyState state = entry.getValue();
if(down)
{
public static void tickKeyStates() {
for (Entry<String, KeyState> entry : keyStates.entrySet()) {
final boolean down = NEIClientConfig.isKeyHashDown(entry.getKey());
final KeyState state = entry.getValue();
if (down) {
state.down = !state.held;
state.up = false;
}
else
{
} else {
state.up = state.held;
state.down = false;
}
state.held = down;
}
for(IKeyStateTracker tracker : trackers)
tracker.tickKeyStates();
for (IKeyStateTracker tracker : trackers) tracker.tickKeyStates();
}
}
+9 -15
View File
@@ -3,30 +3,24 @@ package codechicken.nei;
import static codechicken.lib.gui.GuiDraw.drawString;
import static codechicken.lib.gui.GuiDraw.drawStringC;
public class Label extends Widget
{
public class Label extends Widget {
final boolean centered;
final int colour;
public String text;
public Label(String s, boolean center, int color)
{
public Label(String s, boolean center, int color) {
text = s;
centered = center;
colour = color;
}
public Label(String s, boolean center)
{
public Label(String s, boolean center) {
this(s, center, 0xFFFFFFFF);
}
@Override
public void draw(int mousex, int mousey)
{
if(centered)
drawStringC(text, x, y, colour);
else
drawString(text, x, y, colour);
public void draw(int mousex, int mousey) {
if (centered) drawStringC(text, x, y, colour);
else drawString(text, x, y, colour);
}
}
+177 -267
View File
@@ -1,44 +1,10 @@
package codechicken.nei;
import codechicken.lib.gui.GuiDraw;
import codechicken.nei.KeyManager.IKeyStateTracker;
import codechicken.nei.api.API;
import codechicken.nei.api.GuiInfo;
import codechicken.nei.api.IRecipeOverlayRenderer;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.api.LayoutStyle;
import codechicken.nei.drawable.DrawableBuilder;
import codechicken.nei.drawable.DrawableResource;
import codechicken.nei.guihook.GuiContainerManager;
import codechicken.nei.guihook.IContainerDrawHandler;
import codechicken.nei.guihook.IContainerInputHandler;
import codechicken.nei.guihook.IContainerObjectHandler;
import codechicken.nei.guihook.IContainerTooltipHandler;
import codechicken.nei.recipe.GuiRecipeTab;
import codechicken.nei.recipe.RecipeCatalysts;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.gui.inventory.GuiContainerCreative;
import net.minecraft.client.renderer.InventoryEffectRenderer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
import java.util.HashMap;
import java.util.List;
import java.util.TreeSet;
import static codechicken.lib.gui.GuiDraw.changeTexture;
import static codechicken.lib.gui.GuiDraw.drawRect;
import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect;
import static codechicken.nei.NEIClientConfig.canPerformAction;
import static codechicken.nei.NEIClientConfig.disabledActions;
import static codechicken.nei.NEIClientConfig.getItemQuantity;
import static codechicken.nei.NEIClientConfig.getKeyBinding;
import static codechicken.nei.NEIClientConfig.getOptionList;
import static codechicken.nei.NEIClientConfig.getSearchExpression;
import static codechicken.nei.NEIClientConfig.hasSMPCounterPart;
@@ -49,7 +15,6 @@ import static codechicken.nei.NEIClientConfig.isHidden;
import static codechicken.nei.NEIClientConfig.showIDs;
import static codechicken.nei.NEIClientConfig.toggleBooleanSetting;
import static codechicken.nei.NEIClientConfig.world;
import static codechicken.nei.NEIClientUtils.controlKey;
import static codechicken.nei.NEIClientUtils.cycleGamemode;
import static codechicken.nei.NEIClientUtils.decreaseSlotStack;
import static codechicken.nei.NEIClientUtils.deleteEverything;
@@ -67,8 +32,43 @@ import static codechicken.nei.NEIClientUtils.toggleMagnetMode;
import static codechicken.nei.NEIClientUtils.toggleRaining;
import static codechicken.nei.NEIClientUtils.translate;
public class LayoutManager implements IContainerInputHandler, IContainerTooltipHandler, IContainerDrawHandler, IContainerObjectHandler, IKeyStateTracker
{
import codechicken.lib.gui.GuiDraw;
import codechicken.nei.KeyManager.IKeyStateTracker;
import codechicken.nei.api.API;
import codechicken.nei.api.GuiInfo;
import codechicken.nei.api.IRecipeOverlayRenderer;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.api.LayoutStyle;
import codechicken.nei.drawable.DrawableBuilder;
import codechicken.nei.drawable.DrawableResource;
import codechicken.nei.guihook.GuiContainerManager;
import codechicken.nei.guihook.IContainerDrawHandler;
import codechicken.nei.guihook.IContainerInputHandler;
import codechicken.nei.guihook.IContainerObjectHandler;
import codechicken.nei.guihook.IContainerTooltipHandler;
import codechicken.nei.recipe.GuiRecipeTab;
import codechicken.nei.recipe.RecipeCatalysts;
import java.util.HashMap;
import java.util.List;
import java.util.TreeSet;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.gui.inventory.GuiContainerCreative;
import net.minecraft.client.renderer.InventoryEffectRenderer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
public class LayoutManager
implements IContainerInputHandler,
IContainerTooltipHandler,
IContainerDrawHandler,
IContainerObjectHandler,
IKeyStateTracker {
private static LayoutManager instance;
/** Note: this variable isn't actually used by this mod, but NEI add-ons might need it. */
@@ -87,13 +87,18 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
public static BookmarkPanel bookmarkPanel;
public static SubsetWidget dropDown;
public static PresetsWidget presetsPanel;
public static TextField searchField;
public static SearchField searchField;
public static ButtonCycled options;
public static ButtonCycled bookmarksButton;
@Deprecated
public static Button more;
@Deprecated
public static Button less;
@Deprecated
public static ItemQuantityField quantity;
public static Button delete;
@@ -128,7 +133,12 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
@Override
public void onPreDraw(GuiContainer gui) {
if (!isHidden() && isEnabled() && gui instanceof InventoryEffectRenderer)//Reset the gui to the center of the screen, for potion effect offsets etc
if (!isHidden()
&& isEnabled()
&& gui
instanceof
InventoryEffectRenderer) // Reset the gui to the center of the screen, for potion effect offsets
// etc
{
gui.guiLeft = (gui.width - gui.xSize) / 2;
gui.guiTop = (gui.height - gui.ySize) / 2;
@@ -142,34 +152,34 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
}
}
@Deprecated
public static int getSideWidth(GuiContainer gui) {
return gui.width - 3;
}
@Deprecated
public static int getLeftSize(GuiContainer gui) {
return getSideWidth(gui);
}
@Override
public void onMouseClicked(GuiContainer gui, int mousex, int mousey, int button) {
if (isHidden())
return;
if (isHidden()) return;
for (Widget widget : controlWidgets)
widget.onGuiClick(mousex, mousey);
for (Widget widget : controlWidgets) widget.onGuiClick(mousex, mousey);
}
@Override
public boolean mouseClicked(GuiContainer gui, int mousex, int mousey, int button) {
if (isHidden())
return false;
if (isHidden()) return false;
if (!isEnabled())
return options.contains(mousex, mousey) && options.handleClick(mousex, mousey, button);
if (!isEnabled()) return options.contains(mousex, mousey) && options.handleClick(mousex, mousey, button);
for (Widget widget : controlWidgets) {
widget.onGuiClick(mousex, mousey);
if (widget.contains(mousex, mousey) ? widget.handleClick(mousex, mousey, button) : widget.handleClickExt(mousex, mousey, button))
return true;
if (widget.contains(mousex, mousey)
? widget.handleClick(mousex, mousey, button)
: widget.handleClickExt(mousex, mousey, button)) return true;
}
return false;
@@ -178,61 +188,54 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
@Override
public boolean objectUnderMouse(GuiContainer gui, int mousex, int mousey) {
if (!isHidden() && isEnabled())
for (Widget widget : drawWidgets)
if (widget.contains(mousex, mousey))
return true;
for (Widget widget : drawWidgets) if (widget.contains(mousex, mousey)) return true;
return false;
}
public boolean keyTyped(GuiContainer gui, char keyChar, int keyID) {
if (isEnabled() && !isHidden()) {
if (inputFocused != null)
return inputFocused.handleKeyPress(keyID, keyChar);
if (inputFocused != null) return inputFocused.handleKeyPress(keyID, keyChar);
for (Widget widget : controlWidgets)
if (widget.handleKeyPress(keyID, keyChar))
return true;
for (Widget widget : controlWidgets) if (widget.handleKeyPress(keyID, keyChar)) return true;
}
return false;
}
@Override
public void onKeyTyped(GuiContainer gui, char keyChar, int keyID) {
}
public void onKeyTyped(GuiContainer gui, char keyChar, int keyID) {}
@Override
public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyID) {
if (keyID == getKeyBinding("gui.hide")) {
if (NEIClientConfig.isKeyHashDown("gui.hide")) {
toggleBooleanSetting("inventory.hidden");
return true;
}
if (keyID == getKeyBinding("gui.hide_bookmarks")) {
if (NEIClientConfig.isKeyHashDown("gui.hide_bookmarks")) {
toggleBooleanSetting("inventory.bookmarksEnabled");
return true;
}
if (isEnabled() && !isHidden()) {
for (Widget widget : controlWidgets)
if (inputFocused == null)
widget.lastKeyTyped(keyID, keyChar);
for (Widget widget : controlWidgets) if (inputFocused == null) widget.lastKeyTyped(keyID, keyChar);
}
return false;
}
public void onMouseUp(GuiContainer gui, int mx, int my, int button) {
if (!isHidden() && isEnabled()) {
for (Widget widget : controlWidgets)
widget.mouseUp(mx, my, button);
for (Widget widget : controlWidgets) widget.mouseUp(mx, my, button);
}
}
@Override
public void onMouseDragged(GuiContainer gui, int mx, int my, int button, long heldTime) {
if (!isHidden() && isEnabled()) {
for (Widget widget : controlWidgets)
widget.mouseDragged(mx, my, button, heldTime);
for (Widget widget : controlWidgets) widget.mouseDragged(mx, my, button, heldTime);
}
}
@@ -241,8 +244,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
if (!isHidden() && isEnabled()) {
for (Widget widget : drawWidgets) {
ItemStack stack = widget.getStackMouseOver(mousex, mousey);
if (stack != null)
return stack;
if (stack != null) return stack;
}
}
return null;
@@ -253,8 +255,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
layout(gui);
if (isEnabled()) {
getLayoutStyle().drawBackground(GuiContainerManager.getManager(gui));
for (Widget widget : drawWidgets)
widget.draw(mousex, mousey);
for (Widget widget : drawWidgets) widget.draw(mousex, mousey);
} else {
options.draw(mousex, mousey);
bookmarksButton.draw(mousex, mousey);
@@ -268,16 +269,14 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
@Override
public void postRenderObjects(GuiContainer gui, int mousex, int mousey) {
if (!isHidden() && isEnabled()) {
for (Widget widget : drawWidgets)
widget.postDraw(mousex, mousey);
for (Widget widget : drawWidgets) widget.postDraw(mousex, mousey);
}
}
@Override
public List<String> handleTooltip(GuiContainer gui, int mousex, int mousey, List<String> currenttip) {
if (!isHidden() && isEnabled() && GuiContainerManager.shouldShowTooltip(gui)) {
for (Widget widget : drawWidgets)
currenttip = widget.handleTooltip(mousex, mousey, currenttip);
for (Widget widget : drawWidgets) currenttip = widget.handleTooltip(mousex, mousey, currenttip);
}
return currenttip;
}
@@ -285,14 +284,12 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
@Override
public List<String> handleItemDisplayName(GuiContainer gui, ItemStack stack, List<String> currenttip) {
String overridename = ItemInfo.getNameOverride(stack);
if (overridename != null)
currenttip.set(0, overridename);
if (overridename != null) currenttip.set(0, overridename);
String mainname = currenttip.get(0);
if (showIDs()) {
mainname += " " + Item.getIdFromItem(stack.getItem());
if (stack.getItemDamage() != 0)
mainname += ":" + stack.getItemDamage();
if (stack.getItemDamage() != 0) mainname += ":" + stack.getItemDamage();
currenttip.set(0, mainname);
}
@@ -301,29 +298,26 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
}
@Override
public List<String> handleItemTooltip(GuiContainer gui, ItemStack itemstack, int mousex, int mousey, List<String> currenttip) {
public List<String> handleItemTooltip(
GuiContainer gui, ItemStack itemstack, int mousex, int mousey, List<String> currenttip) {
return currenttip;
}
public static void layout(GuiContainer gui) {
VisiblityData visiblity = new VisiblityData();
if (isHidden())
visiblity.showNEI = false;
if (isBookmarkPanelHidden())
visiblity.showBookmarkPanel = false;
if (isHidden()) visiblity.showNEI = false;
if (gui.height - gui.ySize <= 40)
visiblity.showSearchSection = false;
if (isBookmarkPanelHidden()) visiblity.showBookmarkPanel = false;
if (visiblity.showBookmarkPanel || gui.guiTop <= 20)
visiblity.showSubsetDropdown = false;
if (gui.height - gui.ySize <= 40) visiblity.showSearchSection = false;
if (!visiblity.showBookmarkPanel || gui.guiTop <= 20)
visiblity.showPresetsDropdown = false;
if (visiblity.showBookmarkPanel || gui.guiTop <= 20) visiblity.showSubsetDropdown = false;
if (!visiblity.showBookmarkPanel || gui.guiTop <= 20) visiblity.showPresetsDropdown = false;
if (gui.guiLeft - 4 < 76) visiblity.showWidgets = false;
if (gui.guiLeft - 4 < 76)
visiblity.showWidgets = false;
try {
GuiInfo.readLock.lock();
GuiInfo.guiHandlers.forEach(handler -> handler.modifyVisiblity(gui, visiblity));
@@ -349,8 +343,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
presetsPanel = new PresetsWidget();
searchField = new SearchField("search");
options = new ButtonCycled(3)
{
options = new ButtonCycled(3) {
@Override
public void init() {
this.icons[0] = new DrawableBuilder("nei:textures/nei_tabbed_sprites.png", 32, 0, 16, 16).build();
@@ -361,10 +354,14 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
@Override
public boolean onButtonPress(boolean rightclick) {
if (!rightclick) {
if (Keyboard.getEventKeyState() && (Keyboard.getEventKey() == Keyboard.KEY_LCONTROL || Keyboard.getEventKey() == Keyboard.KEY_RCONTROL)) {
if (Keyboard.getEventKeyState()
&& (Keyboard.getEventKey() == Keyboard.KEY_LCONTROL
|| Keyboard.getEventKey() == Keyboard.KEY_RCONTROL)) {
NEIClientConfig.cycleSetting("inventory.cheatmode", 3);
} else {
if (Keyboard.getEventKeyState() && (Keyboard.getEventKey() == Keyboard.KEY_LSHIFT || Keyboard.getEventKey() == Keyboard.KEY_RSHIFT)) {
if (Keyboard.getEventKeyState()
&& (Keyboard.getEventKey() == Keyboard.KEY_LSHIFT
|| Keyboard.getEventKey() == Keyboard.KEY_RSHIFT)) {
GuiRecipeTab.loadHandlerInfo();
RecipeCatalysts.loadCatalystInfo();
}
@@ -380,14 +377,11 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
tooltip.add(translate("inventory.options.tip"));
String modeColor = "";
final int cheatMode = NEIClientConfig.getCheatMode();
if (cheatMode == 1)
modeColor = EnumChatFormatting.GOLD.toString();
else if (cheatMode == 2)
modeColor = EnumChatFormatting.RED.toString();
if (cheatMode == 1) modeColor = EnumChatFormatting.GOLD.toString();
else if (cheatMode == 2) modeColor = EnumChatFormatting.RED.toString();
String controlKeyLocalization = translate(Minecraft.isRunningOnMac ? "key.ctrl.mac" : "key.ctrl");
tooltip.add(modeColor + translate("inventory.options.tip.cheatmode." + cheatMode));
tooltip.add(modeColor + translate("inventory.options.tip.cheatmode.disable", controlKeyLocalization));
}
@Override
@@ -396,8 +390,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
}
};
bookmarksButton = new ButtonCycled(2)
{
bookmarksButton = new ButtonCycled(2) {
@Override
public void init() {
this.icons[0] = new DrawableBuilder("nei:textures/nei_tabbed_sprites.png", 0, 0, 16, 16).build();
@@ -419,85 +412,48 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
return translate("bookmark.toggle");
}
};
more = new Button("+")
{
more = ItemPanels.itemPanel.more;
less = ItemPanels.itemPanel.less;
quantity = ItemPanels.itemPanel.quantity;
delete = new Button() {
@Override
public boolean onButtonPress(boolean rightclick) {
if (rightclick)
return false;
int modifier = controlKey() ? 64 : shiftKey() ? 10 : 1;
int quantity = getItemQuantity() + modifier;
if (quantity < 0)
quantity = 0;
LayoutManager.quantity.setText(Integer.toString(quantity));
return true;
}
};
less = new Button("-")
{
@Override
public boolean onButtonPress(boolean rightclick) {
if (rightclick)
return false;
int modifier = controlKey() ? -64 : shiftKey() ? -10 : -1;
int quantity = getItemQuantity() + modifier;
if (quantity < 0)
quantity = 0;
LayoutManager.quantity.setText(Integer.toString(quantity));
return true;
}
};
quantity = new ItemQuantityField("quantity");
delete = new Button()
{
@Override
public boolean onButtonPress(boolean rightclick) {
if ((state & 0x3) == 2)
return false;
if ((state & 0x3) == 2) return false;
ItemStack held = getHeldItem();
if (held != null) {
if (shiftKey()) {
deleteHeldItem();
deleteItemsOfType(held);
} else if (rightclick)
decreaseSlotStack(-999);
else
deleteHeldItem();
} else if (shiftKey())
deleteEverything();
else
NEIController.toggleDeleteMode();
} else if (rightclick) decreaseSlotStack(-999);
else deleteHeldItem();
} else if (shiftKey()) deleteEverything();
else NEIController.toggleDeleteMode();
return true;
}
public String getButtonTip() {
if ((state & 0x3) != 2) {
if (shiftKey())
return translate("inventory.delete.inv");
if (NEIController.canUseDeleteMode())
return getStateTip("delete", state);
if (shiftKey()) return translate("inventory.delete.inv");
if (NEIController.canUseDeleteMode()) return getStateTip("delete", state);
}
return null;
}
@Override
public void postDraw(int mousex, int mousey) {
if(contains(mousex, mousey) && getHeldItem() != null && (state & 0x3) != 2)
GuiDraw.drawTip(mousex + 9, mousey, translate("inventory.delete." + (shiftKey() ? "all" : "one"), GuiContainerManager.itemDisplayNameShort(getHeldItem())));
if (contains(mousex, mousey) && getHeldItem() != null && (state & 0x3) != 2)
GuiDraw.drawTip(
mousex + 9,
mousey,
translate(
"inventory.delete." + (shiftKey() ? "all" : "one"),
GuiContainerManager.itemDisplayNameShort(getHeldItem())));
}
};
gamemode = new ButtonCycled(3)
{
gamemode = new ButtonCycled(3) {
@Override
public boolean onButtonPress(boolean rightclick) {
if (!rightclick) {
@@ -506,18 +462,16 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
}
return false;
}
public void addTooltips(List<String> tooltip) {
tooltip.add(translate("inventory.current.gamemode." + getGamemode()));
tooltip.add(EnumChatFormatting.GRAY + translate("inventory.gamemode." + getNextGamemode()));
}
};
rain = new Button()
{
rain = new Button() {
@Override
public boolean onButtonPress(boolean rightclick) {
if (handleDisabledButtonPress("rain", rightclick))
return true;
if (handleDisabledButtonPress("rain", rightclick)) return true;
if (!rightclick) {
toggleRaining();
@@ -530,8 +484,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
return getStateTip("rain", state);
}
};
magnet = new Button()
{
magnet = new Button() {
@Override
public boolean onButtonPress(boolean rightclick) {
if (!rightclick) {
@@ -547,12 +500,10 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
};
for (int i = 0; i < 4; i++) {
final int zone = i;
timeButtons[i] = new Button()
{
timeButtons[i] = new Button() {
@Override
public boolean onButtonPress(boolean rightclick) {
if (handleDisabledButtonPress(NEIActions.timeZones[zone], rightclick))
return true;
if (handleDisabledButtonPress(NEIActions.timeZones[zone], rightclick)) return true;
if (!rightclick) {
setHourForward(zone * 6);
@@ -565,11 +516,9 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
public String getButtonTip() {
return getTimeTip(NEIActions.timeZones[zone], state);
}
};
}
heal = new Button()
{
heal = new Button() {
@Override
public boolean onButtonPress(boolean rightclick) {
if (!rightclick) {
@@ -592,8 +541,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
}
private static String getStateTip(String name, int state) {
String sfx = (state & 0x3) == 2 ? "enable" :
(state & 0x3) == 1 ? "0" : "1";
String sfx = (state & 0x3) == 2 ? "enable" : (state & 0x3) == 1 ? "0" : "1";
return translate("inventory." + name + "." + sfx);
}
@@ -604,10 +552,8 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
}
private static boolean handleDisabledButtonPress(String ident, boolean rightclick) {
if (!NEIActions.canDisable.contains(ident))
return false;
if (rightclick != disabledActions.contains(ident))
return setPropertyDisabled(ident, rightclick);
if (!NEIActions.canDisable.contains(ident)) return false;
if (rightclick != disabledActions.contains(ident)) return setPropertyDisabled(ident, rightclick);
return false;
}
@@ -615,14 +561,11 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
if (disable && NEIActions.base(ident).equals("time")) {
int count = 0;
for (int i = 0; i < 4; i++) {
if (disabledActions.contains(NEIActions.timeZones[i]))
count++;
if (disabledActions.contains(NEIActions.timeZones[i])) count++;
}
if (count == 3)
return false;
if (count == 3) return false;
}
if (hasSMPCounterPart())
NEICPH.sendSetPropertyDisabled(ident, disable);
if (hasSMPCounterPart()) NEICPH.sendSetPropertyDisabled(ident, disable);
return true;
}
@@ -637,7 +580,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
if (isEnabled()) {
setInputFocused(null);
if(!itemsLoaded) {
if (!itemsLoaded) {
ItemList.loadItems.restart();
itemsLoaded = true;
}
@@ -649,13 +592,13 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
NEIController.load(gui);
if (checkCreativeInv(gui) && gui.mc.currentScreen instanceof GuiContainerCreative)//override creative with creative+
gui.mc.displayGuiScreen(null);//close the screen and wait for the server to open it for us
if (checkCreativeInv(gui)
&& gui.mc.currentScreen instanceof GuiContainerCreative) // override creative with creative+
gui.mc.displayGuiScreen(null); // close the screen and wait for the server to open it for us
}
@Override
public void refresh(GuiContainer gui) {
}
public void refresh(GuiContainer gui) {}
public boolean checkCreativeInv(GuiContainer gui) {
if (gui instanceof GuiContainerCreative && invCreativeMode()) {
@@ -672,9 +615,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
drawWidgets = new TreeSet<>(new WidgetZOrder(false));
controlWidgets = new TreeSet<>(new WidgetZOrder(true));
if (!visiblity.showNEI)
return;
if (!visiblity.showNEI) return;
addWidget(options);
addWidget(bookmarksButton);
@@ -687,10 +628,6 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
}
itemPanel.setVisible();
addWidget(more);
addWidget(less);
addWidget(quantity);
}
if (visiblity.showBookmarkPanel) {
@@ -702,27 +639,21 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
addWidget(presetsPanel);
}
searchField.setVisible(visiblity.showSearchSection);
if (visiblity.showSearchSection) {
addWidget(searchField);
}
if (visiblity.showUtilityButtons) {
if (canPerformAction("time")) {
for (int i = 0; i < 4; i++)
addWidget(timeButtons[i]);
for (int i = 0; i < 4; i++) addWidget(timeButtons[i]);
}
if (canPerformAction("rain"))
addWidget(rain);
if (canPerformAction("heal"))
addWidget(heal);
if (canPerformAction("magnet"))
addWidget(magnet);
if (isValidGamemode("creative") ||
isValidGamemode("creative+") ||
isValidGamemode("adventure"))
if (canPerformAction("rain")) addWidget(rain);
if (canPerformAction("heal")) addWidget(heal);
if (canPerformAction("magnet")) addWidget(magnet);
if (isValidGamemode("creative") || isValidGamemode("creative+") || isValidGamemode("adventure"))
addWidget(gamemode);
if (canPerformAction("delete"))
addWidget(delete);
if (canPerformAction("delete")) addWidget(delete);
}
if (visiblity.showSubsetDropdown) {
@@ -731,11 +662,9 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
}
}
public static LayoutStyle getLayoutStyle(int id) {
LayoutStyle style = layoutStyles.get(id);
if (style == null)
style = layoutStyles.get(0);
if (style == null) style = layoutStyles.get(0);
return style;
}
@@ -750,31 +679,24 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
@Override
public void guiTick(GuiContainer gui) {
if (checkCreativeInv(gui))
return;
if (checkCreativeInv(gui)) return;
if (!isEnabled())
return;
if (!isEnabled()) return;
for (Widget widget : drawWidgets)
widget.update();
for (Widget widget : drawWidgets) widget.update();
}
@Override
public boolean mouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {
if (isHidden() || !isEnabled())
return false;
if (isHidden() || !isEnabled()) return false;
for (Widget widget : drawWidgets)
if (widget.onMouseWheel(scrolled, mousex, mousey))
return true;
for (Widget widget : drawWidgets) if (widget.onMouseWheel(scrolled, mousex, mousey)) return true;
return false;
}
@Override
public void onMouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {
}
public void onMouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {}
@Override
public boolean shouldShowTooltip(GuiContainer gui) {
@@ -788,24 +710,24 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
/** Note: this method isn't actually used by this mod, but NEI add-ons might need it. */
public static void setInputFocused(Widget widget) {
if (inputFocused != null)
inputFocused.loseFocus();
if (inputFocused != null) inputFocused.loseFocus();
inputFocused = widget;
if (inputFocused != null)
inputFocused.gainFocus();
if (inputFocused != null) inputFocused.gainFocus();
}
@Override
public void renderSlotUnderlay(GuiContainer gui, Slot slot) {
if (overlayRenderer != null)
overlayRenderer.renderOverlay(GuiContainerManager.getManager(gui), slot);
if (overlayRenderer != null) overlayRenderer.renderOverlay(GuiContainerManager.getManager(gui), slot);
}
@Override
public void renderSlotOverlay(GuiContainer window, Slot slot) {
ItemStack item = slot.getStack();
if (world.nbt.getBoolean("searchinventories") && (item == null ? !getSearchExpression().equals("") : !ItemList.getItemListFilter().matches(item))) {
if (world.nbt.getBoolean("searchinventories")
&& (item == null
? !getSearchExpression().equals("")
: !((SearchField) searchField).getFilter().matches(item))) {
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glTranslatef(0, 0, 150);
drawRect(slot.xDisplayPosition, slot.yDisplayPosition, 16, 16, 0x80000000);
@@ -817,22 +739,19 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
public static void drawIcon(int x, int y, Image image) {
final boolean isDrawableResource = image instanceof DrawableResource;
if (!isDrawableResource)
changeTexture("nei:textures/nei_sprites.png");
if (!isDrawableResource) changeTexture("nei:textures/nei_sprites.png");
GL11.glColor4f(1, 1, 1, 1);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
if(!isDrawableResource)
drawTexturedModalRect(x, y, image.x, image.y, image.width, image.height);
else
((DrawableResource)image).draw(x, y);
if (!isDrawableResource) drawTexturedModalRect(x, y, image.x, image.y, image.width, image.height);
else ((DrawableResource) image).draw(x, y);
GL11.glDisable(GL11.GL_BLEND);
}
public static void drawButtonBackground(int x, int y, int w, int h, boolean edges, int type) {
int wTiles = 0;
int ew = w;//end width
int ew = w; // end width
if (w / 2 > 100) {
wTiles = (w - 200) / 50 + 1;
ew = 200;
@@ -847,27 +766,27 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
final int y2 = y + h - h2;
final int ty = 46 + type * 20;
final int te = (edges ? 0 : 1);//tex edges
final int te = (edges ? 0 : 1); // tex edges
final int ty1 = ty + te;
final int tx1 = te;
final int tx3 = 75;
//halfway the 1 is for odd number adjustment
// halfway the 1 is for odd number adjustment
final int ty2 = ty + 20 - h2 - te;
final int tx2 = 200 - w2 - te;
changeTexture("textures/gui/widgets.png");
drawTexturedModalRect(x, y, tx1, ty1, w1, h1);//top left
drawTexturedModalRect(x, y2, tx1, ty2, w1, h2);//bottom left
drawTexturedModalRect(x, y, tx1, ty1, w1, h1); // top left
drawTexturedModalRect(x, y2, tx1, ty2, w1, h2); // bottom left
for (int tile = 0; tile < wTiles; tile++) {
final int tileX = x + w1 + 50 * tile;
drawTexturedModalRect(tileX, y, tx3, ty1, 50, h1);//top
drawTexturedModalRect(tileX, y2, tx3, ty2, 50, h2);//bottom
drawTexturedModalRect(tileX, y, tx3, ty1, 50, h1); // top
drawTexturedModalRect(tileX, y2, tx3, ty2, 50, h2); // bottom
}
drawTexturedModalRect(x2, y, tx2, ty1, w2, h1);//top right
drawTexturedModalRect(x2, y2, tx2, ty2, w2, h2);//bottom right
drawTexturedModalRect(x2, y, tx2, ty1, w2, h1); // top right
drawTexturedModalRect(x2, y2, tx2, ty2, w2, h2); // bottom right
}
public static void drawItemPresenceOverlay(int slotX, int slotY, boolean isPresent) {
@@ -881,23 +800,14 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
@Override
public void tickKeyStates() {
if (Minecraft.getMinecraft().currentScreen != null)
return;
if (Minecraft.getMinecraft().currentScreen != null) return;
if (KeyManager.keyStates.get("world.dawn").down)
timeButtons[0].onButtonPress(false);
if (KeyManager.keyStates.get("world.noon").down)
timeButtons[1].onButtonPress(false);
if (KeyManager.keyStates.get("world.dusk").down)
timeButtons[2].onButtonPress(false);
if (KeyManager.keyStates.get("world.midnight").down)
timeButtons[3].onButtonPress(false);
if (KeyManager.keyStates.get("world.rain").down)
rain.onButtonPress(false);
if (KeyManager.keyStates.get("world.heal").down)
heal.onButtonPress(false);
if (KeyManager.keyStates.get("world.creative").down)
gamemode.onButtonPress(false);
if (KeyManager.keyStates.get("world.dawn").down) timeButtons[0].onButtonPress(false);
if (KeyManager.keyStates.get("world.noon").down) timeButtons[1].onButtonPress(false);
if (KeyManager.keyStates.get("world.dusk").down) timeButtons[2].onButtonPress(false);
if (KeyManager.keyStates.get("world.midnight").down) timeButtons[3].onButtonPress(false);
if (KeyManager.keyStates.get("world.rain").down) rain.onButtonPress(false);
if (KeyManager.keyStates.get("world.heal").down) heal.onButtonPress(false);
if (KeyManager.keyStates.get("world.creative").down) gamemode.onButtonPress(false);
}
}
@@ -1,10 +1,5 @@
package codechicken.nei;
import codechicken.nei.api.LayoutStyle;
import codechicken.nei.drawable.DrawableBuilder;
import net.minecraft.client.gui.inventory.GuiContainer;
import org.lwjgl.opengl.GL11;
import static codechicken.lib.gui.GuiDraw.drawStringC;
import static codechicken.nei.LayoutManager.bookmarkPanel;
import static codechicken.nei.LayoutManager.bookmarksButton;
@@ -14,11 +9,9 @@ import static codechicken.nei.LayoutManager.gamemode;
import static codechicken.nei.LayoutManager.heal;
import static codechicken.nei.LayoutManager.itemPanel;
import static codechicken.nei.LayoutManager.itemPresenceOverlays;
import static codechicken.nei.LayoutManager.less;
import static codechicken.nei.LayoutManager.magnet;
import static codechicken.nei.LayoutManager.more;
import static codechicken.nei.LayoutManager.options;
import static codechicken.nei.LayoutManager.quantity;
import static codechicken.nei.LayoutManager.presetsPanel;
import static codechicken.nei.LayoutManager.rain;
import static codechicken.nei.LayoutManager.searchField;
import static codechicken.nei.LayoutManager.timeButtons;
@@ -27,8 +20,12 @@ import static codechicken.nei.NEIClientConfig.disabledActions;
import static codechicken.nei.NEIClientConfig.getMagnetMode;
import static codechicken.nei.NEIClientConfig.isEnabled;
public class LayoutStyleMinecraft extends LayoutStyle
{
import codechicken.nei.api.LayoutStyle;
import codechicken.nei.drawable.DrawableBuilder;
import net.minecraft.client.gui.inventory.GuiContainer;
import org.lwjgl.opengl.GL11;
public class LayoutStyleMinecraft extends LayoutStyle {
public int buttonCount;
public int leftSize;
public int numButtons;
@@ -68,66 +65,44 @@ public class LayoutStyleMinecraft extends LayoutStyle
numButtons = Math.max(leftSize / 18, 1);
delete.state = 0x4;
if (NEIController.getDeleteMode())
delete.state |= 1;
else if (!visiblity.enableDeleteMode)
delete.state |= 2;
if (NEIController.getDeleteMode()) delete.state |= 1;
else if (!visiblity.enableDeleteMode) delete.state |= 2;
rain.state = 0x4;
if (disabledActions.contains("rain"))
rain.state |= 2;
else if (NEIClientUtils.isRaining())
rain.state |= 1;
if (disabledActions.contains("rain")) rain.state |= 2;
else if (NEIClientUtils.isRaining()) rain.state |= 1;
gamemode.state = 0x4;
if (NEIClientUtils.getGamemode() != 0) {
gamemode.state |= 0x1;
gamemode.index = NEIClientUtils.getGamemode() - 1;
} else {
if (NEIClientUtils.isValidGamemode("creative"))
gamemode.index = 0;
else if (NEIClientUtils.isValidGamemode("creative+"))
gamemode.index = 1;
else if (NEIClientUtils.isValidGamemode("adventure"))
gamemode.index = 2;
if (NEIClientUtils.isValidGamemode("creative")) gamemode.index = 0;
else if (NEIClientUtils.isValidGamemode("creative+")) gamemode.index = 1;
else if (NEIClientUtils.isValidGamemode("adventure")) gamemode.index = 2;
}
bookmarksButton.index = NEIClientConfig.isBookmarkPanelHidden() ? 0 : 1;
options.index = NEIClientConfig.getCheatMode();
magnet.state = 0x4 | (getMagnetMode() ? 1 : 0);
if (canPerformAction("delete"))
layoutButton(delete);
if (canPerformAction("rain"))
layoutButton(rain);
if (NEIClientUtils.isValidGamemode("creative") ||
NEIClientUtils.isValidGamemode("creative+") ||
NEIClientUtils.isValidGamemode("adventure"))
layoutButton(gamemode);
if (canPerformAction("magnet"))
layoutButton(magnet);
if (canPerformAction("delete")) layoutButton(delete);
if (canPerformAction("rain")) layoutButton(rain);
if (NEIClientUtils.isValidGamemode("creative")
|| NEIClientUtils.isValidGamemode("creative+")
|| NEIClientUtils.isValidGamemode("adventure")) layoutButton(gamemode);
if (canPerformAction("magnet")) layoutButton(magnet);
if (canPerformAction("time")) {
for (int i = 0; i < 4; i++) {
timeButtons[i].state = disabledActions.contains(NEIActions.timeZones[i]) ? 2 : 0;
layoutButton(timeButtons[i]);
}
}
if (canPerformAction("heal"))
layoutButton(heal);
if (canPerformAction("heal")) layoutButton(heal);
itemPanel.resize(gui);
bookmarkPanel.resize(gui);
more.w = more.h = less.w = less.h = 16;
less.x = itemPanel.pagePrev.x;
more.x = gui.width - less.w - 2;
more.y = less.y = gui.height - more.h - 2;
quantity.x = less.x + less.w + 2;
quantity.y = less.y;
quantity.w = more.x - quantity.x - 2;
quantity.h = less.h;
options.x = isEnabled() ? 0 : 6;
options.y = isEnabled() ? gui.height - 22 : gui.height - 28;
options.w = 22;
@@ -138,25 +113,29 @@ public class LayoutStyleMinecraft extends LayoutStyle
bookmarksButton.w = 22;
bookmarksButton.h = 22;
searchField.y = gui.height - searchField.h - 2;
dropDown.h = 18;
dropDown.w = 150;
dropDown.y = 0;
dropDown.x = (gui.width - gui.xSize) / 2 + gui.xSize - dropDown.w;
presetsPanel.h = 16;
presetsPanel.w = 150;
presetsPanel.y = 2;
presetsPanel.x = (gui.width - gui.xSize) / 2 + gui.xSize - presetsPanel.w;
dropDown.x = Math.min(numButtons, buttonCount) * 20 + 3;
dropDown.h = 20;
dropDown.w = itemPanel.x - dropDown.x - 3;
searchField.h = 20;
searchField.w = 150;
searchField.x = (gui.width - searchField.w) / 2;
searchField.y = gui.height - searchField.h - 2;
if (!visiblity.showItemSection) {
searchField.setFocus(false);
}
}
public void layoutButton(Button button) {
button.x = 2 + (buttonCount % numButtons) * 20;
button.y = (buttonCount / numButtons) * 18;
button.x = 2 + (buttonCount % numButtons) * 19;
button.y = 2 + (buttonCount / numButtons) * 18;
button.h = 17;
button.w = button.contentWidth() + 6;
@@ -170,13 +149,12 @@ public class LayoutStyleMinecraft extends LayoutStyle
GL11.glColor4f(1, 1, 1, 1);
int tex;
if ((b.state & 0x3) == 2)
tex = 0;
else if ((b.state & 0x4) == 0 && b.contains(mousex, mousey) ||//not a state button and mouseover
(b.state & 0x3) == 1)//state active
tex = 2;
else
tex = 1;
if ((b.state & 0x3) == 2) tex = 0;
else if ((b.state & 0x4) == 0 && b.contains(mousex, mousey)
|| // not a state button and mouseover
(b.state & 0x3) == 1) // state active
tex = 2;
else tex = 1;
LayoutManager.drawButtonBackground(b.x, b.y, b.w, b.h, true, tex);
Image icon = b.getRenderIcon();
@@ -196,12 +174,9 @@ public class LayoutStyleMinecraft extends LayoutStyle
@Override
public void drawSubsetTag(String text, int x, int y, int w, int h, int state, boolean mouseover) {
if(state == 1)
GL11.glColor4f(0.65F, 0.65F, 0.65F, 1.0F);
else
GL11.glColor4f(1, 1, 1, 1);
if (state == 1) GL11.glColor4f(0.65F, 0.65F, 0.65F, 1.0F);
else GL11.glColor4f(1, 1, 1, 1);
LayoutManager.drawButtonBackground(x, y, w, h, false, state == 0 ? 0 : 1);
if(text != null)
drawStringC(text, x, y, w, h, state == 2 ? 0xFFE0E0E0 : 0xFFA0A0A0);
if (text != null) drawStringC(text, x, y, w, h, state == 2 ? 0xFFE0E0E0 : 0xFFA0A0A0);
}
}
+19 -31
View File
@@ -5,47 +5,39 @@ import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
public class NEIActions
{
public class NEIActions {
public static final int protocol = 0;
public static HashMap<String, NEIActions> nameActionMap = new HashMap<>();
public static HashSet<String> canDisable = new HashSet<>();
public static void addAction(String name, String base, boolean smpreq)
{
public static void addAction(String name, String base, boolean smpreq) {
NEIActions action = new NEIActions(name, base, smpreq);
nameActionMap.put(name, action);
}
private static void addAction(String name, String base)
{
private static void addAction(String name, String base) {
addAction(name, base, false);
}
public static void addAction(String name)
{
public static void addAction(String name) {
addAction(name, name);
}
private static void addAction(String name, boolean smpreq)
{
private static void addAction(String name, boolean smpreq) {
addAction(name, name, smpreq);
}
public static String base(String name)
{
public static String base(String name) {
NEIActions action = nameActionMap.get(name);
return action == null ? name : action.base;
}
public static boolean smpRequired(String name)
{
public static boolean smpRequired(String name) {
return nameActionMap.get(name).smpreq;
}
public static void init()
{
public static void init() {
addAction("time");
addAction("dawn", "time");
addAction("noon", "time");
@@ -68,27 +60,23 @@ public class NEIActions
canDisable.add("midnight");
canDisable.add("rain");
}
public static final String[] timeZones = new String[]{"dawn", "noon", "dusk", "midnight"};
public static final String[] gameModes = new String[]{"survival", "creative", "creative+", "adventure"};
public static final String[] timeZones = new String[] {"dawn", "noon", "dusk", "midnight"};
public static final String[] gameModes = new String[] {"survival", "creative", "creative+", "adventure"};
public String name;
public String base;
public boolean smpreq;
public NEIActions(String name, String base, boolean smpreq)
{
public NEIActions(String name, String base, boolean smpreq) {
this.name = name;
this.base = base;
this.smpreq = smpreq;
}
public static List<String> baseActions()
{
public static List<String> baseActions() {
List<String> list = new LinkedList<>();
for(NEIActions a : nameActionMap.values())
if(a.base.equals(a.name))
list.add(a.name);
for (NEIActions a : nameActionMap.values()) if (a.base.equals(a.name)) list.add(a.name);
return list;
}
}
+22 -30
View File
@@ -12,8 +12,7 @@ import net.minecraft.network.play.INetHandlerPlayClient;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.world.World;
public class NEICPH implements IClientPacketHandler
{
public class NEICPH implements IClientPacketHandler {
public static final String channel = "NEI";
@Override
@@ -38,13 +37,16 @@ public class NEICPH implements IClientPacketHandler
handleGamemode(mc, packet.readUByte());
break;
case 21:
ClientUtils.openSMPGui(packet.readUByte(), new GuiEnchantmentModifier(mc.thePlayer.inventory, mc.theWorld, 0, 0, 0));
ClientUtils.openSMPGui(
packet.readUByte(), new GuiEnchantmentModifier(mc.thePlayer.inventory, mc.theWorld, 0, 0, 0));
break;
case 23:
if (packet.readBoolean())
ClientUtils.openSMPGui(packet.readUByte(), new GuiExtendedCreativeInv(new ContainerCreativeInv(mc.thePlayer, new ExtendedCreativeInv(null, Side.CLIENT))));
else
mc.displayGuiScreen(new GuiInventory(mc.thePlayer));
ClientUtils.openSMPGui(
packet.readUByte(),
new GuiExtendedCreativeInv(new ContainerCreativeInv(
mc.thePlayer, new ExtendedCreativeInv(null, Side.CLIENT))));
else mc.displayGuiScreen(new GuiInventory(mc.thePlayer));
break;
case 24:
ClientUtils.openSMPGui(packet.readUByte(), new GuiPotionCreator(mc.thePlayer.inventory));
@@ -58,40 +60,32 @@ public class NEICPH implements IClientPacketHandler
private void handleActionEnabled(PacketCustom packet) {
String name = packet.readString();
if (packet.readBoolean())
NEIClientConfig.enabledActions.add(name);
else
NEIClientConfig.enabledActions.remove(name);
if (packet.readBoolean()) NEIClientConfig.enabledActions.add(name);
else NEIClientConfig.enabledActions.remove(name);
}
private void handleActionDisabled(PacketCustom packet) {
String name = packet.readString();
if (packet.readBoolean())
NEIClientConfig.disabledActions.add(name);
else
NEIClientConfig.disabledActions.remove(name);
if (packet.readBoolean()) NEIClientConfig.disabledActions.add(name);
else NEIClientConfig.disabledActions.remove(name);
}
private void handleLoginState(PacketCustom packet) {
NEIClientConfig.permissableActions.clear();
int num = packet.readUByte();
for (int i = 0; i < num; i++)
NEIClientConfig.permissableActions.add(packet.readString());
for (int i = 0; i < num; i++) NEIClientConfig.permissableActions.add(packet.readString());
NEIClientConfig.disabledActions.clear();
num = packet.readUByte();
for (int i = 0; i < num; i++)
NEIClientConfig.disabledActions.add(packet.readString());
for (int i = 0; i < num; i++) NEIClientConfig.disabledActions.add(packet.readString());
NEIClientConfig.enabledActions.clear();
num = packet.readUByte();
for (int i = 0; i < num; i++)
NEIClientConfig.enabledActions.add(packet.readString());
for (int i = 0; i < num; i++) NEIClientConfig.enabledActions.add(packet.readString());
NEIClientConfig.bannedBlocks.clear();
num = packet.readInt();
for(int i = 0; i < num; i++)
NEIClientConfig.bannedBlocks.add(packet.readItemStack());
for (int i = 0; i < num; i++) NEIClientConfig.bannedBlocks.add(packet.readItemStack());
if (NEIClientUtils.getGuiContainer() != null)
LayoutManager.instance().refresh(NEIClientUtils.getGuiContainer());
@@ -115,8 +109,7 @@ public class NEICPH implements IClientPacketHandler
}
private static String getSaveName(String worldName) {
if (Minecraft.getMinecraft().isSingleplayer())
return "local/" + ClientUtils.getWorldSaveName();
if (Minecraft.getMinecraft().isSingleplayer()) return "local/" + ClientUtils.getWorldSaveName();
return "remote/" + ClientUtils.getServerIP().replace(':', '~') + "/" + worldName;
}
@@ -203,9 +196,7 @@ public class NEICPH implements IClientPacketHandler
}
public static void sendGamemode(int mode) {
new PacketCustom(channel, 13)
.writeByte(mode)
.sendToServer();
new PacketCustom(channel, 13).writeByte(mode).sendToServer();
}
public static void sendCreativeInv(boolean open) {
@@ -229,10 +220,11 @@ public class NEICPH implements IClientPacketHandler
public static void sendOpenPotionWindow() {
ItemStack[] potionStore = new ItemStack[9];
InventoryUtils.readItemStacksFromTag(potionStore, NEIClientConfig.global.nbt.getCompoundTag("potionStore").getTagList("items", 10));
InventoryUtils.readItemStacksFromTag(
potionStore,
NEIClientConfig.global.nbt.getCompoundTag("potionStore").getTagList("items", 10));
PacketCustom packet = new PacketCustom(channel, 24);
for (ItemStack stack : potionStore)
packet.writeItemStack(stack);
for (ItemStack stack : potionStore) packet.writeItemStack(stack);
packet.sendToServer();
}
@@ -2,16 +2,14 @@ package codechicken.nei;
import codechicken.nei.api.INEIGuiAdapter;
import codechicken.nei.api.TaggedInventoryArea;
import java.util.Collections;
import java.util.List;
import net.minecraft.client.gui.inventory.GuiChest;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.ContainerChest;
import net.minecraft.item.ItemStack;
import java.util.Collections;
import java.util.List;
public class NEIChestGuiHandler extends INEIGuiAdapter
{
public class NEIChestGuiHandler extends INEIGuiAdapter {
public int chestSize(GuiContainer gui) {
return ((ContainerChest) gui.inventorySlots).getLowerChestInventory().getSizeInventory();
}
@@ -23,6 +21,8 @@ public class NEIChestGuiHandler extends INEIGuiAdapter
@Override
public List<TaggedInventoryArea> getInventoryAreas(GuiContainer gui) {
return gui instanceof GuiChest ? Collections.singletonList(new TaggedInventoryArea("Chest", 0, chestSize(gui), gui.inventorySlots)) : null;
return gui instanceof GuiChest
? Collections.singletonList(new TaggedInventoryArea("Chest", 0, chestSize(gui), gui.inventorySlots))
: null;
}
}
@@ -16,6 +16,7 @@ import codechicken.nei.config.ConfigSet;
import codechicken.nei.config.GuiHighlightTips;
import codechicken.nei.config.GuiNEIOptionList;
import codechicken.nei.config.GuiOptionList;
import codechicken.nei.config.GuiPanelSettings;
import codechicken.nei.config.OptionCycled;
import codechicken.nei.config.OptionGamemodes;
import codechicken.nei.config.OptionList;
@@ -31,8 +32,16 @@ import codechicken.nei.recipe.RecipeCatalysts;
import codechicken.nei.recipe.RecipeInfo;
import codechicken.obfuscator.ObfuscationRun;
import com.google.common.base.Objects;
import java.io.File;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.function.Function;
import java.util.regex.Pattern;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
@@ -42,14 +51,6 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.lwjgl.input.Keyboard;
import java.io.File;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.function.Function;
import java.util.regex.Pattern;
public class NEIClientConfig {
private static boolean configLoaded;
private static boolean enabledOverride;
@@ -57,9 +58,8 @@ public class NEIClientConfig {
public static Logger logger = LogManager.getLogger("NotEnoughItems");
public static File configDir = new File(CommonUtils.getMinecraftDir(), "config/NEI/");
public static ConfigSet global = new ConfigSet(
new File("saves/NEI/client.dat"),
new ConfigFile(new File(configDir, "client.cfg")));
public static ConfigSet global =
new ConfigSet(new File("saves/NEI/client.dat"), new ConfigFile(new File(configDir, "client.cfg")));
public static ConfigSet world;
public static final File handlerFile = new File(configDir, "handlers.csv");
public static final File catalystFile = new File(configDir, "catalysts.csv");
@@ -85,16 +85,11 @@ public class NEIClientConfig {
// Function that extracts the handler ID from a handler, with special logic for
// TemplateRecipeHandler: prefer using the overlay ID if it exists.
public static final Function<IRecipeHandler, String> HANDLER_ID_FUNCTION =
handler -> Objects.firstNonNull(
handler.getOverlayIdentifier(),
handler.getHandlerId());
handler -> Objects.firstNonNull(handler.getOverlayIdentifier(), handler.getHandlerId());
// Comparator that compares handlers using the handlerOrdering map.
public static final Comparator<IRecipeHandler> HANDLER_COMPARATOR =
Comparator.comparingInt(
handler -> handlerOrdering.getOrDefault(
HANDLER_ID_FUNCTION.apply(handler), 0));
Comparator.comparingInt(handler -> handlerOrdering.getOrDefault(HANDLER_ID_FUNCTION.apply(handler), 0));
public static ItemStack[] creativeInv;
@@ -106,17 +101,20 @@ public class NEIClientConfig {
public static ItemStackSet bannedBlocks = new ItemStackSet();
static {
if (global.config.getTag("checkUpdates").getBooleanValue(true))
CCUpdateChecker.updateCheck("NotEnoughItems");
if (global.config.getTag("checkUpdates").getBooleanValue(true)) CCUpdateChecker.updateCheck("NotEnoughItems");
linkOptionList();
setDefaults();
}
private static void setDefaults() {
ConfigTagParent tag = global.config;
tag.setComment("Main configuration of NEI.\nMost of these options can be changed ingame.\nDeleting any element will restore it to it's default value");
tag.setComment(
"Main configuration of NEI.\nMost of these options can be changed ingame.\nDeleting any element will restore it to it's default value");
tag.getTag("command").useBraces().setComment("Change these options if you have a different mod installed on the server that handles the commands differently, Eg. Bukkit Essentials");
tag.getTag("command")
.useBraces()
.setComment(
"Change these options if you have a different mod installed on the server that handles the commands differently, Eg. Bukkit Essentials");
tag.setNewLineMode(1);
tag.getTag("inventory.widgetsenabled").getBooleanValue(true);
@@ -124,9 +122,11 @@ public class NEIClientConfig {
tag.getTag("inventory.hidden").getBooleanValue(false);
tag.getTag("inventory.cheatmode").getIntValue(2);
tag.getTag("inventory.lockmode").setComment("For those who can't help themselves.\nSet this to a mode and you will be unable to change it ingame").getIntValue(-1);
API.addOption(new OptionCycled("inventory.cheatmode", 3)
{
tag.getTag("inventory.lockmode")
.setComment(
"For those who can't help themselves.\nSet this to a mode and you will be unable to change it ingame")
.getIntValue(-1);
API.addOption(new OptionCycled("inventory.cheatmode", 3) {
@Override
public boolean optionValid(int index) {
return getLockedMode() == -1 || getLockedMode() == index && NEIInfo.isValidMode(index);
@@ -140,7 +140,6 @@ public class NEIClientConfig {
tag.getTag("inventory.gamemodes").setDefaultValue("creative, creative+, adventure");
API.addOption(new OptionGamemodes("inventory.gamemodes"));
ItemSorter.initConfig(tag);
tag.getTag("inventory.itemIDs").getIntValue(1);
@@ -154,6 +153,18 @@ public class NEIClientConfig {
tag.getTag("world.highlight_tips.y").getIntValue(100);
API.addOption(new OptionOpenGui("world.highlight_tips", GuiHighlightTips.class));
tag.getTag("world.panels.bookmarks.left").getIntValue(0);
tag.getTag("world.panels.bookmarks.right").getIntValue(0);
tag.getTag("world.panels.bookmarks.top").getIntValue(0);
tag.getTag("world.panels.bookmarks.bottom").getIntValue(0);
tag.getTag("world.panels.items.left").getIntValue(0);
tag.getTag("world.panels.items.right").getIntValue(0);
tag.getTag("world.panels.items.top").getIntValue(0);
tag.getTag("world.panels.items.bottom").getIntValue(0);
API.addOption(new OptionOpenGui("world.panels", GuiPanelSettings.class));
tag.getTag("inventory.profileRecipes").getBooleanValue(false);
API.addOption(new OptionToggleButton("inventory.profileRecipes", true));
@@ -167,7 +178,10 @@ public class NEIClientConfig {
return isMouseScrollTransferEnabled();
}
});
tag.getTag("inventory.cacheItemRendering").getBooleanValue(false);
API.addOption(new OptionToggleButton("inventory.cacheItemRendering", true));
tag.getTag("itemLoadingTimeout").getIntValue(500);
tag.getTag("command.creative").setDefaultValue("/gamemode {0} {1}");
@@ -181,7 +195,9 @@ public class NEIClientConfig {
tag.getTag("command.heal").setDefaultValue("");
API.addOption(new OptionTextField("command.heal"));
tag.getTag("inventory.worldSpecificBookmarks").setComment("Global or world specific bookmarks").getBooleanValue(false);
tag.getTag("inventory.worldSpecificBookmarks")
.setComment("Global or world specific bookmarks")
.getBooleanValue(false);
API.addOption(new OptionToggleButton("inventory.worldSpecificBookmarks", true) {
@Override
public boolean onClick(int button) {
@@ -191,7 +207,9 @@ public class NEIClientConfig {
}
});
tag.getTag("inventory.worldSpecificPresets").setComment("Global or world specific presets").getBooleanValue(false);
tag.getTag("inventory.worldSpecificPresets")
.setComment("Global or world specific presets")
.getBooleanValue(false);
API.addOption(new OptionToggleButton("inventory.worldSpecificPresets", true) {
@Override
public boolean onClick(int button) {
@@ -201,25 +219,50 @@ public class NEIClientConfig {
}
});
tag.getTag("inventory.bookmarksEnabled").setComment("Enable/disable bookmarks").getBooleanValue(true);
tag.getTag("inventory.bookmarksEnabled")
.setComment("Enable/disable bookmarks")
.getBooleanValue(true);
API.addOption(new OptionToggleButton("inventory.bookmarksEnabled", true));
tag.getTag("inventory.saveCurrentRecipeInBookmarksEnabled").setComment("Save Current Recipe in Bookmarks").getBooleanValue(true);
API.addOption(new OptionToggleButton("inventory.saveCurrentRecipeInBookmarksEnabled", true));
tag.getTag("inventory.useNBTInBookmarks").setComment("Use NBT in Bookmarks").getBooleanValue(true);
tag.getTag("inventory.useNBTInBookmarks")
.setComment("Use NBT in Bookmarks")
.getBooleanValue(true);
API.addOption(new OptionToggleButton("inventory.useNBTInBookmarks", true));
tag.getTag("inventory.showRecipeMarker")
.setComment("Show Recipe Marker")
.getBooleanValue(false);
API.addOption(new OptionToggleButton("inventory.showRecipeMarker", true));
tag.getTag("inventory.jei_style_tabs").setComment("Enable/disable JEI Style Tabs").getBooleanValue(true);
tag.getTag("inventory.showItemQuantityWidget")
.setComment("Show Item Quantity Widget")
.getBooleanValue(true);
API.addOption(new OptionToggleButton("inventory.showItemQuantityWidget", true));
tag.getTag("inventory.jei_style_tabs")
.setComment("Enable/disable JEI Style Tabs")
.getBooleanValue(true);
API.addOption(new OptionToggleButtonBoubs("inventory.jei_style_tabs", true));
tag.getTag("inventory.jei_style_item_presence_overlay").setComment("Enable/disable JEI Style item presence overlay on ?-hover").getBooleanValue(true);
tag.getTag("inventory.jei_style_item_presence_overlay")
.setComment("Enable/disable JEI Style item presence overlay on ?-hover")
.getBooleanValue(true);
API.addOption(new OptionToggleButton("inventory.jei_style_item_presence_overlay", true));
tag.getTag("inventory.jei_style_recipe_catalyst").setComment("Enable/disable JEI Style Recipe Catalysts").getBooleanValue(true);
tag.getTag("inventory.jei_style_recipe_catalyst")
.setComment("Enable/disable JEI Style Recipe Catalysts")
.getBooleanValue(true);
API.addOption(new OptionToggleButton("inventory.jei_style_recipe_catalyst", true));
tag.getTag("inventory.creative_tab_style").setComment("Creative or JEI style tabs").getBooleanValue(false);
tag.getTag("inventory.creative_tab_style")
.setComment("Creative or JEI style tabs")
.getBooleanValue(false);
API.addOption(new OptionToggleButton("inventory.creative_tab_style", true));
tag.getTag("tools.handler_load_from_config").setComment("ADVANCED: Load handlers from config").getBooleanValue(false);
tag.getTag("inventory.ignore_potion_overlap")
.setComment("Ignore overlap with potion effect HUD")
.getBooleanValue(false);
API.addOption(new OptionToggleButton("inventory.ignore_potion_overlap", true));
tag.getTag("tools.handler_load_from_config")
.setComment("ADVANCED: Load handlers from config")
.getBooleanValue(false);
API.addOption(new OptionToggleButton("tools.handler_load_from_config", true) {
@Override
public boolean onClick(int button) {
@@ -229,7 +272,9 @@ public class NEIClientConfig {
}
});
tag.getTag("tools.catalyst_load_from_config").setComment("ADVANCED: Load catalysts from config").getBooleanValue(false);
tag.getTag("tools.catalyst_load_from_config")
.setComment("ADVANCED: Load catalysts from config")
.getBooleanValue(false);
API.addOption(new OptionToggleButton("tools.catalyst_load_from_config", true) {
@Override
public boolean onClick(int button) {
@@ -243,8 +288,7 @@ public class NEIClientConfig {
}
private static void linkOptionList() {
OptionList.setOptionList(new OptionList("nei.options")
{
OptionList.setOptionList(new OptionList("nei.options") {
@Override
public ConfigSet globalConfigSet() {
return global;
@@ -268,21 +312,29 @@ public class NEIClientConfig {
}
private static void setDefaultKeyBindings() {
API.addKeyBind("gui.recipe", Keyboard.KEY_R);
API.addKeyBind("gui.usage", Keyboard.KEY_U);
API.addHashBind("gui.recipe", Keyboard.KEY_R);
API.addHashBind("gui.usage", Keyboard.KEY_U);
API.addKeyBind("gui.back", Keyboard.KEY_BACK);
API.addKeyBind("gui.enchant", Keyboard.KEY_X);
API.addKeyBind("gui.potion", Keyboard.KEY_P);
API.addHashBind("gui.enchant", Keyboard.KEY_X);
API.addHashBind("gui.potion", Keyboard.KEY_P);
API.addKeyBind("gui.prev", Keyboard.KEY_PRIOR);
API.addKeyBind("gui.next", Keyboard.KEY_NEXT);
API.addKeyBind("gui.prev_machine", Keyboard.KEY_UP);
API.addKeyBind("gui.next_machine", Keyboard.KEY_DOWN);
API.addKeyBind("gui.prev_recipe", Keyboard.KEY_LEFT);
API.addKeyBind("gui.next_recipe", Keyboard.KEY_RIGHT);
API.addKeyBind("gui.hide", Keyboard.KEY_O);
API.addKeyBind("gui.search", Keyboard.KEY_F);
API.addKeyBind("gui.bookmark", Keyboard.KEY_A);
API.addKeyBind("gui.hide_bookmarks", Keyboard.KEY_B);
API.addHashBind("gui.hide", Keyboard.KEY_O);
API.addHashBind("gui.search", Keyboard.KEY_F);
API.addHashBind("gui.bookmark", Keyboard.KEY_A);
API.addHashBind("gui.bookmark_recipe", Keyboard.KEY_A + NEIClientUtils.SHIFT_HASH);
API.addHashBind("gui.bookmark_count", Keyboard.KEY_A + NEIClientUtils.CTRL_HASH);
API.addHashBind(
"gui.bookmark_recipe_count", Keyboard.KEY_A + NEIClientUtils.SHIFT_HASH + NEIClientUtils.CTRL_HASH);
API.addHashBind("gui.overlay", Keyboard.KEY_S);
API.addHashBind("gui.overlay_use", Keyboard.KEY_S + NEIClientUtils.SHIFT_HASH);
API.addHashBind("gui.overlay_hide", Keyboard.KEY_S + NEIClientUtils.CTRL_HASH);
API.addHashBind("gui.hide_bookmarks", Keyboard.KEY_B);
API.addKeyBind("world.chunkoverlay", Keyboard.KEY_F9);
API.addKeyBind("world.moboverlay", Keyboard.KEY_F7);
API.addKeyBind("world.highlight_tips", Keyboard.KEY_NUMPAD0);
@@ -303,7 +355,7 @@ public class NEIClientConfig {
NEIClientConfig.worldPath = worldPath;
setInternalEnabled(true);
logger.debug("Loading "+(Minecraft.getMinecraft().isSingleplayer() ? "Local" : "Remote")+" World");
logger.debug("Loading " + (Minecraft.getMinecraft().isSingleplayer() ? "Local" : "Remote") + " World");
bootNEI(ClientUtils.getWorld());
final File specificDir = new File(CommonUtils.getMinecraftDir(), "saves/NEI/" + worldPath);
@@ -320,16 +372,19 @@ public class NEIClientConfig {
}
private static void onWorldLoad(boolean newWorld) {
world.config.setComment("World based configuration of NEI.\nMost of these options can be changed ingame.\nDeleting any element will restore it to it's default value");
world.config.setComment(
"World based configuration of NEI.\nMost of these options can be changed ingame.\nDeleting any element will restore it to it's default value");
setWorldDefaults();
creativeInv = new ItemStack[54];
LayoutManager.searchField.setText(getSearchExpression());
LayoutManager.quantity.setText(Integer.toString(getItemQuantity()));
ItemPanels.itemPanel.quantity.setText(Integer.toString(getItemQuantity()));
SubsetWidget.loadHidden();
if (newWorld && Minecraft.getMinecraft().isSingleplayer())
world.config.getTag("inventory.cheatmode").setIntValue(NEIClientUtils.mc().playerController.isInCreativeMode() ? 2 : 0);
world.config
.getTag("inventory.cheatmode")
.setIntValue(NEIClientUtils.mc().playerController.isInCreativeMode() ? 2 : 0);
NEIInfo.load(ClientUtils.getWorld());
}
@@ -351,9 +406,13 @@ public class NEIClientConfig {
getSetting("keys." + string).getIntValue(key);
}
public static boolean isKeyHashDown(String string) {
final int hash = getKeyBinding(string);
return hash != Keyboard.CHAR_NONE && hash == NEIClientUtils.getKeyHash();
}
public static void bootNEI(World world) {
if (configLoaded)
return;
if (configLoaded) return;
ItemInfo.load(world);
GuiInfo.load();
@@ -367,7 +426,8 @@ public class NEIClientConfig {
new Thread("NEI Plugin Loader") {
@Override
public void run() {
ClassDiscoverer classDiscoverer = new ClassDiscoverer(test -> test.startsWith("NEI") && test.endsWith("Config.class"), IConfigureNEI.class);
ClassDiscoverer classDiscoverer = new ClassDiscoverer(
test -> test.startsWith("NEI") && test.endsWith("Config.class"), IConfigureNEI.class);
classDiscoverer.findClasses();
@@ -388,9 +448,8 @@ public class NEIClientConfig {
ItemSorter.loadConfig();
}
private static void initBookmarkFile(String worldPath)
{
private static void initBookmarkFile(String worldPath) {
if (!global.config.getTag("inventory.worldSpecificBookmarks").getBooleanValue()) {
worldPath = "global";
}
@@ -398,9 +457,8 @@ public class NEIClientConfig {
ItemPanels.bookmarkPanel.setBookmarkFile(worldPath);
}
private static void initPresetsFile(String worldPath)
{
private static void initPresetsFile(String worldPath) {
if (!global.config.getTag("inventory.worldSpecificPresets").getBooleanValue()) {
worldPath = "global";
}
@@ -409,7 +467,7 @@ public class NEIClientConfig {
}
public static boolean isWorldSpecific(String setting) {
if(world == null) return false;
if (world == null) return false;
ConfigTag tag = world.config.getTag(setting, false);
return tag != null && tag.value != null;
}
@@ -425,33 +483,51 @@ public class NEIClientConfig {
public static boolean isHidden() {
return !enabledOverride || getBooleanSetting("inventory.hidden");
}
public static boolean isBookmarkPanelHidden() {
return !getBooleanSetting("inventory.bookmarksEnabled");
}
public static boolean saveCurrentRecipeInBookmarksEnabled() {
return getBooleanSetting("inventory.saveCurrentRecipeInBookmarksEnabled");
}
public static boolean useNBTInBookmarks() {
return getBooleanSetting("inventory.useNBTInBookmarks");
}
public static boolean showRecipeMarker() {
return getBooleanSetting("inventory.showRecipeMarker");
}
public static boolean showItemQuantityWidget() {
return getBooleanSetting("inventory.showItemQuantityWidget");
}
public static boolean areJEIStyleTabsVisible() {
return getBooleanSetting("inventory.jei_style_tabs");
}
public static boolean isJEIStyleItemPresenceOverlayVisible() {
return getBooleanSetting("inventory.jei_style_item_presence_overlay");
}
public static boolean areJEIStyleRecipeCatalystsVisible() {
return getBooleanSetting("inventory.jei_style_recipe_catalyst");
}
public static boolean useCreativeTabStyle() {
return getBooleanSetting("inventory.creative_tab_style");
}
public static boolean ignorePotionOverlap() {
return getBooleanSetting("inventory.ignore_potion_overlap");
}
public static boolean isEnabled() {
return enabledOverride && getBooleanSetting("inventory.widgetsenabled");
}
public static boolean loadHandlersFromJar() {
return !getBooleanSetting("tools.handler_load_from_config");
}
public static boolean loadCatalystsFromJar() {
return !getBooleanSetting("tools.catalyst_load_from_config");
}
@@ -469,8 +545,7 @@ public class NEIClientConfig {
}
private static void checkCheatMode() {
if (getLockedMode() != -1)
setIntSetting("inventory.cheatmode", getLockedMode());
if (getLockedMode() != -1) setIntSetting("inventory.cheatmode", getLockedMode());
}
public static int getLockedMode() {
@@ -489,7 +564,7 @@ public class NEIClientConfig {
int i = getIntSetting("inventory.itemIDs");
return i == 2 || (i == 1 && isEnabled() && !isHidden());
}
public static int getItemLoadingTimeout() {
return getIntSetting("itemLoadingTimeout");
}
@@ -529,6 +604,10 @@ public class NEIClientConfig {
return !getBooleanSetting("inventory.invertMouseScrollTransfer");
}
public static boolean shouldCacheItemRendering() {
return getBooleanSetting("inventory.cacheItemRendering") && OpenGlHelper.framebufferSupported;
}
public static boolean getMagnetMode() {
return enabledActions.contains("magnet");
}
@@ -558,18 +637,14 @@ public class NEIClientConfig {
}
public static boolean canPerformAction(String name) {
if (!isEnabled())
return false;
if (!isEnabled()) return false;
if (!modePermitsAction(name))
return false;
if (!modePermitsAction(name)) return false;
String base = NEIActions.base(name);
if (hasSMPCounterpart)
return permissableActions.contains(base);
if (hasSMPCounterpart) return permissableActions.contains(base);
if (NEIActions.smpRequired(name))
return false;
if (NEIActions.smpRequired(name)) return false;
String cmd = getStringSetting("command." + base);
return cmd != null && cmd.startsWith("/");
@@ -580,9 +655,7 @@ public class NEIClientConfig {
if (getCheatMode() == 2) return true;
String[] actions = getStringArrSetting("inventory.utilities");
for (String action : actions)
if (action.equalsIgnoreCase(name))
return true;
for (String action : actions) if (action.equalsIgnoreCase(name)) return true;
return false;
}
@@ -597,8 +670,7 @@ public class NEIClientConfig {
public static void reloadSaves() {
File saveDir = new File(CommonUtils.getMinecraftDir(), "saves/NEI/local");
if (!saveDir.exists())
return;
if (!saveDir.exists()) return;
List<SaveFormatComparator> saves;
try {
@@ -608,12 +680,9 @@ public class NEIClientConfig {
return;
}
HashSet<String> saveFileNames = new HashSet<>();
for (SaveFormatComparator save : saves)
saveFileNames.add(save.getFileName());
for (SaveFormatComparator save : saves) saveFileNames.add(save.getFileName());
for (File file : saveDir.listFiles())
if (file.isDirectory() && !saveFileNames.contains(file.getName()))
ObfuscationRun.deleteDir(file, true);
if (file.isDirectory() && !saveFileNames.contains(file.getName())) ObfuscationRun.deleteDir(file, true);
}
}
+170 -92
View File
@@ -1,5 +1,13 @@
package codechicken.nei;
import static codechicken.nei.NEIClientConfig.canCheatItem;
import static codechicken.nei.NEIClientConfig.canPerformAction;
import static codechicken.nei.NEIClientConfig.getStringArrSetting;
import static codechicken.nei.NEIClientConfig.getStringSetting;
import static codechicken.nei.NEIClientConfig.hasSMPCounterPart;
import static codechicken.nei.NEIClientConfig.invCreativeMode;
import static codechicken.nei.NEIClientConfig.world;
import codechicken.lib.inventory.InventoryRange;
import codechicken.lib.inventory.InventoryUtils;
import codechicken.lib.util.LangProxy;
@@ -7,8 +15,24 @@ import codechicken.nei.api.GuiInfo;
import codechicken.nei.api.IInfiniteItemHandler;
import codechicken.nei.api.ItemInfo;
import com.google.common.collect.Iterables;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.MessageFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Collectors;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
@@ -19,28 +43,16 @@ import net.minecraft.util.IChatComponent;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.input.Keyboard;
import java.text.MessageFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
import static codechicken.nei.NEIClientConfig.canCheatItem;
import static codechicken.nei.NEIClientConfig.canPerformAction;
import static codechicken.nei.NEIClientConfig.getItemQuantity;
import static codechicken.nei.NEIClientConfig.getStringArrSetting;
import static codechicken.nei.NEIClientConfig.getStringSetting;
import static codechicken.nei.NEIClientConfig.hasSMPCounterPart;
import static codechicken.nei.NEIClientConfig.invCreativeMode;
import static codechicken.nei.NEIClientConfig.world;
public class NEIClientUtils extends NEIServerUtils
{
public class NEIClientUtils extends NEIServerUtils {
public static LangProxy lang = new LangProxy("nei");
/** Formats a number with group separator and at most 2 fraction digits. */
private static final Map<Locale, DecimalFormat> decimalFormatters = new HashMap<>();
public static final int ALT_HASH = 1 << 27;
public static final int SHIFT_HASH = 1 << 26;
public static final int CTRL_HASH = 1 << 25;
public static Minecraft mc() {
return Minecraft.getMinecraft();
}
@@ -50,8 +62,33 @@ public class NEIClientUtils extends NEIServerUtils
}
public static void printChatMessage(IChatComponent msg) {
if (mc().ingameGUI != null)
mc().ingameGUI.getChatGUI().printChatMessage(msg);
if (mc().ingameGUI != null) mc().ingameGUI.getChatGUI().printChatMessage(msg);
}
private static DecimalFormat getDecimalFormat() {
return decimalFormatters.computeIfAbsent(Locale.getDefault(Locale.Category.FORMAT), locale -> {
DecimalFormat numberFormat = new DecimalFormat(); // uses the necessary locale inside anyway
numberFormat.setGroupingUsed(true);
numberFormat.setMaximumFractionDigits(2);
numberFormat.setRoundingMode(RoundingMode.HALF_UP);
DecimalFormatSymbols decimalFormatSymbols = numberFormat.getDecimalFormatSymbols();
decimalFormatSymbols.setGroupingSeparator(','); // Use sensible separator for best clarity.
numberFormat.setDecimalFormatSymbols(decimalFormatSymbols);
return numberFormat;
});
}
public static String formatNumbers(BigInteger aNumber) {
return getDecimalFormat().format(aNumber);
}
public static String formatNumbers(long aNumber) {
return getDecimalFormat().format(aNumber);
}
public static String formatNumbers(double aNumber) {
return getDecimalFormat().format(aNumber);
}
public static void deleteHeldItem() {
@@ -59,7 +96,8 @@ public class NEIClientUtils extends NEIServerUtils
}
public static void dropHeldItem() {
mc().playerController.windowClick(((GuiContainer) mc().currentScreen).inventorySlots.windowId, -999, 0, 0, mc().thePlayer);
mc().playerController
.windowClick(((GuiContainer) mc().currentScreen).inventorySlots.windowId, -999, 0, 0, mc().thePlayer);
}
public static void deleteSlotStack(int slotNumber) {
@@ -67,12 +105,12 @@ public class NEIClientUtils extends NEIServerUtils
}
public static void decreaseSlotStack(int slotNumber) {
ItemStack stack = slotNumber == -999 ? getHeldItem() : mc().thePlayer.openContainer.getSlot(slotNumber).getStack();
if (stack == null)
return;
ItemStack stack = slotNumber == -999
? getHeldItem()
: mc().thePlayer.openContainer.getSlot(slotNumber).getStack();
if (stack == null) return;
if (stack.stackSize == 1)
deleteSlotStack(slotNumber);
if (stack.stackSize == 1) deleteSlotStack(slotNumber);
else {
stack = stack.copy();
stack.stackSize--;
@@ -88,8 +126,7 @@ public class NEIClientUtils extends NEIServerUtils
Container c = getGuiContainer().inventorySlots;
for (int i = 0; i < c.inventorySlots.size(); i++) {
Slot slot = c.getSlot(i);
if (slot == null)
continue;
if (slot == null) continue;
ItemStack stack = slot.getStack();
if (stack != null && stack.getItem() == type.getItem() && stack.getItemDamage() == type.getItemDamage()) {
@@ -106,21 +143,18 @@ public class NEIClientUtils extends NEIServerUtils
public static void setSlotContents(int slot, ItemStack item, boolean containerInv) {
NEICPH.sendSetSlot(slot, item, containerInv);
if (slot == -999)
mc().thePlayer.inventory.setItemStack(item);
if (slot == -999) mc().thePlayer.inventory.setItemStack(item);
}
/**
* @param mode -1 = normal cheats, 0 = no infinites, 1 = replenish stack
*/
public static void cheatItem(ItemStack stack, int button, int mode) {
if (!canCheatItem(stack))
return;
if (!canCheatItem(stack)) return;
if (mode == -1 && button == 0 && shiftKey() && NEIClientConfig.hasSMPCounterPart()) {
for (IInfiniteItemHandler handler : ItemInfo.infiniteHandlers) {
if (!handler.canHandleItem(stack))
continue;
if (!handler.canHandleItem(stack)) continue;
ItemStack inf = handler.getInfiniteItem(stack);
if (inf != null) {
@@ -152,25 +186,26 @@ public class NEIClientUtils extends NEIServerUtils
ItemStack stack = copyStack(base, i);
if (hasSMPCounterPart()) {
ItemStack typestack = copyStack(stack, 1);
if (!infinite && !canItemFitInInventory(mc().thePlayer, stack) && (mc().currentScreen instanceof GuiContainer)) {
if (!infinite
&& !canItemFitInInventory(mc().thePlayer, stack)
&& (mc().currentScreen instanceof GuiContainer)) {
GuiContainer gui = getGuiContainer();
final List<Iterable<Integer>> handlerSlots;
try {
GuiInfo.readLock.lock();
handlerSlots = GuiInfo.guiHandlers.stream()
.map(handler -> handler.getItemSpawnSlots(gui, typestack))
.filter(x -> x != null)
.collect(Collectors.toCollection(LinkedList::new));
.map(handler -> handler.getItemSpawnSlots(gui, typestack))
.filter(x -> x != null)
.collect(Collectors.toCollection(LinkedList::new));
} finally {
GuiInfo.readLock.unlock();
}
int increment = typestack.getMaxStackSize();
int given = 0;
for(int slotNo : Iterables.concat(handlerSlots)) {
for (int slotNo : Iterables.concat(handlerSlots)) {
Slot slot = gui.inventorySlots.getSlot(slotNo);
if(!slot.isItemValid(typestack) || !InventoryUtils.canStack(slot.getStack(), typestack))
continue;
if (!slot.isItemValid(typestack) || !InventoryUtils.canStack(slot.getStack(), typestack)) continue;
int qty = Math.min(stack.stackSize - given, increment);
int current = slot.getHasStack() ? slot.getStack().stackSize : 0;
@@ -180,17 +215,15 @@ public class NEIClientUtils extends NEIServerUtils
slot.putStack(newStack);
setSlotContents(slotNo, newStack, true);
given += qty;
if(given >= stack.stackSize)
break;
if (given >= stack.stackSize) break;
}
if(given > 0)
NEICPH.sendGiveItem(copyStack(typestack, given), false, false);
} else
NEICPH.sendGiveItem(stack, infinite, true);
if (given > 0) NEICPH.sendGiveItem(copyStack(typestack, given), false, false);
} else NEICPH.sendGiveItem(stack, infinite, true);
} else {
for (int given = 0; given < stack.stackSize; ) {
int qty = Math.min(stack.stackSize - given, stack.getMaxStackSize());
sendCommand(getStringSetting("command.item"),
sendCommand(
getStringSetting("command.item"),
mc().thePlayer.getCommandSenderName(),
Item.getIdFromItem(stack.getItem()),
qty,
@@ -215,20 +248,17 @@ public class NEIClientUtils extends NEIServerUtils
}
public static int getGamemode() {
if (invCreativeMode())
return 2;
else if (mc().playerController.isInCreativeMode())
return 1;
else if (mc().playerController.currentGameType.isAdventure())
return 3;
else
return 0;
if (invCreativeMode()) return 2;
else if (mc().playerController.isInCreativeMode()) return 1;
else if (mc().playerController.currentGameType.isAdventure()) return 3;
else return 0;
}
public static boolean isValidGamemode(String s) {
return s.equals("survival") ||
canPerformAction(s) &&
Arrays.asList(getStringArrSetting("inventory.gamemodes")).contains(s);
return s.equals("survival")
|| canPerformAction(s)
&& Arrays.asList(getStringArrSetting("inventory.gamemodes"))
.contains(s);
}
public static int getNextGamemode() {
@@ -236,8 +266,7 @@ public class NEIClientUtils extends NEIServerUtils
int nmode = mode;
while (true) {
nmode = (nmode + 1) % NEIActions.gameModes.length;
if (nmode == mode || isValidGamemode(NEIActions.gameModes[nmode]))
break;
if (nmode == mode || isValidGamemode(NEIActions.gameModes[nmode])) break;
}
return nmode;
}
@@ -245,13 +274,14 @@ public class NEIClientUtils extends NEIServerUtils
public static void cycleGamemode() {
int mode = getGamemode();
int nmode = getNextGamemode();
if (mode == nmode)
return;
if (mode == nmode) return;
if (hasSMPCounterPart())
NEICPH.sendGamemode(nmode);
if (hasSMPCounterPart()) NEICPH.sendGamemode(nmode);
else
sendCommand(getStringSetting("command.creative"), getGameType(nmode), mc().thePlayer.getCommandSenderName());
sendCommand(
getStringSetting("command.creative"),
getGameType(nmode),
mc().thePlayer.getCommandSenderName());
}
public static long getTime() {
@@ -266,15 +296,12 @@ public class NEIClientUtils extends NEIServerUtils
long day = (getTime() / 24000L) * 24000L;
long newTime = day + 24000L + hour * 1000;
if (hasSMPCounterPart())
NEICPH.sendSetTime(hour);
else
sendCommand(getStringSetting("command.time"), newTime);
if (hasSMPCounterPart()) NEICPH.sendSetTime(hour);
else sendCommand(getStringSetting("command.time"), newTime);
}
public static void sendCommand(String command, Object... args) {
if (command.length() == 0)
return;
if (command.length() == 0) return;
NumberFormat numberformat = NumberFormat.getIntegerInstance();
numberformat.setGroupingUsed(false);
@@ -291,22 +318,17 @@ public class NEIClientUtils extends NEIServerUtils
}
public static void toggleRaining() {
if (hasSMPCounterPart())
NEICPH.sendToggleRain();
else
sendCommand(getStringSetting("command.rain"), isRaining() ? 0 : 1);
if (hasSMPCounterPart()) NEICPH.sendToggleRain();
else sendCommand(getStringSetting("command.rain"), isRaining() ? 0 : 1);
}
public static void healPlayer() {
if (hasSMPCounterPart())
NEICPH.sendHeal();
else
sendCommand(getStringSetting("command.heal"), mc().thePlayer.getCommandSenderName());
if (hasSMPCounterPart()) NEICPH.sendHeal();
else sendCommand(getStringSetting("command.heal"), mc().thePlayer.getCommandSenderName());
}
public static void toggleMagnetMode() {
if (hasSMPCounterPart())
NEICPH.sendToggleMagnetMode();
if (hasSMPCounterPart()) NEICPH.sendToggleMagnetMode();
}
public static ArrayList<int[]> concatIntegersToRanges(List<Integer> damages) {
@@ -322,24 +344,40 @@ public class NEIClientUtils extends NEIServerUtils
continue;
}
if (next + 1 != i) {
ranges.add(new int[]{start, next});
ranges.add(new int[] {start, next});
start = next = i;
continue;
}
next = i;
}
ranges.add(new int[]{start, next});
ranges.add(new int[] {start, next});
return ranges;
}
public static ArrayList<int[]> addIntegersToRanges(List<int[]> ranges, List<Integer> damages) {
for (int[] range : ranges)
for (int integer = range[0]; integer <= range[1]; integer++)
damages.add(integer);
for (int[] range : ranges) for (int integer = range[0]; integer <= range[1]; integer++) damages.add(integer);
return concatIntegersToRanges(damages);
}
public static String cropText(FontRenderer fontRenderer, String text, int containerWidth) {
int textWidth = fontRenderer.getStringWidth(text);
if (textWidth > containerWidth) {
textWidth += fontRenderer.getStringWidth("...");
while (textWidth > containerWidth) {
textWidth -= fontRenderer.getCharWidth(text.charAt(text.length() - 1));
text = text.substring(0, text.length() - 1);
}
return text + "...";
}
return text;
}
public static boolean safeKeyDown(int keyCode) {
try {
return Keyboard.isKeyDown(keyCode);
@@ -354,8 +392,7 @@ public class NEIClientUtils extends NEIServerUtils
}
public static GuiContainer getGuiContainer() {
if (mc().currentScreen instanceof GuiContainer)
return (GuiContainer) mc().currentScreen;
if (mc().currentScreen instanceof GuiContainer) return (GuiContainer) mc().currentScreen;
return null;
}
@@ -364,7 +401,48 @@ public class NEIClientUtils extends NEIServerUtils
return Keyboard.isKeyDown(Keyboard.KEY_LMENU) || Keyboard.isKeyDown(Keyboard.KEY_RMENU);
}
public static int getMetaHash() {
if (Keyboard.getEventKeyState()) {
int hash = 0;
if (altKey()) {
hash = hash | ALT_HASH;
}
if (shiftKey()) {
hash = hash | SHIFT_HASH;
}
if (controlKey()) {
hash = hash | CTRL_HASH;
}
return hash;
}
return 0;
}
public static int getKeyHash() {
if (Keyboard.getEventKeyState()) {
final int keycode = Keyboard.getEventKey();
if (keycode != Keyboard.KEY_LSHIFT
&& keycode != Keyboard.KEY_RSHIFT
&& keycode != Keyboard.KEY_LCONTROL
&& keycode != Keyboard.KEY_RCONTROL
&& keycode != Keyboard.KEY_LMENU
&& keycode != Keyboard.KEY_RMENU) {
return getMetaHash() + keycode;
}
}
return Keyboard.CHAR_NONE;
}
public static void playClickSound() {
mc().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
mc().getSoundHandler()
.playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
}
}
@@ -1,5 +1,3 @@
package codechicken.nei;
public class NEICompatibility
{
}
public class NEICompatibility {}
@@ -1,5 +1,7 @@
package codechicken.nei;
import static codechicken.lib.gui.GuiDraw.getMousePosition;
import codechicken.nei.api.API;
import codechicken.nei.api.GuiInfo;
import codechicken.nei.api.IInfiniteItemHandler;
@@ -9,6 +11,8 @@ import codechicken.nei.guihook.GuiContainerManager;
import codechicken.nei.guihook.IContainerInputHandler;
import codechicken.nei.guihook.IContainerSlotClickHandler;
import codechicken.nei.recipe.GuiRecipe;
import java.awt.Point;
import java.util.LinkedList;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.gui.inventory.GuiContainerCreative;
import net.minecraft.entity.player.InventoryPlayer;
@@ -16,13 +20,7 @@ import net.minecraft.inventory.Slot;
import net.minecraft.inventory.SlotCrafting;
import net.minecraft.item.ItemStack;
import java.awt.Point;
import java.util.LinkedList;
import static codechicken.lib.gui.GuiDraw.getMousePosition;
public class NEIController implements IContainerSlotClickHandler, IContainerInputHandler
{
public class NEIController implements IContainerSlotClickHandler, IContainerInputHandler {
private static final NEIController instance = new NEIController();
public static GuiContainerManager manager;
@@ -45,12 +43,10 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
deleteMode = false;
GuiInfo.clearGuiHandlers();
fastTransferManager = null;
if (!NEIClientConfig.isEnabled())
return;
if (!NEIClientConfig.isEnabled()) return;
fastTransferManager = new FastTransferManager();
if (gui instanceof INEIGuiHandler)
API.registerNEIGuiHandler((INEIGuiHandler) gui);
if (gui instanceof INEIGuiHandler) API.registerNEIGuiHandler((INEIGuiHandler) gui);
}
public static boolean isSpreading(GuiContainer gui) {
@@ -58,8 +54,7 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
}
public static void updateUnlimitedItems(InventoryPlayer inventory) {
if (!NEIClientConfig.canPerformAction("item") || !NEIClientConfig.hasSMPCounterPart())
return;
if (!NEIClientConfig.canPerformAction("item") || !NEIClientConfig.hasSMPCounterPart()) return;
LinkedList<ItemStack> beforeStacks = new LinkedList<>();
for (int i = 0; i < inventory.getSizeInventory(); i++)
@@ -67,8 +62,7 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
for (int i = 0; i < inventory.getSizeInventory(); i++) {
ItemStack stack = inventory.getStackInSlot(i);
if (stack == null)
continue;
if (stack == null) continue;
for (IInfiniteItemHandler handler : ItemInfo.infiniteHandlers)
if (handler.canHandleItem(stack) && handler.isItemInfinite(stack))
@@ -79,8 +73,8 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
ItemStack newstack = inventory.getStackInSlot(i);
if (!NEIServerUtils.areStacksIdentical(beforeStacks.get(i), newstack)) {
inventory.setInventorySlotContents(i, beforeStacks.get(i));//restore in case of SMP fail
NEIClientUtils.setSlotContents(i, newstack, false);//sends via SMP handler ;)
inventory.setInventorySlotContents(i, beforeStacks.get(i)); // restore in case of SMP fail
NEIClientUtils.setSlotContents(i, newstack, false); // sends via SMP handler ;)
}
}
}
@@ -88,11 +82,13 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
public static void processCreativeCycling(InventoryPlayer inventory) {
if (NEIClientConfig.invCreativeMode() && NEIClientUtils.controlKey()) {
if (selectedItem != inventory.currentItem) {
if (inventory.currentItem == selectedItem + 1 || (inventory.currentItem == 0 && selectedItem == 8))//foward
if (inventory.currentItem == selectedItem + 1
|| (inventory.currentItem == 0 && selectedItem == 8)) // foward
{
NEICPH.sendCreativeScroll(1);
inventory.currentItem = selectedItem;
} else if (inventory.currentItem == selectedItem - 1 || (inventory.currentItem == 8 && selectedItem == 0)) {
} else if (inventory.currentItem == selectedItem - 1
|| (inventory.currentItem == 8 && selectedItem == 0)) {
NEICPH.sendCreativeScroll(-1);
inventory.currentItem = selectedItem;
}
@@ -104,51 +100,48 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
@Override
public void beforeSlotClick(GuiContainer gui, int slotIndex, int button, Slot slot, int modifier) {
if (!NEIClientConfig.isEnabled())
return;
if (!NEIClientConfig.isEnabled()) return;
firstheld = NEIClientUtils.getHeldItem();
}
@Override
public boolean handleSlotClick(GuiContainer gui, int slotIndex, int button, Slot slot, int modifier, boolean eventconsumed) {
if (eventconsumed ||
!NEIClientConfig.isEnabled() ||
isSpreading(gui))
return eventconsumed;
public boolean handleSlotClick(
GuiContainer gui, int slotIndex, int button, Slot slot, int modifier, boolean eventconsumed) {
if (eventconsumed || !NEIClientConfig.isEnabled() || isSpreading(gui)) return eventconsumed;
if (deleteMode && slotIndex >= 0 && slot != null) {
if (NEIClientUtils.shiftKey() && button == 0) {
ItemStack itemstack1 = slot.getStack();
if (itemstack1 != null)
NEIClientUtils.deleteItemsOfType(itemstack1);
if (itemstack1 != null) NEIClientUtils.deleteItemsOfType(itemstack1);
} else if (button == 1)
NEIClientUtils.decreaseSlotStack(slot.slotNumber);
else
NEIClientUtils.deleteSlotStack(slot.slotNumber);
} else if (button == 1) NEIClientUtils.decreaseSlotStack(slot.slotNumber);
else NEIClientUtils.deleteSlotStack(slot.slotNumber);
return true;
}
if (button == 1 && slot instanceof SlotCrafting)//right click
if (button == 1 && slot instanceof SlotCrafting) // right click
{
for (int i1 = 0; i1 < 64; i1++)//click this slot 64 times
manager.handleSlotClick(slot.slotNumber, button, 0);
for (int i1 = 0; i1 < 64; i1++) // click this slot 64 times
manager.handleSlotClick(slot.slotNumber, button, 0);
return true;
}
if (NEIClientUtils.controlKey()
&& modifier != 4//Drop key pressed: net.minecraft.client.gui.inventory.GuiContainer.keyTyped
&& slot != null && slot.getStack() != null
&& modifier != 4 // Drop key pressed: net.minecraft.client.gui.inventory.GuiContainer.keyTyped
&& slot != null
&& slot.getStack() != null
&& slot.isItemValid(slot.getStack())) {
NEIClientUtils.cheatItem(slot.getStack(), button, 1);
return true;
}
if(GuiInfo.hasCustomSlots(gui))
return false;
if (GuiInfo.hasCustomSlots(gui)) return false;
if (slotIndex >= 0 && NEIClientUtils.shiftKey() && NEIClientUtils.getHeldItem() != null && !slot.getHasStack()) {
if (slotIndex >= 0
&& NEIClientUtils.shiftKey()
&& NEIClientUtils.getHeldItem() != null
&& !slot.getHasStack()) {
ItemStack held = NEIClientUtils.getHeldItem();
manager.handleSlotClick(slot.slotNumber, button, 0);
if (slot.isItemValid(held) && !ItemInfo.fastTransferExemptions.contains(slot.getClass()))
@@ -167,16 +160,16 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
@Override
public void afterSlotClick(GuiContainer gui, int slotIndex, int button, Slot slot, int modifier) {
if (!NEIClientConfig.isEnabled())
return;
if (!NEIClientConfig.isEnabled()) return;
ItemStack nowHeld = NEIClientUtils.getHeldItem();
if (firstheld != nowHeld)
pickedUpFromSlot = slotIndex;
if (firstheld != nowHeld) pickedUpFromSlot = slotIndex;
if (NEIClientConfig.canPerformAction("item") && NEIClientConfig.hasSMPCounterPart()) {
if (heldStackInfinite != null && slot != null && slot.inventory == NEIClientUtils.mc().thePlayer.inventory) {
if (heldStackInfinite != null
&& slot != null
&& slot.inventory == NEIClientUtils.mc().thePlayer.inventory) {
ItemStack stack = slot.getStack();
if (stack != null) {
heldStackInfinite.onPlaceInfinite(stack);
@@ -184,8 +177,7 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
NEIClientUtils.setSlotContents(slotIndex, stack, true);
}
if (firstheld != nowHeld)
heldStackInfinite = null;
if (firstheld != nowHeld) heldStackInfinite = null;
if (firstheld != nowHeld && nowHeld != null) {
for (IInfiniteItemHandler handler : ItemInfo.infiniteHandlers) {
@@ -202,14 +194,10 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
@Override
public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyCode) {
if (!NEIClientConfig.isEnabled() ||
GuiInfo.hasCustomSlots(gui) ||
isSpreading(gui))
return false;
if (!NEIClientConfig.isEnabled() || GuiInfo.hasCustomSlots(gui) || isSpreading(gui)) return false;
Slot slot = GuiContainerManager.getSlotMouseOver(gui);
if (slot == null)
return false;
if (slot == null) return false;
int slotIndex = slot.slotNumber;
@@ -226,22 +214,23 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
@Override
public boolean mouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {
if (!NEIClientConfig.isEnabled() || GuiInfo.hasCustomSlots(gui) || !NEIClientConfig.isMouseScrollTransferEnabled())
return false;
if (!NEIClientConfig.isEnabled()
|| GuiInfo.hasCustomSlots(gui)
|| !NEIClientConfig.isMouseScrollTransferEnabled()) return false;
// slot in GuiRecipe does not contain actual stack
// and scroll should be handled by GuiRecipe, not here
if (gui instanceof GuiRecipe) return false;
Point mousePos = getMousePosition();
Slot mouseover = manager.window.getSlotAtPosition(mousePos.x, mousePos.y);
if (mouseover != null && mouseover.getHasStack()) {
if(NEIClientConfig.shouldInvertMouseScrollTransfer()) {
if (NEIClientConfig.shouldInvertMouseScrollTransfer()) {
scrolled = -scrolled;
}
if (scrolled > 0)
fastTransferManager.transferItem(manager.window, mouseover.slotNumber);
else
fastTransferManager.retrieveItem(manager.window, mouseover.slotNumber);
// slot in GuiRecipe does not contain an actual stack
// and scroll should also be handled by GuiRecipe
return !(gui instanceof GuiRecipe);
if (scrolled > 0) fastTransferManager.transferItem(manager.window, mouseover.slotNumber);
else fastTransferManager.retrieveItem(manager.window, mouseover.slotNumber);
return true;
}
return false;
}
@@ -257,32 +246,26 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
}
@Override
public void onKeyTyped(GuiContainer gui, char keyChar, int keyID) {
}
public void onKeyTyped(GuiContainer gui, char keyChar, int keyID) {}
@Override
public void onMouseClicked(GuiContainer gui, int mousex, int mousey, int button) {
}
public void onMouseClicked(GuiContainer gui, int mousex, int mousey, int button) {}
@Override
public void onMouseDragged(GuiContainer gui, int mousex, int mousey, int button, long heldTime) {
}
public void onMouseDragged(GuiContainer gui, int mousex, int mousey, int button, long heldTime) {}
@Override
public void onMouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {
}
public void onMouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {}
@Override
public void onMouseUp(GuiContainer gui, int mousex, int mousey, int button) {
}
public void onMouseUp(GuiContainer gui, int mousex, int mousey, int button) {}
public static boolean canUseDeleteMode() {
return !(NEIClientUtils.getGuiContainer() instanceof GuiContainerCreative);
}
public static void toggleDeleteMode() {
if(canUseDeleteMode())
deleteMode = !deleteMode;
if (canUseDeleteMode()) deleteMode = !deleteMode;
}
public static boolean getDeleteMode() {
@@ -5,18 +5,14 @@ import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.gui.inventory.GuiContainerCreative;
import net.minecraft.creativetab.CreativeTabs;
public class NEICreativeGuiHandler extends INEIGuiAdapter
{
public class NEICreativeGuiHandler extends INEIGuiAdapter {
@Override
public VisiblityData modifyVisiblity(GuiContainer gui, VisiblityData currentVisibility)
{
if(!(gui instanceof GuiContainerCreative))
return currentVisibility;
if(((GuiContainerCreative)gui).func_147056_g() != CreativeTabs.tabInventory.getTabIndex())
public VisiblityData modifyVisiblity(GuiContainer gui, VisiblityData currentVisibility) {
if (!(gui instanceof GuiContainerCreative)) return currentVisibility;
if (((GuiContainerCreative) gui).func_147056_g() != CreativeTabs.tabInventory.getTabIndex())
currentVisibility.showItemSection = currentVisibility.enableDeleteMode = false;
return currentVisibility;
}
}
@@ -7,15 +7,14 @@ import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
public class NEIDummySlotHandler extends INEIGuiAdapter
{
public class NEIDummySlotHandler extends INEIGuiAdapter {
@Override
public boolean handleDragNDrop(GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button)
{
public boolean handleDragNDrop(GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button) {
Slot slot = gui.getSlotAtPosition(mousex, mousey);
if(slot instanceof SlotDummy && slot.isItemValid(draggedStack) && gui.inventorySlots instanceof ContainerExtended)
{
((SlotDummy)slot).slotClick(draggedStack, button, NEIClientUtils.shiftKey());
if (slot instanceof SlotDummy
&& slot.isItemValid(draggedStack)
&& gui.inventorySlots instanceof ContainerExtended) {
((SlotDummy) slot).slotClick(draggedStack, button, NEIClientUtils.shiftKey());
NEICPH.sendDummySlotSet(slot.slotNumber, slot.getStack());
return true;
}
@@ -6,7 +6,6 @@ import codechicken.nei.api.IConfigureNEI;
import codechicken.nei.asm.NEICorePlugin;
import codechicken.nei.config.IMCHandler;
import codechicken.nei.recipe.GuiRecipeTab;
import codechicken.nei.recipe.RecipeCatalysts;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import cpw.mods.fml.client.FMLFileResourcePack;
@@ -22,13 +21,11 @@ import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.versioning.ArtifactVersion;
import cpw.mods.fml.common.versioning.VersionParser;
import cpw.mods.fml.common.versioning.VersionRange;
import net.minecraft.util.EnumChatFormatting;
import java.io.File;
import java.util.*;
import net.minecraft.util.EnumChatFormatting;
public class NEIModContainer extends DummyModContainer
{
public class NEIModContainer extends DummyModContainer {
public static LinkedList<IConfigureNEI> plugins = new LinkedList<>();
private static boolean gregTech5Loaded;
@@ -43,9 +40,10 @@ public class NEIModContainer extends DummyModContainer
modMetadata.name = "GRADLETOKEN_MODNAME";
modMetadata.modId = "GRADLETOKEN_MODID";
modMetadata.version = "GRADLETOKEN_VERSION";
modMetadata.authorList = Arrays.asList( "ChickenBones", "mitchej123" );
modMetadata.authorList = Arrays.asList("ChickenBones", "mitchej123");
modMetadata.url = "https://github.com/GTNewHorizons/NotEnoughItems";
modMetadata.description = "Recipe Viewer, Inventory Manager, Item Spawner, Cheats and more; GTNH Version includes many enhancements.";
modMetadata.description =
"Recipe Viewer, Inventory Manager, Item Spawner, Cheats and more; GTNH Version includes many enhancements.";
return modMetadata;
}
@@ -56,7 +54,7 @@ public class NEIModContainer extends DummyModContainer
@Override
public Set<ArtifactVersion> getRequirements() {
Set<ArtifactVersion> deps = new HashSet<>();
deps.add(VersionParser.parseVersionReference("CodeChickenCore@["+CodeChickenCorePlugin.version+",)"));
deps.add(VersionParser.parseVersionReference("CodeChickenCore@[" + CodeChickenCorePlugin.version + ",)"));
return deps;
}
@@ -66,8 +64,9 @@ public class NEIModContainer extends DummyModContainer
}
private String description;
private void loadMetadata() {
description = super.getMetadata().description.replace("Supporters:", EnumChatFormatting.AQUA+"Supporters:");
description = super.getMetadata().description.replace("Supporters:", EnumChatFormatting.AQUA + "Supporters:");
}
@Override
@@ -78,8 +77,7 @@ public class NEIModContainer extends DummyModContainer
} else {
s_plugins.append(EnumChatFormatting.GREEN).append("Installed plugins: ");
for (int i = 0; i < plugins.size(); i++) {
if (i > 0)
s_plugins.append(", ");
if (i > 0) s_plugins.append(", ");
IConfigureNEI plugin = plugins.get(i);
s_plugins.append(plugin.getName()).append(" ").append(plugin.getVersion());
}
@@ -100,17 +98,16 @@ public class NEIModContainer extends DummyModContainer
@Subscribe
public void preInit(FMLPreInitializationEvent event) {
gregTech5Loaded = Loader.isModLoaded("gregtech") && !Loader.isModLoaded("gregapi_post");
if (CommonUtils.isClient())
ClientHandler.preInit();
if (CommonUtils.isClient()) ClientHandler.preInit();
}
@Subscribe
public void init(FMLInitializationEvent event) {
if (CommonUtils.isClient())
ClientHandler.load();
if (CommonUtils.isClient()) ClientHandler.load();
ServerHandler.load();
}
@Subscribe
public void postInit(FMLPostInitializationEvent event) {
if (CommonUtils.isClient()) {
@@ -0,0 +1,50 @@
package codechicken.nei;
import codechicken.lib.vec.Rectangle4i;
import codechicken.nei.api.INEIGuiAdapter;
import java.util.Collection;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.renderer.InventoryEffectRenderer;
import net.minecraft.potion.PotionEffect;
/**
* Inspired by InventoryEffectRendererGuiHandler.java in JEI
*/
public class NEIPotionGuiHandler extends INEIGuiAdapter {
@Override
public boolean hideItemPanelSlot(GuiContainer guiContainer, int slotX, int slotY, int slotW, int slotH) {
if (NEIClientConfig.ignorePotionOverlap()) {
return false;
}
if (guiContainer instanceof InventoryEffectRenderer) {
int x = guiContainer.guiLeft - 124;
int y = guiContainer.guiTop;
Minecraft minecraft = guiContainer.mc;
if (minecraft == null) {
return false;
}
EntityPlayerSP player = minecraft.thePlayer;
if (player == null) {
return false;
}
Collection<PotionEffect> activePotionEffects = player.getActivePotionEffects();
if (activePotionEffects.isEmpty()) {
return false;
}
int height = 33;
if (activePotionEffects.size() > 5) {
height = 132 / (activePotionEffects.size() - 1);
}
Rectangle4i slotRect = new Rectangle4i(slotX, slotY, slotW, slotH);
for (PotionEffect potioneffect : activePotionEffects) {
Rectangle4i box = new Rectangle4i(x, y, 140, 32);
if (box.intersects(slotRect)) return true;
y += height;
}
}
return false;
}
}
+37 -45
View File
@@ -7,6 +7,8 @@ import codechicken.lib.packet.PacketCustom;
import codechicken.lib.packet.PacketCustom.IServerPacketHandler;
import codechicken.lib.vec.BlockCoord;
import cpw.mods.fml.relauncher.Side;
import java.util.LinkedList;
import java.util.Set;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.InventoryBasic;
@@ -17,15 +19,10 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityMobSpawner;
import net.minecraft.world.World;
import java.util.LinkedList;
import java.util.Set;
public class NEISPH implements IServerPacketHandler
{
public class NEISPH implements IServerPacketHandler {
@Override
public void handlePacket(PacketCustom packet, EntityPlayerMP sender, INetHandlerPlayServer netHandler) {
if (!NEIServerConfig.authenticatePacket(sender, packet))
return;
if (!NEIServerConfig.authenticatePacket(sender, packet)) return;
switch (packet.getType()) {
case 1:
@@ -90,8 +87,7 @@ public class NEISPH implements IServerPacketHandler
ItemStack stack = packet.readItemStack(true);
Slot slot = sender.openContainer.getSlot(slotNumber);
if (slot instanceof SlotDummy)
slot.putStack(stack);
if (slot instanceof SlotDummy) slot.putStack(stack);
}
private void handleMobSpawnerID(World world, BlockCoord coord, String mobtype) {
@@ -111,12 +107,18 @@ public class NEISPH implements IServerPacketHandler
public static void processCreativeInv(EntityPlayerMP sender, boolean open) {
if (open) {
ServerUtils.openSMPContainer(sender, new ContainerCreativeInv(sender, new ExtendedCreativeInv(NEIServerConfig.forPlayer(sender.getCommandSenderName()), Side.SERVER)), (player, windowId) -> {
PacketCustom packet = new PacketCustom(channel, 23);
packet.writeBoolean(true);
packet.writeByte(windowId);
packet.sendToPlayer(player);
});
ServerUtils.openSMPContainer(
sender,
new ContainerCreativeInv(
sender,
new ExtendedCreativeInv(
NEIServerConfig.forPlayer(sender.getCommandSenderName()), Side.SERVER)),
(player, windowId) -> {
PacketCustom packet = new PacketCustom(channel, 23);
packet.writeBoolean(true);
packet.writeByte(windowId);
packet.sendToPlayer(player);
});
} else {
sender.closeContainer();
PacketCustom packet = new PacketCustom(channel, 23);
@@ -135,7 +137,8 @@ public class NEISPH implements IServerPacketHandler
ItemStack item = packet.readItemStack();
ItemStack old = NEIServerUtils.getSlotContents(player, slot, container);
boolean deleting = item == null || old != null && NEIServerUtils.areStacksSameType(item, old) && item.stackSize < old.stackSize;
boolean deleting = item == null
|| old != null && NEIServerUtils.areStacksSameType(item, old) && item.stackSize < old.stackSize;
if (NEIServerConfig.canPlayerPerformAction(player.getCommandSenderName(), deleting ? "delete" : "item"))
NEIServerUtils.setSlotContents(player, slot, item, container);
}
@@ -150,17 +153,19 @@ public class NEISPH implements IServerPacketHandler
}
private void openEnchantmentGui(EntityPlayerMP player) {
ServerUtils.openSMPContainer(player, new ContainerEnchantmentModifier(player.inventory, player.worldObj, 0, 0, 0), (player1, windowId) -> {
PacketCustom packet = new PacketCustom(channel, 21);
packet.writeByte(windowId);
packet.sendToPlayer(player1);
});
ServerUtils.openSMPContainer(
player,
new ContainerEnchantmentModifier(player.inventory, player.worldObj, 0, 0, 0),
(player1, windowId) -> {
PacketCustom packet = new PacketCustom(channel, 21);
packet.writeByte(windowId);
packet.sendToPlayer(player1);
});
}
private void openPotionGui(EntityPlayerMP player, PacketCustom packet) {
InventoryBasic b = new InventoryBasic("potionStore", true, 9);
for (int i = 0; i < b.getSizeInventory(); i++)
b.setInventorySlotContents(i, packet.readItemStack());
for (int i = 0; i < b.getSizeInventory(); i++) b.setInventorySlotContents(i, packet.readItemStack());
ServerUtils.openSMPContainer(player, new ContainerPotionCreator(player.inventory, b), (player1, windowId) -> {
PacketCustom packet1 = new PacketCustom(channel, 24);
packet1.writeByte(windowId);
@@ -169,17 +174,11 @@ public class NEISPH implements IServerPacketHandler
}
public static void sendActionDisabled(int dim, String name, boolean disable) {
new PacketCustom(channel, 11)
.writeString(name)
.writeBoolean(disable)
.sendToDimension(dim);
new PacketCustom(channel, 11).writeString(name).writeBoolean(disable).sendToDimension(dim);
}
public static void sendActionEnabled(EntityPlayerMP player, String name, boolean enable) {
new PacketCustom(channel, 12)
.writeString(name)
.writeBoolean(enable)
.sendToPlayer(player);
new PacketCustom(channel, 12).writeString(name).writeBoolean(enable).sendToPlayer(player);
}
private void sendLoginState(EntityPlayerMP player) {
@@ -190,12 +189,9 @@ public class NEISPH implements IServerPacketHandler
PlayerSave playerSave = NEIServerConfig.forPlayer(player.getCommandSenderName());
for (String name : NEIActions.nameActionMap.keySet()) {
if (NEIServerConfig.canPlayerPerformAction(player.getCommandSenderName(), name))
actions.add(name);
if (NEIServerConfig.isActionDisabled(player.dimension, name))
disabled.add(name);
if (playerSave.isActionEnabled(name))
enabled.add(name);
if (NEIServerConfig.canPlayerPerformAction(player.getCommandSenderName(), name)) actions.add(name);
if (NEIServerConfig.isActionDisabled(player.dimension, name)) disabled.add(name);
if (playerSave.isActionEnabled(name)) enabled.add(name);
}
for (ItemStackMap.Entry<Set<String>> entry : NEIServerConfig.bannedItems.entries())
if (!NEIServerConfig.isPlayerInList(player.getCommandSenderName(), entry.value, true))
@@ -204,20 +200,16 @@ public class NEISPH implements IServerPacketHandler
PacketCustom packet = new PacketCustom(channel, 10);
packet.writeByte(actions.size());
for (String s : actions)
packet.writeString(s);
for (String s : actions) packet.writeString(s);
packet.writeByte(disabled.size());
for (String s : disabled)
packet.writeString(s);
for (String s : disabled) packet.writeString(s);
packet.writeByte(enabled.size());
for (String s : enabled)
packet.writeString(s);
for (String s : enabled) packet.writeString(s);
packet.writeInt(bannedItems.size());
for (ItemStack stack : bannedItems)
packet.writeItemStack(stack);
for (ItemStack stack : bannedItems) packet.writeItemStack(stack);
packet.sendToPlayer(player);
}
@@ -5,6 +5,17 @@ import codechicken.core.ServerUtils;
import codechicken.lib.config.ConfigFile;
import codechicken.lib.inventory.InventoryUtils;
import codechicken.lib.packet.PacketCustom;
import java.io.File;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Blocks;
@@ -18,20 +29,7 @@ import org.apache.commons.io.IOUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.File;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class NEIServerConfig
{
public class NEIServerConfig {
private static MinecraftServer server;
public static Logger logger = LogManager.getLogger("NotEnoughItems");
@@ -62,7 +60,7 @@ public class NEIServerConfig
try {
File file = new File(getSaveDir(world), "world.dat");
NBTTagCompound tag = NEIServerUtils.readNBT(file);
if(tag == null) tag = new NBTTagCompound();
if (tag == null) tag = new NBTTagCompound();
dimTags.put(CommonUtils.getDimension(world), tag);
} catch (Exception e) {
throw new RuntimeException(e);
@@ -75,7 +73,9 @@ public class NEIServerConfig
serverConfig.setNewLineMode(1);
serverConfig.getTag("permissions").useBraces();
serverConfig.getTag("permissions").setComment("List of players who can use these features.\nEg. time=CodeChicken, Friend1");
serverConfig
.getTag("permissions")
.setComment("List of players who can use these features.\nEg. time=CodeChicken, Friend1");
setDefaultFeature("time");
setDefaultFeature("rain");
@@ -93,13 +93,11 @@ public class NEIServerConfig
}
private static void setDefaultFeature(String featurename, String... names) {
if (names.length == 0)
names = new String[]{"OP"};
if (names.length == 0) names = new String[] {"OP"};
StringBuilder list = new StringBuilder();
for (int i = 0; i < names.length; i++) {
if (i >= 1)
list.append(", ");
if (i >= 1) list.append(", ");
list.append(names[i]);
}
serverConfig.getTag("permissions." + featurename).setDefaultValue(list.toString());
@@ -119,14 +117,12 @@ public class NEIServerConfig
}
public static boolean isPlayerInList(String playername, Set<String> list, boolean allowCards) {
if (playername.equals("CONSOLE"))
return list.contains(playername);
if (playername.equals("CONSOLE")) return list.contains(playername);
playername = playername.toLowerCase();
if (allowCards) {
if (list.contains("ALL"))
return true;
if (list.contains("ALL")) return true;
if ((ServerUtils.isPlayerOP(playername) || ServerUtils.isPlayerOwner(playername)) && list.contains("OP"))
return true;
}
@@ -173,8 +169,7 @@ public class NEIServerConfig
StringBuilder sb = new StringBuilder();
int i = 0;
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); i++) {
if (i != 0)
sb.append(", ");
if (i != 0) sb.append(", ");
sb.append(iterator.next());
}
@@ -185,7 +180,7 @@ public class NEIServerConfig
private static void loadBannedItems() {
bannedItems.clear();
File file = new File(saveDir, "banneditems.cfg");
if(!file.exists()) {
if (!file.exists()) {
bannedItems.put(new ItemStack(Blocks.command_block), new HashSet<>(Collections.singletonList("NONE")));
saveBannedItems();
return;
@@ -193,22 +188,20 @@ public class NEIServerConfig
try {
FileReader r = new FileReader(file);
int line = 0;
for(String s : IOUtils.readLines(r)) {
if(s.charAt(0) == '#' || s.trim().length() == 0)
continue;
for (String s : IOUtils.readLines(r)) {
if (s.charAt(0) == '#' || s.trim().length() == 0) continue;
int delim = s.lastIndexOf('=');
if(delim < 0) {
logger.error("line "+line+": Missing =");
if (delim < 0) {
logger.error("line " + line + ": Missing =");
continue;
}
try {
NBTTagCompound key = (NBTTagCompound) JsonToNBT.func_150315_a(s.substring(0, delim));
Set<String> values = new HashSet<>();
for(String s2 : s.substring(delim+1).split(","))
values.add(s2.trim());
for (String s2 : s.substring(delim + 1).split(",")) values.add(s2.trim());
bannedItems.put(InventoryUtils.loadPersistant(key), values);
} catch (Exception e) {
logger.error("line "+line+": "+e.getMessage());
logger.error("line " + line + ": " + e.getMessage());
}
}
r.close();
@@ -220,22 +213,22 @@ public class NEIServerConfig
public static void saveBannedItems() {
File file = new File(saveDir, "banneditems.cfg");
try {
if(!file.exists())
file.createNewFile();
if (!file.exists()) file.createNewFile();
PrintWriter p = new PrintWriter(file);
p.println("#Saved in this format for external editing. The format isn't that hard to figure out. If you think you're up to it, modify it here!");
p.println(
"#Saved in this format for external editing. The format isn't that hard to figure out. If you think you're up to it, modify it here!");
for (ItemStackMap.Entry<Set<String>> entry : bannedItems.entries()) {
NBTTagCompound key = InventoryUtils.savePersistant(entry.key, new NBTTagCompound());
key.removeTag("Count");
if(key.getByte("Damage") == 0) key.removeTag("Damage");
if (key.getByte("Damage") == 0) key.removeTag("Damage");
p.print(key.toString());
p.print("=[");
int i = 0;
for (String s : entry.value) {
if(i++ != 0) p.print(", ");
if (i++ != 0) p.print(", ");
p.print(s);
}
p.println("]");
@@ -252,14 +245,15 @@ public class NEIServerConfig
public static void loadPlayer(EntityPlayer player) {
logger.debug("Loading Player: " + player.getGameProfile().getName());
playerSaves.put(player.getCommandSenderName(), new PlayerSave(player.getCommandSenderName(), new File(saveDir, "players")));
playerSaves.put(
player.getCommandSenderName(),
new PlayerSave(player.getCommandSenderName(), new File(saveDir, "players")));
}
public static void unloadPlayer(EntityPlayer player) {
logger.debug("Unloading Player: " + player.getCommandSenderName());
PlayerSave playerSave = playerSaves.remove(player.getCommandSenderName());
if (playerSave != null)
playerSave.save();
if (playerSave != null) playerSave.save();
}
public static boolean authenticatePacket(EntityPlayerMP sender, PacketCustom packet) {
+111 -129
View File
@@ -8,6 +8,17 @@ import codechicken.lib.packet.PacketCustom;
import codechicken.nei.util.NBTHelper;
import cpw.mods.fml.common.FMLLog;
import cpw.mods.fml.common.registry.GameRegistry;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.zip.ZipException;
import net.minecraft.command.ICommandSender;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.entity.player.EntityPlayer;
@@ -32,30 +43,16 @@ import net.minecraft.world.WorldSettings.GameType;
import net.minecraftforge.oredict.OreDictionary;
import org.apache.logging.log4j.Level;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.zip.ZipException;
public class NEIServerUtils
{
public class NEIServerUtils {
public static boolean isRaining(World world) {
return world.getWorldInfo().isRaining();
}
public static void toggleRaining(World world, boolean notify) {
boolean raining = !world.isRaining();
if (!raining)//turn off
((WorldServer) world).provider.resetRainAndThunder();
else
world.getWorldInfo().setRaining(!isRaining(world));
if (!raining) // turn off
((WorldServer) world).provider.resetRainAndThunder();
else world.getWorldInfo().setRaining(!isRaining(world));
if (notify)
ServerUtils.sendChatToAll(new ChatComponentTranslation("nei.chat.rain." + (raining ? "on" : "off")));
@@ -76,27 +73,20 @@ public class NEIServerUtils
}
public static void setSlotContents(EntityPlayer player, int slot, ItemStack item, boolean containerInv) {
if (slot == -999)
player.inventory.setItemStack(item);
else if (containerInv)
player.openContainer.putStackInSlot(slot, item);
else
player.inventory.setInventorySlotContents(slot, item);
if (slot == -999) player.inventory.setItemStack(item);
else if (containerInv) player.openContainer.putStackInSlot(slot, item);
else player.inventory.setInventorySlotContents(slot, item);
}
public static ItemStack getSlotContents(EntityPlayer player, int slot, boolean containerInv) {
if (slot == -999)
return player.inventory.getItemStack();
else if (containerInv)
return player.openContainer.getSlot(slot).getStack();
else
return player.inventory.getStackInSlot(slot);
if (slot == -999) return player.inventory.getItemStack();
else if (containerInv) return player.openContainer.getSlot(slot).getStack();
else return player.inventory.getStackInSlot(slot);
}
@SuppressWarnings("unchecked")
public static void deleteAllItems(EntityPlayerMP player) {
for (Slot slot : (List<Slot>) player.openContainer.inventorySlots)
slot.putStack(null);
for (Slot slot : (List<Slot>) player.openContainer.inventorySlots) slot.putStack(null);
player.sendContainerAndContentsToPlayer(player.openContainer, player.openContainer.getInventory());
}
@@ -116,8 +106,7 @@ public class NEIServerUtils
while (NEIServerConfig.isActionDisabled(dim, NEIActions.timeZones[newhour / 6]))
newhour = ((newhour / 6 + 1) % 4) * 6;
if (newhour != hour)
setHourForward(world, newhour, false);
if (newhour != hour) setHourForward(world, newhour, false);
}
public static boolean canItemFitInInventory(EntityPlayer player, ItemStack itemstack) {
@@ -125,15 +114,15 @@ public class NEIServerUtils
}
public static void sendNotice(ICommandSender sender, IChatComponent msg, String permission) {
ChatComponentTranslation notice = new ChatComponentTranslation("chat.type.admin", sender.getCommandSenderName(), msg.createCopy());
ChatComponentTranslation notice =
new ChatComponentTranslation("chat.type.admin", sender.getCommandSenderName(), msg.createCopy());
notice.getChatStyle().setColor(EnumChatFormatting.GRAY).setItalic(true);
if (NEIServerConfig.canPlayerPerformAction("CONSOLE", permission))
MinecraftServer.getServer().addChatMessage(notice);
for (EntityPlayer p : ServerUtils.getPlayers())
if(p == sender)
p.addChatComponentMessage(msg);
if (p == sender) p.addChatComponentMessage(msg);
else if (NEIServerConfig.canPlayerPerformAction(p.getCommandSenderName(), permission))
p.addChatComponentMessage(notice);
}
@@ -144,10 +133,11 @@ public class NEIServerUtils
* @return whether the two items are the same in terms of damage and itemID.
*/
public static boolean areStacksSameType(ItemStack stack1, ItemStack stack2) {
return stack1 != null && stack2 != null &&
(stack1.getItem() == stack2.getItem() &&
(!stack2.getHasSubtypes() || stack2.getItemDamage() == stack1.getItemDamage()) &&
ItemStack.areItemStackTagsEqual(stack2, stack1));
return stack1 != null
&& stack2 != null
&& (stack1.getItem() == stack2.getItem()
&& (!stack2.getHasSubtypes() || stack2.getItemDamage() == stack1.getItemDamage())
&& ItemStack.areItemStackTagsEqual(stack2, stack1));
}
/**
@@ -157,10 +147,11 @@ public class NEIServerUtils
* @return whether the two items are the same in terms of itemID, damage and NBT.
*/
public static boolean areStacksSameTypeWithNBT(ItemStack stack1, ItemStack stack2) {
return stack1 != null && stack2 != null &&
stack1.getItem() == stack2.getItem() &&
(!stack2.getHasSubtypes() || stack2.getItemDamage() == stack1.getItemDamage()) &&
NBTHelper.matchTag(stack1.getTagCompound(), stack2.getTagCompound());
return stack1 != null
&& stack2 != null
&& stack1.getItem() == stack2.getItem()
&& (!stack2.getHasSubtypes() || stack2.getItemDamage() == stack1.getItemDamage())
&& NBTHelper.matchTag(stack1.getTagCompound(), stack2.getTagCompound());
}
/**
@@ -171,9 +162,13 @@ public class NEIServerUtils
* @return whether the two items are the same from the perspective of a crafting inventory.
*/
public static boolean areStacksSameTypeCrafting(ItemStack stack1, ItemStack stack2) {
return stack1 != null && stack2 != null &&
stack1.getItem() == stack2.getItem() &&
(stack1.getItemDamage() == stack2.getItemDamage() || stack1.getItemDamage() == OreDictionary.WILDCARD_VALUE || stack2.getItemDamage() == OreDictionary.WILDCARD_VALUE || stack1.getItem().isDamageable());
return stack1 != null
&& stack2 != null
&& stack1.getItem() == stack2.getItem()
&& (stack1.getItemDamage() == stack2.getItemDamage()
|| stack1.getItemDamage() == OreDictionary.WILDCARD_VALUE
|| stack2.getItemDamage() == OreDictionary.WILDCARD_VALUE
|| stack1.getItem().isDamageable());
}
/**
@@ -183,15 +178,14 @@ public class NEIServerUtils
* @return whether the two items are the same from the perspective of a crafting inventory.
*/
public static boolean areStacksSameTypeCraftingWithNBT(ItemStack stack1, ItemStack stack2) {
return stack1 != null && stack2 != null &&
stack1.getItem() == stack2.getItem() &&
(
stack1.getItemDamage() == stack2.getItemDamage() ||
stack1.getItemDamage() == OreDictionary.WILDCARD_VALUE ||
stack2.getItemDamage() == OreDictionary.WILDCARD_VALUE ||
stack1.getItem().isDamageable()
) &&
NBTHelper.matchTag(stack1.getTagCompound(), stack2.getTagCompound());
return stack1 != null
&& stack2 != null
&& stack1.getItem() == stack2.getItem()
&& (stack1.getItemDamage() == stack2.getItemDamage()
|| stack1.getItemDamage() == OreDictionary.WILDCARD_VALUE
|| stack2.getItemDamage() == OreDictionary.WILDCARD_VALUE
|| stack1.getItem().isDamageable())
&& NBTHelper.matchTag(stack1.getTagCompound(), stack2.getTagCompound());
}
/**
@@ -202,9 +196,10 @@ public class NEIServerUtils
* @return The ordering of stack1 relative to stack2.
*/
public static int compareStacks(ItemStack stack1, ItemStack stack2) {
if (stack1 == stack2) return 0;//catches both null
if (stack1 == null || stack2 == null) return stack1 == null ? -1 : 1;//null stack goes first
if (stack1.getItem() != stack2.getItem()) return Item.getIdFromItem(stack1.getItem()) - Item.getIdFromItem(stack2.getItem());
if (stack1 == stack2) return 0; // catches both null
if (stack1 == null || stack2 == null) return stack1 == null ? -1 : 1; // null stack goes first
if (stack1.getItem() != stack2.getItem())
return Item.getIdFromItem(stack1.getItem()) - Item.getIdFromItem(stack2.getItem());
if (stack1.stackSize != stack2.stackSize) return stack1.stackSize - stack2.stackSize;
return stack1.getItemDamage() - stack2.getItemDamage();
}
@@ -220,33 +215,37 @@ public class NEIServerUtils
public static void givePlayerItem(EntityPlayerMP player, ItemStack stack, boolean infinite, boolean doGive) {
if (stack.getItem() == null) {
player.addChatComponentMessage(setColour(new ChatComponentTranslation("nei.chat.give.noitem"), EnumChatFormatting.WHITE));
player.addChatComponentMessage(
setColour(new ChatComponentTranslation("nei.chat.give.noitem"), EnumChatFormatting.WHITE));
return;
}
int given = stack.stackSize;
if(doGive) {
if (infinite)
player.inventory.addItemStackToInventory(stack);
else
given -= InventoryUtils.insertItem(player.inventory, stack, false);
if (doGive) {
if (infinite) player.inventory.addItemStackToInventory(stack);
else given -= InventoryUtils.insertItem(player.inventory, stack, false);
}
sendNotice(player, new ChatComponentTranslation("commands.give.success", stack.func_151000_E(), infinite ? "\u221E" : Integer.toString(given), player.getCommandSenderName()), "notify-item");
sendNotice(
player,
new ChatComponentTranslation(
"commands.give.success",
stack.func_151000_E(),
infinite ? "\u221E" : Integer.toString(given),
player.getCommandSenderName()),
"notify-item");
player.openContainer.detectAndSendChanges();
}
public static ItemStack copyStack(ItemStack itemstack, int i) {
if (itemstack == null)
return null;
if (itemstack == null) return null;
itemstack.stackSize += i;
return itemstack.splitStack(i);
}
public static ItemStack copyStack(ItemStack itemstack) {
if (itemstack == null)
return null;
if (itemstack == null) return null;
return copyStack(itemstack, itemstack.stackSize);
}
@@ -257,14 +256,10 @@ public class NEIServerUtils
}
public static int getCreativeMode(EntityPlayerMP player) {
if (NEIServerConfig.forPlayer(player.getCommandSenderName()).isActionEnabled("creative+"))
return 2;
else if (player.theItemInWorldManager.isCreative())
return 1;
else if (player.theItemInWorldManager.getGameType().isAdventure())
return 3;
else
return 0;
if (NEIServerConfig.forPlayer(player.getCommandSenderName()).isActionEnabled("creative+")) return 2;
else if (player.theItemInWorldManager.isCreative()) return 1;
else if (player.theItemInWorldManager.getGameType().isAdventure()) return 3;
else return 0;
}
public static GameType getGameType(int mode) {
@@ -281,20 +276,23 @@ public class NEIServerUtils
}
public static void setGamemode(EntityPlayerMP player, int mode) {
if (mode < 0 || mode >= NEIActions.gameModes.length ||
NEIActions.nameActionMap.containsKey(NEIActions.gameModes[mode]) &&
!NEIServerConfig.canPlayerPerformAction(player.getCommandSenderName(), NEIActions.gameModes[mode]))
return;
if (mode < 0
|| mode >= NEIActions.gameModes.length
|| NEIActions.nameActionMap.containsKey(NEIActions.gameModes[mode])
&& !NEIServerConfig.canPlayerPerformAction(
player.getCommandSenderName(), NEIActions.gameModes[mode])) return;
//creative+
// creative+
NEIServerConfig.forPlayer(player.getCommandSenderName()).enableAction("creative+", mode == 2);
if(mode == 2 && !(player.openContainer instanceof ContainerCreativeInv))//open the container immediately for the client
NEISPH.processCreativeInv(player, true);
if (mode == 2
&& !(player.openContainer
instanceof ContainerCreativeInv)) // open the container immediately for the client
NEISPH.processCreativeInv(player, true);
//change it on the server
// change it on the server
player.theItemInWorldManager.setGameType(getGameType(mode));
//tell the client to change it
// tell the client to change it
new PacketCustom(NEISPH.channel, 14).writeByte(mode).sendToPlayer(player);
player.addChatMessage(new ChatComponentTranslation("nei.chat.gamemode." + mode));
}
@@ -302,32 +300,29 @@ public class NEIServerUtils
public static void cycleCreativeInv(EntityPlayerMP player, int steps) {
InventoryPlayer inventory = player.inventory;
//top down [row][col]
// top down [row][col]
ItemStack[][] slots = new ItemStack[10][9];
PlayerSave playerSave = NEIServerConfig.forPlayer(player.getCommandSenderName());
//get
// get
System.arraycopy(inventory.mainInventory, 0, slots[9], 0, 9);
for (int row = 0; row < 3; row++)
System.arraycopy(inventory.mainInventory, (row + 1) * 9, slots[row + 6], 0, 9);
for (int row = 0; row < 6; row++)
System.arraycopy(playerSave.creativeInv, row * 9, slots[row], 0, 9);
for (int row = 0; row < 6; row++) System.arraycopy(playerSave.creativeInv, row * 9, slots[row], 0, 9);
ItemStack[][] newslots = new ItemStack[10][];
//put back
for (int row = 0; row < 10; row++)
newslots[(row + steps + 10) % 10] = slots[row];
// put back
for (int row = 0; row < 10; row++) newslots[(row + steps + 10) % 10] = slots[row];
System.arraycopy(newslots[9], 0, inventory.mainInventory, 0, 9);
for (int row = 0; row < 3; row++)
System.arraycopy(newslots[row + 6], 0, inventory.mainInventory, (row + 1) * 9, 9);
for (int row = 0; row < 6; row++)
System.arraycopy(newslots[row], 0, playerSave.creativeInv, row * 9, 9);
for (int row = 0; row < 6; row++) System.arraycopy(newslots[row], 0, playerSave.creativeInv, row * 9, 9);
playerSave.setDirty();
}
@@ -339,7 +334,7 @@ public class NEIServerUtils
if (nbttaglist != null)
for (int i = 0; i < nbttaglist.tagCount(); i++) {
NBTTagCompound tag = nbttaglist.getCompoundTagAt(i);
arraylist.add(new int[]{tag.getShort("id"), tag.getShort("lvl")});
arraylist.add(new int[] {tag.getShort("id"), tag.getShort("lvl")});
}
}
return arraylist;
@@ -347,67 +342,55 @@ public class NEIServerUtils
public static boolean stackHasEnchantment(ItemStack itemstack, int e) {
List<int[]> allenchantments = getEnchantments(itemstack);
for (int[] ai : allenchantments)
if (ai[0] == e)
return true;
for (int[] ai : allenchantments) if (ai[0] == e) return true;
return false;
}
public static int getEnchantmentLevel(ItemStack itemstack, int e) {
List<int[]> allenchantments = getEnchantments(itemstack);
for (int[] ai : allenchantments)
if (ai[0] == e)
return ai[1];
for (int[] ai : allenchantments) if (ai[0] == e) return ai[1];
return -1;
}
public static boolean doesEnchantmentConflict(List<int[]> enchantments, Enchantment e) {
for (int[] ai : enchantments)
if (!e.canApplyTogether(Enchantment.enchantmentsList[ai[0]]))
return true;
for (int[] ai : enchantments) if (!e.canApplyTogether(Enchantment.enchantmentsList[ai[0]])) return true;
return false;
}
public static RuntimeException throwCME(String msg) {
if (CommonUtils.isClient())
return ClientHandler.throwCME(msg);
if (CommonUtils.isClient()) return ClientHandler.throwCME(msg);
throw new RuntimeException(msg);
}
@SuppressWarnings("unchecked")
public static ItemStack[] extractRecipeItems(Object obj) {
if (obj instanceof ItemStack)
return new ItemStack[]{(ItemStack) obj};
if (obj instanceof ItemStack[])
return (ItemStack[]) obj;
if (obj instanceof List)
return ((List<ItemStack>) obj).toArray(new ItemStack[0]);
if (obj instanceof ItemStack) return new ItemStack[] {(ItemStack) obj};
if (obj instanceof ItemStack[]) return (ItemStack[]) obj;
if (obj instanceof List) return ((List<ItemStack>) obj).toArray(new ItemStack[0]);
throw new ClassCastException(obj+" not an ItemStack, ItemStack[] or List<ItemStack?");
throw new ClassCastException(obj + " not an ItemStack, ItemStack[] or List<ItemStack?");
}
public static List<Integer> getRange(final int start, final int end) {
return new AbstractList<Integer>()
{
return new AbstractList<Integer>() {
@Override
public Integer get(int index) {
return start+index;
return start + index;
}
@Override
public int size() {
return end-start;
return end - start;
}
};
}
public static StringBuilder fixTrailingCommaList(StringBuilder sb) {
if(sb.charAt(sb.length()-1) == ',')
sb.deleteCharAt(sb.length()-1);
if (sb.charAt(sb.length() - 1) == ',') sb.deleteCharAt(sb.length() - 1);
return sb;
}
@@ -461,7 +444,8 @@ public class NEIServerUtils
}
itemStack.setTagCompound((NBTTagCompound) nbttag);
} catch (NBTException e) {
FMLLog.getLogger().log(Level.WARN, "Encountered an exception parsing ItemStack NBT string {}", nbtString, e);
FMLLog.getLogger()
.log(Level.WARN, "Encountered an exception parsing ItemStack NBT string {}", nbtString, e);
return null;
}
}
@@ -470,16 +454,14 @@ public class NEIServerUtils
}
public static NBTTagCompound readNBT(File file) throws IOException {
if(!file.exists()) return null;
if (!file.exists()) return null;
FileInputStream in = new FileInputStream(file);
NBTTagCompound tag;
try {
tag = CompressedStreamTools.readCompressed(in);
} catch(ZipException e) {
if(e.getMessage().equals("Not in GZIP format"))
tag = CompressedStreamTools.read(file);
else
throw e;
} catch (ZipException e) {
if (e.getMessage().equals("Not in GZIP format")) tag = CompressedStreamTools.read(file);
else throw e;
}
in.close();
return tag;
@@ -1,28 +1,23 @@
package codechicken.nei;
import codechicken.nei.api.IStackPositioner;
import java.util.ArrayList;
public class OffsetPositioner implements IStackPositioner
{
public OffsetPositioner(int x, int y)
{
public class OffsetPositioner implements IStackPositioner {
public OffsetPositioner(int x, int y) {
offsetx = x;
offsety = y;
}
@Override
public ArrayList<PositionedStack> positionStacks(ArrayList<PositionedStack> ai)
{
for(PositionedStack stack : ai)
{
stack.relx+=offsetx;
stack.rely+=offsety;
public ArrayList<PositionedStack> positionStacks(ArrayList<PositionedStack> ai) {
for (PositionedStack stack : ai) {
stack.relx += offsetx;
stack.rely += offsety;
}
return ai;
}
public int offsetx;
public int offsety;
}
@@ -0,0 +1,377 @@
package codechicken.nei;
import codechicken.lib.vec.Rectangle4i;
import codechicken.nei.ItemPanel.ItemPanelSlot;
import codechicken.nei.api.GuiInfo;
import codechicken.nei.api.INEIGuiHandler;
import codechicken.nei.guihook.GuiContainerManager;
import codechicken.nei.recipe.GuiCraftingRecipe;
import codechicken.nei.recipe.GuiRecipe;
import codechicken.nei.recipe.GuiUsageRecipe;
import java.util.ArrayList;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.item.ItemStack;
public abstract class PanelWidget extends Widget {
protected static final int PADDING = 2;
public ItemStack draggedStack;
public int mouseDownSlot = -1;
public Button pagePrev;
public Button pageNext;
public Label pageLabel;
protected ItemsGrid grid;
public ArrayList<ItemStack> getItems() {
return grid.getItems();
}
public ItemsGrid getGrid() {
return grid;
}
public void init() {
pageLabel = new Label("0/0", true);
pagePrev = new Button("Prev") {
public boolean onButtonPress(boolean rightclick) {
if (!rightclick) {
grid.shiftPage(-1);
return true;
}
return false;
}
@Override
public String getRenderLabel() {
return "<";
}
};
pageNext = new Button("Next") {
public boolean onButtonPress(boolean rightclick) {
if (!rightclick) {
grid.shiftPage(1);
return true;
}
return false;
}
@Override
public String getRenderLabel() {
return ">";
}
};
}
public abstract String getLabelText();
protected abstract String getPositioningSettingName();
public abstract int getMarginLeft(GuiContainer gui);
public abstract int getMarginTop(GuiContainer gui);
public abstract int getWidth(GuiContainer gui);
public abstract int getHeight(GuiContainer gui);
public void resize(GuiContainer gui) {
final Rectangle4i margin =
new Rectangle4i(getMarginLeft(gui), getMarginTop(gui), getWidth(gui), getHeight(gui));
final int minWidth = 5 * ItemsGrid.SLOT_SIZE;
final int minHeight = 9 * ItemsGrid.SLOT_SIZE;
final String settingName = getPositioningSettingName();
int paddingLeft = (int) Math.ceil(
margin.w * NEIClientConfig.getSetting(settingName + ".left").getIntValue() / 100000.0);
int paddingTop = (int) Math.ceil(
margin.h * NEIClientConfig.getSetting(settingName + ".top").getIntValue() / 100000.0);
int paddingRight = (int) Math.ceil(
margin.w * NEIClientConfig.getSetting(settingName + ".right").getIntValue() / 100000.0);
int paddingBottom = (int) Math.ceil(
margin.h * NEIClientConfig.getSetting(settingName + ".bottom").getIntValue() / 100000.0);
int deltaHeight = Math.min(0, margin.h - paddingTop - paddingBottom - minHeight) / 2;
paddingLeft = Math.min(paddingLeft, Math.max(0, margin.w - paddingRight - minWidth));
paddingRight = Math.min(paddingRight, Math.max(0, margin.w - paddingLeft - minWidth));
paddingTop = Math.min(margin.h - minHeight, Math.max(0, paddingTop + deltaHeight));
paddingBottom = Math.min(margin.h - paddingTop - minHeight, Math.max(0, paddingBottom - deltaHeight));
x = margin.x + paddingLeft;
y = margin.y + paddingTop;
w = margin.w - paddingLeft - paddingRight;
h = margin.h - paddingTop - paddingBottom;
final int header = resizeHeader(gui);
final int footer = resizeFooter(gui);
grid.setGridSize(x, y + header, w, h - header - footer);
grid.refresh(gui);
}
protected int resizeHeader(GuiContainer gui) {
final int BUTTON_SIZE = 16;
int paddingLeft = 0;
int paddingRight = 0;
while (paddingLeft < w
&& GuiInfo.hideItemPanelSlot(
gui, new Rectangle4i(x + paddingLeft, y, ItemsGrid.SLOT_SIZE, ItemsGrid.SLOT_SIZE))) {
paddingLeft += ItemsGrid.SLOT_SIZE;
}
while (paddingRight < w
&& GuiInfo.hideItemPanelSlot(
gui,
new Rectangle4i(
x + w - paddingRight - ItemsGrid.SLOT_SIZE,
y,
ItemsGrid.SLOT_SIZE,
ItemsGrid.SLOT_SIZE))) {
paddingRight += ItemsGrid.SLOT_SIZE;
}
if (paddingLeft + paddingRight >= w) {
return 0;
}
pagePrev.w = pageNext.w = BUTTON_SIZE;
pagePrev.h = pageNext.h = BUTTON_SIZE;
pagePrev.y = pageNext.y = y;
pagePrev.x = x + paddingLeft;
pageNext.x = x + w - pageNext.w - paddingRight;
pageLabel.x = x + paddingLeft + (w - paddingLeft - paddingRight) / 2;
pageLabel.y = y + 5;
pageLabel.text = getLabelText();
return BUTTON_SIZE + 2;
}
protected abstract int resizeFooter(GuiContainer gui);
public void setVisible() {
if (grid.getPerPage() > 0) {
LayoutManager.addWidget(pagePrev);
LayoutManager.addWidget(pageNext);
LayoutManager.addWidget(pageLabel);
}
}
@Override
public void draw(int mousex, int mousey) {
grid.draw(mousex, mousey);
}
@Override
public void postDraw(int mousex, int mousey) {
if (draggedStack != null) {
GuiContainerManager.drawItems.zLevel += 100;
GuiContainerManager.drawItem(mousex - 8, mousey - 8, draggedStack);
GuiContainerManager.drawItems.zLevel -= 100;
}
}
@Override
public void mouseDragged(int mousex, int mousey, int button, long heldTime) {
if (mouseDownSlot >= 0
&& draggedStack == null
&& NEIClientUtils.getHeldItem() == null
&& NEIClientConfig.hasSMPCounterPart()
&& !GuiInfo.hasCustomSlots(NEIClientUtils.getGuiContainer())) {
ItemPanelSlot mouseOverSlot = getSlotMouseOver(mousex, mousey);
if (mouseOverSlot == null || mouseOverSlot.slotIndex != mouseDownSlot || heldTime > 500) {
draggedStack = getDraggedStackWithQuantity(mouseDownSlot);
mouseDownSlot = -1;
}
}
}
protected abstract ItemStack getDraggedStackWithQuantity(int mouseDownSlot);
@Override
public boolean handleClick(int mousex, int mousey, int button) {
if (handleClickExt(mousex, mousey, button)) return true;
if (NEIClientUtils.getHeldItem() != null) {
if (!grid.contains(mousex, mousey)) {
return false;
}
if (NEIClientConfig.canPerformAction("delete") && NEIClientConfig.canPerformAction("item")) {
if (button == 1) {
NEIClientUtils.decreaseSlotStack(-999);
} else {
NEIClientUtils.deleteHeldItem();
}
} else {
NEIClientUtils.dropHeldItem();
}
return true;
}
ItemPanelSlot hoverSlot = getSlotMouseOver(mousex, mousey);
if (hoverSlot != null) {
if (button == 2) {
if (hoverSlot.item != null) {
draggedStack = getDraggedStackWithQuantity(hoverSlot.slotIndex);
}
} else {
mouseDownSlot = hoverSlot.slotIndex;
}
return true;
}
return false;
}
@Override
public boolean handleClickExt(int mouseX, int mouseY, int button) {
if (ItemPanels.itemPanel.draggedStack != null) {
return ItemPanels.itemPanel.handleDraggedClick(mouseX, mouseY, button);
}
if (ItemPanels.bookmarkPanel.draggedStack != null) {
return ItemPanels.bookmarkPanel.handleDraggedClick(mouseX, mouseY, button);
}
if (NEIClientUtils.getHeldItem() != null) {
final ItemStack draggedStack = NEIClientUtils.getHeldItem().copy();
return handleGUIContainerClick(draggedStack, mouseX, mouseY, button);
}
return false;
}
protected boolean handleDraggedClick(int mouseX, int mouseY, int button) {
if (draggedStack == null) {
return false;
}
if (handleGUIContainerClick(draggedStack, mouseX, mouseY, button)) {
if (draggedStack.stackSize == 0) {
draggedStack = null;
}
return true;
}
final GuiContainer gui = NEIClientUtils.getGuiContainer();
if (mouseX < gui.guiLeft
|| mouseY < gui.guiTop
|| mouseX >= gui.guiLeft + gui.xSize
|| mouseY >= gui.guiTop + gui.ySize) {
draggedStack = null;
}
return true;
}
protected boolean handleGUIContainerClick(final ItemStack draggedStack, int mouseX, int mouseY, int button) {
final GuiContainer gui = NEIClientUtils.getGuiContainer();
boolean handled = false;
try {
GuiInfo.readLock.lock();
for (INEIGuiHandler handler : GuiInfo.guiHandlers) {
if (handler.handleDragNDrop(gui, mouseX, mouseY, draggedStack, button)) {
NEIClientConfig.logger.info(handler);
handled = true;
break;
}
}
} finally {
GuiInfo.readLock.unlock();
}
return handled;
}
@Override
public void mouseUp(int mousex, int mousey, int button) {
ItemPanelSlot hoverSlot = getSlotMouseOver(mousex, mousey);
if (hoverSlot != null && hoverSlot.slotIndex == mouseDownSlot && draggedStack == null) {
ItemStack item = hoverSlot.item;
if (NEIController.manager.window instanceof GuiRecipe || !NEIClientConfig.canCheatItem(item)) {
if (button == 0) {
GuiCraftingRecipe.openRecipeGui("item", item);
} else if (button == 1) {
GuiUsageRecipe.openRecipeGui("item", item);
}
mouseDownSlot = -1;
return;
}
NEIClientUtils.cheatItem(getDraggedStackWithQuantity(hoverSlot.slotIndex), button, -1);
}
mouseDownSlot = -1;
}
@Override
public boolean onMouseWheel(int i, int mousex, int mousey) {
if (!contains(mousex, mousey)) return false;
grid.shiftPage(-i);
return true;
}
@Override
public boolean handleKeyPress(int keyID, char keyChar) {
if (NEIClientConfig.isKeyHashDown("gui.next")) {
grid.shiftPage(1);
return true;
}
if (NEIClientConfig.isKeyHashDown("gui.prev")) {
grid.shiftPage(-1);
return true;
}
return false;
}
@Override
public ItemStack getStackMouseOver(int mousex, int mousey) {
ItemPanelSlot slot = getSlotMouseOver(mousex, mousey);
return slot == null ? null : slot.item;
}
public ItemPanelSlot getSlotMouseOver(int mousex, int mousey) {
return grid.getSlotMouseOver(mousex, mousey);
}
public int getPage() {
return grid.getPage();
}
public int getNumPages() {
return grid.getNumPages();
}
@Override
public boolean contains(int px, int py) {
return grid.contains(px, py);
}
}
+11 -20
View File
@@ -2,15 +2,13 @@ package codechicken.nei;
import codechicken.core.ServerUtils;
import codechicken.lib.inventory.InventoryUtils;
import java.io.File;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import java.io.File;
public class PlayerSave
{
public class PlayerSave {
public String username;
private File saveFile;
@@ -27,20 +25,17 @@ public class PlayerSave
wasOp = ServerUtils.isPlayerOP(playername);
saveFile = new File(saveLocation, username + ".dat");
if (!saveFile.getParentFile().exists())
saveFile.getParentFile().mkdirs();
if (!saveFile.getParentFile().exists()) saveFile.getParentFile().mkdirs();
load();
}
private void load() {
nbt = new NBTTagCompound();
try {
if (!saveFile.exists())
saveFile.createNewFile();
if (saveFile.length() > 0)
nbt = NEIServerUtils.readNBT(saveFile);
if (!saveFile.exists()) saveFile.createNewFile();
if (saveFile.length() > 0) nbt = NEIServerUtils.readNBT(saveFile);
} catch (Exception e) {
NEIClientConfig.logger.error("Error loading player save: "+username, e);
NEIClientConfig.logger.error("Error loading player save: " + username, e);
}
loadCreativeInv();
@@ -49,22 +44,19 @@ public class PlayerSave
private void loadCreativeInv() {
creativeInv = new ItemStack[54];
NBTTagList itemList = nbt.getTagList("creativeitems", 10);
if (itemList != null)
InventoryUtils.readItemStacksFromTag(creativeInv, itemList);
if (itemList != null) InventoryUtils.readItemStacksFromTag(creativeInv, itemList);
}
public void save() {
if (!isDirty)
return;
if (!isDirty) return;
if (creativeInvDirty)
saveCreativeInv();
if (creativeInvDirty) saveCreativeInv();
try {
NEIServerUtils.writeNBT(nbt, saveFile);
isDirty = false;
} catch (Exception e) {
NEIClientConfig.logger.error("Error saving player: "+username, e);
NEIClientConfig.logger.error("Error saving player: " + username, e);
}
}
@@ -97,8 +89,7 @@ public class PlayerSave
private NBTTagCompound getEnabledActions() {
NBTTagCompound tag = nbt.getCompoundTag("enabledActions");
if (!nbt.hasKey("enabledActions"))
nbt.setTag("enabledActions", tag);
if (!nbt.hasKey("enabledActions")) nbt.setTag("enabledActions", tag);
return tag;
}
@@ -1,69 +1,54 @@
package codechicken.nei;
import static codechicken.nei.NEIClientConfig.canPerformAction;
import codechicken.nei.guihook.IContainerInputHandler;
import net.minecraft.client.gui.inventory.GuiContainer;
import static codechicken.nei.NEIClientConfig.canPerformAction;
import static codechicken.nei.NEIClientConfig.getKeyBinding;
public class PopupInputHandler implements IContainerInputHandler
{
public class PopupInputHandler implements IContainerInputHandler {
@Override
public boolean keyTyped(GuiContainer gui, char keyChar, int keyCode)
{
public boolean keyTyped(GuiContainer gui, char keyChar, int keyCode) {
return false;
}
@Override
public boolean mouseClicked(GuiContainer gui, int mousex, int mousey, int button)
{
public boolean mouseClicked(GuiContainer gui, int mousex, int mousey, int button) {
return false;
}
@Override
public void onKeyTyped(GuiContainer gui, char keyChar, int keyID)
{
}
public void onKeyTyped(GuiContainer gui, char keyChar, int keyID) {}
@Override
public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyID)
{
if(keyID == getKeyBinding("gui.enchant") && canPerformAction("enchant"))
{
public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyID) {
if (NEIClientConfig.isKeyHashDown("gui.enchant") && canPerformAction("enchant")) {
NEICPH.sendOpenEnchantmentWindow();
return true;
}
if(keyID == getKeyBinding("gui.potion") && canPerformAction("potion"))
{
if (NEIClientConfig.isKeyHashDown("gui.potion") && canPerformAction("potion")) {
NEICPH.sendOpenPotionWindow();
return true;
}
return false;
}
@Override
public void onMouseClicked(GuiContainer gui, int mousex, int mousey, int button)
{
}
public void onMouseClicked(GuiContainer gui, int mousex, int mousey, int button) {}
@Override
public void onMouseUp(GuiContainer gui, int mousex, int mousey, int button)
{
}
public void onMouseUp(GuiContainer gui, int mousex, int mousey, int button) {}
@Override
public boolean mouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled)
{
public boolean mouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {
return false;
}
@Override
public void onMouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled)
{
}
public void onMouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {}
@Override
public void onMouseDragged(GuiContainer gui, int mousex, int mousey, int button, long heldTime)
{
}
public void onMouseDragged(GuiContainer gui, int mousex, int mousey, int button, long heldTime) {}
}
@@ -1,100 +1,86 @@
package codechicken.nei;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
import java.util.ArrayList;
import java.util.List;
/**
* Simply an {@link ItemStack} with position.
* Mainly used in the recipe handlers.
*/
public class PositionedStack
{
public class PositionedStack {
public int relx;
public int rely;
public ItemStack[] items;
//compatibility dummy
// compatibility dummy
public ItemStack item;
private boolean permutated = false;
public PositionedStack(Object object, int x, int y, boolean genPerms) {
items = NEIServerUtils.extractRecipeItems(object);
relx = x;
rely = y;
if(genPerms)
generatePermutations();
else
setPermutationToRender(0);
if (genPerms) generatePermutations();
else setPermutationToRender(0);
}
public PositionedStack(Object object, int x, int y)
{
public PositionedStack(Object object, int x, int y) {
this(object, x, y, true);
}
public void generatePermutations() {
if(permutated)
return;
if (permutated) return;
ArrayList<ItemStack> stacks = new ArrayList<>();
for(ItemStack item : items) {
if(item == null || item.getItem() == null)
continue;
if(item.getItemDamage() == Short.MAX_VALUE) {
for (ItemStack item : items) {
if (item == null || item.getItem() == null) continue;
if (item.getItemDamage() == Short.MAX_VALUE) {
List<ItemStack> permutations = ItemList.itemMap.get(item.getItem());
if(!permutations.isEmpty()) {
for(ItemStack stack : permutations)
stacks.add(stack.copy());
}
else {
if (!permutations.isEmpty()) {
for (ItemStack stack : permutations) stacks.add(stack.copy());
} else {
ItemStack base = new ItemStack(item.getItem(), item.stackSize);
base.stackTagCompound = item.stackTagCompound;
stacks.add(base);
}
continue;
}
stacks.add(item.copy());
}
items = stacks.toArray(new ItemStack[0]);
if(items.length == 0)
items = new ItemStack[]{new ItemStack(Blocks.fire)};
if (items.length == 0) items = new ItemStack[] {new ItemStack(Blocks.fire)};
permutated = true;
setPermutationToRender(0);
}
public void setMaxSize(int i) {
for(ItemStack item : items)
if(item.stackSize > i)
item.stackSize = i;
for (ItemStack item : items) if (item.stackSize > i) item.stackSize = i;
}
public PositionedStack copy() {
return new PositionedStack(items, relx, rely);
}
public void setPermutationToRender(int index) {
item = items[index].copy();
if(item.getItem() == null)
item = new ItemStack(Blocks.fire);
else if(item.getItemDamage() == OreDictionary.WILDCARD_VALUE && item.getItem() != null && item.getItem().isRepairable())
item.setItemDamage(0);
if (item.getItem() == null) item = new ItemStack(Blocks.fire);
else if (item.getItemDamage() == OreDictionary.WILDCARD_VALUE
&& item.getItem() != null
&& item.getItem().isRepairable()) item.setItemDamage(0);
}
public boolean contains(ItemStack ingredient) {
for(ItemStack item : items)
if(NEIServerUtils.areStacksSameTypeCrafting(item, ingredient))
return true;
for (ItemStack item : items) if (NEIServerUtils.areStacksSameTypeCrafting(item, ingredient)) return true;
return false;
}
@@ -102,21 +88,17 @@ public class PositionedStack
* NBT-friendly version of {@link #contains(ItemStack)}
*/
public boolean containsWithNBT(ItemStack ingredient) {
for(ItemStack item : items)
if(NEIServerUtils.areStacksSameTypeCraftingWithNBT(item, ingredient))
return true;
for (ItemStack item : items) if (NEIServerUtils.areStacksSameTypeCraftingWithNBT(item, ingredient)) return true;
return false;
}
public boolean contains(Item ingred) {
for(ItemStack item : items)
if(item.getItem() == ingred)
return true;
for (ItemStack item : items) if (item.getItem() == ingred) return true;
return false;
}
@Override
public String toString() {
return "PositionedStack(output='" + item.toString() + "')";
+179 -291
View File
@@ -1,14 +1,12 @@
package codechicken.nei;
import static codechicken.nei.NEIClientUtils.translate;
import codechicken.core.CommonUtils;
import codechicken.core.gui.GuiScrollSlot;
import codechicken.lib.gui.GuiDraw;
import codechicken.lib.vec.Rectangle4i;
import codechicken.nei.ItemList.AllMultiItemFilter;
import codechicken.nei.ItemList.EverythingItemFilter;
import codechicken.nei.ItemPanel.ItemPanelSlot;
import codechicken.nei.api.API;
import codechicken.nei.api.ItemFilter.ItemFilterProvider;
import codechicken.nei.api.ItemFilter;
import codechicken.nei.recipe.GuiRecipe;
import codechicken.nei.recipe.StackInfo;
@@ -34,43 +32,35 @@ import net.minecraft.client.gui.FontRenderer;
import net.minecraft.item.ItemStack;
import org.apache.commons.io.IOUtils;
import org.lwjgl.input.Keyboard;
import static codechicken.nei.NEIClientUtils.translate;
public class PresetsWidget extends Widget// implements ItemFilterProvider
{
public class PresetsWidget extends Widget {
public static class PresetTag implements ItemFilter
{
public static class PresetTag implements ItemFilter {
public String filename = null;
public String displayName = "";
public boolean whitelist = true;
public HashSet<String> items;
public PresetTag(String displayName)
{
public PresetTag(String displayName) {
this(displayName, new HashSet<>(), false, null);
}
public PresetTag(String displayName, HashSet<String> items)
{
public PresetTag(String displayName, HashSet<String> items) {
this(displayName, items, true, null);
}
public PresetTag(String displayName, HashSet<String> items, boolean whitelist, String filename)
{
public PresetTag(String displayName, HashSet<String> items, boolean whitelist, String filename) {
this.displayName = displayName;
this.items = items != null? items: new HashSet<>();
this.items = items != null ? items : new HashSet<>();
this.whitelist = whitelist;
this.filename = filename;
}
public boolean matches(final ItemStack stack)
{
public boolean matches(final ItemStack stack) {
return items.contains(StackInfo.getItemStackGUID(stack)) == whitelist;
}
public static PresetTag loadFromFile(File file)
{
public static PresetTag loadFromFile(File file) {
if (!file.isFile() || !file.exists() || file.getName().equals("selected.ini")) {
return null;
}
@@ -85,14 +75,15 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
NEIClientConfig.logger.error("Failed to load presets from file {}", file, e);
return null;
}
final JsonParser parser = new JsonParser();
final JsonObject metaObject = parser.parse(itemStrings.remove(0)).getAsJsonObject();
final JsonObject metaObject =
parser.parse(itemStrings.remove(0)).getAsJsonObject();
final String displayName = metaObject.get("displayName").getAsString();
final boolean whitelist = metaObject.get("whitelist").getAsBoolean();
final HashSet<String> items = new HashSet<>();
for (String itemStr: itemStrings) {
for (String itemStr : itemStrings) {
items.add(itemStr);
}
@@ -103,33 +94,29 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
return null;
}
public void deleteFile()
{
public void deleteFile() {
if (presetsDir == null || filename == null) return;
final File tagFile = new File(presetsDir, filename);
if (tagFile.exists()) {
tagFile.delete();
}
}
public void saveToFile()
{
public void saveToFile() {
if (presetsDir == null) return;
if (filename == null) {
final String sanitized = displayName.replaceAll("[^_\\-.0-9a-zA-Z]", "_");
int index = 1;
filename = sanitized + ".ini";
while ((new File(presetsDir, filename)).exists() || filename.equals("selected.ini")) {
filename = sanitized + " (" + index + ").ini";
index++;
}
}
final List<String> strings = new ArrayList<>();
@@ -145,7 +132,7 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
} catch (JsonSyntaxException e) {
NEIClientConfig.logger.error("Failed to stringify presets ItemStack to json string");
}
final File tagFile = new File(presetsDir, filename);
try (FileOutputStream output = new FileOutputStream(tagFile)) {
@@ -153,35 +140,32 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
} catch (IOException e) {
NEIClientConfig.logger.error("Filed to save presets list to file {}", tagFile, e);
}
}
@SuppressWarnings("unchecked")
public PresetTag copy()
{
public PresetTag copy() {
return new PresetTag(displayName, (HashSet) items.clone(), whitelist, null);
}
}
protected static class SubsetListBox extends GuiScrollSlot
{
protected static class SubsetListBox extends GuiScrollSlot {
protected final List<PresetTag> presets = new ArrayList<>();
protected final List<PresetTag> selected = new ArrayList<>();
protected int lastSelectedIndex = 0;
public SubsetListBox(File presetsDir)
{
public SubsetListBox(File presetsDir) {
super(0, 0, 0, 0);
setSmoothScroll(false);
try {
presets.addAll(ItemList.forkJoinPool
.submit(() -> Arrays.asList(presetsDir.listFiles()).parallelStream()
.map(f -> PresetTag.loadFromFile(f))
.filter(p -> p != null)
.collect(Collectors.toCollection(ArrayList::new))).get());
.submit(() -> Arrays.asList(presetsDir.listFiles()).parallelStream()
.map(f -> PresetTag.loadFromFile(f))
.filter(p -> p != null)
.collect(Collectors.toCollection(ArrayList::new)))
.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
return;
@@ -191,14 +175,12 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
sort();
}
public SubsetListBox()
{
public SubsetListBox() {
super(0, 0, 0, 0);
setSmoothScroll(false);
}
public void addTag(final PresetTag tag, boolean sel)
{
public void addTag(final PresetTag tag, boolean sel) {
presets.add(tag);
if (sel) {
@@ -206,18 +188,15 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
}
}
protected List<PresetTag> getPresets()
{
protected List<PresetTag> getPresets() {
return presets;
}
protected List<PresetTag> getSelected()
{
protected List<PresetTag> getSelected() {
return selected;
}
public void replaceSeleted(final PresetTag tag)
{
public void replaceSeleted(final PresetTag tag) {
if (selected.size() == 1) {
selected.get(0).deleteFile();
@@ -233,32 +212,27 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
sort();
}
public void sort()
{
public void sort() {
presets.sort((o1, o2) -> o1.displayName.compareTo(o2.displayName));
}
public void clear()
{
public void clear() {
presets.clear();
selected.clear();
}
@Override
public int getSlotHeight(int slot)
{
public int getSlotHeight(int slot) {
return 18;
}
@Override
protected int getNumSlots()
{
protected int getNumSlots() {
return presets.size();
}
@Override
protected void slotClicked(int slot, int button, int mx, int my, int count)
{
protected void slotClicked(int slot, int button, int mx, int my, int count) {
if (slot >= presets.size()) {
return;
@@ -298,9 +272,8 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
if (!sel || size > 1) {
selected.add(tag);
}
}
if (selected.isEmpty()) {
lastSelectedIndex = 0;
} else if (!NEIClientUtils.shiftKey()) {
@@ -318,13 +291,13 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
saveSelToFile();
PresetsWidget.edit = null;
PresetsWidget.openListBox = !presets.isEmpty() && (NEIClientUtils.controlKey() || NEIClientUtils.shiftKey() || !option.contains(mx, my));
PresetsWidget.openListBox = !presets.isEmpty()
&& (NEIClientUtils.controlKey() || NEIClientUtils.shiftKey() || !option.contains(mx, my));
ItemList.updateFilter.restart();
}
@Override
protected void drawSlot(int slot, int x, int y, int mx, int my, float frame)
{
protected void drawSlot(int slot, int x, int y, int mx, int my, float frame) {
if (slot >= presets.size()) {
return;
}
@@ -335,54 +308,51 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
final Rectangle4i option = new Rectangle4i(x + 18, y, width - 18 - 18, 18);
final PresetTag tag = presets.get(slot);
final int optionState = selected.contains(tag)? 0: option.contains(x + mx, y + my)? 1: 2;
final int directionState = direction.contains(x + mx, y + my)? 1: 2;
final int deleteState = delete.contains(x + mx, y + my)? 1: 2;
final int optionState = selected.contains(tag) ? 0 : option.contains(x + mx, y + my) ? 1 : 2;
final int directionState = direction.contains(x + mx, y + my) ? 1 : 2;
final int deleteState = delete.contains(x + mx, y + my) ? 1 : 2;
final String displayName = cropText(tag.displayName, option.w - 6);
final String dirName = tag.whitelist? translate("presets.whitelist.label"): translate("presets.blacklist.label");
final String displayName = NEIClientUtils.cropText(fontRenderer, tag.displayName, option.w - 6);
final String dirName =
tag.whitelist ? translate("presets.whitelist.label") : translate("presets.blacklist.label");
//blacklist or whitelist
LayoutManager.getLayoutStyle().drawSubsetTag(null, direction.x, direction.y, direction.w, direction.h, directionState, false);
// blacklist or whitelist
LayoutManager.getLayoutStyle()
.drawSubsetTag(null, direction.x, direction.y, direction.w, direction.h, directionState, false);
GuiDraw.drawString(dirName, direction.x + 6, direction.y + 5, directionState == 2 ? 0xFFE0E0E0 : 0xFFFFA0);
//option name
LayoutManager.getLayoutStyle().drawSubsetTag(null, option.x, option.y, option.w, option.h, optionState, false);
// option name
LayoutManager.getLayoutStyle()
.drawSubsetTag(null, option.x, option.y, option.w, option.h, optionState, false);
GuiDraw.drawString(displayName, option.x + 3, option.y + 5, optionState == 2 ? 0xFFE0E0E0 : 0xFFFFA0);
//remove icon
LayoutManager.getLayoutStyle().drawSubsetTag(null, delete.x, delete.y, delete.w, delete.h, deleteState, false);
// remove icon
LayoutManager.getLayoutStyle()
.drawSubsetTag(null, delete.x, delete.y, delete.w, delete.h, deleteState, false);
GuiDraw.drawString("✕", delete.x + 6, delete.y + 5, deleteState == 2 ? 0xFFE0E0E0 : 0x601010);
}
@Override
public void drawOverlay(float frame)
{
}
public void drawOverlay(float frame) {}
@Override
public void drawBackground(float frame)
{
drawRect(x , y, x + width, y + height, 0xFF202020);
@Override
public void drawBackground(float frame) {
drawRect(x, y, x + width, y + height, 0xFF202020);
}
@Override
public void drawScrollbar(float frame)
{
public void drawScrollbar(float frame) {
if (hasScrollbar()) {
super.drawScrollbar(frame);
}
}
@Override
public int scrollbarGuideAlignment()
{
public int scrollbarGuideAlignment() {
return 0;
}
protected List<PresetTag> loadSelFromFile(File presetsDir, List<PresetTag> presets)
{
protected List<PresetTag> loadSelFromFile(File presetsDir, List<PresetTag> presets) {
final File file = new File(presetsDir, "selected.ini");
List<PresetTag> selected = new ArrayList<>();
@@ -401,32 +371,30 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
final HashMap<String, PresetTag> map = new HashMap<>();
for (PresetTag tag: presets) {
for (PresetTag tag : presets) {
map.put(tag.filename, tag);
}
for (String filename: itemStrings) {
for (String filename : itemStrings) {
if (map.containsKey(filename)) {
selected.add(map.get(filename));
}
}
} catch (Throwable th) {
NEIClientConfig.logger.error("Failed to load presets selected from file", file);
}
}
return selected;
}
public void saveSelToFile()
{
public void saveSelToFile() {
final File file = new File(presetsDir, "selected.ini");
final List<String> list = new ArrayList<>();
for (final PresetTag tag: selected) {
for (final PresetTag tag : selected) {
list.add(tag.filename);
}
@@ -435,12 +403,10 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
} catch (IOException e) {
NEIClientConfig.logger.error("Filed to save presets selected list to file {}", file, e);
}
}
}
protected static class MouseSelection
{
protected static class MouseSelection {
public int startX = -1;
public int startY = -1;
public int startIndex = -1;
@@ -448,10 +414,9 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
public HashSet<ItemStack> items = new HashSet<>();
public boolean append = true;
public MouseSelection(int slotIndex, boolean append)
{
final ItemsGrid grid = ItemPanels.itemPanel.getGrid();
final Rectangle4i rec = grid.getSlotRect(slotIndex - (grid.getPage() - 1) * grid.getPerPage());
public MouseSelection(int slotIndex, boolean append) {
final ItemsGrid grid = ItemPanels.itemPanel.getGrid();
final Rectangle4i rec = grid.getItemRect(slotIndex);
this.append = append;
endIndex = slotIndex;
@@ -459,10 +424,9 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
startX = rec.x;
startY = rec.y;
}
}
protected final static FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
protected static final FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
protected static SubsetListBox listbox = new SubsetListBox();
protected static File presetsDir;
@@ -471,82 +435,68 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
protected long lastclicktime;
protected static MouseSelection mouseSelection;
protected final static Button dropdown = new Button()
{
protected static final Button dropdown = new Button() {
public boolean onButtonPress(boolean rightclick)
{
public boolean onButtonPress(boolean rightclick) {
if (!rightclick) {
openListBox = !openListBox;
return true;
}
return false;
return false;
}
@Override
public String getRenderLabel()
{
public String getRenderLabel() {
return "...";
}
};
protected final static Label selectedValue = new Label("", false)
{
protected static final Label selectedValue = new Label("", false) {
@Override
public void draw(int mousex, int mousey)
{
final String text = cropText(this.text, w);
public void draw(int mousex, int mousey) {
final String text = NEIClientUtils.cropText(fontRenderer, this.text, w);
if (text.equals(this.text)) {
GuiDraw.drawString(text, x + w - fontRenderer.getStringWidth(text), y + (h - 8) / 2, colour);
} else {
GuiDraw.drawString(text, x, y + (h - 8) / 2, colour);
}
}
@Override
public List<String> handleTooltip(int mx, int my, List<String> tooltip)
{
if (contains(mx, my)) {
public List<String> handleTooltip(int mx, int my, List<String> tooltip) {
if (contains(mx, my) && listbox.getSelected().size() <= 1) {
tooltip.add(translate("presets.label.tooltip"));
}
return tooltip;
}
};
protected final static TextField selectedDisplayName = new TextField("")
{
public void onTextChange(String oldText)
{
protected static final TextField selectedDisplayName = new TextField("") {
public void onTextChange(String oldText) {
if (edit != null) {
edit.displayName = text();
}
}
@Override
public void draw(int mousex, int mousey)
{
public void draw(int mousex, int mousey) {
super.draw(mousex, mousey);
if (text().isEmpty()) {
GuiDraw.drawGradientRect(x - 1, y - 1, 1, h + 2, 0xFFcc3300, 0xFFcc3300); //Left
GuiDraw.drawGradientRect(x - 1, y - 1, w + 2, 1, 0xFFcc3300, 0xFFcc3300); //Top
GuiDraw.drawGradientRect(x + w, y - 1, 1, h + 2, 0xFFcc3300, 0xFFcc3300); //Left
GuiDraw.drawGradientRect(x - 1, y + h, w + 2, 1, 0xFFcc3300, 0xFFcc3300); //Bottom
GuiDraw.drawGradientRect(x - 1, y - 1, 1, h + 2, 0xFFcc3300, 0xFFcc3300); // Left
GuiDraw.drawGradientRect(x - 1, y - 1, w + 2, 1, 0xFFcc3300, 0xFFcc3300); // Top
GuiDraw.drawGradientRect(x + w, y - 1, 1, h + 2, 0xFFcc3300, 0xFFcc3300); // Left
GuiDraw.drawGradientRect(x - 1, y + h, w + 2, 1, 0xFFcc3300, 0xFFcc3300); // Bottom
}
}
@Override
public List<String> handleTooltip(int mx, int my, List<String> tooltip)
{
public List<String> handleTooltip(int mx, int my, List<String> tooltip) {
if (contains(mx, my) && listbox.getSelected().size() <= 1) {
tooltip.add(translate("presets.textfield.tooltip.1"));
tooltip.add(translate("presets.textfield.tooltip.2"));
@@ -554,94 +504,68 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
return tooltip;
}
};
protected final static Button selectedState = new Button("B")
{
protected static final Button selectedState = new Button("B") {
public boolean onButtonPress(boolean rightclick)
{
public boolean onButtonPress(boolean rightclick) {
if (!rightclick && edit != null) {
edit.whitelist = !edit.whitelist;
return true;
}
return false;
return false;
}
@Override
public String getRenderLabel()
{
return edit != null && edit.whitelist? translate("presets.whitelist.label"): translate("presets.blacklist.label");
public String getRenderLabel() {
return edit != null && edit.whitelist
? translate("presets.whitelist.label")
: translate("presets.blacklist.label");
}
@Override
public void addTooltips(List<String> tooltip)
{
public void addTooltips(List<String> tooltip) {
if (edit != null) {
tooltip.add(edit.whitelist? translate("presets.whitelist.tooltip"): translate("presets.blacklist.tooltip"));
tooltip.add(
edit.whitelist
? translate("presets.whitelist.tooltip")
: translate("presets.blacklist.tooltip"));
}
}
};
protected static String cropText(String text, int containerWidth)
{
int textWidth = fontRenderer.getStringWidth(text);
if (textWidth > containerWidth) {
textWidth += fontRenderer.getStringWidth("...");
while (textWidth > containerWidth) {
textWidth -= fontRenderer.getCharWidth(text.charAt(text.length() - 1));
text = text.substring(0, text.length() - 1);
}
return text + "...";
}
};
return text;
}
protected static void setEditedTag(final PresetTag tag)
{
protected static void setEditedTag(final PresetTag tag) {
edit = tag;
openListBox = false;
selectedDisplayName.setText(tag != null? tag.displayName: "");
selectedDisplayName.setText(tag != null ? tag.displayName : "");
ItemList.updateFilter.restart();
}
public static void addTag(final PresetTag tag)
{
public static void addTag(final PresetTag tag) {
addTag(tag, false);
}
public static void addTag(final PresetTag tag, boolean sel)
{
public static void addTag(final PresetTag tag, boolean sel) {
listbox.addTag(tag, sel);
}
public static boolean inEditMode()
{
public static boolean inEditMode() {
return edit != null;
}
public static boolean isHidden(final ItemStack item)
{
public static boolean isHidden(final ItemStack item) {
if (edit != null || listbox.getSelected().isEmpty()) {
if (edit != null) {
if (edit != null) {
if (mouseSelection != null && mouseSelection.items.contains(item)) {
return mouseSelection.append != edit.whitelist;
}
return !edit.matches(item);
if (mouseSelection != null && mouseSelection.items.contains(item)) {
return mouseSelection.append != edit.whitelist;
}
return !edit.matches(item);
}
if (!listbox.getSelected().isEmpty()) {
final List<PresetTag> selected = listbox.getSelected();
for (int idx = 0; idx < selected.size(); idx++) {
@@ -649,14 +573,12 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
return true;
}
}
}
return false;
}
public static void setHidden(final ItemStack stack, final boolean append)
{
public static void setHidden(final ItemStack stack, final boolean append) {
if (edit == null) {
return;
}
@@ -684,17 +606,14 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
hideItem(items.get(i), append);
}
}
}
} else {
hideItem(stack, append);
}
}
protected static void hideItem(final ItemStack stack, boolean append)
{
protected static void hideItem(final ItemStack stack, boolean append) {
final String guid = StackInfo.getItemStackGUID(stack);
if (append) {
@@ -702,20 +621,18 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
} else {
edit.items.remove(guid);
}
}
protected static String getModId(final ItemStack stack)
{
protected static String getModId(final ItemStack stack) {
try {
return GameRegistry.findUniqueIdentifierFor(stack.getItem()).modId;
} catch (Exception ignored) {}
} catch (Exception ignored) {
}
return null;
}
public static void loadPresets(final String worldPath)
{
public static void loadPresets(final String worldPath) {
final File dir = new File(CommonUtils.getMinecraftDir(), "saves/NEI/" + worldPath);
presetsDir = new File(CommonUtils.getMinecraftDir(), "saves/NEI/" + worldPath + "/presets");
@@ -728,7 +645,7 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
}
listbox = new SubsetListBox(presetsDir);
edit = null;
openListBox = false;
selectedDisplayName.setText("");
@@ -736,80 +653,64 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
ItemList.updateFilter.restart();
}
// public PresetsWidget()
// {
// API.addItemFilter(this);
// }
@Override
public void draw(int mx, int my)
{
final int panelHeight = 16;
final int panelWidth = 153;
public void draw(int mx, int my) {
w = panelWidth;
h = panelHeight;
y = 2;
x = ItemPanels.itemPanel.x - 4 - w;
if (edit != null) {
selectedState.x = x;
selectedState.y = y;
selectedState.w = selectedState.h = panelHeight;
selectedState.w = selectedState.h = h;
selectedState.draw(mx, my);
selectedDisplayName.y = y;
selectedDisplayName.h = h;
selectedDisplayName.x = selectedState.x + selectedState.w + 1;
selectedDisplayName.w = w - panelHeight * 2 - 5;
selectedDisplayName.w = w - h * 2 - 5;
selectedDisplayName.draw(mx, my);
} else {
final List<PresetTag> selected = listbox.getSelected();
final int size = selected.size();
selectedValue.text = size> 1? translate("presets.label.selected", size): (size == 1? selected.get(0).displayName: "");
selectedValue.text = size > 1
? translate("presets.label.selected", size)
: (size == 1 ? selected.get(0).displayName : "");
selectedValue.y = y;
selectedValue.h = h;
selectedValue.w = w - panelHeight - 4;
selectedValue.w = w - h - 4;
selectedValue.x = x;
selectedValue.draw(mx, my);
selectedValue.draw(mx, my);
}
dropdown.y = y;
dropdown.w = dropdown.h = panelHeight;
dropdown.w = dropdown.h = h;
dropdown.x = x + w - dropdown.w;
dropdown.state = edit != null || listbox.getNumSlots() == 0? 2: 0;
dropdown.state = edit != null || listbox.getNumSlots() == 0 ? 2 : 0;
dropdown.draw(mx, my);
if (openListBox) {
final int scrollbarWidth = listbox.hasScrollbar() ? listbox.scrollbarDim().width : 0;
listbox.setSize(
x,
y + h + 1,
w,
Math.min(((LayoutManager.searchField.y - h - y) / 18) * 18, listbox.contentHeight())
);
x,
y + h + 1,
w,
Math.min(((LayoutManager.searchField.y - h - y) / 18) * 18, listbox.contentHeight()));
listbox.setMargins(0, 0, scrollbarWidth, 0);
listbox.draw(mx, my, 0);
}
}
@Override
public boolean contains(int px, int py)
{
public boolean contains(int px, int py) {
return super.contains(px, py) || openListBox && listbox.contains(px, py);
}
@Override
public boolean handleClick(int mx, int my, int button)
{
public boolean handleClick(int mx, int my, int button) {
if (openListBox && listbox.contains(mx, my)) {
listbox.mouseClicked(mx, my, button);
@@ -822,7 +723,7 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
selectedState.handleClick(mx, my, button);
return true;
}
if (selectedDisplayName.contains(mx, my)) {
selectedDisplayName.handleClick(mx, my, button);
return true;
@@ -839,27 +740,24 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
if (button == 0 && selectedValue.contains(mx, my)) {
if (System.currentTimeMillis() - lastclicktime < 400) { //double click
if (System.currentTimeMillis() - lastclicktime < 400) { // double click
final List<PresetTag> selected = listbox.getSelected();
final int size = selected.size();
if (size <= 1) {
setEditedTag(size == 1? selected.get(0).copy(): new PresetTag(""));
setEditedTag(size == 1 ? selected.get(0).copy() : new PresetTag(""));
}
}
lastclicktime = System.currentTimeMillis();
}
}
return contains(mx, my);
}
@Override
public boolean handleClickExt(int mx, int my, int button)
{
public boolean handleClickExt(int mx, int my, int button) {
if (edit != null && mouseSelection == null) {
ItemPanelSlot slot = ItemPanels.itemPanel.getSlotMouseOver(mx, my);
@@ -868,15 +766,13 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
mouseSelection = new MouseSelection(slot.slotIndex, button == 0);
return true;
}
}
return false;
}
@Override
public boolean handleKeyPress(int keyID, char keyChar)
{
public boolean handleKeyPress(int keyID, char keyChar) {
if (keyID == Keyboard.KEY_ESCAPE) {
openListBox = false;
}
@@ -885,7 +781,9 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
return false;
}
if (selectedDisplayName.focused() && (keyID == Keyboard.KEY_RETURN || keyID == Keyboard.KEY_NUMPADENTER) && !selectedDisplayName.text().isEmpty()) {
if (selectedDisplayName.focused()
&& (keyID == Keyboard.KEY_RETURN || keyID == Keyboard.KEY_NUMPADENTER)
&& !selectedDisplayName.text().isEmpty()) {
selectedDisplayName.handleKeyPress(keyID, keyChar);
selectedDisplayName.setFocus(false);
listbox.replaceSeleted(edit);
@@ -902,8 +800,7 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
}
@Override
public void mouseDragged(int mx, int my, int button, long heldTime)
{
public void mouseDragged(int mx, int my, int button, long heldTime) {
if (openListBox) {
listbox.mouseDragged(mx, my, button, heldTime);
@@ -917,34 +814,28 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
mouseSelection.endIndex = slot.slotIndex;
mouseSelection.items.clear();
final Rectangle4i rec = grid.getSlotRect(slot.slotIndex - (grid.getPage() - 1) * grid.getPerPage());
final Rectangle4i rec = grid.getItemRect(slot.slotIndex);
final Rectangle4i sel = new Rectangle4i(
Math.min(rec.x, mouseSelection.startX),
Math.min(rec.y, mouseSelection.startY),
Math.max(rec.x, mouseSelection.startX) - Math.min(rec.x, mouseSelection.startX),
Math.max(rec.y, mouseSelection.startY) - Math.min(rec.y, mouseSelection.startY)
);
Math.min(rec.x, mouseSelection.startX),
Math.min(rec.y, mouseSelection.startY),
Math.max(rec.x, mouseSelection.startX) - Math.min(rec.x, mouseSelection.startX),
Math.max(rec.y, mouseSelection.startY) - Math.min(rec.y, mouseSelection.startY));
for (int x = sel.x; x <= sel.x + sel.w; x += ItemsGrid.SLOT_SIZE) {
for (int y = sel.y; y <= sel.y + sel.h; y += ItemsGrid.SLOT_SIZE) {
ItemStack stack = ItemPanels.itemPanel.getStackMouseOver(x, y);
if (stack != null) {
mouseSelection.items.add(stack);
}
}
}
}
}
}
@Override
public void mouseUp(int mx, int my, int button)
{
public void mouseUp(int mx, int my, int button) {
if (openListBox) {
listbox.mouseMovedOrUp(mx, my, button);
@@ -960,17 +851,14 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
for (ItemStack stack : mouseSelection.items) {
hideItem(stack, mouseSelection.append);
}
}
mouseSelection = null;
}
}
@Override
public boolean onMouseWheel(int i, int mx, int my)
{
public boolean onMouseWheel(int i, int mx, int my) {
if (openListBox && listbox.hasScrollbar() && listbox.contains(mx, my)) {
listbox.scroll(-i);
@@ -981,8 +869,7 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
}
@Override
public void onGuiClick(int mx, int my)
{
public void onGuiClick(int mx, int my) {
if (!contains(mx, my)) {
openListBox = false;
@@ -992,15 +879,14 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
}
@Override
public List<String> handleTooltip(int mx, int my, List<String> tooltip)
{
public List<String> handleTooltip(int mx, int my, List<String> tooltip) {
if (edit != null) {
if (selectedState.contains(mx, my)) {
return selectedState.handleTooltip(mx, my, tooltip);
}
if (selectedDisplayName.contains(mx, my)) {
return selectedDisplayName.handleTooltip(mx, my, tooltip);
}
@@ -1010,14 +896,17 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
if (selectedValue.contains(mx, my)) {
return selectedValue.handleTooltip(mx, my, tooltip);
}
}
return tooltip;
}
public static boolean matches(ItemStack stack)
{
public static boolean matches(ItemStack stack) {
if (edit != null) {
return true;
}
final List<PresetTag> selected = listbox.getSelected();
for (int idx = 0; idx < selected.size(); idx++) {
@@ -1028,5 +917,4 @@ public class PresetsWidget extends Widget// implements ItemFilterProvider
return true;
}
}
@@ -1,7 +1,6 @@
package codechicken.nei;
public abstract class RestartableTask
{
public abstract class RestartableTask {
public final String name;
private Thread thread;
private volatile boolean restart;
@@ -18,18 +17,20 @@ public abstract class RestartableTask
@Override
public void run() {
do {
while(stopped)
try { Thread.sleep(1); } catch (InterruptedException ignored) {}
if(!restart)
execute();
} while(!finish());
while (stopped)
try {
Thread.sleep(1);
} catch (InterruptedException ignored) {
}
if (!restart) execute();
} while (!finish());
}
};
thread.start();
}
private synchronized boolean finish() {
if(restart) {
if (restart) {
restart = false;
return false;
} else {
@@ -44,19 +45,17 @@ public abstract class RestartableTask
}
public synchronized void restart() {
if(thread != null) {
if (thread != null) {
stopped = false;
restart = true;
}
else
start();
} else start();
}
/**
* Stops execution until restart is called. If a thread is running, the restart flag will be set, and the thread will be paused once the execute method exits.
*/
public synchronized void stop() {
if(thread != null) {
if (thread != null) {
stopped = true;
restart = true;
}
+30 -29
View File
@@ -1,5 +1,7 @@
package codechicken.nei;
import static codechicken.nei.NEIClientConfig.world;
import codechicken.lib.gui.GuiDraw;
import codechicken.nei.ItemList.AnyMultiItemFilter;
import codechicken.nei.ItemList.EverythingItemFilter;
@@ -7,22 +9,17 @@ import codechicken.nei.ItemList.PatternItemFilter;
import codechicken.nei.api.API;
import codechicken.nei.api.ItemFilter;
import codechicken.nei.api.ItemFilter.ItemFilterProvider;
import net.minecraft.util.EnumChatFormatting;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import net.minecraft.util.EnumChatFormatting;
import static codechicken.nei.NEIClientConfig.world;
public class SearchField extends TextField implements ItemFilterProvider
{
public class SearchField extends TextField implements ItemFilterProvider {
/**
* Interface for returning a custom filter based on search field text
*/
public static interface ISearchProvider
{
public static interface ISearchProvider {
/**
* @return false if this filter should only be used if no other non-default filters match the search string
*/
@@ -34,8 +31,7 @@ public class SearchField extends TextField implements ItemFilterProvider
public ItemFilter getFilter(String searchText);
}
private static class DefaultSearchProvider implements ISearchProvider
{
private static class DefaultSearchProvider implements ISearchProvider {
@Override
public boolean isPrimary() {
return false;
@@ -49,6 +45,7 @@ public class SearchField extends TextField implements ItemFilterProvider
}
public static List<ISearchProvider> searchProviders = new LinkedList<>();
private boolean isVisible = true;
long lastclicktime;
@@ -62,9 +59,16 @@ public class SearchField extends TextField implements ItemFilterProvider
return world.nbt.getBoolean("searchinventories");
}
public boolean isVisible() {
return isVisible;
}
public void setVisible(boolean visible) {
isVisible = visible;
}
@Override
public int getTextColour()
{
public int getTextColour() {
if (ItemPanels.itemPanel.getItems().isEmpty()) {
return focused() ? 0xFFcc3300 : 0xFF993300;
} else {
@@ -78,18 +82,17 @@ public class SearchField extends TextField implements ItemFilterProvider
super.draw(mousex, mousey);
if (searchInventories()) {
GuiDraw.drawGradientRect(x - 1, y - 1, 1, h + 2, 0xFFFFFF00, 0xFFC0B000); //Left
GuiDraw.drawGradientRect(x - 1, y - 1, w + 2, 1, 0xFFFFFF00, 0xFFC0B000); //Top
GuiDraw.drawGradientRect(x + w, y - 1, 1, h + 2, 0xFFFFFF00, 0xFFC0B000); //Left
GuiDraw.drawGradientRect(x - 1, y + h, w + 2, 1, 0xFFFFFF00, 0xFFC0B000); //Bottom
GuiDraw.drawGradientRect(x - 1, y - 1, 1, h + 2, 0xFFFFFF00, 0xFFC0B000); // Left
GuiDraw.drawGradientRect(x - 1, y - 1, w + 2, 1, 0xFFFFFF00, 0xFFC0B000); // Top
GuiDraw.drawGradientRect(x + w, y - 1, 1, h + 2, 0xFFFFFF00, 0xFFC0B000); // Left
GuiDraw.drawGradientRect(x - 1, y + h, w + 2, 1, 0xFFFFFF00, 0xFFC0B000); // Bottom
}
}
@Override
public boolean handleClick(int mousex, int mousey, int button) {
if (button == 0) {
if (focused() && (System.currentTimeMillis() - lastclicktime < 400)) { //double click
if (focused() && (System.currentTimeMillis() - lastclicktime < 400)) { // double click
NEIClientConfig.world.nbt.setBoolean("searchinventories", !searchInventories());
NEIClientConfig.world.saveNBT();
}
@@ -101,8 +104,7 @@ public class SearchField extends TextField implements ItemFilterProvider
@Override
public void onTextChange(String oldText) {
final String newText = text();
if( newText.length() > 0)
NEIClientConfig.logger.debug("Searching for " + text());
if (newText.length() > 0) NEIClientConfig.logger.debug("Searching for " + text());
NEIClientConfig.setSearchExpression(newText);
ItemList.updateFilter.restart();
@@ -110,8 +112,10 @@ public class SearchField extends TextField implements ItemFilterProvider
@Override
public void lastKeyTyped(int keyID, char keyChar) {
if (keyID == NEIClientConfig.getKeyBinding("gui.search"))
if (isVisible() && NEIClientConfig.isKeyHashDown("gui.search")) {
setFocus(true);
}
}
@Override
@@ -121,21 +125,19 @@ public class SearchField extends TextField implements ItemFilterProvider
public static Pattern getPattern(String search) {
switch (NEIClientConfig.getIntSetting("inventory.searchmode")) {
case 0://plain
case 0: // plain
search = "\\Q" + search + "\\E";
break;
case 1:
search = search
.replace(".", "")
.replace("?", ".")
.replace("*", ".+?");
search = search.replace(".", "").replace("?", ".").replace("*", ".+?");
break;
}
Pattern pattern = null;
try {
pattern = Pattern.compile(search);
} catch (PatternSyntaxException ignored) {}
} catch (PatternSyntaxException ignored) {
}
return pattern == null || pattern.toString().length() == 0 ? null : pattern;
}
@@ -147,8 +149,7 @@ public class SearchField extends TextField implements ItemFilterProvider
List<ItemFilter> secondary = new LinkedList<>();
for (ISearchProvider p : searchProviders) {
ItemFilter filter = p.getFilter(s_filter);
if (filter != null)
(p.isPrimary() ? primary : secondary).add(filter);
if (filter != null) (p.isPrimary() ? primary : secondary).add(filter);
}
if (!primary.isEmpty()) return new AnyMultiItemFilter(primary);
@@ -10,16 +10,14 @@ import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedOutEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerRespawnEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import cpw.mods.fml.common.gameevent.TickEvent.Phase;
import java.util.List;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.world.WorldEvent;
import java.util.List;
public class ServerHandler
{
public class ServerHandler {
private static ServerHandler instance;
public static void load() {
@@ -34,15 +32,16 @@ public class ServerHandler
@SubscribeEvent
public void tickEvent(TickEvent.WorldTickEvent event) {
if (event.phase == Phase.START && !event.world.isRemote &&
NEIServerConfig.dimTags.containsKey(CommonUtils.getDimension(event.world)))//fake worlds that don't call Load
processDisabledProperties(event.world);
if (event.phase == Phase.START
&& !event.world.isRemote
&& NEIServerConfig.dimTags.containsKey(
CommonUtils.getDimension(event.world))) // fake worlds that don't call Load
processDisabledProperties(event.world);
}
@SubscribeEvent
public void loadEvent(WorldEvent.Load event) {
if(!event.world.isRemote)
NEIServerConfig.load(event.world);
if (!event.world.isRemote) NEIServerConfig.load(event.world);
}
@SubscribeEvent
@@ -50,8 +49,7 @@ public class ServerHandler
if (event.phase == Phase.START && event.player instanceof EntityPlayerMP) {
EntityPlayerMP player = (EntityPlayerMP) event.player;
PlayerSave save = NEIServerConfig.forPlayer(player.getCommandSenderName());
if (save == null)
return;
if (save == null) return;
updateMagneticPlayer(player, save);
save.updateOpChange(player);
save.save();
@@ -60,13 +58,13 @@ public class ServerHandler
private void processDisabledProperties(World world) {
NEIServerUtils.advanceDisabledTimes(world);
if (NEIServerUtils.isRaining(world) && NEIServerConfig.isActionDisabled(CommonUtils.getDimension(world), "rain"))
if (NEIServerUtils.isRaining(world)
&& NEIServerConfig.isActionDisabled(CommonUtils.getDimension(world), "rain"))
NEIServerUtils.toggleRaining(world, false);
}
private void updateMagneticPlayer(EntityPlayerMP player, PlayerSave save) {
if (!save.isActionEnabled("magnet") || player.isDead)
return;
if (!save.isActionEnabled("magnet") || player.isDead) return;
float distancexz = 16;
float distancey = 8;
@@ -74,7 +72,8 @@ public class ServerHandler
double maxspeedy = 0.5;
double speedxz = 0.05;
double speedy = 0.07;
List<EntityItem> items = player.worldObj.getEntitiesWithinAABB(EntityItem.class, player.boundingBox.expand(distancexz, distancey, distancexz));
List<EntityItem> items = player.worldObj.getEntitiesWithinAABB(
EntityItem.class, player.boundingBox.expand(distancexz, distancey, distancexz));
for (EntityItem item : items) {
if (item.delayBeforeCanPickup > 0) continue;
if (!NEIServerUtils.canItemFitInInventory(player, item.getEntityItem())) continue;
+3 -4
View File
@@ -1,10 +1,9 @@
package codechicken.nei;
public abstract class SlotOP
{
public abstract class SlotOP {
public abstract String getDescription();
public abstract int[] getKeyBind();
public abstract void operate();
}
@@ -16,79 +16,67 @@ import net.minecraftforge.client.IItemRenderer;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
public class SpawnerRenderer implements IItemRenderer
{
public class SpawnerRenderer implements IItemRenderer {
@Override
public boolean handleRenderType(ItemStack item, ItemRenderType type)
{
public boolean handleRenderType(ItemStack item, ItemRenderType type) {
return true;
}
public void renderInventoryItem(RenderBlocks render, ItemStack item)
{
public void renderInventoryItem(RenderBlocks render, ItemStack item) {
int meta = item.getItemDamage();
if(meta == 0)
meta = ItemMobSpawner.idPig;
if (meta == 0) meta = ItemMobSpawner.idPig;
String bossName = BossStatus.bossName;
int bossTimeout = BossStatus.statusBarTime;
boolean bossHasColorModifier = BossStatus.hasColorModifier;
try
{
try {
World world = NEIClientUtils.mc().theWorld;
ItemMobSpawner.loadSpawners(world);
CCRenderState.changeTexture(TextureMap.locationBlocksTexture);
render.renderBlockAsItem(Blocks.mob_spawner, 0, 1F);
GL11.glPushMatrix();
Entity entity = ItemMobSpawner.getEntity(meta);
entity.setWorld(world);
float f1 = 0.4375F;
if(entity.getShadowSize() > 1.5)
f1 = 0.1F;
GL11.glRotatef((float) (ClientUtils.getRenderTime()*10), 0.0F, 1.0F, 0.0F);
if (entity.getShadowSize() > 1.5) f1 = 0.1F;
GL11.glRotatef((float) (ClientUtils.getRenderTime() * 10), 0.0F, 1.0F, 0.0F);
GL11.glRotatef(-20F, 1.0F, 0.0F, 0.0F);
GL11.glTranslatef(0.0F, -0.4F, 0.0F);
GL11.glScalef(f1, f1, f1);
entity.setLocationAndAngles(0, 0, 0, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(entity, 0.0D, 0.0D, 0.0D, 0.0F, 0);
GL11.glPopMatrix();
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit);
GL11.glDisable(GL11.GL_TEXTURE_2D);
OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit);
}
catch(Exception e)
{
if(Tessellator.instance.isDrawing)
Tessellator.instance.draw();
} catch (Exception e) {
if (Tessellator.instance.isDrawing) Tessellator.instance.draw();
}
BossStatus.bossName = bossName;
BossStatus.statusBarTime = bossTimeout;
BossStatus.hasColorModifier = bossHasColorModifier;
}
@SuppressWarnings("incomplete-switch")
@Override
public void renderItem(ItemRenderType type, ItemStack item, Object... data)
{
switch(type)
{
public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
switch (type) {
case EQUIPPED:
case EQUIPPED_FIRST_PERSON:
GL11.glTranslatef(0.5F, 0.5F, 0.5F);
case INVENTORY:
case ENTITY:
renderInventoryItem((RenderBlocks)data[0], item);
break;
renderInventoryItem((RenderBlocks) data[0], item);
break;
}
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper)
{
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
return true;
}
}
}
+152 -210
View File
@@ -1,5 +1,7 @@
package codechicken.nei;
import static codechicken.nei.NEIClientUtils.translate;
import codechicken.core.gui.GuiScrollSlot;
import codechicken.lib.gui.GuiDraw;
import codechicken.lib.vec.Rectangle4i;
@@ -12,12 +14,6 @@ import codechicken.nei.api.ItemFilter;
import codechicken.nei.api.ItemFilter.ItemFilterProvider;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.guihook.GuiContainerManager;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.EnumChatFormatting;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Collections;
@@ -31,25 +27,24 @@ import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.regex.Pattern;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.EnumChatFormatting;
import static codechicken.nei.NEIClientUtils.translate;
public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoadedCallback, ISearchProvider
{
public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoadedCallback, ISearchProvider {
public static ReentrantReadWriteLock hiddenItemLock = new ReentrantReadWriteLock();
public static Lock writeLock = hiddenItemLock.writeLock();
public static Lock readLock = hiddenItemLock.readLock();
public static class SubsetState
{
public static class SubsetState {
int state = 2;
ArrayList<ItemStack> items = new ArrayList<>();
}
public static class SubsetTag
{
protected class SubsetSlot extends GuiScrollSlot
{
public static class SubsetTag {
protected class SubsetSlot extends GuiScrollSlot {
public SubsetSlot() {
super(0, 0, 0, 0);
setSmoothScroll(false);
@@ -62,25 +57,21 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
@Override
protected int getNumSlots() {
return children.size()+state.items.size();
return children.size() + state.items.size();
}
@Override
protected void slotClicked(int slot, int button, int mx, int my, int count) {
if(slot < sorted.size()) {
if (slot < sorted.size()) {
SubsetTag tag = sorted.get(slot);
if (NEIClientUtils.shiftKey())
codechicken.nei.LayoutManager.searchField.setText("@" + tag.fullname);
else if (button == 0 && count >= 2)
SubsetWidget.showOnly(tag);
else
SubsetWidget.setHidden(tag, button == 1);
else if (button == 0 && count >= 2) SubsetWidget.showOnly(tag);
else SubsetWidget.setHidden(tag, button == 1);
} else {
ItemStack item = state.items.get(slot-sorted.size());
if(NEIClientUtils.controlKey())
NEIClientUtils.cheatItem(item, button, -1);
else
SubsetWidget.setHidden(state.items.get(slot-sorted.size()), button == 1);
ItemStack item = state.items.get(slot - sorted.size());
if (NEIClientUtils.controlKey()) NEIClientUtils.cheatItem(item, button, -1);
else SubsetWidget.setHidden(state.items.get(slot - sorted.size()), button == 1);
}
}
@@ -88,32 +79,31 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
protected void drawSlot(int slot, int x, int y, int mx, int my, float frame) {
int w = windowBounds().width;
Rectangle4i r = new Rectangle4i(x, y, w, getSlotHeight(slot));
if(slot < sorted.size()) {
if (slot < sorted.size()) {
SubsetTag tag = sorted.get(slot);
codechicken.nei.LayoutManager.getLayoutStyle().drawSubsetTag(tag.displayName(), x, y, r.w, r.h, tag.state.state, r.contains(mx, my));
}
else {
ItemStack stack = state.items.get(slot-sorted.size());
codechicken.nei.LayoutManager.getLayoutStyle()
.drawSubsetTag(tag.displayName(), x, y, r.w, r.h, tag.state.state, r.contains(mx, my));
} else {
ItemStack stack = state.items.get(slot - sorted.size());
boolean hidden = SubsetWidget.isHidden(stack);
int itemx = w/2-8;
int itemx = w / 2 - 8;
int itemy = 1;
codechicken.nei.LayoutManager.getLayoutStyle().drawSubsetTag(null, x, y, r.w, r.h, hidden ? 0 : 2, false);
codechicken.nei.LayoutManager.getLayoutStyle()
.drawSubsetTag(null, x, y, r.w, r.h, hidden ? 0 : 2, false);
GuiContainerManager.drawItem(x+itemx, y+itemy, stack);
if(new Rectangle4i(itemx, itemy, 16, 16).contains(mx, my))
SubsetWidget.hoverStack = stack;
GuiContainerManager.drawItem(x + itemx, y + itemy, stack);
if (new Rectangle4i(itemx, itemy, 16, 16).contains(mx, my)) SubsetWidget.hoverStack = stack;
}
}
@Override
public void drawOverlay(float frame) {
}
public void drawOverlay(float frame) {}
@Override
public void drawBackground(float frame) {
drawRect(x, y, x+width, y+height, 0xFF202020);
drawRect(x, y, x + width, y + height, 0xFF202020);
}
@Override
@@ -123,8 +113,7 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
@Override
public void drawScrollbar(float frame) {
if(hasScrollbar())
super.drawScrollbar(frame);
if (hasScrollbar()) super.drawScrollbar(frame);
}
@Override
@@ -155,9 +144,8 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
}
public String displayName() {
String translated = translate("subsets."+fullname);
if(!translated.startsWith("nei."))
return translated;
String translated = translate("subsets." + fullname);
if (!translated.startsWith("nei.")) return translated;
int idx = fullname.lastIndexOf('.');
return idx < 0 ? fullname : fullname.substring(idx + 1);
@@ -165,7 +153,7 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
public String name() {
int idx = fullname.indexOf('.');
return idx < 0 ? fullname : fullname.substring(idx+1);
return idx < 0 ? fullname : fullname.substring(idx + 1);
}
public String parent() {
@@ -177,36 +165,35 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
int idx = name.indexOf('.');
String childname = idx > 0 ? name.substring(0, idx) : name;
SubsetTag child = children.get(childname.toLowerCase());
if(child == null)
return null;
if (child == null) return null;
return idx > 0 ? child.getTag(name.substring(idx+1)) : child;
return idx > 0 ? child.getTag(name.substring(idx + 1)) : child;
}
private void recacheChildren() {
sorted = new ArrayList<>(children.values());
childwidth = 0;
for(SubsetTag tag : sorted)
childwidth = Math.max(childwidth, tag.nameWidth()+2);
for (SubsetTag tag : sorted) childwidth = Math.max(childwidth, tag.nameWidth() + 2);
}
private void addTag(SubsetTag tag) {
String name = fullname == null ? tag.fullname : tag.fullname.substring(fullname.length()+1);
String name = fullname == null ? tag.fullname : tag.fullname.substring(fullname.length() + 1);
int idx = name.indexOf('.');
if(idx < 0) {//add or replace tag
if (idx < 0) { // add or replace tag
SubsetTag prev = children.put(name.toLowerCase(), tag);
if(prev != null) {//replaced, load children
if (prev != null) { // replaced, load children
tag.children = prev.children;
tag.sorted = prev.sorted;
}
recacheChildren();
}
else {
} else {
String childname = name.substring(0, idx);
SubsetTag child = children.get(childname.toLowerCase());
if(child == null)
children.put(childname.toLowerCase(), child = new SubsetTag(fullname == null ? childname : fullname+'.'+childname));
if (child == null)
children.put(
childname.toLowerCase(),
child = new SubsetTag(fullname == null ? childname : fullname + '.' + childname));
recacheChildren();
child.addTag(tag);
}
@@ -214,51 +201,42 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
protected void cacheState() {
state = SubsetWidget.getState(this);
for(SubsetTag tag : sorted)
tag.cacheState();
for (SubsetTag tag : sorted) tag.cacheState();
}
public void addFiltersWithItem(List<ItemFilter> filters, String itemSearch) {
if(itemSearch == null) {
if (itemSearch == null) {
addFilters(filters);
} else {
if(filter != null)
filters.add(new DoubleFilteredFilter(filter, itemSearch));
if (filter != null) filters.add(new DoubleFilteredFilter(filter, itemSearch));
for(SubsetTag child : sorted)
child.addFiltersWithItem(filters, itemSearch);
for (SubsetTag child : sorted) child.addFiltersWithItem(filters, itemSearch);
}
}
public void addFilters(List<ItemFilter> filters) {
if(filter != null)
filters.add(filter);
for(SubsetTag child : sorted)
child.addFilters(filters);
public void addFilters(List<ItemFilter> filters) {
if (filter != null) filters.add(filter);
for (SubsetTag child : sorted) child.addFilters(filters);
}
public void search(List<SubsetTag> tags, Pattern p) {
if(fullname != null && p.matcher(fullname.toLowerCase()).find())
tags.add(this);
else
for(SubsetTag child : sorted)
child.search(tags, p);
if (fullname != null && p.matcher(fullname.toLowerCase()).find()) tags.add(this);
else for (SubsetTag child : sorted) child.search(tags, p);
}
public void updateVisiblity(int mx, int my) {
if(selectedChild != null) {
if (selectedChild != null) {
selectedChild.updateVisiblity(mx, my);
if(!selectedChild.isVisible())
selectedChild = null;
if (!selectedChild.isVisible()) selectedChild = null;
}
if(slot.contains(mx, my) && (selectedChild == null || !selectedChild.contains(mx, my))) {
if (slot.contains(mx, my) && (selectedChild == null || !selectedChild.contains(mx, my))) {
int mslot = slot.getClickedSlot(my);
if(mslot >= 0 && mslot < sorted.size()) {
if (mslot >= 0 && mslot < sorted.size()) {
SubsetTag mtag = sorted.get(mslot);
if(mtag != null) {
if(mtag != selectedChild && selectedChild != null)
selectedChild.setHidden();
if (mtag != null) {
if (mtag != selectedChild && selectedChild != null) selectedChild.setHidden();
selectedChild = mtag;
selectedChild.setVisible();
}
@@ -267,14 +245,13 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
setVisible();
}
if(selectedChild == null)
countdownVisible();
if (selectedChild == null) countdownVisible();
}
public void setHidden() {
visible = 0;
slot.mouseMovedOrUp(0, 0, 0);//cancel any scrolling
if(selectedChild != null) {
slot.mouseMovedOrUp(0, 0, 0); // cancel any scrolling
if (selectedChild != null) {
selectedChild.setHidden();
selectedChild = null;
}
@@ -286,41 +263,37 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
}
private void countdownVisible() {
if(visible > 0 && --visible == 0)
setHidden();
if (visible > 0 && --visible == 0) setHidden();
}
public void resize(int x, int pwidth, int y) {
int mheight = area.h;
int dheight = area.y2()-y;
int dheight = area.y2() - y;
int cheight = slot.contentHeight();
int height = cheight;
if(cheight > mheight) {
if (cheight > mheight) {
y = area.y;
height = mheight;
} else if(cheight > dheight) {
} else if (cheight > dheight) {
y = area.y2() - cheight;
}
height = height/slot.getSlotHeight(0)*slot.getSlotHeight(0);//floor to a multiple of slot height
height = height / slot.getSlotHeight(0) * slot.getSlotHeight(0); // floor to a multiple of slot height
int width = childwidth;
if(!state.items.isEmpty())
width = Math.max(childwidth, 18);
if(slot.contentHeight() > height)
width+=slot.scrollbarDim().width;
if (!state.items.isEmpty()) width = Math.max(childwidth, 18);
if (slot.contentHeight() > height) width += slot.scrollbarDim().width;
boolean fitLeft = x-width >= area.x1();
boolean fitRight = x+width+pwidth <= area.x2();
if(pwidth >= 0 ? !fitRight && fitLeft : !fitLeft)
pwidth*=-1;//swap
boolean fitLeft = x - width >= area.x1();
boolean fitRight = x + width + pwidth <= area.x2();
if (pwidth >= 0 ? !fitRight && fitLeft : !fitLeft) pwidth *= -1; // swap
x += pwidth >= 0 ? pwidth : -width;
slot.setSize(x, y, width, height);
slot.setMargins(slot.hasScrollbar() ? slot.scrollbarDim().width : 0, 0, 0, 0);
if(selectedChild != null) {
y = slot.getSlotY(sorted.indexOf(selectedChild))-slot.scrolledPixels()+slot.y;
if (selectedChild != null) {
y = slot.getSlotY(sorted.indexOf(selectedChild)) - slot.scrolledPixels() + slot.y;
selectedChild.resize(x, pwidth >= 0 ? width : -width, y);
}
}
@@ -335,44 +308,37 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
public void draw(int mx, int my) {
slot.draw(mx, my, 0);
if(selectedChild != null)
selectedChild.draw(mx, my);
if (selectedChild != null) selectedChild.draw(mx, my);
}
public boolean contains(int px, int py) {
return slot.contains(px, py) ||
selectedChild != null && selectedChild.contains(px, py);
return slot.contains(px, py) || selectedChild != null && selectedChild.contains(px, py);
}
public void mouseClicked(int mx, int my, int button) {
if(selectedChild != null && selectedChild.contains(mx, my))
selectedChild.mouseClicked(mx, my, button);
else if(slot.contains(mx, my))
slot.mouseClicked(mx, my, button);
if (selectedChild != null && selectedChild.contains(mx, my)) selectedChild.mouseClicked(mx, my, button);
else if (slot.contains(mx, my)) slot.mouseClicked(mx, my, button);
}
public void mouseDragged(int mx, int my, int button, long heldTime) {
slot.mouseDragged(mx, my, button, heldTime);
if(selectedChild != null)
selectedChild.mouseDragged(mx, my, button, heldTime);
if (selectedChild != null) selectedChild.mouseDragged(mx, my, button, heldTime);
}
public void mouseUp(int mx, int my, int button) {
slot.mouseMovedOrUp(mx, my, button);
if(selectedChild != null)
selectedChild.mouseUp(mx, my, button);
if (selectedChild != null) selectedChild.mouseUp(mx, my, button);
}
public boolean mouseScrolled(int mx, int my, int scroll) {
if(slot.hasScrollbar() && slot.contains(mx, my)) {
if (slot.hasScrollbar() && slot.contains(mx, my)) {
slot.scroll(scroll);
return true;
}
if(selectedChild != null && selectedChild.mouseScrolled(mx, my, scroll))
return true;
if (selectedChild != null && selectedChild.mouseScrolled(mx, my, scroll)) return true;
if(slot.hasScrollbar() && !contains(mx, my)) {
if (slot.hasScrollbar() && !contains(mx, my)) {
slot.scroll(scroll);
return true;
}
@@ -381,8 +347,7 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
}
public boolean isScrolling() {
return slot.isScrolling() ||
selectedChild != null && selectedChild.isScrolling();
return slot.isScrolling() || selectedChild != null && selectedChild.isScrolling();
}
}
@@ -395,6 +360,7 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
* All operations on this variable should be synchronised.
*/
private static final ItemStackSet hiddenItems = new ItemStackSet();
private static final AtomicReference<NBTTagList> dirtyHiddenItems = new AtomicReference<>();
public static SubsetState getState(SubsetTag tag) {
@@ -416,7 +382,7 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
public static boolean isHidden(ItemStack item) {
try {
if(readLock.tryLock(5, TimeUnit.SECONDS)) {
if (readLock.tryLock(5, TimeUnit.SECONDS)) {
try {
return hiddenItems.contains(item);
} finally {
@@ -432,27 +398,22 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
}
private static void _setHidden(SubsetTag tag, boolean hidden) {
for(ItemStack item : getState(tag).items)
_setHidden(item, hidden);
for(SubsetTag child : tag.sorted)
_setHidden(child, hidden);
for (ItemStack item : getState(tag).items) _setHidden(item, hidden);
for (SubsetTag child : tag.sorted) _setHidden(child, hidden);
}
private static void _setHidden(ItemStack item, boolean hidden) {
if (hiddenItemLock.isWriteLockedByCurrentThread()) {
if (hidden)
hiddenItems.add(item);
else
hiddenItems.remove(item);
if (hidden) hiddenItems.add(item);
else hiddenItems.remove(item);
}
}
public static void showOnly(SubsetTag tag) {
try {
if(writeLock.tryLock(5, TimeUnit.SECONDS)) {
if (writeLock.tryLock(5, TimeUnit.SECONDS)) {
try {
for (ItemStack item : ItemList.items)
_setHidden(item, true);
for (ItemStack item : ItemList.items) _setHidden(item, true);
setHidden(tag, false);
} finally {
writeLock.unlock();
@@ -467,7 +428,7 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
public static void setHidden(SubsetTag tag, boolean hidden) {
try {
if(writeLock.tryLock(5, TimeUnit.SECONDS)) {
if (writeLock.tryLock(5, TimeUnit.SECONDS)) {
try {
_setHidden(tag, hidden);
updateHiddenItems();
@@ -484,7 +445,7 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
public static void setHidden(ItemStack item, boolean hidden) {
try {
if(writeLock.tryLock(5, TimeUnit.SECONDS)) {
if (writeLock.tryLock(5, TimeUnit.SECONDS)) {
try {
_setHidden(item, hidden);
updateHiddenItems();
@@ -501,7 +462,7 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
public static void unhideAll() {
try {
if(writeLock.tryLock(5, TimeUnit.SECONDS)) {
if (writeLock.tryLock(5, TimeUnit.SECONDS)) {
try {
hiddenItems.clear();
updateHiddenItems();
@@ -523,7 +484,7 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
public static void loadHidden() {
try {
if(writeLock.tryLock(5, TimeUnit.SECONDS)) {
if (writeLock.tryLock(5, TimeUnit.SECONDS)) {
try {
hiddenItems.clear();
} finally {
@@ -540,19 +501,17 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
List<ItemStack> itemList = new LinkedList<>();
try {
NBTTagList list = NEIClientConfig.world.nbt.getTagList("hiddenItems", 10);
for(int i = 0; i < list.tagCount(); i++)
for (int i = 0; i < list.tagCount(); i++)
itemList.add(ItemStack.loadItemStackFromNBT(list.getCompoundTagAt(i)));
}
catch (Exception e) {
} catch (Exception e) {
NEIClientConfig.logger.error("Error loading hiddenItems", e);
return;
}
try {
if(writeLock.tryLock(5, TimeUnit.SECONDS)) {
if (writeLock.tryLock(5, TimeUnit.SECONDS)) {
try {
for (ItemStack item : itemList)
hiddenItems.add(item);
for (ItemStack item : itemList) hiddenItems.add(item);
} finally {
writeLock.unlock();
}
@@ -567,17 +526,16 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
private static void saveHidden() {
NBTTagList list = dirtyHiddenItems.getAndSet(null);
if(list != null) {
if (list != null) {
NEIClientConfig.world.nbt.setTag("hiddenItems", list);
NEIClientConfig.world.saveNBT();
}
}
private static final RestartableTask prepareDirtyHiddenItems = new RestartableTask("NEI Subset Save Thread")
{
private static final RestartableTask prepareDirtyHiddenItems = new RestartableTask("NEI Subset Save Thread") {
private List<ItemStack> getList() {
try {
if(readLock.tryLock(5, TimeUnit.SECONDS)) {
if (readLock.tryLock(5, TimeUnit.SECONDS)) {
try {
return hiddenItems.values();
} finally {
@@ -595,8 +553,8 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
@Override
public void execute() {
NBTTagList list = new NBTTagList();
for(ItemStack item : getList()) {
if(interrupted()) return;
for (ItemStack item : getList()) {
if (interrupted()) return;
NBTTagCompound tag = new NBTTagCompound();
item.writeToNBT(tag);
list.appendTag(tag);
@@ -606,8 +564,8 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
};
private static final UpdateStateTask updateState = new UpdateStateTask();
private static class UpdateStateTask extends RestartableTask
{
private static class UpdateStateTask extends RestartableTask {
private volatile boolean reallocate;
public UpdateStateTask() {
@@ -634,13 +592,13 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
List<SubsetTag> tags = new LinkedList<>();
synchronized (root) {
cloneStates(root, tags, state);
if(interrupted()) return;
if (interrupted()) return;
}
if(reallocate) {
if (reallocate) {
for (ItemStack item : ItemList.items) {
if(interrupted()) return;
if(ItemInfo.isHidden(item)) continue;
if (interrupted()) return;
if (ItemInfo.isHidden(item)) continue;
for (SubsetTag tag : tags)
if (tag.filter.matches(item))
state.get(tag.fullname).items.add(item);
@@ -649,7 +607,7 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
synchronized (root) {
calculateVisibility(root, state);
if(interrupted()) return;
if (interrupted()) return;
}
subsetState = state;
@@ -657,44 +615,38 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
}
private void cloneStates(SubsetTag tag, List<SubsetTag> tags, HashMap<String, SubsetState> state) {
for(SubsetTag child : tag.sorted) {
if(interrupted()) return;
for (SubsetTag child : tag.sorted) {
if (interrupted()) return;
cloneStates(child, tags, state);
}
tags.add(tag);
SubsetState sstate = new SubsetState();
if(!reallocate)
sstate.items = SubsetWidget.getState(tag).items;
if (!reallocate) sstate.items = SubsetWidget.getState(tag).items;
state.put(tag.fullname, sstate);
}
private void calculateVisibility(SubsetTag tag, Map<String, SubsetState> state) {
SubsetState sstate = state.get(tag.fullname);
int hidden = 0;
for(SubsetTag child : tag.sorted) {
if(interrupted()) return;
for (SubsetTag child : tag.sorted) {
if (interrupted()) return;
calculateVisibility(child, state);
int cstate = state.get(child.fullname).state;
if(cstate == 1)
sstate.state = 1;
else if(cstate == 0)
hidden++;
if (cstate == 1) sstate.state = 1;
else if (cstate == 0) hidden++;
}
if(sstate.state == 1) return;
if (sstate.state == 1) return;
List<ItemStack> items = sstate.items;
for(ItemStack item : items) {
if(interrupted()) return;
if (isHidden(item))
hidden++;
for (ItemStack item : items) {
if (interrupted()) return;
if (isHidden(item)) hidden++;
}
if(hidden == tag.sorted.size()+items.size())
sstate.state = 0;
else if(hidden > 0)
sstate.state = 1;
if (hidden == tag.sorted.size() + items.size()) sstate.state = 0;
else if (hidden > 0) sstate.state = 1;
}
}
@@ -716,7 +668,7 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
public void draw(int mx, int my) {
super.draw(mx, my);
area.set(x, y + h, w, LayoutManager.searchField.y - h - y); //23 for the search box
area.set(x, y + h, w, LayoutManager.searchField.y - h - y); // 23 for the search box
hoverStack = null;
if (root.isVisible()) {
@@ -734,33 +686,28 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
}
private void updateVisiblity(int mx, int my) {
if(!root.isVisible() || root.isScrolling())
return;
if (!root.isVisible() || root.isScrolling()) return;
root.updateVisiblity(mx, my);
if(!root.isVisible() && bounds().contains(mx, my))
root.setVisible();
if (!root.isVisible() && bounds().contains(mx, my)) root.setVisible();
}
@Override
public boolean contains(int px, int py) {
return super.contains(px, py) ||
root.isVisible() && root.contains(px, py);
return super.contains(px, py) || root.isVisible() && root.contains(px, py);
}
@Override
public boolean handleClick(int mx, int my, int button) {
if(root.isVisible() && root.contains(mx, my)) {
if (root.isVisible() && root.contains(mx, my)) {
root.mouseClicked(mx, my, button);
return true;
}
if(button == 0) {
if(System.currentTimeMillis() - lastclicktime < 500)
unhideAll();
else
root.setVisible();
if (button == 0) {
if (System.currentTimeMillis() - lastclicktime < 500) unhideAll();
else root.setVisible();
NEIClientUtils.playClickSound();
lastclicktime = System.currentTimeMillis();
@@ -779,14 +726,12 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
@Override
public void mouseDragged(int mx, int my, int button, long heldTime) {
if(root.isVisible())
root.mouseDragged(mx, my, button, heldTime);
if (root.isVisible()) root.mouseDragged(mx, my, button, heldTime);
}
@Override
public void mouseUp(int mx, int my, int button) {
if(root.isVisible())
root.mouseUp(mx, my, button);
if (root.isVisible()) root.mouseUp(mx, my, button);
}
@Override
@@ -796,8 +741,7 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
@Override
public void onGuiClick(int mx, int my) {
if(!contains(mx, my))
root.setHidden();
if (!contains(mx, my)) root.setHidden();
}
@Override
@@ -807,10 +751,10 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
@Override
public ItemFilter getFilter() {
//synchronise access on hiddenItems
// synchronise access on hiddenItems
return item -> {
try {
if(readLock.tryLock(5, TimeUnit.SECONDS)) {
if (readLock.tryLock(5, TimeUnit.SECONDS)) {
try {
return !hiddenItems.matches(item);
} finally {
@@ -833,36 +777,34 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
@Override
public ItemFilter getFilter(String searchText) {
if(!searchText.startsWith("@"))
return null;
if (!searchText.startsWith("@")) return null;
searchText = searchText.substring(1);
String itemSearch = null;
if(searchText.contains("->")) {
if (searchText.contains("->")) {
String[] split = searchText.split("->");
searchText = split[0];
if(split.length > 1) itemSearch = split[1];
if (split.length > 1) itemSearch = split[1];
}
AnyMultiItemFilter filter = new AnyMultiItemFilter();
SubsetTag tag = getTag(searchText);
if(tag != null) {
if (tag != null) {
// We've got an exact match
tag.addFiltersWithItem(filter.filters, itemSearch);
}
else {
} else {
// Try searching for a substring
Pattern p = SearchField.getPattern(searchText);
if(p == null) return null;
if (p == null) return null;
List<SubsetTag> matching = new LinkedList<>();
root.search(matching, p);
if(matching.isEmpty()) return null;
for(SubsetTag tag2 : matching) {
if (matching.isEmpty()) return null;
for (SubsetTag tag2 : matching) {
tag2.addFiltersWithItem(filter.filters, itemSearch);
}
}
return filter;
}
+10 -19
View File
@@ -4,8 +4,7 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiTextField;
import org.lwjgl.input.Keyboard;
public abstract class TextField extends Widget
{
public abstract class TextField extends Widget {
protected GuiTextField field;
private static final int maxSearchLength = 256;
@@ -24,7 +23,7 @@ public abstract class TextField extends Widget
public TextField(String ident) {
identifier = ident;
initInternalTextField();
// Keyboard.enableRepeatEvents(true);
// Keyboard.enableRepeatEvents(true);
}
public int getTextColour() {
@@ -44,7 +43,7 @@ public abstract class TextField extends Widget
try {
setDimensionsAndColor();
field.drawTextBox();
} catch(NullPointerException npe) {
} catch (NullPointerException npe) {
// Hack to deal with a null font renderer... recreate the field and it should work
GuiTextField oldField = field;
@@ -58,49 +57,43 @@ public abstract class TextField extends Widget
@Override
public void onGuiClick(int mousex, int mousey) {
if (!contains(mousex, mousey))
setFocus(false);
if (!contains(mousex, mousey)) setFocus(false);
}
@Override
public boolean handleClick(int mousex, int mousey, int button) {
setFocus(true);
if (button == 1)
setText("");
else
field.mouseClicked(mousex, mousey, button);
if (button == 1) setText("");
else field.mouseClicked(mousex, mousey, button);
return true;
}
@Override
public boolean handleKeyPress(int keyID, char keyChar) {
if (!focused())
return false;
if (!focused()) return false;
String oldText = text();
boolean handled = field.textboxKeyTyped(keyChar, keyID);
if(!handled) {
if (!handled) {
if (keyID == Keyboard.KEY_RETURN || keyID == Keyboard.KEY_NUMPADENTER || keyID == Keyboard.KEY_ESCAPE) {
setFocus(false);
handled = true;
}
}
if(handled) {
if (handled) {
onTextChange(oldText);
}
return handled;
}
public abstract void onTextChange(String oldText);
@Override
public void update() {
}
public void update() {}
public void setText(String s) {
String oldText = text();
@@ -126,7 +119,6 @@ public abstract class TextField extends Widget
Keyboard.enableRepeatEvents(previousKeyboardRepeatEnabled);
loseFocus();
}
}
}
@@ -137,5 +129,4 @@ public abstract class TextField extends Widget
public String text() {
return field.getText();
}
}
@@ -3,11 +3,9 @@ package codechicken.nei;
import com.google.common.base.Objects;
import cpw.mods.fml.common.FMLCommonHandler;
public class ThreadOperationTimer extends Thread
{
public class ThreadOperationTimer extends Thread {
@SuppressWarnings("serial")
public static class TimeoutException extends RuntimeException
{
public static class TimeoutException extends RuntimeException {
public final Object operation;
public TimeoutException(String msg, Object op) {
@@ -22,7 +20,7 @@ public class ThreadOperationTimer extends Thread
private long limit;
private ThreadOperationTimer(Thread thread, int limit) {
super(thread.getName()+" Operation Timer");
super(thread.getName() + " Operation Timer");
this.thread = thread;
this.limit = limit;
}
@@ -41,7 +39,7 @@ public class ThreadOperationTimer extends Thread
}
public synchronized void update(Object op) {
if(!Objects.equal(operation, op)) {
if (!Objects.equal(operation, op)) {
operation = op;
opTime = System.currentTimeMillis();
}
@@ -50,20 +48,23 @@ public class ThreadOperationTimer extends Thread
@SuppressWarnings("deprecation")
@Override
public void run() {
if(FMLCommonHandler.instance().findContainerFor("NotEnoughItems").getVersion().contains("$"))
return;//don't run this thread in a source environment
if (FMLCommonHandler.instance()
.findContainerFor("NotEnoughItems")
.getVersion()
.contains("$")) return; // don't run this thread in a source environment
while (thread.isAlive()) {
synchronized (this) {
if (operation != null && System.currentTimeMillis() - opTime > limit) {
// Thread.stop(Throwable) is hard-deprecated and IntelliJ complains about it.
//thread.stop(new TimeoutException("Operation took too long", operation));
// thread.stop(new TimeoutException("Operation took too long", operation));
thread.stop();
}
}
try {
Thread.sleep(50);
} catch (InterruptedException ie) {}
} catch (InterruptedException ie) {
}
}
}
@@ -72,4 +73,4 @@ public class ThreadOperationTimer extends Thread
t.start();
return t;
}
}
}
@@ -1,7 +1,6 @@
package codechicken.nei;
public class VisiblityData
{
public class VisiblityData {
public boolean showUtilityButtons = true;
/**
* Item panel and associated buttons
@@ -35,19 +34,16 @@ public class VisiblityData
* The entire NEI interface, aka hidden
*/
public boolean showNEI = true;
public boolean enableDeleteMode = true;
// Deprecated -- left in for campatability with other mods that mess with this
public boolean showStateButtons = false;
public void translateDependancies()
{
if(!showNEI)
showWidgets = false;
if(!showWidgets)
showItemSection = showUtilityButtons = false;
if(!showItemSection)
public void translateDependancies() {
if (!showNEI) showWidgets = false;
if (!showWidgets) showItemSection = showUtilityButtons = false;
if (!showItemSection)
showBookmarkPanel = showSubsetDropdown = showPresetsDropdown = showSearchSection = showItemPanel = false;
}
}
+11 -23
View File
@@ -1,37 +1,29 @@
package codechicken.nei;
import codechicken.lib.vec.Rectangle4i;
import java.util.List;
import net.minecraft.item.ItemStack;
import java.util.List;
public abstract class Widget
{
public Widget() {
}
public abstract class Widget {
public Widget() {}
public abstract void draw(int mx, int my);
public void postDraw(int mx, int my) {
}
public void postDraw(int mx, int my) {}
public boolean handleClick(int mx, int my, int button) {
return true;
}
public void onGuiClick(int mx, int my) {
}
public void onGuiClick(int mx, int my) {}
public void mouseUp(int mx, int my, int button) {
}
public void mouseUp(int mx, int my, int button) {}
public boolean handleKeyPress(int keyID, char keyChar) {
return false;
}
public void lastKeyTyped(int keyID, char keyChar) {
}
public void lastKeyTyped(int keyID, char keyChar) {}
public boolean handleClickExt(int mx, int my, int button) {
return false;
@@ -41,8 +33,7 @@ public abstract class Widget
return false;
}
public void update() {
}
public void update() {}
public Rectangle4i bounds() {
return new Rectangle4i(x, y, w, h);
@@ -56,18 +47,15 @@ public abstract class Widget
return null;
}
public void mouseDragged(int mx, int my, int button, long heldTime) {
}
public void mouseDragged(int mx, int my, int button, long heldTime) {}
public List<String> handleTooltip(int mx, int my, List<String> tooltip) {
return tooltip;
}
public void loseFocus() {
}
public void loseFocus() {}
public void gainFocus() {
}
public void gainFocus() {}
public int x;
public int y;
@@ -2,17 +2,14 @@ package codechicken.nei;
import java.util.Comparator;
public class WidgetZOrder
implements Comparator<Widget>
{
public class WidgetZOrder implements Comparator<Widget> {
final boolean topfirst;
public WidgetZOrder(boolean topfirst)
{
public WidgetZOrder(boolean topfirst) {
this.topfirst = topfirst;
}
public int compare(Widget w1, Widget w2)
{
public int compare(Widget w1, Widget w2) {
return w1.z != w2.z ? ((topfirst ? w1.z > w2.z : w1.z < w2.z) ? 1 : -1) : 1;
}
}
@@ -30,11 +30,9 @@ public class WorldOverlayRenderer implements IKeyStateTracker {
@Override
public void tickKeyStates() {
if (Minecraft.getMinecraft().currentScreen != null)
return;
if (Minecraft.getMinecraft().currentScreen != null) return;
if (KeyManager.keyStates.get("world.moboverlay").down)
mobOverlay = (mobOverlay + 1) % 2;
if (KeyManager.keyStates.get("world.moboverlay").down) mobOverlay = (mobOverlay + 1) % 2;
if (KeyManager.keyStates.get("world.chunkoverlay").down)
chunkOverlay = (chunkOverlay + 1) % (NEIModContainer.isGT5Loaded() ? 4 : 3);
}
@@ -157,8 +155,8 @@ public class WorldOverlayRenderer implements IKeyStateTracker {
private static final AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(0, 0, 0, 0, 0, 0);
private static byte getSpawnMode(Chunk chunk, int x, int y, int z) {
if (!SpawnerAnimals.canCreatureTypeSpawnAtLocation(EnumCreatureType.monster, chunk.worldObj, x, y, z) ||
chunk.getSavedLightValue(EnumSkyBlock.Block, x & 15, y, z & 15) >= 8) {
if (!SpawnerAnimals.canCreatureTypeSpawnAtLocation(EnumCreatureType.monster, chunk.worldObj, x, y, z)
|| chunk.getSavedLightValue(EnumSkyBlock.Block, x & 15, y, z & 15) >= 8) {
return 0;
}
@@ -168,7 +166,8 @@ public class WorldOverlayRenderer implements IKeyStateTracker {
aabb.maxY = y + 1.8;
aabb.minZ = z + 0.2;
aabb.maxZ = z + 0.8;
if (!chunk.worldObj.getCollidingBoundingBoxes(dummyEntity, aabb).isEmpty() || chunk.worldObj.isAnyLiquid(aabb)) {
if (!chunk.worldObj.getCollidingBoundingBoxes(dummyEntity, aabb).isEmpty()
|| chunk.worldObj.isAnyLiquid(aabb)) {
return 0;
}
@@ -176,8 +175,7 @@ public class WorldOverlayRenderer implements IKeyStateTracker {
}
private static void renderChunkBounds(Entity entity) {
if (chunkOverlay == 0)
return;
if (chunkOverlay == 0) return;
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_BLEND);
+23 -19
View File
@@ -24,6 +24,9 @@ import codechicken.nei.recipe.IUsageHandler;
import codechicken.nei.recipe.RecipeCatalysts;
import codechicken.nei.recipe.RecipeInfo;
import codechicken.nei.recipe.StackInfo;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.Slot;
@@ -31,17 +34,12 @@ import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import org.lwjgl.input.Keyboard;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* This is the main class that handles item property configuration.
* WARNING: DO NOT access this class until the world has been loaded
* These methods should be called from INEIConfig implementors
*/
public class API
{
public class API {
/**
* Register a new Crafting Recipe handler;
*
@@ -92,7 +90,8 @@ public class API
* {crafting, crafting2x2, smelting, fuel, brewing}
* @param positioner A Stack Repositioner for moving the items to the right place
*/
public static void registerGuiOverlay(Class<? extends GuiContainer> classz, String ident, IStackPositioner positioner) {
public static void registerGuiOverlay(
Class<? extends GuiContainer> classz, String ident, IStackPositioner positioner) {
RecipeInfo.registerGuiOverlay(classz, ident, positioner);
}
@@ -101,7 +100,8 @@ public class API
* @param handler The handler to register
* @param ident The recipe identification string
*/
public static void registerGuiOverlayHandler(Class<? extends GuiContainer> classz, IOverlayHandler handler, String ident) {
public static void registerGuiOverlayHandler(
Class<? extends GuiContainer> classz, IOverlayHandler handler, String ident) {
RecipeInfo.registerOverlayHandler(classz, handler, ident);
}
@@ -155,8 +155,7 @@ public class API
* Sets the item variants to appear in the item panel, overriding the default search pattern for a given item
*/
public static void setItemListEntries(Item item, Iterable<ItemStack> items) {
if(items == null)
items = Collections.emptyList();
if (items == null) items = Collections.emptyList();
ItemInfo.itemOverrides.replaceValues(item, items);
LayoutManager.markItemsDirty();
}
@@ -172,6 +171,16 @@ public class API
addOption(new OptionKeyBind(ident));
}
/**
* Add a custom KeyBinding to be configured in the Controls menu.
* @param ident An identifier for your key, eg "shoot"
* @param defaultKey The default value, commonly obtained from {@link Keyboard}
*/
public static void addHashBind(String ident, int defaultKey) {
NEIClientConfig.setDefaultKeyBinding(ident, defaultKey);
addOption(new OptionKeyBind(ident, true));
}
public static void addOption(Option option) {
NEIClientConfig.getOptionList().addOption(option);
}
@@ -253,8 +262,7 @@ public class API
*/
public static void addSubset(String name, Iterable<ItemStack> items) {
ItemStackSet filter = new ItemStackSet();
for(ItemStack item : items)
filter.add(item);
for (ItemStack item : items) filter.add(item);
addSubset(new SubsetTag(name, filter));
}
@@ -290,8 +298,7 @@ public class API
LayoutManager.markItemsDirty();
}
public static void registerStackStringifyHandler(IStackStringifyHandler handler)
{
public static void registerStackStringifyHandler(IStackStringifyHandler handler) {
StackInfo.stackStringifyHandlers.add(handler);
}
@@ -356,11 +363,8 @@ public class API
}
@Deprecated
public static void addRecipeCatalyst(ItemStack stack, Class<? extends IRecipeHandler> handler) {
}
public static void addRecipeCatalyst(ItemStack stack, Class<? extends IRecipeHandler> handler) {}
@Deprecated
public static void addRecipeCatalyst(List<ItemStack> stacks, Class<? extends IRecipeHandler> handler) {
}
public static void addRecipeCatalyst(List<ItemStack> stacks, Class<? extends IRecipeHandler> handler) {}
}
@@ -2,43 +2,37 @@ package codechicken.nei.api;
import codechicken.nei.PositionedStack;
import codechicken.nei.guihook.GuiContainerManager;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.inventory.Slot;
import org.lwjgl.opengl.GL11;
import java.util.ArrayList;
import java.util.List;
public class DefaultOverlayRenderer implements IRecipeOverlayRenderer
{
public DefaultOverlayRenderer(List<PositionedStack> ai, IStackPositioner positioner)
{
public class DefaultOverlayRenderer implements IRecipeOverlayRenderer {
public DefaultOverlayRenderer(List<PositionedStack> ai, IStackPositioner positioner) {
positioner = this.positioner = positioner;
ingreds = new ArrayList<>();
for(PositionedStack stack : ai)
ingreds.add(stack.copy());
for (PositionedStack stack : ai) ingreds.add(stack.copy());
ingreds = positioner.positionStacks(ingreds);
}
@Override
public void renderOverlay(GuiContainerManager gui, Slot slot)
{
public void renderOverlay(GuiContainerManager gui, Slot slot) {
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(770, 1);
GL11.glColor4d(0.6, 0.6, 0.6, 0.7);
GuiContainerManager.setColouredItemRender(true);
for(PositionedStack stack : ingreds)
{
if(stack.relx == slot.xDisplayPosition && stack.rely == slot.yDisplayPosition)
for (PositionedStack stack : ingreds) {
if (stack.relx == slot.xDisplayPosition && stack.rely == slot.yDisplayPosition)
GuiContainerManager.drawItem(stack.relx, stack.rely, stack.item);
}
GuiContainerManager.setColouredItemRender(false);
GL11.glColor4f(1, 1, 1, 1);
GL11.glDisable(GL11.GL_BLEND);
GL11.glEnable(GL11.GL_LIGHTING);
}
final IStackPositioner positioner;
ArrayList<PositionedStack> ingreds;
}
+34 -4
View File
@@ -1,16 +1,21 @@
package codechicken.nei.api;
import codechicken.lib.vec.Rectangle4i;
import codechicken.nei.NEIChestGuiHandler;
import codechicken.nei.NEICreativeGuiHandler;
import codechicken.nei.NEIDummySlotHandler;
import codechicken.nei.NEIPotionGuiHandler;
import codechicken.nei.recipe.CheatItemHandler;
import codechicken.nei.recipe.FillFluidContainerHandler;
import codechicken.nei.recipe.GuiRecipeCatalyst;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.gui.inventory.GuiContainerCreative;
import codechicken.nei.recipe.SearchInputDropHandler;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.gui.inventory.GuiContainerCreative;
public class GuiInfo {
public static final LinkedList<INEIGuiHandler> guiHandlers = new LinkedList<>();
@@ -19,12 +24,15 @@ public class GuiInfo {
public static Lock writeLock = guiHandlersLock.writeLock();
public static Lock readLock = guiHandlersLock.readLock();
public static void load() {
API.registerNEIGuiHandler(new NEICreativeGuiHandler());
API.registerNEIGuiHandler(new NEIChestGuiHandler());
API.registerNEIGuiHandler(new NEIDummySlotHandler());
API.registerNEIGuiHandler(new GuiRecipeCatalyst(null));
API.registerNEIGuiHandler(new SearchInputDropHandler());
API.registerNEIGuiHandler(new FillFluidContainerHandler());
API.registerNEIGuiHandler(new CheatItemHandler());
API.registerNEIGuiHandler(new NEIPotionGuiHandler());
customSlotGuis.add(GuiContainerCreative.class);
}
@@ -40,4 +48,26 @@ public class GuiInfo {
public static boolean hasCustomSlots(GuiContainer gui) {
return customSlotGuis.contains(gui.getClass());
}
public static boolean hideItemPanelSlot(GuiContainer gui, Rectangle4i rect) {
try {
readLock.lock();
if (guiHandlers.stream()
.anyMatch(handler -> handler.hideItemPanelSlot(gui, rect.x, rect.y, rect.w, rect.h))) {
return true;
}
} finally {
readLock.unlock();
}
for (Object item : gui.buttonList) {
GuiButton button = (GuiButton) item;
if ((new Rectangle4i(button.xPosition, button.yPosition, button.width, button.height)).intersects(rect)) {
return true;
}
}
return false;
}
}
@@ -4,10 +4,10 @@ package codechicken.nei.api;
* An nei configuration entry point should implement this class and have name "NEI<someting>Config"
* loadConfig will only be called when NEI is installed.
*/
public interface IConfigureNEI
{
public interface IConfigureNEI {
public void loadConfig();
public String getName();
public String getVersion();
}
@@ -1,8 +1,12 @@
package codechicken.nei.api;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.inventory.GuiContainer;
public interface IGuiContainerOverlay
{
public GuiContainer getFirstScreen();
public interface IGuiContainerOverlay {
GuiContainer getFirstScreen();
default GuiScreen getFirstScreenGeneral() {
return getFirstScreen();
}
}
@@ -1,15 +1,19 @@
package codechicken.nei.api;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.World;
import java.util.List;
public interface IHighlightHandler
{
public interface IHighlightHandler {
public ItemStack identifyHighlight(World world, EntityPlayer player, MovingObjectPosition mop);
public List<String> handleTextData(ItemStack itemStack, World world, EntityPlayer player, MovingObjectPosition mop, List<String> currenttip, ItemInfo.Layout layout);
public List<String> handleTextData(
ItemStack itemStack,
World world,
EntityPlayer player,
MovingObjectPosition mop,
List<String> currenttip,
ItemInfo.Layout layout);
}
@@ -3,14 +3,16 @@ package codechicken.nei.api;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
public interface IInfiniteItemHandler
{
public interface IInfiniteItemHandler {
void onPickup(ItemStack heldItem);
void onPlaceInfinite(ItemStack heldItem);
boolean canHandleItem(ItemStack stack);
boolean isItemInfinite(ItemStack stack);
public void replenishInfiniteStack(InventoryPlayer inventory, int slotNo);
public ItemStack getInfiniteItem(ItemStack typeStack);
}
@@ -1,20 +1,17 @@
package codechicken.nei.api;
import codechicken.nei.VisiblityData;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.item.ItemStack;
import java.util.Collections;
import java.util.List;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.item.ItemStack;
/**
* Lets you just override those things you want to
*/
public class INEIGuiAdapter implements INEIGuiHandler
{
public class INEIGuiAdapter implements INEIGuiHandler {
@Override
public VisiblityData modifyVisiblity(GuiContainer gui, VisiblityData currentVisibility)
{
public VisiblityData modifyVisiblity(GuiContainer gui, VisiblityData currentVisibility) {
return currentVisibility;
}
@@ -24,20 +21,17 @@ public class INEIGuiAdapter implements INEIGuiHandler
}
@Override
public List<TaggedInventoryArea> getInventoryAreas(GuiContainer gui)
{
public List<TaggedInventoryArea> getInventoryAreas(GuiContainer gui) {
return null;
}
@Override
public boolean handleDragNDrop(GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button)
{
public boolean handleDragNDrop(GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button) {
return false;
}
@Override
public boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h)
{
return false;
public boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h) {
return false;
}
}
@@ -1,31 +1,29 @@
package codechicken.nei.api;
import codechicken.nei.VisiblityData;
import java.util.List;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.item.ItemStack;
import java.util.List;
/**
* If this is implemented on a gui, it will be automatically registered
*/
public interface INEIGuiHandler
{
public interface INEIGuiHandler {
public VisiblityData modifyVisiblity(GuiContainer gui, VisiblityData currentVisibility);
/**
* NEI will give the specified item to the InventoryRange returned if the player's inventory is full.
* Should not return null, just an empty list
*/
public Iterable<Integer> getItemSpawnSlots(GuiContainer gui, ItemStack item);
/**
* @return A list of TaggedInventoryAreas that will be used with the savestates.
*/
public List<TaggedInventoryArea> getInventoryAreas(GuiContainer gui);
/**
* Handles clicks while an itemstack has been dragged from the item panel. Use this to set configurable slots and the like.
* Handles clicks while an itemstack has been dragged from the item panel. Use this to set configurable slots and the like.
* Changes made to the stackSize of the dragged stack will be kept
* @param gui The current gui instance
* @param mousex The x position of the mouse
@@ -35,7 +33,7 @@ public interface INEIGuiHandler
* @return True if the drag n drop was handled. False to resume processing through other routes. The held stack will be deleted if draggedStack.stackSize == 0
*/
public boolean handleDragNDrop(GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button);
/**
* Used to prevent the item panel from drawing on top of other gui elements.
* This function will also be called with a 1x1 size rectangle on the mouse position for determining if the given coordinate should override item panel functions such as scrolling
@@ -1,6 +1,5 @@
package codechicken.nei.api;
public interface INEIModeHandler
{
public interface INEIModeHandler {
public boolean isModeValid(int mode);
}
@@ -3,7 +3,6 @@ package codechicken.nei.api;
import codechicken.nei.recipe.IRecipeHandler;
import net.minecraft.client.gui.inventory.GuiContainer;
public interface IOverlayHandler
{
public interface IOverlayHandler {
public void overlayRecipe(GuiContainer firstGui, IRecipeHandler recipe, int recipeIndex, boolean shift);
}
@@ -3,7 +3,6 @@ package codechicken.nei.api;
import codechicken.nei.guihook.GuiContainerManager;
import net.minecraft.inventory.Slot;
public interface IRecipeOverlayRenderer
{
public interface IRecipeOverlayRenderer {
public void renderOverlay(GuiContainerManager gui, Slot slot);
}
@@ -1,14 +1,12 @@
package codechicken.nei.api;
import codechicken.nei.PositionedStack;
import java.util.ArrayList;
/**
* For repositioning recipes in overlay renderers.
*
*
*/
public interface IStackPositioner
{
public interface IStackPositioner {
public ArrayList<PositionedStack> positionStacks(ArrayList<PositionedStack> ai);
}
@@ -1,16 +1,14 @@
package codechicken.nei.api;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fluids.FluidStack;
import net.minecraft.item.ItemStack;
public interface IStackStringifyHandler
{
public interface IStackStringifyHandler {
public NBTTagCompound convertItemStackToNBT(ItemStack stack, boolean saveStackSize);
public ItemStack convertNBTToItemStack(NBTTagCompound nbtTag);
public FluidStack getFluid(ItemStack stack);
}
}
@@ -2,15 +2,13 @@ package codechicken.nei.api;
import net.minecraft.item.ItemStack;
public interface ItemFilter
{
public interface ItemFilter {
/**
* Provides an item filter. May be called from any thread. Returned filter should only reference objects with immutable state.
*/
public static interface ItemFilterProvider
{
public static interface ItemFilterProvider {
public ItemFilter getFilter();
}
public boolean matches(ItemStack item);
}
}
+155 -126
View File
@@ -21,6 +21,13 @@ import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.ModContainer;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.GameRegistry.UniqueIdentifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import net.minecraft.block.Block;
import net.minecraft.client.resources.I18n;
import net.minecraft.creativetab.CreativeTabs;
@@ -52,21 +59,14 @@ import net.minecraftforge.common.BiomeDictionary;
import net.minecraftforge.common.IShearable;
import net.minecraftforge.oredict.OreDictionary;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
/**
* This is an internal class for storing information about items, to be accessed by the API
*/
public class ItemInfo
{
public static enum Layout
{
HEADER, BODY, FOOTER
public class ItemInfo {
public static enum Layout {
HEADER,
BODY,
FOOTER
}
public static final ArrayListMultimap<Layout, IHighlightHandler> highlightHandlers = ArrayListMultimap.create();
@@ -82,8 +82,35 @@ public class ItemInfo
public static final HashMap<Item, String> itemOwners = new HashMap<>();
//lookup optimisation
public static final HashMap<ItemStack, String> itemSearchNames = new HashMap<>();
private static class ItemStackKey {
public final ItemStack stack;
public ItemStackKey(ItemStack stack) {
this.stack = stack;
}
@Override
public int hashCode() {
if (this.stack == null) return 1;
int hashCode = 1;
hashCode = 31 * hashCode + stack.stackSize;
hashCode = 31 * hashCode + Item.getIdFromItem(stack.getItem());
hashCode = 31 * hashCode + stack.getItemDamage();
hashCode = 31 * hashCode
+ (!stack.hasTagCompound() ? 0 : stack.getTagCompound().hashCode());
return hashCode;
}
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof ItemStackKey)) return false;
return ItemStack.areItemStacksEqual(this.stack, ((ItemStackKey) o).stack);
}
}
// lookup optimisation
public static final ConcurrentHashMap<ItemStackKey, String> itemSearchNames = new ConcurrentHashMap<>();
public static boolean isHidden(ItemStack stack) {
return hiddenItems.contains(stack);
@@ -129,7 +156,18 @@ public class ItemInfo
}
private static void addSearchOptimisation() {
ItemList.loadCallbacks.add(itemSearchNames::clear);
ItemList.loadCallbacks.add(ItemInfo::populateSearchMap);
}
private static void populateSearchMap() {
/* Create a snapshot of the current keys in the cache */
HashSet<ItemStackKey> oldItems = new HashSet<>(itemSearchNames.keySet());
for (ItemStack stack : ItemList.items) {
/* Populate each entry and remove it from the snapshot */
getSearchName(stack);
oldItems.remove(new ItemStackKey(stack));
}
itemSearchNames.keySet().removeAll(oldItems);
}
private static void addHiddenItemFilter() {
@@ -137,21 +175,22 @@ public class ItemInfo
}
private static void addIDDumps() {
API.addOption(new RegistryDumper<Item>("tools.dump.item")
{
API.addOption(new RegistryDumper<Item>("tools.dump.item") {
@Override
public String[] header() {
return new String[]{"Name", "ID", "Has Block", "Mod", "Class"};
return new String[] {"Name", "ID", "Has Block", "Mod", "Class", "Display Name"};
}
@Override
public String[] dump(Item item, int id, String name) {
return new String[]{
name,
Integer.toString(id),
Boolean.toString(Block.getBlockFromItem(item) != Blocks.air),
ItemInfo.itemOwners.get(item),
item.getClass().getCanonicalName()
return new String[] {
name,
Integer.toString(id),
Boolean.toString(Block.getBlockFromItem(item) != Blocks.air),
ItemInfo.itemOwners.get(item),
item.getClass().getCanonicalName(),
EnumChatFormatting.getTextWithoutFormattingCodes(
GuiContainerManager.itemDisplayNameShort(new ItemStack(item)))
};
}
@@ -160,21 +199,25 @@ public class ItemInfo
return Item.itemRegistry;
}
});
API.addOption(new RegistryDumper<Block>("tools.dump.block")
{
API.addOption(new RegistryDumper<Block>("tools.dump.block") {
@Override
public String[] header() {
return new String[]{"Name", "ID", "Has Item", "Mod", "Class"};
return new String[] {"Name", "ID", "Has Item", "Mod", "Class", "Display Name"};
}
@Override
public String[] dump(Block item, int id, String name) {
return new String[]{
name,
Integer.toString(id),
Boolean.toString(Item.getItemFromBlock(item) != null),
ItemInfo.itemOwners.get(item),
item.getClass().getCanonicalName()
public String[] dump(Block block, int id, String name) {
final Item item = Item.getItemFromBlock(block);
return new String[] {
name,
Integer.toString(id),
Boolean.toString(item != null),
ItemInfo.itemOwners.get(block),
block.getClass().getCanonicalName(),
item != null
? EnumChatFormatting.getTextWithoutFormattingCodes(
GuiContainerManager.itemDisplayNameShort(new ItemStack(item)))
: "null"
};
}
@@ -183,18 +226,15 @@ public class ItemInfo
return Block.blockRegistry;
}
});
API.addOption(new ArrayDumper<Potion>("tools.dump.potion")
{
API.addOption(new ArrayDumper<Potion>("tools.dump.potion") {
public String[] header() {
return new String[]{"ID", "Unlocalised name", "Class"};
return new String[] {"ID", "Unlocalised name", "Class"};
}
@Override
public String[] dump(Potion potion, int id) {
return new String[]{
Integer.toString(id),
potion.getName(),
potion.getClass().getCanonicalName()
return new String[] {
Integer.toString(id), potion.getName(), potion.getClass().getCanonicalName()
};
}
@@ -203,21 +243,20 @@ public class ItemInfo
return Potion.potionTypes;
}
});
API.addOption(new ArrayDumper<Enchantment>("tools.dump.enchantment")
{
API.addOption(new ArrayDumper<Enchantment>("tools.dump.enchantment") {
public String[] header() {
return new String[]{"ID", "Unlocalised name", "Type", "Min Level", "Max Level", "Class"};
return new String[] {"ID", "Unlocalised name", "Type", "Min Level", "Max Level", "Class"};
}
@Override
public String[] dump(Enchantment ench, int id) {
return new String[]{
Integer.toString(id),
ench.getName(),
ench.type.toString(),
Integer.toString(ench.getMinLevel()),
Integer.toString(ench.getMaxLevel()),
ench.getClass().getCanonicalName()
return new String[] {
Integer.toString(id),
ench.getName(),
ench.type.toString(),
Integer.toString(ench.getMinLevel()),
Integer.toString(ench.getMaxLevel()),
ench.getClass().getCanonicalName()
};
}
@@ -226,11 +265,20 @@ public class ItemInfo
return Enchantment.enchantmentsList;
}
});
API.addOption(new ArrayDumper<BiomeGenBase>("tools.dump.biome")
{
API.addOption(new ArrayDumper<BiomeGenBase>("tools.dump.biome") {
@Override
public String[] header() {
return new String[]{"ID", "Name", "Temperature", "Rainfall", "Spawn Chance", "Root Height", "Height Variation", "Types", "Class"};
return new String[] {
"ID",
"Name",
"Temperature",
"Rainfall",
"Spawn Chance",
"Root Height",
"Height Variation",
"Types",
"Class"
};
}
@Override
@@ -238,21 +286,20 @@ public class ItemInfo
BiomeDictionary.Type[] types = BiomeDictionary.getTypesForBiome(biome);
StringBuilder s_types = new StringBuilder();
for (BiomeDictionary.Type t : types) {
if (s_types.length() > 0)
s_types.append(", ");
if (s_types.length() > 0) s_types.append(", ");
s_types.append(t.name());
}
return new String[]{
Integer.toString(id),
biome.biomeName,
Float.toString(biome.getFloatTemperature(0, 0, 0)),
Float.toString(biome.getFloatRainfall()),
Float.toString(biome.getSpawningChance()),
Float.toString(biome.rootHeight),
Float.toString(biome.heightVariation),
s_types.toString(),
biome.getClass().getCanonicalName()
return new String[] {
Integer.toString(id),
biome.biomeName,
Float.toString(biome.getFloatTemperature(0, 0, 0)),
Float.toString(biome.getFloatRainfall()),
Float.toString(biome.getSpawningChance()),
Float.toString(biome.rootHeight),
Float.toString(biome.heightVariation),
s_types.toString(),
biome.getClass().getCanonicalName()
};
}
@@ -272,28 +319,26 @@ public class ItemInfo
UniqueIdentifier ident = null;
try {
ident = GameRegistry.findUniqueIdentifierFor(item);
} catch (Exception ignored) {}
} catch (Exception ignored) {
}
if(ident == null) {
NEIClientConfig.logger.error("Failed to find identifier for: "+item);
if (ident == null) {
NEIClientConfig.logger.error("Failed to find identifier for: " + item);
continue;
}
String modId = ident.modId;
itemOwners.put(item, modId);
ItemStackSet itemset = modSubsets.get(modId);
if(itemset == null)
modSubsets.put(modId, itemset = new ItemStackSet());
if (itemset == null) modSubsets.put(modId, itemset = new ItemStackSet());
itemset.with(item);
}
API.addSubset("Mod.Minecraft", modSubsets.remove("minecraft"));
for(Entry<String, ItemStackSet> entry : modSubsets.entrySet()) {
for (Entry<String, ItemStackSet> entry : modSubsets.entrySet()) {
ModContainer mc = FMLCommonHandler.instance().findContainerFor(entry.getKey());
if(mc == null)
NEIClientConfig.logger.error("Missing container for "+entry.getKey());
else
API.addSubset("Mod."+mc.getName(), entry.getValue());
if (mc == null) NEIClientConfig.logger.error("Missing container for " + entry.getKey());
else API.addSubset("Mod." + mc.getName(), entry.getValue());
}
}
@@ -352,40 +397,32 @@ public class ItemInfo
List<ItemStack> stackList = new LinkedList<>();
for (Item item : (Iterable<Item>) Item.itemRegistry) {
if (item == null)
continue;
if (item == null) continue;
for(CreativeTabs itemTab : item.getCreativeTabs()) {
for (CreativeTabs itemTab : item.getCreativeTabs()) {
if (itemTab != null) {
while (itemTab.getTabIndex() >= creativeTabRanges.size())
creativeTabRanges.add(null);
while (itemTab.getTabIndex() >= creativeTabRanges.size()) creativeTabRanges.add(null);
ItemStackSet set = creativeTabRanges.get(itemTab.getTabIndex());
if (set == null)
creativeTabRanges.set(itemTab.getTabIndex(), set = new ItemStackSet());
if (set == null) creativeTabRanges.set(itemTab.getTabIndex(), set = new ItemStackSet());
try {
stackList.clear();
item.getSubItems(item, itemTab, stackList);
for(ItemStack stack : stackList)
set.add(stack);
for (ItemStack stack : stackList) set.add(stack);
} catch (Exception e) {
NEIClientConfig.logger.error("Error loading sub-items for: "+item+". Tab: "+itemTab.getTabLabel(), e);
NEIClientConfig.logger.error(
"Error loading sub-items for: " + item + ". Tab: " + itemTab.getTabLabel(), e);
}
}
}
if (item.isDamageable()) {
tools.with(item);
if (item instanceof ItemPickaxe)
picks.with(item);
else if (item instanceof ItemSpade)
shovels.with(item);
else if (item instanceof ItemAxe)
axes.with(item);
else if (item instanceof ItemHoe)
hoes.with(item);
else if (item instanceof ItemSword)
swords.with(item);
if (item instanceof ItemPickaxe) picks.with(item);
else if (item instanceof ItemSpade) shovels.with(item);
else if (item instanceof ItemAxe) axes.with(item);
else if (item instanceof ItemHoe) hoes.with(item);
else if (item instanceof ItemSword) swords.with(item);
else if (item instanceof ItemArmor)
switch (((ItemArmor) item).armorType) {
case 0:
@@ -401,19 +438,17 @@ public class ItemInfo
boots.with(item);
break;
}
else if (item == Items.arrow || item == Items.bow)
ranged.with(item);
else if (item == Items.arrow || item == Items.bow) ranged.with(item);
else if (item == Items.fishing_rod || item == Items.flint_and_steel || item == Items.shears)
other.with(item);
}
if (item instanceof ItemFood)
food.with(item);
if (item instanceof ItemFood) food.with(item);
try {
LinkedList<ItemStack> subItems = new LinkedList<>();
item.getSubItems(item, null, subItems);
for(ItemStack stack : subItems) {
for (ItemStack stack : subItems) {
if (item.isPotionIngredient(stack) && item.getPotionEffect(stack) != null) {
BrewingRecipeHandler.ingredients.add(stack);
potioningredients.add(stack);
@@ -421,7 +456,7 @@ public class ItemInfo
}
} catch (Exception e) {
NEIClientConfig.logger.error("Error loading brewing ingredients for: "+item, e);
NEIClientConfig.logger.error("Error loading brewing ingredients for: " + item, e);
}
}
API.addSubset("Items.Tools.Pickaxes", picks);
@@ -439,7 +474,7 @@ public class ItemInfo
API.addSubset("Items.Potions.Ingredients", potioningredients);
for (CreativeTabs tab : CreativeTabs.creativeTabArray) {
if(tab.getTabIndex() >= creativeTabRanges.size()) continue;
if (tab.getTabIndex() >= creativeTabRanges.size()) continue;
ItemStackSet set = creativeTabRanges.get(tab.getTabIndex());
if (set != null && !set.isEmpty())
API.addSubset("CreativeTabs." + I18n.format(tab.getTranslatedTabLabel()), set);
@@ -448,15 +483,14 @@ public class ItemInfo
BrewingRecipeHandler.searchPotions();
}
private static void addSpawnEggs()
{
private static void addSpawnEggs() {
addEntityEgg(EntitySnowman.class, 0xEEFFFF, 0xffa221);
addEntityEgg(EntityIronGolem.class, 0xC5C2C1, 0xffe1cc);
}
@SuppressWarnings("unchecked")
private static void addEntityEgg(Class<?> entity, int i, int j) {
int id = (Integer)EntityList.classToIDMapping.get(entity);
int id = (Integer) EntityList.classToIDMapping.get(entity);
EntityList.entityEggs.put(id, new EntityEggInfo(id, i, j));
}
@@ -469,34 +503,29 @@ public class ItemInfo
ArrayList<ItemStack> items = new ArrayList<>();
ArrayList<IHighlightHandler> handlers = new ArrayList<>();
if (highlightIdentifiers.containsKey(null))
handlers.addAll(highlightIdentifiers.get(null));
if (highlightIdentifiers.containsKey(mouseoverBlock))
handlers.addAll(highlightIdentifiers.get(mouseoverBlock));
if (highlightIdentifiers.containsKey(null)) handlers.addAll(highlightIdentifiers.get(null));
if (highlightIdentifiers.containsKey(mouseoverBlock)) handlers.addAll(highlightIdentifiers.get(mouseoverBlock));
for (IHighlightHandler ident : handlers) {
ItemStack item = ident.identifyHighlight(world, player, hit);
if (item != null)
items.add(item);
if (item != null) items.add(item);
}
if (items.size() > 0)
return items;
if (items.size() > 0) return items;
ItemStack pick = mouseoverBlock.getPickBlock(hit, world, x, y, z, player);
if (pick != null)
items.add(pick);
if (pick != null) items.add(pick);
try {
items.addAll(mouseoverBlock.getDrops(world, x, y, z, world.getBlockMetadata(x, y, z), 0));
} catch (Exception ignored) {}
} catch (Exception ignored) {
}
if (mouseoverBlock instanceof IShearable) {
IShearable shearable = (IShearable) mouseoverBlock;
if (shearable.isShearable(new ItemStack(Items.shears), world, x, y, z))
items.addAll(shearable.onSheared(new ItemStack(Items.shears), world, x, y, z, 0));
}
if (items.size() == 0)
items.add(0, new ItemStack(mouseoverBlock, 1, world.getBlockMetadata(x, y, z)));
if (items.size() == 0) items.add(0, new ItemStack(mouseoverBlock, 1, world.getBlockMetadata(x, y, z)));
return items;
}
@@ -506,7 +535,8 @@ public class ItemInfo
ItemInfo.highlightHandlers.get(layout).add(handler);
}
public static List<String> getText(ItemStack itemStack, World world, EntityPlayer player, MovingObjectPosition mop) {
public static List<String> getText(
ItemStack itemStack, World world, EntityPlayer player, MovingObjectPosition mop) {
List<String> retString = new ArrayList<>();
for (ItemInfo.Layout layout : ItemInfo.Layout.values())
@@ -517,11 +547,10 @@ public class ItemInfo
}
public static String getSearchName(ItemStack stack) {
String s = itemSearchNames.get(stack);
if(s == null) {
s = EnumChatFormatting.getTextWithoutFormattingCodes(GuiContainerManager.concatenatedDisplayName(stack, true).toLowerCase());
itemSearchNames.put(stack, s);
}
return s;
return itemSearchNames.computeIfAbsent(
new ItemStackKey(stack),
key -> EnumChatFormatting.getTextWithoutFormattingCodes(
GuiContainerManager.concatenatedDisplayName(key.stack, true)
.toLowerCase()));
}
}
@@ -5,16 +5,18 @@ import codechicken.nei.VisiblityData;
import codechicken.nei.guihook.GuiContainerManager;
import net.minecraft.client.gui.inventory.GuiContainer;
public abstract class LayoutStyle
{
public abstract class LayoutStyle {
public abstract void init();
public abstract void reset();
public abstract void layout(GuiContainer gui, VisiblityData visibility);
public abstract String getName();
public void drawBackground(GuiContainerManager gui)
{
}
public void drawBackground(GuiContainerManager gui) {}
public abstract void drawButton(Button button, int mousex, int mousey);
public abstract void drawSubsetTag(String text, int x, int y, int w, int h, int state, boolean mouseover);
}
@@ -2,28 +2,24 @@ package codechicken.nei.api;
import codechicken.nei.NEIClientConfig;
import codechicken.nei.config.OptionCycled;
import java.util.LinkedList;
import net.minecraft.world.World;
import java.util.LinkedList;
public class NEIInfo
{
public class NEIInfo {
public static final LinkedList<INEIModeHandler> modeHandlers = new LinkedList<>();
public static void load(World world) {
OptionCycled modeOption = (OptionCycled) NEIClientConfig.getOptionList().getOption("inventory.cheatmode");
modeOption.parent.synthesizeEnvironment(false);
if(!modeOption.optionValid(modeOption.value())) {
if (!modeOption.optionValid(modeOption.value())) {
modeOption.copyGlobals();
modeOption.cycle();
}
}
public static boolean isValidMode(int mode) {
for(INEIModeHandler handler : modeHandlers)
if(!handler.isModeValid(mode))
return false;
for (INEIModeHandler handler : modeHandlers) if (!handler.isModeValid(mode)) return false;
return true;
}
}
@@ -1,14 +1,12 @@
package codechicken.nei.api;
import java.util.HashSet;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import java.util.HashSet;
public class TaggedInventoryArea
{
public class TaggedInventoryArea {
public final HashSet<Integer> slots = new HashSet<>();
public final String tagName;
/**
@@ -19,30 +17,24 @@ public class TaggedInventoryArea
* Other inventories
*/
private final Container container;
public TaggedInventoryArea(InventoryPlayer invPlayer)
{
public TaggedInventoryArea(InventoryPlayer invPlayer) {
this("InventoryPlayer", 0, 39, null);
inventory = invPlayer;
}
public TaggedInventoryArea(String name, int first, int last, Container container)
{
public TaggedInventoryArea(String name, int first, int last, Container container) {
this.container = container;
tagName = name;
for(int i = first; i <= last; i++)
slots.add(i);
for (int i = first; i <= last; i++) slots.add(i);
}
public ItemStack getStackInSlot(int i)
{
if(inventory != null)
return inventory.getStackInSlot(i);
public ItemStack getStackInSlot(int i) {
if (inventory != null) return inventory.getStackInSlot(i);
return container.getSlot(i).getStack();
}
public boolean isContainer()
{
public boolean isContainer() {
return inventory == null;
}
}
@@ -1,12 +1,12 @@
package codechicken.nei.asm;
import static org.objectweb.asm.Opcodes.POP;
import static org.objectweb.asm.Opcodes.PUTSTATIC;
import codechicken.lib.asm.ASMHelper;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
import static org.objectweb.asm.Opcodes.POP;
import static org.objectweb.asm.Opcodes.PUTSTATIC;
public class GuiContainerManagerAPITransformer extends ClassVisitor {
private final String tname;
private boolean changed = false;
@@ -21,8 +21,12 @@ public class GuiContainerManagerAPITransformer extends ClassVisitor {
return new MethodVisitor(api, super.visitMethod(access, mname, mdesc, signature, exceptions)) {
@Override
public void visitFieldInsn(int opcode, String owner, String name, String desc) {
if (opcode == PUTSTATIC && "codechicken/nei/guihook/GuiContainerManager".equals(owner) && name.endsWith("Handlers") && desc.equals("Ljava/util/LinkedList;")) {
ASMHelper.logger.warn("Found suspicious PUTSTATIC {} in {}#{}{}, replacing with POP!", name, tname, mname, mdesc);
if (opcode == PUTSTATIC
&& "codechicken/nei/guihook/GuiContainerManager".equals(owner)
&& name.endsWith("Handlers")
&& desc.equals("Ljava/util/LinkedList;")) {
ASMHelper.logger.warn(
"Found suspicious PUTSTATIC {} in {}#{}{}, replacing with POP!", name, tname, mname, mdesc);
changed = true;
super.visitInsn(POP);
} else {
@@ -6,14 +6,12 @@ import cpw.mods.fml.relauncher.IFMLCallHook;
import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
import cpw.mods.fml.relauncher.IFMLLoadingPlugin.MCVersion;
import cpw.mods.fml.relauncher.IFMLLoadingPlugin.TransformerExclusions;
import java.io.File;
import java.util.Map;
@TransformerExclusions(value = {"codechicken.nei.asm"})
@MCVersion( "1.7.10" )
public class NEICorePlugin implements IFMLLoadingPlugin, IFMLCallHook
{
@MCVersion("1.7.10")
public class NEICorePlugin implements IFMLLoadingPlugin, IFMLCallHook {
public static File location;
public NEICorePlugin() {
@@ -23,7 +21,7 @@ public class NEICorePlugin implements IFMLLoadingPlugin, IFMLCallHook
@Override
public String[] getASMTransformerClass() {
CodeChickenCorePlugin.versionCheck(CodeChickenCorePlugin.mcVersion, "NotEnoughItems");
return new String[]{"codechicken.nei.asm.NEITransformer"};
return new String[] {"codechicken.nei.asm.NEITransformer"};
}
@Override
@@ -40,7 +38,11 @@ public class NEICorePlugin implements IFMLLoadingPlugin, IFMLCallHook
public void injectData(Map<String, Object> data) {
location = (File) data.get("coremodLocation");
if (location == null)
location = new File(getClass().getProtectionDomain().getCodeSource().getLocation().getPath());
location = new File(getClass()
.getProtectionDomain()
.getCodeSource()
.getLocation()
.getPath());
}
@Override
@@ -1,5 +1,13 @@
package codechicken.nei.asm;
import static codechicken.lib.asm.InsnComparator.findN;
import static codechicken.lib.asm.InsnComparator.findOnce;
import static codechicken.lib.asm.InsnComparator.getControlFlowLabels;
import static codechicken.lib.asm.InsnComparator.matches;
import static org.objectweb.asm.ClassWriter.COMPUTE_FRAMES;
import static org.objectweb.asm.ClassWriter.COMPUTE_MAXS;
import static org.objectweb.asm.Opcodes.*;
import codechicken.lib.asm.ASMBlock;
import codechicken.lib.asm.ASMHelper;
import codechicken.lib.asm.ASMInit;
@@ -14,6 +22,7 @@ import codechicken.lib.asm.ModularASMTransformer.MethodTransformer;
import codechicken.lib.asm.ModularASMTransformer.MethodWriter;
import codechicken.lib.asm.ObfMapping;
import cpw.mods.fml.relauncher.FMLLaunchHandler;
import java.util.Map;
import net.minecraft.launchwrapper.IClassTransformer;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
@@ -25,18 +34,7 @@ import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.VarInsnNode;
import java.util.Map;
import static codechicken.lib.asm.InsnComparator.findN;
import static codechicken.lib.asm.InsnComparator.findOnce;
import static codechicken.lib.asm.InsnComparator.getControlFlowLabels;
import static codechicken.lib.asm.InsnComparator.matches;
import static org.objectweb.asm.ClassWriter.COMPUTE_FRAMES;
import static org.objectweb.asm.ClassWriter.COMPUTE_MAXS;
import static org.objectweb.asm.Opcodes.*;
public class NEITransformer implements IClassTransformer
{
public class NEITransformer implements IClassTransformer {
static {
ASMInit.init();
}
@@ -46,113 +44,197 @@ public class NEITransformer implements IClassTransformer
private final Map<String, ASMBlock> asmblocks = ASMReader.loadResource("/assets/nei/asm/blocks.asm");
public NEITransformer() {
if(FMLLaunchHandler.side().isClient()) {
//Generates method to set the placed position of a mob spawner for the item callback. More portable than copying vanilla placement code
transformer.add(new MethodWriter(ACC_PUBLIC,
new ObfMapping("net/minecraft/block/BlockMobSpawner", "func_149689_a", "(Lnet/minecraft/world/World;IIILnet/minecraft/entity/EntityLivingBase;Lnet/minecraft/item/ItemStack;)V"),
if (FMLLaunchHandler.side().isClient()) {
// Generates method to set the placed position of a mob spawner for the item callback. More portable than
// copying vanilla placement code
transformer.add(new MethodWriter(
ACC_PUBLIC,
new ObfMapping(
"net/minecraft/block/BlockMobSpawner",
"func_149689_a",
"(Lnet/minecraft/world/World;IIILnet/minecraft/entity/EntityLivingBase;Lnet/minecraft/item/ItemStack;)V"),
asmblocks.get("spawnerPlaced")));
//Make MobSpawnerBaseLogic use getSpawnerWorld when creating new entities
transformer.add(new MethodReplacer(new ObfMapping("net/minecraft/tileentity/MobSpawnerBaseLogic", "func_98281_h", "()Lnet/minecraft/entity/Entity;"),
asmblocks.get("d_spawnerWorld"), asmblocks.get("spawnerWorld")));
// Make MobSpawnerBaseLogic use getSpawnerWorld when creating new entities
transformer.add(new MethodReplacer(
new ObfMapping(
"net/minecraft/tileentity/MobSpawnerBaseLogic",
"func_98281_h",
"()Lnet/minecraft/entity/Entity;"),
asmblocks.get("d_spawnerWorld"),
asmblocks.get("spawnerWorld")));
}
//Removes trailing seperators from NBTTagList/Compound.toString because OCD
transformer.add(new MethodInjector(new ObfMapping("net/minecraft/nbt/NBTTagCompound", "toString", "()Ljava/lang/String;"),
asmblocks.get("n_commaFix"), asmblocks.get("commaFix"), true));
transformer.add(new MethodInjector(new ObfMapping("net/minecraft/nbt/NBTTagList", "toString", "()Ljava/lang/String;"),
asmblocks.get("n_commaFix"), asmblocks.get("commaFix"), true));
// Removes trailing seperators from NBTTagList/Compound.toString because OCD
transformer.add(new MethodInjector(
new ObfMapping("net/minecraft/nbt/NBTTagCompound", "toString", "()Ljava/lang/String;"),
asmblocks.get("n_commaFix"),
asmblocks.get("commaFix"),
true));
transformer.add(new MethodInjector(
new ObfMapping("net/minecraft/nbt/NBTTagList", "toString", "()Ljava/lang/String;"),
asmblocks.get("n_commaFix"),
asmblocks.get("commaFix"),
true));
//fix workbench container losing items on shift click output without room for the full stack
transformer.add(new MethodTransformer(new ObfMapping("net/minecraft/inventory/ContainerWorkbench", "func_82846_b", "(Lnet/minecraft/entity/player/EntityPlayer;I)Lnet/minecraft/item/ItemStack;"))
{
@Override
public void transform(MethodNode mv) {
ASMHelper.logger.debug("NEI: Applying workbench fix");
InsnListSection key = findN(mv.instructions, asmblocks.get("n_workbenchFix").list).get(0);
key.insertBefore(asmblocks.get("workbenchFix").rawListCopy());
}
});
//put glint alpha into the buffer correctly for exporting
transformer.add(new MethodReplacer(new ObfMapping("net/minecraft/client/renderer/entity/RenderItem", "func_77018_a", "(IIIII)V"),
asmblocks.get("d_glintAlphaFix"), asmblocks.get("glintAlphaFix")));
// fix workbench container losing items on shift click output without room for the full stack
transformer.add(
new MethodTransformer(new ObfMapping(
"net/minecraft/inventory/ContainerWorkbench",
"func_82846_b",
"(Lnet/minecraft/entity/player/EntityPlayer;I)Lnet/minecraft/item/ItemStack;")) {
@Override
public void transform(MethodNode mv) {
ASMHelper.logger.debug("NEI: Applying workbench fix");
InsnListSection key = findN(mv.instructions, asmblocks.get("n_workbenchFix").list)
.get(0);
key.insertBefore(asmblocks.get("workbenchFix").rawListCopy());
}
});
// put glint alpha into the buffer correctly for exporting
transformer.add(new MethodReplacer(
new ObfMapping("net/minecraft/client/renderer/entity/RenderItem", "func_77018_a", "(IIIII)V"),
asmblocks.get("d_glintAlphaFix"),
asmblocks.get("glintAlphaFix")));
String GuiContainer = "net/minecraft/client/gui/inventory/GuiContainer";
//add manager field
transformer.add(new FieldWriter(ACC_PUBLIC, new ObfMapping(GuiContainer, "manager", "Lcodechicken/nei/guihook/GuiContainerManager;")));
// add manager field
transformer.add(new FieldWriter(
ACC_PUBLIC, new ObfMapping(GuiContainer, "manager", "Lcodechicken/nei/guihook/GuiContainerManager;")));
//Fill out getManager in GuiContainerManager
transformer.add(new MethodWriter(ACC_PUBLIC | ACC_STATIC,
new ObfMapping("codechicken/nei/guihook/GuiContainerManager", "getManager", "(Lnet/minecraft/client/gui/inventory/GuiContainer;)Lcodechicken/nei/guihook/GuiContainerManager;"),
// Fill out getManager in GuiContainerManager
transformer.add(new MethodWriter(
ACC_PUBLIC | ACC_STATIC,
new ObfMapping(
"codechicken/nei/guihook/GuiContainerManager",
"getManager",
"(Lnet/minecraft/client/gui/inventory/GuiContainer;)Lcodechicken/nei/guihook/GuiContainerManager;"),
asmblocks.get("m_getManager")));
// Generate load method
transformer.add(new MethodWriter(
ACC_PUBLIC,
new ObfMapping(GuiContainer, "func_146280_a", "(Lnet/minecraft/client/Minecraft;II)V"),
asmblocks.get("m_setWorldAndResolution")));
//Generate load method
transformer.add(new MethodWriter(ACC_PUBLIC, new ObfMapping(GuiContainer, "func_146280_a", "(Lnet/minecraft/client/Minecraft;II)V"), asmblocks.get("m_setWorldAndResolution")));
// Generate handleKeyboardInput method
transformer.add(new MethodWriter(
ACC_PUBLIC,
new ObfMapping(GuiContainer, "func_146282_l", "()V"),
asmblocks.get("m_handleKeyboardInput")));
//Generate handleKeyboardInput method
transformer.add(new MethodWriter(ACC_PUBLIC, new ObfMapping(GuiContainer, "func_146282_l", "()V"), asmblocks.get("m_handleKeyboardInput")));
// Generate handleKeyboardInput method
transformer.add(new MethodWriter(
ACC_PUBLIC,
new ObfMapping(GuiContainer, "func_146282_l", "()V"),
asmblocks.get("m_handleKeyboardInput")));
//Generate handleKeyboardInput method
transformer.add(new MethodWriter(ACC_PUBLIC, new ObfMapping(GuiContainer, "func_146282_l", "()V"), asmblocks.get("m_handleKeyboardInput")));
// Generate handleKeyboardInput method
transformer.add(new MethodWriter(
ACC_PUBLIC,
new ObfMapping(GuiContainer, "func_146282_l", "()V"),
asmblocks.get("m_handleKeyboardInput")));
//Generate handleKeyboardInput method
transformer.add(new MethodWriter(ACC_PUBLIC, new ObfMapping(GuiContainer, "func_146282_l", "()V"), asmblocks.get("m_handleKeyboardInput")));
//Generate handleMouseInput method
transformer.add(new MethodWriter(ACC_PUBLIC, new ObfMapping(GuiContainer, "func_146274_d", "()V"), asmblocks.get("m_handleMouseInput")));
// Generate handleMouseInput method
transformer.add(new MethodWriter(
ACC_PUBLIC, new ObfMapping(GuiContainer, "func_146274_d", "()V"), asmblocks.get("m_handleMouseInput")));
addProtectedForwarder(
new ObfMapping(GuiContainer, "func_73869_a", "(CI)V"),
new ObfMapping("codechicken/nei/guihook/GuiContainerManager", "callKeyTyped", "(Lnet/minecraft/client/gui/inventory/GuiContainer;CI)V"));
new ObfMapping(
"codechicken/nei/guihook/GuiContainerManager",
"callKeyTyped",
"(Lnet/minecraft/client/gui/inventory/GuiContainer;CI)V"));
addProtectedForwarder(
new ObfMapping(GuiContainer, "func_146984_a", "(Lnet/minecraft/inventory/Slot;III)V"),
new ObfMapping("codechicken/nei/guihook/DefaultSlotClickHandler", "callHandleMouseClick", "(Lnet/minecraft/client/gui/inventory/GuiContainer;Lnet/minecraft/inventory/Slot;III)V"));
new ObfMapping(
"codechicken/nei/guihook/DefaultSlotClickHandler",
"callHandleMouseClick",
"(Lnet/minecraft/client/gui/inventory/GuiContainer;Lnet/minecraft/inventory/Slot;III)V"));
//Inject preDraw at the start of drawScreen
transformer.add(new MethodInjector(new ObfMapping(GuiContainer, "func_73863_a", "(IIF)V"), asmblocks.get("preDraw"), true));
// Inject preDraw at the start of drawScreen
transformer.add(new MethodInjector(
new ObfMapping(GuiContainer, "func_73863_a", "(IIF)V"), asmblocks.get("preDraw"), true));
//Inject objectUnderMouse check before drawing slot highlights
transformer.add(new MethodInjector(new ObfMapping(GuiContainer, "func_73863_a", "(IIF)V"), asmblocks.get("n_objectUnderMouse"), asmblocks.get("objectUnderMouse"), false));
// Inject objectUnderMouse check before drawing slot highlights
transformer.add(new MethodInjector(
new ObfMapping(GuiContainer, "func_73863_a", "(IIF)V"),
asmblocks.get("n_objectUnderMouse"),
asmblocks.get("objectUnderMouse"),
false));
//Inject renderObjects after drawGuiContainerForegroundLayer
transformer.add(new MethodInjector(new ObfMapping(GuiContainer, "func_73863_a", "(IIF)V"), asmblocks.get("n_renderObjects"), asmblocks.get("renderObjects"), false));
// Inject renderObjects after drawGuiContainerForegroundLayer
transformer.add(new MethodInjector(
new ObfMapping(GuiContainer, "func_73863_a", "(IIF)V"),
asmblocks.get("n_renderObjects"),
asmblocks.get("renderObjects"),
false));
//Replace default renderToolTip with delegate
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_73863_a", "(IIF)V"), asmblocks.get("d_renderToolTip"), asmblocks.get("renderTooltips")));
// Replace default renderToolTip with delegate
transformer.add(new MethodReplacer(
new ObfMapping(GuiContainer, "func_73863_a", "(IIF)V"),
asmblocks.get("d_renderToolTip"),
asmblocks.get("renderTooltips")));
//Replace zLevel = 200 with zLevel = 500 in drawItemStack
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_146982_a", "(Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V"),
asmblocks.get("d_zLevel"), asmblocks.get("zLevel")));
// Replace zLevel = 200 with zLevel = 500 in drawItemStack
transformer.add(new MethodReplacer(
new ObfMapping(GuiContainer, "func_146982_a", "(Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V"),
asmblocks.get("d_zLevel"),
asmblocks.get("zLevel")));
//Replace default renderItem with delegate and slot overlay/underlay
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_146977_a", "(Lnet/minecraft/inventory/Slot;)V"), asmblocks.get("d_drawSlot"), asmblocks.get("drawSlot")));
// Replace default renderItem with delegate and slot overlay/underlay
transformer.add(new MethodReplacer(
new ObfMapping(GuiContainer, "func_146977_a", "(Lnet/minecraft/inventory/Slot;)V"),
asmblocks.get("d_drawSlot"),
asmblocks.get("drawSlot")));
//Inject mouseClicked hook at the start of mouseClicked
transformer.add(new MethodInjector(new ObfMapping(GuiContainer, "func_73864_a", "(III)V"), asmblocks.get("mouseClicked"), true));
// Inject mouseClicked hook at the start of mouseClicked
transformer.add(new MethodInjector(
new ObfMapping(GuiContainer, "func_73864_a", "(III)V"), asmblocks.get("mouseClicked"), true));
//Replace general handleMouseClicked call with delegate
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_73864_a", "(III)V"), asmblocks.get("d_handleMouseClick"), asmblocks.get("handleMouseClick")));//mouseClicked
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_146273_a", "(IIIJ)V"), asmblocks.get("d_handleMouseClick"), asmblocks.get("handleMouseClick")));//mouseClickMove
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_146286_b", "(III)V"), asmblocks.get("d_handleMouseClick"), asmblocks.get("handleMouseClick")));//mouseMovedOrUp
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_73869_a", "(CI)V"), asmblocks.get("d_handleMouseClick"), asmblocks.get("handleMouseClick")));//keyTyped
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_146983_a", "(I)Z"), asmblocks.get("d_handleMouseClick"), asmblocks.get("handleMouseClick")));//checkHotbarKeys
// Replace general handleMouseClicked call with delegate
transformer.add(new MethodReplacer(
new ObfMapping(GuiContainer, "func_73864_a", "(III)V"),
asmblocks.get("d_handleMouseClick"),
asmblocks.get("handleMouseClick"))); // mouseClicked
transformer.add(new MethodReplacer(
new ObfMapping(GuiContainer, "func_146273_a", "(IIIJ)V"),
asmblocks.get("d_handleMouseClick"),
asmblocks.get("handleMouseClick"))); // mouseClickMove
transformer.add(new MethodReplacer(
new ObfMapping(GuiContainer, "func_146286_b", "(III)V"),
asmblocks.get("d_handleMouseClick"),
asmblocks.get("handleMouseClick"))); // mouseMovedOrUp
transformer.add(new MethodReplacer(
new ObfMapping(GuiContainer, "func_73869_a", "(CI)V"),
asmblocks.get("d_handleMouseClick"),
asmblocks.get("handleMouseClick"))); // keyTyped
transformer.add(new MethodReplacer(
new ObfMapping(GuiContainer, "func_146983_a", "(I)Z"),
asmblocks.get("d_handleMouseClick"),
asmblocks.get("handleMouseClick"))); // checkHotbarKeys
//Write delegate for handleMouseClicked
transformer.add(new MethodWriter(ACC_PUBLIC, new ObfMapping(GuiContainer, "managerHandleMouseClick", "(Lnet/minecraft/inventory/Slot;III)V"), asmblocks.get("m_managerHandleMouseClick")));
// Write delegate for handleMouseClicked
transformer.add(new MethodWriter(
ACC_PUBLIC,
new ObfMapping(GuiContainer, "managerHandleMouseClick", "(Lnet/minecraft/inventory/Slot;III)V"),
asmblocks.get("m_managerHandleMouseClick")));
//Inject mouseDragged hook after super call in mouseDragged
transformer.add(new MethodInjector(new ObfMapping(GuiContainer, "func_146273_a", "(IIIJ)V"), asmblocks.get("n_mouseDragged"), asmblocks.get("mouseDragged"), false));
// Inject mouseDragged hook after super call in mouseDragged
transformer.add(new MethodInjector(
new ObfMapping(GuiContainer, "func_146273_a", "(IIIJ)V"),
asmblocks.get("n_mouseDragged"),
asmblocks.get("mouseDragged"),
false));
//Inject overrideMouseUp at the start of mouseMovedOrUp
transformer.add(new MethodInjector(new ObfMapping(GuiContainer, "func_146286_b", "(III)V"), asmblocks.get("overrideMouseUp"), true));
// Inject overrideMouseUp at the start of mouseMovedOrUp
transformer.add(new MethodInjector(
new ObfMapping(GuiContainer, "func_146286_b", "(III)V"), asmblocks.get("overrideMouseUp"), true));
//Inject mouseUp at the end of main elseif chain in mouseMovedOrUp
transformer.add(new MethodTransformer(new ObfMapping(GuiContainer, "func_146286_b", "(III)V"))
{
// Inject mouseUp at the end of main elseif chain in mouseMovedOrUp
transformer.add(new MethodTransformer(new ObfMapping(GuiContainer, "func_146286_b", "(III)V")) {
@Override
public void transform(MethodNode mv) {
ASMHelper.logger.debug("NEI: Injecting mouseUp call");
@@ -169,33 +251,51 @@ public class NEITransformer implements IClassTransformer
}
});
//Replace general handleSlotClick call with delegate
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_146984_a", "(Lnet/minecraft/inventory/Slot;III)V"),
asmblocks.get("d_handleSlotClick"), asmblocks.get("handleSlotClick")));
// Replace general handleSlotClick call with delegate
transformer.add(new MethodReplacer(
new ObfMapping(GuiContainer, "func_146984_a", "(Lnet/minecraft/inventory/Slot;III)V"),
asmblocks.get("d_handleSlotClick"),
asmblocks.get("handleSlotClick")));
//Inject lastKeyTyped at the start of keyTyped
transformer.add(new MethodInjector(new ObfMapping(GuiContainer, "func_73869_a", "(CI)V"), asmblocks.get("lastKeyTyped"), true));
// Inject lastKeyTyped at the start of keyTyped
transformer.add(new MethodInjector(
new ObfMapping(GuiContainer, "func_73869_a", "(CI)V"), asmblocks.get("lastKeyTyped"), true));
//Inject updateScreen hook after super call
transformer.add(new MethodInjector(new ObfMapping(GuiContainer, "func_73876_c", "()V"), asmblocks.get("n_updateScreen"), asmblocks.get("updateScreen"), false));
// Inject updateScreen hook after super call
transformer.add(new MethodInjector(
new ObfMapping(GuiContainer, "func_73876_c", "()V"),
asmblocks.get("n_updateScreen"),
asmblocks.get("updateScreen"),
false));
//Cancel tab click calls when tabs are obscured
transformer.add(new MethodInjector(new ObfMapping("net/minecraft/client/gui/inventory/GuiContainerCreative", "func_147049_a", "(Lnet/minecraft/creativetab/CreativeTabs;II)Z"),
asmblocks.get("handleTabClick"), true));
// Cancel tab click calls when tabs are obscured
transformer.add(new MethodInjector(
new ObfMapping(
"net/minecraft/client/gui/inventory/GuiContainerCreative",
"func_147049_a",
"(Lnet/minecraft/creativetab/CreativeTabs;II)Z"),
asmblocks.get("handleTabClick"),
true));
//Cancel tab tooltip rendering when tabs are obscured
transformer.add(new MethodInjector(new ObfMapping("net/minecraft/client/gui/inventory/GuiContainerCreative", "func_147052_b", "(Lnet/minecraft/creativetab/CreativeTabs;II)Z"),
asmblocks.get("renderTabTooltip"), true));
// Cancel tab tooltip rendering when tabs are obscured
transformer.add(new MethodInjector(
new ObfMapping(
"net/minecraft/client/gui/inventory/GuiContainerCreative",
"func_147052_b",
"(Lnet/minecraft/creativetab/CreativeTabs;II)Z"),
asmblocks.get("renderTabTooltip"),
true));
String[] buttons = new String[]{"CancelButton", "ConfirmButton", "PowerButton"};
String[] this_fields = new String[]{"field_146146_o", "field_146147_o", "field_146150_o"};
for(int i = 0; i < 3; i++) {
ObfMapping m = new ObfMapping("net/minecraft/client/gui/inventory/GuiBeacon$"+buttons[i], "func_146111_b", "(II)V");
String[] buttons = new String[] {"CancelButton", "ConfirmButton", "PowerButton"};
String[] this_fields = new String[] {"field_146146_o", "field_146147_o", "field_146150_o"};
for (int i = 0; i < 3; i++) {
ObfMapping m = new ObfMapping(
"net/minecraft/client/gui/inventory/GuiBeacon$" + buttons[i], "func_146111_b", "(II)V");
InsnListSection l = asmblocks.get("beaconButtonObscured").list.copy();
FieldInsnNode this_ref = ((FieldInsnNode)l.get(1));
FieldInsnNode this_ref = ((FieldInsnNode) l.get(1));
this_ref.owner = m.toClassloading().s_owner;
if(ObfMapping.obfuscated) //missing srg mappings for inner outer reference fields
this_ref.name = ObfMapping.obfMapper.mapFieldName(null, this_fields[i], null);
if (ObfMapping.obfuscated) // missing srg mappings for inner outer reference fields
this_ref.name = ObfMapping.obfMapper.mapFieldName(null, this_fields[i], null);
transformer.add(new MethodInjector(m, l.list, true));
}
}
@@ -205,9 +305,9 @@ public class NEITransformer implements IClassTransformer
InsnList forward1 = new InsnList();
InsnList forward2 = new InsnList();
ObfMapping publicCall = new ObfMapping(called.s_owner, "public_"+called.s_name, called.s_desc);
ObfMapping publicCall = new ObfMapping(called.s_owner, "public_" + called.s_name, called.s_desc);
Type[] args = Type.getArgumentTypes(caller.s_desc);
for(int i = 0; i < args.length; i++) {
for (int i = 0; i < args.length; i++) {
forward1.add(new VarInsnNode(args[i].getOpcode(ILOAD), i));
forward2.add(new VarInsnNode(args[i].getOpcode(ILOAD), i));
}
@@ -217,11 +317,12 @@ public class NEITransformer implements IClassTransformer
forward1.add(new InsnNode(Type.getReturnType(called.s_desc).getOpcode(IRETURN)));
forward2.add(new InsnNode(Type.getReturnType(called.s_desc).getOpcode(IRETURN)));
transformer.add(new MethodWriter(ACC_PUBLIC|ACC_STATIC, caller, forward1));
transformer.add(new MethodWriter(ACC_PUBLIC | ACC_STATIC, caller, forward1));
transformer.add(new MethodWriter(ACC_PUBLIC, publicCall, forward2));
}
private final ObfMapping c_GuiContainer = new ObfMapping("net/minecraft/client/gui/inventory/GuiContainer").toClassloading();
private final ObfMapping c_GuiContainer =
new ObfMapping("net/minecraft/client/gui/inventory/GuiContainer").toClassloading();
/**
* Adds super.updateScreen() to non implementing GuiContainer subclasses
*/
@@ -238,7 +339,8 @@ public class NEITransformer implements IClassTransformer
boolean changed = false;
for (MethodNode mv : cnode.methods) {
if (methodmap.matches(mv)) {
if (matches(new InsnListSection(mv.instructions), supercall, getControlFlowLabels(mv.instructions)) == null) {
if (matches(new InsnListSection(mv.instructions), supercall, getControlFlowLabels(mv.instructions))
== null) {
mv.instructions.insert(supercall.list);
ASMHelper.logger.debug("Inserted super call into " + methodmap);
changed = true;
@@ -246,8 +348,7 @@ public class NEITransformer implements IClassTransformer
}
}
if (changed)
bytes = ASMHelper.createBytes(cnode, COMPUTE_MAXS | COMPUTE_FRAMES);
if (changed) bytes = ASMHelper.createBytes(cnode, COMPUTE_MAXS | COMPUTE_FRAMES);
}
return bytes;
}
@@ -270,8 +371,7 @@ public class NEITransformer implements IClassTransformer
ClassWriter cw = new ClassWriter(0);
GuiContainerManagerAPITransformer cv = new GuiContainerManagerAPITransformer(ASM5, cw, tname);
cr.accept(cv, ClassReader.SKIP_DEBUG);
if (cv.isChanged())
bytes = cw.toByteArray();
if (cv.isChanged()) bytes = cw.toByteArray();
}
bytes = transformer.transform(name, bytes);
@@ -11,139 +11,158 @@ import org.objectweb.asm.MethodVisitor;
/**
* Code without this patch
* <pre>
public class OreDictionary {
public static int getOreID(String name) {
Integer val = nameToId.get(name);
if (val == null)
{
idToName.add(name);
val = idToName.size() - 1; //0 indexed
nameToId.put(name, val);
idToStack.add(new ArrayList<ItemStack>());
idToStackUn.add(new UnmodifiableArrayList(idToStack.get(val)));
}
return val;
}
}
</pre>
Code with this patch
<pre>
public class OreDictionary {
private static final Object emptyEntryCreationLock = new Object();
public static int getOreID(String name) {
Integer val = nameToId.get(name);
if (val == null)
{
synchronized (emptyEntryCreationLock) {
if ((val = nameToId.get(name)) != null)
return val;
idToName.add(name);
val = idToName.size() - 1; //0 indexed
nameToId.put(name, val);
idToStack.add(new ArrayList<ItemStack>());
idToStackUn.add(new UnmodifiableArrayList(idToStack.get(val)));
}
}
return val;
}
}
* public class OreDictionary {
* public static int getOreID(String name) {
* Integer val = nameToId.get(name);
* if (val == null)
* {
* idToName.add(name);
* val = idToName.size() - 1; //0 indexed
* nameToId.put(name, val);
* idToStack.add(new ArrayList<ItemStack>());
* idToStackUn.add(new UnmodifiableArrayList(idToStack.get(val)));
* }
* return val;
* }
* }
* </pre>
* Code with this patch
* <pre>
* public class OreDictionary {
* private static final Object emptyEntryCreationLock = new Object();
* public static int getOreID(String name) {
* Integer val = nameToId.get(name);
* if (val == null)
* {
* synchronized (emptyEntryCreationLock) {
* if ((val = nameToId.get(name)) != null)
* return val;
* idToName.add(name);
* val = idToName.size() - 1; //0 indexed
* nameToId.put(name, val);
* idToStack.add(new ArrayList<ItemStack>());
* idToStackUn.add(new UnmodifiableArrayList(idToStack.get(val)));
* }
* }
* return val;
* }
* }
* </pre>
*/
public class OreDictionaryVisitor extends ClassVisitor {
private static final Logger logger = LogManager.getLogger("OreDictionaryVisitor");
private static class GetOreIDVisitor extends MethodVisitor {
Label jumpEnd;
Label catchStart = new Label();
Label exitStart = new Label();
public GetOreIDVisitor(int api, MethodVisitor mv) {
super(api, mv);
}
private static final Logger logger = LogManager.getLogger("OreDictionaryVisitor");
@Override
public void visitJumpInsn(int opcode, Label label) {
super.visitJumpInsn(opcode, label);
logger.trace("Adding getOreID MONITERENTER");
jumpEnd = label;
mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/oredict/OreDictionary", "emptyEntryCreationLock", "Ljava/lang/Object;");
mv.visitInsn(MONITORENTER);
mv.visitLabel(catchStart);
mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/oredict/OreDictionary", "nameToId", "Ljava/util/Map;");
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;", true);
mv.visitTypeInsn(CHECKCAST, "java/lang/Integer");
mv.visitVarInsn(ASTORE, 1);
mv.visitVarInsn(ALOAD, 1);
mv.visitJumpInsn(IFNONNULL, exitStart);
}
private static class GetOreIDVisitor extends MethodVisitor {
Label jumpEnd;
Label catchStart = new Label();
Label exitStart = new Label();
@Override
public void visitLabel(Label label) {
if (label.equals(jumpEnd)) {
logger.trace("Adding getOreID MONITEREXIT");
// normal exit
mv.visitLabel(exitStart);
mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/oredict/OreDictionary", "emptyEntryCreationLock", "Ljava/lang/Object;");
mv.visitInsn(MONITOREXIT);
// not normal
mv.visitJumpInsn(GOTO, jumpEnd);
Label catchBegin = new Label();
mv.visitLabel(catchBegin);
mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/oredict/OreDictionary", "emptyEntryCreationLock", "Ljava/lang/Object;");
mv.visitInsn(MONITOREXIT);
mv.visitInsn(ATHROW);
// try-catch block metadata
mv.visitTryCatchBlock(catchStart, catchBegin, catchBegin, null);
}
super.visitLabel(label);
}
public GetOreIDVisitor(int api, MethodVisitor mv) {
super(api, mv);
}
@Override
public void visitEnd() {
super.visitEnd();
}
}
@Override
public void visitJumpInsn(int opcode, Label label) {
super.visitJumpInsn(opcode, label);
logger.trace("Adding getOreID MONITERENTER");
jumpEnd = label;
mv.visitFieldInsn(
GETSTATIC,
"net/minecraftforge/oredict/OreDictionary",
"emptyEntryCreationLock",
"Ljava/lang/Object;");
mv.visitInsn(MONITORENTER);
mv.visitLabel(catchStart);
mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/oredict/OreDictionary", "nameToId", "Ljava/util/Map;");
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;", true);
mv.visitTypeInsn(CHECKCAST, "java/lang/Integer");
mv.visitVarInsn(ASTORE, 1);
mv.visitVarInsn(ALOAD, 1);
mv.visitJumpInsn(IFNONNULL, exitStart);
}
private static class ClassInitializerVisitor extends MethodVisitor{
public ClassInitializerVisitor(int api, MethodVisitor mv) {
super(api, mv);
}
@Override
public void visitLabel(Label label) {
if (label.equals(jumpEnd)) {
logger.trace("Adding getOreID MONITEREXIT");
// normal exit
mv.visitLabel(exitStart);
mv.visitFieldInsn(
GETSTATIC,
"net/minecraftforge/oredict/OreDictionary",
"emptyEntryCreationLock",
"Ljava/lang/Object;");
mv.visitInsn(MONITOREXIT);
// not normal
mv.visitJumpInsn(GOTO, jumpEnd);
Label catchBegin = new Label();
mv.visitLabel(catchBegin);
mv.visitFieldInsn(
GETSTATIC,
"net/minecraftforge/oredict/OreDictionary",
"emptyEntryCreationLock",
"Ljava/lang/Object;");
mv.visitInsn(MONITOREXIT);
mv.visitInsn(ATHROW);
// try-catch block metadata
mv.visitTryCatchBlock(catchStart, catchBegin, catchBegin, null);
}
super.visitLabel(label);
}
@Override
public void visitCode() {
super.visitCode();
logger.trace("Adding emptyEntryCreationLock initializer");
mv.visitTypeInsn(NEW, "java/lang/Object");
mv.visitInsn(DUP);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
mv.visitFieldInsn(PUTSTATIC, "net/minecraftforge/oredict/OreDictionary","emptyEntryCreationLock", "Ljava/lang/Object;");
}
@Override
public void visitEnd() {
super.visitEnd();
}
}
@Override
public void visitEnd() {
super.visitEnd();
}
}
public OreDictionaryVisitor(int api, ClassVisitor cv) {
super(api, cv);
}
private static class ClassInitializerVisitor extends MethodVisitor {
public ClassInitializerVisitor(int api, MethodVisitor mv) {
super(api, mv);
}
@Override
public void visitEnd() {
logger.debug("Adding emptyEntryCreationLock");
cv.visitField(ACC_PRIVATE | ACC_STATIC | ACC_FINAL, "emptyEntryCreationLock", "Ljava/lang/Object;", null, null);
super.visitEnd();
}
@Override
public void visitCode() {
super.visitCode();
logger.trace("Adding emptyEntryCreationLock initializer");
mv.visitTypeInsn(NEW, "java/lang/Object");
mv.visitInsn(DUP);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
mv.visitFieldInsn(
PUTSTATIC,
"net/minecraftforge/oredict/OreDictionary",
"emptyEntryCreationLock",
"Ljava/lang/Object;");
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
if (name.equals("getOreID") && desc.equals("(Ljava/lang/String;)I")) {
logger.debug("Patching getOreID");
return new GetOreIDVisitor(api, super.visitMethod(access, name, desc, signature, exceptions));
} else if (name.equals("<clinit>")) {
// some classes don't have clinit. not this one.
logger.debug("Patching clinit");
return new ClassInitializerVisitor(api, super.visitMethod(access, name, desc, signature, exceptions));
}
return super.visitMethod(access, name, desc, signature, exceptions);
}
@Override
public void visitEnd() {
super.visitEnd();
}
}
public OreDictionaryVisitor(int api, ClassVisitor cv) {
super(api, cv);
}
@Override
public void visitEnd() {
logger.debug("Adding emptyEntryCreationLock");
cv.visitField(ACC_PRIVATE | ACC_STATIC | ACC_FINAL, "emptyEntryCreationLock", "Ljava/lang/Object;", null, null);
super.visitEnd();
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
if (name.equals("getOreID") && desc.equals("(Ljava/lang/String;)I")) {
logger.debug("Patching getOreID");
return new GetOreIDVisitor(api, super.visitMethod(access, name, desc, signature, exceptions));
} else if (name.equals("<clinit>")) {
// some classes don't have clinit. not this one.
logger.debug("Patching clinit");
return new ClassInitializerVisitor(api, super.visitMethod(access, name, desc, signature, exceptions));
}
return super.visitMethod(access, name, desc, signature, exceptions);
}
}
@@ -2,8 +2,7 @@ package codechicken.nei.config;
import java.util.LinkedList;
public abstract class ArrayDumper<T> extends DataDumper
{
public abstract class ArrayDumper<T> extends DataDumper {
public ArrayDumper(String name) {
super(name);
}
@@ -15,11 +14,9 @@ public abstract class ArrayDumper<T> extends DataDumper
for (int i = 0; i < array.length; i++) {
T obj = array[i];
if (obj == null) {
if (mode == 1 || mode == 2)
list.add(new String[]{Integer.toString(i), null, null, null, null});
if (mode == 1 || mode == 2) list.add(new String[] {Integer.toString(i), null, null, null, null});
} else {
if (mode == 0 || mode == 2)
list.add(dump(obj, i));
if (mode == 0 || mode == 2) list.add(dump(obj, i));
}
}
return list;
@@ -28,4 +25,4 @@ public abstract class ArrayDumper<T> extends DataDumper
public abstract T[] array();
public abstract String[] dump(T obj, int id);
}
}
@@ -2,12 +2,10 @@ package codechicken.nei.config;
import codechicken.lib.config.ConfigTagParent;
import codechicken.nei.NEIServerUtils;
import java.io.File;
import net.minecraft.nbt.NBTTagCompound;
import java.io.File;
public class ConfigSet
{
public class ConfigSet {
private final File nbtFile;
public NBTTagCompound nbt;
public final ConfigTagParent config;
@@ -21,12 +19,9 @@ public class ConfigSet
public void loadNBT() {
nbt = new NBTTagCompound();
try {
if (!nbtFile.getParentFile().exists())
nbtFile.getParentFile().mkdirs();
if (!nbtFile.exists())
nbtFile.createNewFile();
if (nbtFile.length() > 0)
nbt = NEIServerUtils.readNBT(nbtFile);
if (!nbtFile.getParentFile().exists()) nbtFile.getParentFile().mkdirs();
if (!nbtFile.exists()) nbtFile.createNewFile();
if (nbtFile.length() > 0) nbt = NEIServerUtils.readNBT(nbtFile);
} catch (Exception e) {
e.printStackTrace();
}
@@ -1,23 +1,21 @@
package codechicken.nei.config;
import static codechicken.lib.gui.GuiDraw.drawString;
import static codechicken.lib.gui.GuiDraw.drawStringC;
import codechicken.core.CommonUtils;
import codechicken.lib.vec.Rectangle4i;
import codechicken.nei.LayoutManager;
import codechicken.nei.NEIClientConfig;
import codechicken.nei.NEIClientUtils;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.IChatComponent;
import org.lwjgl.opengl.GL11;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import static codechicken.lib.gui.GuiDraw.drawString;
import static codechicken.lib.gui.GuiDraw.drawStringC;
public abstract class DataDumper extends Option
{
public abstract class DataDumper extends Option {
public DataDumper(String name) {
super(name);
}
@@ -33,10 +31,8 @@ public abstract class DataDumper extends Option
public void dumpFile() {
try {
File file = new File(CommonUtils.getMinecraftDir(), "dumps/" + getFileName(name.replaceFirst(".+\\.", "")));
if (!file.getParentFile().exists())
file.getParentFile().mkdirs();
if (!file.exists())
file.createNewFile();
if (!file.getParentFile().exists()) file.getParentFile().mkdirs();
if (!file.exists()) file.createNewFile();
dumpTo(file);
@@ -55,28 +51,24 @@ public abstract class DataDumper extends Option
}
public IChatComponent dumpMessage(File file) {
return new ChatComponentTranslation("nei.options.tools.dump.dumped",
translateN(name), "dumps/" + file.getName());
return new ChatComponentTranslation(
"nei.options.tools.dump.dumped", translateN(name), "dumps/" + file.getName());
}
public void dumpTo(File file) throws IOException {
int mode = getMode();
PrintWriter w = new PrintWriter(file);
w.println(concat(header()));
for (String[] line : dump(mode))
w.println(concat(line));
for (String[] line : dump(mode)) w.println(concat(line));
w.close();
}
public static String concat(String[] header) {
StringBuilder sb = new StringBuilder();
for (String s : header) {
if (sb.length() > 0)
sb.append(',');
if (s == null)
s = "null";
if (s.indexOf(',') > 0 || s.indexOf('\"') > 0)
s = '\"' + s.replace("\"", "\"\"") + '\"';
if (sb.length() > 0) sb.append(',');
if (s == null) s = "null";
if (s.indexOf(',') > 0 || s.indexOf('\"') > 0) s = '\"' + s.replace("\"", "\"\"") + '\"';
sb.append(s);
}
return sb.toString();
@@ -85,8 +77,7 @@ public abstract class DataDumper extends Option
@Override
public void draw(int mousex, int mousey, float frame) {
drawPrefix();
if(modeCount() > 1)
drawButton(mousex, mousey, modeButtonSize(), modeButtonText());
if (modeCount() > 1) drawButton(mousex, mousey, modeButtonSize(), modeButtonText());
drawButton(mousex, mousey, dumpButtonSize(), dumpButtonText());
}
@@ -1,27 +1,25 @@
package codechicken.nei.config;
import static codechicken.lib.gui.GuiDraw.displaySize;
import static codechicken.lib.gui.GuiDraw.getMousePosition;
import static codechicken.nei.NEIClientUtils.translate;
import codechicken.core.gui.GuiCCButton;
import codechicken.core.gui.GuiScreenWidget;
import codechicken.lib.math.MathHelper;
import codechicken.lib.vec.Rectangle4i;
import codechicken.nei.HUDRenderer;
import java.awt.Dimension;
import java.awt.Point;
import java.util.Arrays;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import org.lwjgl.input.Keyboard;
import java.awt.Dimension;
import java.awt.Point;
import java.util.Arrays;
import java.util.List;
import static codechicken.lib.gui.GuiDraw.displaySize;
import static codechicken.lib.gui.GuiDraw.getMousePosition;
import static codechicken.nei.NEIClientUtils.translate;
public class GuiHighlightTips extends GuiScreenWidget
{
public class GuiHighlightTips extends GuiScreenWidget {
private final String name;
private GuiCCButton toggleButton;
private final Option opt;
@@ -73,17 +71,20 @@ public class GuiHighlightTips extends GuiScreenWidget
super.drawScreen(mousex, mousey, f);
if (show()) {
ItemStack stack = new ItemStack(Blocks.redstone_block);
List<String> tip = Arrays.asList(stack.getDisplayName(), EnumChatFormatting.RED+translate("options."+name+".sample"));
List<String> tip = Arrays.asList(
stack.getDisplayName(), EnumChatFormatting.RED + translate("options." + name + ".sample"));
HUDRenderer.renderOverlay(stack, tip, renderPos());
}
}
public Point getPos() {
return new Point(opt.renderTag(name + ".x").getIntValue(), opt.renderTag(name + ".y").getIntValue());
return new Point(
opt.renderTag(name + ".x").getIntValue(),
opt.renderTag(name + ".y").getIntValue());
}
public Dimension sampleSize()//copied from HUDManager when running with the sample for this gui
{
public Dimension sampleSize() // copied from HUDManager when running with the sample for this gui
{
return new Dimension(101, 30);
}
@@ -110,12 +111,10 @@ public class GuiHighlightTips extends GuiScreenWidget
pos.y += drag.y;
}
for (int i = 25; i < 100; i += 25)//snapping
for (int i = 25; i < 100; i += 25) // snapping
{
if (pos.x / 100 == i)
pos.x = i * 100;
if (pos.y / 100 == i)
pos.y = i * 100;
if (pos.x / 100 == i) pos.x = i * 100;
if (pos.y / 100 == i) pos.y = i * 100;
}
return pos;
@@ -136,19 +135,18 @@ public class GuiHighlightTips extends GuiScreenWidget
return new Rectangle4i(
(size.width - rect.width) * pos.x / 10000,
(size.height - rect.height) * pos.y / 10000,
rect.width, rect.height);
rect.width,
rect.height);
}
@Override
protected void mouseClicked(int x, int y, int button) {
if (button == 0 && selectionBox().contains(x, y))
dragDown = getMousePosition();
else
super.mouseClicked(x, y, button);
if (button == 0 && selectionBox().contains(x, y)) dragDown = getMousePosition();
else super.mouseClicked(x, y, button);
}
private void setPos(Point p) {
opt.getTag(name).setBooleanValue(show());//duplicates global tag for the option gui if in world mode
opt.getTag(name).setBooleanValue(show()); // duplicates global tag for the option gui if in world mode
opt.getTag(name + ".x").setIntValue(p.x);
opt.getTag(name + ".y").setIntValue(p.y);
}
@@ -6,6 +6,14 @@ import codechicken.nei.ItemPanels;
import codechicken.nei.NEIClientConfig;
import codechicken.nei.NEIClientUtils;
import codechicken.nei.guihook.GuiContainerManager;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.IntBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import javax.imageio.ImageIO;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.OpenGlHelper;
@@ -21,18 +29,12 @@ import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import javax.imageio.ImageIO;
import java.util.ArrayList;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.IntBuffer;
import java.util.Arrays;
public class GuiItemIconDumper extends GuiScreen {
static final int[] illegalChars = {
34, 60, 62, 124, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 58, 42, 63, 92, 47
};
public class GuiItemIconDumper extends GuiScreen
{
final static int[] illegalChars = {34, 60, 62, 124, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 58, 42, 63, 92, 47};
static {
Arrays.sort(illegalChars);
}
@@ -48,15 +50,12 @@ public class GuiItemIconDumper extends GuiScreen
public GuiItemIconDumper(Option opt, int iconSize) {
this.opt = opt;
this.iconSize = iconSize;
borderSize = iconSize/16;
boxSize = iconSize + borderSize*2;
borderSize = iconSize / 16;
boxSize = iconSize + borderSize * 2;
if (dir.exists()) {
for (File f : dir.listFiles())
if (f.isFile()) f.delete();
} else
dir.mkdirs();
for (File f : dir.listFiles()) if (f.isFile()) f.delete();
} else dir.mkdirs();
}
private void returnScreen(IChatComponent msg) {
@@ -67,7 +66,7 @@ public class GuiItemIconDumper extends GuiScreen
@Override
protected void keyTyped(char c, int keycode) {
if (keycode == Keyboard.KEY_ESCAPE || keycode == Keyboard.KEY_BACK) {
returnScreen(new ChatComponentTranslation(opt.fullName()+".icon.cancelled"));
returnScreen(new ChatComponentTranslation(opt.fullName() + ".icon.cancelled"));
return;
}
super.keyTyped(c, keycode);
@@ -88,14 +87,14 @@ public class GuiItemIconDumper extends GuiScreen
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0.0D, d.width*16D/iconSize, d.height*16D/iconSize, 0.0D, 1000.0D, 3000.0D);
GL11.glOrtho(0.0D, d.width * 16D / iconSize, d.height * 16D / iconSize, 0.0D, 1000.0D, 3000.0D);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glClearColor(0, 0, 0, 0);
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
int rows = d.height / boxSize;
int cols = d.width / boxSize;
int fit = rows*cols;
int fit = rows * cols;
RenderHelper.enableGUIStandardItemLighting();
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
@@ -104,9 +103,9 @@ public class GuiItemIconDumper extends GuiScreen
final ArrayList<ItemStack> items = ItemPanels.itemPanel.getItems();
for (int i = 0; drawIndex < items.size() && i < fit; drawIndex++, i++) {
int x = i%cols * 18;
int y = i/cols * 18;
GuiContainerManager.drawItem(x+1, y+1, items.get(drawIndex));
int x = i % cols * 18;
int y = i / cols * 18;
GuiContainerManager.drawItem(x + 1, y + 1, items.get(drawIndex));
}
GL11.glFlush();
@@ -116,30 +115,28 @@ public class GuiItemIconDumper extends GuiScreen
BufferedImage img = screenshot();
int rows = img.getHeight() / boxSize;
int cols = img.getWidth() / boxSize;
int fit = rows*cols;
int fit = rows * cols;
final ArrayList<ItemStack> items = ItemPanels.itemPanel.getItems();
for(int i = 0; parseIndex < items.size() && i < fit; parseIndex++, i++) {
int x = i%cols * boxSize;
int y = i/cols * boxSize;
exportImage(dir, img.getSubimage(x+borderSize, y+borderSize, iconSize, iconSize), items.get(parseIndex));
for (int i = 0; parseIndex < items.size() && i < fit; parseIndex++, i++) {
int x = i % cols * boxSize;
int y = i / cols * boxSize;
exportImage(
dir, img.getSubimage(x + borderSize, y + borderSize, iconSize, iconSize), items.get(parseIndex));
}
if (parseIndex >= items.size()) {
returnScreen(new ChatComponentTranslation(opt.fullName()+".icon.dumped", "dumps/itempanel_icons"));
returnScreen(new ChatComponentTranslation(opt.fullName() + ".icon.dumped", "dumps/itempanel_icons"));
}
}
public static String cleanFileName(String name) {
StringBuilder cleanName = new StringBuilder();
for (int i = 0; i < name.length(); i++) {
int c = name.charAt(i);
if (Arrays.binarySearch(illegalChars, c) < 0)
cleanName.append((char)c);
else
cleanName.append('_');
if (Arrays.binarySearch(illegalChars, c) < 0) cleanName.append((char) c);
else cleanName.append('_');
}
return cleanName.toString();
}
@@ -147,9 +144,8 @@ public class GuiItemIconDumper extends GuiScreen
private void exportImage(File dir, BufferedImage img, ItemStack stack) throws IOException {
String name = EnumChatFormatting.getTextWithoutFormattingCodes(GuiContainerManager.itemDisplayNameShort(stack));
name = cleanFileName(name);
File file = new File(dir, name+".png");
for(int i = 2; file.exists(); i++)
file = new File(dir, name+'_'+i+".png");
File file = new File(dir, name + ".png");
for (int i = 2; file.exists(); i++) file = new File(dir, name + '_' + i + ".png");
ImageIO.write(img, "png", file);
}
@@ -178,7 +174,8 @@ public class GuiItemIconDumper extends GuiScreen
GL11.glBindTexture(GL11.GL_TEXTURE_2D, fb.framebufferTexture);
GL11.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer);
} else {
GL11.glReadPixels(0, 0, texSize.width, texSize.height, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer);
GL11.glReadPixels(
0, 0, texSize.width, texSize.height, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer);
}
pixelBuffer.get(pixelValues);
@@ -188,8 +185,7 @@ public class GuiItemIconDumper extends GuiScreen
if (OpenGlHelper.isFramebufferEnabled()) {
int yOff = texSize.height - mcSize.height;
for (int y = 0; y < mcSize.height; ++y)
for (int x = 0; x < mcSize.width; ++x)
img.setRGB(x, y, pixelValues[(y + yOff) * texSize.width + x]);
for (int x = 0; x < mcSize.width; ++x) img.setRGB(x, y, pixelValues[(y + yOff) * texSize.width + x]);
} else {
img.setRGB(0, 0, texSize.width, height, pixelValues, 0, texSize.width);
}
Loaded 100 of 182 files, more files were not shown because too many files have changed in this diff. Show more