Compare commits

..

135 Commits

Author SHA1 Message Date
PrototypeTrousers ebe3341bfe refactor AutoRotatingModel 2023-08-27 08:33:51 -03:00
PrototypeTrousers 7566b3e2fc update pattern terminal crafting result after crafting 2023-08-11 10:40:57 -03:00
PrototypeTrousers 30c074021b terminal woes 2023-08-11 10:27:15 -03:00
PrototypeTrousers e6586ac360 attempt to fix ore dict storage bus freezing the client 2023-08-08 00:29:52 -03:00
PrototypeTrousers 0429fe5f21 schedule a refreshed view when changing view cells in terminals 2023-08-05 19:16:02 -03:00
PrototypeTrousers e16d90333b fix channel display 2023-07-31 02:58:34 -03:00
0mega24 59c7dd1285 Configurable Channel Limits (#295)
* Channel Config Test

* Update AEConfig.java

* userDefinedChannelAmounts

config option added for the dense and normal channel amounts - will need to be refined to match everything but not sure what I would need to do to make it match the other config options

rebound all hard coded checks for channel amounts and linked them to the config options

redefined how the channel amounts are noted in all applicable api integrations
2023-07-28 10:26:41 -03:00
PrototypeTrousers 13ba399418 fix NPE. Fix fix gradle issue due to cofh dick move 2023-07-25 17:18:42 -03:00
PrototypeTrousers 8d152afcd3 actually add the access transformer to the jar 2023-07-14 23:20:38 -03:00
PrototypeTrousers 9fdfbbea54 more null checks 2023-07-13 21:57:39 -03:00
PrototypeTrousers f4303fc1ec add checks to 0 sized stacks 2023-07-12 15:00:59 -03:00
PrototypeTrousers 3c62ac79c3 bump version 2023-07-08 21:39:38 -03:00
PrototypeTrousers e42863643d crafting microoptimization 2023-07-08 21:35:27 -03:00
PrototypeTrousers ace7c7d660 Merge branch 'rfg' into origin/AE2-Omnifactory 2023-07-08 18:21:44 -03:00
PrototypeTrousers 35f2aa7d51 works so... 2023-07-08 17:56:31 -03:00
PrototypeTrousers 926a4a87c6 a few important files 2023-07-08 13:00:47 -03:00
PrototypeTrousers d1d2c415bf wip 2023-07-08 00:53:21 -03:00
PrototypeTrousers f631858be6 fix copy-pasting interfaces with memory cards between interfaces with differing amount of expansion cards 2023-07-04 23:57:12 -03:00
PrototypeTrousers d407ec4922 tweak JEI transfer handler a bit more 2023-07-04 22:36:07 -03:00
PrototypeTrousers 3587fce218 fix emitting crafts (level emitter + crafting card) not allowing already stored items to be used in autocrafting 2023-07-04 12:03:48 -03:00
PrototypeTrousers 7464647bb8 0.55.16 2023-07-03 20:22:54 -03:00
PrototypeTrousers 0848f5db70 Merge branch 'autocrafting-containeritem-fix' into AE2-Omnifactory 2023-07-03 20:22:09 -03:00
PrototypeTrousers 822e394966 Merge branch 'item-repo-sort' into AE2-Omnifactory 2023-07-03 20:22:06 -03:00
PrototypeTrousers 68ed4c9c0f Merge branch 'jei-fix' into AE2-Omnifactory 2023-07-03 20:22:03 -03:00
PrototypeTrousers f13d7f351d fix container items breaking not being taken into account during simulation properly
optimize crafting with container items by checking IF WE HAVE ANY of before LOOKING UP IF THE RECIPE MATCHES with the item we DONT HAVE
2023-07-03 15:30:05 -03:00
PrototypeTrousers 086ddd5a67 shady optimization 2023-06-29 15:21:33 -03:00
PrototypeTrousers acb1d00197 attempt to separate itens used simulation (threaded) from the main 2023-06-29 12:53:32 -03:00
PrototypeTrousers 4aaa3f8929 make container itens not arrive too late or early instead precisely when
they are meant to
2023-06-29 12:51:04 -03:00
PrototypeTrousers 793b8d6655 fix patterns not appearing on the terminal except on craftable-only view 2023-06-27 22:53:55 -03:00
PrototypeTrousers cba89b0323 fix damageable container items not being returned immediately for simulation 2023-06-27 11:47:23 -03:00
PrototypeTrousers 1f2cdfd843 improve GUI lag when displaying many items on terminals 2023-06-27 00:10:45 -03:00
PrototypeTrousers da39d81d5f optimize JEI transfer handler so it doesnt lock up the client 2023-06-26 16:13:33 -03:00
PrototypeTrousers 1442248ec3 bump version 2023-06-17 08:12:34 -03:00
PrototypeTrousers 1500661e43 fix wireless terminals duping and voiding issues.
fixes #270
2023-06-16 17:57:13 -03:00
PrototypeTrousers a7c2824624 replace ItemEncodedPattern cache with something that actually works 2023-06-15 21:43:27 -03:00
PrototypeTrousers 9d2549bdd8 bump version 2023-05-26 19:46:34 -03:00
PrototypeTrousers a37a2b4e89 blindly attempt to fix wireless terminal voiding/duping 2023-05-26 19:46:34 -03:00
miozune aa6bad7a72 Fix CPU Clusters consisting only of addon blocks not being recognized (#274) 2023-05-24 07:27:20 -03:00
Rongmario e2e5eed351 Properly discard caches when reloading models (#278)
* Properly discard caches when reloading models

* Singleton reloading multiple AutoRotatingModels
2023-05-24 07:26:24 -03:00
Caedis b6de4ebf18 Fix single slabs and stairs to allow chest opening (#268) 2023-05-24 07:25:56 -03:00
PrototypeTrousers 4545d78a51 bump version 2023-04-24 09:43:23 -03:00
PrototypeTrousers 6dc75fe26e attempt to fix #253 2023-04-24 09:29:10 -03:00
Florian Kostenzer 0552282d9d fix: fix crash when requester node is removed (#262) 2023-04-24 09:18:17 -03:00
Hikari_Nova 8be01dfb87 Try to fix https://github.com/PrototypeTrousers/Applied-Energistics-2/issues/265. (#266) 2023-04-24 09:17:53 -03:00
PrototypeTrousers 4c5803b986 check if baubles mod is installed when using keybinds to open terminals 2023-04-24 09:17:18 -03:00
PrototypeTrousers 3b4b9a1bd5 add recursion check to item p2ps 2023-04-15 08:32:27 -03:00
osimon 2c7959e399 Interface shift-clicking QOL improvements (#248) 2023-03-28 18:27:36 -03:00
PrototypeTrousers 4649841341 Use anatawa's fork of forgegradel 2.3 2023-03-28 18:25:22 -03:00
PrototypeTrousers 3d4cfb2ee8 add the quantum link card to the quantum chamber tooltip 2023-03-28 18:24:51 -03:00
PrototypeTrousers 8092d0d354 Allow the quantum linking card to be disabled by config
Clean up some wrong tooltip
2023-03-28 18:02:36 -03:00
PrototypeTrousers ceee1f181f bump version. copy/paste some lang entries 2023-03-20 16:07:47 -03:00
Domi eefb11544e Add craftable items QOL features (tooltips / hold ALT to toggle craft request) (#241) 2023-03-20 16:01:06 -03:00
Xikaro af5921f9e8 fix ME Chest rendering (#246)
* Update dependencies.gradle

* fix ME Chest rendering
2023-03-20 15:58:40 -03:00
Domi 75be2ff039 Refresh crafting plan when job submission fails (#243) 2023-03-20 15:53:23 -03:00
Domi b6f4bdb64d Fix being unable to clear selected text in number boxes (#242) 2023-03-20 15:53:11 -03:00
PrototypeTrousers b76c9f1371 null check 2023-03-07 14:54:38 -03:00
PrototypeTrousers 50bf591418 bump version 2023-03-05 14:07:36 -03:00
RuiXuqi b077aff1f8 New cells models (#227)
new cells
2023-03-05 14:06:15 -03:00
PrototypeTrousers 8debd6c499 fix invisible interface config slots on servers 2023-02-28 20:00:31 -03:00
PrototypeTrousers 53ad6c776b fix magnet card crashing servers 2023-02-21 20:33:27 -03:00
PrototypeTrousers e37f8ef65d bump version 2023-02-21 10:19:36 -03:00
PrototypeTrousers d8b20f53a9 fix portable cell not working 2023-02-21 10:09:31 -03:00
PrototypeTrousers bf1a3b7751 fix outputs in processing terminal slowly migrating upwards 2023-02-21 09:58:54 -03:00
PrototypeTrousers c8a6d50ce3 fix wireless crafting terminal not loading sorting configs properly 2023-02-20 01:16:41 -03:00
PrototypeTrousers 13af30f657 try to fix the fix 2023-02-18 23:11:43 -03:00
PrototypeTrousers 5d7f552643 attempt to fix wireless terminals overwriting items in hand 2023-02-18 21:06:41 -03:00
Roman Hubenkov 82be548fc7 Update ru_ru.lang (#223)
Small fix
2023-02-18 21:06:13 -03:00
Roman Hubenkov 38249608e4 Update ru_ru.lang (#222) 2023-02-14 20:26:49 -03:00
mczph 8f66765696 Update zh_cn.lang (#221) 2023-02-14 20:26:29 -03:00
PrototypeTrousers fd5f9263d8 fix wireless pattern terminal not encoding processing outputs from JEI
bump version
2023-02-14 20:25:09 -03:00
PrototypeTrousers 36d94a17aa close wireless terminals if they run out of power instead of not working 2023-02-14 19:10:42 -03:00
PrototypeTrousers ede2b4ce25 fix OOB crash 2023-02-13 01:02:59 -03:00
PrototypeTrousers e09ec8c420 bump version 2023-02-10 06:32:35 -03:00
tier940 3d4c03e184 Update ja_jp.lang (#220)
* Update ja_jp.lang

* 組立室から組立機に変更

* 表記揺れの修正

* 記載揺れと誤字脱字の修正
2023-02-10 06:29:15 -03:00
PrototypeTrousers 17119fd990 more gui fixes... 2023-02-10 06:28:44 -03:00
PrototypeTrousers 9a00185b6d backport some security changes 2023-02-10 06:21:39 -03:00
PrototypeTrousers 2c7b239914 bump version 2023-02-09 19:20:17 -03:00
PrototypeTrousers 4039188712 more fixes yay 2023-02-09 13:02:55 -03:00
PrototypeTrousers ecb697ab11 fix terminal/netwoork tool (please) 2023-02-09 12:16:40 -03:00
PrototypeTrousers ab1f519401 allow wireless pattern terminal to switch substitution modes 2023-02-08 21:17:56 -03:00
Roman Hubenkov d06a70ee22 Update ru_ru.lang (#218)
* Update ru_ru.lang
2023-02-08 13:58:54 -03:00
PrototypeTrousers 422f9faf76 fix jei and tall interface terminal button overlapping 2023-02-08 13:58:04 -03:00
PrototypeTrousers 96ab73001b fix craftables not working when wireless terminal not being held
remove wrong imports
add missing lang entries
2023-02-08 12:14:36 -03:00
PrototypeTrousers 854676a33c terminal fixes + better formatting 2023-02-06 18:38:44 -03:00
PrototypeTrousers 7f76723da5 Merge branch 'WiFi-Terminals' into AE2-Omnifactory 2023-02-06 13:28:27 -03:00
PrototypeTrousers 3fc7cf0247 Merge branch 'cell-tooltips' into AE2-Omnifactory 2023-02-06 13:28:23 -03:00
PrototypeTrousers b377dfdd69 Merge branch 'bogofix' into AE2-Omnifactory 2023-02-06 13:28:17 -03:00
PrototypeTrousers 51522019ca fix wireless terminals not opening again 2023-02-06 13:27:52 -03:00
PrototypeTrousers ff1091d252 add toolitps to cells 2023-02-06 13:26:59 -03:00
PrototypeTrousers 15dff5d53d fix JEI integration 2023-02-05 23:04:20 -03:00
PrototypeTrousers 7ab89a0657 update bogosort compat 2023-02-05 23:03:34 -03:00
PrototypeTrousers dcd36b3b2f wip 2023-02-03 23:08:13 -03:00
PrototypeTrousers 7b985c72bd fix slots and texture 2023-02-03 22:33:14 -03:00
PrototypeTrousers 269d3766db implement tall interface terminal (part, not wireless) 2023-02-03 20:56:17 -03:00
PrototypeTrousers d7e7ef0cb4 wip 2023-02-03 15:07:55 -03:00
PrototypeTrousers 472f1e65a2 more autocrafting fixes 2023-02-03 13:49:27 -03:00
PrototypeTrousers 56268aba79 fix autocrafting gui not opening 2023-02-03 12:53:04 -03:00
PrototypeTrousers 9d7dacdc29 Toggle magnet on/off from container/gui 2023-02-02 21:48:01 -03:00
PrototypeTrousers fb2aa21337 cleaning 2023-02-02 20:00:56 -03:00
PrototypeTrousers 8bad14f982 cursed recipes 2023-02-02 19:24:03 -03:00
PrototypeTrousers 0e797b2120 GUI/Container fixes Ugh 2023-02-02 18:22:20 -03:00
PrototypeTrousers 17c38a6418 wip 2023-02-02 16:19:56 -03:00
PrototypeTrousers 58a6dabb20 wip 2023-02-02 14:50:23 -03:00
PrototypeTrousers 329e613c99 recipes 2023-02-02 11:39:16 -03:00
PrototypeTrousers 11a4783881 more textures 2023-02-02 11:23:51 -03:00
PrototypeTrousers e230440cba add some textures 2023-02-01 22:27:01 -03:00
PrototypeTrousers 149e7d251a clean up 2023-02-01 21:43:47 -03:00
PrototypeTrousers 405f14bd13 safer comparisons 2023-02-01 21:19:09 -03:00
PrototypeTrousers acd77ff3f2 lock quantumbridge inventory to 1 card or singularity 2023-02-01 21:10:41 -03:00
PrototypeTrousers a0ec9ceb51 keybinds work 2023-01-31 23:24:27 -03:00
PrototypeTrousers d6f2ed30e5 make them bauble trinkets 2023-01-31 16:52:00 -03:00
PrototypeTrousers 9785e38e3f magnet filtering 2023-01-31 15:29:43 -03:00
PrototypeTrousers 1759bd898e magnetize magnet 2023-01-31 12:40:41 -03:00
PrototypeTrousers ae0d02e7d5 linking kinda works 2023-01-30 23:41:13 -03:00
PrototypeTrousers d76eec2145 wip 2023-01-30 21:56:31 -03:00
PrototypeTrousers d7e1554e41 save upgrades 2023-01-30 20:40:16 -03:00
PrototypeTrousers 9dee7f6c0e cards 2023-01-30 17:45:41 -03:00
PrototypeTrousers 13c3067068 add upgrade slots 2023-01-30 15:41:42 -03:00
PrototypeTrousers 7c4e5679a3 fluid terminal 2023-01-29 21:55:01 -03:00
PrototypeTrousers 03ed421331 more fixes 2023-01-29 21:55:01 -03:00
PrototypeTrousers 36197a5dc6 refresh status if a encoded pattern is put in the output slot 2023-01-29 21:55:01 -03:00
PrototypeTrousers f407a26a8f work on wireless pattern terminal 2023-01-29 21:55:01 -03:00
PrototypeTrousers cb1011295c wip 2023-01-29 21:55:01 -03:00
PrototypeTrousers 55a56ad79d Start implementing wireless terminals. 2023-01-29 21:55:01 -03:00
PrototypeTrousers dd2f1c6dc7 attempt to fix stacking issues 2023-01-28 23:45:14 -03:00
PrototypeTrousers f14407b87a attempted fixes for spatialIO, security and ShaderTech compat 2023-01-28 14:09:23 -03:00
PrototypeTrousers 04f006695e fix terminals not being usable on servers 2023-01-12 12:55:35 -03:00
PrototypeTrousers 4f36ccf64d bump version 2023-01-09 14:25:24 -03:00
PrototypeTrousers d9b4410c94 attempt to fix #197 2023-01-09 02:26:48 -03:00
PrototypeTrousers 9bbd0ad61b ASM Patch ItemStack packet size setter and getter. code from StackUp 2023-01-09 02:15:45 -03:00
MycroftJr 662a7805dd add ItemStack to/from NBT helpers (#202)
to simplify the "stackSize" NBT tag workaround
2023-01-09 01:10:35 -03:00
PrototypeTrousers c46eadec08 Merge branch 'revert-async-repo' into AE2-Omnifactory 2023-01-09 01:08:47 -03:00
PrototypeTrousers 148207f5c3 Merge branch 'gtceu-fix' into PrototypeTrousers/AE2-Omnifactory 2023-01-09 01:08:39 -03:00
PrototypeTrousers 653557bc65 wip. auto-crafting still broken 2023-01-07 18:25:31 -03:00
PrototypeTrousers dde87448a9 initial patch 2023-01-07 12:37:21 -03:00
207 changed files with 7744 additions and 2301 deletions
+25
View File
@@ -0,0 +1,25 @@
name: Build mod
on: [ push, pull_request, workflow_dispatch ]
jobs:
build:
name: Build mod
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: '8'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew -Pnet.minecraftforge.gradle.disableUpdateChecker=true build
- name: Upload artifacts
uses: actions/upload-artifact@v2
with:
name: appliedenergistics2
path: build/libs
-15
View File
@@ -1,15 +0,0 @@
name: 'Lock threads'
on:
schedule:
- cron: '0 0 * * *'
jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v2
with:
github-token: ${{ github.token }}
issue-lock-inactive-days: '180'
pr-lock-inactive-days: '180'
+1
View File
@@ -8,6 +8,7 @@
!gradlew.bat
!build.gradle
!gradle.properties
!settings.gradle
!.travis.yml
# include markdowns
+992 -87
View File
File diff suppressed because it is too large Load Diff
+119 -4
View File
@@ -3,8 +3,6 @@ aechannel=stable
aebuild=7
aegroup=appeng
aebasename=appliedenergistics2
extended=extended_life
extendedversion=v0.54.16
#########################################################
# Versions #
#########################################################
@@ -22,8 +20,7 @@ jei_version=4.16.1.302
tesla_version=1.0.63
ic2_version=2.8.73-ex112
top_version=1.12-1.4.23-16
cofhcore_version=1.12.2-4.5.2.19
crafttweaker_version=4.1.8.9
crafttweaker_version=4.1.20.684
ctm_version=MC1.12.2-0.3.1.16
forestry_version=5.8.2.387
#########################################################
@@ -31,3 +28,121 @@ forestry_version=5.8.2.387
#########################################################
website_version=1.12.2
curse_versions=1.12.2
mapping_channel=snapshot
mapping_version=20171003
# Run Configurations
minecraft_username=Developer
extra_jvm_args=
modName=Applied Energistics 2
# This is a case-sensitive string to identify your mod. Convention is to use lower case.
modId=appliedenergistics2
modGroup=appeng
# Version of your mod.
# This field can be left empty if you want your mod's version to be determined by the latest git tag instead.
modVersion=rv6-stable-7-extended_life-v0.55.21
# Whether to use the old jar naming structure (modid-mcversion-version) instead of the new version (modid-version)
includeMCVersionJar=false
# The name of your jar when you produce builds, not including any versioning info
modArchivesBaseName=appliedenergistics2
# Will update your build.gradle automatically whenever an update is available
autoUpdateBuildScript=false
minecraftVersion=1.12.2
# Select a username for testing your mod with breakpoints. You may leave this empty for a random username each time you
# restart Minecraft in development. Choose this dependent on your mod:
# Do you need consistent player progressing (for example Thaumcraft)? -> Select a name
# Do you need to test how your custom blocks interacts with a player that is not the owner? -> leave name empty
# Alternatively this can be set with the 'DEV_USERNAME' environment variable.
developmentEnvironmentUserName=Developer
# Enables using modern java syntax (up to version 17) via Jabel, while still targeting JVM 8.
# See https://github.com/bsideup/jabel for details on how this works.
# Using this requires that you use a Java 17 JDK for development.
enableModernJavaSyntax=true
# Generate a class with String fields for the mod id, name and version named with the fields below
generateGradleTokenClass=appeng.Tags
gradleTokenModId=
gradleTokenModName=
gradleTokenVersion=VERSION
# In case your mod provides an API for other mods to implement you may declare its package here. Otherwise, you can
# leave this property empty.
# Example value: apiPackage = api + modGroup = com.myname.mymodid -> com.myname.mymodid.api
apiPackage=api
# Specify the configuration file for Forge's access transformers here. It must be placed into /src/main/resources/
# There can be multiple files in a comma-separated list.
# Example value: mymodid_at.cfg,jei_at.cfg
accessTransformersFile=appliedenergistics2_at.cfg
# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled!
usesMixins=false
# Specify the package that contains all of your Mixins. You may only place Mixins in this package or the build will fail!
mixinsPackage=
# Specify the core mod entry class if you use a core mod. This class must implement IFMLLoadingPlugin!
# Example value: coreModClass = asm.FMLPlugin + modGroup = com.myname.mymodid -> com.myname.mymodid.asm.FMLPlugin
coreModClass=core.AE2ELCore
# If your project is only a consolidation of mixins or a core mod and does NOT contain a 'normal' mod (meaning that
# there is no class annotated with @Mod) you want this to be true. When in doubt: leave it on false!
containsMixinsAndOrCoreModOnly=false
# Enables Mixins even if this mod doesn't use them, useful if one of the dependencies uses mixins.
forceEnableMixins=false
# Adds CurseMaven, Modrinth Maven, BlameJared maven, and some more well-known 1.12.2 repositories
includeWellKnownRepositories=true
# Adds JEI and TheOneProbe to your development environment. Adds them as 'implementation', meaning they will
# be available at compiletime and runtime for your mod (in-game and in-code).
# Overrides the above setting to be always true, as these repositories are needed to fetch the mods
includeCommonDevEnvMods=true
# If enabled, you may use 'shadowCompile' for dependencies. They will be integrated in your jar. It is your
# responsibility check the licence and request permission for distribution, if required.
usesShadowedDependencies=false
# If disabled, won't remove unused classes from shaded dependencies. Some libraries use reflection to access
# their own classes, making the minimization unreliable.
minimizeShadowedDependencies=true
# If disabled, won't rename the shadowed classes.
relocateShadowedDependencies=true
# Publishing to modrinth requires you to set the MODRINTH_API_KEY environment variable to your current modrinth API token.
# The project's ID on Modrinth. Can be either the slug or the ID.
# Leave this empty if you don't want to publish on Modrinth.
# Alternatively this can be set with the 'MODRINTH_PROJECT_ID' environment variable.
modrinthProjectId=
# The project's relations on Modrinth. You can use this to refer to other projects on Modrinth.
# Syntax: scope1-type1:name1;scope2-type2:name2;...
# Where scope can be one of [required, optional, incompatible, embedded],
# type can be one of [project, version],
# and the name is the Modrinth project or version slug/id of the other mod.
# Example: required-project:jei;optional-project:top;incompatible-project:gregtech
modrinthRelations=
# Publishing to CurseForge requires you to set the CURSEFORGE_API_KEY environment variable to one of your CurseForge API tokens.
# The project's numeric ID on CurseForge. You can find this in the About Project box.
# Leave this empty if you don't want to publish on CurseForge.
# Alternatively this can be set with the 'CURSEFORGE_PROJECT_ID' environment variable.
curseForgeProjectId=
# The project's relations on CurseForge. You can use this to refer to other projects on CurseForge.
# Syntax: type1:name1;type2:name2;...
# Where type can be one of [requiredDependency, embeddedLibrary, optionalDependency, tool, incompatible],
# and the name is the CurseForge project slug of the other mod.
# Example: requiredDependency:railcraft;embeddedLibrary:cofhlib;incompatible:buildcraft
curseForgeRelations=
# This project's release type on CurseForge and/or Modrinth
# Allowed types: release, beta, alpha
releaseType=beta
# Generate a default changelog for releases. Requires git to be installed, as it uses it to generate a changelog of
# commits since the last tagged release.
generateDefaultChangelog=false
# Prevent the source code from being published
noPublishedSources=false
# Enable spotless checks
# Enforces code formatting on your source code
# By default this will use the files found here: https://github.com/GregTechCEu/Buildscripts/tree/master/spotless
# to format your code. However, you can create your own version of these files and place them in your project's
# root directory to apply your own formatting options instead.
enableSpotless=false
# Enable JUnit testing platform used for testing your code.
# Uses JUnit 5. See guide and documentation here: https://junit.org/junit5/docs/current/user-guide/
enableJUnit=true
# Deployment debug setting
# Uncomment this to test deployments to CurseForge and Modrinth
# Alternatively, you can set the 'DEPLOYMENT_DEBUG' environment variable.
deploymentDebug=false
# Gradle Settings
# Effectively applies the '--stacktrace' flag by default
org.gradle.logging.stacktrace=all
# Sets default memory used for gradle commands. Can be overridden by user or command line properties.
# This is required to provide enough memory for the Minecraft decompilation process.
org.gradle.jvmargs=-Xmx3G
-75
View File
@@ -1,75 +0,0 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
// Suppresses warnings/errors when building javadocs
allprojects {
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
}
}
javadoc {
options.encoding = 'UTF-8'
options.charSet = 'UTF-8'
}
task javadocs(type: Javadoc) {
source = sourceSets.api.java
include "appeng/api/**"
// Due to ForgeGradle having to be a special snowflake,
// we have to add some custom configurations to the normal compile configuration and hope it does not break.
classpath = configurations.compile + configurations.forgeGradleMc + configurations.forgeGradleMcDeps
}
task javadocJar(type: Jar, dependsOn: javadocs) {
from javadoc.destinationDir
classifier = 'javadoc'
}
task apiJar(type: Jar) {
from sourceSets.api.java
include "appeng/api/**"
from sourceSets.api.output
include "appeng/api/**"
classifier = 'api'
}
task sourceJar(type: Jar, overwrite: true) {
from sourceSets.api.allSource
from sourceSets.main.allSource
classifier = 'sources'
}
task devJar(type: Jar, overwrite: true) {
from sourceSets.api.output
from sourceSets.main.output
classifier = 'dev'
}
artifacts {
archives apiJar
archives javadocJar
archives sourceJar
archives devJar
}
+9 -10
View File
@@ -23,12 +23,10 @@ repositories {
url "https://cursemaven.com"
}
/*
maven {
name = "CurseForge"
url = "https://minecraft.curseforge.com/api/maven/"
}
*/
maven {
name "Mobius"
@@ -83,21 +81,22 @@ configurations {
dependencies {
// deobfCompile "gregtechce:gregtech:1.12.2:1.15.1.735"
// installable runtime dependencies
deobfCompile "curse.maven:gregtechceu-557242:3949406"
implementation rfg.deobf("curse.maven:gregtechceu-557242:4429261")
compileOnly "curse.maven:chisel-235279:2915375"
implementation rfg.deobf("curse.maven:baubles-227083:2518667")
//mods "mcp.mobius.waila:Hwyla:${hwyla_version}"
mods "curse.maven:hwyla-253449:2568751"
mods "net.industrial-craft:industrialcraft-2:${ic2_version}:dev"
mods "mcjty.theoneprobe:TheOneProbe-${minecraft_version}:${top_version}"
// compile against provided APIs
compileOnly "mezz.jei:jei_${minecraft_version}:${jei_version}:api"
//compileOnly "mcp.mobius.waila:Hwyla:${hwyla_version}"
compileOnly "curse.maven:hwyla-253449:2568751"
//Code chicken lib, GTCE dependency
deobfCompile "curse.maven:CCL-242818:2779848"
implementation rfg.deobf("curse.maven:CCL-242818:2779848")
compileOnly "curse.maven:recipe-stages-280554:3405072"
compileOnly "curse.maven:item-stages-280316:2696769"
@@ -105,17 +104,17 @@ dependencies {
compileOnly "net.darkhax.tesla:Tesla-1.12.2:${tesla_version}"
compileOnly "net.industrial-craft:industrialcraft-2:${ic2_version}:api"
compileOnly "mcjty.theoneprobe:TheOneProbe-1.12:${top_version}:api"
compileOnly "cofh:CoFHCore:${cofhcore_version}:deobf"
compileOnly "curse.maven:CoFHCore-69162:2920433"
compileOnly "CraftTweaker2:CraftTweaker2-API:${crafttweaker_version}"
compileOnly "curse.maven:inventory-tweaks-223094:2482482"
compileOnly "curse.maven:inventory-bogo-sorter-632327:3975184"
compileOnly "curse.maven:inventory-bogo-sorter-632327:4399738"
compileOnly "team.chisel.ctm:CTM:${ctm_version}"
compileOnly "de.ellpeck.actuallyadditions:ActuallyAdditions:1.12.2-r152.16:api"
deobfCompile "net.sengir.forestry:forestry_${minecraft_version}:$forestry_version"
implementation rfg.deobf("net.sengir.forestry:forestry_${minecraft_version}:$forestry_version")
// at runtime, use the full JEI jar
runtime "mezz.jei:jei_${minecraft_version}:${jei_version}"
runtimeOnly "mezz.jei:jei_${minecraft_version}:${jei_version}"
// unit test dependencies
testCompile "junit:junit:4.12"
testImplementation "junit:junit:4.12"
}
+15 -16
View File
@@ -15,41 +15,40 @@
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
task wrapper(type: Wrapper) {
gradleVersion = "2.14"
}
// HWYLA
task installHwyla(type: Copy, dependsOn: "deinstallHwyla") {
tasks.register('installHwyla', Copy) {
dependsOn "deinstallHwyla"
from { configurations.mods }
include "**/*Hwyla*.jar"
into file(minecraft.runDir + "/mods")
into file("/run/mods")
}
task deinstallHwyla(type: Delete) {
delete fileTree(dir: minecraft.runDir + "/mods", include: "*Hwyla*.jar")
tasks.register('deinstallHwyla', Delete) {
delete fileTree(dir: "/run/mods", include: "*Hwyla*.jar")
}
// IC2
task installIC2(type: Copy, dependsOn: "deinstallIC2") {
tasks.register('installIC2', Copy) {
dependsOn "deinstallIC2"
from { configurations.mods }
include "**/*industrialcraft-2*.jar"
into file(minecraft.runDir + "/mods")
into file("/run/mods")
}
task deinstallIC2(type: Delete) {
delete fileTree(dir: minecraft.runDir + "/mods", include: "*industrialcraft-2*.jar")
tasks.register('deinstallIC2', Delete) {
delete fileTree(dir: "/run/mods", include: "*industrialcraft-2*.jar")
}
// TOP
task installTop(type: Copy, dependsOn: ["deinstallTop"]) {
tasks.register('installTop', Copy) {
dependsOn["deinstallTop"]
from { configurations.mods }
include "**/*TheOneProbe*.jar"
into file(minecraft.runDir + "/mods")
into file("/run/mods")
}
task deinstallTop(type: Delete) {
delete fileTree(dir: minecraft.runDir + "/mods", include: "*TheOneProbe*.jar")
tasks.register('deinstallTop', Delete) {
delete fileTree(dir: "/run/mods", include: "*TheOneProbe*.jar")
}
Binary file not shown.
+2 -1
View File
@@ -1,5 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-all.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.8-bin.zip
Vendored
+187 -115
View File
@@ -1,78 +1,129 @@
#!/usr/bin/env sh
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
MAX_FD=maximum
warn () {
echo "$*"
}
} >&2
die () {
echo
echo "$*"
echo
exit 1
}
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -81,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@@ -89,84 +140,105 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"
+26
View File
@@ -0,0 +1,26 @@
pluginManagement {
repositories {
maven {
// RetroFuturaGradle
name 'GTNH Maven'
//noinspection HttpUrlsUsage
url 'http://jenkins.usrv.eu:8081/nexus/content/groups/public/'
allowInsecureProtocol = true
//noinspection GroovyAssignabilityCheck
mavenContent {
includeGroup 'com.gtnewhorizons'
includeGroup 'com.gtnewhorizons.retrofuturagradle'
}
}
gradlePluginPortal()
mavenCentral()
mavenLocal()
}
}
plugins {
// Automatic toolchain provisioning
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.4.0'
}
rootProject.name = rootProject.projectDir.getName()
+50 -55
View File
@@ -32,66 +32,61 @@ import net.minecraft.item.ItemStack;
import appeng.api.definitions.IItemDefinition;
public enum Upgrades
{
/**
* Gold Tier Upgrades.
*/
CAPACITY( 0 ),
REDSTONE( 0 ),
CRAFTING( 0 ),
public enum Upgrades {
/**
* Gold Tier Upgrades.
*/
CAPACITY(0),
REDSTONE(0),
CRAFTING(0),
MAGNET(0),
/**
* Diamond Tier Upgrades.
*/
FUZZY( 1 ),
SPEED( 1 ),
INVERTER( 1 ),
PATTERN_EXPANSION(1);
/**
* Diamond Tier Upgrades.
*/
FUZZY(1),
SPEED(1),
INVERTER(1),
PATTERN_EXPANSION(1),
QUANTUM_LINK(1);
private final int tier;
private final Map<ItemStack, Integer> supportedMax = new HashMap<>();
private final int tier;
private final Map<ItemStack, Integer> supportedMax = new HashMap<>();
Upgrades( final int tier )
{
this.tier = tier;
}
Upgrades(final int tier) {
this.tier = tier;
}
/**
* @return list of Items/Blocks that support this upgrade, and how many it supports.
*/
public Map<ItemStack, Integer> getSupported()
{
return this.supportedMax;
}
/**
* @return list of Items/Blocks that support this upgrade, and how many it supports.
*/
public Map<ItemStack, Integer> getSupported() {
return this.supportedMax;
}
/**
* Registers a specific amount of this upgrade into a specific machine
*
* @param item machine in which this upgrade can be installed
* @param maxSupported amount how many upgrades can be installed
*/
public void registerItem( final IItemDefinition item, final int maxSupported )
{
item.maybeStack( 1 ).ifPresent( is -> this.registerItem( is, maxSupported ) );
}
/**
* Registers a specific amount of this upgrade into a specific machine
*
* @param item machine in which this upgrade can be installed
* @param maxSupported amount how many upgrades can be installed
*/
public void registerItem(final IItemDefinition item, final int maxSupported) {
item.maybeStack(1).ifPresent(is -> this.registerItem(is, maxSupported));
}
/**
* Registers a specific amount of this upgrade into a specific machine
*
* @param stack machine in which this upgrade can be installed
* @param maxSupported amount how many upgrades can be installed
*/
public void registerItem( final ItemStack stack, final int maxSupported )
{
if( stack != null )
{
this.supportedMax.put( stack, maxSupported );
}
}
/**
* Registers a specific amount of this upgrade into a specific machine
*
* @param stack machine in which this upgrade can be installed
* @param maxSupported amount how many upgrades can be installed
*/
public void registerItem(final ItemStack stack, final int maxSupported) {
if (stack != null) {
this.supportedMax.put(stack, maxSupported);
}
}
public int getTier()
{
return this.tier;
}
public int getTier() {
return this.tier;
}
}
@@ -30,8 +30,7 @@ import appeng.api.util.AEColoredItemDefinition;
/**
* A list of all items in AE
*/
public interface IItems
{
public interface IItems {
IItemDefinition certusQuartzAxe();
IItemDefinition certusQuartzHoe();
@@ -64,6 +63,12 @@ public interface IItems
IItemDefinition wirelessTerminal();
IItemDefinition wirelessCraftingTerminal();
IItemDefinition wirelessPatternTerminal();
IItemDefinition wirelessFluidTerminal();
IItemDefinition biometricCard();
IItemDefinition chargedStaff();
@@ -27,121 +27,124 @@ package appeng.api.definitions;
/**
* A list of all materials in AE
*/
public interface IMaterials
{
IItemDefinition cell2SpatialPart();
public interface IMaterials {
IItemDefinition cell2SpatialPart();
IItemDefinition cell16SpatialPart();
IItemDefinition cell16SpatialPart();
IItemDefinition cell128SpatialPart();
IItemDefinition cell128SpatialPart();
IItemDefinition silicon();
IItemDefinition silicon();
IItemDefinition skyDust();
IItemDefinition skyDust();
IItemDefinition calcProcessorPress();
IItemDefinition calcProcessorPress();
IItemDefinition engProcessorPress();
IItemDefinition engProcessorPress();
IItemDefinition logicProcessorPress();
IItemDefinition logicProcessorPress();
IItemDefinition calcProcessorPrint();
IItemDefinition calcProcessorPrint();
IItemDefinition engProcessorPrint();
IItemDefinition engProcessorPrint();
IItemDefinition logicProcessorPrint();
IItemDefinition logicProcessorPrint();
IItemDefinition siliconPress();
IItemDefinition siliconPress();
IItemDefinition siliconPrint();
IItemDefinition siliconPrint();
IItemDefinition namePress();
IItemDefinition namePress();
IItemDefinition logicProcessor();
IItemDefinition logicProcessor();
IItemDefinition calcProcessor();
IItemDefinition calcProcessor();
IItemDefinition engProcessor();
IItemDefinition engProcessor();
IItemDefinition basicCard();
IItemDefinition basicCard();
IItemDefinition advCard();
IItemDefinition advCard();
IItemDefinition purifiedCertusQuartzCrystal();
IItemDefinition purifiedCertusQuartzCrystal();
IItemDefinition purifiedNetherQuartzCrystal();
IItemDefinition purifiedNetherQuartzCrystal();
IItemDefinition purifiedFluixCrystal();
IItemDefinition purifiedFluixCrystal();
IItemDefinition cell1kPart();
IItemDefinition cell1kPart();
IItemDefinition cell4kPart();
IItemDefinition cell4kPart();
IItemDefinition cell16kPart();
IItemDefinition cell16kPart();
IItemDefinition cell64kPart();
IItemDefinition cell64kPart();
IItemDefinition emptyStorageCell();
IItemDefinition emptyStorageCell();
IItemDefinition cardRedstone();
IItemDefinition cardRedstone();
IItemDefinition cardSpeed();
IItemDefinition cardSpeed();
IItemDefinition cardCapacity();
IItemDefinition cardCapacity();
IItemDefinition cardPatternExpansion();
IItemDefinition cardPatternExpansion();
IItemDefinition cardFuzzy();
IItemDefinition cardQuantumLink();
IItemDefinition cardInverter();
IItemDefinition cardMagnet();
IItemDefinition cardCrafting();
IItemDefinition cardFuzzy();
IItemDefinition enderDust();
IItemDefinition cardInverter();
IItemDefinition flour();
IItemDefinition cardCrafting();
IItemDefinition goldDust();
IItemDefinition enderDust();
IItemDefinition ironDust();
IItemDefinition flour();
IItemDefinition fluixDust();
IItemDefinition goldDust();
IItemDefinition certusQuartzDust();
IItemDefinition ironDust();
IItemDefinition netherQuartzDust();
IItemDefinition fluixDust();
IItemDefinition matterBall();
IItemDefinition certusQuartzDust();
IItemDefinition certusQuartzCrystal();
IItemDefinition netherQuartzDust();
IItemDefinition certusQuartzCrystalCharged();
IItemDefinition matterBall();
IItemDefinition fluixCrystal();
IItemDefinition certusQuartzCrystal();
IItemDefinition fluixPearl();
IItemDefinition certusQuartzCrystalCharged();
IItemDefinition woodenGear();
IItemDefinition fluixCrystal();
IItemDefinition wirelessReceiver();
IItemDefinition fluixPearl();
IItemDefinition wirelessBooster();
IItemDefinition woodenGear();
IItemDefinition annihilationCore();
IItemDefinition wirelessReceiver();
IItemDefinition formationCore();
IItemDefinition wirelessBooster();
IItemDefinition singularity();
IItemDefinition annihilationCore();
IItemDefinition qESingularity();
IItemDefinition formationCore();
IItemDefinition blankPattern();
IItemDefinition singularity();
IItemDefinition fluidCell1kPart();
IItemDefinition qESingularity();
IItemDefinition fluidCell4kPart();
IItemDefinition blankPattern();
IItemDefinition fluidCell16kPart();
IItemDefinition fluidCell1kPart();
IItemDefinition fluidCell64kPart();
IItemDefinition fluidCell4kPart();
IItemDefinition fluidCell16kPart();
IItemDefinition fluidCell64kPart();
}
@@ -28,47 +28,45 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import appeng.api.util.IConfigManager;
import net.minecraftforge.fml.common.network.IGuiHandler;
/**
* A handler for a wireless terminal.
*/
public interface IWirelessTermHandler extends INetworkEncodable
{
public interface IWirelessTermHandler extends INetworkEncodable {
/**
* @param is wireless terminal
*
* @return true, if usePower, hasPower, etc... can be called for the provided item
*/
boolean canHandle( ItemStack is );
/**
* @param is wireless terminal
* @return true, if usePower, hasPower, etc... can be called for the provided item
*/
boolean canHandle(ItemStack is);
/**
* use an amount of power, in AE units
*
* @param amount is in AE units ( 5 per MJ ), if you return false, the item should be dead and return false for
* hasPower
* @param is wireless terminal
*
* @return true if wireless terminal uses power
*/
boolean usePower( EntityPlayer player, double amount, ItemStack is );
/**
* use an amount of power, in AE units
*
* @param amount is in AE units ( 5 per MJ ), if you return false, the item should be dead and return false for
* hasPower
* @param is wireless terminal
* @return true if wireless terminal uses power
*/
boolean usePower(EntityPlayer player, double amount, ItemStack is);
/**
* gets the power status of the item.
*
* @param is wireless terminal
*
* @return returns true if there is any power left.
*/
boolean hasPower( EntityPlayer player, double amount, ItemStack is );
/**
* gets the power status of the item.
*
* @param is wireless terminal
* @return returns true if there is any power left.
*/
boolean hasPower(EntityPlayer player, double amount, ItemStack is);
/**
* Return the config manager for the wireless terminal.
*
* @param is wireless terminal
*
* @return config manager of wireless terminal
*/
IConfigManager getConfigManager( ItemStack is );
/**
* Return the config manager for the wireless terminal.
*
* @param is wireless terminal
* @return config manager of wireless terminal
*/
IConfigManager getConfigManager(ItemStack is);
IGuiHandler getGuiHandler(ItemStack is);
}
@@ -0,0 +1,7 @@
package appeng.api.implementations;
public interface IUpgradeableCellContainer {
int availableUpgrades();
void setupUpgrades();
}
@@ -0,0 +1,41 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2013 AlgorithmX2
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package appeng.api.implementations;
import appeng.api.config.Upgrades;
import appeng.api.implementations.tiles.ISegmentedInventory;
import appeng.api.util.IConfigurableObject;
public interface IUpgradeableCellHost extends IConfigurableObject, ISegmentedInventory {
/**
* determine how many of an upgrade are installed.
*/
default int getInstalledUpgrades(Upgrades u) {
return 0;
}
}
+1 -1
View File
@@ -22,7 +22,7 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
@API( apiVersion = "@aeversion@", owner = "appliedenergistics2", provides = "appliedenergistics2|API" )
@API(apiVersion = "rv6", owner = "appliedenergistics2", provides = "appliedenergistics2|API")
package appeng.api;
@@ -0,0 +1,11 @@
package com.enderio.core.common.interfaces;
import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull;
public interface IOverlayRenderAware {
public void renderItemOverlayIntoGUI(@Nonnull ItemStack stack, int xPosition, int yPosition);
}
@@ -22,6 +22,12 @@ package appeng.block;
import com.google.common.base.Preconditions;
import net.minecraft.block.Block;
import net.minecraft.block.BlockStairs;
import net.minecraft.block.state.IBlockState;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import javax.annotation.Nonnull;
public abstract class AEBaseStairBlock extends BlockStairs {
@@ -43,4 +49,9 @@ public abstract class AEBaseStairBlock extends BlockStairs {
return this.getClass().getSimpleName() + "[" + regName + "]";
}
@Override
public boolean doesSideBlockChestOpening(@Nonnull IBlockState blockState, @Nonnull IBlockAccess world, @Nonnull BlockPos pos, @Nonnull EnumFacing side) {
return false;
}
}
@@ -25,21 +25,31 @@ import appeng.bootstrap.components.StateMapperComponent;
import appeng.bootstrap.components.TesrComponent;
import appeng.client.render.model.AutoRotatingModel;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.block.statemap.IStateMapper;
import net.minecraft.client.renderer.color.IBlockColor;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.client.resources.IReloadableResourceManager;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.IResourceManagerReloadListener;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.client.resource.IResourceType;
import net.minecraftforge.client.resource.ISelectiveResourceReloadListener;
import net.minecraftforge.client.resource.VanillaResourceType;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.Predicate;
class BlockRendering implements IBlockRendering {
class BlockRendering implements IBlockRendering, ISelectiveResourceReloadListener {
@SideOnly(Side.CLIENT)
private BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> modelCustomizer;
@@ -56,6 +66,13 @@ class BlockRendering implements IBlockRendering {
@SideOnly(Side.CLIENT)
private final Map<String, IModel> builtInModels = new HashMap<>();
@SideOnly(Side.CLIENT)
private final List<IResourceManagerReloadListener> reloads = new ArrayList<>();
BlockRendering() {
((IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager()).registerReloadListener(this);
}
@Override
@SideOnly(Side.CLIENT)
public IBlockRendering modelCustomizer(BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer) {
@@ -103,7 +120,11 @@ class BlockRendering implements IBlockRendering {
} else if (block instanceof AEBaseTileBlock) {
// This is a default rotating model if the base-block uses an AE tile entity which exposes UP/FRONT as
// extended props
factory.addModelOverride(block.getRegistryName().getResourcePath(), (l, m) -> new AutoRotatingModel(m));
factory.addModelOverride(block.getRegistryName().getResourcePath(), (l, m) -> {
AutoRotatingModel model = new AutoRotatingModel(m);
BlockRendering.this.reloads.add(model);
return model;
});
}
// TODO : 1.12
@@ -117,4 +138,13 @@ class BlockRendering implements IBlockRendering {
factory.addBootstrapComponent(new StateMapperComponent(block, this.stateMapper));
}
}
@Override
@SideOnly(Side.CLIENT)
public void onResourceManagerReload(IResourceManager resourceManager, Predicate<IResourceType> resourcePredicate) {
if (resourcePredicate.test(VanillaResourceType.MODELS)) {
this.reloads.forEach(listener -> listener.onResourceManagerReload(resourceManager));
}
}
}
+39 -1
View File
@@ -35,6 +35,7 @@ import appeng.core.Api;
import appeng.core.AppEng;
import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketAssemblerAnimation;
import appeng.core.sync.packets.PacketTerminalUse;
import appeng.core.sync.packets.PacketValueConfig;
import appeng.entity.EntityFloatingItem;
import appeng.entity.EntityTinyTNTPrimed;
@@ -44,6 +45,8 @@ import appeng.helpers.HighlighterHandler;
import appeng.helpers.IMouseWheelItem;
import appeng.hooks.TickHandler;
import appeng.hooks.TickHandler.PlayerColor;
import appeng.items.tools.powered.Terminal;
import appeng.items.tools.powered.ToolWirelessTerminal;
import appeng.server.ServerHelper;
import appeng.util.Platform;
import net.minecraft.client.Minecraft;
@@ -59,12 +62,19 @@ import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.client.event.*;
import net.minecraftforge.client.model.ModelLoaderRegistry;
import net.minecraftforge.client.settings.KeyConflictContext;
import net.minecraftforge.client.settings.KeyModifier;
import net.minecraftforge.common.ForgeModContainer;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.client.registry.RenderingRegistry;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.InputEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import java.io.IOException;
@@ -73,11 +83,17 @@ import java.util.EnumMap;
import java.util.List;
import java.util.Random;
import static appeng.client.KeyBindings.WCT;
import static appeng.client.KeyBindings.WFT;
import static appeng.client.KeyBindings.WPT;
import static appeng.client.KeyBindings.WT;
public class ClientHelper extends ServerHelper {
private final static String KEY_CATEGORY = "key.appliedenergistics2.category";
public final static String KEY_CATEGORY = "key.appliedenergistics2.category";
private final EnumMap<ActionKey, KeyBinding> bindings = new EnumMap<>(ActionKey.class);
private final List<KeyBinding> keyBindings = new ArrayList<>();
@Override
public void preinit() {
@@ -99,6 +115,11 @@ public class ClientHelper extends ServerHelper {
this.bindings.put(key, binding);
}
for (KeyBindings k : KeyBindings.values()) {
ClientRegistry.registerKeyBinding(k.getKeyBinding());
this.keyBindings.add(k.getKeyBinding());
}
Api.INSTANCE.definitions().items().encodedPattern().maybeItem().ifPresent(pattern ->
Minecraft.getMinecraft().getItemColors().registerItemColorHandler(ItemEncodedPatternBakedModel.PATTERN_ITEM_COLOR_HANDLER, pattern));
}
@@ -319,6 +340,23 @@ public class ClientHelper extends ServerHelper {
}
}
@SubscribeEvent(priority = EventPriority.HIGHEST)
public void onInputEvent(final InputEvent.KeyInputEvent event) {
for (KeyBinding k : keyBindings) {
if (k.isPressed()) {
if (k == WT.getKeyBinding()) {
NetworkHandler.instance().sendToServer(new PacketTerminalUse(Terminal.WIRELESS_TERMINAL));
} else if (k == WCT.getKeyBinding()) {
NetworkHandler.instance().sendToServer(new PacketTerminalUse(Terminal.WIRELESS_CRAFTING_TERMINAL));
} else if (k == WPT.getKeyBinding()) {
NetworkHandler.instance().sendToServer(new PacketTerminalUse(Terminal.WIRELESS_PATTERN_TERMINAL));
} else if (k == WFT.getKeyBinding()) {
NetworkHandler.instance().sendToServer(new PacketTerminalUse(Terminal.WIRELESS_FLUID_TERMINAL));
}
}
}
}
@SubscribeEvent
public void onTextureStitch(final TextureStitchEvent.Pre event) {
ParticleTextures.registerSprite(event);
@@ -0,0 +1,28 @@
package appeng.client;
import net.minecraft.client.settings.KeyBinding;
import net.minecraftforge.client.settings.KeyConflictContext;
import net.minecraftforge.client.settings.KeyModifier;
import org.lwjgl.input.Keyboard;
import static appeng.client.ClientHelper.KEY_CATEGORY;
public enum KeyBindings {
WT(new KeyBinding("key.open_wireless_terminal.desc", KeyConflictContext.UNIVERSAL, KeyModifier.SHIFT, Keyboard.KEY_T, KEY_CATEGORY)),
WCT(new KeyBinding("key.open_wireless_crafting_terminal.desc", KeyConflictContext.UNIVERSAL, KeyModifier.SHIFT, Keyboard.KEY_E, KEY_CATEGORY)),
WPT(new KeyBinding("key.open_wireless_pattern_terminal.desc", KeyConflictContext.UNIVERSAL, KeyModifier.SHIFT, Keyboard.KEY_R, KEY_CATEGORY)),
WFT(new KeyBinding("key.open_wireless_fluid_terminal.desc", KeyConflictContext.UNIVERSAL, KeyModifier.SHIFT, Keyboard.KEY_F, KEY_CATEGORY));
private KeyBinding keyBinding;
KeyBindings(KeyBinding keyBinding) {
this.keyBinding = keyBinding;
}
;
public KeyBinding getKeyBinding() {
return keyBinding;
}
}
@@ -49,6 +49,7 @@ import mezz.jei.api.gui.IGhostIngredientHandler;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.GlStateManager;
@@ -568,7 +569,10 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
action = (mouseButton == 1) ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN;
stack = ((SlotME) slot).getAEStack();
if (stack != null && action == InventoryAction.PICKUP_OR_SET_DOWN && stack.getStackSize() == 0 && player.inventory.getItemStack().isEmpty()) {
if (stack != null
&& action == InventoryAction.PICKUP_OR_SET_DOWN
&& (stack.getStackSize() == 0 || GuiScreen.isAltKeyDown())
&& player.inventory.getItemStack().isEmpty()) {
action = InventoryAction.AUTO_CRAFT;
}
@@ -76,6 +76,11 @@ public abstract class AEBaseMEGui extends AEBaseGui {
currentToolTip.add(format);
}
if (myStack.isCraftable() && AEConfig.instance().isShowCraftableTooltip()) {
final String local = ButtonToolTips.ItemsCraftable.getLocal();
currentToolTip.add(TextFormatting.GRAY + local);
}
this.drawHoveringText(currentToolTip, x, y, this.fontRenderer);
return;
@@ -22,6 +22,7 @@ package appeng.client.gui.implementations;
import appeng.api.AEApi;
import appeng.api.definitions.IDefinitions;
import appeng.api.definitions.IParts;
import appeng.api.features.IWirelessTermHandler;
import appeng.api.storage.ITerminalHost;
import appeng.client.gui.AEBaseGui;
import appeng.client.gui.widgets.GuiNumberBox;
@@ -97,9 +98,8 @@ public class GuiCraftAmount extends AEBaseGui {
final IParts parts = definitions.parts();
if (target instanceof WirelessTerminalGuiObject) {
myIcon = definitions.items().wirelessTerminal().maybeStack(1).orElse(myIcon);
this.originalGui = GuiBridge.GUI_WIRELESS_TERM;
myIcon = ((WirelessTerminalGuiObject) target).getItemStack();
this.originalGui = (GuiBridge) AEApi.instance().registries().wireless().getWirelessTerminalHandler(myIcon).getGuiHandler(myIcon);
}
if (target instanceof PartTerminal) {
@@ -20,6 +20,7 @@ package appeng.client.gui.implementations;
import appeng.api.AEApi;
import appeng.api.features.IWirelessTermHandler;
import appeng.api.storage.ITerminalHost;
import appeng.api.storage.channels.IItemStorageChannel;
import appeng.api.storage.data.IAEItemStack;
@@ -84,7 +85,8 @@ public class GuiCraftConfirm extends AEBaseGui {
this.ccc.setGui(this);
if (te instanceof WirelessTerminalGuiObject) {
this.OriginalGui = GuiBridge.GUI_WIRELESS_TERM;
ItemStack itemStack = ((WirelessTerminalGuiObject) te).getItemStack();
this.OriginalGui = (GuiBridge) AEApi.instance().registries().wireless().getWirelessTerminalHandler(itemStack).getGuiHandler(itemStack);
}
if (te instanceof PartTerminal) {
@@ -26,6 +26,7 @@ package appeng.client.gui.implementations;
import appeng.api.AEApi;
import appeng.api.definitions.IDefinitions;
import appeng.api.definitions.IParts;
import appeng.api.features.IWirelessTermHandler;
import appeng.api.storage.ITerminalHost;
import appeng.api.storage.data.IAEItemStack;
import appeng.client.gui.widgets.GuiScrollbar;
@@ -33,6 +34,7 @@ import appeng.client.gui.widgets.GuiTabButton;
import appeng.container.implementations.ContainerCraftingStatus;
import appeng.container.implementations.CraftingCPUStatus;
import appeng.core.AELog;
import appeng.core.features.registries.WirelessRegistry;
import appeng.core.localization.GuiText;
import appeng.core.sync.GuiBridge;
import appeng.core.sync.network.NetworkHandler;
@@ -84,9 +86,8 @@ public class GuiCraftingStatus extends GuiCraftingCPU {
final IParts parts = definitions.parts();
if (target instanceof WirelessTerminalGuiObject) {
this.myIcon = definitions.items().wirelessTerminal().maybeStack(1).orElse(ItemStack.EMPTY);
this.originalGui = GuiBridge.GUI_WIRELESS_TERM;
myIcon = ((WirelessTerminalGuiObject) target).getItemStack();
this.originalGui = (GuiBridge) AEApi.instance().registries().wireless().getWirelessTerminalHandler(myIcon).getGuiHandler(myIcon);
}
if (target instanceof PartTerminal) {
@@ -82,8 +82,4 @@ public class GuiCraftingTerm extends GuiMEMonitorable {
protected String getBackground() {
return "guis/crafting.png";
}
public ItemRepo getRepo() {
return this.repo;
}
}
@@ -61,6 +61,7 @@ import java.util.List;
import java.util.*;
import static appeng.client.render.BlockPosHighlighter.hilightBlock;
import static appeng.helpers.ItemStackHelper.stackFromNBT;
public class GuiInterfaceConfigurationTerminal extends AEBaseGui implements IJEIGhostIngredients {
@@ -299,11 +300,7 @@ public class GuiInterfaceConfigurationTerminal extends AEBaseGui implements IJEI
for (int x = 0; x < current.getInventory().getSlots(); x++) {
final String which = Integer.toString(x);
if (invData.hasKey(which)) {
NBTTagCompound tag = invData.getCompoundTag(which);
current.getInventory().setStackInSlot(x, new ItemStack(tag));
if (tag.hasKey("stackSize")) {
current.getInventory().getStackInSlot(x).setCount(tag.getInteger("stackSize"));
}
current.getInventory().setStackInSlot(x, stackFromNBT(invData.getCompoundTag(which)));
}
}
} catch (final NumberFormatException ignored) {
@@ -22,6 +22,7 @@ package appeng.client.gui.implementations;
import appeng.api.AEApi;
import appeng.api.config.ActionItems;
import appeng.api.config.Settings;
import appeng.api.config.TerminalStyle;
import appeng.api.storage.channels.IItemStorageChannel;
import appeng.client.gui.AEBaseGui;
import appeng.client.gui.widgets.GuiImgButton;
@@ -30,6 +31,8 @@ import appeng.client.gui.widgets.MEGuiTextField;
import appeng.client.me.ClientDCInternalInv;
import appeng.client.me.SlotDisconnected;
import appeng.container.implementations.ContainerInterfaceTerminal;
import appeng.container.slot.AppEngSlot;
import appeng.core.AEConfig;
import appeng.core.localization.GuiText;
import appeng.helpers.DualityInterface;
import appeng.parts.reporting.PartInterfaceTerminal;
@@ -39,6 +42,7 @@ import com.google.common.collect.HashMultimap;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
@@ -46,20 +50,35 @@ import net.minecraft.nbt.NBTUtil;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextComponentString;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.fml.common.Loader;
import org.lwjgl.input.Mouse;
import java.awt.*;
import java.io.IOException;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.WeakHashMap;
import static appeng.client.render.BlockPosHighlighter.hilightBlock;
import static appeng.helpers.ItemStackHelper.stackFromNBT;
public class GuiInterfaceTerminal extends AEBaseGui {
private static final int LINES_ON_PAGE = 6;
private int rows = 6;
// TODO: copied from GuiMEMonitorable. It looks not changed, maybe unneeded?
private final int offsetX = 21;
private int maxRows = Integer.MAX_VALUE;
protected int jeiOffset = Loader.isModLoaded("jei") ? 24 : 0;
private int reservedSpace = 0;
private final HashMap<Long, ClientDCInternalInv> byId = new HashMap<>();
private final HashMultimap<String, ClientDCInternalInv> byName = HashMultimap.create();
@@ -78,7 +97,10 @@ public class GuiInterfaceTerminal extends AEBaseGui {
private final PartInterfaceTerminal partInterfaceTerminal;
private GuiButton guiButtonHide;
private GuiButton guiButtonNextAssembler;
private GuiImgButton terminalStyleBox;
private final HashMap<ClientDCInternalInv, Integer> dimHashMap = new HashMap<>();
private int drawnRows = 0;
public GuiInterfaceTerminal(final InventoryPlayer inventoryPlayer, final PartInterfaceTerminal te) {
super(new ContainerInterfaceTerminal(inventoryPlayer, te));
@@ -88,10 +110,33 @@ public class GuiInterfaceTerminal extends AEBaseGui {
this.setScrollBar(scrollbar);
this.xSize = 208;
this.ySize = 255;
this.setReservedSpace(82);
}
@Override
public void initGui() {
this.maxRows = AEConfig.instance()
.getConfigManager()
.getSetting(
Settings.TERMINAL_STYLE) != TerminalStyle.TALL ? 6 : Integer.MAX_VALUE;
final int magicNumber = 82 + 14;
final int extraSpace = this.height - magicNumber - this.reservedSpace;
this.rows = (int) Math.floor(extraSpace / 18);
if (this.rows > this.maxRows) {
this.rows = this.maxRows;
}
if (this.rows < 6) {
this.rows = 6;
}
this.ySize = magicNumber + this.rows * 18 + this.reservedSpace;
// this.guiTop = top;
final int unusedSpace = this.height - this.ySize;
this.guiTop = (int) Math.floor(unusedSpace / (unusedSpace < 0 ? 3.8f : 2.0f));
super.initGui();
this.getScrollBar().setLeft(189);
@@ -114,6 +159,17 @@ public class GuiInterfaceTerminal extends AEBaseGui {
this.searchFieldInputs.setText(partInterfaceTerminal.in);
this.searchFieldOutputs.setText(partInterfaceTerminal.out);
this.fontRenderer.drawString(this.getGuiDisplayName(GuiText.InterfaceTerminal.getLocal()), 8, 6, 4210752);
this.fontRenderer.drawString(GuiText.inventory.getLocal(), this.offsetX + 2, this.ySize - 96 + 3, 4210752);
}
protected void repositionSlot(final AppEngSlot s) {
this.ySize = 82 + 14 + this.drawnRows * 18 + this.reservedSpace;
s.yPos = s.getY() + this.ySize - 112;
s.xPos = s.getX() + 14;
}
@Override
@@ -122,13 +178,18 @@ public class GuiInterfaceTerminal extends AEBaseGui {
super.onGuiClosed();
}
@Override
public List<Rectangle> getJEIExclusionArea() {
Rectangle tallButton = new Rectangle(this.guiLeft - 18, this.guiTop + 24 + jeiOffset, 18, 18);
List<Rectangle> area = new ArrayList<>();
area.add(tallButton);
return area;
}
@Override
public void drawFG(final int offsetX, final int offsetY, final int mouseX, final int mouseY) {
this.buttonList.clear();
this.fontRenderer.drawString(this.getGuiDisplayName(GuiText.InterfaceTerminal.getLocal()), 8, 6, 4210752);
this.fontRenderer.drawString(GuiText.inventory.getLocal(), this.offsetX + 2, this.ySize - 96 + 3, 4210752);
final int currentScroll = this.getScrollBar().getCurrentScroll();
this.guiButtonNextAssembler = new GuiImgButton(guiLeft + 123, guiTop + 25, Settings.ACTIONS, ActionItems.FREE_MOLECULAR_SLOT_SHORTCUT);
@@ -137,11 +198,23 @@ public class GuiInterfaceTerminal extends AEBaseGui {
guiButtonHide = new GuiImgButton(guiLeft + 141, guiTop + 25, Settings.ACTIONS, this.partInterfaceTerminal.onlyInterfacesWithFreeSlots ? ActionItems.TOGGLE_SHOW_FULL_INTERFACES_OFF : ActionItems.TOGGLE_SHOW_FULL_INTERFACES_ON);
this.buttonList.add(guiButtonHide);
this.buttonList.add(this.terminalStyleBox = new GuiImgButton(this.guiLeft - 18, guiTop + 24 + jeiOffset, Settings.TERMINAL_STYLE, AEConfig.instance()
.getConfigManager()
.getSetting(Settings.TERMINAL_STYLE)));
this.inventorySlots.inventorySlots.removeIf(slot -> slot instanceof SlotDisconnected);
for (final Slot s : this.inventorySlots.inventorySlots) {
if (s instanceof AppEngSlot) {
if (s.xPos < 197) {
this.repositionSlot((AppEngSlot) s);
}
}
}
int offset = 52;
int linesDraw = 0;
for (int x = 0; x < LINES_ON_PAGE && linesDraw < LINES_ON_PAGE && currentScroll + x < this.lines.size(); x++) {
for (int x = 0; x < rows && linesDraw < rows && currentScroll + x < this.lines.size(); x++) {
final Object lineObj = this.lines.get(currentScroll + x);
if (lineObj instanceof ClientDCInternalInv) {
final ClientDCInternalInv inv = (ClientDCInternalInv) lineObj;
@@ -151,7 +224,7 @@ public class GuiInterfaceTerminal extends AEBaseGui {
this.buttonList.add(guiButton);
int extraLines = numUpgradesMap.get(inv);
for (int row = 0; row < 1 + extraLines && linesDraw < LINES_ON_PAGE; ++row) {
for (int row = 0; row < 1 + extraLines && linesDraw < rows; ++row) {
for (int z = 0; z < 9; z++) {
this.inventorySlots.inventorySlots.add(new SlotDisconnected(inv, z + (row * 9), (z * 18 + 22), offset));
if (this.matchedStacks.contains(inv.getInventory().getStackInSlot(z + (row * 9)))) {
@@ -226,6 +299,25 @@ public class GuiInterfaceTerminal extends AEBaseGui {
mc.player.closeScreen();
}
if (btn instanceof GuiImgButton) {
final boolean backwards = Mouse.isButtonDown(1);
final GuiImgButton iBtn = (GuiImgButton) btn;
if (iBtn.getSetting() != Settings.ACTIONS) {
final Enum cv = iBtn.getCurrentValue();
final Enum next = Platform.rotateEnum(cv, backwards, iBtn.getSetting().getPossibleValues());
if (btn == this.terminalStyleBox) {
AEConfig.instance().getConfigManager().putSetting(iBtn.getSetting(), next);
}
iBtn.set(next);
if (next.getClass() == TerminalStyle.class) {
this.reinitalize();
}
}
}
if (btn == guiButtonHide) {
partInterfaceTerminal.onlyInterfacesWithFreeSlots = !partInterfaceTerminal.onlyInterfacesWithFreeSlots;
this.refreshList();
@@ -246,15 +338,21 @@ public class GuiInterfaceTerminal extends AEBaseGui {
}
}
private void reinitalize() {
this.buttonList.clear();
this.initGui();
}
@Override
public void drawBG(final int offsetX, final int offsetY, final int mouseX, final int mouseY) {
this.bindTexture("guis/newinterfaceterminal.png");
this.drawTexturedModalRect(offsetX, offsetY, 0, 0, this.xSize, this.ySize);
//split the texture for the top
this.drawTexturedModalRect(offsetX, offsetY, 0, 0, this.xSize, 166);
int offset = 51;
final int ex = this.getScrollBar().getCurrentScroll();
int linesDraw = 0;
for (int x = 0; x < LINES_ON_PAGE && linesDraw < LINES_ON_PAGE && ex + x < this.lines.size(); x++) {
for (int x = 0; x < rows && linesDraw < rows && ex + x < this.lines.size(); x++) {
final Object lineObj = this.lines.get(ex + x);
if (lineObj instanceof ClientDCInternalInv) {
GlStateManager.color(1, 1, 1, 1);
@@ -262,16 +360,38 @@ public class GuiInterfaceTerminal extends AEBaseGui {
int extraLines = numUpgradesMap.get(lineObj);
for (int row = 0; row < 1 + extraLines && linesDraw < LINES_ON_PAGE; ++row) {
for (int row = 0; row < 1 + extraLines && linesDraw < rows; ++row) {
if (linesDraw == 6) {
this.drawTexturedModalRect(offsetX, offsetY + offset + 7, 0, 166, 190, 7);
this.drawTexturedModalRect(offsetX, offsetY + offset + 14, 0, 166, 190, 4);
} else if (linesDraw >= 7) {
this.drawTexturedModalRect(offsetX, offsetY + offset, 0, 173, 190, 18);
}
this.drawTexturedModalRect(offsetX + 20, offsetY + offset, 20, 173, width, 18);
offset += 18;
linesDraw++;
}
} else {
if (linesDraw == 6) {
this.drawTexturedModalRect(offsetX, offsetY + offset + 7, 0, 166, 190, 7);
this.drawTexturedModalRect(offsetX, offsetY + offset + 14, 0, 166, 190, 4);
this.drawTexturedModalRect(offsetX, offsetY + offset, 0, 53, 183, 18);
} else if (linesDraw >= 7) {
this.drawTexturedModalRect(offsetX, offsetY + offset, 0, 53, 183, 18);
this.drawTexturedModalRect(offsetX + 183, offsetY + offset, 183, 166, 7, 18);
}
offset += 18;
linesDraw++;
}
}
offset = 51 + Math.max(6 * 18, linesDraw * 18);
if (linesDraw > 6) {
this.drawTexturedModalRect(offsetX, offsetY + offset, 0, 166, 190, 7);
}
this.drawTexturedModalRect(offsetX, offsetY + offset + 7, 0, 166, this.xSize, 90);
this.drawnRows = Math.max(6, linesDraw);
if (this.searchFieldInputs != null) {
this.searchFieldInputs.drawTextBox();
@@ -321,7 +441,7 @@ public class GuiInterfaceTerminal extends AEBaseGui {
for (int x = 0; x < current.getInventory().getSlots(); x++) {
final String which = Integer.toString(x);
if (invData.hasKey(which)) {
current.getInventory().setStackInSlot(x, new ItemStack(invData.getCompoundTag(which)));
current.getInventory().setStackInSlot(x, stackFromNBT(invData.getCompoundTag(which)));
}
}
} catch (final NumberFormatException ignored) {
@@ -444,7 +564,7 @@ public class GuiInterfaceTerminal extends AEBaseGui {
final NBTTagCompound encodedValue = itemStack.getTagCompound();
if (encodedValue == null) {
return false;
return searchTerm.matches(GuiText.InvalidPattern.getLocal());
}
NBTTagList tag = new NBTTagList();
@@ -522,4 +642,12 @@ public class GuiInterfaceTerminal extends AEBaseGui {
return o;
}
int getReservedSpace() {
return this.reservedSpace;
}
void setReservedSpace(final int reservedSpace) {
this.reservedSpace = reservedSpace;
}
}
@@ -319,7 +319,6 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
this.searchField.setText(memoryText);
this.searchField.selectAll();
this.repo.setSearchString(memoryText);
this.repo.updateView();
this.setScrollBar();
}
@@ -381,7 +380,6 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
if (btn == 1 && this.searchField.isMouseIn(xCoord, yCoord)) {
this.searchField.setText("");
this.repo.setSearchString("");
this.repo.updateView();
this.setScrollBar();
}
@@ -442,7 +440,7 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
return this.repo.hasPower();
}
int getMaxRows() {
protected int getMaxRows() {
return AEConfig.instance().getConfigManager().getSetting(Settings.TERMINAL_STYLE) == TerminalStyle.SMALL ? 6 : Integer.MAX_VALUE;
}
@@ -476,7 +474,6 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
if (this.searchField.textboxKeyTyped(character, key)) {
this.repo.setSearchString(this.searchField.getText());
this.repo.updateView();
this.setScrollBar();
// tell forge the key event is handled and should not be sent out
this.keyHandled = mouseInGui;
@@ -20,22 +20,17 @@ package appeng.client.gui.implementations;
import appeng.api.implementations.guiobjects.IPortableCell;
import appeng.container.implementations.ContainerMEPortableCell;
import net.minecraft.entity.player.InventoryPlayer;
public class GuiMEPortableCell extends GuiMEMonitorable {
public GuiMEPortableCell(final InventoryPlayer inventoryPlayer, final IPortableCell te) {
super(inventoryPlayer, te, new ContainerMEPortableCell(inventoryPlayer, te));
super(inventoryPlayer, te);
}
int defaultGetMaxRows() {
return super.getMaxRows();
}
@Override
int getMaxRows() {
protected int getMaxRows() {
return 3;
}
}
@@ -34,7 +34,7 @@ public class GuiOreDictStorageBus extends AEBaseGui {
private GuiImgButton partition;
private GuiImgButton storageFilter;
private GuiImgButton rwMode;
private static final Pattern ORE_DICTIONARY_FILTER = Pattern.compile("[(!]* *[0-9a-zA-Z*]* *\\)*( *[&|^]? *[(!]* *[0-9a-zA-Z*]* *\\)*)*");
private static final Pattern ORE_DICTIONARY_FILTER = Pattern.compile("[0-9a-zA-Z* &|^!()]*");
private MEGuiTextField searchFieldInputs;
public GuiOreDictStorageBus(final InventoryPlayer inventoryPlayer, final PartOreDicStorageBus te) {
@@ -25,7 +25,9 @@ import appeng.api.config.Settings;
import appeng.api.storage.ITerminalHost;
import appeng.client.gui.widgets.GuiImgButton;
import appeng.client.gui.widgets.GuiTabButton;
import appeng.container.implementations.ContainerPatternEncoder;
import appeng.container.implementations.ContainerPatternTerm;
import appeng.container.implementations.ContainerWirelessPatternTerminal;
import appeng.container.interfaces.IJEIGhostIngredients;
import appeng.container.slot.AppEngSlot;
import appeng.container.slot.SlotFake;
@@ -35,6 +37,7 @@ import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketInventoryAction;
import appeng.core.sync.packets.PacketValueConfig;
import appeng.helpers.InventoryAction;
import appeng.helpers.WirelessTerminalGuiObject;
import appeng.util.item.AEItemStack;
import mezz.jei.api.gui.IGhostIngredientHandler.Target;
import net.minecraft.client.gui.GuiButton;
@@ -60,7 +63,7 @@ public class GuiPatternTerm extends GuiMEMonitorable implements IJEIGhostIngredi
private static final String CRAFTMODE_CRFTING = "1";
private static final String CRAFTMODE_PROCESSING = "0";
private final ContainerPatternTerm container;
private final ContainerPatternEncoder container;
private GuiTabButton tabCraftButton;
private GuiTabButton tabProcessButton;
@@ -83,6 +86,12 @@ public class GuiPatternTerm extends GuiMEMonitorable implements IJEIGhostIngredi
this.setReservedSpace(81);
}
public GuiPatternTerm(final InventoryPlayer inventoryPlayer, WirelessTerminalGuiObject te, final ContainerWirelessPatternTerminal wpt) {
super(inventoryPlayer, te, wpt);
this.container = (ContainerWirelessPatternTerminal) this.inventorySlots;
this.setReservedSpace(81);
}
@Override
protected void actionPerformed(final GuiButton btn) {
super.actionPerformed(btn);
@@ -41,7 +41,7 @@ public class GuiQNB extends AEBaseGui {
@Override
public void drawBG(final int offsetX, final int offsetY, final int mouseX, final int mouseY) {
this.bindTexture("guis/chest.png");
this.bindTexture("guis/qbgui.png");
this.drawTexturedModalRect(offsetX, offsetY, 0, 0, this.xSize, this.ySize);
}
}
@@ -0,0 +1,93 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.client.gui.implementations;
import appeng.api.config.ActionItems;
import appeng.api.config.Settings;
import appeng.client.gui.widgets.GuiImgButton;
import appeng.client.me.ItemRepo;
import appeng.container.implementations.ContainerWirelessCraftingTerminal;
import appeng.container.slot.SlotCraftingMatrix;
import appeng.core.localization.GuiText;
import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketInventoryAction;
import appeng.helpers.InventoryAction;
import appeng.helpers.WirelessTerminalGuiObject;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
public class GuiWirelessCraftingTerminal extends GuiMEMonitorable {
private GuiImgButton clearBtn;
public GuiWirelessCraftingTerminal(final InventoryPlayer inventoryPlayer, final WirelessTerminalGuiObject te) {
super(inventoryPlayer, te, new ContainerWirelessCraftingTerminal(inventoryPlayer, te));
this.setReservedSpace(73);
}
@Override
protected void actionPerformed(final GuiButton btn) {
super.actionPerformed(btn);
if (this.clearBtn == btn) {
Slot s = null;
final Container c = this.inventorySlots;
for (final Object j : c.inventorySlots) {
if (j instanceof SlotCraftingMatrix) {
s = (Slot) j;
}
}
if (s != null) {
final PacketInventoryAction p = new PacketInventoryAction(InventoryAction.MOVE_REGION, s.slotNumber, 0);
NetworkHandler.instance().sendToServer(p);
}
}
}
@Override
public void initGui() {
super.initGui();
this.buttonList.add(this.clearBtn = new GuiImgButton(this.guiLeft + 92, this.guiTop + this.ySize - 156, Settings.ACTIONS, ActionItems.STASH));
this.clearBtn.setHalfSize(true);
}
@Override
public void drawFG(final int offsetX, final int offsetY, final int mouseX, final int mouseY) {
super.drawFG(offsetX, offsetY, mouseX, mouseY);
this.fontRenderer.drawString(GuiText.CraftingTerminal.getLocal(), 8, this.ySize - 96 + 1 - this.getReservedSpace(), 4210752);
}
@Override
public void drawBG(int offsetX, int offsetY, int mouseX, int mouseY) {
this.bindTexture("guis/wirelessupgrades.png");
Gui.drawModalRectWithCustomSizedTexture(offsetX + 198, offsetY + 127, 0, 0, 32, 32, 32, 32);
super.drawBG(offsetX, offsetY, mouseX, mouseY);
}
@Override
protected String getBackground() {
return "guis/crafting.png";
}
}
@@ -0,0 +1,41 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.client.gui.implementations;
import appeng.container.implementations.ContainerWirelessPatternTerminal;
import appeng.helpers.WirelessTerminalGuiObject;
import net.minecraft.client.gui.Gui;
import net.minecraft.entity.player.InventoryPlayer;
public class GuiWirelessPatternTerminal extends GuiPatternTerm {
public GuiWirelessPatternTerminal(final InventoryPlayer inventoryPlayer, final WirelessTerminalGuiObject te) {
super(inventoryPlayer, te, new ContainerWirelessPatternTerminal(inventoryPlayer, te));
this.setReservedSpace(81);
}
@Override
public void drawBG(int offsetX, int offsetY, int mouseX, int mouseY) {
this.bindTexture("guis/wirelessupgrades.png");
Gui.drawModalRectWithCustomSizedTexture(offsetX + 198, offsetY + 127, 0, 0, 32, 32, 32, 32);
super.drawBG(offsetX, offsetY, mouseX, mouseY);
}
}
@@ -20,17 +20,22 @@ package appeng.client.gui.implementations;
import appeng.api.implementations.guiobjects.IPortableCell;
import appeng.container.implementations.ContainerWirelessTerm;
import appeng.helpers.WirelessTerminalGuiObject;
import net.minecraft.client.gui.Gui;
import net.minecraft.entity.player.InventoryPlayer;
public class GuiWirelessTerm extends GuiMEPortableCell {
public class GuiWirelessTerm extends GuiMEMonitorable {
public GuiWirelessTerm(final InventoryPlayer inventoryPlayer, final IPortableCell te) {
super(inventoryPlayer, te);
public GuiWirelessTerm(final InventoryPlayer inventoryPlayer, final WirelessTerminalGuiObject te) {
super(inventoryPlayer, te, new ContainerWirelessTerm(inventoryPlayer, te));
}
@Override
int getMaxRows() {
return this.defaultGetMaxRows();
public void drawBG(int offsetX, int offsetY, int mouseX, int mouseY) {
this.bindTexture("guis/wirelessupgrades.png");
Gui.drawModalRectWithCustomSizedTexture(offsetX + 198, offsetY + 127, 0, 0, 32, 32, 32, 32);
super.drawBG(offsetX, offsetY, mouseX, mouseY);
}
}
@@ -37,6 +37,9 @@ public class GuiNumberBox extends GuiTextField {
final String original = this.getText();
super.writeText(selectedText);
if (this.getText().isEmpty()) {
return;
}
try {
if (this.type == int.class || this.type == Integer.class) {
Integer.parseInt(this.getText());
+125 -71
View File
@@ -37,7 +37,7 @@ import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Pattern;
@@ -45,7 +45,7 @@ import java.util.regex.Pattern;
public class ItemRepo {
private final IItemList<IAEItemStack> list = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList();
private final ArrayList<IAEItemStack> view = new ArrayList<>();
private List<IAEItemStack> view = new ArrayList<>();
private final IScrollSource src;
private final ISortSource sortSrc;
@@ -56,6 +56,16 @@ public class ItemRepo {
private String innerSearch = "";
private boolean hasPower;
private Enum lastView;
private Enum lastSearchMode;
private Enum lastSortBy;
private Enum lastSortDir;
private String lastSearch = "";
private boolean resort = true;
private boolean changed = false;
public ItemRepo(final IScrollSource src, final ISortSource sortSrc) {
this.src = src;
this.sortSrc = sortSrc;
@@ -83,6 +93,8 @@ public class ItemRepo {
} else {
this.list.add(is);
}
changed = true;
}
public long getItemCount(final IAEItemStack is) {
@@ -92,22 +104,88 @@ public class ItemRepo {
public void setViewCell(final ItemStack[] list) {
this.myPartitionList = ItemViewCell.createFilter(list);
this.updateView();
this.changed = true;
}
public void updateView() {
this.view.clear();
this.view.ensureCapacity(this.list.size());
final Enum viewMode = this.sortSrc.getSortDisplay();
if (lastView != viewMode) {
resort = true;
lastView = viewMode;
}
final Enum searchMode = AEConfig.instance().getConfigManager().getSetting(Settings.SEARCH_MODE);
final boolean needsZeroCopy = viewMode == ViewItems.CRAFTABLE;
if (lastSearchMode != searchMode) {
resort = true;
lastSearchMode = searchMode;
}
if (searchMode == SearchBoxMode.JEI_AUTOSEARCH || searchMode == SearchBoxMode.JEI_MANUAL_SEARCH || searchMode == SearchBoxMode.JEI_AUTOSEARCH_KEEP || searchMode == SearchBoxMode.JEI_MANUAL_SEARCH_KEEP) {
this.updateJEI(this.searchString);
}
if (!lastSearch.equals(searchString)) {
resort = true;
lastSearch = searchString;
}
final Enum sortBy = this.sortSrc.getSortBy();
final Enum sortDir = this.sortSrc.getSortDir();
if (lastSortBy != sortBy) {
resort = true;
lastSortBy = sortBy;
}
if (lastSortDir != sortDir) {
resort = true;
lastSortDir = sortDir;
}
if (changed || resort) {
changed = false;
resort = false;
view = new ArrayList<>();
ItemSorters.setDirection((appeng.api.config.SortDir) sortDir);
ItemSorters.init();
Comparator<IAEItemStack> c = getComparator(sortBy);
for (IAEItemStack is : this.list) {
addIAE(is, viewMode);
}
view.sort(c);
}
}
private static Comparator<IAEItemStack> getComparator(Enum sortBy) {
Comparator<IAEItemStack> c;
if (sortBy == SortOrder.MOD) {
c = ItemSorters.CONFIG_BASED_SORT_BY_MOD;
} else if (sortBy == SortOrder.AMOUNT) {
c = ItemSorters.CONFIG_BASED_SORT_BY_SIZE;
} else if (sortBy == SortOrder.INVTWEAKS) {
if (InventoryBogoSortModule.isLoaded()) {
c = InventoryBogoSortModule.COMPARATOR;
} else {
c = ItemSorters.CONFIG_BASED_SORT_BY_INV_TWEAKS;
}
} else {
c = ItemSorters.CONFIG_BASED_SORT_BY_NAME;
}
return c;
}
private void addIAE(IAEItemStack is, Enum viewMode) {
final boolean needsZeroCopy = viewMode == ViewItems.CRAFTABLE;
final boolean terminalSearchToolTips = AEConfig.instance().getConfigManager().getSetting(Settings.SEARCH_TOOLTIPS) != YesNo.NO;
boolean searchMod = false;
@@ -129,76 +207,52 @@ public class ItemRepo {
}
}
boolean notDone = false;
for (IAEItemStack is : this.list) {
if (this.myPartitionList != null) {
if (!this.myPartitionList.isListed(is)) {
continue;
}
}
if (viewMode == ViewItems.CRAFTABLE && !is.isCraftable()) {
continue;
}
if (viewMode == ViewItems.STORED && is.getStackSize() == 0) {
continue;
}
final String dspName = (searchMod ? Platform.getModId(is) : Platform.getItemDisplayName(is)).toLowerCase();
boolean foundMatchingItemStack = true;
for (String term : innerSearch.split(" ")) {
if (term.length() > 1 && (term.startsWith("-") || term.startsWith("!"))) {
term = term.substring(1);
if (dspName.contains(term)) {
foundMatchingItemStack = false;
break;
}
} else if (!dspName.contains(term)) {
foundMatchingItemStack = false;
break;
}
}
if (terminalSearchToolTips && !foundMatchingItemStack) {
final List<String> tooltip = Platform.getTooltip(is);
for (final String line : tooltip) {
if (m.matcher(line).find()) {
foundMatchingItemStack = true;
break;
}
}
}
if (foundMatchingItemStack) {
if (needsZeroCopy) {
is = is.copy();
is.setStackSize(0);
}
this.view.add(is);
if (this.myPartitionList != null) {
if (!this.myPartitionList.isListed(is)) {
return;
}
}
final Enum SortBy = this.sortSrc.getSortBy();
final Enum SortDir = this.sortSrc.getSortDir();
if (viewMode == ViewItems.CRAFTABLE && !is.isCraftable()) {
return;
}
ItemSorters.setDirection((appeng.api.config.SortDir) SortDir);
ItemSorters.init();
if (viewMode == ViewItems.STORED && is.getStackSize() == 0) {
return;
}
if (SortBy == SortOrder.MOD) {
Collections.sort(this.view, ItemSorters.CONFIG_BASED_SORT_BY_MOD);
} else if (SortBy == SortOrder.AMOUNT) {
Collections.sort(this.view, ItemSorters.CONFIG_BASED_SORT_BY_SIZE);
} else if (SortBy == SortOrder.INVTWEAKS) {
if (InventoryBogoSortModule.isLoaded()) {
Collections.sort(this.view, InventoryBogoSortModule.COMPARATOR);
} else {
Collections.sort(this.view, ItemSorters.CONFIG_BASED_SORT_BY_INV_TWEAKS);
final String dspName = (searchMod ? Platform.getModId(is) : Platform.getItemDisplayName(is)).toLowerCase();
boolean foundMatchingItemStack = true;
for (String term : innerSearch.split(" ")) {
if (term.length() > 1 && (term.startsWith("-") || term.startsWith("!"))) {
term = term.substring(1);
if (dspName.contains(term)) {
foundMatchingItemStack = false;
break;
}
} else if (!dspName.contains(term)) {
foundMatchingItemStack = false;
break;
}
} else {
Collections.sort(this.view, ItemSorters.CONFIG_BASED_SORT_BY_NAME);
}
if (terminalSearchToolTips && !foundMatchingItemStack) {
final List<String> tooltip = Platform.getTooltip(is);
for (final String line : tooltip) {
if (m.matcher(line).find()) {
foundMatchingItemStack = true;
break;
}
}
}
if (foundMatchingItemStack) {
if (needsZeroCopy) {
is = is.copy();
is.setStackSize(0);
}
this.view.add(is);
}
}
@@ -26,6 +26,7 @@ import appeng.util.ISlimReadableNumberConverter;
import appeng.util.IWideReadableNumberConverter;
import appeng.util.ReadableNumberConverter;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.GlStateManager;
@@ -48,7 +49,7 @@ public class StackSizeRenderer {
final boolean unicodeFlag = fontRenderer.getUnicodeFlag();
fontRenderer.setUnicodeFlag(false);
if (aeStack.getStackSize() == 0 && aeStack.isCraftable()) {
if ((aeStack.getStackSize() == 0 || GuiScreen.isAltKeyDown()) && aeStack.isCraftable()) {
final String craftLabelText = AEConfig.instance().useTerminalUseLargeFont() ? GuiText.LargeFontCraft.getLocal() : GuiText.SmallFontCraft
.getLocal();
GlStateManager.disableLighting();
@@ -64,8 +65,7 @@ public class StackSizeRenderer {
GlStateManager.enableDepth();
GlStateManager.enableBlend();
}
if (aeStack.getStackSize() > 0) {
else if (aeStack.getStackSize() > 0) {
final String stackSize = this.getToBeRenderedStackSize(aeStack.getStackSize());
GlStateManager.disableLighting();
@@ -22,6 +22,7 @@ package appeng.client.render.cablebus;
import appeng.api.util.AECableType;
import appeng.api.util.AEColor;
import appeng.core.AppEng;
import appeng.core.AEConfig;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat;
@@ -327,8 +328,8 @@ class CableBuilder {
TextureAtlasSprite texture = this.connectionTextures.get(AECableType.SMART).get(cableColor);
cubeBuilder.setTexture(texture);
TextureAtlasSprite oddChannel = this.smartCableTextures.getOddTextureForChannels(channels);
TextureAtlasSprite evenChannel = this.smartCableTextures.getEvenTextureForChannels(channels);
TextureAtlasSprite oddChannel = this.smartCableTextures.getOddTextureForChannels((int) (channels / (AEConfig.instance().getNormalChannelCapacity() / 8)));
TextureAtlasSprite evenChannel = this.smartCableTextures.getEvenTextureForChannels((int) (channels / (AEConfig.instance().getNormalChannelCapacity() / 8)));
// For to-machine connections, use a thicker end-cap for the connection
if (connectionType != AECableType.GLASS && !cableBusAdjacent) {
@@ -374,8 +375,8 @@ class CableBuilder {
addStraightCoveredCableSizedCube(facing, cubeBuilder);
TextureAtlasSprite oddChannel = this.smartCableTextures.getOddTextureForChannels(channels);
TextureAtlasSprite evenChannel = this.smartCableTextures.getEvenTextureForChannels(channels);
TextureAtlasSprite oddChannel = this.smartCableTextures.getOddTextureForChannels((int) (channels / (AEConfig.instance().getNormalChannelCapacity() / 8)));
TextureAtlasSprite evenChannel = this.smartCableTextures.getEvenTextureForChannels((int) (channels / (AEConfig.instance().getNormalChannelCapacity() / 8)));
// Render the channel indicators brightly lit at night
cubeBuilder.setRenderFullBright(true);
@@ -403,8 +404,8 @@ class CableBuilder {
addCoveredCableSizedCube(facing, distanceFromEdge, cubeBuilder);
TextureAtlasSprite oddChannel = this.smartCableTextures.getOddTextureForChannels(channels);
TextureAtlasSprite evenChannel = this.smartCableTextures.getEvenTextureForChannels(channels);
TextureAtlasSprite oddChannel = this.smartCableTextures.getOddTextureForChannels((int) (channels / (AEConfig.instance().getNormalChannelCapacity() / 8)));
TextureAtlasSprite evenChannel = this.smartCableTextures.getEvenTextureForChannels((int) (channels / (AEConfig.instance().getNormalChannelCapacity() / 8)));
// Render the channel indicators brightly lit at night
cubeBuilder.setRenderFullBright(true);
@@ -464,7 +465,7 @@ class CableBuilder {
addDenseCableSizedCube(facing, cubeBuilder);
// Dense cables show used channels in groups of 4, rounded up
channels = (channels + 3) / 4;
channels = (int) ((channels + 3) / 4) / (AEConfig.instance().getDenseChannelCapacity() / 32);
TextureAtlasSprite oddChannel = this.smartCableTextures.getOddTextureForChannels(channels);
TextureAtlasSprite evenChannel = this.smartCableTextures.getEvenTextureForChannels(channels);
@@ -508,7 +509,7 @@ class CableBuilder {
addStraightDenseCableSizedCube(facing, cubeBuilder);
// Dense cables show used channels in groups of 4, rounded up
channels = (channels + 3) / 4;
channels = (int) ((channels + 3) / 4) / (AEConfig.instance().getDenseChannelCapacity() / 32);
TextureAtlasSprite oddChannel = this.smartCableTextures.getOddTextureForChannels(channels);
TextureAtlasSprite evenChannel = this.smartCableTextures.getEvenTextureForChannels(channels);
@@ -45,7 +45,7 @@ import java.util.Map.Entry;
public class CableBusBakedModel implements IBakedModel {
private static final Map<CableBusRenderState, List<BakedQuad>> CABLE_MODEL_CACHE = new HashMap<>();
static final Map<CableBusRenderState, List<BakedQuad>> CABLE_MODEL_CACHE = new HashMap<>();
private final CableBuilder cableBuilder;
@@ -27,21 +27,26 @@ import com.google.common.collect.ImmutableMap;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.client.model.ModelLoaderRegistry;
import net.minecraftforge.client.resource.IResourceType;
import net.minecraftforge.client.resource.ISelectiveResourceReloadListener;
import net.minecraftforge.client.resource.VanillaResourceType;
import net.minecraftforge.common.model.IModelState;
import net.minecraftforge.common.model.TRSRTransformation;
import java.util.Collection;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Predicate;
/**
* The built-in model for the cable bus block.
*/
public class CableBusModel implements IModel {
public class CableBusModel implements IModel, ISelectiveResourceReloadListener {
private final PartModels partModels;
@@ -101,4 +106,12 @@ public class CableBusModel implements IModel {
public IModelState getDefaultState() {
return TRSRTransformation.identity();
}
@Override
public void onResourceManagerReload(IResourceManager resourceManager, Predicate<IResourceType> resourcePredicate) {
if (resourcePredicate.test(VanillaResourceType.MODELS)) {
CableBusBakedModel.CABLE_MODEL_CACHE.clear();
}
}
}
@@ -21,7 +21,6 @@ package appeng.client.render.model;
import appeng.block.AEBaseTileBlock;
import appeng.client.render.FacingToRotation;
import com.google.common.base.Objects;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
@@ -31,22 +30,21 @@ import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
import net.minecraft.client.renderer.block.model.ItemOverrideList;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.client.renderer.vertex.VertexFormatElement;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.IResourceManagerReloadListener;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.Vec3i;
import net.minecraftforge.client.model.pipeline.IVertexConsumer;
import net.minecraftforge.client.model.pipeline.QuadGatheringTransformer;
import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad;
import net.minecraftforge.common.property.IExtendedBlockState;
import javax.vecmath.Vector3f;
import javax.vecmath.Matrix4f;
import javax.vecmath.Tuple4f;
import javax.vecmath.Vector4f;
import java.util.ArrayList;
import java.util.List;
import static net.minecraft.util.EnumFacing.DOWN;
public class AutoRotatingModel implements IBakedModel {
public class AutoRotatingModel implements IBakedModel, IResourceManagerReloadListener {
private final IBakedModel parent;
private final LoadingCache<AutoRotatingCacheKey, List<BakedQuad>> quadCache;
@@ -66,34 +64,171 @@ public class AutoRotatingModel implements IBakedModel {
FacingToRotation f2r = FacingToRotation.get(forward, up);
List<BakedQuad> original = AutoRotatingModel.this.parent.getQuads(state, f2r.resultingRotate(side), 0);
List<BakedQuad> rotated = new ArrayList<>(original.size());
for (BakedQuad quad : original) {
VertexFormat format = quad.getFormat();
UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(format);
VertexRotator rot = new VertexRotator(f2r, quad.getFace());
rot.setParent(builder);
quad.pipe(rot);
if (quad.getFace() != null) {
builder.setQuadOrientation(f2r.rotate(quad.getFace()));
} else {
builder.setQuadOrientation(null);
}
BakedQuad unpackedQuad = builder.build();
final Matrix4f transformMatrix = new Matrix4f();
final Tuple4f vertexTransformingVec = new Vector4f();
// Make a copy of it to resolve the vertex data and throw away the unpacked stuff
// This also fixes a bug in Forge's UnpackedBakedQuad, which unpacks a byte-based normal like 0,0,-1
// to 0,0,-0.99607843. We replace these normals with the proper 0,0,-1 when rotation, which
// causes a bug in the AO lighter, if an unpacked quad pipes this value back to it.
// Packing it back to the vanilla vertex format will fix this inconsistency because it converts
// the normal back to a byte-based format, which then re-applies Forge's own bug when piping it
// to the AO lighter, thus fixing our problem.
BakedQuad packedQuad = new BakedQuad(unpackedQuad.getVertexData(), quad.getTintIndex(), unpackedQuad.getFace(), quad.getSprite(), quad
.shouldApplyDiffuseLighting(), quad.getFormat());
rotated.add(packedQuad);
// Transform the matrix so the top and front facings of the model matches the block in-world
transformMatrixByFacings(transformMatrix, up, forward);
for (BakedQuad b : original) {
EnumFacing newFace = f2r.rotate(b.getFace());
rotated.add(rebakeQuad(b, newFace, transformMatrix, vertexTransformingVec));
}
return rotated;
}
private void transformMatrixByFacings(Matrix4f transformMatrix, EnumFacing topFacing, EnumFacing frontFacing) {
Matrix4f intermediaryMatrix = new Matrix4f();
transformMatrix.setIdentity();
moveToPivot(transformMatrix, intermediaryMatrix, true);
if (topFacing.getAxis() == EnumFacing.Axis.Y) {
switch (frontFacing) {
case NORTH:
rotateY(transformMatrix, intermediaryMatrix, (float) (0));
break;
case SOUTH:
rotateY(transformMatrix, intermediaryMatrix, (float) (-Math.PI));
break;
case EAST:
rotateY(transformMatrix, intermediaryMatrix, (float) (-Math.PI / 2));
break;
case WEST:
rotateY(transformMatrix, intermediaryMatrix, (float) (Math.PI / 2));
break;
}
if (topFacing == DOWN) {
rotateX(transformMatrix, intermediaryMatrix, (float) (Math.PI));
rotateY(transformMatrix, intermediaryMatrix, (float) (Math.PI));
}
} else {
switch (topFacing) {
case WEST:
rotateZ(transformMatrix, intermediaryMatrix, (float) (Math.PI / 2));
switch (frontFacing) {
case DOWN:
rotateY(transformMatrix, intermediaryMatrix, (float) (-Math.PI / 2));
break;
case UP:
rotateY(transformMatrix, intermediaryMatrix, (float) (+Math.PI / 2));
break;
case SOUTH:
rotateY(transformMatrix, intermediaryMatrix, (float) (Math.PI));
}
break;
case EAST:
rotateZ(transformMatrix, intermediaryMatrix, (float) (-Math.PI / 2));
switch (frontFacing) {
case DOWN:
rotateY(transformMatrix, intermediaryMatrix, (float) (Math.PI / 2));
break;
case UP:
rotateY(transformMatrix, intermediaryMatrix, (float) (-Math.PI / 2));
break;
case SOUTH:
rotateY(transformMatrix, intermediaryMatrix, (float) (-Math.PI));
}
break;
case NORTH:
rotateX(transformMatrix, intermediaryMatrix, (float) (-Math.PI / 2));
switch (frontFacing) {
case DOWN:
rotateY(transformMatrix, intermediaryMatrix, (float) (Math.PI));
break;
case EAST:
rotateY(transformMatrix, intermediaryMatrix, (float) (-Math.PI / 2));
break;
case WEST:
rotateY(transformMatrix, intermediaryMatrix, (float) (Math.PI / 2));
}
break;
default:
rotateX(transformMatrix, intermediaryMatrix, (float) (Math.PI / 2));
switch (frontFacing) {
case UP:
rotateY(transformMatrix, intermediaryMatrix, (float) (Math.PI));
break;
case EAST:
rotateY(transformMatrix, intermediaryMatrix, (float) (-Math.PI / 2));
break;
case SOUTH:
rotateY(transformMatrix, intermediaryMatrix, (float) (Math.PI / 2));
break;
case WEST:
rotateY(transformMatrix, intermediaryMatrix, (float) (Math.PI / 2));
break;
}
}
if (frontFacing.getAxis() == EnumFacing.Axis.Y) {
//rotateX(transformMatrix, intermediaryMatrix, (float) (Math.PI));
rotateY(transformMatrix, intermediaryMatrix, (float) (Math.PI));
}
}
moveToPivot(transformMatrix, intermediaryMatrix, false);
}
private void moveToPivot(Matrix4f matrix, Matrix4f intermediary, boolean positive) {
intermediary.setIdentity();
float pivot = positive ? .5F : -.5F;
intermediary.m03 = pivot;
intermediary.m13 = pivot;
intermediary.m23 = pivot;
matrix.mul(intermediary);
}
private void rotateX(Matrix4f matrix, Matrix4f intermediary, float angle) {
intermediary.setIdentity();
intermediary.rotX(angle);
matrix.mul(intermediary);
}
private void rotateY(Matrix4f matrix, Matrix4f intermediary, float angle) {
intermediary.setIdentity();
intermediary.rotY(angle);
matrix.mul(intermediary);
}
private void rotateZ(Matrix4f matrix, Matrix4f intermediary, float angle) {
intermediary.setIdentity();
intermediary.rotZ(angle);
matrix.mul(intermediary);
}
private BakedQuad rebakeQuad(BakedQuad b, EnumFacing newFacing, Matrix4f transformMatrix, Tuple4f vertexTransformingVec) {
int[] newQuad = new int[28];
int[] quadData = b.getVertexData();
for (int k = 0; k < 4; ++k) {
// Getting the offset for the current vertex.
int vertexIndex = k * 7;
vertexTransformingVec.x = Float.intBitsToFloat(quadData[vertexIndex]);
vertexTransformingVec.y = Float.intBitsToFloat(quadData[vertexIndex + 1]);
vertexTransformingVec.z = Float.intBitsToFloat(quadData[vertexIndex + 2]);
vertexTransformingVec.w = 1;
// Transforming it by the model matrix.
transformMatrix.transform(vertexTransformingVec);
// Converting the new data to ints.
int x = Float.floatToRawIntBits(vertexTransformingVec.x);
int y = Float.floatToRawIntBits(vertexTransformingVec.y);
int z = Float.floatToRawIntBits(vertexTransformingVec.z);
// Vertex position data
newQuad[vertexIndex] = x;
newQuad[vertexIndex + 1] = y;
newQuad[vertexIndex + 2] = z;
newQuad[vertexIndex + 3] = quadData[vertexIndex + 3];
newQuad[vertexIndex + 4] = quadData[vertexIndex + 4]; //texture
newQuad[vertexIndex + 5] = quadData[vertexIndex + 5];
// Vertex brightness
newQuad[vertexIndex + 6] = 0x81818181;
}
return new BakedQuad(newQuad, b.getTintIndex(), newFacing, b.getSprite(), b.shouldApplyDiffuseLighting(), b.getFormat());
}
@Override
public boolean isAmbientOcclusion() {
return this.parent.isAmbientOcclusion();
@@ -152,140 +287,9 @@ public class AutoRotatingModel implements IBakedModel {
return this.quadCache.getUnchecked(key);
}
public static class VertexRotator extends QuadGatheringTransformer {
private final FacingToRotation f2r;
private final EnumFacing face;
public VertexRotator(FacingToRotation f2r, EnumFacing face) {
this.f2r = f2r;
this.face = face;
}
@Override
public void setParent(IVertexConsumer parent) {
super.setParent(parent);
if (Objects.equal(this.getVertexFormat(), parent.getVertexFormat())) {
return;
}
this.setVertexFormat(parent.getVertexFormat());
}
@Override
protected void processQuad() {
VertexFormat format = this.parent.getVertexFormat();
int count = format.getElementCount();
for (int v = 0; v < 4; v++) {
for (int e = 0; e < count; e++) {
VertexFormatElement element = format.getElement(e);
if (element.getUsage() == VertexFormatElement.EnumUsage.POSITION) {
this.parent.put(e, this.transform(this.quadData[e][v]));
} else if (element.getUsage() == VertexFormatElement.EnumUsage.NORMAL) {
this.parent.put(e, this.transformNormal(this.quadData[e][v]));
} else {
this.parent.put(e, this.quadData[e][v]);
}
}
}
}
private float[] transform(float[] fs) {
switch (fs.length) {
case 3:
Vector3f vec = new Vector3f(fs[0], fs[1], fs[2]);
vec.x -= 0.5f;
vec.y -= 0.5f;
vec.z -= 0.5f;
this.f2r.getMat().transform(vec);
vec.x += 0.5f;
vec.y += 0.5f;
vec.z += 0.5f;
return new float[]{vec.x, vec.y, vec.z
};
case 4:
Vector4f vecc = new Vector4f(fs[0], fs[1], fs[2], fs[3]);
vecc.x -= 0.5f;
vecc.y -= 0.5f;
vecc.z -= 0.5f;
this.f2r.getMat().transform(vecc);
vecc.x += 0.5f;
vecc.y += 0.5f;
vecc.z += 0.5f;
return new float[]{vecc.x, vecc.y, vecc.z, vecc.w
};
default:
return fs;
}
}
private float[] transformNormal(float[] fs) {
if (this.face == null) {
switch (fs.length) {
case 3:
Vector3f vec = new Vector3f(fs);
this.f2r.getMat().transform(vec);
return new float[]{
vec.getX(),
vec.getY(),
vec.getZ()
};
case 4:
Vector4f vec4 = new Vector4f(fs);
this.f2r.getMat().transform(vec4);
return new float[]{
vec4.getX(),
vec4.getY(),
vec4.getZ(),
0
};
default:
return fs;
}
} else {
switch (fs.length) {
case 3:
Vec3i vec = this.f2r.rotate(this.face).getDirectionVec();
return new float[]{
vec.getX(),
vec.getY(),
vec.getZ()
};
case 4:
Vector4f veccc = new Vector4f(fs[0], fs[1], fs[2], fs[3]);
Vec3i vecc = this.f2r.rotate(this.face).getDirectionVec();
return new float[]{
vecc.getX(),
vecc.getY(),
vecc.getZ(),
veccc.w
};
default:
return fs;
}
}
}
@Override
public void setQuadTint(int tint) {
this.parent.setQuadTint(tint);
}
@Override
public void setQuadOrientation(EnumFacing orientation) {
this.parent.setQuadOrientation(orientation);
}
@Override
public void setApplyDiffuseLighting(boolean diffuse) {
this.parent.setApplyDiffuseLighting(diffuse);
}
@Override
public void setTexture(TextureAtlasSprite texture) {
this.parent.setTexture(texture);
}
@Override
public void onResourceManagerReload(IResourceManager resourceManager) {
this.quadCache.invalidateAll();
}
}
@@ -18,31 +18,36 @@
package appeng.client.render.model;
import appeng.block.storage.BlockDrive;
import appeng.block.storage.DriveSlotState;
import appeng.block.storage.DriveSlotsState;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
import net.minecraft.client.renderer.block.model.ItemOverrideList;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.IResourceManagerReloadListener;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad;
import net.minecraftforge.common.property.IExtendedBlockState;
import javax.annotation.Nullable;
import javax.vecmath.Matrix4f;
import javax.vecmath.Tuple4f;
import javax.vecmath.Vector3f;
import javax.vecmath.Vector4f;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class DriveBakedModel implements IBakedModel {
public class DriveBakedModel implements IBakedModel, IResourceManagerReloadListener {
private final IBakedModel bakedBase;
private final Map<DriveSlotState, IBakedModel> bakedCells;
private final Int2ObjectMap<Map<DriveSlotState, List<BakedQuad>>> slot2DSMap = new Int2ObjectOpenHashMap<>();
public DriveBakedModel(IBakedModel bakedBase, Map<DriveSlotState, IBakedModel> bakedCells) {
this.bakedBase = bakedBase;
@@ -54,8 +59,7 @@ public class DriveBakedModel implements IBakedModel {
List<BakedQuad> result = new ArrayList<>(this.bakedBase.getQuads(state, side, rand));
if (side == null && state instanceof IExtendedBlockState) {
IExtendedBlockState extState = (IExtendedBlockState) state;
if (side == null && state instanceof IExtendedBlockState extState) {
if (!extState.getUnlistedNames().contains(BlockDrive.SLOTS_STATE)) {
return result;
@@ -63,30 +67,38 @@ public class DriveBakedModel implements IBakedModel {
DriveSlotsState slotsState = extState.getValue(BlockDrive.SLOTS_STATE);
for (int row = 0; row < 5; row++) {
for (int col = 0; col < 2; col++) {
DriveSlotState slotState = slotsState.getState(row * 2 + col);
int slot = row * 2 + col;
IBakedModel bakedCell = this.bakedCells.get(slotState);
DriveSlotState slotState = slotsState.getState(slot);
Matrix4f transform = new Matrix4f();
transform.setIdentity();
slot2DSMap.putIfAbsent(slot, new Object2ObjectOpenHashMap<>());
int finalCol = col;
int finalRow = row;
List<BakedQuad> lbq = slot2DSMap.get(slot).computeIfAbsent(slotState, q -> {
List<BakedQuad> res = new ArrayList<>();
IBakedModel bakedCell = this.bakedCells.get(slotState);
// Position this drive model copy at the correct slot. The transform is based on the
// cell-model being in slot 0,0 at the top left of the drive.
float xOffset = -col * 7 / 16.0f;
float yOffset = -row * 3 / 16.0f;
final Matrix4f transformMatrix = new Matrix4f();
transformMatrix.setIdentity();
final Tuple4f transform = new Vector4f();
transform.setTranslation(new Vector3f(xOffset, yOffset, 0));
// Position this drive model copy at the correct slot. The transform is based on
// the
// cell-model being in slot 0,0 at the top left of the drive.
float xOffset = -finalCol * 8 / 16.0f;
float yOffset = -finalRow * 3 / 16.0f;
MatrixVertexTransformer transformer = new MatrixVertexTransformer(transform);
for (BakedQuad bakedQuad : bakedCell.getQuads(state, null, rand)) {
UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(bakedQuad.getFormat());
transformer.setParent(builder);
transformer.setVertexFormat(builder.getVertexFormat());
bakedQuad.pipe(transformer);
result.add(builder.build());
}
transformMatrix.setTranslation(new Vector3f(xOffset, yOffset, 0));
for (BakedQuad bakedQuad : bakedCell.getQuads(state, null, rand)) {
res.add(rebakeQuad(bakedQuad, transformMatrix, transform));
}
return res;
});
result.addAll(lbq);
}
}
}
@@ -94,6 +106,41 @@ public class DriveBakedModel implements IBakedModel {
return result;
}
private BakedQuad rebakeQuad(BakedQuad b, Matrix4f transformMatrix, Tuple4f vertexTransformingVec) {
int[] newQuad = new int[28];
int[] quadData = b.getVertexData();
for (int k = 0; k < 4; ++k) {
// Getting the offset for the current vertex.
int vertexIndex = k * 7;
vertexTransformingVec.x = Float.intBitsToFloat(quadData[vertexIndex]);
vertexTransformingVec.y = Float.intBitsToFloat(quadData[vertexIndex + 1]);
vertexTransformingVec.z = Float.intBitsToFloat(quadData[vertexIndex + 2]);
vertexTransformingVec.w = 1;
// Transforming it by the model matrix.
transformMatrix.transform(vertexTransformingVec);
// Converting the new data to ints.
int x = Float.floatToRawIntBits(vertexTransformingVec.x);
int y = Float.floatToRawIntBits(vertexTransformingVec.y);
int z = Float.floatToRawIntBits(vertexTransformingVec.z);
// Vertex position data
newQuad[vertexIndex] = x;
newQuad[vertexIndex + 1] = y;
newQuad[vertexIndex + 2] = z;
newQuad[vertexIndex + 3] = quadData[vertexIndex + 3];
newQuad[vertexIndex + 4] = quadData[vertexIndex + 4]; //texture
newQuad[vertexIndex + 5] = quadData[vertexIndex + 5];
// Vertex brightness
newQuad[vertexIndex + 6] = 0x81818181;
}
return new BakedQuad(newQuad, b.getTintIndex(), b.getFace(), b.getSprite(), b.shouldApplyDiffuseLighting(), b.getFormat());
}
@Override
public boolean isAmbientOcclusion() {
return this.bakedBase.isAmbientOcclusion();
@@ -123,4 +170,9 @@ public class DriveBakedModel implements IBakedModel {
public ItemOverrideList getOverrides() {
return this.bakedBase.getOverrides();
}
@Override
public void onResourceManagerReload(IResourceManager resourceManager) {
slot2DSMap.clear();
}
}
@@ -32,6 +32,7 @@ import net.minecraft.client.resources.IResourceManager;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.JsonUtils;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.EnumHelperClient;
import net.minecraftforge.client.model.ICustomModelLoader;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.client.model.ModelLoader;
@@ -54,7 +55,6 @@ import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.HashMap;
@@ -74,11 +74,7 @@ public enum UVLModelLoader implements ICustomModelLoader {
static {
try {
Field modifiers = Field.class.getDeclaredField("modifiers");
modifiers.setAccessible(true);
faceBakery = ReflectionHelper.findField(ModelBakery.class, "faceBakery", "field_177607_l");
modifiers.set(faceBakery, faceBakery.getModifiers() & (~Modifier.FINAL));
Class clas = Class.forName(ModelLoader.class.getName() + "$VanillaModelWrapper");
vanillaModelWrapper = clas.getDeclaredConstructor(ModelLoader.class, ResourceLocation.class, ModelBlock.class, boolean.class,
@@ -118,7 +114,7 @@ public enum UVLModelLoader implements ICustomModelLoader {
private static void setFaceBakery(ModelBakery modelBakery, FaceBakery faceBakery) {
try {
UVLModelLoader.faceBakery.set(modelBakery, faceBakery);
EnumHelperClient.setFailsafeFieldValue(UVLModelLoader.faceBakery, modelBakery, faceBakery);
} catch (Exception e) {
throw Throwables.propagate(e);
}
@@ -22,6 +22,7 @@ package appeng.container;
import appeng.api.AEApi;
import appeng.api.config.Actionable;
import appeng.api.config.SecurityPermissions;
import appeng.api.definitions.IItemDefinition;
import appeng.api.implementations.guiobjects.IGuiItemObject;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridNode;
@@ -37,7 +38,17 @@ import appeng.api.storage.data.IAEItemStack;
import appeng.client.me.SlotME;
import appeng.container.guisync.GuiSync;
import appeng.container.guisync.SyncData;
import appeng.container.slot.*;
import appeng.container.implementations.ContainerInterface;
import appeng.container.slot.AppEngSlot;
import appeng.container.slot.SlotCraftingMatrix;
import appeng.container.slot.SlotCraftingTerm;
import appeng.container.slot.SlotDisabled;
import appeng.container.slot.SlotFake;
import appeng.container.slot.SlotInaccessible;
import appeng.container.slot.SlotPlayerHotBar;
import appeng.container.slot.SlotPlayerInv;
import appeng.container.slot.SlotRestrictedInput;
import appeng.container.slot.SlotRestrictedInput.PlacableItemType;
import appeng.core.AELog;
import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketInventoryAction;
@@ -48,7 +59,6 @@ import appeng.helpers.InventoryAction;
import appeng.me.helpers.PlayerSource;
import appeng.util.InventoryAdaptor;
import appeng.util.Platform;
import appeng.util.helpers.ItemHandlerUtil;
import appeng.util.inv.AdaptorItemHandler;
import appeng.util.inv.WrapperCursorItemHandler;
import appeng.util.item.AEItemStack;
@@ -78,7 +88,7 @@ public abstract class AEBaseContainer extends Container {
private final HashSet<Integer> locked = new HashSet<>();
private final TileEntity tileEntity;
private final IPart part;
private final IGuiItemObject obj;
protected final IGuiItemObject obj;
private final HashMap<Integer, SyncData> syncData = new HashMap<>();
private boolean isContainerValid = true;
private String customName;
@@ -312,10 +322,13 @@ public abstract class AEBaseContainer extends Container {
}
if (clickSlot != null && clickSlot.getHasStack()) {
ItemStack tis = clickSlot.getStack();
if (tis.isEmpty()) {
return ItemStack.EMPTY;
}
IItemDefinition expansionCard = AEApi.instance().definitions().materials().cardPatternExpansion();
ContainerInterface casted;
final List<Slot> selectedSlots = new ArrayList<>();
@@ -326,6 +339,10 @@ public abstract class AEBaseContainer extends Container {
tis = this.transferStackToContainer(tis);
if (!tis.isEmpty()) {
if (this instanceof ContainerInterface && expansionCard.isSameAs(tis) && (casted = (ContainerInterface) this).getPatternUpgrades() == casted.availableUpgrades() - 1) {
return ItemStack.EMPTY; // Don't insert more pattern expansions than maximum useful
}
// target slots in the container...
for (final Object inventorySlot : this.inventorySlots) {
final AppEngSlot cs = (AppEngSlot) inventorySlot;
@@ -388,7 +405,14 @@ public abstract class AEBaseContainer extends Container {
if (Platform.itemComparisons().isSameItem(tis, t)) // t.isItemEqual(tis))
{
int maxSize = d.getSlotStackLimit();
if (d instanceof SlotRestrictedInput && ((SlotRestrictedInput) d).getPlaceableItemType() == PlacableItemType.ENCODED_PATTERN) {
return ItemStack.EMPTY; // don't insert duplicate encoded patterns to interfaces
}
int maxSize = t.getMaxStackSize();
if (maxSize > d.getSlotStackLimit()) {
maxSize = d.getSlotStackLimit();
}
int placeAble = maxSize - t.getCount();
@@ -446,6 +470,13 @@ public abstract class AEBaseContainer extends Container {
return ItemStack.EMPTY;
} else {
this.updateSlot(d);
if (
(d instanceof SlotRestrictedInput && ((SlotRestrictedInput) d).getPlaceableItemType() == PlacableItemType.ENCODED_PATTERN) ||
(this instanceof ContainerInterface && expansionCard.isSameAs(tis) && (casted = (ContainerInterface) this).getPatternUpgrades() == casted.availableUpgrades() - 1)
) {
break; // Only insert one pattern when shift-clicking into interfaces, and don't insert more pattern expansions than maximum useful
}
}
}
}
@@ -23,6 +23,7 @@ import appeng.api.AEApi;
import appeng.api.config.Actionable;
import appeng.api.config.SecurityPermissions;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridNode;
import appeng.api.networking.crafting.ICraftingCPU;
import appeng.api.networking.crafting.ICraftingGrid;
import appeng.api.networking.crafting.ICraftingJob;
@@ -38,6 +39,7 @@ import appeng.api.storage.data.IItemList;
import appeng.client.gui.implementations.GuiCraftConfirm;
import appeng.container.AEBaseContainer;
import appeng.container.guisync.GuiSync;
import appeng.container.interfaces.IInventorySlotAware;
import appeng.core.AELog;
import appeng.core.sync.GuiBridge;
import appeng.core.sync.network.NetworkHandler;
@@ -54,6 +56,7 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.IContainerListener;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.world.World;
@@ -123,7 +126,19 @@ public class ContainerCraftConfirm extends AEBaseContainer {
return;
}
final ICraftingGrid cc = this.getGrid().getCache(ICraftingGrid.class);
final IActionHost h = ((IActionHost) this.getTarget());
if (h == null) {
this.setValidContainer(false);
return;
}
IGridNode node = h.getActionableNode();
if (node == null) {
this.setValidContainer(false);
return;
}
IGrid grid = node.getGrid();
final ICraftingGrid cc = grid.getCache(ICraftingGrid.class);
final ImmutableSet<ICraftingCPU> cpuSet = cc.getCpus();
int matches = 0;
@@ -197,7 +212,7 @@ public class ContainerCraftConfirm extends AEBaseContainer {
p.reset();
p.setStackSize(out.getCountRequestable());
final IStorageGrid sg = this.getGrid().getCache(IStorageGrid.class);
final IStorageGrid sg = grid.getCache(IStorageGrid.class);
final IMEInventory<IAEItemStack> items = sg.getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class));
IAEItemStack m = null;
@@ -250,11 +265,6 @@ public class ContainerCraftConfirm extends AEBaseContainer {
this.verifyPermissions(SecurityPermissions.CRAFT, false);
}
private IGrid getGrid() {
final IActionHost h = ((IActionHost) this.getTarget());
return h.getActionableNode().getGrid();
}
private boolean cpuMatches(final ICraftingCPU c) {
return c.getAvailableStorage() >= this.getUsedBytes() && !c.isBusy();
}
@@ -279,7 +289,8 @@ public class ContainerCraftConfirm extends AEBaseContainer {
final IActionHost ah = this.getActionHost();
if (ah instanceof WirelessTerminalGuiObject) {
originalGui = GuiBridge.GUI_WIRELESS_TERM;
ItemStack myIcon = ((WirelessTerminalGuiObject) ah).getItemStack();
originalGui = (GuiBridge) AEApi.instance().registries().wireless().getWirelessTerminalHandler(myIcon).getGuiHandler(myIcon);
}
if (ah instanceof PartTerminal) {
@@ -298,13 +309,32 @@ public class ContainerCraftConfirm extends AEBaseContainer {
originalGui = GuiBridge.GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL;
}
final IActionHost h = ((IActionHost) this.getTarget());
if (h == null) {
return;
}
IGridNode node = h.getActionableNode();
if (node == null) {
return;
}
IGrid grid = node.getGrid();
if (this.result != null && !this.isSimulation()) {
final ICraftingGrid cc = this.getGrid().getCache(ICraftingGrid.class);
final ICraftingGrid cc = grid.getCache(ICraftingGrid.class);
final ICraftingLink g = cc.submitJob(this.result, null, this.getSelectedCpu() == -1 ? null : this.cpus.get(this.getSelectedCpu()).getCpu(), true, this.getActionSrc());
this.setAutoStart(false);
if (g != null && originalGui != null && this.getOpenContext() != null) {
if (g == null) {
this.setJob(cc.beginCraftingJob(this.getWorld(), grid, this.getActionSrc(), this.result.getOutput(), null));
} else if (originalGui != null && this.getOpenContext() != null) {
final TileEntity te = this.getOpenContext().getTile();
Platform.openGUI(this.getInventoryPlayer().player, te, this.getOpenContext().getSide(), originalGui);
if (te != null) {
Platform.openGUI(this.getInventoryPlayer().player, te, this.getOpenContext().getSide(), originalGui);
} else {
if (ah instanceof IInventorySlotAware) {
IInventorySlotAware i = ((IInventorySlotAware) ah);
Platform.openGUI(this.getInventoryPlayer().player, i.getInventorySlot(), originalGui, i.isBaubleSlot());
}
}
}
}
}
@@ -50,6 +50,8 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import static appeng.helpers.ItemStackHelper.stackWriteToNBT;
public final class ContainerInterfaceConfigurationTerminal extends AEBaseContainer {
@@ -310,10 +312,7 @@ public final class ContainerInterfaceConfigurationTerminal extends AEBaseContain
ItemHandlerUtil.setStackInSlot(inv.client, x + offset, is.isEmpty() ? ItemStack.EMPTY : is.copy());
if (!is.isEmpty()) {
is.writeToNBT(itemNBT);
if (is.getCount() > Byte.MAX_VALUE) {
itemNBT.setInteger("stackSize", is.getCount());
}
stackWriteToNBT(is, itemNBT);
}
tag.setTag(Integer.toString(x + offset), itemNBT);
@@ -57,6 +57,8 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import static appeng.helpers.ItemStackHelper.stackWriteToNBT;
public final class ContainerInterfaceTerminal extends AEBaseContainer {
@@ -77,7 +79,7 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer {
this.grid = anchor.getActionableNode().getGrid();
}
this.bindPlayerInventory(ip, 14, 256 - /* height of player inventory */82);
this.bindPlayerInventory(ip, 0, 0);
}
@Override
@@ -345,7 +347,7 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer {
ItemHandlerUtil.setStackInSlot(inv.client, x + offset, is.isEmpty() ? ItemStack.EMPTY : is.copy());
if (!is.isEmpty()) {
is.writeToNBT(itemNBT);
stackWriteToNBT(is, itemNBT);
}
tag.setTag(Integer.toString(x + offset), itemNBT);
@@ -21,6 +21,7 @@ package appeng.container.implementations;
import appeng.api.AEApi;
import appeng.api.config.*;
import appeng.api.implementations.guiobjects.IGuiItemObject;
import appeng.api.implementations.guiobjects.IPortableCell;
import appeng.api.implementations.tiles.IMEChest;
import appeng.api.implementations.tiles.IViewCellStorage;
@@ -50,6 +51,7 @@ import appeng.core.AELog;
import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketMEInventoryUpdate;
import appeng.core.sync.packets.PacketValueConfig;
import appeng.helpers.WirelessTerminalGuiObject;
import appeng.me.helpers.ChannelPowerSrc;
import appeng.util.ConfigManager;
import appeng.util.IConfigManagerHost;
@@ -70,7 +72,7 @@ import java.util.List;
public class ContainerMEMonitorable extends AEBaseContainer implements IConfigManagerHost, IConfigurableObject, IMEMonitorHandlerReceiver<IAEItemStack> {
private final SlotRestrictedInput[] cellView = new SlotRestrictedInput[5];
protected final SlotRestrictedInput[] cellView = new SlotRestrictedInput[5];
private final IMEMonitor<IAEItemStack> monitor;
public final IItemList<IAEItemStack> items = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList();
private final IConfigManager clientCM;
@@ -90,7 +92,11 @@ public class ContainerMEMonitorable extends AEBaseContainer implements IConfigMa
}
protected ContainerMEMonitorable(final InventoryPlayer ip, final ITerminalHost monitorable, final boolean bindInventory) {
super(ip, monitorable instanceof TileEntity ? (TileEntity) monitorable : null, monitorable instanceof IPart ? (IPart) monitorable : null);
this(ip, monitorable, null, bindInventory);
}
protected ContainerMEMonitorable(final InventoryPlayer ip, final ITerminalHost monitorable, final IGuiItemObject iGuiItemObject, final boolean bindInventory) {
super(ip, monitorable instanceof TileEntity ? (TileEntity) monitorable : null, monitorable instanceof IPart ? (IPart) monitorable : null, iGuiItemObject);
this.host = monitorable;
this.clientCM = new ConfigManager(this);
@@ -110,6 +116,9 @@ public class ContainerMEMonitorable extends AEBaseContainer implements IConfigMa
if (monitorable instanceof IPortableCell) {
this.setPowerSource((IEnergySource) monitorable);
if (monitorable instanceof WirelessTerminalGuiObject) {
this.networkNode = ((WirelessTerminalGuiObject) monitorable).getActionableNode();
}
} else if (monitorable instanceof IMEChest) {
this.setPowerSource((IEnergySource) monitorable);
} else if (monitorable instanceof IGridHost || monitorable instanceof IActionHost) {
@@ -372,6 +381,9 @@ public class ContainerMEMonitorable extends AEBaseContainer implements IConfigMa
}
public void postUpdate(final List<IAEItemStack> list) {
for (final IAEItemStack is : list) {
this.items.add(is);
}
((GuiMEMonitorable) this.gui).postUpdate(list);
}
}
@@ -23,42 +23,44 @@ import appeng.api.config.Actionable;
import appeng.api.config.PowerMultiplier;
import appeng.api.implementations.guiobjects.IPortableCell;
import appeng.container.interfaces.IInventorySlotAware;
import appeng.util.inv.IAEAppEngInventory;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
public class ContainerMEPortableCell extends ContainerMEMonitorable {
public class ContainerMEPortableCell extends ContainerMEMonitorable implements IInventorySlotAware {
private double powerMultiplier = 0.5;
private final IPortableCell civ;
private int ticks = 0;
protected final IPortableCell portableCell;
private final int slot;
private double powerMultiplier = 0.5;
private int ticks = 0;
public ContainerMEPortableCell(final InventoryPlayer ip, final IPortableCell monitorable) {
super(ip, monitorable, false);
if (monitorable instanceof IInventorySlotAware) {
final int slotIndex = ((IInventorySlotAware) monitorable).getInventorySlot();
this.lockPlayerInventorySlot(slotIndex);
public ContainerMEPortableCell(InventoryPlayer ip, IPortableCell guiObject) {
super(ip, guiObject, guiObject, false);
if (guiObject != null) {
final int slotIndex = ((IInventorySlotAware) guiObject).getInventorySlot();
if (!((IInventorySlotAware) guiObject).isBaubleSlot()) {
this.lockPlayerInventorySlot(slotIndex);
}
this.slot = slotIndex;
} else {
this.slot = -1;
this.lockPlayerInventorySlot(ip.currentItem);
}
this.civ = monitorable;
this.bindPlayerInventory(ip, 0, 0);
this.portableCell = guiObject;
}
@Override
public void detectAndSendChanges() {
final ItemStack currentItem = this.slot < 0 ? this.getPlayerInv().getCurrentItem() : this.getPlayerInv().getStackInSlot(this.slot);
if (this.civ == null || currentItem.isEmpty()) {
if (this.portableCell == null || currentItem.isEmpty()) {
this.setValidContainer(false);
} else if (this.civ != null && !this.civ.getItemStack().isEmpty() && currentItem != this.civ.getItemStack()) {
if (ItemStack.areItemsEqual(this.civ.getItemStack(), currentItem)) {
this.getPlayerInv().setInventorySlotContents(this.getPlayerInv().currentItem, this.civ.getItemStack());
} else {
} else if (!this.portableCell.getItemStack().isEmpty() && currentItem != this.portableCell.getItemStack()) {
if (!ItemStack.areItemsEqual(this.portableCell.getItemStack(), currentItem)) {
this.setValidContainer(false);
}
}
@@ -66,7 +68,7 @@ public class ContainerMEPortableCell extends ContainerMEMonitorable {
// drain 1 ae t
this.ticks++;
if (this.ticks > 10) {
this.civ.extractAEPower(this.getPowerMultiplier() * this.ticks, Actionable.MODULATE, PowerMultiplier.CONFIG);
this.portableCell.extractAEPower(this.getPowerMultiplier() * this.ticks, Actionable.MODULATE, PowerMultiplier.CONFIG);
this.ticks = 0;
}
super.detectAndSendChanges();
@@ -79,4 +81,9 @@ public class ContainerMEPortableCell extends ContainerMEMonitorable {
void setPowerMultiplier(final double powerMultiplier) {
this.powerMultiplier = powerMultiplier;
}
}
@Override
public int getInventorySlot() {
return this.slot;
}
}
@@ -0,0 +1,235 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.container.implementations;
import appeng.api.config.Actionable;
import appeng.api.config.PowerMultiplier;
import appeng.api.implementations.IUpgradeableCellContainer;
import appeng.api.implementations.guiobjects.IPortableCell;
import appeng.api.networking.security.IActionHost;
import appeng.container.interfaces.IInventorySlotAware;
import appeng.container.slot.SlotRestrictedInput;
import appeng.core.AEConfig;
import appeng.core.localization.PlayerMessages;
import appeng.helpers.WirelessTerminalGuiObject;
import appeng.parts.automation.StackUpgradeInventory;
import appeng.tile.inventory.AppEngInternalInventory;
import appeng.util.Platform;
import appeng.util.inv.IAEAppEngInventory;
import appeng.util.inv.InvOperation;
import baubles.api.BaublesApi;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.ClickType;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.items.IItemHandler;
public class ContainerMEPortableTerminal extends ContainerMEMonitorable implements IUpgradeableCellContainer, IAEAppEngInventory, IInventorySlotAware {
protected final WirelessTerminalGuiObject wirelessTerminalGUIObject;
private final int slot;
private double powerMultiplier = 0.5;
private int ticks = 0;
protected AppEngInternalInventory upgrades;
protected SlotRestrictedInput magnetSlot;
public ContainerMEPortableTerminal(InventoryPlayer ip, WirelessTerminalGuiObject guiObject, boolean bindInventory) {
super(ip, guiObject, guiObject, bindInventory);
if (guiObject != null) {
final int slotIndex = ((IInventorySlotAware) guiObject).getInventorySlot();
if (!((IInventorySlotAware) guiObject).isBaubleSlot()) {
this.lockPlayerInventorySlot(slotIndex);
}
this.slot = slotIndex;
} else {
this.slot = -1;
this.lockPlayerInventorySlot(ip.currentItem);
}
this.bindPlayerInventory(ip, 0, 0);
this.wirelessTerminalGUIObject = guiObject;
this.upgrades = new StackUpgradeInventory(wirelessTerminalGUIObject.getItemStack(), this, 2);
this.loadFromNBT();
this.setupUpgrades();
}
public ContainerMEPortableTerminal(InventoryPlayer ip, IPortableCell guiObject) {
super(ip, guiObject, guiObject, true);
if (guiObject != null) {
final int slotIndex = ((IInventorySlotAware) guiObject).getInventorySlot();
if (!((IInventorySlotAware) guiObject).isBaubleSlot()) {
this.lockPlayerInventorySlot(slotIndex);
}
this.slot = slotIndex;
} else {
this.slot = -1;
this.lockPlayerInventorySlot(ip.currentItem);
}
this.wirelessTerminalGUIObject = (WirelessTerminalGuiObject) guiObject;
this.upgrades = new StackUpgradeInventory(wirelessTerminalGUIObject.getItemStack(), this, 2);
this.loadFromNBT();
this.setupUpgrades();
}
@Override
public void detectAndSendChanges() {
if (Platform.isServer()) {
final ItemStack currentItem;
if (wirelessTerminalGUIObject.isBaubleSlot()) {
currentItem = BaublesApi.getBaublesHandler(this.getPlayerInv().player).getStackInSlot(this.slot);
} else {
currentItem = this.slot < 0 ? this.getPlayerInv().getCurrentItem() : this.getPlayerInv().getStackInSlot(this.slot);
}
if (currentItem.isEmpty()) {
this.setValidContainer(false);
} else if (!this.wirelessTerminalGUIObject.getItemStack().isEmpty() && currentItem != this.wirelessTerminalGUIObject.getItemStack()) {
if (ItemStack.areItemsEqual(this.wirelessTerminalGUIObject.getItemStack(), currentItem)) {
if (wirelessTerminalGUIObject.isBaubleSlot()) {
BaublesApi.getBaublesHandler(this.getPlayerInv().player).setStackInSlot(this.slot, this.wirelessTerminalGUIObject.getItemStack());
} else {
this.getPlayerInv().setInventorySlotContents(this.slot, this.wirelessTerminalGUIObject.getItemStack());
}
} else {
this.setValidContainer(false);
}
}
// drain 1 ae t
this.ticks++;
if (this.ticks > 10) {
double ext = this.wirelessTerminalGUIObject.extractAEPower(this.getPowerMultiplier() * this.ticks, Actionable.MODULATE, PowerMultiplier.CONFIG);
if (ext < this.getPowerMultiplier() * this.ticks) {
if (Platform.isServer() && this.isValidContainer()) {
this.getPlayerInv().player.sendMessage(PlayerMessages.DeviceNotPowered.get());
}
this.setValidContainer(false);
}
this.ticks = 0;
}
if (!this.wirelessTerminalGUIObject.rangeCheck()) {
if (Platform.isServer() && this.isValidContainer()) {
this.getPlayerInv().player.sendMessage(PlayerMessages.OutOfRange.get());
}
this.setValidContainer(false);
} else {
this.setPowerMultiplier(AEConfig.instance().wireless_getDrainRate(this.wirelessTerminalGUIObject.getRange()));
}
super.detectAndSendChanges();
}
}
@Override
public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayer player) {
if (slotId >= 0 && slotId < this.inventorySlots.size()) {
if (clickTypeIn == ClickType.PICKUP && dragType == 1) {
if (this.inventorySlots.get(slotId) == magnetSlot) {
ItemStack itemStack = magnetSlot.getStack();
if (!magnetSlot.getStack().isEmpty()) {
NBTTagCompound tag = itemStack.getTagCompound();
if (tag == null) {
tag = new NBTTagCompound();
}
if (tag.hasKey("enabled")) {
boolean e = tag.getBoolean("enabled");
tag.setBoolean("enabled", !e);
} else {
tag.setBoolean("enabled", false);
}
magnetSlot.getStack().setTagCompound(tag);
magnetSlot.onSlotChanged();
return ItemStack.EMPTY;
}
}
}
}
return super.slotClick(slotId, dragType, clickTypeIn, player);
}
@Override
protected IActionHost getActionHost() {
return this.wirelessTerminalGUIObject;
}
private double getPowerMultiplier() {
return this.powerMultiplier;
}
void setPowerMultiplier(final double powerMultiplier) {
this.powerMultiplier = powerMultiplier;
}
@Override
public int availableUpgrades() {
return 1;
}
@Override
public void setupUpgrades() {
if (wirelessTerminalGUIObject != null) {
for (int upgradeSlot = 0; upgradeSlot < availableUpgrades(); upgradeSlot++) {
this.magnetSlot = new SlotRestrictedInput(SlotRestrictedInput.PlacableItemType.UPGRADES, upgrades, upgradeSlot, 206, 135 + upgradeSlot * 18, this.getInventoryPlayer());
this.magnetSlot.setNotDraggable();
this.addSlotToContainer(magnetSlot);
}
}
}
@Override
public void saveChanges() {
if (Platform.isServer()) {
NBTTagCompound tag = new NBTTagCompound();
this.upgrades.writeToNBT(tag, "upgrades");
this.wirelessTerminalGUIObject.saveChanges(tag);
}
}
protected void loadFromNBT() {
NBTTagCompound data = wirelessTerminalGUIObject.getItemStack().getTagCompound();
if (data != null) {
upgrades.readFromNBT(wirelessTerminalGUIObject.getItemStack().getTagCompound().getCompoundTag("upgrades"));
}
}
@Override
public void onChangeInventory(IItemHandler inv, int slot, InvOperation mc, ItemStack removedStack, ItemStack newStack) {
}
@Override
public int getInventorySlot() {
return wirelessTerminalGUIObject.getInventorySlot();
}
@Override
public boolean isBaubleSlot() {
return wirelessTerminalGUIObject.isBaubleSlot();
}
}
@@ -1,8 +1,16 @@
package appeng.container.implementations;
import appeng.api.AEApi;
import appeng.api.config.Actionable;
import appeng.api.definitions.IDefinitions;
import appeng.api.implementations.guiobjects.IGuiItemObject;
import appeng.api.networking.security.IActionHost;
import appeng.api.storage.IMEMonitor;
import appeng.api.storage.ITerminalHost;
import appeng.api.storage.channels.IItemStorageChannel;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IItemList;
import appeng.container.ContainerNull;
import appeng.container.guisync.GuiSync;
import appeng.container.slot.AppEngSlot;
import appeng.container.slot.IOptionalSlotHost;
@@ -12,18 +20,23 @@ import appeng.container.slot.SlotPatternTerm;
import appeng.container.slot.SlotPlayerHotBar;
import appeng.container.slot.SlotPlayerInv;
import appeng.container.slot.SlotRestrictedInput;
import appeng.core.sync.packets.PacketPatternSlot;
import appeng.helpers.IContainerCraftingPacket;
import appeng.items.storage.ItemViewCell;
import appeng.me.helpers.MachineSource;
import appeng.parts.reporting.AbstractPartEncoder;
import appeng.tile.inventory.AppEngInternalInventory;
import appeng.util.InventoryAdaptor;
import appeng.util.Platform;
import appeng.util.inv.AdaptorItemHandler;
import appeng.util.inv.IAEAppEngInventory;
import appeng.util.inv.InvOperation;
import appeng.util.inv.WrapperCursorItemHandler;
import appeng.util.item.AEItemStack;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.IContainerListener;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.inventory.Slot;
import net.minecraft.inventory.*;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.item.crafting.IRecipe;
@@ -38,9 +51,13 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import static appeng.helpers.ItemStackHelper.stackWriteToNBT;
public abstract class ContainerPatternEncoder extends ContainerMEMonitorable implements IAEAppEngInventory, IOptionalSlotHost, IContainerCraftingPacket {
private final AbstractPartEncoder patternTerminal;
protected AbstractPartEncoder patternTerminal = null;
protected IGuiItemObject iGuiItemObject = null;
final AppEngInternalInventory cOut = new AppEngInternalInventory(null, 1);
@@ -48,7 +65,7 @@ public abstract class ContainerPatternEncoder extends ContainerMEMonitorable imp
protected SlotPatternTerm craftSlot;
protected SlotRestrictedInput patternSlotIN;
protected SlotRestrictedInput patternSlotOUT;
private IRecipe currentRecipe;
protected IRecipe currentRecipe;
protected SlotFakeCraftingMatrix[] craftingSlots;
protected OptionalSlotFake[] outputSlots;
@@ -58,16 +75,19 @@ public abstract class ContainerPatternEncoder extends ContainerMEMonitorable imp
@GuiSync(96)
public boolean substitute = false;
public ContainerPatternEncoder(InventoryPlayer ip, ITerminalHost monitorable) {
super(ip, monitorable);
patternTerminal = (AbstractPartEncoder) monitorable;
}
protected ContainerPatternEncoder(InventoryPlayer ip, ITerminalHost monitorable, boolean bindInventory) {
super(ip, monitorable, bindInventory);
patternTerminal = (AbstractPartEncoder) monitorable;
}
protected ContainerPatternEncoder(InventoryPlayer ip, ITerminalHost monitorable, IGuiItemObject iGuiItemObject, boolean bindInventory) {
super(ip, monitorable, iGuiItemObject, bindInventory);
if (monitorable instanceof AbstractPartEncoder) {
patternTerminal = (AbstractPartEncoder) monitorable;
}
this.iGuiItemObject = iGuiItemObject;
}
@Override
public ItemStack transferStackInSlot(final EntityPlayer p, final int idx) {
if (Platform.isClient()) {
@@ -97,7 +117,10 @@ public abstract class ContainerPatternEncoder extends ContainerMEMonitorable imp
if (name.equals("player")) {
return new PlayerInvWrapper(this.getInventoryPlayer());
}
return this.getPart().getInventoryByName(name);
if (this.getPart() != null) {
return this.getPart().getInventoryByName(name);
}
return null;
}
@Override
@@ -112,7 +135,20 @@ public abstract class ContainerPatternEncoder extends ContainerMEMonitorable imp
@Override
public void onChangeInventory(IItemHandler inv, int slot, InvOperation mc, ItemStack removedStack, ItemStack newStack) {
if (inv == this.crafting) {
this.fixCraftingRecipes();
}
}
void fixCraftingRecipes() {
if (this.isCraftingMode()) {
for (int x = 0; x < this.crafting.getSlots(); x++) {
final ItemStack is = this.crafting.getStackInSlot(x);
if (!is.isEmpty()) {
is.setCount(1);
}
}
}
}
@Override
@@ -155,6 +191,9 @@ public abstract class ContainerPatternEncoder extends ContainerMEMonitorable imp
}
this.detectAndSendChanges();
}
if (s == this.craftSlot && Platform.isClient()) {
this.getAndUpdateOutput();
}
}
public void encodeAndMoveToInventory() {
@@ -199,7 +238,6 @@ public abstract class ContainerPatternEncoder extends ContainerMEMonitorable imp
Optional<ItemStack> maybePattern = AEApi.instance().definitions().items().encodedPattern().maybeStack(1);
if (maybePattern.isPresent()) {
output = maybePattern.get();
this.patternSlotOUT.putStack(output);
}
}
@@ -223,6 +261,8 @@ public abstract class ContainerPatternEncoder extends ContainerMEMonitorable imp
encodedValue.setBoolean("substitute", this.isSubstitute());
output.setTagCompound(encodedValue);
patternSlotOUT.putStack(output);
}
public void multiply(int multiple) {
@@ -473,8 +513,20 @@ public abstract class ContainerPatternEncoder extends ContainerMEMonitorable imp
return this.craftingMode;
}
void setCraftingMode(final boolean craftingMode) {
public void setCraftingMode(final boolean craftingMode) {
this.craftingMode = craftingMode;
if (getPart() != null) {
getPart().setCraftingRecipe(craftingMode);
} else if (iGuiItemObject != null) {
NBTTagCompound nbtTagCompound = iGuiItemObject.getItemStack().getTagCompound();
if (nbtTagCompound != null) {
nbtTagCompound.setBoolean("isCraftingMode", craftingMode);
this.updateOrderOfOutputSlots();
}
}
if (craftingMode) {
this.fixCraftingRecipes();
}
}
@@ -484,18 +536,59 @@ public abstract class ContainerPatternEncoder extends ContainerMEMonitorable imp
public void setSubstitute(final boolean substitute) {
this.substitute = substitute;
if (getPart() != null) {
getPart().setSubstitution(substitute);
} else if (iGuiItemObject != null) {
NBTTagCompound nbtTagCompound = iGuiItemObject.getItemStack().getTagCompound();
if (nbtTagCompound != null) {
nbtTagCompound.setBoolean("isSubstitute", substitute);
}
}
}
@Override
public void detectAndSendChanges() {
super.detectAndSendChanges();
if (Platform.isServer()) {
if (this.isCraftingMode() != this.getPart().isCraftingRecipe()) {
this.setCraftingMode(this.getPart().isCraftingRecipe());
this.updateOrderOfOutputSlots();
if (getPart() != null) {
if (this.isCraftingMode() != this.getPart().isCraftingRecipe()) {
this.setCraftingMode(this.getPart().isCraftingRecipe());
this.updateOrderOfOutputSlots();
}
this.substitute = this.getPart().isSubstitution();
} else if (iGuiItemObject != null) {
NBTTagCompound nbtTagCompound = iGuiItemObject.getItemStack().getTagCompound();
if (nbtTagCompound != null) {
if (nbtTagCompound.hasKey("isCraftingMode")) {
boolean crafting = nbtTagCompound.getBoolean("isCraftingMode");
if (this.isCraftingMode() != crafting) {
this.setCraftingMode(crafting);
this.updateOrderOfOutputSlots();
}
} else {
nbtTagCompound.setBoolean("isCraftingMode", false);
}
} else {
nbtTagCompound = new NBTTagCompound();
nbtTagCompound.setBoolean("isCraftingMode", false);
iGuiItemObject.getItemStack().setTagCompound(nbtTagCompound);
}
nbtTagCompound = iGuiItemObject.getItemStack().getTagCompound();
if (nbtTagCompound != null) {
if (nbtTagCompound.hasKey("isSubstitute")) {
boolean substitute = nbtTagCompound.getBoolean("isSubstitute");
if (this.isSubstitute() != substitute) {
this.setSubstitute(substitute);
}
} else {
nbtTagCompound.setBoolean("isSubstitute", false);
}
} else {
nbtTagCompound = new NBTTagCompound();
nbtTagCompound.setBoolean("isSubstitute", false);
iGuiItemObject.getItemStack().setTagCompound(nbtTagCompound);
}
}
this.substitute = this.getPart().isSubstitution();
}
}
@@ -526,10 +619,7 @@ public abstract class ContainerPatternEncoder extends ContainerMEMonitorable imp
final NBTTagCompound c = new NBTTagCompound();
if (!i.isEmpty()) {
i.writeToNBT(c);
if (i.getCount() > Byte.MAX_VALUE) {
c.setInteger("stackSize", i.getCount());
}
stackWriteToNBT(i, c);
}
return c;
@@ -547,4 +637,98 @@ public abstract class ContainerPatternEncoder extends ContainerMEMonitorable imp
this.detectAndSendChanges();
this.getAndUpdateOutput();
}
public void craftOrGetItem(final PacketPatternSlot packetPatternSlot) {
if (packetPatternSlot.slotItem != null && this.getCellInventory() != null) {
final IAEItemStack out = packetPatternSlot.slotItem.copy();
InventoryAdaptor inv = new AdaptorItemHandler(new WrapperCursorItemHandler(this.getPlayerInv().player.inventory));
final InventoryAdaptor playerInv = InventoryAdaptor.getAdaptor(this.getPlayerInv().player);
if (packetPatternSlot.shift) {
inv = playerInv;
}
if (!inv.simulateAdd(out.createItemStack()).isEmpty()) {
return;
}
final IAEItemStack extracted = Platform.poweredExtraction(this.getPowerSource(), this.getCellInventory(), out, this.getActionSource());
final EntityPlayer p = this.getPlayerInv().player;
if (extracted != null) {
inv.addItems(extracted.createItemStack());
if (p instanceof EntityPlayerMP) {
this.updateHeld((EntityPlayerMP) p);
}
this.detectAndSendChanges();
return;
}
final InventoryCrafting ic = new InventoryCrafting(new ContainerNull(), 3, 3);
final InventoryCrafting real = new InventoryCrafting(new ContainerNull(), 3, 3);
for (int x = 0; x < 9; x++) {
ic.setInventorySlotContents(x, packetPatternSlot.pattern[x] == null ? ItemStack.EMPTY : packetPatternSlot.pattern[x].createItemStack());
}
final IRecipe r = CraftingManager.findMatchingRecipe(ic, p.world);
if (r == null) {
return;
}
IMEMonitor<IAEItemStack> storage = null;
if (getPart() != null) {
storage = this.getPart()
.getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class));
} else if (iGuiItemObject != null) {
storage = ((ITerminalHost) iGuiItemObject).getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class));
}
final IItemList<IAEItemStack> all = storage.getStorageList();
final ItemStack is = r.getCraftingResult(ic);
for (int x = 0; x < ic.getSizeInventory(); x++) {
if (!ic.getStackInSlot(x).isEmpty()) {
final ItemStack pulled = Platform.extractItemsByRecipe(this.getPowerSource(), this.getActionSource(), storage, p.world, r, is, ic,
ic.getStackInSlot(x), x, all, Actionable.MODULATE, ItemViewCell.createFilter(this.getViewCells()));
real.setInventorySlotContents(x, pulled);
}
}
final IRecipe rr = CraftingManager.findMatchingRecipe(real, p.world);
if (rr == r && Platform.itemComparisons().isSameItem(rr.getCraftingResult(real), is)) {
final InventoryCraftResult craftingResult = new InventoryCraftResult();
craftingResult.setRecipeUsed(rr);
final SlotCrafting sc = new SlotCrafting(p, real, craftingResult, 0, 0, 0);
sc.onTake(p, is);
for (int x = 0; x < real.getSizeInventory(); x++) {
final ItemStack failed = playerInv.addItems(real.getStackInSlot(x));
if (!failed.isEmpty()) {
p.dropItem(failed, false);
}
}
inv.addItems(is);
if (p instanceof EntityPlayerMP) {
this.updateHeld((EntityPlayerMP) p);
}
this.detectAndSendChanges();
} else {
for (int x = 0; x < real.getSizeInventory(); x++) {
final ItemStack failed = real.getStackInSlot(x);
if (!failed.isEmpty()) {
this.getCellInventory()
.injectItems(AEItemStack.fromItemStack(failed), Actionable.MODULATE,
new MachineSource(this.getPart() != null ? this.getPart() : (IActionHost) iGuiItemObject));
}
}
}
}
}
}
@@ -19,48 +19,19 @@
package appeng.container.implementations;
import appeng.api.AEApi;
import appeng.api.config.Actionable;
import appeng.api.storage.IMEMonitor;
import appeng.api.storage.ITerminalHost;
import appeng.api.storage.channels.IItemStorageChannel;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IItemList;
import appeng.container.ContainerNull;
import appeng.container.guisync.GuiSync;
import appeng.container.slot.AppEngSlot;
import appeng.container.slot.IOptionalSlotHost;
import appeng.container.slot.OptionalSlotFake;
import appeng.container.slot.SlotFakeCraftingMatrix;
import appeng.container.slot.SlotPatternOutputs;
import appeng.container.slot.SlotPatternTerm;
import appeng.container.slot.SlotPlayerHotBar;
import appeng.container.slot.SlotPlayerInv;
import appeng.container.slot.SlotRestrictedInput;
import appeng.core.sync.packets.PacketPatternSlot;
import appeng.items.storage.ItemViewCell;
import appeng.me.helpers.MachineSource;
import appeng.util.InventoryAdaptor;
import appeng.util.Platform;
import appeng.util.inv.AdaptorItemHandler;
import appeng.util.inv.WrapperCursorItemHandler;
import appeng.util.item.AEItemStack;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.IContainerListener;
import net.minecraft.inventory.InventoryCraftResult;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.inventory.Slot;
import net.minecraft.inventory.SlotCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.item.crafting.IRecipe;
import net.minecraftforge.items.IItemHandler;
public class ContainerPatternTerm extends ContainerPatternEncoder {
public ContainerPatternTerm(final InventoryPlayer ip, final ITerminalHost monitorable) {
super(ip, monitorable, false);
@@ -114,91 +85,4 @@ public class ContainerPatternTerm extends ContainerPatternEncoder {
}
}
public void craftOrGetItem(final PacketPatternSlot packetPatternSlot) {
if (packetPatternSlot.slotItem != null && this.getCellInventory() != null) {
final IAEItemStack out = packetPatternSlot.slotItem.copy();
InventoryAdaptor inv = new AdaptorItemHandler(new WrapperCursorItemHandler(this.getPlayerInv().player.inventory));
final InventoryAdaptor playerInv = InventoryAdaptor.getAdaptor(this.getPlayerInv().player);
if (packetPatternSlot.shift) {
inv = playerInv;
}
if (!inv.simulateAdd(out.createItemStack()).isEmpty()) {
return;
}
final IAEItemStack extracted = Platform.poweredExtraction(this.getPowerSource(), this.getCellInventory(), out, this.getActionSource());
final EntityPlayer p = this.getPlayerInv().player;
if (extracted != null) {
inv.addItems(extracted.createItemStack());
if (p instanceof EntityPlayerMP) {
this.updateHeld((EntityPlayerMP) p);
}
this.detectAndSendChanges();
return;
}
final InventoryCrafting ic = new InventoryCrafting(new ContainerNull(), 3, 3);
final InventoryCrafting real = new InventoryCrafting(new ContainerNull(), 3, 3);
for (int x = 0; x < 9; x++) {
ic.setInventorySlotContents(x, packetPatternSlot.pattern[x] == null ? ItemStack.EMPTY : packetPatternSlot.pattern[x].createItemStack());
}
final IRecipe r = CraftingManager.findMatchingRecipe(ic, p.world);
if (r == null) {
return;
}
final IMEMonitor<IAEItemStack> storage = this.getPart()
.getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class));
final IItemList<IAEItemStack> all = storage.getStorageList();
final ItemStack is = r.getCraftingResult(ic);
for (int x = 0; x < ic.getSizeInventory(); x++) {
if (!ic.getStackInSlot(x).isEmpty()) {
final ItemStack pulled = Platform.extractItemsByRecipe(this.getPowerSource(), this.getActionSource(), storage, p.world, r, is, ic,
ic.getStackInSlot(x), x, all, Actionable.MODULATE, ItemViewCell.createFilter(this.getViewCells()));
real.setInventorySlotContents(x, pulled);
}
}
final IRecipe rr = CraftingManager.findMatchingRecipe(real, p.world);
if (rr == r && Platform.itemComparisons().isSameItem(rr.getCraftingResult(real), is)) {
final InventoryCraftResult craftingResult = new InventoryCraftResult();
craftingResult.setRecipeUsed(rr);
final SlotCrafting sc = new SlotCrafting(p, real, craftingResult, 0, 0, 0);
sc.onTake(p, is);
for (int x = 0; x < real.getSizeInventory(); x++) {
final ItemStack failed = playerInv.addItems(real.getStackInSlot(x));
if (!failed.isEmpty()) {
p.dropItem(failed, false);
}
}
inv.addItems(is);
if (p instanceof EntityPlayerMP) {
this.updateHeld((EntityPlayerMP) p);
}
this.detectAndSendChanges();
} else {
for (int x = 0; x < real.getSizeInventory(); x++) {
final ItemStack failed = real.getStackInSlot(x);
if (!failed.isEmpty()) {
this.getCellInventory()
.injectItems(AEItemStack.fromItemStack(failed), Actionable.MODULATE,
new MachineSource(this.getPart()));
}
}
}
}
}
}
@@ -20,19 +20,43 @@ package appeng.container.implementations;
import appeng.container.AEBaseContainer;
import appeng.container.slot.IOptionalSlotHost;
import appeng.container.slot.OptionalSlotRestrictedInput;
import appeng.container.slot.SlotRestrictedInput;
import appeng.tile.qnb.TileQuantumBridge;
import net.minecraft.entity.player.InventoryPlayer;
public class ContainerQNB extends AEBaseContainer {
public class ContainerQNB extends AEBaseContainer implements IOptionalSlotHost {
OptionalSlotRestrictedInput SINGULARITY;
OptionalSlotRestrictedInput QUANTUM_CARD;
public ContainerQNB(final InventoryPlayer ip, final TileQuantumBridge quantumBridge) {
super(ip, quantumBridge, null);
this.addSlotToContainer((new SlotRestrictedInput(SlotRestrictedInput.PlacableItemType.QE_SINGULARITY, quantumBridge
.getInternalInventory(), 0, 80, 37, this.getInventoryPlayer())).setStackLimit(1));
SINGULARITY = new OptionalSlotRestrictedInput(SlotRestrictedInput.PlacableItemType.QE_SINGULARITY, quantumBridge
.getInternalInventory(), this, 0, 80, 37, 0, this.getInventoryPlayer());
this.addSlotToContainer(SINGULARITY.setStackLimit(1));
QUANTUM_CARD = new OptionalSlotRestrictedInput(SlotRestrictedInput.PlacableItemType.CARD_QUANTUM, quantumBridge
.getInternalInventory(), this, 1, 80, 55, 1, this.getInventoryPlayer());
this.addSlotToContainer((QUANTUM_CARD).setStackLimit(1));
this.bindPlayerInventory(ip, 0, 166 - /* height of player inventory */82);
}
@Override
public boolean isSlotEnabled(int idx) {
if (QUANTUM_CARD.getItemHandler().getStackInSlot(QUANTUM_CARD.slotNumber).isEmpty() &&
SINGULARITY.getItemHandler().getStackInSlot(SINGULARITY.slotNumber).isEmpty()) {
return true;
} else if (idx == 0) {
return QUANTUM_CARD.getItemHandler().getStackInSlot(QUANTUM_CARD.slotNumber).isEmpty();
} else if (idx == 1) {
return SINGULARITY.getItemHandler().getStackInSlot(SINGULARITY.slotNumber).isEmpty();
}
return false;
}
}
@@ -0,0 +1,136 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.container.implementations;
import appeng.container.ContainerNull;
import appeng.container.slot.SlotCraftingMatrix;
import appeng.container.slot.SlotCraftingTerm;
import appeng.helpers.IContainerCraftingPacket;
import appeng.helpers.WirelessTerminalGuiObject;
import appeng.tile.inventory.AppEngInternalInventory;
import appeng.util.Platform;
import appeng.util.inv.InvOperation;
import appeng.util.inv.WrapperInvItemHandler;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.wrapper.PlayerInvWrapper;
public class ContainerWirelessCraftingTerminal extends ContainerMEPortableTerminal implements IContainerCraftingPacket {
private final AppEngInternalInventory output = new AppEngInternalInventory(this, 1);
private final SlotCraftingMatrix[] craftingSlots = new SlotCraftingMatrix[9];
private final SlotCraftingTerm outputSlot;
private AppEngInternalInventory craftingGrid;
private IRecipe currentRecipe;
public ContainerWirelessCraftingTerminal(final InventoryPlayer ip, final WirelessTerminalGuiObject gui) {
super(ip, gui, false);
final IItemHandler crafting = this.craftingGrid;
for (int y = 0; y < 3; y++) {
for (int x = 0; x < 3; x++) {
this.addSlotToContainer(this.craftingSlots[x + y * 3] = new SlotCraftingMatrix(this, crafting, x + y * 3, 37 + x * 18, -72 + y * 18));
}
}
this.addSlotToContainer(this.outputSlot = new SlotCraftingTerm(this.getPlayerInv().player, this.getActionSource(), this
.getPowerSource(), this.wirelessTerminalGUIObject, crafting, crafting, this.output, 131, -72 + 18, this));
this.bindPlayerInventory(ip, 0, 0);
this.onCraftMatrixChanged(new WrapperInvItemHandler(crafting));
}
@Override
public void onCraftMatrixChanged(IInventory inventory) {
final ContainerNull cn = new ContainerNull();
final InventoryCrafting ic = new InventoryCrafting(cn, 3, 3);
for (int x = 0; x < 9; x++) {
ic.setInventorySlotContents(x, this.craftingSlots[x].getStack());
}
if (this.currentRecipe == null || !this.currentRecipe.matches(ic, this.getPlayerInv().player.world)) {
this.currentRecipe = CraftingManager.findMatchingRecipe(ic, this.getPlayerInv().player.world);
}
if (this.currentRecipe == null) {
this.outputSlot.putStack(ItemStack.EMPTY);
} else {
final ItemStack craftingResult = this.currentRecipe.getCraftingResult(ic);
this.outputSlot.putStack(craftingResult);
}
this.saveChanges();
}
@Override
public void saveChanges() {
if (Platform.isServer()) {
NBTTagCompound tag = new NBTTagCompound();
this.craftingGrid.writeToNBT(tag, "craftingGrid");
this.upgrades.writeToNBT(tag, "upgrades");
this.wirelessTerminalGUIObject.saveChanges(tag);
}
}
@Override
protected void loadFromNBT() {
super.loadFromNBT();
this.craftingGrid = new AppEngInternalInventory(this, 9);
NBTTagCompound data = wirelessTerminalGUIObject.getItemStack().getTagCompound();
if (data != null) {
this.craftingGrid.readFromNBT(data, "craftingGrid");
}
}
@Override
public void onChangeInventory(final IItemHandler inv, final int slot, final InvOperation mc, final ItemStack removedStack, final ItemStack newStack) {
if (inv == craftingGrid) {
saveChanges();
}
}
@Override
public IItemHandler getInventoryByName(final String name) {
if (name.equals("player")) {
return new PlayerInvWrapper(this.getInventoryPlayer());
} else if (name.equals("crafting")) {
return this.craftingGrid;
}
return null;
}
@Override
public boolean useRealItems() {
return true;
}
}
@@ -0,0 +1,326 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.container.implementations;
import appeng.api.config.Actionable;
import appeng.api.config.PowerMultiplier;
import appeng.api.implementations.ICraftingPatternItem;
import appeng.api.implementations.IUpgradeableCellContainer;
import appeng.api.networking.crafting.ICraftingPatternDetails;
import appeng.api.storage.data.IAEItemStack;
import appeng.container.interfaces.IInventorySlotAware;
import appeng.container.slot.OptionalSlotFake;
import appeng.container.slot.SlotFakeCraftingMatrix;
import appeng.container.slot.SlotPatternOutputs;
import appeng.container.slot.SlotPatternTerm;
import appeng.container.slot.SlotRestrictedInput;
import appeng.core.AEConfig;
import appeng.core.localization.PlayerMessages;
import appeng.helpers.WirelessTerminalGuiObject;
import appeng.parts.automation.StackUpgradeInventory;
import appeng.tile.inventory.AppEngInternalInventory;
import appeng.util.Platform;
import appeng.util.helpers.ItemHandlerUtil;
import appeng.util.inv.InvOperation;
import baubles.api.BaublesApi;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.ClickType;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.items.IItemHandler;
import static appeng.helpers.PatternHelper.CRAFTING_GRID_DIMENSION;
public class ContainerWirelessPatternTerminal extends ContainerPatternEncoder implements IUpgradeableCellContainer, IInventorySlotAware {
private final WirelessTerminalGuiObject wirelessTerminalGUIObject;
private final int slot;
protected AppEngInternalInventory output;
protected AppEngInternalInventory pattern;
protected AppEngInternalInventory upgrades;
protected SlotRestrictedInput magnetSlot;
private double powerMultiplier = 0.5;
private int ticks = 0;
public ContainerWirelessPatternTerminal(final InventoryPlayer ip, final WirelessTerminalGuiObject gui) {
super(ip, gui, gui, false);
this.crafting = new AppEngInternalInventory(this, CRAFTING_GRID_DIMENSION * CRAFTING_GRID_DIMENSION);
this.output = new AppEngInternalInventory(this, 3);
this.pattern = new AppEngInternalInventory(this, 2);
this.craftingSlots = new SlotFakeCraftingMatrix[9];
this.outputSlots = new OptionalSlotFake[3];
if (gui != null) {
final int slotIndex = gui.getInventorySlot();
if (!((IInventorySlotAware) gui).isBaubleSlot()) {
this.lockPlayerInventorySlot(slotIndex);
}
this.slot = slotIndex;
} else {
this.slot = -1;
this.lockPlayerInventorySlot(ip.currentItem);
}
this.wirelessTerminalGUIObject = gui;
upgrades = new StackUpgradeInventory(wirelessTerminalGUIObject.getItemStack(), this, 2);
this.loadFromNBT();
for (int y = 0; y < 3; y++) {
for (int x = 0; x < 3; x++) {
this.addSlotToContainer(this.craftingSlots[x + y * 3] = new SlotFakeCraftingMatrix(this.crafting, x + y * 3, 18 + x * 18, -76 + y * 18));
}
}
this.addSlotToContainer(this.craftSlot = new SlotPatternTerm(ip.player, this.getActionSource(), this
.getPowerSource(), gui, this.crafting, pattern, this.cOut, 110, -76 + 18, this, 2, this));
this.craftSlot.setIIcon(-1);
for (int y = 0; y < this.outputSlots.length; y++) {
this.addSlotToContainer(this.outputSlots[y] = new SlotPatternOutputs(output, this, y, 110, -76 + y * 18, 0, 0, 1));
this.outputSlots[y].setRenderDisabled(false);
this.outputSlots[y].setIIcon(-1);
}
this.addSlotToContainer(
this.patternSlotIN = new SlotRestrictedInput(SlotRestrictedInput.PlacableItemType.BLANK_PATTERN, pattern, 0, 147, -72 - 9, this
.getInventoryPlayer()));
this.addSlotToContainer(
this.patternSlotOUT = new SlotRestrictedInput(SlotRestrictedInput.PlacableItemType.ENCODED_PATTERN, pattern, 1, 147, -72 + 34, this
.getInventoryPlayer()));
this.patternSlotOUT.setStackLimit(1);
this.updateOrderOfOutputSlots();
this.bindPlayerInventory(ip, 0, 0);
this.setupUpgrades();
}
@Override
public void detectAndSendChanges() {
if (Platform.isServer()) {
final ItemStack currentItem;
if (wirelessTerminalGUIObject.isBaubleSlot()) {
currentItem = BaublesApi.getBaublesHandler(this.getPlayerInv().player).getStackInSlot(this.slot);
} else {
currentItem = this.slot < 0 ? this.getPlayerInv().getCurrentItem() : this.getPlayerInv().getStackInSlot(this.slot);
}
if (currentItem.isEmpty()) {
this.setValidContainer(false);
} else if (!this.wirelessTerminalGUIObject.getItemStack().isEmpty() && currentItem != this.wirelessTerminalGUIObject.getItemStack()) {
if (ItemStack.areItemsEqual(this.wirelessTerminalGUIObject.getItemStack(), currentItem)) {
if (wirelessTerminalGUIObject.isBaubleSlot()) {
BaublesApi.getBaublesHandler(this.getPlayerInv().player).setStackInSlot(this.slot, this.wirelessTerminalGUIObject.getItemStack());
} else {
this.getPlayerInv().setInventorySlotContents(this.slot, this.wirelessTerminalGUIObject.getItemStack());
}
} else {
this.setValidContainer(false);
}
}
// drain 1 ae t
this.ticks++;
if (this.ticks > 10) {
double ext = this.wirelessTerminalGUIObject.extractAEPower(this.getPowerMultiplier() * this.ticks, Actionable.MODULATE, PowerMultiplier.CONFIG);
if (ext < this.getPowerMultiplier() * this.ticks) {
if (Platform.isServer() && this.isValidContainer()) {
this.getPlayerInv().player.sendMessage(PlayerMessages.DeviceNotPowered.get());
}
this.setValidContainer(false);
}
this.ticks = 0;
}
if (!this.wirelessTerminalGUIObject.rangeCheck()) {
if (Platform.isServer() && this.isValidContainer()) {
this.getPlayerInv().player.sendMessage(PlayerMessages.OutOfRange.get());
}
this.setValidContainer(false);
} else {
this.setPowerMultiplier(AEConfig.instance().wireless_getDrainRate(this.wirelessTerminalGUIObject.getRange()));
}
super.detectAndSendChanges();
}
}
@Override
public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayer player) {
if (slotId >= 0 && slotId < this.inventorySlots.size()) {
if (clickTypeIn == ClickType.PICKUP && dragType == 1) {
if (this.inventorySlots.get(slotId) == magnetSlot) {
ItemStack itemStack = magnetSlot.getStack();
if (!magnetSlot.getStack().isEmpty()) {
NBTTagCompound tag = itemStack.getTagCompound();
if (tag == null) {
tag = new NBTTagCompound();
}
if (tag.hasKey("enabled")) {
boolean e = tag.getBoolean("enabled");
tag.setBoolean("enabled", !e);
} else {
tag.setBoolean("enabled", false);
}
magnetSlot.getStack().setTagCompound(tag);
magnetSlot.onSlotChanged();
return ItemStack.EMPTY;
}
}
}
}
return super.slotClick(slotId, dragType, clickTypeIn, player);
}
private double getPowerMultiplier() {
return this.powerMultiplier;
}
void setPowerMultiplier(final double powerMultiplier) {
this.powerMultiplier = powerMultiplier;
}
@Override
public boolean isSlotEnabled(final int idx) {
boolean crafting = false;
if (Platform.isServer()) {
NBTTagCompound nbtTagCompound = iGuiItemObject.getItemStack().getTagCompound();
if (nbtTagCompound != null) {
if (nbtTagCompound.hasKey("isCraftingMode")) {
crafting = nbtTagCompound.getBoolean("isCraftingMode");
}
}
}
if (idx == 1) {
return Platform.isServer() ? !crafting : !this.isCraftingMode();
} else if (idx == 2) {
return Platform.isServer() ? crafting : this.isCraftingMode();
} else {
return false;
}
}
@Override
public void saveChanges() {
if (Platform.isServer()) {
NBTTagCompound tag = new NBTTagCompound();
((AppEngInternalInventory) crafting).writeToNBT(tag, "craftingGrid");
this.output.writeToNBT(tag, "output");
this.pattern.writeToNBT(tag, "patterns");
this.upgrades.writeToNBT(tag, "upgrades");
this.wirelessTerminalGUIObject.saveChanges(tag);
}
}
private void loadFromNBT() {
NBTTagCompound data = wirelessTerminalGUIObject.getItemStack().getTagCompound();
if (data != null) {
((AppEngInternalInventory) crafting).readFromNBT(data, "craftingGrid");
this.output.readFromNBT(data, "output");
this.pattern.readFromNBT(data, "patterns");
upgrades.readFromNBT(wirelessTerminalGUIObject.getItemStack().getTagCompound().getCompoundTag("upgrades"));
}
}
@Override
public void onChangeInventory(final IItemHandler inv, final int slot, final InvOperation mc, final ItemStack removedStack, final ItemStack newStack) {
if (inv == this.pattern && slot == 1) {
final ItemStack is = this.pattern.getStackInSlot(1);
if (!is.isEmpty() && is.getItem() instanceof ICraftingPatternItem) {
final ICraftingPatternItem pattern = (ICraftingPatternItem) is.getItem();
final ICraftingPatternDetails details = pattern.getPatternForItem(is, this.getPlayerInv().player.world);
if (details != null) {
this.setCraftingMode(details.isCraftable());
this.setSubstitute(details.canSubstitute());
for (int x = 0; x < this.crafting.getSlots() && x < details.getInputs().length; x++) {
final IAEItemStack item = details.getInputs()[x];
ItemHandlerUtil.setStackInSlot(this.crafting, x, item == null ? ItemStack.EMPTY : item.createItemStack());
}
for (int x = 0; x < this.output.getSlots(); x++) {
final IAEItemStack item;
if (x < details.getOutputs().length) {
item = details.getOutputs()[x];
} else {
item = null;
}
this.output.setStackInSlot(x, item == null ? ItemStack.EMPTY : item.createItemStack());
}
}
}
}
super.onChangeInventory(inv, slot, mc, removedStack, newStack);
}
@Override
public IItemHandler getInventoryByName(String name) {
if (name.equals("crafting")) {
return this.crafting;
} else if (name.equals("output")) {
return this.output;
}
return super.getInventoryByName(name);
}
@Override
public boolean useRealItems() {
return false;
}
@Override
public int availableUpgrades() {
return 1;
}
@Override
public void setupUpgrades() {
if (wirelessTerminalGUIObject != null) {
for (int upgradeSlot = 0; upgradeSlot < availableUpgrades(); upgradeSlot++) {
this.magnetSlot = new SlotRestrictedInput(SlotRestrictedInput.PlacableItemType.UPGRADES, upgrades, upgradeSlot, 206, 135 + upgradeSlot * 18, this.getInventoryPlayer());
this.magnetSlot.setNotDraggable();
this.addSlotToContainer(magnetSlot);
}
}
}
@Override
public int getInventorySlot() {
return wirelessTerminalGUIObject.getInventorySlot();
}
@Override
public boolean isBaubleSlot() {
return wirelessTerminalGUIObject.isBaubleSlot();
}
}
@@ -19,34 +19,13 @@
package appeng.container.implementations;
import appeng.core.AEConfig;
import appeng.core.localization.PlayerMessages;
import appeng.helpers.WirelessTerminalGuiObject;
import appeng.util.Platform;
import net.minecraft.entity.player.InventoryPlayer;
public class ContainerWirelessTerm extends ContainerMEPortableCell {
private final WirelessTerminalGuiObject wirelessTerminalGUIObject;
public class ContainerWirelessTerm extends ContainerMEPortableTerminal {
public ContainerWirelessTerm(final InventoryPlayer ip, final WirelessTerminalGuiObject gui) {
super(ip, gui);
this.wirelessTerminalGUIObject = gui;
}
@Override
public void detectAndSendChanges() {
super.detectAndSendChanges();
if (!this.wirelessTerminalGUIObject.rangeCheck()) {
if (Platform.isServer() && this.isValidContainer()) {
this.getPlayerInv().player.sendMessage(PlayerMessages.OutOfRange.get());
}
this.setValidContainer(false);
} else {
this.setPowerMultiplier(AEConfig.instance().wireless_getDrainRate(this.wirelessTerminalGUIObject.getRange()));
}
super(ip, gui, false);
}
}
@@ -1,35 +1,39 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.container.interfaces;
/**
* Any item providing a GUI and depending on an exact inventory slot.
* <p>
* This interface is likely a volatile one until a general GUI refactoring occurred.
* Use it with care and expect changes.
*/
public interface IInventorySlotAware {
/**
* This is needed to select the correct slot index.
*
* @return the inventory index of this portable cell.
*/
int getInventorySlot();
}
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.container.interfaces;
/**
* Any item providing a GUI and depending on an exact inventory slot.
* <p>
* This interface is likely a volatile one until a general GUI refactoring occurred.
* Use it with care and expect changes.
*/
public interface IInventorySlotAware {
/**
* This is needed to select the correct slot index.
*
* @return the inventory index of this portable cell.
*/
int getInventorySlot();
default boolean isBaubleSlot() {
return false;
}
}
@@ -40,7 +40,6 @@ import appeng.util.inv.AdaptorItemHandler;
import appeng.util.inv.WrapperCursorItemHandler;
import appeng.util.inv.WrapperInvItemHandler;
import appeng.util.item.AEItemStack;
import com.blamejared.recipestages.RecipeStages;
import com.blamejared.recipestages.recipes.RecipeStage;
import net.darkhax.gamestages.GameStageHelper;
import net.darkhax.itemstages.ItemStages;
@@ -55,9 +54,10 @@ import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.items.IItemHandler;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -101,16 +101,21 @@ public class SlotCraftingTerm extends AppEngCraftingSlot {
@Override
public ItemStack getStack() {
if (Platform.isClient() && Loader.isModLoaded("itemstages")) {
final ItemStack item = super.getStack();
final String itemsStage = ItemStages.getStage(item);
final String enchantStage = ItemStages.getEnchantStage(item);
final EntityPlayer player = Minecraft.getMinecraft().player;
if ((itemsStage != null && !GameStageHelper.hasStage(player, itemsStage))
|| (enchantStage != null && !GameStageHelper.hasStage(player, enchantStage)))
return ItemStack.EMPTY;
return itemstageStack();
}
return super.getStack();
}
@SideOnly(Side.CLIENT)
ItemStack itemstageStack() {
final ItemStack item = super.getStack();
final String itemsStage = ItemStages.getStage(item);
final String enchantStage = ItemStages.getEnchantStage(item);
final EntityPlayer player = Minecraft.getMinecraft().player;
if ((itemsStage != null && !GameStageHelper.hasStage(player, itemsStage))
|| (enchantStage != null && !GameStageHelper.hasStage(player, enchantStage)))
return ItemStack.EMPTY;
return super.getStack();
}
@@ -196,7 +201,7 @@ public class SlotCraftingTerm extends AppEngCraftingSlot {
final String enchantStage = ItemStages.getEnchantStage(recipe.getRecipeOutput());
if ((itemsStage != null && !GameStageHelper.hasStage(player, itemsStage))
|| (enchantStage != null && !GameStageHelper.hasStage(player, enchantStage)))
|| (enchantStage != null && !GameStageHelper.hasStage(player, enchantStage)))
return null;
}
@@ -20,6 +20,7 @@ package appeng.container.slot;
import appeng.api.AEApi;
import appeng.api.config.Upgrades;
import appeng.api.definitions.IDefinitions;
import appeng.api.definitions.IItems;
import appeng.api.definitions.IMaterials;
@@ -64,6 +65,10 @@ public class SlotRestrictedInput extends AppEngSlot {
this.p = p;
}
public PlacableItemType getPlaceableItemType() {
return which;
}
@Override
public int getSlotStackLimit() {
if (this.stackLimit != -1) {
@@ -200,6 +205,11 @@ public class SlotRestrictedInput extends AppEngSlot {
return i.getItem() instanceof IBiometricCard;
case UPGRADES:
return i.getItem() instanceof IUpgradeModule && ((IUpgradeModule) i.getItem()).getType(i) != null;
case CARD_QUANTUM:
if (AEApi.instance().definitions().materials().cardQuantumLink().maybeItem().isPresent()) {
return AEApi.instance().definitions().materials().cardQuantumLink().maybeItem().get() == i.getItem();
}
return false;
default:
break;
}
@@ -269,6 +279,8 @@ public class SlotRestrictedInput extends AppEngSlot {
RANGE_BOOSTER(6 * 16 + 15),
QE_SINGULARITY(10 * 16 + 15),
CARD_QUANTUM(13 * 16 + 15),
SPATIAL_STORAGE_CELLS(11 * 16 + 15),
FUEL(12 * 16 + 15),
+58
View File
@@ -0,0 +1,58 @@
/*
* Copyright (c) 2018, 2020 Adrian Siekierka
*
* This file is part of StackUp.
*
* StackUp is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* StackUp is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with StackUp. If not, see <http://www.gnu.org/licenses/>.
*/
package appeng.core;
import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
import javax.annotation.Nullable;
import java.util.Map;
@IFMLLoadingPlugin.Name("AE2ELCore")
@IFMLLoadingPlugin.MCVersion("1.12.2")
@IFMLLoadingPlugin.SortingIndex(1001)
@IFMLLoadingPlugin.TransformerExclusions("appeng.core.transformer")
public class AE2ELCore implements IFMLLoadingPlugin {
@Override
public String[] getASMTransformerClass() {
return new String[]{
"appeng.core.transformer.AE2ELTransformer"
};
}
@Override
public String getModContainerClass() {
return null;
}
@Nullable
@Override
public String getSetupClass() {
return null;
}
@Override
public void injectData(Map<String, Object> data) {
}
@Override
public String getAccessTransformerClass() {
return null;
}
}
+23 -2
View File
@@ -43,8 +43,8 @@ import java.util.stream.Stream;
public final class AEConfig extends Configuration implements IConfigurableObject, IConfigManagerHost {
public static final String VERSION = "@version@";
public static final String CHANNEL = "@aechannel@";
public static final String VERSION = appeng.Tags.VERSION;
public static final String CHANNEL = appeng.Tags.AECHANNEL;
public static final String PACKET_CHANNEL = "AE";
// Tunnels
public static final double TUNNEL_POWER_LOSS = 0.05;
@@ -82,6 +82,8 @@ public final class AEConfig extends Configuration implements IConfigurableObject
private boolean disableColoredCableRecipesInJEI = true;
private int craftingCalculationTimePerTick = 5;
private PowerUnits selectedPowerUnit = PowerUnits.AE;
private boolean showCraftableTooltip = true;
// Spatial IO/Dimension
private int storageProviderID = -1;
private int storageDimensionID = -1;
@@ -121,6 +123,9 @@ public final class AEConfig extends Configuration implements IConfigurableObject
private int maxControllerSizeY = 7;
private int maxControllerSizeZ = 7;
private int normalChannelCapacity = 8;
private int denseChannelCapacity = 32;
private AEConfig(final File configFile) {
super(configFile);
this.configFile = configFile;
@@ -138,6 +143,8 @@ public final class AEConfig extends Configuration implements IConfigurableObject
CondenserOutput.SINGULARITY.requiredPower = this.get("Condenser", "Singularity", 256000).getInt(256000);
this.removeCrashingItemsOnLoad = this.get("general", "removeCrashingItemsOnLoad", false, "Will auto-remove items that crash when being loaded from storage. This will destroy those items instead of crashing the game!").getBoolean();
this.normalChannelCapacity = Math.min(this.get("general", "normalChannelCapacity", this.normalChannelCapacity, "Max channel number may not exceed 256").getInt(this.normalChannelCapacity), 256);
this.denseChannelCapacity = Math.min(this.get("general", "denseChannelCapacity", this.denseChannelCapacity, "Max channel number may not exceed 256").getInt(this.denseChannelCapacity), 256);
this.setCategoryComment("BlockingMode", "Map of items to not block when blockingmode is enabled.\n[modid]\nmodid:item:metadata(optional,default:0)\nSupports more than one modid, so you can block different things between, for example, gregtech or enderio");
this.nonBlockingItems = this.get("BlockingMode", "nonBlockingItems", nonBlockingItems, "NonBlockingItems").getStringList();
@@ -188,6 +195,7 @@ public final class AEConfig extends Configuration implements IConfigurableObject
this.maxControllerSizeY = Math.min(Math.max(this.get("ControllerSize", "maxControllerSizeY", this.maxControllerSizeY).getInt(this.maxControllerSizeY), 1), 63);
this.maxControllerSizeZ = Math.min(Math.max(this.get("ControllerSize", "maxControllerSizeZ", this.maxControllerSizeZ).getInt(this.maxControllerSizeZ), 1), 63);
this.clientSync();
this.addCustomCategoryComment("features", "Warning: Disabling a feature may disable other features depending on it.");
@@ -248,6 +256,7 @@ public final class AEConfig extends Configuration implements IConfigurableObject
this.enableEffects = this.get("Client", "enableEffects", true).getBoolean(true);
this.useLargeFonts = this.get("Client", "useTerminalUseLargeFont", false).getBoolean(false);
this.useColoredCraftingStatus = this.get("Client", "useColoredCraftingStatus", true).getBoolean(true);
this.showCraftableTooltip = this.get("Client", "showCraftableTooltip", true, "Whether to add \"Craftable\" to item tooltips when they can be crafted automatically.").getBoolean(true);
// load buttons..
for (int btnNum = 0; btnNum < 4; btnNum++) {
@@ -501,6 +510,10 @@ public final class AEConfig extends Configuration implements IConfigurableObject
return this.useColoredCraftingStatus;
}
public boolean isShowCraftableTooltip() {
return this.showCraftableTooltip;
}
public boolean isDisableColoredCableRecipesInJEI() {
return this.disableColoredCableRecipesInJEI;
}
@@ -670,4 +683,12 @@ public final class AEConfig extends Configuration implements IConfigurableObject
public int getMaxControllerSizeZ() {
return this.maxControllerSizeZ;
}
public int getNormalChannelCapacity() {
return this.normalChannelCapacity;
}
public int getDenseChannelCapacity() {
return this.denseChannelCapacity;
}
}
+5 -1
View File
@@ -72,7 +72,11 @@ public final class AppEng {
private static final String FORGE_CURRENT_VERSION = ForgeVersion.majorVersion + "." + ForgeVersion.minorVersion + "." + ForgeVersion.revisionVersion + "." + ForgeVersion.buildVersion;
private static final String FORGE_MAX_VERSION = (ForgeVersion.majorVersion + 1) + ".0.0.0";
public static final String MOD_DEPENDENCIES = "required-after:forge@[" + FORGE_CURRENT_VERSION + "," + FORGE_MAX_VERSION + ");after:ctm@[" + CTM.VERSION + ",);after:itemstages;after:recipestages";
public static final String MOD_DEPENDENCIES = "required-after:forge@[" + FORGE_CURRENT_VERSION + "," + FORGE_MAX_VERSION + ");" +
"after:ctm@[" + CTM.VERSION + ",);" +
"after:itemstages;" +
"after:recipestages;" +
"before:bogosorter@[1.2.2,);";
@Nonnull
private static final AppEng INSTANCE = new AppEng();
+21 -1
View File
@@ -19,8 +19,10 @@
package appeng.core;
import appeng.api.AEApi;
import appeng.api.config.Upgrades;
import appeng.api.definitions.IBlocks;
import appeng.api.definitions.IItemDefinition;
import appeng.api.definitions.IItems;
import appeng.api.definitions.IParts;
import appeng.api.features.IRecipeHandlerRegistry;
@@ -105,7 +107,9 @@ import javax.annotation.Nonnull;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -377,6 +381,9 @@ final class Registration {
Upgrades.FUZZY.registerItem(items.viewCell(), 1);
Upgrades.INVERTER.registerItem(items.viewCell(), 1);
Upgrades.FUZZY.registerItem(AEApi.instance().definitions().materials().cardMagnet(), 1);
Upgrades.INVERTER.registerItem(AEApi.instance().definitions().materials().cardMagnet(), 1);
// Storage Bus
Upgrades.FUZZY.registerItem(parts.storageBus(), 1);
Upgrades.INVERTER.registerItem(parts.storageBus(), 1);
@@ -402,8 +409,21 @@ final class Registration {
// Inscriber
Upgrades.SPEED.registerItem(blocks.inscriber(), 3);
Upgrades.QUANTUM_LINK.registerItem(blocks.quantumLink(), 1);
// Wireless Terminal Handler
items.wirelessTerminal().maybeItem().ifPresent(terminal -> registries.wireless().registerWirelessHandler((IWirelessTermHandler) terminal));
ArrayList<IItemDefinition> iids = new ArrayList<>();
iids.add(items.wirelessTerminal());
iids.add(items.wirelessCraftingTerminal());
iids.add(items.wirelessPatternTerminal());
for (IItemDefinition id : iids) {
id.maybeItem().ifPresent(terminal -> {
registries.wireless().registerWirelessHandler((IWirelessTermHandler) terminal);
Upgrades.MAGNET.registerItem(id, 1);
});
}
items.wirelessFluidTerminal().maybeItem().ifPresent(terminal -> registries.wireless().registerWirelessHandler((IWirelessTermHandler) terminal));
// Charge Rates
items.chargedStaff().maybeItem().ifPresent(chargedStaff -> registries.charger().addChargeRate(chargedStaff, 320d));
@@ -4,14 +4,36 @@ package appeng.core.api;
import appeng.api.config.IncludeExclude;
import appeng.api.storage.ICellInventory;
import appeng.api.storage.ICellInventoryHandler;
import appeng.api.storage.channels.IFluidStorageChannel;
import appeng.api.storage.channels.IItemStorageChannel;
import appeng.api.storage.data.IAEFluidStack;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IAEStack;
import appeng.api.storage.data.IItemList;
import appeng.api.util.IClientHelper;
import appeng.core.localization.GuiText;
import appeng.fluids.items.FluidDummyItem;
import appeng.fluids.util.AEFluidStack;
import appeng.util.ReadableNumberConverter;
import appeng.util.item.AEItemStack;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidUtil;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.oredict.OreDictionary;
import org.lwjgl.input.Keyboard;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Collection;
import java.util.List;
public class ApiClientHelper implements IClientHelper {
private static final String[] NUMBER_FORMATS = new String[]{"#.000", "#.00", "#.0", "#"};
@Override
public <T extends IAEStack<T>> void addCellInformation(ICellInventoryHandler<T> handler, List<String> lines) {
if (handler == null) {
@@ -27,16 +49,95 @@ public class ApiClientHelper implements IClientHelper {
.getLocal());
}
IItemList<?> itemList = cellInventory.getChannel().createList();
if (handler.isPreformatted()) {
final String list = (handler.getIncludeExcludeMode() == IncludeExclude.WHITELIST ? GuiText.Included : GuiText.Excluded).getLocal();
if (handler.isFuzzy()) {
lines.add(GuiText.Partitioned.getLocal() + " - " + list + ' ' + GuiText.Fuzzy.getLocal());
lines.add("[" + GuiText.Partitioned.getLocal() + "]" + " - " + list + ' ' + GuiText.Fuzzy.getLocal());
} else {
lines.add(GuiText.Partitioned.getLocal() + " - " + list + ' ' + GuiText.Precise.getLocal());
lines.add("[" + GuiText.Partitioned.getLocal() + "]" + " - " + list + ' ' + GuiText.Precise.getLocal());
}
if (Minecraft.getMinecraft().gameSettings.advancedItemTooltips || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT)) {
IItemHandler inv = cellInventory.getConfigInventory();
cellInventory.getAvailableItems((IItemList) itemList);
for (int i = 0; i < inv.getSlots(); i++) {
final ItemStack is = inv.getStackInSlot(i);
if (!is.isEmpty()) {
if (cellInventory.getChannel() instanceof IItemStorageChannel) {
if (!handler.isFuzzy()) {
final IAEItemStack ais = AEItemStack.fromItemStack(is);
IAEItemStack stocked = ((IItemList<IAEItemStack>) itemList).findPrecise(ais);
lines.add("[" + is.getDisplayName() + "]" + ": " + (stocked == null ? "0" : ReadableNumberConverter.INSTANCE.toWideReadableForm(stocked.getStackSize())));
} else {
final IAEItemStack ais = AEItemStack.fromItemStack(is);
Collection<IAEItemStack> stocked = ((IItemList<IAEItemStack>) itemList).findFuzzy(ais, handler.getCellInv().getFuzzyMode());
int[] ids = OreDictionary.getOreIDs(is);
long size = 0;
for (IAEItemStack ist : stocked) {
size += ist.getStackSize();
}
if (is.getItem().isDamageable()) {
lines.add("[" + is.getDisplayName() + "]" + ": " + size);
} else if (ids.length > 0) {
StringBuilder sb = new StringBuilder();
for (int j : ids) {
sb.append(OreDictionary.getOreName(j)).append(", ");
}
lines.add("[{" + sb.substring(0, sb.length() - 2) + "}]" + ": " + ReadableNumberConverter.INSTANCE.toWideReadableForm(size));
}
}
} else if (cellInventory.getChannel() instanceof IFluidStorageChannel) {
final AEFluidStack ais;
if (is.getItem() instanceof FluidDummyItem) {
ais = AEFluidStack.fromFluidStack(((FluidDummyItem) is.getItem()).getFluidStack(is));
} else {
ais = AEFluidStack.fromFluidStack(FluidUtil.getFluidContained(is));
}
IAEFluidStack stocked = ((IItemList<IAEFluidStack>) itemList).findPrecise(ais);
lines.add("[" + is.getDisplayName() + "]" + ": " + (stocked == null ? "0" : fluidStackSize(stocked.getStackSize())));
}
}
}
}
} else {
if (Minecraft.getMinecraft().gameSettings.advancedItemTooltips || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT)) {
cellInventory.getAvailableItems((IItemList) itemList);
for (IAEStack<?> s : itemList) {
if (s instanceof IAEItemStack) {
lines.add(((IAEItemStack) s).getDefinition().getDisplayName() + ": " + ReadableNumberConverter.INSTANCE.toWideReadableForm(s.getStackSize()));
} else if (s instanceof IAEFluidStack) {
lines.add(((IAEFluidStack) s).getFluidStack().getLocalizedName() + ": " + fluidStackSize(s.getStackSize()));
}
}
}
}
}
private String fluidStackSize(long size) {
String unit;
if (size >= 1000) {
unit = "B";
} else {
unit = "mB";
}
final int log = (int) Math.floor(Math.log10(size)) / 2;
final int index = Math.max(0, Math.min(3, log));
final DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator('.');
final DecimalFormat format = new DecimalFormat(NUMBER_FORMATS[index]);
format.setDecimalFormatSymbols(symbols);
format.setRoundingMode(RoundingMode.DOWN);
String formatted = format.format(size / 1000d);
return formatted.concat(unit);
}
}
+2 -2
View File
@@ -41,8 +41,8 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.commons.ClassRemapper;
import org.objectweb.asm.commons.Remapper;
import org.objectweb.asm.commons.RemappingClassAdapter;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodInsnNode;
@@ -150,7 +150,7 @@ public class ApiPart implements IPartHelper {
final DefaultPackageClassNameRemapper remapper = new DefaultPackageClassNameRemapper();
remapper.inputOutput.put("appeng/api/parts/LayerBase", n.superName);
remapper.inputOutput.put(originalName, n.name);
n.accept(new RemappingClassAdapter(cw, remapper));
n.accept(new ClassRemapper(cw, remapper));
// n.accept( cw );
// n.accept( new TraceClassVisitor( new PrintWriter( System.out ) ) );
@@ -521,6 +521,10 @@ public final class ApiBlocks implements IBlocks {
.disableItem()
.build();
if (!doubleSlabDef.maybeBlock().isPresent()) {
return new BlockDefinition(slabId, null, null);
}
Verify.verify(doubleSlabDef.maybeBlock().isPresent());
BlockSlab doubleSlabBlock = (BlockSlab) doubleSlabDef.maybeBlock().get();
@@ -530,6 +534,10 @@ public final class ApiBlocks implements IBlocks {
.features(AEFeature.DECORATIVE_BLOCKS)
.build();
if (!itemDef.maybeItem().isPresent()) {
return new BlockDefinition(slabId, null, null);
}
Verify.verify(itemDef.maybeItem().isPresent());
// Return a new composite block definition that combines the single slab block with the slab item
@@ -78,6 +78,9 @@ public final class ApiItems implements IItems {
private final IItemDefinition entropyManipulator;
private final IItemDefinition wirelessTerminal;
private final IItemDefinition wirelessCraftingTerminal;
private final IItemDefinition wirelessPatternTerminal;
private final IItemDefinition wirelessFluidTerminal;
private final IItemDefinition biometricCard;
private final IItemDefinition chargedStaff;
private final IItemDefinition massCannon;
@@ -178,6 +181,10 @@ public final class ApiItems implements IItems {
.dispenserBehavior(DispenserBlockTool::new)
.build();
this.wirelessTerminal = powerTools.item("wireless_terminal", ToolWirelessTerminal::new).addFeatures(AEFeature.WIRELESS_ACCESS_TERMINAL).build();
this.wirelessCraftingTerminal = powerTools.item("wireless_crafting_terminal", ToolWirelessCraftingTerminal::new).addFeatures(AEFeature.WIRELESS_CRAFTING_TERMINAL).build();
this.wirelessPatternTerminal = powerTools.item("wireless_pattern_terminal", ToolWirelessPatternTerminal::new).addFeatures(AEFeature.WIRELESS_PATTERN_TERMINAL).build();
this.wirelessFluidTerminal = powerTools.item("wireless_fluid_terminal", ToolWirelessFluidTerminal::new).addFeatures(AEFeature.WIRELESS_FLUID_TERMINAL).build();
this.chargedStaff = powerTools.item("charged_staff", ToolChargedStaff::new).addFeatures(AEFeature.CHARGED_STAFF).build();
this.massCannon = powerTools.item("matter_cannon", ToolMatterCannon::new)
.addFeatures(AEFeature.MATTER_CANNON)
@@ -343,6 +350,21 @@ public final class ApiItems implements IItems {
return this.wirelessTerminal;
}
@Override
public IItemDefinition wirelessCraftingTerminal() {
return wirelessCraftingTerminal;
}
@Override
public IItemDefinition wirelessFluidTerminal() {
return wirelessFluidTerminal;
}
@Override
public IItemDefinition wirelessPatternTerminal() {
return wirelessPatternTerminal;
}
@Override
public IItemDefinition biometricCard() {
return this.biometricCard;
@@ -85,6 +85,8 @@ public final class ApiMaterials implements IMaterials {
private final IItemDefinition cardSpeed;
private final IItemDefinition cardCapacity;
private final IItemDefinition cardPatternExpansion;
private final IItemDefinition cardQuantumLink;
private final IItemDefinition cardMagnet;
private final IItemDefinition cardFuzzy;
private final IItemDefinition cardInverter;
private final IItemDefinition cardCrafting;
@@ -201,6 +203,8 @@ public final class ApiMaterials implements IMaterials {
this.cardSpeed = new DamagedItemDefinition("material.card.acceleration", materials.createMaterial(MaterialType.CARD_SPEED));
this.cardCapacity = new DamagedItemDefinition("material.card.capacity", materials.createMaterial(MaterialType.CARD_CAPACITY));
this.cardPatternExpansion = new DamagedItemDefinition("material.card.pattern.expansion", materials.createMaterial(MaterialType.CARD_PATTERN_EXPANSION));
this.cardQuantumLink = new DamagedItemDefinition("material.card.quantum.link", materials.createMaterial(MaterialType.CARD_QUANTUM_LINK));
this.cardMagnet = new DamagedItemDefinition("material.card.magnet", materials.createMaterial(MaterialType.CARD_MAGNET));
this.cardFuzzy = new DamagedItemDefinition("material.card.fuzzy", materials.createMaterial(MaterialType.CARD_FUZZY));
this.cardInverter = new DamagedItemDefinition("material.card.inverter", materials.createMaterial(MaterialType.CARD_INVERTER));
this.cardCrafting = new DamagedItemDefinition("material.card.crafting", materials.createMaterial(MaterialType.CARD_CRAFTING));
@@ -396,6 +400,16 @@ public final class ApiMaterials implements IMaterials {
return this.cardPatternExpansion;
}
@Override
public IItemDefinition cardQuantumLink() {
return this.cardQuantumLink;
}
@Override
public IItemDefinition cardMagnet() {
return this.cardMagnet;
}
@Override
public IItemDefinition cardFuzzy() {
return this.cardFuzzy;
@@ -28,6 +28,7 @@ package appeng.core.api.imc;
import appeng.api.AEApi;
import appeng.core.AELog;
import appeng.core.api.IIMCProcessor;
import net.minecraft.launchwrapper.Launch;
import net.minecraftforge.fml.common.event.FMLInterModComms.IMCMessage;
@@ -37,7 +38,7 @@ public class IMCSpatial implements IIMCProcessor {
public void process(final IMCMessage m) {
try {
final Class classInstance = Class.forName(m.getStringValue());
final Class classInstance = Class.forName(m.getStringValue(), false, Launch.classLoader);
AEApi.instance().registries().movable().whiteListTileEntity(classInstance);
} catch (final ClassNotFoundException e) {
AELog.info("Bad Class Registered: " + m.getStringValue() + " by " + m.getSender());
@@ -64,12 +64,17 @@ public enum AEFeature {
ENTROPY_MANIPULATOR("EntropyManipulator", Constants.CATEGORY_TOOLS),
MATTER_CANNON("MatterCannon", Constants.CATEGORY_TOOLS),
WIRELESS_ACCESS_TERMINAL("WirelessAccessTerminal", Constants.CATEGORY_TOOLS),
WIRELESS_CRAFTING_TERMINAL("WirelessCraftingTerminal", Constants.CATEGORY_TOOLS),
WIRELESS_PATTERN_TERMINAL("WirelessPatternTerminal", Constants.CATEGORY_TOOLS),
WIRELESS_FLUID_TERMINAL("WirelessFluidTerminal", Constants.CATEGORY_TOOLS),
COLOR_APPLICATOR("ColorApplicator", Constants.CATEGORY_TOOLS),
METEORITE_COMPASS("MeteoriteCompass", Constants.CATEGORY_TOOLS),
SECURITY("Security", Constants.CATEGORY_NETWORK_FEATURES),
SPATIAL_IO("SpatialIO", Constants.CATEGORY_NETWORK_FEATURES),
QUANTUM_NETWORK_BRIDGE("QuantumNetworkBridge", Constants.CATEGORY_NETWORK_FEATURES),
QUANTUM_LINKING_CARD("QuantumLinkingCard", Constants.CATEGORY_NETWORK_FEATURES),
CHANNELS("Channels", Constants.CATEGORY_NETWORK_FEATURES),
INTERFACE("Interface", Constants.CATEGORY_NETWORK_BUSES),
@@ -25,10 +25,13 @@ import appeng.api.features.IWirelessTermHandler;
import appeng.api.features.IWirelessTermRegistry;
import appeng.core.localization.PlayerMessages;
import appeng.core.sync.GuiBridge;
import appeng.helpers.WirelessTerminalGuiObject;
import appeng.util.Platform;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.world.World;
import net.minecraftforge.items.IItemHandler;
import java.util.ArrayList;
import java.util.List;
@@ -80,6 +83,7 @@ public final class WirelessRegistry implements IWirelessTermRegistry {
}
final IWirelessTermHandler handler = this.getWirelessTerminalHandler(item);
final String unparsedKey = handler.getEncryptionKey(item);
if (unparsedKey.isEmpty()) {
player.sendMessage(PlayerMessages.DeviceNotLinked.get());
@@ -94,7 +98,7 @@ public final class WirelessRegistry implements IWirelessTermRegistry {
}
if (handler.hasPower(player, 0.5, item)) {
Platform.openGUI(player, null, null, GuiBridge.GUI_WIRELESS_TERM);
Platform.openGUI(player, null, null, (GuiBridge) handler.getGuiHandler(item));
} else {
player.sendMessage(PlayerMessages.DeviceNotPowered.get());
}
@@ -161,6 +161,7 @@ public enum ButtonToolTips {
// Used in the tooltips of the items in the terminal, when moused over
ItemsStored,
ItemsRequestable,
ItemsCraftable,
SchedulingMode,
SchedulingModeDefault,
@@ -84,7 +84,9 @@ public class AppEngPacketHandlerBase {
PACKET_INFORM_PLAYER(PacketInformPlayer.class),
PACKET_CRAFTING_CPUS_UPDATE(PacketCraftingCPUsUpdate.class);
PACKET_CRAFTING_CPUS_UPDATE(PacketCraftingCPUsUpdate.class),
PACKET_TERMINAL_KEYBIND(PacketTerminalUse.class);
private final Class<? extends AppEngPacket> packetClass;
+24 -8
View File
@@ -43,6 +43,7 @@ import appeng.container.AEBaseContainer;
import appeng.container.ContainerNull;
import appeng.container.ContainerOpenContext;
import appeng.container.implementations.*;
import appeng.container.interfaces.IInventorySlotAware;
import appeng.fluids.container.*;
import appeng.fluids.helper.IFluidInterfaceHost;
import appeng.fluids.parts.PartFluidFormationPlane;
@@ -71,6 +72,7 @@ import appeng.tile.storage.TileDrive;
import appeng.tile.storage.TileIOPort;
import appeng.tile.storage.TileSkyChest;
import appeng.util.Platform;
import baubles.api.BaublesApi;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
@@ -101,6 +103,10 @@ public enum GuiBridge implements IGuiHandler {
GUI_PORTABLE_CELL(ContainerMEPortableCell.class, IPortableCell.class, GuiHostType.ITEM, null),
GUI_WIRELESS_TERM(ContainerWirelessTerm.class, WirelessTerminalGuiObject.class, GuiHostType.ITEM, null),
GUI_WIRELESS_CRAFTING_TERMINAL(ContainerWirelessCraftingTerminal.class, WirelessTerminalGuiObject.class, GuiHostType.ITEM, null),
GUI_WIRELESS_PATTERN_TERMINAL(ContainerWirelessPatternTerminal.class, WirelessTerminalGuiObject.class, GuiHostType.ITEM, null),
GUI_WIRELESS_FLUID_TERMINAL(ContainerWirelessFluidTerminal.class, WirelessTerminalGuiObject.class, GuiHostType.ITEM, null),
GUI_NETWORK_STATUS(ContainerNetworkStatus.class, INetworkTool.class, GuiHostType.ITEM, null),
@@ -226,13 +232,17 @@ public enum GuiBridge implements IGuiHandler {
public Object getServerGuiElement(final int ordinal, final EntityPlayer player, final World w, final int x, final int y, final int z) {
final AEPartLocation side = AEPartLocation.fromOrdinal(ordinal & 0x07);
final GuiBridge ID = values()[ordinal >> 4];
final boolean stem = ((ordinal >> 3) & 1) == 1;
final boolean usingItemOnTile = ((ordinal >> 3) & 1) == 1;
if (ID.type.isItem()) {
ItemStack it = ItemStack.EMPTY;
if (stem) {
if (usingItemOnTile) {
it = player.inventory.getCurrentItem();
} else if (x >= 0 && x < player.inventory.mainInventory.size()) {
it = player.inventory.getStackInSlot(x);
} else if (y == 0) {
if (x >= 0 && x < player.inventory.mainInventory.size()) {
it = player.inventory.getStackInSlot(x);
}
} else if (y == 1 && z == Integer.MIN_VALUE) {
it = BaublesApi.getBaublesHandler(player).getStackInSlot(x);
}
final Object myItem = this.getGuiObject(it, player, w, x, y, z);
if (myItem != null && ID.CorrectTileOrPart(myItem)) {
@@ -337,13 +347,19 @@ public enum GuiBridge implements IGuiHandler {
public Object getClientGuiElement(final int ordinal, final EntityPlayer player, final World w, final int x, final int y, final int z) {
final AEPartLocation side = AEPartLocation.fromOrdinal(ordinal & 0x07);
final GuiBridge ID = values()[ordinal >> 4];
final boolean stem = ((ordinal >> 3) & 1) == 1;
final boolean usingItemOnTile = ((ordinal >> 3) & 1) == 1;
if (ID.type.isItem()) {
ItemStack it = ItemStack.EMPTY;
if (stem) {
if (usingItemOnTile) {
it = player.inventory.getCurrentItem();
} else if (x >= 0 && x < player.inventory.mainInventory.size()) {
it = player.inventory.getStackInSlot(x);
} else if (y == 0) {
if (x >= 0 && x < player.inventory.mainInventory.size()) {
it = player.inventory.getStackInSlot(x);
}
}
if (y == 1 && z == Integer.MIN_VALUE) {
it = BaublesApi.getBaublesHandler(player).getStackInSlot(x);
}
final Object myItem = this.getGuiObject(it, player, w, x, y, z);
if (myItem != null && ID.CorrectTileOrPart(myItem)) {
@@ -27,6 +27,7 @@ import appeng.api.networking.security.IActionHost;
import appeng.container.ContainerOpenContext;
import appeng.container.implementations.ContainerCraftAmount;
import appeng.container.implementations.ContainerCraftConfirm;
import appeng.container.interfaces.IInventorySlotAware;
import appeng.core.AELog;
import appeng.core.sync.AppEngPacket;
import appeng.core.sync.GuiBridge;
@@ -91,7 +92,14 @@ public class PacketCraftRequest extends AppEngPacket {
final ContainerOpenContext context = cca.getOpenContext();
if (context != null) {
final TileEntity te = context.getTile();
Platform.openGUI(player, te, cca.getOpenContext().getSide(), GuiBridge.GUI_CRAFTING_CONFIRM);
if (te != null) {
Platform.openGUI(player, te, cca.getOpenContext().getSide(), GuiBridge.GUI_CRAFTING_CONFIRM);
} else {
if (ah instanceof IInventorySlotAware) {
IInventorySlotAware i = ((IInventorySlotAware) ah);
Platform.openGUI(player, i.getInventorySlot(), GuiBridge.GUI_CRAFTING_CONFIRM, i.isBaubleSlot());
}
}
if (player.openContainer instanceof ContainerCraftConfirm) {
final ContainerCraftConfirm ccc = (ContainerCraftConfirm) player.openContainer;
@@ -33,6 +33,7 @@ import appeng.api.storage.IMEMonitor;
import appeng.api.storage.channels.IItemStorageChannel;
import appeng.api.storage.data.IAEItemStack;
import appeng.container.implementations.ContainerExpandedProcessingPatternTerm;
import appeng.container.implementations.ContainerPatternEncoder;
import appeng.container.implementations.ContainerPatternTerm;
import appeng.core.sync.AppEngPacket;
import appeng.core.sync.network.INetworkInfo;
@@ -63,6 +64,8 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import static appeng.helpers.ItemStackHelper.stackFromNBT;
public class PacketJEIRecipe extends AppEngPacket {
@@ -85,7 +88,7 @@ public class PacketJEIRecipe extends AppEngPacket {
if (list.tagCount() > 0) {
this.recipe.add(new ItemStack[list.tagCount()]);
for (int y = 0; y < list.tagCount(); y++) {
this.recipe.get(x)[y] = new ItemStack(list.getCompoundTagAt(y));
this.recipe.get(x)[y] = stackFromNBT(list.getCompoundTagAt(y));
}
} else {
this.recipe.add(emptyArray);
@@ -97,7 +100,7 @@ public class PacketJEIRecipe extends AppEngPacket {
final NBTTagList outputList = comp.getTagList("outputs", 10);
this.output = new ArrayList<>();
for (int z = 0; z < outputList.tagCount(); z++) {
this.output.add(new ItemStack(outputList.getCompoundTagAt(z)));
this.output.add(stackFromNBT(outputList.getCompoundTagAt(z)));
}
}
}
@@ -197,6 +200,9 @@ public class PacketJEIRecipe extends AppEngPacket {
if (request.getItem().isDamageable() || Platform.isGTDamageableItem(request.getItem())) {
Collection<IAEItemStack> outList = inv.getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)).getStorageList().findFuzzy(request, FuzzyMode.IGNORE_ALL);
for (IAEItemStack is : outList) {
if (is.getStackSize() == 0) {
continue;
}
if (Platform.isGTDamageableItem(request.getItem())) {
if (!(is.getDefinition().getMetadata() == request.getDefinition().getMetadata())) {
continue;
@@ -250,7 +256,7 @@ public class PacketJEIRecipe extends AppEngPacket {
con.onCraftMatrixChanged(new WrapperInvItemHandler(craftMatrix));
if (this.output != null && ((con instanceof ContainerPatternTerm && !((ContainerPatternTerm) con).isCraftingMode()) || con instanceof ContainerExpandedProcessingPatternTerm)) {
if (this.output != null && ((con instanceof ContainerPatternEncoder && !((ContainerPatternEncoder) con).isCraftingMode()))) {
IItemHandler outputSlots = cct.getInventoryByName("output");
for (int i = 0; i < outputSlots.getSlots(); ++i) {
ItemHandlerUtil.setStackInSlot(outputSlots, i, ItemStack.EMPTY);
@@ -24,6 +24,7 @@ import appeng.core.AELog;
import appeng.core.sync.AppEngPacket;
import appeng.core.sync.network.INetworkInfo;
import appeng.fluids.client.gui.GuiFluidTerminal;
import appeng.fluids.client.gui.GuiWirelessFluidTerminal;
import appeng.fluids.util.AEFluidStack;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@@ -138,6 +139,8 @@ public class PacketMEFluidInventoryUpdate extends AppEngPacket {
if (gs instanceof GuiFluidTerminal) {
((GuiFluidTerminal) gs).postUpdate(this.list);
} else if (gs instanceof GuiWirelessFluidTerminal) {
((GuiWirelessFluidTerminal)gs).postUpdate(this.list);
}
}
@@ -22,6 +22,7 @@ package appeng.core.sync.packets;
import appeng.api.AEApi;
import appeng.api.storage.channels.IItemStorageChannel;
import appeng.api.storage.data.IAEItemStack;
import appeng.container.implementations.ContainerPatternEncoder;
import appeng.container.implementations.ContainerPatternTerm;
import appeng.core.sync.AppEngPacket;
import appeng.core.sync.network.INetworkInfo;
@@ -98,9 +99,9 @@ public class PacketPatternSlot extends AppEngPacket {
@Override
public void serverPacketData(final INetworkInfo manager, final AppEngPacket packet, final EntityPlayer player) {
final EntityPlayerMP sender = (EntityPlayerMP) player;
if (sender.openContainer instanceof ContainerPatternTerm) {
final ContainerPatternTerm patternTerminal = (ContainerPatternTerm) sender.openContainer;
patternTerminal.craftOrGetItem(this);
if (sender.openContainer instanceof ContainerPatternEncoder) {
final ContainerPatternEncoder patternEncoder = (ContainerPatternEncoder) sender.openContainer;
patternEncoder.craftOrGetItem(this);
}
}
}
@@ -19,8 +19,10 @@
package appeng.core.sync.packets;
import appeng.api.networking.security.IActionHost;
import appeng.container.AEBaseContainer;
import appeng.container.ContainerOpenContext;
import appeng.container.interfaces.IInventorySlotAware;
import appeng.core.sync.AppEngPacket;
import appeng.core.sync.GuiBridge;
import appeng.core.sync.network.INetworkInfo;
@@ -60,8 +62,21 @@ public class PacketSwitchGuis extends AppEngPacket {
final AEBaseContainer bc = (AEBaseContainer) c;
final ContainerOpenContext context = bc.getOpenContext();
if (context != null) {
final TileEntity te = context.getTile();
Platform.openGUI(player, te, context.getSide(), this.newGui);
final Object target = bc.getTarget();
if (target instanceof IActionHost) {
final IActionHost ah = (IActionHost) target;
final TileEntity te = context.getTile();
if (te != null) {
Platform.openGUI(player, te, bc.getOpenContext().getSide(), this.newGui);
} else {
if (ah instanceof IInventorySlotAware) {
IInventorySlotAware i = ((IInventorySlotAware) ah);
Platform.openGUI(player, i.getInventorySlot(), this.newGui, i.isBaubleSlot());
}
}
}
}
}
}
@@ -25,6 +25,7 @@ import appeng.core.sync.AppEngPacket;
import appeng.core.sync.network.INetworkInfo;
import appeng.fluids.container.ContainerFluidInterface;
import appeng.fluids.container.ContainerFluidTerminal;
import appeng.fluids.container.ContainerWirelessFluidTerminal;
import appeng.fluids.util.AEFluidStack;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@@ -74,6 +75,8 @@ public class PacketTargetFluidStack extends AppEngPacket {
public void serverPacketData(final INetworkInfo manager, final AppEngPacket packet, final EntityPlayer player) {
if (player.openContainer instanceof ContainerFluidTerminal) {
((ContainerFluidTerminal) player.openContainer).setTargetStack(this.stack);
} else if (player.openContainer instanceof ContainerWirelessFluidTerminal) {
((ContainerWirelessFluidTerminal) player.openContainer).setTargetStack(this.stack);
} else if (player.openContainer instanceof ContainerFluidInterface) {
((ContainerFluidInterface) player.openContainer).setTargetStack(this.stack);
} else if (player.openContainer instanceof ContainerFluidInterfaceConfigurationTerminal) {
@@ -0,0 +1,89 @@
package appeng.core.sync.packets;
import appeng.api.AEApi;
import appeng.api.features.ILocatable;
import appeng.api.features.IWirelessTermHandler;
import appeng.core.localization.PlayerMessages;
import appeng.core.sync.AppEngPacket;
import appeng.core.sync.network.INetworkInfo;
import appeng.items.tools.powered.Terminal;
import appeng.util.Platform;
import baubles.api.BaublesApi;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.Optional;
public class PacketTerminalUse extends AppEngPacket {
Terminal terminal;
public PacketTerminalUse(final ByteBuf stream) {
this.terminal = Terminal.values()[stream.readInt()];
}
public PacketTerminalUse(Enum<Terminal> terminal) {
final ByteBuf data = Unpooled.buffer();
data.writeInt(this.getPacketID());
data.writeInt(terminal.ordinal());
this.configureWrite(data);
}
@Override
public void serverPacketData(INetworkInfo manager, AppEngPacket packet, EntityPlayer player) {
NonNullList<ItemStack> mainInventory = player.inventory.mainInventory;
for (int i = 0; i < mainInventory.size(); i++) {
ItemStack is = mainInventory.get(i);
if (terminal.getItemDefinition().isSameAs(is)) {
openGui(is, i, player, false);
return;
}
}
if (Loader.isModLoaded("baubles")) {
tryOpenBauble(player);
}
}
@Optional.Method(modid = "baubles")
void tryOpenBauble(EntityPlayer player) {
for (int i = 0; i < BaublesApi.getBaublesHandler(player).getSlots(); i++) {
ItemStack is = BaublesApi.getBaublesHandler(player).getStackInSlot(i);
if (terminal.getItemDefinition().isSameAs(is)) {
openGui(is, i, player, true);
break;
}
}
}
void openGui(ItemStack itemStack, int slotIdx, EntityPlayer player, boolean isBauble) {
final IWirelessTermHandler handler = AEApi.instance().registries().wireless().getWirelessTerminalHandler(itemStack);
if (handler == null) {
return;
}
final String unparsedKey = handler.getEncryptionKey(itemStack);
if (unparsedKey.isEmpty()) {
player.sendMessage(PlayerMessages.DeviceNotLinked.get());
return;
}
final long parsedKey = Long.parseLong(unparsedKey);
final ILocatable securityStation = AEApi.instance().registries().locatable().getLocatableBy(parsedKey);
if (securityStation == null) {
player.sendMessage(PlayerMessages.StationCanNotBeLocated.get());
return;
}
if (handler.hasPower(player, 0.5, itemStack)) {
Platform.openGUI(player, slotIdx, terminal.getBridge(), isBauble);
} else {
player.sendMessage(PlayerMessages.DeviceNotPowered.get());
}
}
}
@@ -130,10 +130,10 @@ public class PacketValueConfig extends AppEngPacket {
final ContainerFluidLevelEmitter lvc = (ContainerFluidLevelEmitter) c;
lvc.setLevel(Long.parseLong(this.Value), player);
} else if (this.Name.startsWith("PatternTerminal.")) {
if (c instanceof ContainerPatternTerm) {
final ContainerPatternTerm cpt = (ContainerPatternTerm) c;
if (c instanceof ContainerPatternEncoder) {
final ContainerPatternEncoder cpt = (ContainerPatternEncoder) c;
if (this.Name.equals("PatternTerminal.CraftMode")) {
cpt.getPart().setCraftingRecipe(this.Value.equals("1"));
cpt.setCraftingMode(this.Value.equals("1"));
} else if (this.Name.equals("PatternTerminal.Encode")) {
if (this.Value.equals("2")) {
cpt.encodeAndMoveToInventory();
@@ -159,31 +159,6 @@ public class PacketValueConfig extends AppEngPacket {
} else if (this.Name.equals("PatternTerminal.Substitute")) {
cpt.getPart().setSubstitution(this.Value.equals("1"));
}
} else if (c instanceof ContainerExpandedProcessingPatternTerm) {
final ContainerExpandedProcessingPatternTerm cept = (ContainerExpandedProcessingPatternTerm) c;
if (this.Name.equals("PatternTerminal.Encode")) {
if (this.Value.equals("2")) {
cept.encodeAndMoveToInventory();
} else {
cept.encode();
}
} else if (this.Name.equals("PatternTerminal.Clear")) {
cept.clear();
} else if (this.Name.equals("PatternTerminal.MultiplyByTwo")) {
cept.multiply(2);
} else if (this.Name.equals("PatternTerminal.MultiplyByThree")) {
cept.multiply(3);
} else if (this.Name.equals("PatternTerminal.DivideByTwo")) {
cept.divide(2);
} else if (this.Name.equals("PatternTerminal.DivideByThree")) {
cept.divide(3);
} else if (this.Name.equals("PatternTerminal.IncreaseByOne")) {
cept.increase(1);
} else if (this.Name.equals("PatternTerminal.DecreaseByOne")) {
cept.decrease(1);
} else if (this.Name.equals("PatternTerminal.MaximizeCount")) {
cept.maximizeCount();
}
}
} else if (this.Name.startsWith("StorageBus.")) {
if (this.Name.equals("StorageBus.Action")) {
@@ -0,0 +1,184 @@
/*
* Copyright (c) 2018, 2020 Adrian Siekierka
*
* This file is part of StackUp.
*
* StackUp is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* StackUp is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with StackUp. If not, see <http://www.gnu.org/licenses/>.
*/
package appeng.core.transformer;
import appeng.core.AE2ELCore;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.common.io.ByteStreams;
import net.minecraft.launchwrapper.IClassTransformer;
import net.minecraftforge.fml.common.Loader;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.commons.ClassRemapper;
import org.objectweb.asm.commons.Remapper;
import org.objectweb.asm.tree.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.ListIterator;
import java.util.Set;
import java.util.function.Consumer;
public class AE2ELTransformer implements IClassTransformer {
@Override
public byte[] transform(String name, String transformedName, byte[] basicClass) {
if (Loader.instance().getIndexedModList().get("stackup") != null) {
return basicClass;
}
transformedName = transformedName.replace('/', '.');
Consumer<ClassNode> consumer = (n) -> {
};
Consumer<ClassNode> emptyConsumer = consumer;
if ("net.minecraft.item.ItemStack".equals(transformedName)) {
consumer = consumer.andThen(ItemStackPatch::patchCountGetSet);
} else if ("net.minecraft.network.PacketBuffer".equals(transformedName)) {
consumer = consumer.andThen((node) -> {
spliceClasses(node, "appeng.core.transformer.PacketBufferPatch",
"readItemStack", "func_150791_c",
"writeItemStack", "func_150788_a");
});
}
if (consumer != emptyConsumer) {
return processNode(basicClass, consumer);
} else {
return basicClass;
}
}
public static byte[] processNode(byte[] data, Consumer<ClassNode> classNodeConsumer) {
ClassReader reader = new ClassReader(data);
ClassNode nodeOrig = new ClassNode();
reader.accept(nodeOrig, 0);
classNodeConsumer.accept(nodeOrig);
ClassWriter writer = new ClassWriter(0);
nodeOrig.accept(writer);
return writer.toByteArray();
}
public static void spliceClasses(final ClassNode data, final String className, final String... methods) {
try (InputStream stream = AE2ELCore.class.getClassLoader().getResourceAsStream(className.replace('.', '/') + ".class")) {
spliceClasses(data, ByteStreams.toByteArray(stream), className, methods);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void spliceClasses(final ClassNode nodeData, final byte[] dataSplice, final String className, final String... methods) {
// System.out.println("Splicing from " + className + " to " + targetClassName)
if (dataSplice == null) {
throw new RuntimeException("Class " + className + " not found! This is a AE2EL bug!");
}
final Set<String> methodSet = Sets.newHashSet(methods);
final List<String> methodList = Lists.newArrayList(methods);
final ClassReader readerSplice = new ClassReader(dataSplice);
final String className2 = className.replace('.', '/');
final String targetClassName2 = nodeData.name;
final String targetClassName = targetClassName2.replace('/', '.');
final Remapper remapper = new Remapper() {
public String map(final String name) {
return className2.equals(name) ? targetClassName2 : name;
}
};
ClassNode nodeSplice = new ClassNode();
readerSplice.accept(new ClassRemapper(nodeSplice, remapper), ClassReader.EXPAND_FRAMES);
for (String s : nodeSplice.interfaces) {
if (methodSet.contains(s)) {
nodeData.interfaces.add(s);
System.out.println("Added INTERFACE: " + s);
}
}
for (int i = 0; i < nodeSplice.methods.size(); i++) {
if (methodSet.contains(nodeSplice.methods.get(i).name)) {
MethodNode mn = nodeSplice.methods.get(i);
boolean added = false;
for (int j = 0; j < nodeData.methods.size(); j++) {
if (nodeData.methods.get(j).name.equals(mn.name)
&& nodeData.methods.get(j).desc.equals(mn.desc)) {
MethodNode oldMn = nodeData.methods.get(j);
System.out.println("Spliced in METHOD: " + targetClassName + "." + mn.name);
nodeData.methods.set(j, mn);
if (nodeData.name.equals(nodeSplice.superName)) {
ListIterator<AbstractInsnNode> nodeListIterator = mn.instructions.iterator();
while (nodeListIterator.hasNext()) {
AbstractInsnNode node = nodeListIterator.next();
if (node instanceof MethodInsnNode
&& node.getOpcode() == Opcodes.INVOKESPECIAL) {
MethodInsnNode methodNode = (MethodInsnNode) node;
if (targetClassName2.equals(methodNode.owner)) {
methodNode.owner = nodeData.superName;
}
}
}
}
oldMn.name = methodList.get((methodList.indexOf(oldMn.name)) & (~1)) + "_ae2el_old";
nodeData.methods.add(oldMn);
added = true;
break;
}
}
if (!added) {
System.out.println("Added METHOD: " + targetClassName + "." + mn.name);
nodeData.methods.add(mn);
added = true;
}
}
}
for (int i = 0; i < nodeSplice.fields.size(); i++) {
if (methodSet.contains(nodeSplice.fields.get(i).name)) {
FieldNode mn = nodeSplice.fields.get(i);
boolean added = false;
for (int j = 0; j < nodeData.fields.size(); j++) {
if (nodeData.fields.get(j).name.equals(mn.name)
&& nodeData.fields.get(j).desc.equals(mn.desc)) {
System.out.println("Spliced in FIELD: " + targetClassName + "." + mn.name);
nodeData.fields.set(j, mn);
added = true;
break;
}
}
if (!added) {
System.out.println("Added FIELD: " + targetClassName + "." + mn.name);
nodeData.fields.add(mn);
added = true;
}
}
}
}
}
@@ -0,0 +1,94 @@
/*
* Copyright (c) 2018, 2020 Adrian Siekierka
*
* This file is part of StackUp.
*
* StackUp is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* StackUp is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with StackUp. If not, see <http://www.gnu.org/licenses/>.
*/
package appeng.core.transformer;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.*;
import java.util.ListIterator;
public final class ItemStackPatch {
private ItemStackPatch() {
}
public static void patchCountGetSet(ClassNode node) {
for (MethodNode mn : node.methods) {
if ("<init>".equals(mn.name)) {
ListIterator<AbstractInsnNode> it = mn.instructions.iterator();
while (it.hasNext()) {
AbstractInsnNode in = it.next();
if (in instanceof LdcInsnNode && "Count".equals(((LdcInsnNode) in).cst)) {
AbstractInsnNode in2 = it.next();
if (in2.getOpcode() == Opcodes.INVOKEVIRTUAL) {
// :thinking:
boolean patched = false;
MethodInsnNode min2 = (MethodInsnNode) in2;
if (min2.name.equals("getByte")) {
min2.name = "getInteger";
patched = true;
} else if (min2.name.equals("func_74771_c")) {
min2.name = "func_74762_e";
patched = true;
}
if (patched) {
min2.desc = "(Ljava/lang/String;)I";
System.out.println("Patched ItemStack Count getter!");
}
}
}
}
} else if ("func_77955_b".equals(mn.name) || "writeToNBT".equals(mn.name)) {
ListIterator<AbstractInsnNode> it = mn.instructions.iterator();
while (it.hasNext()) {
AbstractInsnNode in = it.next();
if (in instanceof LdcInsnNode && "Count".equals(((LdcInsnNode) in).cst)) {
it.next();
it.next();
it.next();
AbstractInsnNode in2 = it.next();
if (in2.getOpcode() == Opcodes.INVOKEVIRTUAL) {
// :thinking:
boolean patched = false;
MethodInsnNode min2 = (MethodInsnNode) in2;
if (min2.name.equals("setByte")) {
min2.name = "setInteger";
patched = true;
} else if (min2.name.equals("func_74774_a")) {
min2.name = "func_74768_a";
patched = true;
}
if (patched) {
min2.desc = "(Ljava/lang/String;I)V";
System.out.println("Patched ItemStack Count setter!");
// Remove I2B cast
it.previous();
it.previous();
it.remove();
}
}
}
}
}
}
}
}
@@ -0,0 +1,78 @@
package appeng.core.transformer;
/*
* Copyright (c) 2018, 2020 Adrian Siekierka
*
* This file is part of StackUp.
*
* StackUp is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* StackUp is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with StackUp. If not, see <http://www.gnu.org/licenses/>.
*/
import io.netty.buffer.ByteBuf;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.PacketBuffer;
import java.io.IOException;
public class PacketBufferPatch extends PacketBuffer {
public PacketBufferPatch(ByteBuf wrapped) {
super(wrapped);
}
@Override
public ItemStack readItemStack() throws IOException {
int id = this.readShort();
if (id < 0) {
return ItemStack.EMPTY;
} else {
int count = this.readByte();
if (count == -42) {
count = this.readInt();
}
int damage = this.readShort();
ItemStack itemstack = new ItemStack(Item.getItemById(id), count, damage);
itemstack.getItem().readNBTShareTag(itemstack, this.readCompoundTag());
return itemstack;
}
}
@Override
public PacketBuffer writeItemStack(ItemStack stack) {
if (stack.isEmpty()) {
this.writeShort(-1);
} else {
this.writeShort(Item.getIdFromItem(stack.getItem()));
if (stack.getCount() >= 0 && stack.getCount() <= 64) {
this.writeByte(stack.getCount());
} else {
this.writeByte(-42);
this.writeInt(stack.getCount());
}
this.writeShort(stack.getMetadata());
NBTTagCompound tag = null;
if (stack.getItem().isDamageable() || stack.getItem().getShareTag()) {
tag = stack.getItem().getNBTShareTag(stack);
}
this.writeCompoundTag(tag);
}
return this;
}
}
@@ -21,6 +21,8 @@ package appeng.crafting;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridHost;
import appeng.api.networking.IGridNode;
import appeng.api.networking.crafting.ICraftingRequester;
import appeng.me.cache.CraftingGridCache;
@@ -42,11 +44,15 @@ public class CraftingLinkNexus {
return true;
}
if (this.getRequest() == null || this.cpu == null) {
CraftingLink req = this.getRequest();
if (req == null || this.cpu == null) {
this.tickOfDeath++;
} else {
final boolean hasCpu = craftingGridCache.hasCpu(this.cpu.getCpu());
final boolean hasMachine = this.getRequest().getRequester().getActionableNode().getGrid() == g;
final ICraftingRequester requester = req.getRequester();
final IGridNode actionableNode = requester != null ? requester.getActionableNode() : null;
final IGrid grid = actionableNode != null ? actionableNode.getGrid() : null;
final boolean hasMachine = grid != null && grid == g;
if (hasCpu && hasMachine) {
this.tickOfDeath = 0;
@@ -32,16 +32,18 @@ import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketInformPlayer;
import appeng.me.cluster.implementations.CraftingCPUCluster;
import appeng.util.Platform;
import appeng.util.item.AEItemStack;
import appeng.util.item.MeaningfulItemIterator;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.Optional;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@Optional.Interface(iface = "gregtech.api.items.IToolItem", modid = "gregtech")
public class CraftingTreeNode {
// what slot!
@@ -96,15 +98,6 @@ public class CraftingTreeNode {
IAEItemStack request(final MECraftingInventory inv, long l, final IActionSource src) throws CraftBranchFailure, InterruptedException {
addNode();
this.job.handlePausing();
if (this.canEmit) {
final IAEItemStack wat = this.what.copy();
wat.setStackSize(l);
this.howManyEmitted = wat.getStackSize();
this.bytes += wat.getStackSize();
return wat;
}
final IItemList<IAEItemStack> inventoryList = inv.getItemList();
final List<IAEItemStack> thingsUsed = new ArrayList<>();
@@ -112,39 +105,60 @@ public class CraftingTreeNode {
this.what.setStackSize(l);
if (this.getSlot() >= 0 && this.parent != null && this.parent.details.isCraftable()) {
Collection<IAEItemStack> itemList = new ArrayList<>();
LinkedList<IAEItemStack> itemList = new LinkedList<>();
boolean damageableItem = this.what.getItem().isDamageable() || Platform.isGTDamageableItem(this.what.getItem());
if (this.parent.details.canSubstitute()) {
for (IAEItemStack subs : this.parent.details.getSubstituteInputs(this.slot)) {
if (damageableItem) {
itemList.addAll(inventoryList.findFuzzy(subs, FuzzyMode.IGNORE_ALL));
Iterator<IAEItemStack> it = new MeaningfulItemIterator<>(inventoryList.findFuzzy(this.what, FuzzyMode.IGNORE_ALL));
while (it.hasNext()) {
IAEItemStack i = it.next();
if (i.getStackSize() > 0) {
itemList.add(i);
}
}
}
subs = inventoryList.findPrecise(subs);
if (subs != null) {
if (subs != null && subs.getStackSize() > 0) {
itemList.add(subs);
}
}
} else {
if (damageableItem) {
itemList.addAll(inventoryList.findFuzzy(this.what, FuzzyMode.IGNORE_ALL));
Iterator<IAEItemStack> it = new MeaningfulItemIterator<>(inventoryList.findFuzzy(this.what, FuzzyMode.IGNORE_ALL));
while (it.hasNext()) {
IAEItemStack i = it.next();
if (i.getStackSize() > 0) {
itemList.add(i);
}
}
} else {
final IAEItemStack item = inventoryList.findPrecise(this.what);
if (item != null) {
if (item != null && item.getStackSize() > 0) {
itemList.add(item);
}
}
}
for (IAEItemStack fuzz : itemList) {
if (this.parent.details.isValidItemForSlot(this.getSlot(), fuzz.copy().getCachedItemStack(1), this.world)) {
if (this.parent.details.isValidItemForSlot(this.getSlot(), fuzz.getDefinition(), this.world)) {
fuzz = fuzz.copy();
fuzz.setStackSize(l);
final IAEItemStack available = inv.extractItems(fuzz, Actionable.MODULATE, src);
if (available != null) {
if (available.getItem().hasContainerItem(available.getDefinition())) {
final ItemStack is2 = Platform.getContainerItem(available.createItemStack());
final IAEItemStack o = AEItemStack.fromItemStack(is2);
if (o != null) {
this.parent.addContainers(o);
}
}
if (!this.exhausted) {
final IAEItemStack is = this.job.checkUse(available);
@@ -185,6 +199,16 @@ public class CraftingTreeNode {
}
}
if (this.canEmit) {
final IAEItemStack wat = this.what.copy();
wat.setStackSize(l);
this.howManyEmitted = wat.getStackSize();
this.bytes += wat.getStackSize();
return wat;
}
this.exhausted = true;
if (this.nodes.size() == 1) {
@@ -198,6 +222,16 @@ public class CraftingTreeNode {
final IAEItemStack available = inv.extractItems(madeWhat, Actionable.MODULATE, src);
if (available != null) {
if (parent != null && available.getItem().hasContainerItem(available.getDefinition())) {
final ItemStack is2 = Platform.getContainerItem(available.createItemStack());
final IAEItemStack o = AEItemStack.fromItemStack(is2);
if (o != null) {
this.parent.addContainers(o);
}
}
this.bytes += available.getStackSize();
l -= available.getStackSize();
@@ -241,6 +275,14 @@ public class CraftingTreeNode {
if (job.isSimulation()) {
this.bytes += l;
if (parent != null && this.what.getItem().hasContainerItem(this.what.getDefinition())) {
final ItemStack is2 = Platform.getContainerItem(this.what.copy().setStackSize(1).createItemStack());
final IAEItemStack o = AEItemStack.fromItemStack(is2);
if (o != null) {
this.parent.addContainers(o);
}
}
this.missing += l;
final IAEItemStack rv = this.what.copy();
rv.setStackSize(l);
@@ -27,15 +27,11 @@ import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IItemList;
import appeng.core.AEConfig;
import appeng.me.cluster.implementations.CraftingCPUCluster;
import appeng.util.Platform;
import appeng.util.item.AEItemStack;
import com.google.common.collect.ImmutableCollection;
import it.unimi.dsi.fastutil.objects.Object2LongArrayMap;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
@@ -50,6 +46,7 @@ public class CraftingTreeProcess {
boolean possible = true;
private long crafts = 0;
private long bytes = 0;
private ArrayList<IAEItemStack> containers;
public CraftingTreeProcess(final ICraftingGrid cc, final CraftingJob job, final ICraftingPatternDetails details, final CraftingTreeNode craftingTreeNode, final int depth) {
this.parent = craftingTreeNode;
@@ -198,32 +195,18 @@ public class CraftingTreeProcess {
void request(final MECraftingInventory inv, final long amountOfTimes, final IActionSource src) throws CraftBranchFailure, InterruptedException {
addProcess();
this.job.handlePausing();
List<IAEItemStack> containerItems = null;
// request and remove inputs...
for (final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet()) {
final IAEItemStack stack = entry.getKey().request(inv, entry.getValue() * amountOfTimes, src);
if (this.details.isCraftable() && stack.getItem().hasContainerItem(stack.getDefinition())) {
final ItemStack is = Platform.getContainerItem(stack.createItemStack());
final IAEItemStack o = AEItemStack.fromItemStack(is);
if (o != null) {
if (containerItems == null) {
containerItems = new ArrayList<>();
}
this.bytes++;
o.setCachedItemStack(is);
containerItems.add(o);
}
}
}
if (containerItems != null) {
for (IAEItemStack i : containerItems) {
inv.injectItems(i, Actionable.MODULATE, src);
if (this.containers != null) {
for (IAEItemStack iae : containers) {
inv.injectItems(iae, Actionable.MODULATE, src);
}
containers = null;
}
// assume its possible.
// add crafting results..
@@ -235,6 +218,13 @@ public class CraftingTreeProcess {
this.crafts += amountOfTimes;
}
public void addContainers(IAEItemStack container) {
if (this.containers == null) {
this.containers = new ArrayList<>();
}
this.containers.add(container);
}
void dive(final CraftingJob job) {
job.addTask(this.getAmountCrafted(this.parent.getStack(1)), this.crafts, this.details, this.depth);
for (final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet()) {
@@ -10,10 +10,13 @@ import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Random;
@@ -97,6 +100,8 @@ public abstract class BlockSlabCommon extends BlockSlab {
return Variant.DEFAULT;
}
public static class Double extends BlockSlabCommon {
private final Block halfSlabBlock;
@@ -134,6 +139,11 @@ public abstract class BlockSlabCommon extends BlockSlab {
public boolean isDouble() {
return false;
}
@Override
public boolean doesSideBlockChestOpening(@Nonnull IBlockState blockState, @Nonnull IBlockAccess world, @Nonnull BlockPos pos, @Nonnull EnumFacing side) {
return false;
}
}
public enum Variant implements IStringSerializable {
@@ -0,0 +1,311 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.fluids.client.gui;
import appeng.api.config.Settings;
import appeng.api.storage.ITerminalHost;
import appeng.api.storage.data.IAEFluidStack;
import appeng.api.util.IConfigManager;
import appeng.api.util.IConfigurableObject;
import appeng.client.gui.AEBaseMEGui;
import appeng.client.gui.widgets.GuiImgButton;
import appeng.client.gui.widgets.GuiScrollbar;
import appeng.client.gui.widgets.ISortSource;
import appeng.client.gui.widgets.MEGuiTextField;
import appeng.client.me.FluidRepo;
import appeng.client.me.InternalFluidSlotME;
import appeng.client.me.SlotFluidME;
import appeng.core.AELog;
import appeng.core.localization.GuiText;
import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketInventoryAction;
import appeng.core.sync.packets.PacketValueConfig;
import appeng.fluids.container.ContainerMEPortableFluidCell;
import appeng.fluids.container.ContainerWirelessFluidTerminal;
import appeng.fluids.container.slots.IMEFluidSlot;
import appeng.helpers.InventoryAction;
import appeng.helpers.WirelessTerminalGuiObject;
import appeng.util.IConfigManagerHost;
import appeng.util.Platform;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.ClickType;
import net.minecraft.inventory.Slot;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.fml.common.Loader;
import org.lwjgl.input.Mouse;
import javax.annotation.Nonnull;
import java.io.IOException;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
public class GuiMEPortableFluidCell extends AEBaseMEGui implements ISortSource, IConfigManagerHost {
private final List<SlotFluidME> meFluidSlots = new LinkedList<>();
private final FluidRepo repo;
private final IConfigManager configSrc;
private final ContainerMEPortableFluidCell container;
private final int offsetX = 9;
private final int rows = 6;
private final int perRow = 9;
protected ITerminalHost terminal;
private MEGuiTextField searchField;
private GuiImgButton sortByBox;
private GuiImgButton sortDirBox;
public GuiMEPortableFluidCell(InventoryPlayer inventoryPlayer, final WirelessTerminalGuiObject te, final ContainerWirelessFluidTerminal c) {
super(c);
this.terminal = te;
this.xSize = 185;
this.ySize = 222;
final GuiScrollbar scrollbar = new GuiScrollbar();
this.setScrollBar(scrollbar);
this.repo = new FluidRepo(scrollbar, this);
this.configSrc = ((IConfigurableObject) this.inventorySlots).getConfigManager();
(this.container = (ContainerMEPortableFluidCell) this.inventorySlots).setGui(this);
}
@Override
public void initGui() {
this.mc.player.openContainer = this.inventorySlots;
this.guiLeft = (this.width - this.xSize) / 2;
this.guiTop = (this.height - this.ySize) / 2;
this.searchField = new MEGuiTextField(this.fontRenderer, this.guiLeft + Math.max(80, this.offsetX), this.guiTop + 4, 90, 12);
this.searchField.setEnableBackgroundDrawing(false);
this.searchField.setMaxStringLength(25);
this.searchField.setTextColor(0xFFFFFF);
this.searchField.setSelectionColor(0xFF99FF99);
this.searchField.setVisible(true);
int offset = this.guiTop;
this.buttonList.add(this.sortByBox = new GuiImgButton(this.guiLeft - 18, offset, Settings.SORT_BY, this.configSrc.getSetting(Settings.SORT_BY)));
offset += 20;
this.buttonList.add(this.sortDirBox = new GuiImgButton(this.guiLeft - 18, offset, Settings.SORT_DIRECTION, this.configSrc
.getSetting(Settings.SORT_DIRECTION)));
for (int y = 0; y < this.rows; y++) {
for (int x = 0; x < this.perRow; x++) {
SlotFluidME slot = new SlotFluidME(new InternalFluidSlotME(this.repo, x + y * this.perRow, this.offsetX + x * 18, 18 + y * 18));
this.getMeFluidSlots().add(slot);
this.inventorySlots.inventorySlots.add(slot);
}
}
this.setScrollBar();
}
@Override
public void drawFG(int offsetX, int offsetY, int mouseX, int mouseY) {
this.fontRenderer.drawString(this.getGuiDisplayName(GuiText.WirelessTerminal.getLocal()), 8, 6, 4210752);
this.fontRenderer.drawString(GuiText.inventory.getLocal(), 8, this.ySize - 96 + 3, 4210752);
}
@Override
public void drawBG(int offsetX, int offsetY, int mouseX, int mouseY) {
this.bindTexture(this.getBackground());
final int x_width = 197;
this.drawTexturedModalRect(offsetX, offsetY, 0, 0, x_width, 18);
for (int x = 0; x < 6; x++) {
this.drawTexturedModalRect(offsetX, offsetY + 18 + x * 18, 0, 18, x_width, 18);
}
this.drawTexturedModalRect(offsetX, offsetY + 16 + 6 * 18, 0, 106 - 18 - 18, x_width, 99 + 77);
if (this.searchField != null) {
this.searchField.drawTextBox();
}
}
@Override
public void updateScreen() {
this.repo.setPower(this.container.isPowered());
super.updateScreen();
}
@Override
protected void renderHoveredToolTip(int mouseX, int mouseY) {
final Slot slot = this.getSlot(mouseX, mouseY);
if (slot != null && slot instanceof IMEFluidSlot && slot.isEnabled()) {
final IMEFluidSlot fluidSlot = (IMEFluidSlot) slot;
if (fluidSlot.getAEFluidStack() != null && fluidSlot.shouldRenderAsFluid()) {
final IAEFluidStack fluidStack = fluidSlot.getAEFluidStack();
final String formattedAmount = NumberFormat.getNumberInstance(Locale.US).format(fluidStack.getStackSize() / 1000.0) + " B";
final String modName = "" + TextFormatting.BLUE + TextFormatting.ITALIC + Loader.instance()
.getIndexedModList()
.get(Platform.getModId(fluidStack))
.getName();
final List<String> list = new ArrayList<>();
list.add(fluidStack.getFluidStack().getLocalizedName());
list.add(formattedAmount);
list.add(modName);
this.drawHoveringText(list, mouseX, mouseY);
return;
}
}
super.renderHoveredToolTip(mouseX, mouseY);
}
@Override
protected void actionPerformed(GuiButton btn) throws IOException {
if (btn instanceof GuiImgButton) {
final boolean backwards = Mouse.isButtonDown(1);
final GuiImgButton iBtn = (GuiImgButton) btn;
if (iBtn.getSetting() != Settings.ACTIONS) {
final Enum cv = iBtn.getCurrentValue();
final Enum next = Platform.rotateEnum(cv, backwards, iBtn.getSetting().getPossibleValues());
try {
NetworkHandler.instance().sendToServer(new PacketValueConfig(iBtn.getSetting().name(), next.name()));
} catch (final IOException e) {
AELog.debug(e);
}
iBtn.set(next);
}
}
}
@Override
protected void handleMouseClick(Slot slot, int slotIdx, int mouseButton, ClickType clickType) {
if (slot instanceof SlotFluidME) {
final SlotFluidME meSlot = (SlotFluidME) slot;
if (clickType == ClickType.PICKUP) {
// TODO: Allow more options
if (mouseButton == 0 && meSlot.getHasStack()) {
this.container.setTargetStack(meSlot.getAEFluidStack());
AELog.debug("mouse0 GUI STACK SIZE %s", meSlot.getAEFluidStack().getStackSize());
NetworkHandler.instance().sendToServer(new PacketInventoryAction(InventoryAction.FILL_ITEM, slot.slotNumber, 0));
} else {
this.container.setTargetStack(meSlot.getAEFluidStack());
if (meSlot.getAEFluidStack() != null) {
AELog.debug("mouse1 GUI STACK SIZE %s", meSlot.getAEFluidStack().getStackSize());
}
NetworkHandler.instance().sendToServer(new PacketInventoryAction(InventoryAction.EMPTY_ITEM, slot.slotNumber, 0));
}
}
return;
}
super.handleMouseClick(slot, slotIdx, mouseButton, clickType);
}
@Override
protected void keyTyped(final char character, final int key) throws IOException {
if (!this.checkHotbarKeys(key)) {
if (character == ' ' && this.searchField.getText().isEmpty()) {
return;
}
if (this.searchField.textboxKeyTyped(character, key)) {
this.repo.setSearchString(this.searchField.getText());
this.repo.updateView();
this.setScrollBar();
} else {
super.keyTyped(character, key);
}
}
}
@Override
protected void mouseClicked(final int xCoord, final int yCoord, final int btn) throws IOException {
this.searchField.mouseClicked(xCoord, yCoord, btn);
if (btn == 1 && this.searchField.isMouseIn(xCoord, yCoord)) {
this.searchField.setText("");
this.repo.setSearchString("");
this.repo.updateView();
this.setScrollBar();
}
super.mouseClicked(xCoord, yCoord, btn);
}
public void postUpdate(final List<IAEFluidStack> list) {
for (final IAEFluidStack is : list) {
this.repo.postUpdate(is);
}
this.repo.updateView();
this.setScrollBar();
}
private void setScrollBar() {
this.getScrollBar().setTop(18).setLeft(175).setHeight(this.rows * 18 - 2);
this.getScrollBar().setRange(0, (this.repo.size() + this.perRow - 1) / this.perRow - this.rows, Math.max(1, this.rows / 6));
}
@Override
public Enum getSortBy() {
return this.configSrc.getSetting(Settings.SORT_BY);
}
@Override
public Enum getSortDir() {
return this.configSrc.getSetting(Settings.SORT_DIRECTION);
}
@Override
public Enum getSortDisplay() {
return this.configSrc.getSetting(Settings.VIEW_MODE);
}
@Override
public void updateSetting(IConfigManager manager, Enum settingName, Enum newValue) {
if (this.sortByBox != null) {
this.sortByBox.set(this.configSrc.getSetting(Settings.SORT_BY));
}
if (this.sortDirBox != null) {
this.sortDirBox.set(this.configSrc.getSetting(Settings.SORT_DIRECTION));
}
this.repo.updateView();
}
protected List<SlotFluidME> getMeFluidSlots() {
return this.meFluidSlots;
}
@Override
protected boolean isPowered() {
return this.repo.hasPower();
}
protected String getBackground() {
return "guis/terminal.png";
}
}
@@ -0,0 +1,55 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.fluids.client.gui;
import appeng.api.implementations.guiobjects.IPortableCell;
import appeng.fluids.container.ContainerWirelessFluidTerminal;
import appeng.helpers.WirelessTerminalGuiObject;
import net.minecraft.client.gui.Gui;
import net.minecraft.entity.player.InventoryPlayer;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
public class GuiWirelessFluidTerminal extends GuiMEPortableFluidCell {
public GuiWirelessFluidTerminal(final InventoryPlayer inventoryPlayer, final WirelessTerminalGuiObject te) {
super(inventoryPlayer, te, new ContainerWirelessFluidTerminal(inventoryPlayer, te));
}
@Override
public void drawBG(int offsetX, int offsetY, int mouseX, int mouseY) {
this.bindTexture("guis/wirelessupgrades.png");
Gui.drawModalRectWithCustomSizedTexture(offsetX + 175, offsetY + 131, 0, 0, 32, 32, 32, 32);
super.drawBG(offsetX, offsetY, mouseX, mouseY);
}
@Override
public List<Rectangle> getJEIExclusionArea() {
List<Rectangle> ea = new ArrayList<>();
ea.add(new Rectangle(this.guiLeft + 174,
this.guiTop + 131,
32,
32));
return ea;
}
}
@@ -0,0 +1,598 @@
package appeng.fluids.container;
import appeng.api.AEApi;
import appeng.api.config.Actionable;
import appeng.api.config.PowerMultiplier;
import appeng.api.config.Settings;
import appeng.api.config.SortDir;
import appeng.api.config.SortOrder;
import appeng.api.config.ViewItems;
import appeng.api.implementations.IUpgradeableCellContainer;
import appeng.api.implementations.guiobjects.IPortableCell;
import appeng.api.networking.IGridHost;
import appeng.api.networking.IGridNode;
import appeng.api.networking.energy.IEnergySource;
import appeng.api.networking.security.IActionHost;
import appeng.api.networking.security.IActionSource;
import appeng.api.networking.storage.IBaseMonitor;
import appeng.api.storage.IMEMonitor;
import appeng.api.storage.IMEMonitorHandlerReceiver;
import appeng.api.storage.ITerminalHost;
import appeng.api.storage.channels.IFluidStorageChannel;
import appeng.api.storage.data.IAEFluidStack;
import appeng.api.storage.data.IItemList;
import appeng.api.util.AEPartLocation;
import appeng.api.util.IConfigManager;
import appeng.api.util.IConfigurableObject;
import appeng.container.AEBaseContainer;
import appeng.container.guisync.GuiSync;
import appeng.container.interfaces.IInventorySlotAware;
import appeng.container.slot.AppEngSlot;
import appeng.container.slot.SlotPlayerHotBar;
import appeng.container.slot.SlotPlayerInv;
import appeng.container.slot.SlotRestrictedInput;
import appeng.core.AEConfig;
import appeng.core.AELog;
import appeng.core.localization.PlayerMessages;
import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketMEFluidInventoryUpdate;
import appeng.core.sync.packets.PacketTargetFluidStack;
import appeng.core.sync.packets.PacketValueConfig;
import appeng.fluids.util.AEFluidStack;
import appeng.helpers.InventoryAction;
import appeng.helpers.WirelessTerminalGuiObject;
import appeng.parts.automation.StackUpgradeInventory;
import appeng.tile.inventory.AppEngInternalInventory;
import appeng.util.ConfigManager;
import appeng.util.IConfigManagerHost;
import appeng.util.Platform;
import appeng.util.inv.IAEAppEngInventory;
import appeng.util.inv.InvOperation;
import baubles.api.BaublesApi;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.IContainerListener;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidUtil;
import net.minecraftforge.fluids.capability.IFluidHandlerItem;
import net.minecraftforge.items.IItemHandler;
import javax.annotation.Nonnull;
import java.io.IOException;
import java.nio.BufferOverflowException;
public class ContainerMEPortableFluidCell extends AEBaseContainer implements IAEAppEngInventory, IConfigManagerHost, IConfigurableObject, IMEMonitorHandlerReceiver<IAEFluidStack>, IUpgradeableCellContainer, IInventorySlotAware {
protected final WirelessTerminalGuiObject wirelessTerminalGUIObject;
private final IConfigManager clientCM;
private final IMEMonitor<IAEFluidStack> monitor;
private final IItemList<IAEFluidStack> fluids = AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class).createList();
@GuiSync(99)
public boolean hasPower = false;
private final ITerminalHost terminal;
private IConfigManager serverCM;
private IConfigManagerHost gui;
private IGridNode networkNode;
// Holds the fluid the client wishes to extract, or null for insert
private IAEFluidStack clientRequestedTargetFluid = null;
private double powerMultiplier = 0.5;
private int ticks = 0;
private final int slot;
protected AppEngInternalInventory upgrades;
public ContainerMEPortableFluidCell(final InventoryPlayer ip, final IPortableCell monitorable) {
this(ip, monitorable, null, true);
}
public ContainerMEPortableFluidCell(final InventoryPlayer ip, final IPortableCell monitorable, WirelessTerminalGuiObject iGuiItemObject) {
this(ip, monitorable, iGuiItemObject, true);
}
public ContainerMEPortableFluidCell(InventoryPlayer ip, IPortableCell monitorable, WirelessTerminalGuiObject iGuiItemObject, boolean bindInventory) {
super(ip, monitorable);
this.terminal = monitorable;
this.wirelessTerminalGUIObject = (WirelessTerminalGuiObject) monitorable;
this.clientCM = new ConfigManager(this);
this.clientCM.registerSetting(Settings.SORT_BY, SortOrder.NAME);
this.clientCM.registerSetting(Settings.SORT_DIRECTION, SortDir.ASCENDING);
this.clientCM.registerSetting(Settings.VIEW_MODE, ViewItems.ALL);
if (Platform.isServer()) {
this.serverCM = terminal.getConfigManager();
this.monitor = terminal.getInventory(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class));
if (this.monitor != null) {
this.monitor.addListener(this, null);
this.setPowerSource((IEnergySource) terminal);
final IGridNode node;
if (terminal instanceof IGridHost) {
node = ((IGridHost) terminal).getGridNode(AEPartLocation.INTERNAL);
} else {
node = ((IActionHost) terminal).getActionableNode();
}
if (node != null) {
this.networkNode = node;
}
}
} else {
this.monitor = null;
}
if (monitorable != null) {
final int slotIndex = ((IInventorySlotAware) monitorable).getInventorySlot();
if (!((IInventorySlotAware) monitorable).isBaubleSlot()) {
this.lockPlayerInventorySlot(slotIndex);
}
this.slot = slotIndex;
} else {
this.slot = -1;
this.lockPlayerInventorySlot(ip.currentItem);
}
if (bindInventory) {
this.bindPlayerInventory(ip, 0, 140);
}
hasPower = this.wirelessTerminalGUIObject.extractAEPower(this.getPowerMultiplier(), Actionable.SIMULATE, PowerMultiplier.CONFIG) > 0.001;
upgrades = new StackUpgradeInventory(wirelessTerminalGUIObject.getItemStack(), this, 2);
this.loadFromNBT();
this.setupUpgrades();
}
@Override
public void detectAndSendChanges() {
if (Platform.isServer()) {
final ItemStack currentItem;
if (wirelessTerminalGUIObject.isBaubleSlot()) {
currentItem = BaublesApi.getBaublesHandler(this.getPlayerInv().player).getStackInSlot(this.slot);
} else {
currentItem = this.slot < 0 ? this.getPlayerInv().getCurrentItem() : this.getPlayerInv().getStackInSlot(this.slot);
}
if (currentItem.isEmpty()) {
this.setValidContainer(false);
} else if (!this.wirelessTerminalGUIObject.getItemStack().isEmpty() && currentItem != this.wirelessTerminalGUIObject.getItemStack()) {
if (ItemStack.areItemsEqual(this.wirelessTerminalGUIObject.getItemStack(), currentItem)) {
if (wirelessTerminalGUIObject.isBaubleSlot()) {
BaublesApi.getBaublesHandler(this.getPlayerInv().player).setStackInSlot(this.slot, this.wirelessTerminalGUIObject.getItemStack());
} else {
this.getPlayerInv().setInventorySlotContents(this.slot, this.wirelessTerminalGUIObject.getItemStack());
}
} else {
this.setValidContainer(false);
}
}
// drain 1 ae t
this.ticks++;
if (this.ticks > 10) {
double ext = this.wirelessTerminalGUIObject.extractAEPower(this.getPowerMultiplier() * this.ticks, Actionable.MODULATE, PowerMultiplier.CONFIG);
if (ext < this.getPowerMultiplier() * this.ticks) {
if (Platform.isServer() && this.isValidContainer()) {
this.getPlayerInv().player.sendMessage(PlayerMessages.DeviceNotPowered.get());
}
this.setValidContainer(false);
}
this.ticks = 0;
this.hasPower = ext > 0.001;
}
if (!this.wirelessTerminalGUIObject.rangeCheck()) {
if (Platform.isServer() && this.isValidContainer()) {
this.getPlayerInv().player.sendMessage(PlayerMessages.OutOfRange.get());
}
this.setValidContainer(false);
} else {
this.setPowerMultiplier(AEConfig.instance().wireless_getDrainRate(this.wirelessTerminalGUIObject.getRange()));
}
if (this.monitor != this.terminal.getInventory(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class))) {
this.setValidContainer(false);
}
for (final Settings set : this.serverCM.getSettings()) {
final Enum<?> sideLocal = this.serverCM.getSetting(set);
final Enum<?> sideRemote = this.clientCM.getSetting(set);
if (sideLocal != sideRemote) {
this.clientCM.putSetting(set, sideLocal);
for (final IContainerListener crafter : this.listeners) {
if (crafter instanceof EntityPlayerMP) {
try {
NetworkHandler.instance().sendTo(new PacketValueConfig(set.name(), sideLocal.name()), (EntityPlayerMP) crafter);
} catch (final IOException e) {
AELog.debug(e);
}
}
}
}
}
if (!this.fluids.isEmpty()) {
try {
final IItemList<IAEFluidStack> monitorCache = this.monitor.getStorageList();
final PacketMEFluidInventoryUpdate piu = new PacketMEFluidInventoryUpdate();
for (final IAEFluidStack is : this.fluids) {
final IAEFluidStack send = monitorCache.findPrecise(is);
if (send == null) {
is.setStackSize(0);
piu.appendFluid(is);
} else {
piu.appendFluid(send);
}
}
if (!piu.isEmpty()) {
this.fluids.resetStatus();
for (final Object c : this.listeners) {
if (c instanceof EntityPlayer) {
NetworkHandler.instance().sendTo(piu, (EntityPlayerMP) c);
}
}
}
} catch (final IOException e) {
AELog.debug(e);
}
}
super.detectAndSendChanges();
}
}
@Override
public ItemStack transferStackInSlot(final EntityPlayer p, final int idx) {
if (Platform.isClient()) {
return ItemStack.EMPTY;
}
EntityPlayerMP player = (EntityPlayerMP) p;
if (this.inventorySlots.get(idx) instanceof SlotPlayerInv || this.inventorySlots.get(idx) instanceof SlotPlayerHotBar) {
final AppEngSlot clickSlot = (AppEngSlot) this.inventorySlots.get(idx); // require AE SLots!
ItemStack itemStack = clickSlot.getStack();
ItemStack copy = itemStack.copy();
copy.setCount(1);
IFluidHandlerItem fh = FluidUtil.getFluidHandler(copy);
if (fh == null) {
// only fluid handlers items
return ItemStack.EMPTY;
}
int heldAmount = itemStack.getCount();
for (int i = 0; i < heldAmount; i++) {
copy = itemStack.copy();
copy.setCount(1);
fh = FluidUtil.getFluidHandler(copy);
final FluidStack extract = fh.drain(Integer.MAX_VALUE, false);
if (extract == null || extract.amount < 1) {
return ItemStack.EMPTY;
}
// Check if we can push into the system
final IAEFluidStack notStorable = Platform.poweredInsert(this.getPowerSource(), this.monitor, AEFluidStack.fromFluidStack(extract), this.getActionSource(), Actionable.SIMULATE);
if (notStorable != null && notStorable.getStackSize() > 0) {
final int toStore = (int) (extract.amount - notStorable.getStackSize());
final FluidStack storable = fh.drain(toStore, false);
if (storable == null || storable.amount == 0) {
return ItemStack.EMPTY;
} else {
extract.amount = storable.amount;
}
}
// Actually drain
final FluidStack drained = fh.drain(extract, true);
extract.amount = drained.amount;
final IAEFluidStack notInserted = Platform.poweredInsert(this.getPowerSource(), this.monitor, AEFluidStack.fromFluidStack(extract), this.getActionSource());
if (notInserted != null && notInserted.getStackSize() > 0) {
IAEFluidStack spill = this.monitor.injectItems(notInserted, Actionable.MODULATE, this.getActionSource());
if (spill != null && spill.getStackSize() > 0) {
fh.fill(spill.getFluidStack(), true);
}
}
if (notInserted == null || notInserted.getStackSize() == 0) {
if (!player.inventory.addItemStackToInventory(fh.getContainer())) {
player.dropItem(fh.getContainer(), false);
}
clickSlot.decrStackSize(1);
}
}
this.detectAndSendChanges();
return ItemStack.EMPTY;
}
return super.transferStackInSlot(p, idx);
}
@Override
public void doAction(EntityPlayerMP player, InventoryAction action, int slot, long id) {
if (action != InventoryAction.FILL_ITEM && action != InventoryAction.EMPTY_ITEM) {
super.doAction(player, action, slot, id);
return;
}
final ItemStack held = player.inventory.getItemStack();
ItemStack heldCopy = held.copy();
heldCopy.setCount(1);
IFluidHandlerItem fh = FluidUtil.getFluidHandler(heldCopy);
if (fh == null) {
// only fluid handlers items
return;
}
if (action == InventoryAction.FILL_ITEM && this.clientRequestedTargetFluid != null) {
final IAEFluidStack stack = this.clientRequestedTargetFluid.copy();
// Check how much we can store in the item
stack.setStackSize(Integer.MAX_VALUE);
int amountAllowed = fh.fill(stack.getFluidStack(), false);
int heldAmount = held.getCount();
for (int i = 0; i < heldAmount; i++) {
ItemStack copiedFluidContainer = held.copy();
copiedFluidContainer.setCount(1);
fh = FluidUtil.getFluidHandler(copiedFluidContainer);
// Check if we can pull out of the system
final IAEFluidStack canPull = Platform.poweredExtraction(this.getPowerSource(), this.monitor, stack.setStackSize(amountAllowed), this.getActionSource(), Actionable.SIMULATE);
if (canPull == null || canPull.getStackSize() < 1) {
return;
}
// How much could fit into the container
final int canFill = fh.fill(canPull.getFluidStack(), false);
if (canFill == 0) {
return;
}
// Now actually pull out of the system
final IAEFluidStack pulled = Platform.poweredExtraction(this.getPowerSource(), this.monitor, stack.setStackSize(canFill), this.getActionSource());
if (pulled == null || pulled.getStackSize() < 1) {
// Something went wrong
AELog.error("Unable to pull fluid out of the ME system even though the simulation said yes ");
return;
}
// Actually fill
final int used = fh.fill(pulled.getFluidStack(), true);
if (used != canFill) {
AELog.error("Fluid item [%s] reported a different possible amount than it actually accepted.", held.getDisplayName());
}
if (held.getCount() == 1) {
player.inventory.setItemStack(fh.getContainer());
} else {
player.inventory.getItemStack().shrink(1);
if (!player.inventory.addItemStackToInventory(fh.getContainer())) {
player.dropItem(fh.getContainer(), false);
}
}
}
this.updateHeld(player);
} else if (action == InventoryAction.EMPTY_ITEM) {
int heldAmount = held.getCount();
for (int i = 0; i < heldAmount; i++) {
ItemStack copiedFluidContainer = held.copy();
copiedFluidContainer.setCount(1);
fh = FluidUtil.getFluidHandler(copiedFluidContainer);
// See how much we can drain from the item
final FluidStack extract = fh.drain(Integer.MAX_VALUE, false);
if (extract == null || extract.amount < 1) {
return;
}
// Check if we can push into the system
final IAEFluidStack notStorable = Platform.poweredInsert(this.getPowerSource(), this.monitor, AEFluidStack.fromFluidStack(extract), this.getActionSource(), Actionable.SIMULATE);
if (notStorable != null && notStorable.getStackSize() > 0) {
final int toStore = (int) (extract.amount - notStorable.getStackSize());
final FluidStack storable = fh.drain(toStore, false);
if (storable == null || storable.amount == 0) {
return;
} else {
extract.amount = storable.amount;
}
}
// Actually drain
final FluidStack drained = fh.drain(extract, true);
extract.amount = drained.amount;
final IAEFluidStack notInserted = Platform.poweredInsert(this.getPowerSource(), this.monitor, AEFluidStack.fromFluidStack(extract), this.getActionSource());
if (notInserted != null && notInserted.getStackSize() > 0) {
IAEFluidStack spill = this.monitor.injectItems(notInserted, Actionable.MODULATE, this.getActionSource());
if (spill != null && spill.getStackSize() > 0) {
fh.fill(spill.getFluidStack(), true);
}
}
if (held.getCount() == 1) {
player.inventory.setItemStack(fh.getContainer());
} else {
player.inventory.getItemStack().shrink(1);
if (!player.inventory.addItemStackToInventory(fh.getContainer())) {
player.dropItem(fh.getContainer(), false);
}
}
}
this.updateHeld(player);
}
}
private double getPowerMultiplier() {
return this.powerMultiplier;
}
void setPowerMultiplier(final double powerMultiplier) {
this.powerMultiplier = powerMultiplier;
}
public boolean isValid(Object verificationToken) {
return true;
}
@Override
public void postChange(IBaseMonitor<IAEFluidStack> monitor, Iterable<IAEFluidStack> change, IActionSource actionSource) {
for (final IAEFluidStack is : change) {
this.fluids.add(is);
}
}
@Override
public void onListUpdate() {
for (final IContainerListener c : this.listeners) {
this.queueInventory(c);
}
}
@Override
public void addListener(IContainerListener listener) {
super.addListener(listener);
this.queueInventory(listener);
}
@Override
public void onContainerClosed(final EntityPlayer player) {
super.onContainerClosed(player);
if (this.monitor != null) {
this.monitor.removeListener(this);
}
}
private void queueInventory(final IContainerListener c) {
if (Platform.isServer() && c instanceof EntityPlayer && this.monitor != null) {
try {
PacketMEFluidInventoryUpdate piu = new PacketMEFluidInventoryUpdate();
final IItemList<IAEFluidStack> monitorCache = this.monitor.getStorageList();
for (final IAEFluidStack send : monitorCache) {
try {
piu.appendFluid(send);
} catch (final BufferOverflowException boe) {
NetworkHandler.instance().sendTo(piu, (EntityPlayerMP) c);
piu = new PacketMEFluidInventoryUpdate();
piu.appendFluid(send);
}
}
NetworkHandler.instance().sendTo(piu, (EntityPlayerMP) c);
} catch (final IOException e) {
AELog.debug(e);
}
}
}
@Override
public IConfigManager getConfigManager() {
if (Platform.isServer()) {
return this.serverCM;
}
return this.clientCM;
}
@Override
public void updateSetting(IConfigManager manager, Enum settingName, Enum newValue) {
if (this.getGui() != null) {
this.getGui().updateSetting(manager, settingName, newValue);
}
}
public void setTargetStack(final IAEFluidStack stack) {
if (Platform.isClient()) {
if (stack == null && this.clientRequestedTargetFluid == null) {
return;
}
if (stack != null && this.clientRequestedTargetFluid != null && stack.getFluidStack()
.isFluidEqual(this.clientRequestedTargetFluid.getFluidStack())) {
return;
}
NetworkHandler.instance().sendToServer(new PacketTargetFluidStack((AEFluidStack) stack));
}
this.clientRequestedTargetFluid = stack == null ? null : stack.copy();
}
private IConfigManagerHost getGui() {
return this.gui;
}
public boolean isPowered() {
return this.hasPower;
}
public void setGui(@Nonnull final IConfigManagerHost gui) {
this.gui = gui;
}
@Override
public int availableUpgrades() {
return 1;
}
@Override
public void setupUpgrades() {
if (wirelessTerminalGUIObject != null) {
for (int upgradeSlot = 0; upgradeSlot < availableUpgrades(); upgradeSlot++) {
this.addSlotToContainer(
(new SlotRestrictedInput(SlotRestrictedInput.PlacableItemType.UPGRADES, upgrades, upgradeSlot, 183, 139 + upgradeSlot * 18, this.getInventoryPlayer()))
.setNotDraggable());
}
}
}
@Override
public void saveChanges() {
if (Platform.isServer()) {
NBTTagCompound tag = new NBTTagCompound();
this.upgrades.writeToNBT(tag, "upgrades");
this.wirelessTerminalGUIObject.saveChanges(tag);
}
}
private void loadFromNBT() {
NBTTagCompound data = wirelessTerminalGUIObject.getItemStack().getTagCompound();
if (data != null) {
upgrades.readFromNBT(wirelessTerminalGUIObject.getItemStack().getTagCompound().getCompoundTag("upgrades"));
}
}
@Override
public void onChangeInventory(IItemHandler inv, int slot, InvOperation mc, ItemStack removedStack, ItemStack newStack) {
}
@Override
public int getInventorySlot() {
return wirelessTerminalGUIObject.getInventorySlot();
}
@Override
public boolean isBaubleSlot() {
return wirelessTerminalGUIObject.isBaubleSlot();
}
}
@@ -0,0 +1,32 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.fluids.container;
import appeng.helpers.WirelessTerminalGuiObject;
import net.minecraft.entity.player.InventoryPlayer;
public class ContainerWirelessFluidTerminal extends ContainerMEPortableFluidCell {
public ContainerWirelessFluidTerminal(final InventoryPlayer ip, final WirelessTerminalGuiObject gui) {
super(ip, gui);
}
}
@@ -101,6 +101,8 @@ import net.minecraftforge.items.wrapper.RangedWrapper;
import javax.annotation.Nullable;
import java.util.*;
import static appeng.helpers.ItemStackHelper.*;
public class DualityInterface implements IGridTickable, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory, IConfigManagerHost, ICraftingProvider, IUpgradeableHost {
public static final int NUMBER_OF_STORAGE_SLOTS = 9;
@@ -208,12 +210,8 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
final NBTTagList waitingToSend = new NBTTagList();
if (this.waitingToSend != null) {
for (final ItemStack is : this.waitingToSend) {
final NBTTagCompound item = new NBTTagCompound();
is.writeToNBT(item);
if (is.getCount() > Byte.MAX_VALUE) {
item.setInteger("stackSize", is.getCount());
}
waitingToSend.appendTag(item);
final NBTTagCompound itemNBT = stackToNBT(is);
waitingToSend.appendTag(itemNBT);
}
}
data.setTag("waitingToSend", waitingToSend);
@@ -225,12 +223,8 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
NBTTagList waitingListSided = new NBTTagList();
if (this.waitingToSendFacing.containsKey(s)) {
for (final ItemStack is : this.waitingToSendFacing.get(s)) {
final NBTTagCompound item = new NBTTagCompound();
is.writeToNBT(item);
if (is.getCount() > Byte.MAX_VALUE) {
item.setInteger("stackSize", is.getCount());
}
waitingListSided.appendTag(item);
final NBTTagCompound itemNBT = stackToNBT(is);
waitingListSided.appendTag(itemNBT);
}
sidedWaitList.setTag(s.name(), waitingListSided);
}
@@ -246,10 +240,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
for (int x = 0; x < waitingList.tagCount(); x++) {
final NBTTagCompound c = waitingList.getCompoundTagAt(x);
if (c != null) {
final ItemStack is = new ItemStack(c);
if (c.hasKey("stackSize")) {
is.setCount(c.getInteger("stackSize"));
}
final ItemStack is = stackFromNBT(c);
this.addToSendList(is);
}
}
@@ -264,10 +255,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
for (int x = 0; x < w.tagCount(); x++) {
final NBTTagCompound c = w.getCompoundTagAt(x);
if (c != null) {
final ItemStack is = new ItemStack(c);
if (c.hasKey("stackSize")) {
is.setCount(c.getInteger("stackSize"));
}
final ItemStack is = stackFromNBT(c);
this.addToSendListFacing(is, EnumFacing.getFront(s.getIndex()));
}
}

Some files were not shown because too many files have changed in this diff Show More