Compare commits
142 Commits
v7.0.2
...
omni-fixes-v41
| Author | SHA1 | Date | |
|---|---|---|---|
| 33946438bd | |||
| 9372cb2f14 | |||
| 00037ace77 | |||
| e13af643ba | |||
| ffcfd809d8 | |||
| 7c10a6b883 | |||
| c2bddc30c4 | |||
| 024655f84d | |||
| 589e48ac01 | |||
| 43d3a2c1c0 | |||
| c432fa7200 | |||
| cc744ab8b9 | |||
| 8fe4229a8e | |||
| 3f86884965 | |||
| 1319ec79c9 | |||
| 31a3afc18b | |||
| 9d6026635d | |||
| 39038ac935 | |||
| 4f627b234c | |||
| 6180c188e6 | |||
| 7ada6d18ee | |||
| f493767243 | |||
| ba4cdbcb85 | |||
| f3877aa1ec | |||
| 366b31b3aa | |||
| 533fb5c34b | |||
| 62d1d904c6 | |||
| 03fb43db16 | |||
| 9576bec855 | |||
| b5da6730a1 | |||
| 039bab4811 | |||
| 4b5bdf9893 | |||
| 3c3c23712d | |||
| af91c04ea1 | |||
| 0240a5d76a | |||
| 0c0aafba2f | |||
| b541025738 | |||
| 62f842d4ef | |||
| fc154d8568 | |||
| 4641e48529 | |||
| 0fae87afc7 | |||
| ee1b6bb0d7 | |||
| 36ca8b9f0a | |||
| 9c94c7342b | |||
| 399d67b42c | |||
| 10761a1e9d | |||
| d1ddf53d99 | |||
| f776b4d548 | |||
| 41180792e1 | |||
| 2269c05d98 | |||
| 63616e5730 | |||
| 6ca3e6e696 | |||
| a4b5cfc3b9 | |||
| 38b0a7a153 | |||
| aa4863a979 | |||
| 44c7a46315 | |||
| c3b1dea7c5 | |||
| 40ec517480 | |||
| 2fdc16d3a8 | |||
| 053485a95a | |||
| e910af7734 | |||
| 59d7bd6c16 | |||
| 1a11462ddd | |||
| 77d615559f | |||
| 6878bfa4b0 | |||
| f1d50eca1a | |||
| 4ee32dd0b0 | |||
| 66e589324a | |||
| 362b001cb4 | |||
| b6fd4b3c0f | |||
| e364603a5a | |||
| c58bebc346 | |||
| 97f11f0c61 | |||
| 5c2fa72f95 | |||
| ebd8501301 | |||
| fa07247bd7 | |||
| 95d25ddf47 | |||
| 7a45e1faf4 | |||
| 1f88494832 | |||
| c629b4e0cf | |||
| 65ca607134 | |||
| 898c07ca01 | |||
| 883c267aa8 | |||
| 22cf913708 | |||
| b4ba1af1ec | |||
| 892c919ee2 | |||
| a65b3d2ceb | |||
| c826a3e24f | |||
| fc98505f22 | |||
| ea54ccbcf5 | |||
| 7796c6d4b6 | |||
| e2e6f6e83f | |||
| a7a1a87cd8 | |||
| e50eb7965f | |||
| d25a8a53a2 | |||
| 92b48f01a2 | |||
| 42f0d37c44 | |||
| 088a1827be | |||
| 6a21968dab | |||
| 7c5ff5322a | |||
| 7834028459 | |||
| c43cbbef43 | |||
| ead6274ca4 | |||
| f1c41bab3f | |||
| 12e74dc0de | |||
| c10088d907 | |||
| a12d29c4a0 | |||
| 2227510acf | |||
| 97ae7e1f14 | |||
| fc119070b2 | |||
| 82e3a95f11 | |||
| e6998913e1 | |||
| a3e69ce608 | |||
| ceef176a2a | |||
| c2e2696707 | |||
| 4d6c61dfcb | |||
| 932141cc9e | |||
| adf59774d4 | |||
| 9c6668b0f7 | |||
| 1b7f11a12e | |||
| 3cf4f9122c | |||
| d97996070a | |||
| 8a165bea09 | |||
| f707f95373 | |||
| b2a660ec9b | |||
| d6499c16b0 | |||
| de3e0178a4 | |||
| 203522316c | |||
| 719ea5090b | |||
| 00e19d67a2 | |||
| 169f6393d1 | |||
| 12bf337238 | |||
| 3b544c2486 | |||
| 660e17d167 | |||
| b10246a67b | |||
| 74362bb543 | |||
| 81df58afa5 | |||
| 535289e694 | |||
| d730503378 | |||
| 5ac8db41e7 | |||
| dfe5b82bda | |||
| c7f8f4249e |
+47
@@ -0,0 +1,47 @@
|
|||||||
|
Changes so far :
|
||||||
|
|
||||||
|
Design changes/breakages:
|
||||||
|
- Interfaces no longer spill items of one pattern on other faces
|
||||||
|
- Interfaces now push patterns in round-robin (Interfaces, then sides)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Fixes:
|
||||||
|
|
||||||
|
- Fix gregtech machines appearing with 'unnamed' or 'draconium lens' on the interface terminal on specific situations.
|
||||||
|
- Add memorycard support for fluid interfaces, import/export/storage busses and level emitters ( this fix was upstreamed to AE2 for MC 1.16)
|
||||||
|
- Storage busses now hide/show inaccessible items as configured.
|
||||||
|
- Exclusive Blocking mode for GTCE ( shapes, molds and configured circuits do not block GTCE machines )
|
||||||
|
- Blocking modes default to block on any item in the iventory the entity exposes
|
||||||
|
- Fuzzy includes items that report that they're damageable, but report a maxDamage of 0 ( auto-crafting of basic capacitors -> resonant capacitors is now possible ) <- Broken item implementation.
|
||||||
|
|
||||||
|
Performance:
|
||||||
|
|
||||||
|
- Added @talchas fixes for insane channelless AE networks.
|
||||||
|
- Implemented StorageDrawers slotless itemrepository.
|
||||||
|
- Removed CraftedEvent calls (really bad lag with craftweaker versions before CraftTweaker2-1.12-4.1.20.626)
|
||||||
|
- Count items set in interfaces before queuing crafting for them needlessly
|
||||||
|
- Backported b7ca98d ( Avoid copying items on simulated item extraction )
|
||||||
|
- Cache some level emitters functions
|
||||||
|
|
||||||
|
QOL:
|
||||||
|
|
||||||
|
- added highlight interface button to interface terminal ("?" button on the left of the interface slots)
|
||||||
|
- Added bar on the interface terminal that search by inputs ( The one on the LEFT, also searchs by interface name )
|
||||||
|
- Shortcut to molecular assemblers with free slots on the terminal interface by @Theisyat
|
||||||
|
- Toggle button on interface terminal to hide full interfaces
|
||||||
|
- JEI "U""R" and "A" (Usages/Recipes/Bookmark) now work on the Crafting Status GUI. ( the one that shows the total items to craft, and whats missing)
|
||||||
|
- Patterns can now be made with items currently showing on JEI. ( This is overriden by Just Enough Energistics. )
|
||||||
|
- Added multiplier buttons to processing pattern gui
|
||||||
|
- Switched crafting terminal JEI search to fuzzy mode. If the recipe uses a damageable item, AE will try to grab it ( damaged tools )
|
||||||
|
- Encoded patterns stack up to 64 ( holding shift and clicking the encode arrow will transfer the encoded pattern to the player inventory)
|
||||||
|
- Encoded patterns can be draggred on the interface terminal.
|
||||||
|
- Storage Monitor and Conversion Monitor now also ccepts fluids
|
||||||
|
- Draggable JEI ghost items (also works on bookmarked items. SHIFT + Click will move the hovered item into the first free target slot)
|
||||||
|
-JEI auto switches between crafting and processing patterns
|
||||||
|
|
||||||
|
HOTKEYS:
|
||||||
|
|
||||||
|
- Implemented mousetweaks API. AE2 custom keybinds now work. (Try right clicking and use the scroll-wheel on the terminals)
|
||||||
|
- Holding SHIFT and scrolling UP and DOWN will increase the items set on the configured slots of Interfaces and Pattern Terminal (Processing mode)
|
||||||
@@ -1,34 +1,15 @@
|
|||||||
[](https://travis-ci.org/AppliedEnergistics/Applied-Energistics-2)
|
This is a fork of AE2 i made for trying to solve issues for the [Omnifactory](https://www.curseforge.com/minecraft/modpacks/omnifactory) modpack.
|
||||||
[](https://github.com/AppliedEnergistics/Applied-Energistics-2/releases)
|
|
||||||
|
|
||||||
# Applied Energistics 2
|
See https://github.com/PrototypeTrousers/Applied-Energistics-2/tree/AE2-Omnifactory branch for commits
|
||||||
|
and
|
||||||
|
https://github.com/PrototypeTrousers/Applied-Energistics-2/releases for the compiled jars.
|
||||||
|
|
||||||
## Table of Contents
|
# Applied Energistics 2 (PrototypeTrousers fork for Omnifactory)
|
||||||
|
|
||||||
* [About](#about)
|
|
||||||
* [Contacts](#contacts)
|
|
||||||
* [License](#license)
|
|
||||||
* [Downloads](#downloads)
|
|
||||||
* [Installation](#installation)
|
|
||||||
* [Issues](#issues)
|
|
||||||
* [Building](#building)
|
|
||||||
* [Contribution](#contribution)
|
|
||||||
* [API](#applied-energistics-2-api)
|
|
||||||
* [CraftTweaker](#applied-energistics-2-crafttweaker)
|
|
||||||
* [Localization](#applied-energistics-2-localization)
|
|
||||||
* [Credits](#credits)
|
|
||||||
|
|
||||||
## About
|
## About
|
||||||
|
|
||||||
A Mod about Matter, Energy and using them to conquer the world..
|
A Mod about Matter, Energy and using them to conquer the world..
|
||||||
|
|
||||||
## Contacts
|
|
||||||
|
|
||||||
* [Website](http://ae-mod.info/)
|
|
||||||
* [IRC #appliedenergistics on esper.net](http://webchat.esper.net/?channels=appliedenergistics&prompt=1)
|
|
||||||
* [GitHub](https://github.com/AppliedEnergistics/Applied-Energistics-2)
|
|
||||||
* [Discord](https://discord.gg/GygKjjm)
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
* Applied Energistics 2 API
|
* Applied Energistics 2 API
|
||||||
@@ -43,198 +24,6 @@ A Mod about Matter, Energy and using them to conquer the world..
|
|||||||
* Text and Translations
|
* Text and Translations
|
||||||
- [](https://creativecommons.org/publicdomain/zero/1.0/)
|
- [](https://creativecommons.org/publicdomain/zero/1.0/)
|
||||||
|
|
||||||
## Downloads
|
|
||||||
|
|
||||||
Downloads can be found on [CurseForge](http://www.curse.com/mc-mods/minecraft/223794-applied-energistics-2) or on the [official website](http://ae-mod.info/Downloads/).
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
You install this mod by putting it into the `minecraft/mods/` folder. It has no additional hard dependencies.
|
|
||||||
|
|
||||||
## Issues
|
|
||||||
|
|
||||||
Applied Energistics 2 crashing, have a suggestion, found a bug? Create an issue now!
|
|
||||||
|
|
||||||
1. Make sure your issue has not already been answered or fixed and you are using the latest version. Also think about whether your issue is a valid one before submitting it.
|
|
||||||
* If it is already possible with vanilla and AE2 itself, the suggestion will be considered invalid.
|
|
||||||
* Asking for a smaller version, more compact version, or more efficient version of something will also be considered invalid.
|
|
||||||
2. Go to [the issues page](https://github.com/AppliedEnergistics/Applied-Energistics-2/issues) and click [new issue](https://github.com/AppliedEnergistics/Applied-Energistics-2/issues/new)
|
|
||||||
3. Enter your a title of your issue (something that summarizes your issue), and then create a detailed description of the issue.
|
|
||||||
* Do not tag it with something like `[Feature]`, `[Bug]`, or a version.
|
|
||||||
* Restrict it to a single bug or feature, it makes managing them way easier for us.
|
|
||||||
* The following details are required. Also refer to the issue template when creating one.
|
|
||||||
* Forge version
|
|
||||||
* AE2 version
|
|
||||||
* Crash log, when reporting a crash (Please make sure to use [pastebin](http://pastebin.com/))
|
|
||||||
* Never post an excerpt of what you consider important
|
|
||||||
* Always post the full log
|
|
||||||
* Other mods and their version, when reporting an issue between AE and another mod
|
|
||||||
* Also consider updating these before submitting a new issue, it might be already fixed
|
|
||||||
* A detailed description of the bug or feature
|
|
||||||
* To further help in resolving your issues please try to include the follow if applicable:
|
|
||||||
* What was expected?
|
|
||||||
* How to reproduce the problem?
|
|
||||||
* This is usually a great detail and allows us to fix it way faster
|
|
||||||
* Server or Single Player?
|
|
||||||
* Screen shots or Pictures of the problem
|
|
||||||
* Mod Pack using and version?
|
|
||||||
* Keep in mind that some mods might use an outdated version of AE2
|
|
||||||
* If so you should report it to your modpack
|
|
||||||
4. Click `Submit New Issue`, and wait for feedback!
|
|
||||||
|
|
||||||
Providing as many details as possible does help us to find and resolve the issue faster and also you getting a fixed version as fast as possible.
|
|
||||||
|
|
||||||
Please note that we might close any issue not matching these requirements.
|
|
||||||
|
|
||||||
## Building
|
|
||||||
|
|
||||||
1. Clone this repository via
|
|
||||||
- SSH `git clone git@github.com:AppliedEnergistics/Applied-Energistics-2.git` or
|
|
||||||
- HTTPS `git clone https://github.com/AppliedEnergistics/Applied-Energistics-2.git`
|
|
||||||
2. Setup workspace
|
|
||||||
- Decompiled source `gradlew setupDecompWorkspace`
|
|
||||||
- Obfuscated source `gradlew setupDevWorkspace`
|
|
||||||
- CI server `gradlew setupCIWorkspace`
|
|
||||||
3. Build `gradlew build`. Jar will be in `build/libs`
|
|
||||||
4. For core developer: Setup IDE
|
|
||||||
- IntelliJ: Import into IDE, execute `gradlew genIntellijRuns` and change RunConfiguration to `*_main` as quickfix for [ForgeGradle](https://github.com/MinecraftForge/ForgeGradle/issues/357)
|
|
||||||
- Eclipse: execute `gradlew eclipse`
|
|
||||||
5. For add-on developer: Core-Mod Detection
|
|
||||||
- In order to have FML detect AE from your dev environment, add the following VM Option to your run profile
|
|
||||||
- `-Dfml.coreMods.load=appeng.coremod.AppEngCore`
|
|
||||||
|
|
||||||
## Contribution
|
|
||||||
|
|
||||||
Before you want to add major changes, you might want to discuss them with us first, before wasting your time.
|
|
||||||
If you are still willing to contribute to this project, you can contribute via [Pull-Request](https://help.github.com/articles/creating-a-pull-request).
|
|
||||||
|
|
||||||
The [guidelines for contributing](https://github.com/AppliedEnergistics/Applied-Energistics-2/blob/master/.github/CONTRIBUTING.md) contain more detailed information about topics like the used code style and should also be considered.
|
|
||||||
|
|
||||||
Here are a few things to keep in mind that will help get your PR approved.
|
|
||||||
|
|
||||||
* A PR should be focused on content. Any PRs where the changes are only syntax will be rejected.
|
|
||||||
* Use the file you are editing as a style guide.
|
|
||||||
* Consider your feature. [Suggestion Guidelines](http://ae-mod.info/Suggestion-Guidelines/)
|
|
||||||
- Is your suggestion already possible using Vanilla + AE2?
|
|
||||||
- Make sure your feature isn't already in the works, or hasn't been rejected previously.
|
|
||||||
- Does your feature simplify another feature of AE2? These changes will not be accepted.
|
|
||||||
- If your feature can be done by any popular mod, discuss with us first.
|
|
||||||
|
|
||||||
**Getting Started**
|
|
||||||
|
|
||||||
1. Fork this repository
|
|
||||||
2. Clone the fork via
|
|
||||||
* SSH `git clone git@github.com:<your username>/Applied-Energistics-2.git` or
|
|
||||||
* HTTPS `git clone https://github.com/<your username>/Applied-Energistics-2.git`
|
|
||||||
3. Change code base
|
|
||||||
4. Add changes to git `git add -A`
|
|
||||||
5. Commit changes to your clone `git commit -m "<summary of made changes>"`
|
|
||||||
6. Push to your fork `git push`
|
|
||||||
7. Create a Pull-Request on GitHub
|
|
||||||
8. Wait for review
|
|
||||||
9. Squash commits for cleaner history
|
|
||||||
|
|
||||||
If you are only doing single file pull requests, GitHub supports using a quick way without the need of cloning your fork. Also read up about [synching](https://help.github.com/articles/syncing-a-fork) if you plan to contribute on regular basis.
|
|
||||||
|
|
||||||
## Applied Energistics 2 API
|
|
||||||
|
|
||||||
The API for Applied Energistics 2. It is open source to discuss changes, improve documentation, and provide better add-on support in general.
|
|
||||||
|
|
||||||
Universal builds obtained [Here](http://ae2.ae-mod.info/Downloads/) should work in a development environment.
|
|
||||||
|
|
||||||
### Maven
|
|
||||||
|
|
||||||
When compiling against the AE2 API you can use gradle dependencies, just add
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
compile "appeng:appliedenergistics2:rv_-_____-__:api"
|
|
||||||
}
|
|
||||||
|
|
||||||
or add the compile line to your existing dependencies task to your build.gradle
|
|
||||||
|
|
||||||
Where the __ are filled in with the correct version criteria; AE2 is available from the default forge maven so no additional repositories are necessary.
|
|
||||||
|
|
||||||
An example string would be `appeng:appliedenergistics2:rv5-stable-1:api` for the API only or `appeng:appliedenergistics2:rv5-stable-1` for the whole mod.
|
|
||||||
|
|
||||||
## Applied Energistics 2 CraftTweaker
|
|
||||||
|
|
||||||
### Inscriber
|
|
||||||
Add a recipe. When `inscribe` is true the bottom and top inputs are not consumed.
|
|
||||||
|
|
||||||
mods.appliedenergistics2.Inscriber.addRecipe(ItemStack output, ItemStack input, boolean inscribe,
|
|
||||||
@Optional ItemStack topInput, @Optional ItemStack bottomInput );
|
|
||||||
|
|
||||||
Remove all recipes for this output stack.
|
|
||||||
|
|
||||||
mods.appliedenergistics2.Inscriber.removeRecipe(ItemStack output);
|
|
||||||
|
|
||||||
### Grindstone
|
|
||||||
Add a recipe.
|
|
||||||
|
|
||||||
mods.appliedenergistics2.Grinder.addRecipe( ItemStack output, ItemStack input, int turns,
|
|
||||||
@Optional ItemStack secondary1Output, @Optional float secondary1Chance,
|
|
||||||
@Optional ItemStack secondary2Output, @Optional float secondary2Chance);
|
|
||||||
|
|
||||||
Remove recipes for this input.
|
|
||||||
|
|
||||||
mods.appliedenergistics2.Grinder.removeRecipe(ItemStack input);
|
|
||||||
|
|
||||||
### Spatial
|
|
||||||
Whitelist a TileEntity class for Spatial IO.
|
|
||||||
|
|
||||||
mods.appliedenergistics2.Spatial.whitelistEntity( String fullEntityClassName );
|
|
||||||
|
|
||||||
### Attunement
|
|
||||||
Attune a ItemStack or ModID to a specific P2P-Tunnel type. ModID's are used as fallback when no ItemStack was found.
|
|
||||||
|
|
||||||
mods.appliedenergistics2.Attunement.attuneME( ItemStack itemStack );
|
|
||||||
mods.appliedenergistics2.Attunement.attuneME( String modID );
|
|
||||||
mods.appliedenergistics2.Attunement.attuneItem( ItemStack itemStack );
|
|
||||||
mods.appliedenergistics2.Attunement.attuneItem( String modID );
|
|
||||||
mods.appliedenergistics2.Attunement.attuneFluid( ItemStack itemStack );
|
|
||||||
mods.appliedenergistics2.Attunement.attuneFluid( String modID );
|
|
||||||
mods.appliedenergistics2.Attunement.attuneRedstone( ItemStack itemStack );
|
|
||||||
mods.appliedenergistics2.Attunement.attuneRedstone( String modID );
|
|
||||||
mods.appliedenergistics2.Attunement.attuneRF( ItemStack itemStack );
|
|
||||||
mods.appliedenergistics2.Attunement.attuneRF( String modID );
|
|
||||||
mods.appliedenergistics2.Attunement.attuneIC2( ItemStack itemStack );
|
|
||||||
mods.appliedenergistics2.Attunement.attuneIC2( String modID );
|
|
||||||
mods.appliedenergistics2.Attunement.attuneLight( ItemStack itemStack );
|
|
||||||
mods.appliedenergistics2.Attunement.attuneLight( String modID );
|
|
||||||
|
|
||||||
### Cannon
|
|
||||||
Add ammo types for the matter cannon.
|
|
||||||
|
|
||||||
mods.appliedenergistics2.Cannon.registerAmmo( ItemStack itemStack, double weight );
|
|
||||||
|
|
||||||
## Applied Energistics 2 Localization
|
|
||||||
|
|
||||||
### English Text
|
|
||||||
|
|
||||||
`en_US` is included in this repository, fixes to typos are welcome.
|
|
||||||
|
|
||||||
### Encoding
|
|
||||||
|
|
||||||
Files must be encoded as UTF-8.
|
|
||||||
|
|
||||||
### New or updated Translations
|
|
||||||
|
|
||||||
The language files are located in `/src/main/resources/assets/appliedenergistics2/lang/` and use the [appropriate locale code](http://minecraft.gamepedia.com/Language) as name and `.lang` as extension.
|
|
||||||
|
|
||||||
To update an translation edit the corresponding file and improve/correct the existing entry. Or copy any entries from `en_US.lang` for missing translation.
|
|
||||||
|
|
||||||
To create a new translation, copy the contents of `en_US.lang`, create a new file with appropriate filename, and translate it to your language.
|
|
||||||
|
|
||||||
Please keep in mind that we use [String format](https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html) to pass additional data to the text for displaying.
|
|
||||||
Therefore you should preserve parts like `%s` or `%1$d%%`, which allows us to replace them with the correct values while you still have the option to change their order for match the rules of grammar.
|
|
||||||
This might not be possible for some languages. Should this be the case, please contact us.
|
|
||||||
|
|
||||||
### Final Note
|
|
||||||
|
|
||||||
If you have have issues localizing something feel free to contact us on IRC, at #AppliedEnergistics on Esper.net
|
|
||||||
|
|
||||||
Thanks to everyone helping out to improve localization of AE2.
|
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
|
|
||||||
Thanks to
|
Thanks to
|
||||||
|
|||||||
+1
-1
@@ -57,7 +57,7 @@ tasks.withType(JavaCompile) {
|
|||||||
options.encoding = 'UTF-8'
|
options.encoding = 'UTF-8'
|
||||||
}
|
}
|
||||||
|
|
||||||
version = aeversion + "-" + aechannel + "-" + aebuild
|
version = aeversion + "-" + aechannel + "-" + aebuild + " " + trousers
|
||||||
group = aegroup
|
group = aegroup
|
||||||
archivesBaseName = aebasename
|
archivesBaseName = aebasename
|
||||||
|
|
||||||
|
|||||||
+5
-4
@@ -1,15 +1,16 @@
|
|||||||
aeversion=rv6
|
aeversion=rv6
|
||||||
aechannel=alpha
|
aechannel=stable
|
||||||
aebuild=0
|
aebuild=7
|
||||||
aegroup=appeng
|
aegroup=appeng
|
||||||
aebasename=appliedenergistics2
|
aebasename=appliedenergistics2
|
||||||
|
trousers=omni-fixes-v21b
|
||||||
|
|
||||||
#########################################################
|
#########################################################
|
||||||
# Versions #
|
# Versions #
|
||||||
#########################################################
|
#########################################################
|
||||||
minecraft_version=1.12.2
|
minecraft_version=1.12.2
|
||||||
mcp_mappings=snapshot_20171003
|
mcp_mappings=snapshot_20171003
|
||||||
forge_version=14.23.5.2768
|
forge_version=14.23.5.2847
|
||||||
|
|
||||||
#########################################################
|
#########################################################
|
||||||
# Installable #
|
# Installable #
|
||||||
@@ -19,7 +20,7 @@ hwyla_version=1.8.26-B41_1.12.2
|
|||||||
#########################################################
|
#########################################################
|
||||||
# Provided APIs #
|
# Provided APIs #
|
||||||
#########################################################
|
#########################################################
|
||||||
jei_version=4.13.0.219
|
jei_version=4.16.1.302
|
||||||
tesla_version=1.0.63
|
tesla_version=1.0.63
|
||||||
ic2_version=2.8.73-ex112
|
ic2_version=2.8.73-ex112
|
||||||
top_version=1.12-1.4.23-16
|
top_version=1.12-1.4.23-16
|
||||||
|
|||||||
@@ -34,6 +34,11 @@ repositories {
|
|||||||
url "http://maven.mcmoddev.com"
|
url "http://maven.mcmoddev.com"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
maven {
|
||||||
|
name "Ellpeck"
|
||||||
|
url "https://maven.ellpeck.de"
|
||||||
|
}
|
||||||
|
|
||||||
maven {
|
maven {
|
||||||
name = "IC2 repo"
|
name = "IC2 repo"
|
||||||
url = "http://maven.ic2.player.to"
|
url = "http://maven.ic2.player.to"
|
||||||
@@ -54,11 +59,6 @@ repositories {
|
|||||||
url "http://maven.k-4u.nl/"
|
url "http://maven.k-4u.nl/"
|
||||||
}
|
}
|
||||||
|
|
||||||
maven { // Hwyla
|
|
||||||
name 'tehnut'
|
|
||||||
url "http://tehnut.info/maven"
|
|
||||||
}
|
|
||||||
|
|
||||||
maven { // CraftTweaker
|
maven { // CraftTweaker
|
||||||
name 'jared maven'
|
name 'jared maven'
|
||||||
url "http://maven.blamejared.com/"
|
url "http://maven.blamejared.com/"
|
||||||
@@ -80,6 +80,8 @@ configurations {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
compileOnly "gregtechce:gregtech:1.12.2:1.12.0.662"
|
||||||
|
|
||||||
// installable runtime dependencies
|
// installable runtime dependencies
|
||||||
mods "mcp.mobius.waila:Hwyla:${hwyla_version}"
|
mods "mcp.mobius.waila:Hwyla:${hwyla_version}"
|
||||||
mods "net.industrial-craft:industrialcraft-2:${ic2_version}:dev"
|
mods "net.industrial-craft:industrialcraft-2:${ic2_version}:dev"
|
||||||
@@ -95,6 +97,7 @@ dependencies {
|
|||||||
compileOnly "CraftTweaker2:CraftTweaker2-API:${crafttweaker_version}"
|
compileOnly "CraftTweaker2:CraftTweaker2-API:${crafttweaker_version}"
|
||||||
compileOnly "inventory-tweaks:InventoryTweaks:${inventorytweaks_version}:api"
|
compileOnly "inventory-tweaks:InventoryTweaks:${inventorytweaks_version}:api"
|
||||||
compileOnly "team.chisel.ctm:CTM:${ctm_version}"
|
compileOnly "team.chisel.ctm:CTM:${ctm_version}"
|
||||||
|
compileOnly "de.ellpeck.actuallyadditions:ActuallyAdditions:1.12.2-r152.16:api"
|
||||||
|
|
||||||
// at runtime, use the full JEI jar
|
// at runtime, use the full JEI jar
|
||||||
runtime "mezz.jei:jei_${minecraft_version}:${jei_version}"
|
runtime "mezz.jei:jei_${minecraft_version}:${jei_version}"
|
||||||
|
|||||||
@@ -26,5 +26,20 @@ package appeng.api.config;
|
|||||||
|
|
||||||
public enum ActionItems
|
public enum ActionItems
|
||||||
{
|
{
|
||||||
WRENCH, CLOSE, STASH, ENCODE, SUBSTITUTION
|
WRENCH,
|
||||||
|
CLOSE,
|
||||||
|
STASH,
|
||||||
|
ENCODE,
|
||||||
|
SUBSTITUTION,
|
||||||
|
MULTIPLY_BY_TWO,
|
||||||
|
MULTIPLY_BY_THREE,
|
||||||
|
INCREASE_BY_ONE,
|
||||||
|
DIVIDE_BY_TWO,
|
||||||
|
DIVIDE_BY_THREE,
|
||||||
|
DECREASE_BY_ONE,
|
||||||
|
MAX_COUNT,
|
||||||
|
FREE_MOLECULAR_SLOT_SHORTCUT,
|
||||||
|
TOGGLE_SHOW_FULL_INTERFACES_ON,
|
||||||
|
TOGGLE_SHOW_FULL_INTERFACES_OFF,
|
||||||
|
HIGHLIGHT_INTERFACE
|
||||||
}
|
}
|
||||||
+143
@@ -0,0 +1,143 @@
|
|||||||
|
package com.jaquadro.minecraft.storagedrawers.api.capabilities;
|
||||||
|
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.util.NonNullList;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An interface for treating an inventory as a slotless, central repository of items.
|
||||||
|
*
|
||||||
|
* For all operations that accept a predicate, if a predicate is supplied, a stored ItemStack must pass the predicate
|
||||||
|
* in order to be considered for the given operation.
|
||||||
|
*
|
||||||
|
* An IItemRepository implementation MAY relax or eliminate its own internal tests when a predicate is supplied. If
|
||||||
|
* the predicate is derived from DefaultPredicate, then the implementation MUST apply any tests it would have applied
|
||||||
|
* had no predicate been provided at all, in addition to testing the predicate itself.
|
||||||
|
*/
|
||||||
|
public interface IItemRepository
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Gets a list of all items in the inventory. The same item may appear multiple times with varying counts.
|
||||||
|
|
||||||
|
* @return A list of zero or more items in the inventory.
|
||||||
|
*/
|
||||||
|
@Nonnull
|
||||||
|
NonNullList<ItemRecord> getAllItems ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inserts an ItemStack into the inventory and returns the remainder.
|
||||||
|
*
|
||||||
|
* @param stack ItemStack to insert.
|
||||||
|
* @param simulate If true, the insertion is only simulated
|
||||||
|
* @param predicate See interface notes about predicates. Passing null specifies default matching.
|
||||||
|
* @return The remaining ItemStack that was not inserted. If the entire stack was accepted, returns
|
||||||
|
* ItemStack.EMPTY instead.
|
||||||
|
*/
|
||||||
|
@Nonnull
|
||||||
|
ItemStack insertItem (@Nonnull ItemStack stack, boolean simulate, Predicate<ItemStack> predicate);
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
default ItemStack insertItem (@Nonnull ItemStack stack, boolean simulate) {
|
||||||
|
return insertItem(stack, simulate, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tries to extract the given ItemStack from the inventory. The returned value will be a matching ItemStack
|
||||||
|
* with a stack size equal to or less than amount, or the empty ItemStack if the item could not be found at all.
|
||||||
|
* The returned stack size may exceed the ItemStack's getMaxStackSize() value.
|
||||||
|
|
||||||
|
* @param stack The item to extract. The stack size is ignored.
|
||||||
|
* @param amount Amount to extract (may be greater than the stacks max limit)
|
||||||
|
* @param simulate If true, the extraction is only simulated
|
||||||
|
* @param predicate See interface notes about predicates. Passing null specifies default matching.
|
||||||
|
* @return ItemStack extracted from the inventory, or ItemStack.EMPTY if nothing could be extracted.
|
||||||
|
*/
|
||||||
|
@Nonnull
|
||||||
|
ItemStack extractItem (@Nonnull ItemStack stack, int amount, boolean simulate, Predicate<ItemStack> predicate);
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
default ItemStack extractItem (@Nonnull ItemStack stack, int amount, boolean simulate) {
|
||||||
|
return extractItem(stack, amount, simulate, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the number of items matching the given ItemStack stored by the inventory.
|
||||||
|
|
||||||
|
* @param stack ItemStack to query.
|
||||||
|
* @param predicate See interface notes about predicates. Passing null specifies default matching.
|
||||||
|
* @return The number of stored matching items. A value of Integer.MAX_VALUE may indicate an infinite item source.
|
||||||
|
*/
|
||||||
|
default int getStoredItemCount (@Nonnull ItemStack stack, Predicate<ItemStack> predicate) {
|
||||||
|
ItemStack amount = extractItem(stack, Integer.MAX_VALUE, true, predicate);
|
||||||
|
return amount.getCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
default int getStoredItemCount (@Nonnull ItemStack stack) {
|
||||||
|
return getStoredItemCount(stack, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the number items matching the given ItemStack that additionally still be stored by the inventory.
|
||||||
|
* Remaining capacity may include space that is internally empty or unassigned to any given item.
|
||||||
|
*
|
||||||
|
* @param stack ItemStack to query.
|
||||||
|
* @param predicate See interface notes about predicates. Passing null specifies default matching.
|
||||||
|
* @return The available remaining space for matching items.
|
||||||
|
*/
|
||||||
|
default int getRemainingItemCapacity (@Nonnull ItemStack stack, Predicate<ItemStack> predicate) {
|
||||||
|
stack = stack.copy();
|
||||||
|
stack.setCount(Integer.MAX_VALUE);
|
||||||
|
ItemStack remainder = insertItem(stack, true, predicate);
|
||||||
|
return Integer.MAX_VALUE - remainder.getCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
default int getRemainingItemCapacity (@Nonnull ItemStack stack) {
|
||||||
|
return getRemainingItemCapacity(stack, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the total inventory capacity for items matching the given ItemStack.
|
||||||
|
* Total capacity may include space that is internally empty or unassigned to any given item.
|
||||||
|
*
|
||||||
|
* @param stack ItemStack to query.
|
||||||
|
* @param predicate See interface notes about predicates. Passing null specifies default matching.
|
||||||
|
* @return The total capacity for matching items.
|
||||||
|
*/
|
||||||
|
default int getItemCapacity (@Nonnull ItemStack stack, Predicate<ItemStack> predicate) {
|
||||||
|
long capacity = getStoredItemCount(stack, predicate) + getRemainingItemCapacity(stack, predicate);
|
||||||
|
if (capacity > Integer.MAX_VALUE)
|
||||||
|
return Integer.MAX_VALUE;
|
||||||
|
return (int)capacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
default int getItemCapacity (@Nonnull ItemStack stack) {
|
||||||
|
return getItemCapacity(stack, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An item record representing an item and the amount stored.
|
||||||
|
*
|
||||||
|
* The ItemStack held by itemPrototype always reports a stack size of 1.
|
||||||
|
* IT IS IMPORTANT THAT YOU NEVER MODIFY itemPrototype.
|
||||||
|
*/
|
||||||
|
class ItemRecord
|
||||||
|
{
|
||||||
|
@Nonnull
|
||||||
|
public final ItemStack itemPrototype;
|
||||||
|
public final int count;
|
||||||
|
|
||||||
|
public ItemRecord (@Nonnull ItemStack itemPrototype, int count) {
|
||||||
|
this.itemPrototype = itemPrototype;
|
||||||
|
this.count = count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variant of the standard Predicate interface that when passed to IItemRepository functions, will ask the
|
||||||
|
* internal default predicate to be tested in addition to the custom predicate. An IItemRepository function
|
||||||
|
* may choose to enforce its own predicate regardless.
|
||||||
|
*/
|
||||||
|
interface DefaultPredicate<T> extends Predicate<T> { }
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
package yalter.mousetweaks.api;
|
||||||
|
|
||||||
|
import net.minecraft.inventory.Container;
|
||||||
|
import net.minecraft.inventory.Slot;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the interface you want to implement in your GuiScreen to make it compatible with Mouse Tweaks.
|
||||||
|
* If this interface is not enough (for example, you need a custom slot click function, or if you use a custom Container
|
||||||
|
* which happens to be incompatible), check IMTModGuiContainer2Ex instead.
|
||||||
|
* If you just need to disable Mouse Tweaks or the wheel tweak, see the MouseTweaksIgnore
|
||||||
|
* or the MouseTweaksDisableWheelTweak annotations.
|
||||||
|
*/
|
||||||
|
public interface IMTModGuiContainer2 {
|
||||||
|
/**
|
||||||
|
* If you want to disable Mouse Tweaks in your GuiScreen, return true from this method.
|
||||||
|
*
|
||||||
|
* @return True if Mouse Tweaks should be disabled, false otherwise.
|
||||||
|
*/
|
||||||
|
boolean MT_isMouseTweaksDisabled();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If you want to disable the Wheel Tweak in your GuiScreen, return true from this method.
|
||||||
|
*
|
||||||
|
* @return True if the Wheel Tweak should be disabled, false otherwise.
|
||||||
|
*/
|
||||||
|
boolean MT_isWheelTweakDisabled();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Container.
|
||||||
|
*
|
||||||
|
* @return Container that is currently in use.
|
||||||
|
*/
|
||||||
|
Container MT_getContainer();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Slot that is currently selected by the player, or null if no Slot is selected.
|
||||||
|
*
|
||||||
|
* @return Slot that is located under the mouse, or null if no Slot it currently under the mouse.
|
||||||
|
*/
|
||||||
|
Slot MT_getSlotUnderMouse();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if the given Slot behaves like the vanilla crafting output slots (inside the crafting table,
|
||||||
|
* or the furnace output slot, or the anvil output slot, etc.). These slots are handled differently by Mouse Tweaks.
|
||||||
|
*
|
||||||
|
* @param slot the slot to check
|
||||||
|
* @return True if slot is a crafting output slot.
|
||||||
|
*/
|
||||||
|
boolean MT_isCraftingOutput(Slot slot);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if the given Slot should be ignored by Mouse Tweaks. Examples of ignored slots are the item select
|
||||||
|
* slots and the Destroy Item slot in the vanilla creative inventory.
|
||||||
|
*
|
||||||
|
* @param slot the slot to check
|
||||||
|
* @return Tru if slot should be ignored by Mouse Tweaks.
|
||||||
|
*/
|
||||||
|
boolean MT_isIgnored(Slot slot);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If your container has an RMB dragging functionality (like vanilla containers), disable it inside this method.
|
||||||
|
* This method is called every frame (render tick), which is after all mouseClicked / mouseClickMove / mouseReleased
|
||||||
|
* events are handled (although note these events are handled every game tick, which is far less frequent than every
|
||||||
|
* render tick).<br><br>
|
||||||
|
*
|
||||||
|
* If true is returned from this method, Mouse Tweaks (after checking other conditions like isIgnored) will click
|
||||||
|
* the slot on which the right mouse button was initially pressed (in most cases this is the slot currently under
|
||||||
|
* mouse). This is needed because the vanilla RMB dragging functionality prevents the initial slot click.<br><br>
|
||||||
|
*
|
||||||
|
* For vanilla containers this method looks like this:
|
||||||
|
* <pre>
|
||||||
|
* this.ignoreMouseUp = true;
|
||||||
|
*
|
||||||
|
* if (this.dragSplitting) {
|
||||||
|
* if (this.dragSplittingButton == 1) {
|
||||||
|
* this.dragSplitting = false;
|
||||||
|
* return true;
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* return false;
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @return True if Mouse Tweaks should click the slot on which the RMB was pressed.
|
||||||
|
*/
|
||||||
|
boolean MT_disableRMBDraggingFunctionality();
|
||||||
|
}
|
||||||
@@ -19,6 +19,7 @@
|
|||||||
package appeng.capabilities;
|
package appeng.capabilities;
|
||||||
|
|
||||||
|
|
||||||
|
import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository;
|
||||||
import net.darkhax.tesla.api.ITeslaConsumer;
|
import net.darkhax.tesla.api.ITeslaConsumer;
|
||||||
import net.darkhax.tesla.api.ITeslaHolder;
|
import net.darkhax.tesla.api.ITeslaHolder;
|
||||||
import net.minecraft.nbt.NBTBase;
|
import net.minecraft.nbt.NBTBase;
|
||||||
@@ -54,6 +55,8 @@ public final class Capabilities
|
|||||||
|
|
||||||
public static Capability<IEnergyStorage> FORGE_ENERGY;
|
public static Capability<IEnergyStorage> FORGE_ENERGY;
|
||||||
|
|
||||||
|
public static Capability<IItemRepository> ITEM_REPOSITORY_CAPABILITY;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register AE2 provided capabilities.
|
* Register AE2 provided capabilities.
|
||||||
*/
|
*/
|
||||||
@@ -99,6 +102,9 @@ public final class Capabilities
|
|||||||
FORGE_ENERGY = cap;
|
FORGE_ENERGY = cap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@CapabilityInject( IItemRepository.class )
|
||||||
|
private static void capIItemRepositoryRegistered( Capability<IItemRepository> cap ) { ITEM_REPOSITORY_CAPABILITY = cap; }
|
||||||
|
|
||||||
// Create a storage implementation that does not do anything
|
// Create a storage implementation that does not do anything
|
||||||
private static <T> Capability.IStorage<T> createNullStorage()
|
private static <T> Capability.IStorage<T> createNullStorage()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -25,7 +25,11 @@ import java.util.EnumMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
|
import appeng.client.gui.AEBaseGui;
|
||||||
|
import appeng.container.interfaces.IJEIGhostIngredients;
|
||||||
|
import appeng.helpers.HighlighterHandler;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.gui.GuiScreen;
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
import net.minecraft.client.settings.KeyBinding;
|
import net.minecraft.client.settings.KeyBinding;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
@@ -35,9 +39,7 @@ import net.minecraft.util.EnumHand;
|
|||||||
import net.minecraft.util.math.RayTraceResult;
|
import net.minecraft.util.math.RayTraceResult;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.client.event.MouseEvent;
|
import net.minecraftforge.client.event.*;
|
||||||
import net.minecraftforge.client.event.RenderLivingEvent;
|
|
||||||
import net.minecraftforge.client.event.TextureStitchEvent;
|
|
||||||
import net.minecraftforge.client.model.ModelLoaderRegistry;
|
import net.minecraftforge.client.model.ModelLoaderRegistry;
|
||||||
import net.minecraftforge.common.ForgeModContainer;
|
import net.minecraftforge.common.ForgeModContainer;
|
||||||
import net.minecraftforge.common.MinecraftForge;
|
import net.minecraftforge.common.MinecraftForge;
|
||||||
@@ -73,6 +75,7 @@ import appeng.hooks.TickHandler;
|
|||||||
import appeng.hooks.TickHandler.PlayerColor;
|
import appeng.hooks.TickHandler.PlayerColor;
|
||||||
import appeng.server.ServerHelper;
|
import appeng.server.ServerHelper;
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
|
import org.lwjgl.input.Mouse;
|
||||||
|
|
||||||
|
|
||||||
public class ClientHelper extends ServerHelper
|
public class ClientHelper extends ServerHelper
|
||||||
@@ -106,6 +109,11 @@ public class ClientHelper extends ServerHelper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void renderWorldLastEvent( RenderWorldLastEvent event) {
|
||||||
|
HighlighterHandler.tick(event);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public World getWorld()
|
public World getWorld()
|
||||||
{
|
{
|
||||||
@@ -308,6 +316,28 @@ public class ClientHelper extends ServerHelper
|
|||||||
Minecraft.getMinecraft().effectRenderer.addEffect( fx );
|
Minecraft.getMinecraft().effectRenderer.addEffect( fx );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void MouseClickEvent( final GuiScreenEvent.MouseInputEvent.Pre me )
|
||||||
|
{
|
||||||
|
final Minecraft mc = Minecraft.getMinecraft();
|
||||||
|
if( mc.currentScreen instanceof IJEIGhostIngredients )
|
||||||
|
{
|
||||||
|
AEBaseGui gui = ( (AEBaseGui) mc.currentScreen );
|
||||||
|
Object ingredient = gui.getBookmarkedIngredient();
|
||||||
|
if( ingredient != null )
|
||||||
|
{
|
||||||
|
if( GuiScreen.isShiftKeyDown() )
|
||||||
|
{
|
||||||
|
me.setCanceled( true );
|
||||||
|
}
|
||||||
|
else if( Mouse.isButtonDown( 0 ) )
|
||||||
|
{
|
||||||
|
me.setCanceled( true );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void wheelEvent( final MouseEvent me )
|
public void wheelEvent( final MouseEvent me )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
package appeng.client.gui;
|
package appeng.client.gui;
|
||||||
|
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
@@ -31,10 +32,16 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import appeng.container.slot.*;
|
||||||
import com.google.common.base.Joiner;
|
import com.google.common.base.Joiner;
|
||||||
import com.google.common.base.Stopwatch;
|
import com.google.common.base.Stopwatch;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
|
import mezz.jei.api.gui.IGhostIngredientHandler;
|
||||||
|
import net.minecraft.client.gui.Gui;
|
||||||
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
|
import net.minecraftforge.fluids.FluidUtil;
|
||||||
|
import net.minecraftforge.fml.common.Optional;
|
||||||
import org.lwjgl.input.Keyboard;
|
import org.lwjgl.input.Keyboard;
|
||||||
import org.lwjgl.input.Mouse;
|
import org.lwjgl.input.Mouse;
|
||||||
import org.lwjgl.opengl.GL11;
|
import org.lwjgl.opengl.GL11;
|
||||||
@@ -68,17 +75,7 @@ import appeng.client.me.SlotDisconnected;
|
|||||||
import appeng.client.me.SlotME;
|
import appeng.client.me.SlotME;
|
||||||
import appeng.client.render.StackSizeRenderer;
|
import appeng.client.render.StackSizeRenderer;
|
||||||
import appeng.container.AEBaseContainer;
|
import appeng.container.AEBaseContainer;
|
||||||
import appeng.container.slot.AppEngCraftingSlot;
|
|
||||||
import appeng.container.slot.AppEngSlot;
|
|
||||||
import appeng.container.slot.AppEngSlot.hasCalculatedValidness;
|
import appeng.container.slot.AppEngSlot.hasCalculatedValidness;
|
||||||
import appeng.container.slot.IOptionalSlot;
|
|
||||||
import appeng.container.slot.SlotCraftingTerm;
|
|
||||||
import appeng.container.slot.SlotDisabled;
|
|
||||||
import appeng.container.slot.SlotFake;
|
|
||||||
import appeng.container.slot.SlotInaccessible;
|
|
||||||
import appeng.container.slot.SlotOutput;
|
|
||||||
import appeng.container.slot.SlotPatternTerm;
|
|
||||||
import appeng.container.slot.SlotRestrictedInput;
|
|
||||||
import appeng.core.AELog;
|
import appeng.core.AELog;
|
||||||
import appeng.core.AppEng;
|
import appeng.core.AppEng;
|
||||||
import appeng.core.sync.network.NetworkHandler;
|
import appeng.core.sync.network.NetworkHandler;
|
||||||
@@ -87,9 +84,14 @@ import appeng.core.sync.packets.PacketSwapSlots;
|
|||||||
import appeng.fluids.client.render.FluidStackSizeRenderer;
|
import appeng.fluids.client.render.FluidStackSizeRenderer;
|
||||||
import appeng.fluids.container.slots.IMEFluidSlot;
|
import appeng.fluids.container.slots.IMEFluidSlot;
|
||||||
import appeng.helpers.InventoryAction;
|
import appeng.helpers.InventoryAction;
|
||||||
|
import yalter.mousetweaks.api.IMTModGuiContainer2;
|
||||||
|
|
||||||
|
import static appeng.integration.modules.jei.JEIPlugin.aeGuiHandler;
|
||||||
|
import static appeng.integration.modules.jei.JEIPlugin.runtime;
|
||||||
|
|
||||||
|
|
||||||
public abstract class AEBaseGui extends GuiContainer
|
@Optional.Interface( iface = "yalter.mousetweaks.api.IMTModGuiContainer2", modid = "mousetweaks" )
|
||||||
|
public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContainer2
|
||||||
{
|
{
|
||||||
private final List<InternalSlotME> meSlots = new ArrayList<>();
|
private final List<InternalSlotME> meSlots = new ArrayList<>();
|
||||||
// drag y
|
// drag y
|
||||||
@@ -101,6 +103,28 @@ public abstract class AEBaseGui extends GuiContainer
|
|||||||
private Stopwatch dbl_clickTimer = Stopwatch.createStarted();
|
private Stopwatch dbl_clickTimer = Stopwatch.createStarted();
|
||||||
private ItemStack dbl_whichItem = ItemStack.EMPTY;
|
private ItemStack dbl_whichItem = ItemStack.EMPTY;
|
||||||
private Slot bl_clicked;
|
private Slot bl_clicked;
|
||||||
|
private Stopwatch lastClicked = Stopwatch.createStarted();
|
||||||
|
private List<IGhostIngredientHandler.Target<Object>> hoveredIngredientTargets = new ArrayList<>();
|
||||||
|
private Object bookmarkedIngredient;
|
||||||
|
private boolean isDraggingJeiGhostItem;
|
||||||
|
|
||||||
|
public void setJeiGhostItem( boolean jeiGhostItem )
|
||||||
|
{
|
||||||
|
isJeiGhostItem = jeiGhostItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isJeiGhostItem;
|
||||||
|
|
||||||
|
public Object getBookmarkedIngredient()
|
||||||
|
{
|
||||||
|
return bookmarkedIngredient;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<GuiCustomSlot> getGuiSlots()
|
||||||
|
{
|
||||||
|
return guiSlots;
|
||||||
|
}
|
||||||
|
|
||||||
protected final List<GuiCustomSlot> guiSlots = new ArrayList<>();
|
protected final List<GuiCustomSlot> guiSlots = new ArrayList<>();
|
||||||
|
|
||||||
public AEBaseGui( final Container container )
|
public AEBaseGui( final Container container )
|
||||||
@@ -183,6 +207,65 @@ public abstract class AEBaseGui extends GuiContainer
|
|||||||
this.drawTooltip( (ITooltip) c, mouseX, mouseY );
|
this.drawTooltip( (ITooltip) c, mouseX, mouseY );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
GlStateManager.enableDepth();
|
||||||
|
bookmarkedJEIghostItem(mouseX,mouseY);
|
||||||
|
GlStateManager.disableDepth();
|
||||||
|
}
|
||||||
|
|
||||||
|
void bookmarkedJEIghostItem(final int mouseX, final int mouseY) {
|
||||||
|
|
||||||
|
if (!isJeiGhostItem)
|
||||||
|
{
|
||||||
|
bookmarkedIngredient = runtime.getBookmarkOverlay().getIngredientUnderMouse();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( bookmarkedIngredient != null )
|
||||||
|
{
|
||||||
|
hoveredIngredientTargets = aeGuiHandler.getTargets( this, bookmarkedIngredient, false );
|
||||||
|
ItemStack dragItem = ItemStack.EMPTY;
|
||||||
|
if( hoveredIngredientTargets.size() > 0 )
|
||||||
|
{
|
||||||
|
if( isShiftKeyDown() && Mouse.isButtonDown( 0 ) && this.lastClicked.elapsed( TimeUnit.MILLISECONDS ) > 200 )
|
||||||
|
{
|
||||||
|
this.lastClicked = Stopwatch.createStarted();
|
||||||
|
aeGuiHandler.getTargets( this, bookmarkedIngredient, true );
|
||||||
|
}
|
||||||
|
else if( Mouse.isButtonDown( 0 ) && this.lastClicked.elapsed( TimeUnit.MILLISECONDS ) > 200 )
|
||||||
|
{
|
||||||
|
this.lastClicked = Stopwatch.createStarted();
|
||||||
|
if( bookmarkedIngredient instanceof ItemStack )
|
||||||
|
{
|
||||||
|
dragItem = ( (ItemStack) bookmarkedIngredient );
|
||||||
|
}
|
||||||
|
else if( bookmarkedIngredient instanceof FluidStack )
|
||||||
|
{
|
||||||
|
dragItem = FluidUtil.getFilledBucket( ( (FluidStack) bookmarkedIngredient ) );
|
||||||
|
}
|
||||||
|
mc.player.inventory.setItemStack( dragItem.copy() );
|
||||||
|
this.isJeiGhostItem = true;
|
||||||
|
}
|
||||||
|
drawTargets( mouseX, mouseY );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void drawTargets(int mouseX, int mouseY) {
|
||||||
|
GlStateManager.disableLighting();
|
||||||
|
for( IGhostIngredientHandler.Target target : hoveredIngredientTargets )
|
||||||
|
{
|
||||||
|
Rectangle area = target.getArea();
|
||||||
|
Color color;
|
||||||
|
if( area.contains( mouseX, mouseY ) )
|
||||||
|
{
|
||||||
|
color = new Color( 76, 201, 25, 128 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
color = new Color( 19, 201, 10, 64 );
|
||||||
|
}
|
||||||
|
Gui.drawRect( area.x, area.y, area.x + area.width, area.y + area.height, color.getRGB() );
|
||||||
|
}
|
||||||
|
GlStateManager.color( 1f, 1f, 1f, 1f );
|
||||||
|
GlStateManager.enableDepth();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void drawGuiSlot( GuiCustomSlot slot, int mouseX, int mouseY, float partialTicks )
|
protected void drawGuiSlot( GuiCustomSlot slot, int mouseX, int mouseY, float partialTicks )
|
||||||
@@ -315,7 +398,6 @@ public abstract class AEBaseGui extends GuiContainer
|
|||||||
{
|
{
|
||||||
slot.drawBackground( ox, oy );
|
slot.drawBackground( ox, oy );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -375,6 +457,43 @@ public abstract class AEBaseGui extends GuiContainer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if( slot instanceof SlotDisconnected )
|
||||||
|
{
|
||||||
|
this.drag_click.add( slot );
|
||||||
|
if( this.drag_click.size() > 1 )
|
||||||
|
{
|
||||||
|
if( !itemstack.isEmpty() )
|
||||||
|
{
|
||||||
|
for( final Slot dr : this.drag_click )
|
||||||
|
{
|
||||||
|
if( slot.getStack().isEmpty() )
|
||||||
|
{
|
||||||
|
InventoryAction action = InventoryAction.SPLIT_OR_PLACE_SINGLE;
|
||||||
|
final PacketInventoryAction p = new PacketInventoryAction( action, dr.getSlotIndex(), ( (SlotDisconnected) slot ).getSlot().getId() );
|
||||||
|
NetworkHandler.instance().sendToServer( p );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if( isShiftKeyDown() )
|
||||||
|
{
|
||||||
|
for( final Slot dr : this.drag_click )
|
||||||
|
{
|
||||||
|
InventoryAction action = null;
|
||||||
|
if( !slot.getStack().isEmpty() )
|
||||||
|
{
|
||||||
|
action = InventoryAction.SHIFT_CLICK;
|
||||||
|
}
|
||||||
|
if( action != null )
|
||||||
|
{
|
||||||
|
final PacketInventoryAction p = new PacketInventoryAction( action, dr.getSlotIndex(), ( (SlotDisconnected) slot ).getSlot().getId() );
|
||||||
|
NetworkHandler.instance().sendToServer( p );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
super.mouseClickMove( x, y, c, d );
|
super.mouseClickMove( x, y, c, d );
|
||||||
@@ -387,18 +506,56 @@ public abstract class AEBaseGui extends GuiContainer
|
|||||||
{
|
{
|
||||||
final EntityPlayer player = Minecraft.getMinecraft().player;
|
final EntityPlayer player = Minecraft.getMinecraft().player;
|
||||||
|
|
||||||
if( slot instanceof SlotFake )
|
if( this.isJeiGhostItem && isDraggingJeiGhostItem)
|
||||||
{
|
{
|
||||||
final InventoryAction action = mouseButton == 1 ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN;
|
for( IGhostIngredientHandler.Target target : hoveredIngredientTargets )
|
||||||
|
{
|
||||||
|
Rectangle area = target.getArea();
|
||||||
|
final int x = Mouse.getEventX() * this.width / this.mc.displayWidth;
|
||||||
|
final int y = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1;
|
||||||
|
|
||||||
|
if( area.contains( x, y ) )
|
||||||
|
{
|
||||||
|
target.accept( bookmarkedIngredient );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.isJeiGhostItem = false;
|
||||||
|
this.isDraggingJeiGhostItem = false;
|
||||||
|
|
||||||
|
ItemStack dragItem = ItemStack.EMPTY;
|
||||||
|
if( runtime.getBookmarkOverlay().getIngredientUnderMouse() != null )
|
||||||
|
{
|
||||||
|
bookmarkedJEIghostItem( Mouse.getX(), this.mc.displayHeight - Mouse.getY() );
|
||||||
|
if( bookmarkedIngredient instanceof ItemStack )
|
||||||
|
{
|
||||||
|
dragItem = ( (ItemStack) bookmarkedIngredient );
|
||||||
|
}
|
||||||
|
else if( bookmarkedIngredient instanceof FluidStack )
|
||||||
|
{
|
||||||
|
dragItem = FluidUtil.getFilledBucket( ( (FluidStack) bookmarkedIngredient ) );
|
||||||
|
}
|
||||||
|
mc.player.inventory.setItemStack( dragItem.copy() );
|
||||||
|
this.isJeiGhostItem = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mc.player.inventory.setItemStack( dragItem );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if( slot instanceof SlotFake )
|
||||||
|
{
|
||||||
|
final InventoryAction action;
|
||||||
|
action = mouseButton == 1 ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN;
|
||||||
|
|
||||||
if( this.drag_click.size() > 1 )
|
if( this.drag_click.size() > 1 )
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final PacketInventoryAction p = new PacketInventoryAction( action, slotIdx, 0 );
|
PacketInventoryAction p = new PacketInventoryAction( action, slotIdx, 0 );
|
||||||
NetworkHandler.instance().sendToServer( p );
|
NetworkHandler.instance().sendToServer( p );
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -468,12 +625,24 @@ public abstract class AEBaseGui extends GuiContainer
|
|||||||
|
|
||||||
if( slot instanceof SlotDisconnected )
|
if( slot instanceof SlotDisconnected )
|
||||||
{
|
{
|
||||||
|
if( this.drag_click.size() > 1 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
InventoryAction action = null;
|
InventoryAction action = null;
|
||||||
|
|
||||||
switch( clickType )
|
switch ( clickType )
|
||||||
{
|
{
|
||||||
case PICKUP: // pickup / set-down.
|
case PICKUP: // pickup / set-down.
|
||||||
action = ( mouseButton == 1 ) ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN;
|
if( slot.getStack().isEmpty() && !player.inventory.getItemStack().isEmpty() )
|
||||||
|
{
|
||||||
|
action = InventoryAction.SPLIT_OR_PLACE_SINGLE;
|
||||||
|
}
|
||||||
|
if( !slot.getStack().isEmpty() && player.inventory.getItemStack().getCount() <= 1 )
|
||||||
|
{
|
||||||
|
action = InventoryAction.PICKUP_OR_SET_DOWN;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case QUICK_MOVE:
|
case QUICK_MOVE:
|
||||||
action = ( mouseButton == 1 ) ? InventoryAction.PICKUP_SINGLE : InventoryAction.SHIFT_CLICK;
|
action = ( mouseButton == 1 ) ? InventoryAction.PICKUP_SINGLE : InventoryAction.SHIFT_CLICK;
|
||||||
@@ -506,14 +675,13 @@ public abstract class AEBaseGui extends GuiContainer
|
|||||||
InventoryAction action = null;
|
InventoryAction action = null;
|
||||||
IAEItemStack stack = null;
|
IAEItemStack stack = null;
|
||||||
|
|
||||||
switch( clickType )
|
switch ( clickType )
|
||||||
{
|
{
|
||||||
case PICKUP: // pickup / set-down.
|
case PICKUP: // pickup / set-down.
|
||||||
action = ( mouseButton == 1 ) ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN;
|
action = ( mouseButton == 1 ) ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN;
|
||||||
stack = ( (SlotME) slot ).getAEStack();
|
stack = ( (SlotME) slot ).getAEStack();
|
||||||
|
|
||||||
if( stack != null && action == InventoryAction.PICKUP_OR_SET_DOWN && stack.getStackSize() == 0 && player.inventory.getItemStack()
|
if( stack != null && action == InventoryAction.PICKUP_OR_SET_DOWN && stack.getStackSize() == 0 && player.inventory.getItemStack().isEmpty() )
|
||||||
.isEmpty() )
|
|
||||||
{
|
{
|
||||||
action = InventoryAction.AUTO_CRAFT;
|
action = InventoryAction.AUTO_CRAFT;
|
||||||
}
|
}
|
||||||
@@ -580,9 +748,7 @@ public abstract class AEBaseGui extends GuiContainer
|
|||||||
final List<Slot> slots = this.getInventorySlots();
|
final List<Slot> slots = this.getInventorySlots();
|
||||||
for( final Slot inventorySlot : slots )
|
for( final Slot inventorySlot : slots )
|
||||||
{
|
{
|
||||||
if( inventorySlot != null && inventorySlot.canTakeStack(
|
if( inventorySlot != null && inventorySlot.canTakeStack( this.mc.player ) && inventorySlot.getHasStack() && inventorySlot.isSameInventory( slot ) && Container.canAddItemToSlot( inventorySlot, this.dbl_whichItem, true ) )
|
||||||
this.mc.player ) && inventorySlot.getHasStack() && inventorySlot.isSameInventory( slot ) && Container.canAddItemToSlot(
|
|
||||||
inventorySlot, this.dbl_whichItem, true ) )
|
|
||||||
{
|
{
|
||||||
this.handleMouseClick( inventorySlot, inventorySlot.slotNumber, 0, ClickType.QUICK_MOVE );
|
this.handleMouseClick( inventorySlot, inventorySlot.slotNumber, 0, ClickType.QUICK_MOVE );
|
||||||
}
|
}
|
||||||
@@ -593,6 +759,11 @@ public abstract class AEBaseGui extends GuiContainer
|
|||||||
this.disableShiftClick = false;
|
this.disableShiftClick = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (clickType == ClickType.PICKUP && isJeiGhostItem && !isDraggingJeiGhostItem) {
|
||||||
|
this.isDraggingJeiGhostItem = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
super.handleMouseClick( slot, slotIdx, mouseButton, clickType );
|
super.handleMouseClick( slot, slotIdx, mouseButton, clickType );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -702,6 +873,16 @@ public abstract class AEBaseGui extends GuiContainer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if( slot instanceof SlotFake )
|
||||||
|
{
|
||||||
|
final ItemStack stack = ( (SlotFake) slot ).getStack();
|
||||||
|
if( stack != ItemStack.EMPTY )
|
||||||
|
{
|
||||||
|
InventoryAction direction = wheel > 0 ? InventoryAction.PLACE_SINGLE : InventoryAction.PICKUP_SINGLE;
|
||||||
|
final PacketInventoryAction p = new PacketInventoryAction( direction , slot.slotNumber , 0);
|
||||||
|
NetworkHandler.instance().sendToServer( p );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean enableSpaceClicking()
|
protected boolean enableSpaceClicking()
|
||||||
@@ -961,4 +1142,54 @@ public abstract class AEBaseGui extends GuiContainer
|
|||||||
{
|
{
|
||||||
return this.meSlots;
|
return this.meSlots;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Optional.Method( modid = "mousetweaks" )
|
||||||
|
public boolean MT_isMouseTweaksDisabled()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Optional.Method( modid = "mousetweaks" )
|
||||||
|
public boolean MT_isWheelTweakDisabled()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Optional.Method( modid = "mousetweaks" )
|
||||||
|
public Container MT_getContainer()
|
||||||
|
{
|
||||||
|
return this.inventorySlots;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Optional.Method( modid = "mousetweaks" )
|
||||||
|
public Slot MT_getSlotUnderMouse()
|
||||||
|
{
|
||||||
|
return getSlotUnderMouse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Optional.Method( modid = "mousetweaks" )
|
||||||
|
public boolean MT_isCraftingOutput( Slot slot )
|
||||||
|
{
|
||||||
|
return slot instanceof SlotOutput || slot instanceof AppEngCraftingSlot;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Optional.Method( modid = "mousetweaks" )
|
||||||
|
public boolean MT_isIgnored( Slot slot )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Optional.Method( modid = "mousetweaks" )
|
||||||
|
public boolean MT_disableRMBDraggingFunctionality()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,144 @@
|
|||||||
|
package appeng.client.gui;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
|
import appeng.client.gui.implementations.*;
|
||||||
|
import appeng.container.interfaces.IJEIGhostIngredients;
|
||||||
|
import appeng.container.slot.SlotFake;
|
||||||
|
import appeng.fluids.client.gui.widgets.GuiFluidSlot;
|
||||||
|
import mezz.jei.api.gui.IAdvancedGuiHandler;
|
||||||
|
import mezz.jei.api.gui.IGhostIngredientHandler;
|
||||||
|
import net.minecraft.client.gui.GuiScreen;
|
||||||
|
import org.lwjgl.input.Mouse;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
public class AEGuiHandler implements IAdvancedGuiHandler<AEBaseGui>, IGhostIngredientHandler<AEBaseGui>
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Class<AEBaseGui> getGuiContainerClass()
|
||||||
|
{
|
||||||
|
return AEBaseGui.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public List<Rectangle> getGuiExtraAreas( AEBaseGui guiContainer )
|
||||||
|
{
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Object getIngredientUnderMouse( AEBaseGui guiContainer, int mouseX, int mouseY )
|
||||||
|
{
|
||||||
|
List<IAEItemStack> visual;
|
||||||
|
int guiSlotIdx;
|
||||||
|
Object result = null;
|
||||||
|
if( guiContainer instanceof GuiCraftConfirm )
|
||||||
|
{
|
||||||
|
guiSlotIdx = getSlotidx( guiContainer, mouseX, mouseY, ( (GuiCraftConfirm) guiContainer ).getDisplayedRows() );
|
||||||
|
visual = ( (GuiCraftConfirm) guiContainer ).getVisual();
|
||||||
|
if( guiSlotIdx < visual.size() && guiSlotIdx != -1 )
|
||||||
|
{
|
||||||
|
result = visual.get( guiSlotIdx ).getDefinition();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( guiContainer instanceof GuiCraftingCPU )
|
||||||
|
{
|
||||||
|
guiSlotIdx = getSlotidx( guiContainer, mouseX, mouseY, ( (GuiCraftingCPU) guiContainer ).getDisplayedRows() );
|
||||||
|
visual = ( (GuiCraftingCPU) guiContainer ).getVisual();
|
||||||
|
if( guiSlotIdx < visual.size() && guiSlotIdx != -1 )
|
||||||
|
{
|
||||||
|
result = visual.get( guiSlotIdx ).getDefinition();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( guiContainer instanceof GuiCraftAmount )
|
||||||
|
{
|
||||||
|
if( guiContainer.getSlotUnderMouse() != null )
|
||||||
|
{
|
||||||
|
result = guiContainer.getSlotUnderMouse().getStack();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getSlotidx(AEBaseGui guiContainer, int mouseX, int mouseY, int rows)
|
||||||
|
{
|
||||||
|
int guileft = guiContainer.getGuiLeft();
|
||||||
|
int guitop = guiContainer.getGuiTop();
|
||||||
|
int currentScroll = guiContainer.getScrollBar().getCurrentScroll();
|
||||||
|
final int xo = 9;
|
||||||
|
final int yo = 19;
|
||||||
|
|
||||||
|
int guiSlotx = ( mouseX - guileft - xo ) / 67;
|
||||||
|
if( guiSlotx > 2 || mouseX < guileft + xo ) return -1;
|
||||||
|
int guiSloty = ( mouseY - guitop - yo ) / 23;
|
||||||
|
if( guiSloty > ( rows - 1 ) || mouseY < guitop + yo ) return -1;
|
||||||
|
return ( guiSloty * 3 ) + guiSlotx + ( currentScroll * 3 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <I> List<Target<I>> getTargets( AEBaseGui gui, I ingredient, boolean doStart )
|
||||||
|
{
|
||||||
|
ArrayList<Target<I>> targets = new ArrayList<>();
|
||||||
|
if( gui instanceof IJEIGhostIngredients )
|
||||||
|
{
|
||||||
|
IJEIGhostIngredients g = (IJEIGhostIngredients) gui;
|
||||||
|
List<Target<?>> phantomTargets = g.getPhantomTargets( ingredient );
|
||||||
|
targets.addAll( (List<Target<I>>) (Object) phantomTargets );
|
||||||
|
}
|
||||||
|
if( doStart && GuiScreen.isShiftKeyDown() && Mouse.isButtonDown( 0 ) )
|
||||||
|
{
|
||||||
|
if( gui instanceof GuiUpgradeable || gui instanceof GuiPatternTerm )
|
||||||
|
{
|
||||||
|
IJEIGhostIngredients ghostGui = ( (IJEIGhostIngredients) gui );
|
||||||
|
for( Target<I> target : targets )
|
||||||
|
{
|
||||||
|
if( ghostGui.getFakeSlotTargetMap().get( target ) instanceof SlotFake )
|
||||||
|
{
|
||||||
|
if( ( (SlotFake) ghostGui.getFakeSlotTargetMap().get( target ) ).getStack().isEmpty() )
|
||||||
|
{
|
||||||
|
target.accept( ingredient );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( ghostGui.getFakeSlotTargetMap().get( target ) instanceof GuiFluidSlot )
|
||||||
|
{
|
||||||
|
if( ( (GuiFluidSlot) ghostGui.getFakeSlotTargetMap().get( target ) ).getFluidStack() == null )
|
||||||
|
{
|
||||||
|
target.accept( ingredient );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return targets;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onComplete(){
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldHighlightTargets()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -582,4 +582,14 @@ public class GuiCraftConfirm extends AEBaseGui
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<IAEItemStack> getVisual()
|
||||||
|
{
|
||||||
|
return visual;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDisplayedRows()
|
||||||
|
{
|
||||||
|
return this.rows;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -493,4 +493,14 @@ public class GuiCraftingCPU extends AEBaseGui implements ISortSource
|
|||||||
{
|
{
|
||||||
return ViewItems.ALL;
|
return ViewItems.ALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<IAEItemStack> getVisual()
|
||||||
|
{
|
||||||
|
return visual;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDisplayedRows()
|
||||||
|
{
|
||||||
|
return DISPLAYED_ROWS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,20 +20,18 @@ package appeng.client.gui.implementations;
|
|||||||
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.WeakHashMap;
|
|
||||||
|
|
||||||
|
import appeng.api.config.ActionItems;
|
||||||
|
import appeng.api.config.Settings;
|
||||||
|
import appeng.client.gui.widgets.GuiImgButton;
|
||||||
|
import appeng.core.worlddata.IWorldPlayerMapping;
|
||||||
|
import appeng.util.BlockPosUtils;
|
||||||
import com.google.common.collect.HashMultimap;
|
import com.google.common.collect.HashMultimap;
|
||||||
|
|
||||||
|
import net.minecraft.client.gui.GuiButton;
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
import net.minecraft.entity.player.InventoryPlayer;
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
import net.minecraft.inventory.Slot;
|
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.nbt.NBTTagList;
|
import net.minecraft.nbt.NBTTagList;
|
||||||
@@ -49,6 +47,14 @@ import appeng.container.implementations.ContainerInterfaceTerminal;
|
|||||||
import appeng.core.localization.GuiText;
|
import appeng.core.localization.GuiText;
|
||||||
import appeng.parts.reporting.PartInterfaceTerminal;
|
import appeng.parts.reporting.PartInterfaceTerminal;
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
|
import net.minecraft.nbt.NBTUtil;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.text.TextComponentString;
|
||||||
|
import net.minecraftforge.common.DimensionManager;
|
||||||
|
import org.lwjgl.input.Mouse;
|
||||||
|
|
||||||
|
|
||||||
|
import static appeng.client.render.BlockPosHighlighter.hilightBlock;
|
||||||
|
|
||||||
|
|
||||||
public class GuiInterfaceTerminal extends AEBaseGui
|
public class GuiInterfaceTerminal extends AEBaseGui
|
||||||
@@ -57,26 +63,35 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
private static final int LINES_ON_PAGE = 6;
|
private static final int LINES_ON_PAGE = 6;
|
||||||
|
|
||||||
// TODO: copied from GuiMEMonitorable. It looks not changed, maybe unneeded?
|
// TODO: copied from GuiMEMonitorable. It looks not changed, maybe unneeded?
|
||||||
private final int offsetX = 9;
|
private final int offsetX = 21;
|
||||||
|
|
||||||
private final HashMap<Long, ClientDCInternalInv> byId = new HashMap<>();
|
private final HashMap<Long, ClientDCInternalInv> byId = new HashMap<>();
|
||||||
private final HashMultimap<String, ClientDCInternalInv> byName = HashMultimap.create();
|
private final HashMultimap<String, ClientDCInternalInv> byName = HashMultimap.create();
|
||||||
|
private final HashMap<ClientDCInternalInv,BlockPos> blockPosHashMap = new HashMap<>();
|
||||||
|
private final HashMap<GuiButton,ClientDCInternalInv> guiButtonHashMap = new HashMap<>();
|
||||||
private final ArrayList<String> names = new ArrayList<>();
|
private final ArrayList<String> names = new ArrayList<>();
|
||||||
private final ArrayList<Object> lines = new ArrayList<>();
|
private final ArrayList<Object> lines = new ArrayList<>();
|
||||||
|
private final Set<Object> matchedStacks = new HashSet<>();
|
||||||
|
|
||||||
private final Map<String, Set<Object>> cachedSearches = new WeakHashMap<>();
|
private final Map<String, Set<Object>> cachedSearches = new WeakHashMap<>();
|
||||||
|
|
||||||
private boolean refreshList = false;
|
private boolean refreshList = false;
|
||||||
private MEGuiTextField searchField;
|
private MEGuiTextField searchFieldOutputs;
|
||||||
|
private MEGuiTextField searchFieldInputs;
|
||||||
|
private PartInterfaceTerminal partInterfaceTerminal;
|
||||||
|
private GuiButton guiButtonHide;
|
||||||
|
private GuiButton guiButtonNextAssembler;
|
||||||
|
private HashMap<ClientDCInternalInv,Integer> dimHashMap = new HashMap<>();
|
||||||
|
|
||||||
public GuiInterfaceTerminal( final InventoryPlayer inventoryPlayer, final PartInterfaceTerminal te )
|
public GuiInterfaceTerminal( final InventoryPlayer inventoryPlayer, final PartInterfaceTerminal te )
|
||||||
{
|
{
|
||||||
super( new ContainerInterfaceTerminal( inventoryPlayer, te ) );
|
super( new ContainerInterfaceTerminal( inventoryPlayer, te ) );
|
||||||
|
|
||||||
|
this.partInterfaceTerminal = te;
|
||||||
final GuiScrollbar scrollbar = new GuiScrollbar();
|
final GuiScrollbar scrollbar = new GuiScrollbar();
|
||||||
this.setScrollBar( scrollbar );
|
this.setScrollBar( scrollbar );
|
||||||
this.xSize = 195;
|
this.xSize = 208;
|
||||||
this.ySize = 222;
|
this.ySize = 256;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -84,36 +99,56 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
{
|
{
|
||||||
super.initGui();
|
super.initGui();
|
||||||
|
|
||||||
this.getScrollBar().setLeft( 175 );
|
this.getScrollBar().setLeft( 189 );
|
||||||
this.getScrollBar().setHeight( 106 );
|
this.getScrollBar().setHeight( 106 );
|
||||||
this.getScrollBar().setTop( 18 );
|
this.getScrollBar().setTop( 51 );
|
||||||
|
|
||||||
this.searchField = new MEGuiTextField( this.fontRenderer, this.guiLeft + Math.max( 104, this.offsetX ), this.guiTop + 4, 65, 12 );
|
this.searchFieldInputs = new MEGuiTextField( this.fontRenderer, this.guiLeft + Math.max( 32, this.offsetX ), this.guiTop + 25, 65, 12 );
|
||||||
this.searchField.setEnableBackgroundDrawing( false );
|
this.searchFieldInputs.setEnableBackgroundDrawing( false );
|
||||||
this.searchField.setMaxStringLength( 25 );
|
this.searchFieldInputs.setMaxStringLength( 25 );
|
||||||
this.searchField.setTextColor( 0xFFFFFF );
|
this.searchFieldInputs.setTextColor( 0xFFFFFF );
|
||||||
this.searchField.setVisible( true );
|
this.searchFieldInputs.setVisible( true );
|
||||||
this.searchField.setFocused( true );
|
this.searchFieldInputs.setFocused( false );
|
||||||
|
|
||||||
|
this.searchFieldOutputs = new MEGuiTextField( this.fontRenderer, this.guiLeft + Math.max( 32, this.offsetX ), this.guiTop + 38, 65, 12 );
|
||||||
|
this.searchFieldOutputs.setEnableBackgroundDrawing( false );
|
||||||
|
this.searchFieldOutputs.setMaxStringLength( 25 );
|
||||||
|
this.searchFieldOutputs.setTextColor( 0xFFFFFF );
|
||||||
|
this.searchFieldOutputs.setVisible( true );
|
||||||
|
this.searchFieldOutputs.setFocused( true );
|
||||||
|
|
||||||
|
this.searchFieldInputs.setText( partInterfaceTerminal.in );
|
||||||
|
this.searchFieldOutputs.setText( partInterfaceTerminal.out );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onGuiClosed()
|
||||||
|
{
|
||||||
|
partInterfaceTerminal.saveSearchStrings( this.searchFieldInputs.getText().toLowerCase(), this.searchFieldOutputs.getText().toLowerCase() );
|
||||||
|
super.onGuiClosed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawFG( final int offsetX, final int offsetY, final int mouseX, final int mouseY )
|
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( this.getGuiDisplayName( GuiText.InterfaceTerminal.getLocal() ), 8, 6, 4210752 );
|
||||||
this.fontRenderer.drawString( GuiText.inventory.getLocal(), 8, this.ySize - 96 + 3, 4210752 );
|
this.fontRenderer.drawString( GuiText.inventory.getLocal(), this.offsetX + 2, this.ySize - 96 + 3, 4210752 );
|
||||||
|
|
||||||
final int ex = this.getScrollBar().getCurrentScroll();
|
final int ex = this.getScrollBar().getCurrentScroll();
|
||||||
|
|
||||||
final Iterator<Slot> o = this.inventorySlots.inventorySlots.iterator();
|
this.guiButtonNextAssembler = new GuiImgButton(guiLeft + 123, guiTop + 25,Settings.ACTIONS, ActionItems.FREE_MOLECULAR_SLOT_SHORTCUT);
|
||||||
while( o.hasNext() )
|
this.buttonList.add( guiButtonNextAssembler );
|
||||||
{
|
|
||||||
if( o.next() instanceof SlotDisconnected )
|
|
||||||
{
|
|
||||||
o.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int offset = 17;
|
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.inventorySlots.inventorySlots.removeIf( slot -> slot instanceof SlotDisconnected );
|
||||||
|
|
||||||
|
int offset = 51;
|
||||||
for( int x = 0; x < LINES_ON_PAGE && ex + x < this.lines.size(); x++ )
|
for( int x = 0; x < LINES_ON_PAGE && ex + x < this.lines.size(); x++ )
|
||||||
{
|
{
|
||||||
final Object lineObj = this.lines.get( ex + x );
|
final Object lineObj = this.lines.get( ex + x );
|
||||||
@@ -122,8 +157,15 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
final ClientDCInternalInv inv = (ClientDCInternalInv) lineObj;
|
final ClientDCInternalInv inv = (ClientDCInternalInv) lineObj;
|
||||||
for( int z = 0; z < inv.getInventory().getSlots(); z++ )
|
for( int z = 0; z < inv.getInventory().getSlots(); z++ )
|
||||||
{
|
{
|
||||||
this.inventorySlots.inventorySlots.add( new SlotDisconnected( inv, z, z * 18 + 8, 1 + offset ) );
|
this.inventorySlots.inventorySlots.add( new SlotDisconnected( inv, z, z * 18 + 22, 1 + offset ) );
|
||||||
|
if (this.matchedStacks.contains(inv.getInventory().getStackInSlot(z)))
|
||||||
|
drawRect( z * 18 + 22, 1 + offset, z * 18 + 22 + 16, 1 + offset + 16, 0x2A00FF00 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GuiButton guiButton = new GuiImgButton(guiLeft + 4, guiTop + offset + 1, Settings.ACTIONS, ActionItems.HIGHLIGHT_INTERFACE);
|
||||||
|
guiButtonHashMap.put( guiButton , inv);
|
||||||
|
this.buttonList.add( guiButton );
|
||||||
|
|
||||||
}
|
}
|
||||||
else if( lineObj instanceof String )
|
else if( lineObj instanceof String )
|
||||||
{
|
{
|
||||||
@@ -139,33 +181,88 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
name = name.substring( 0, name.length() - 1 );
|
name = name.substring( 0, name.length() - 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
this.fontRenderer.drawString( name, 10, 6 + offset, 4210752 );
|
this.fontRenderer.drawString( name, this.offsetX + 2, 6 + offset, 4210752 );
|
||||||
}
|
}
|
||||||
offset += 18;
|
offset += 18;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( searchFieldInputs.isMouseIn( mouseX , mouseY ) ) drawTooltip( Mouse.getEventX() * this.width / this.mc.displayWidth - offsetX, mouseY - guiTop, "Inputs OR names" );
|
||||||
|
else if( searchFieldOutputs.isMouseIn( mouseX, mouseY ) ) drawTooltip( Mouse.getEventX() * this.width / this.mc.displayWidth - offsetX, mouseY - guiTop, "Outputs OR names" );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void mouseClicked( final int xCoord, final int yCoord, final int btn ) throws IOException
|
protected void mouseClicked( final int xCoord, final int yCoord, final int btn ) throws IOException
|
||||||
{
|
{
|
||||||
this.searchField.mouseClicked( xCoord, yCoord, btn );
|
this.searchFieldInputs.mouseClicked( xCoord, yCoord, btn );
|
||||||
|
|
||||||
if( btn == 1 && this.searchField.isMouseIn( xCoord, yCoord ) )
|
if( btn == 1 && this.searchFieldInputs.isMouseIn( xCoord, yCoord ) )
|
||||||
{
|
{
|
||||||
this.searchField.setText( "" );
|
this.searchFieldInputs.setText( "" );
|
||||||
|
this.refreshList();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.searchFieldOutputs.mouseClicked( xCoord, yCoord, btn );
|
||||||
|
|
||||||
|
if( btn == 1 && this.searchFieldOutputs.isMouseIn( xCoord, yCoord ) )
|
||||||
|
{
|
||||||
|
this.searchFieldOutputs.setText( "" );
|
||||||
this.refreshList();
|
this.refreshList();
|
||||||
}
|
}
|
||||||
|
|
||||||
super.mouseClicked( xCoord, yCoord, btn );
|
super.mouseClicked( xCoord, yCoord, btn );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void actionPerformed( final GuiButton btn ) throws IOException
|
||||||
|
{
|
||||||
|
if( guiButtonHashMap.containsKey( btn ) )
|
||||||
|
{
|
||||||
|
BlockPos blockPos = blockPosHashMap.get( guiButtonHashMap.get( this.selectedButton ) );
|
||||||
|
BlockPos blockPos2 = mc.player.getPosition();
|
||||||
|
int playerDim = mc.world.provider.getDimension();
|
||||||
|
int interfaceDim = dimHashMap.get( guiButtonHashMap.get( this.selectedButton ) );
|
||||||
|
if( playerDim != interfaceDim )
|
||||||
|
{
|
||||||
|
mc.player.sendStatusMessage( new TextComponentString( "Interface located at dimension: " + interfaceDim + " [" + DimensionManager.getWorld( interfaceDim ).provider.getDimensionType().getName() + "] and cant be highlighted" ), false );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hilightBlock( blockPos, System.currentTimeMillis() + 500 * BlockPosUtils.getDistance( blockPos, blockPos2 ), playerDim );
|
||||||
|
mc.player.sendStatusMessage( new TextComponentString( "The interface is now highlighted at " + "X: " + blockPos.getX() + " Y: " + blockPos.getY() + " Z: " + blockPos.getZ() ), false );
|
||||||
|
}
|
||||||
|
mc.player.closeScreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (btn == guiButtonHide)
|
||||||
|
{
|
||||||
|
partInterfaceTerminal.onlyInterfacesWithFreeSlots = !partInterfaceTerminal.onlyInterfacesWithFreeSlots;
|
||||||
|
this.refreshList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (btn == guiButtonNextAssembler)
|
||||||
|
{
|
||||||
|
// Set Search to "Molecular Assembler" and set "Only Free Interface"
|
||||||
|
boolean currentOnlyInterfacesWithFreeSlots = this.partInterfaceTerminal.onlyInterfacesWithFreeSlots;
|
||||||
|
String currentSearchText = this.searchFieldOutputs.getText();
|
||||||
|
|
||||||
|
this.partInterfaceTerminal.onlyInterfacesWithFreeSlots = true;
|
||||||
|
this.searchFieldOutputs.setText("Molecular Assembler");
|
||||||
|
|
||||||
|
this.refreshList();
|
||||||
|
|
||||||
|
this.partInterfaceTerminal.onlyInterfacesWithFreeSlots = currentOnlyInterfacesWithFreeSlots;
|
||||||
|
this.searchFieldOutputs.setText(currentSearchText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawBG( final int offsetX, final int offsetY, final int mouseX, final int mouseY )
|
public void drawBG( final int offsetX, final int offsetY, final int mouseX, final int mouseY )
|
||||||
{
|
{
|
||||||
this.bindTexture( "guis/interfaceterminal.png" );
|
this.bindTexture( "guis/newinterfaceterminal.png" );
|
||||||
this.drawTexturedModalRect( offsetX, offsetY, 0, 0, this.xSize, this.ySize );
|
this.drawTexturedModalRect( offsetX, offsetY, 0, 0, this.xSize, this.ySize );
|
||||||
|
|
||||||
int offset = 17;
|
int offset = 51;
|
||||||
final int ex = this.getScrollBar().getCurrentScroll();
|
final int ex = this.getScrollBar().getCurrentScroll();
|
||||||
|
|
||||||
for( int x = 0; x < LINES_ON_PAGE && ex + x < this.lines.size(); x++ )
|
for( int x = 0; x < LINES_ON_PAGE && ex + x < this.lines.size(); x++ )
|
||||||
@@ -177,14 +274,19 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
|
|
||||||
GlStateManager.color( 1, 1, 1, 1 );
|
GlStateManager.color( 1, 1, 1, 1 );
|
||||||
final int width = inv.getInventory().getSlots() * 18;
|
final int width = inv.getInventory().getSlots() * 18;
|
||||||
this.drawTexturedModalRect( offsetX + 7, offsetY + offset, 7, 139, width, 18 );
|
this.drawTexturedModalRect( offsetX + 20, offsetY + offset, 20, 173, width, 18 );
|
||||||
}
|
}
|
||||||
offset += 18;
|
offset += 18;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( this.searchField != null )
|
if( this.searchFieldInputs != null )
|
||||||
{
|
{
|
||||||
this.searchField.drawTextBox();
|
this.searchFieldInputs.drawTextBox();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.searchFieldOutputs != null )
|
||||||
|
{
|
||||||
|
this.searchFieldOutputs.drawTextBox();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,15 +295,21 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
{
|
{
|
||||||
if( !this.checkHotbarKeys( key ) )
|
if( !this.checkHotbarKeys( key ) )
|
||||||
{
|
{
|
||||||
if( character == ' ' && this.searchField.getText().isEmpty() )
|
if( character == ' ' && this.searchFieldInputs.getText().isEmpty() && this.searchFieldInputs.isFocused() )
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( this.searchField.textboxKeyTyped( character, key ) )
|
if( character == ' ' && this.searchFieldOutputs.getText().isEmpty() && this.searchFieldOutputs.isFocused())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.searchFieldInputs.textboxKeyTyped( character, key ) || this.searchFieldOutputs.textboxKeyTyped( character, key ))
|
||||||
{
|
{
|
||||||
this.refreshList();
|
this.refreshList();
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
super.keyTyped( character, key );
|
super.keyTyped( character, key );
|
||||||
@@ -227,6 +335,8 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
final long id = Long.parseLong( key.substring( 1 ), Character.MAX_RADIX );
|
final long id = Long.parseLong( key.substring( 1 ), Character.MAX_RADIX );
|
||||||
final NBTTagCompound invData = in.getCompoundTag( key );
|
final NBTTagCompound invData = in.getCompoundTag( key );
|
||||||
final ClientDCInternalInv current = this.getById( id, invData.getLong( "sortBy" ), invData.getString( "un" ) );
|
final ClientDCInternalInv current = this.getById( id, invData.getLong( "sortBy" ), invData.getString( "un" ) );
|
||||||
|
blockPosHashMap.put( current, NBTUtil.getPosFromTag( invData.getCompoundTag( "pos" )) );
|
||||||
|
dimHashMap.put( current, invData.getInteger( "dim" ));
|
||||||
|
|
||||||
for( int x = 0; x < current.getInventory().getSlots(); x++ )
|
for( int x = 0; x < current.getInventory().getSlots(); x++ )
|
||||||
{
|
{
|
||||||
@@ -260,41 +370,68 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
private void refreshList()
|
private void refreshList()
|
||||||
{
|
{
|
||||||
this.byName.clear();
|
this.byName.clear();
|
||||||
|
this.buttonList.clear();
|
||||||
|
this.matchedStacks.clear();
|
||||||
|
|
||||||
final String searchFilterLowerCase = this.searchField.getText().toLowerCase();
|
final String searchFieldInputs = this.searchFieldInputs.getText().toLowerCase();
|
||||||
|
final String searchFieldOutputs = this.searchFieldOutputs.getText().toLowerCase();
|
||||||
|
|
||||||
final Set<Object> cachedSearch = this.getCacheForSearchTerm( searchFilterLowerCase );
|
final Set<Object> cachedSearch = this.getCacheForSearchTerm( "IN:" + searchFieldInputs + " OUT:" + searchFieldOutputs + partInterfaceTerminal.onlyInterfacesWithFreeSlots);
|
||||||
final boolean rebuild = cachedSearch.isEmpty();
|
final boolean rebuild = cachedSearch.isEmpty();
|
||||||
|
|
||||||
for( final ClientDCInternalInv entry : this.byId.values() )
|
for( final ClientDCInternalInv entry : this.byId.values() )
|
||||||
{
|
{
|
||||||
// ignore inventory if not doing a full rebuild or cache already marks it as miss.
|
// ignore inventory if not doing a full rebuild and cache already marks it as miss.
|
||||||
if( !rebuild && !cachedSearch.contains( entry ) )
|
if( !rebuild && !cachedSearch.contains( entry ) )
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shortcut to skip any filter if search term is ""/empty
|
// Shortcut to skip any filter if search term is ""/empty
|
||||||
boolean found = searchFilterLowerCase.isEmpty();
|
|
||||||
|
boolean found = (searchFieldInputs.isEmpty() && searchFieldOutputs.isEmpty() && !partInterfaceTerminal.onlyInterfacesWithFreeSlots);
|
||||||
|
boolean interfaceHasFreeSlots = false;
|
||||||
|
|
||||||
// Search if the current inventory holds a pattern containing the search term.
|
// Search if the current inventory holds a pattern containing the search term.
|
||||||
if( !found && !searchFilterLowerCase.isEmpty() )
|
if( !found )
|
||||||
{
|
{
|
||||||
for( final ItemStack itemStack : entry.getInventory() )
|
for( final ItemStack itemStack : entry.getInventory() )
|
||||||
{
|
{
|
||||||
found = this.itemStackMatchesSearchTerm( itemStack, searchFilterLowerCase );
|
if( !searchFieldInputs.isEmpty() && !searchFieldOutputs.isEmpty() ) {
|
||||||
if( found )
|
if (this.itemStackMatchesSearchTerm(itemStack, searchFieldInputs, 0) || this.itemStackMatchesSearchTerm(itemStack, searchFieldOutputs, 1)) {
|
||||||
{
|
found = true;
|
||||||
break;
|
matchedStacks.add(itemStack);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else if( !searchFieldInputs.isEmpty() ) {
|
||||||
|
if (this.itemStackMatchesSearchTerm(itemStack, searchFieldInputs, 0)) {
|
||||||
|
found = true;
|
||||||
|
matchedStacks.add(itemStack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( !searchFieldOutputs.isEmpty() ) {
|
||||||
|
if (this.itemStackMatchesSearchTerm(itemStack, searchFieldOutputs, 1)) {
|
||||||
|
found = true;
|
||||||
|
matchedStacks.add(itemStack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If only Interfaces with empty slots should be shown, check that here
|
||||||
|
if(itemStack.isEmpty())
|
||||||
|
interfaceHasFreeSlots = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if found, filter skipped or machine name matching the search term, add it
|
// if found, filter skipped or machine name matching the search term, add it
|
||||||
if( found || entry.getName().toLowerCase().contains( searchFilterLowerCase ) )
|
if( found || (entry.getName().toLowerCase().contains( searchFieldInputs ) && entry.getName().toLowerCase().contains( searchFieldOutputs )))
|
||||||
{
|
{
|
||||||
this.byName.put( entry.getName(), entry );
|
if (!partInterfaceTerminal.onlyInterfacesWithFreeSlots)
|
||||||
cachedSearch.add( entry );
|
{
|
||||||
|
this.byName.put( entry.getName(), entry );
|
||||||
|
cachedSearch.add( entry );
|
||||||
|
}
|
||||||
|
else if ( interfaceHasFreeSlots ){
|
||||||
|
this.byName.put( entry.getName(), entry );
|
||||||
|
cachedSearch.add( entry );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -324,7 +461,7 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
this.getScrollBar().setRange( 0, this.lines.size() - LINES_ON_PAGE, 2 );
|
this.getScrollBar().setRange( 0, this.lines.size() - LINES_ON_PAGE, 2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean itemStackMatchesSearchTerm( final ItemStack itemStack, final String searchTerm )
|
private boolean itemStackMatchesSearchTerm( final ItemStack itemStack, final String searchTerm,int pass )
|
||||||
{
|
{
|
||||||
if( itemStack.isEmpty() )
|
if( itemStack.isEmpty() )
|
||||||
{
|
{
|
||||||
@@ -338,14 +475,21 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Potential later use to filter by input
|
NBTTagList tag = new NBTTagList();
|
||||||
// NBTTagList inTag = encodedValue.getTagList( "in", 10 );
|
|
||||||
final NBTTagList outTag = encodedValue.getTagList( "out", 10 );
|
|
||||||
|
|
||||||
for( int i = 0; i < outTag.tagCount(); i++ )
|
if (pass == 0)
|
||||||
|
{
|
||||||
|
tag = encodedValue.getTagList( "in", 10 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tag = encodedValue.getTagList( "out", 10 );
|
||||||
|
}
|
||||||
|
|
||||||
|
for( int i = 0; i < tag.tagCount(); i++ )
|
||||||
{
|
{
|
||||||
|
|
||||||
final ItemStack parsedItemStack = new ItemStack( outTag.getCompoundTagAt( i ) );
|
final ItemStack parsedItemStack = new ItemStack( tag.getCompoundTagAt( i ) );
|
||||||
if( !parsedItemStack.isEmpty() )
|
if( !parsedItemStack.isEmpty() )
|
||||||
{
|
{
|
||||||
final String displayName = Platform
|
final String displayName = Platform
|
||||||
|
|||||||
@@ -19,11 +19,21 @@
|
|||||||
package appeng.client.gui.implementations;
|
package appeng.client.gui.implementations;
|
||||||
|
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import appeng.container.interfaces.IJEIGhostIngredients;
|
||||||
|
import appeng.container.slot.SlotFake;
|
||||||
|
import appeng.core.sync.packets.PacketInventoryAction;
|
||||||
|
import appeng.helpers.InventoryAction;
|
||||||
|
import appeng.util.item.AEItemStack;
|
||||||
|
import mezz.jei.api.gui.IGhostIngredientHandler.Target;
|
||||||
import net.minecraft.client.gui.GuiButton;
|
import net.minecraft.client.gui.GuiButton;
|
||||||
import net.minecraft.entity.player.InventoryPlayer;
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
|
import net.minecraft.inventory.Slot;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
import appeng.api.config.ActionItems;
|
import appeng.api.config.ActionItems;
|
||||||
@@ -40,7 +50,7 @@ import appeng.core.sync.network.NetworkHandler;
|
|||||||
import appeng.core.sync.packets.PacketValueConfig;
|
import appeng.core.sync.packets.PacketValueConfig;
|
||||||
|
|
||||||
|
|
||||||
public class GuiPatternTerm extends GuiMEMonitorable
|
public class GuiPatternTerm extends GuiMEMonitorable implements IJEIGhostIngredients
|
||||||
{
|
{
|
||||||
|
|
||||||
private static final String BACKGROUND_CRAFTING_MODE = "guis/pattern.png";
|
private static final String BACKGROUND_CRAFTING_MODE = "guis/pattern.png";
|
||||||
@@ -60,6 +70,14 @@ public class GuiPatternTerm extends GuiMEMonitorable
|
|||||||
private GuiImgButton substitutionsDisabledBtn;
|
private GuiImgButton substitutionsDisabledBtn;
|
||||||
private GuiImgButton encodeBtn;
|
private GuiImgButton encodeBtn;
|
||||||
private GuiImgButton clearBtn;
|
private GuiImgButton clearBtn;
|
||||||
|
private GuiImgButton x2Btn;
|
||||||
|
private GuiImgButton x3Btn;
|
||||||
|
private GuiImgButton plusOneBtn;
|
||||||
|
private GuiImgButton divTwoBtn;
|
||||||
|
private GuiImgButton divThreeBtn;
|
||||||
|
private GuiImgButton minusOneBtn;
|
||||||
|
private GuiImgButton maxCountBtn;
|
||||||
|
public Map<Target<?>,Object> mapTargetSlot = new HashMap<>();
|
||||||
|
|
||||||
public GuiPatternTerm( final InventoryPlayer inventoryPlayer, final ITerminalHost te )
|
public GuiPatternTerm( final InventoryPlayer inventoryPlayer, final ITerminalHost te )
|
||||||
{
|
{
|
||||||
@@ -85,7 +103,13 @@ public class GuiPatternTerm extends GuiMEMonitorable
|
|||||||
|
|
||||||
if( this.encodeBtn == btn )
|
if( this.encodeBtn == btn )
|
||||||
{
|
{
|
||||||
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.Encode", "1" ) );
|
if ( isShiftKeyDown() ){
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.Encode", "2" ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.Encode", "1" ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( this.clearBtn == btn )
|
if( this.clearBtn == btn )
|
||||||
@@ -93,6 +117,41 @@ public class GuiPatternTerm extends GuiMEMonitorable
|
|||||||
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.Clear", "1" ) );
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.Clear", "1" ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( this.x2Btn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.MultiplyByTwo", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.x3Btn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.MultiplyByThree", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.divTwoBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.DivideByTwo", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.divThreeBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.DivideByThree", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.plusOneBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.IncreaseByOne", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.minusOneBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.DecreaseByOne", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.maxCountBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.MaximizeCount", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
if( this.substitutionsEnabledBtn == btn || this.substitutionsDisabledBtn == btn )
|
if( this.substitutionsEnabledBtn == btn || this.substitutionsDisabledBtn == btn )
|
||||||
{
|
{
|
||||||
NetworkHandler.instance()
|
NetworkHandler.instance()
|
||||||
@@ -131,6 +190,34 @@ public class GuiPatternTerm extends GuiMEMonitorable
|
|||||||
this.clearBtn.setHalfSize( true );
|
this.clearBtn.setHalfSize( true );
|
||||||
this.buttonList.add( this.clearBtn );
|
this.buttonList.add( this.clearBtn );
|
||||||
|
|
||||||
|
this.x3Btn = new GuiImgButton( this.guiLeft + 128, this.guiTop + this.ySize - 158, Settings.ACTIONS, ActionItems.MULTIPLY_BY_THREE );
|
||||||
|
this.x3Btn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.x3Btn );
|
||||||
|
|
||||||
|
this.x2Btn = new GuiImgButton( this.guiLeft + 128, this.guiTop + this.ySize - 148, Settings.ACTIONS, ActionItems.MULTIPLY_BY_TWO );
|
||||||
|
this.x2Btn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.x2Btn );
|
||||||
|
|
||||||
|
this.plusOneBtn = new GuiImgButton( this.guiLeft + 128, this.guiTop + this.ySize - 138, Settings.ACTIONS, ActionItems.INCREASE_BY_ONE );
|
||||||
|
this.plusOneBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.plusOneBtn );
|
||||||
|
|
||||||
|
this.divThreeBtn = new GuiImgButton( this.guiLeft + 100, this.guiTop + this.ySize - 158, Settings.ACTIONS, ActionItems.DIVIDE_BY_THREE );
|
||||||
|
this.divThreeBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.divThreeBtn );
|
||||||
|
|
||||||
|
this.divTwoBtn = new GuiImgButton( this.guiLeft + 100, this.guiTop + this.ySize - 148, Settings.ACTIONS, ActionItems.DIVIDE_BY_TWO );
|
||||||
|
this.divTwoBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.divTwoBtn );
|
||||||
|
|
||||||
|
this.minusOneBtn = new GuiImgButton( this.guiLeft + 100, this.guiTop + this.ySize - 138, Settings.ACTIONS, ActionItems.DECREASE_BY_ONE );
|
||||||
|
this.minusOneBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.minusOneBtn );
|
||||||
|
|
||||||
|
//this.maxCountBtn = new GuiImgButton( this.guiLeft + 128, this.guiTop + this.ySize - 108, Settings.ACTIONS, ActionItems.MAX_COUNT );
|
||||||
|
//this.maxCountBtn.setHalfSize( true );
|
||||||
|
//this.buttonList.add( this.maxCountBtn );
|
||||||
|
|
||||||
this.encodeBtn = new GuiImgButton( this.guiLeft + 147, this.guiTop + this.ySize - 142, Settings.ACTIONS, ActionItems.ENCODE );
|
this.encodeBtn = new GuiImgButton( this.guiLeft + 147, this.guiTop + this.ySize - 142, Settings.ACTIONS, ActionItems.ENCODE );
|
||||||
this.buttonList.add( this.encodeBtn );
|
this.buttonList.add( this.encodeBtn );
|
||||||
}
|
}
|
||||||
@@ -142,6 +229,13 @@ public class GuiPatternTerm extends GuiMEMonitorable
|
|||||||
{
|
{
|
||||||
this.tabCraftButton.visible = true;
|
this.tabCraftButton.visible = true;
|
||||||
this.tabProcessButton.visible = false;
|
this.tabProcessButton.visible = false;
|
||||||
|
this.x2Btn.visible = false;
|
||||||
|
this.x3Btn.visible = false;
|
||||||
|
this.divTwoBtn.visible = false;
|
||||||
|
this.divThreeBtn.visible = false;
|
||||||
|
this.plusOneBtn.visible = false;
|
||||||
|
this.minusOneBtn.visible = false;
|
||||||
|
//this.maxCountBtn.visible = false;
|
||||||
|
|
||||||
if( this.container.substitute )
|
if( this.container.substitute )
|
||||||
{
|
{
|
||||||
@@ -160,6 +254,13 @@ public class GuiPatternTerm extends GuiMEMonitorable
|
|||||||
this.tabProcessButton.visible = true;
|
this.tabProcessButton.visible = true;
|
||||||
this.substitutionsEnabledBtn.visible = false;
|
this.substitutionsEnabledBtn.visible = false;
|
||||||
this.substitutionsDisabledBtn.visible = false;
|
this.substitutionsDisabledBtn.visible = false;
|
||||||
|
this.x2Btn.visible = true;
|
||||||
|
this.x3Btn.visible = true;
|
||||||
|
this.divTwoBtn.visible = true;
|
||||||
|
this.divThreeBtn.visible = true;
|
||||||
|
this.plusOneBtn.visible = true;
|
||||||
|
this.minusOneBtn.visible = true;
|
||||||
|
//this.maxCountBtn.visible = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
super.drawFG( offsetX, offsetY, mouseX, mouseY );
|
super.drawFG( offsetX, offsetY, mouseX, mouseY );
|
||||||
@@ -184,4 +285,52 @@ public class GuiPatternTerm extends GuiMEMonitorable
|
|||||||
|
|
||||||
s.yPos = s.getY() + this.ySize - 78 - offsetPlayerSide;
|
s.yPos = s.getY() + this.ySize - 78 - offsetPlayerSide;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Target<?>> getPhantomTargets(Object ingredient) {
|
||||||
|
if (!(ingredient instanceof ItemStack )) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
List<Target<?>> targets = new ArrayList<>();
|
||||||
|
for( Slot slot : this.inventorySlots.inventorySlots )
|
||||||
|
{
|
||||||
|
if( slot instanceof SlotFake )
|
||||||
|
{
|
||||||
|
ItemStack itemStack = (ItemStack) ingredient;
|
||||||
|
Target<Object> target = new Target<Object>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Rectangle getArea()
|
||||||
|
{
|
||||||
|
return new Rectangle( getGuiLeft() + slot.xPos, getGuiTop() + slot.yPos, 16, 16 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void accept( Object ingredient )
|
||||||
|
{
|
||||||
|
final PacketInventoryAction p;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
p = new PacketInventoryAction( InventoryAction.PLACE_JEI_GHOST_ITEM, (SlotFake) slot, AEItemStack.fromItemStack( itemStack ) );
|
||||||
|
NetworkHandler.instance().sendToServer( p );
|
||||||
|
|
||||||
|
}
|
||||||
|
catch( IOException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
targets.add( target );
|
||||||
|
mapTargetSlot.putIfAbsent( target, slot );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return targets;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<Target<?>, Object> getFakeSlotTargetMap()
|
||||||
|
{
|
||||||
|
return mapTargetSlot;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,8 +19,24 @@
|
|||||||
package appeng.client.gui.implementations;
|
package appeng.client.gui.implementations;
|
||||||
|
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import appeng.client.gui.widgets.GuiCustomSlot;
|
||||||
|
import appeng.container.interfaces.IJEIGhostIngredients;
|
||||||
|
import appeng.container.slot.IJEITargetSlot;
|
||||||
|
import appeng.container.slot.SlotFake;
|
||||||
|
import appeng.core.sync.packets.PacketInventoryAction;
|
||||||
|
import appeng.fluids.client.gui.widgets.GuiFluidSlot;
|
||||||
|
import appeng.fluids.util.AEFluidStack;
|
||||||
|
import appeng.helpers.InventoryAction;
|
||||||
|
import appeng.util.item.AEItemStack;
|
||||||
|
import mezz.jei.api.gui.IGhostIngredientHandler.Target;
|
||||||
|
import net.minecraft.inventory.Slot;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraftforge.fluids.*;
|
||||||
import org.lwjgl.input.Mouse;
|
import org.lwjgl.input.Mouse;
|
||||||
|
|
||||||
import net.minecraft.client.gui.GuiButton;
|
import net.minecraft.client.gui.GuiButton;
|
||||||
@@ -43,9 +59,9 @@ import appeng.parts.automation.PartExportBus;
|
|||||||
import appeng.parts.automation.PartImportBus;
|
import appeng.parts.automation.PartImportBus;
|
||||||
|
|
||||||
|
|
||||||
public class GuiUpgradeable extends AEBaseGui
|
public class GuiUpgradeable extends AEBaseGui implements IJEIGhostIngredients
|
||||||
{
|
{
|
||||||
|
private final Map<Target<?>,Object> mapTargetSlot = new HashMap<>();
|
||||||
protected final ContainerUpgradeable cvb;
|
protected final ContainerUpgradeable cvb;
|
||||||
protected final IUpgradeableHost bc;
|
protected final IUpgradeableHost bc;
|
||||||
|
|
||||||
@@ -200,4 +216,108 @@ public class GuiUpgradeable extends AEBaseGui
|
|||||||
NetworkHandler.instance().sendToServer( new PacketConfigButton( this.schedulingMode.getSetting(), backwards ) );
|
NetworkHandler.instance().sendToServer( new PacketConfigButton( this.schedulingMode.getSetting(), backwards ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Target<?>> getPhantomTargets(Object ingredient)
|
||||||
|
{
|
||||||
|
mapTargetSlot.clear();
|
||||||
|
|
||||||
|
FluidStack fluidStack = null;
|
||||||
|
ItemStack itemStack = ItemStack.EMPTY;
|
||||||
|
|
||||||
|
if( ingredient instanceof ItemStack )
|
||||||
|
{
|
||||||
|
itemStack = (ItemStack) ingredient;
|
||||||
|
fluidStack = FluidUtil.getFluidContained( itemStack );
|
||||||
|
}
|
||||||
|
else if( ingredient instanceof FluidStack )
|
||||||
|
{
|
||||||
|
fluidStack = (FluidStack) ingredient;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !( ingredient instanceof ItemStack ) && !( ingredient instanceof FluidStack ) )
|
||||||
|
return Collections.emptyList();
|
||||||
|
|
||||||
|
List<Target<?>> targets = new ArrayList<>();
|
||||||
|
|
||||||
|
List<IJEITargetSlot> slots = new ArrayList<>();
|
||||||
|
if( this.inventorySlots.inventorySlots.size() > 0 )
|
||||||
|
{
|
||||||
|
for( Slot slot : this.inventorySlots.inventorySlots )
|
||||||
|
{
|
||||||
|
if( slot instanceof SlotFake && ( !itemStack.isEmpty() || this instanceof GuiCellWorkbench && fluidStack != null ) )
|
||||||
|
{
|
||||||
|
slots.add( (IJEITargetSlot) slot );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( this.getGuiSlots().size() > 0 )
|
||||||
|
{
|
||||||
|
for( GuiCustomSlot slot : this.getGuiSlots() )
|
||||||
|
{
|
||||||
|
if( slot instanceof GuiFluidSlot && fluidStack != null )
|
||||||
|
{
|
||||||
|
slots.add( (IJEITargetSlot) slot );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( Object slot : slots )
|
||||||
|
{
|
||||||
|
ItemStack finalItemStack = itemStack;
|
||||||
|
FluidStack finalFluidStack = fluidStack;
|
||||||
|
Target<Object> targetItem = new Target<Object>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Rectangle getArea()
|
||||||
|
{
|
||||||
|
if( slot instanceof SlotFake )
|
||||||
|
return new Rectangle( getGuiLeft() + ( (SlotFake) slot ).xPos, getGuiTop() + ( (SlotFake) slot ).yPos, 16, 16 );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return new Rectangle( getGuiLeft() + ( (GuiFluidSlot) slot ).xPos(), getGuiTop() + ( (GuiFluidSlot) slot ).yPos(), 16, 16 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void accept( Object ingredient )
|
||||||
|
{
|
||||||
|
PacketInventoryAction p = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if( slot instanceof SlotFake )
|
||||||
|
{
|
||||||
|
if( finalItemStack.isEmpty() && finalFluidStack != null )
|
||||||
|
{
|
||||||
|
p = new PacketInventoryAction( InventoryAction.PLACE_JEI_GHOST_ITEM, (IJEITargetSlot) slot, AEItemStack.fromItemStack( FluidUtil.getFilledBucket( finalFluidStack ) ) );
|
||||||
|
}
|
||||||
|
else if( !finalItemStack.isEmpty() )
|
||||||
|
{
|
||||||
|
p = new PacketInventoryAction( InventoryAction.PLACE_JEI_GHOST_ITEM, (IJEITargetSlot) slot, AEItemStack.fromItemStack( finalItemStack ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( finalFluidStack == null ) return;
|
||||||
|
p = new PacketInventoryAction( InventoryAction.PLACE_JEI_GHOST_ITEM, (IJEITargetSlot) slot, AEItemStack.fromItemStack( AEFluidStack.fromFluidStack( finalFluidStack ).asItemStackRepresentation() ) );
|
||||||
|
}
|
||||||
|
NetworkHandler.instance().sendToServer( p );
|
||||||
|
|
||||||
|
}
|
||||||
|
catch( IOException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
targets.add( targetItem );
|
||||||
|
mapTargetSlot.putIfAbsent( targetItem, slot );
|
||||||
|
}
|
||||||
|
return targets;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<Target<?>, Object> getFakeSlotTargetMap()
|
||||||
|
{
|
||||||
|
return mapTargetSlot;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,6 +134,19 @@ public class GuiImgButton extends GuiButton implements ITooltip
|
|||||||
this.registerApp( 6, Settings.ACTIONS, ActionItems.CLOSE, ButtonToolTips.Clear, ButtonToolTips.ClearSettings );
|
this.registerApp( 6, Settings.ACTIONS, ActionItems.CLOSE, ButtonToolTips.Clear, ButtonToolTips.ClearSettings );
|
||||||
this.registerApp( 6, Settings.ACTIONS, ActionItems.STASH, ButtonToolTips.Stash, ButtonToolTips.StashDesc );
|
this.registerApp( 6, Settings.ACTIONS, ActionItems.STASH, ButtonToolTips.Stash, ButtonToolTips.StashDesc );
|
||||||
|
|
||||||
|
this.registerApp( 6 + 4 * 16, Settings.ACTIONS, ActionItems.MULTIPLY_BY_TWO, ButtonToolTips.MultiplyByTwo, ButtonToolTips.MultiplyByTwoDesc );
|
||||||
|
this.registerApp( 7 + 4 * 16, Settings.ACTIONS, ActionItems.MULTIPLY_BY_THREE, ButtonToolTips.MultiplyByThree, ButtonToolTips.MultiplyByThreeDesc );
|
||||||
|
this.registerApp( 8 + 4 * 16, Settings.ACTIONS, ActionItems.INCREASE_BY_ONE, ButtonToolTips.IncreaseByOne, ButtonToolTips.IncreaseByOneDesc );
|
||||||
|
this.registerApp( 9 + 4 * 16, Settings.ACTIONS, ActionItems.DIVIDE_BY_TWO, ButtonToolTips.DivideByTwo, ButtonToolTips.DivideByTwoDesc );
|
||||||
|
this.registerApp( 10 + 4 * 16, Settings.ACTIONS, ActionItems.DIVIDE_BY_THREE, ButtonToolTips.DivideByThree, ButtonToolTips.DivideByThreeDesc );
|
||||||
|
this.registerApp( 11 + 4 * 16, Settings.ACTIONS, ActionItems.DECREASE_BY_ONE, ButtonToolTips.DecreaseByOne, ButtonToolTips.DecreaseByOneDesc );
|
||||||
|
this.registerApp( 12 + 4 * 16, Settings.ACTIONS, ActionItems.MAX_COUNT, ButtonToolTips.MaxCount, ButtonToolTips.MaxCountDesc );
|
||||||
|
|
||||||
|
this.registerApp( 6 + 5 * 16, Settings.ACTIONS, ActionItems.FREE_MOLECULAR_SLOT_SHORTCUT, ButtonToolTips.FreeMolecularSlotShortcut, ButtonToolTips.FreeMolecularSlotShortcutDesc );
|
||||||
|
this.registerApp( 7 + 5 * 16, Settings.ACTIONS, ActionItems.TOGGLE_SHOW_FULL_INTERFACES_ON, ButtonToolTips.ToggleShowFullInterfaces, ButtonToolTips.ToggleShowFullInterfacesOnDesc );
|
||||||
|
this.registerApp( 8 + 5 * 16, Settings.ACTIONS, ActionItems.TOGGLE_SHOW_FULL_INTERFACES_OFF, ButtonToolTips.ToggleShowFullInterfaces, ButtonToolTips.ToggleShowFullInterfacesOffDesc );
|
||||||
|
this.registerApp( 6 + 6 * 16, Settings.ACTIONS, ActionItems.HIGHLIGHT_INTERFACE, ButtonToolTips.HighlightInterface, "" );
|
||||||
|
|
||||||
this.registerApp( 8, Settings.ACTIONS, ActionItems.ENCODE, ButtonToolTips.Encode, ButtonToolTips.EncodeDescription );
|
this.registerApp( 8, Settings.ACTIONS, ActionItems.ENCODE, ButtonToolTips.Encode, ButtonToolTips.EncodeDescription );
|
||||||
this.registerApp( 4 + 3 * 16, Settings.ACTIONS, ItemSubstitution.ENABLED, ButtonToolTips.Substitutions, ButtonToolTips.SubstitutionsDescEnabled );
|
this.registerApp( 4 + 3 * 16, Settings.ACTIONS, ItemSubstitution.ENABLED, ButtonToolTips.Substitutions, ButtonToolTips.SubstitutionsDescEnabled );
|
||||||
this.registerApp( 7 + 3 * 16, Settings.ACTIONS, ItemSubstitution.DISABLED, ButtonToolTips.Substitutions, ButtonToolTips.SubstitutionsDescDisabled );
|
this.registerApp( 7 + 3 * 16, Settings.ACTIONS, ItemSubstitution.DISABLED, ButtonToolTips.Substitutions, ButtonToolTips.SubstitutionsDescDisabled );
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ public class ClientDCInternalInv implements Comparable<ClientDCInternalInv>
|
|||||||
|
|
||||||
public ClientDCInternalInv( final int size, final long id, final long sortBy, final String unlocalizedName )
|
public ClientDCInternalInv( final int size, final long id, final long sortBy, final String unlocalizedName )
|
||||||
{
|
{
|
||||||
this.inventory = new AppEngInternalInventory( null, size );
|
this.inventory = new AppEngInternalInventory( null, size, 1 );
|
||||||
this.unlocalizedName = unlocalizedName;
|
this.unlocalizedName = unlocalizedName;
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.sortBy = sortBy;
|
this.sortBy = sortBy;
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package appeng.client.render;
|
||||||
|
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
|
||||||
|
// taken from McJty's McJtyLib
|
||||||
|
public class BlockPosHighlighter
|
||||||
|
{
|
||||||
|
private static BlockPos hilightedBlock;
|
||||||
|
private static long expireHilight;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private static int dimension;
|
||||||
|
|
||||||
|
public static void hilightBlock( BlockPos c, long expireHilight, int dimension ) {
|
||||||
|
hilightedBlock = c;
|
||||||
|
BlockPosHighlighter.expireHilight = expireHilight;
|
||||||
|
BlockPosHighlighter.dimension = dimension;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BlockPos getHilightedBlock() {
|
||||||
|
return hilightedBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long getExpireHilight() {
|
||||||
|
return expireHilight;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getDimension()
|
||||||
|
{
|
||||||
|
return dimension;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -19,6 +19,7 @@
|
|||||||
package appeng.client.render;
|
package appeng.client.render;
|
||||||
|
|
||||||
|
|
||||||
|
import appeng.api.storage.data.IAEFluidStack;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.gui.FontRenderer;
|
import net.minecraft.client.gui.FontRenderer;
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
@@ -30,6 +31,7 @@ import net.minecraft.util.EnumFacing;
|
|||||||
import appeng.api.storage.data.IAEItemStack;
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
import appeng.util.IWideReadableNumberConverter;
|
import appeng.util.IWideReadableNumberConverter;
|
||||||
import appeng.util.ReadableNumberConverter;
|
import appeng.util.ReadableNumberConverter;
|
||||||
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -143,4 +145,23 @@ public class TesrRenderHelper
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void renderFluid2dWithAmount( IAEFluidStack fluidStack, float scale, float spacing )
|
||||||
|
{
|
||||||
|
final ItemStack renderStack = fluidStack.asItemStackRepresentation();
|
||||||
|
|
||||||
|
TesrRenderHelper.renderItem2d( renderStack, scale );
|
||||||
|
|
||||||
|
final long stackSize = fluidStack.getStackSize() / 1000;
|
||||||
|
final String renderedStackSize = NUMBER_CONVERTER.toWideReadableForm( stackSize ) + "B";
|
||||||
|
|
||||||
|
// Render the item count
|
||||||
|
final FontRenderer fr = Minecraft.getMinecraft().fontRenderer;
|
||||||
|
final int width = fr.getStringWidth( renderedStackSize );
|
||||||
|
GlStateManager.translate( 0.0f, spacing, 0 );
|
||||||
|
GlStateManager.scale( 1.0f / 62.0f, 1.0f / 62.0f, 1.0f / 62.0f );
|
||||||
|
GlStateManager.translate( -0.5f * width, 0.0f, 0.5f );
|
||||||
|
fr.drawString( renderedStackSize, 0, 0, 0 );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -699,8 +699,23 @@ public abstract class AEBaseContainer extends Container
|
|||||||
is.setCount( 1 );
|
is.setCount( 1 );
|
||||||
s.putStack( is );
|
s.putStack( is );
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
final ItemStack is = s.getStack().copy();
|
||||||
|
if (is.getCount() < is.getMaxStackSize())
|
||||||
|
is.grow( 1 );
|
||||||
|
s.putStack( is );
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
case PICKUP_SINGLE:
|
||||||
|
if( hand.isEmpty() )
|
||||||
|
{
|
||||||
|
final ItemStack is = s.getStack().copy();
|
||||||
|
if (is.getCount() > 1)
|
||||||
|
is.shrink( 1 );
|
||||||
|
s.putStack( is );
|
||||||
|
}
|
||||||
|
break;
|
||||||
case SPLIT_OR_PLACE_SINGLE:
|
case SPLIT_OR_PLACE_SINGLE:
|
||||||
|
|
||||||
ItemStack is = s.getStack();
|
ItemStack is = s.getStack();
|
||||||
|
|||||||
@@ -51,6 +51,12 @@ public class ContainerCraftAmount extends AEBaseContainer
|
|||||||
this.addSlotToContainer( this.getCraftingItem() );
|
this.addSlotToContainer( this.getCraftingItem() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Slot getSlot( int slotId )
|
||||||
|
{
|
||||||
|
return super.getSlot( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void detectAndSendChanges()
|
public void detectAndSendChanges()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ public class ContainerInterface extends ContainerUpgradeable
|
|||||||
for( int x = 0; x < DualityInterface.NUMBER_OF_PATTERN_SLOTS; x++ )
|
for( int x = 0; x < DualityInterface.NUMBER_OF_PATTERN_SLOTS; x++ )
|
||||||
{
|
{
|
||||||
this.addSlotToContainer( new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.ENCODED_PATTERN, this.myDuality
|
this.addSlotToContainer( new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.ENCODED_PATTERN, this.myDuality
|
||||||
.getPatterns(), x, 8 + 18 * x, 90 + 7, this.getInventoryPlayer() ) );
|
.getPatterns(), x, 8 + 18 * x, 90 + 7, this.getInventoryPlayer() ).setStackLimit( 1 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
for( int x = 0; x < DualityInterface.NUMBER_OF_CONFIG_SLOTS; x++ )
|
for( int x = 0; x < DualityInterface.NUMBER_OF_CONFIG_SLOTS; x++ )
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ import net.minecraft.entity.player.EntityPlayerMP;
|
|||||||
import net.minecraft.entity.player.InventoryPlayer;
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTUtil;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
import appeng.api.config.Settings;
|
import appeng.api.config.Settings;
|
||||||
@@ -78,7 +80,7 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer
|
|||||||
this.grid = anchor.getActionableNode().getGrid();
|
this.grid = anchor.getActionableNode().getGrid();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.bindPlayerInventory( ip, 0, 222 - /* height of player inventory */82 );
|
this.bindPlayerInventory( ip, 14, 256 - /* height of player inventory */82 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -213,35 +215,48 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer
|
|||||||
final IItemHandler theSlot = new WrapperFilteredItemHandler( new WrapperRangeItemHandler( inv.server, slot, slot + 1 ), new PatternSlotFilter() );
|
final IItemHandler theSlot = new WrapperFilteredItemHandler( new WrapperRangeItemHandler( inv.server, slot, slot + 1 ), new PatternSlotFilter() );
|
||||||
final InventoryAdaptor interfaceSlot = new AdaptorItemHandler( theSlot );
|
final InventoryAdaptor interfaceSlot = new AdaptorItemHandler( theSlot );
|
||||||
|
|
||||||
switch( action )
|
IItemHandler interfaceHandler = inv.server;
|
||||||
|
boolean canInsert = true;
|
||||||
|
|
||||||
|
switch ( action )
|
||||||
{
|
{
|
||||||
case PICKUP_OR_SET_DOWN:
|
case PICKUP_OR_SET_DOWN:
|
||||||
|
|
||||||
if( hasItemInHand )
|
if( hasItemInHand )
|
||||||
{
|
{
|
||||||
ItemStack inSlot = theSlot.getStackInSlot( 0 );
|
for( int s = 0; s < interfaceHandler.getSlots(); s++ )
|
||||||
if( inSlot.isEmpty() )
|
|
||||||
{
|
{
|
||||||
player.inventory.setItemStack( interfaceSlot.addItems( player.inventory.getItemStack() ) );
|
if( Platform.itemComparisons().isSameItem( interfaceHandler.getStackInSlot( s ), player.inventory.getItemStack() ) )
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
inSlot = inSlot.copy();
|
|
||||||
final ItemStack inHand = player.inventory.getItemStack().copy();
|
|
||||||
|
|
||||||
ItemHandlerUtil.setStackInSlot( theSlot, 0, ItemStack.EMPTY );
|
|
||||||
player.inventory.setItemStack( ItemStack.EMPTY );
|
|
||||||
|
|
||||||
player.inventory.setItemStack( interfaceSlot.addItems( inHand.copy() ) );
|
|
||||||
|
|
||||||
if( player.inventory.getItemStack().isEmpty() )
|
|
||||||
{
|
{
|
||||||
player.inventory.setItemStack( inSlot );
|
canInsert = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( canInsert )
|
||||||
|
{
|
||||||
|
ItemStack inSlot = theSlot.getStackInSlot( 0 );
|
||||||
|
if( inSlot.isEmpty() )
|
||||||
|
{
|
||||||
|
player.inventory.setItemStack( interfaceSlot.addItems( player.inventory.getItemStack() ) );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
player.inventory.setItemStack( inHand );
|
inSlot = inSlot.copy();
|
||||||
ItemHandlerUtil.setStackInSlot( theSlot, 0, inSlot );
|
final ItemStack inHand = player.inventory.getItemStack().copy();
|
||||||
|
|
||||||
|
ItemHandlerUtil.setStackInSlot( theSlot, 0, ItemStack.EMPTY );
|
||||||
|
player.inventory.setItemStack( ItemStack.EMPTY );
|
||||||
|
|
||||||
|
player.inventory.setItemStack( interfaceSlot.addItems( inHand.copy() ) );
|
||||||
|
|
||||||
|
if( player.inventory.getItemStack().isEmpty() )
|
||||||
|
{
|
||||||
|
player.inventory.setItemStack( inSlot );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player.inventory.setItemStack( inHand );
|
||||||
|
ItemHandlerUtil.setStackInSlot( theSlot, 0, inSlot );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -252,17 +267,27 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case SPLIT_OR_PLACE_SINGLE:
|
case SPLIT_OR_PLACE_SINGLE:
|
||||||
|
|
||||||
if( hasItemInHand )
|
if( hasItemInHand )
|
||||||
{
|
{
|
||||||
ItemStack extra = playerHand.removeItems( 1, ItemStack.EMPTY, null );
|
for( int s = 0; s < interfaceHandler.getSlots(); s++ )
|
||||||
if( !extra.isEmpty() )
|
|
||||||
{
|
{
|
||||||
extra = interfaceSlot.addItems( extra );
|
if( Platform.itemComparisons().isSameItem( interfaceHandler.getStackInSlot( s ), player.inventory.getItemStack() ) )
|
||||||
|
{
|
||||||
|
canInsert = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if( !extra.isEmpty() )
|
if( canInsert )
|
||||||
{
|
{
|
||||||
playerHand.addItems( extra );
|
ItemStack extra = playerHand.removeItems( 1, ItemStack.EMPTY, null );
|
||||||
|
if( !extra.isEmpty() && !interfaceSlot.containsItems() )
|
||||||
|
{
|
||||||
|
extra = interfaceSlot.addItems( extra );
|
||||||
|
}
|
||||||
|
if( !extra.isEmpty() )
|
||||||
|
{
|
||||||
|
playerHand.addItems( extra );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( !is.isEmpty() )
|
else if( !is.isEmpty() )
|
||||||
@@ -378,6 +403,8 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer
|
|||||||
{
|
{
|
||||||
tag.setLong( "sortBy", inv.sortBy );
|
tag.setLong( "sortBy", inv.sortBy );
|
||||||
tag.setString( "un", inv.unlocalizedName );
|
tag.setString( "un", inv.unlocalizedName );
|
||||||
|
tag.setTag( "pos", NBTUtil.createPosTag( inv.pos ) );
|
||||||
|
tag.setInteger( "dim", inv.dim );
|
||||||
}
|
}
|
||||||
|
|
||||||
for( int x = 0; x < length; x++ )
|
for( int x = 0; x < length; x++ )
|
||||||
@@ -408,6 +435,8 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer
|
|||||||
private final String unlocalizedName;
|
private final String unlocalizedName;
|
||||||
private final IItemHandler client;
|
private final IItemHandler client;
|
||||||
private final IItemHandler server;
|
private final IItemHandler server;
|
||||||
|
private final BlockPos pos;
|
||||||
|
private final int dim;
|
||||||
|
|
||||||
public InvTracker( final DualityInterface dual, final IItemHandler patterns, final String unlocalizedName )
|
public InvTracker( final DualityInterface dual, final IItemHandler patterns, final String unlocalizedName )
|
||||||
{
|
{
|
||||||
@@ -415,6 +444,8 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer
|
|||||||
this.client = new AppEngInternalInventory( null, this.server.getSlots() );
|
this.client = new AppEngInternalInventory( null, this.server.getSlots() );
|
||||||
this.unlocalizedName = unlocalizedName;
|
this.unlocalizedName = unlocalizedName;
|
||||||
this.sortBy = dual.getSortValue();
|
this.sortBy = dual.getSortValue();
|
||||||
|
this.pos = dual.getLocation().getPos();
|
||||||
|
this.dim = dual.getLocation().getWorld().provider.getDimension();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import appeng.container.slot.*;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.entity.player.EntityPlayerMP;
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
import net.minecraft.entity.player.InventoryPlayer;
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
@@ -51,12 +52,6 @@ import appeng.api.storage.data.IAEItemStack;
|
|||||||
import appeng.api.storage.data.IItemList;
|
import appeng.api.storage.data.IItemList;
|
||||||
import appeng.container.ContainerNull;
|
import appeng.container.ContainerNull;
|
||||||
import appeng.container.guisync.GuiSync;
|
import appeng.container.guisync.GuiSync;
|
||||||
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.SlotRestrictedInput;
|
|
||||||
import appeng.core.sync.packets.PacketPatternSlot;
|
import appeng.core.sync.packets.PacketPatternSlot;
|
||||||
import appeng.helpers.IContainerCraftingPacket;
|
import appeng.helpers.IContainerCraftingPacket;
|
||||||
import appeng.items.storage.ItemViewCell;
|
import appeng.items.storage.ItemViewCell;
|
||||||
@@ -132,6 +127,26 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
this.updateOrderOfOutputSlots();
|
this.updateOrderOfOutputSlots();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack transferStackInSlot( final EntityPlayer p, final int idx )
|
||||||
|
{
|
||||||
|
if( Platform.isClient() )
|
||||||
|
{
|
||||||
|
return ItemStack.EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
final AppEngSlot clickSlot = ( AppEngSlot ) this.inventorySlots.get( idx ); // require AE SLots!
|
||||||
|
ItemStack itemStack = clickSlot.getStack();
|
||||||
|
if( AEApi.instance().definitions().materials().blankPattern().isSameAs( itemStack ) )
|
||||||
|
{
|
||||||
|
IItemHandler patternInv = this.getPatternTerminal().getInventoryByName( "pattern" );
|
||||||
|
ItemStack remainder = patternInv.insertItem( 0, itemStack, false );
|
||||||
|
clickSlot.putStack( remainder );
|
||||||
|
}
|
||||||
|
return super.transferStackInSlot( p, idx );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void updateOrderOfOutputSlots()
|
private void updateOrderOfOutputSlots()
|
||||||
{
|
{
|
||||||
if( !this.isCraftingMode() )
|
if( !this.isCraftingMode() )
|
||||||
@@ -203,6 +218,19 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void encodeAndMoveToInventory()
|
||||||
|
{
|
||||||
|
encode();
|
||||||
|
ItemStack output = this.patternSlotOUT.getStack();
|
||||||
|
if ( !output.isEmpty() )
|
||||||
|
{
|
||||||
|
if (!getPlayerInv().addItemStackToInventory( output )){
|
||||||
|
getPlayerInv().player.dropItem( output , false );
|
||||||
|
}
|
||||||
|
this.patternSlotOUT.putStack( ItemStack.EMPTY );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void encode()
|
public void encode()
|
||||||
{
|
{
|
||||||
ItemStack output = this.patternSlotOUT.getStack();
|
ItemStack output = this.patternSlotOUT.getStack();
|
||||||
@@ -269,6 +297,212 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
output.setTagCompound( encodedValue );
|
output.setTagCompound( encodedValue );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void multiply(int multiple)
|
||||||
|
{
|
||||||
|
ItemStack[] input = new ItemStack[9];
|
||||||
|
boolean canMultiplyInputs = true;
|
||||||
|
boolean canMultiplyOutputs = true;
|
||||||
|
|
||||||
|
for( int x = 0; x < this.craftingSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.craftingSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() && input[x].getCount() * multiple > input[x].getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canMultiplyInputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
if( !out.isEmpty() && out.getCount() * multiple > out.getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canMultiplyOutputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( canMultiplyInputs && canMultiplyOutputs )
|
||||||
|
{
|
||||||
|
for( SlotFakeCraftingMatrix craftingSlot : this.craftingSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = craftingSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
craftingSlot.getStack().setCount( stack.getCount() * multiple );
|
||||||
|
}
|
||||||
|
for( OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = outputSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
outputSlot.getStack().setCount( stack.getCount() * multiple );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void divide(int divide)
|
||||||
|
{
|
||||||
|
ItemStack[] input = new ItemStack[9];
|
||||||
|
boolean canDivideInputs = true;
|
||||||
|
boolean canDivideOutputs = true;
|
||||||
|
|
||||||
|
for( int x = 0; x < this.craftingSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.craftingSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() && input[x].getCount() % divide != 0 )
|
||||||
|
{
|
||||||
|
canDivideInputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
if( !out.isEmpty() && out.getCount() % divide != 0 )
|
||||||
|
{
|
||||||
|
canDivideOutputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( canDivideInputs && canDivideOutputs )
|
||||||
|
{
|
||||||
|
for( SlotFakeCraftingMatrix craftingSlot : this.craftingSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = craftingSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
craftingSlot.getStack().setCount( stack.getCount() / divide );
|
||||||
|
}
|
||||||
|
for( OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = outputSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
outputSlot.getStack().setCount( stack.getCount() / divide );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void increase(int increase)
|
||||||
|
{
|
||||||
|
ItemStack[] input = new ItemStack[9];
|
||||||
|
boolean canIncreaseInputs = true;
|
||||||
|
boolean canIncreaseOutputs = true;
|
||||||
|
|
||||||
|
for( int x = 0; x < this.craftingSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.craftingSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() && input[x].getCount() + increase > input[x].getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canIncreaseInputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
if( !out.isEmpty() && out.getCount() + increase > out.getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canIncreaseOutputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( canIncreaseInputs && canIncreaseOutputs )
|
||||||
|
{
|
||||||
|
for( SlotFakeCraftingMatrix craftingSlot : this.craftingSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = craftingSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
craftingSlot.getStack().setCount( stack.getCount() + increase );
|
||||||
|
}
|
||||||
|
for( OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = outputSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
outputSlot.getStack().setCount( stack.getCount() + increase );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void decrease(int decrease)
|
||||||
|
{
|
||||||
|
ItemStack[] input = new ItemStack[9];
|
||||||
|
boolean canDecreaseInputs = true;
|
||||||
|
boolean canDecreaseOutputs = true;
|
||||||
|
|
||||||
|
for( int x = 0; x < this.craftingSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.craftingSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() && input[x].getCount() - decrease < 1 )
|
||||||
|
{
|
||||||
|
canDecreaseInputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
if( !out.isEmpty() && out.getCount() - decrease < 1 )
|
||||||
|
{
|
||||||
|
canDecreaseOutputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( canDecreaseInputs && canDecreaseOutputs )
|
||||||
|
{
|
||||||
|
for( SlotFakeCraftingMatrix craftingSlot : this.craftingSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = craftingSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
craftingSlot.getStack().setCount( stack.getCount() - decrease );
|
||||||
|
}
|
||||||
|
for( OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = outputSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
outputSlot.getStack().setCount( stack.getCount() - decrease );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void maximizeCount()
|
||||||
|
{
|
||||||
|
ItemStack[] input = new ItemStack[9];
|
||||||
|
boolean canGrowInputs = true;
|
||||||
|
boolean canGrowOutputs = true;
|
||||||
|
int maxInputStackGrowth = 0;
|
||||||
|
int maxOutputStackGrowth = 0;
|
||||||
|
|
||||||
|
|
||||||
|
for( int x = 0; x < this.craftingSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.craftingSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() && input[x].getMaxStackSize() - input[x].getCount() > maxInputStackGrowth )
|
||||||
|
{
|
||||||
|
maxInputStackGrowth = input[x].getMaxStackSize() - input[x].getCount();
|
||||||
|
}
|
||||||
|
if( !input[x].isEmpty() && input[x].getCount() + maxInputStackGrowth > input[x].getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canGrowInputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
{
|
||||||
|
maxOutputStackGrowth = out.getMaxStackSize() - out.getCount();
|
||||||
|
}
|
||||||
|
if( !out.isEmpty() && out.getCount() + maxOutputStackGrowth > out.getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canGrowOutputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( canGrowInputs && canGrowOutputs )
|
||||||
|
{
|
||||||
|
int maxStackGrowth = Math.min(maxInputStackGrowth,maxOutputStackGrowth);
|
||||||
|
for( SlotFakeCraftingMatrix craftingSlot : this.craftingSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = craftingSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
craftingSlot.getStack().setCount( stack.getCount() + maxStackGrowth );
|
||||||
|
}
|
||||||
|
for( OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = outputSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
outputSlot.getStack().setCount( stack.getCount() + maxStackGrowth );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private ItemStack[] getInputs()
|
private ItemStack[] getInputs()
|
||||||
{
|
{
|
||||||
final ItemStack[] input = new ItemStack[9];
|
final ItemStack[] input = new ItemStack[9];
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package appeng.container.interfaces;
|
||||||
|
|
||||||
|
import mezz.jei.api.gui.IGhostIngredientHandler.Target;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
public interface IJEIGhostIngredients
|
||||||
|
{
|
||||||
|
List<Target<?>> getPhantomTargets( Object ingredient );
|
||||||
|
|
||||||
|
default Map<Target<?>, Object> getFakeSlotTargetMap(){
|
||||||
|
return new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
package appeng.container.slot;
|
||||||
|
|
||||||
|
public interface IJEITargetSlot {
|
||||||
|
}
|
||||||
@@ -24,7 +24,7 @@ import net.minecraft.item.ItemStack;
|
|||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
|
|
||||||
public class SlotFake extends AppEngSlot
|
public class SlotFake extends AppEngSlot implements IJEITargetSlot
|
||||||
{
|
{
|
||||||
|
|
||||||
public SlotFake( final IItemHandler inv, final int idx, final int x, final int y )
|
public SlotFake( final IItemHandler inv, final int idx, final int x, final int y )
|
||||||
|
|||||||
@@ -616,7 +616,12 @@ public final class ApiBlocks implements IBlocks
|
|||||||
|
|
||||||
private static IBlockDefinition makeStairs( String registryName, FeatureFactory registry, IBlockDefinition block )
|
private static IBlockDefinition makeStairs( String registryName, FeatureFactory registry, IBlockDefinition block )
|
||||||
{
|
{
|
||||||
return registry.block( registryName, () -> new BlockStairCommon( block.maybeBlock().get(), block.identifier() ) )
|
if( !block.maybeBlock().isPresent() )
|
||||||
|
{
|
||||||
|
return new BlockDefinition( registryName, null, null );
|
||||||
|
}
|
||||||
|
|
||||||
|
IBlockDefinition stairs = registry.block( registryName, () -> new BlockStairCommon( block.maybeBlock().get(), block.identifier() ) )
|
||||||
.features( AEFeature.DECORATIVE_BLOCKS )
|
.features( AEFeature.DECORATIVE_BLOCKS )
|
||||||
.rendering( new BlockRenderingCustomizer()
|
.rendering( new BlockRenderingCustomizer()
|
||||||
{
|
{
|
||||||
@@ -629,6 +634,10 @@ public final class ApiBlocks implements IBlocks
|
|||||||
}
|
}
|
||||||
} )
|
} )
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
Verify.verify(stairs.maybeBlock().isPresent());
|
||||||
|
|
||||||
|
return stairs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
package appeng.core.localization;
|
package appeng.core.localization;
|
||||||
|
|
||||||
|
|
||||||
|
import appeng.api.config.SchedulingMode;
|
||||||
import net.minecraft.util.text.translation.I18n;
|
import net.minecraft.util.text.translation.I18n;
|
||||||
|
|
||||||
|
|
||||||
@@ -137,6 +138,28 @@ public enum ButtonToolTips
|
|||||||
BlockPlacementYes,
|
BlockPlacementYes,
|
||||||
BlockPlacementNo,
|
BlockPlacementNo,
|
||||||
|
|
||||||
|
MultiplyByTwo,
|
||||||
|
MultiplyByTwoDesc,
|
||||||
|
MultiplyByThree,
|
||||||
|
MultiplyByThreeDesc,
|
||||||
|
IncreaseByOne,
|
||||||
|
IncreaseByOneDesc,
|
||||||
|
DivideByTwo,
|
||||||
|
DivideByTwoDesc,
|
||||||
|
DivideByThree,
|
||||||
|
DivideByThreeDesc,
|
||||||
|
DecreaseByOne,
|
||||||
|
DecreaseByOneDesc,
|
||||||
|
MaxCount,
|
||||||
|
MaxCountDesc,
|
||||||
|
FreeMolecularSlotShortcut,
|
||||||
|
FreeMolecularSlotShortcutDesc,
|
||||||
|
ToggleShowFullInterfaces,
|
||||||
|
ToggleShowFullInterfacesOnDesc,
|
||||||
|
ToggleShowFullInterfacesOffDesc,
|
||||||
|
HighlightInterface,
|
||||||
|
HighlightInterfaceDesc,
|
||||||
|
|
||||||
// Used in the tooltips of the items in the terminal, when moused over
|
// Used in the tooltips of the items in the terminal, when moused over
|
||||||
ItemsStored,
|
ItemsStored,
|
||||||
ItemsRequestable,
|
ItemsRequestable,
|
||||||
|
|||||||
@@ -20,7 +20,16 @@ package appeng.core.sync.packets;
|
|||||||
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import appeng.api.storage.data.IAEFluidStack;
|
||||||
|
import appeng.container.slot.IJEITargetSlot;
|
||||||
|
import appeng.container.slot.SlotFake;
|
||||||
|
import appeng.core.AELog;
|
||||||
|
import appeng.core.sync.network.NetworkHandler;
|
||||||
|
import appeng.fluids.client.gui.widgets.GuiFluidSlot;
|
||||||
|
import appeng.fluids.container.ContainerFluidConfigurable;
|
||||||
|
import appeng.fluids.util.AEFluidStack;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
|
|
||||||
@@ -40,6 +49,7 @@ import appeng.core.sync.network.INetworkInfo;
|
|||||||
import appeng.helpers.InventoryAction;
|
import appeng.helpers.InventoryAction;
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
import appeng.util.item.AEItemStack;
|
import appeng.util.item.AEItemStack;
|
||||||
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
|
|
||||||
|
|
||||||
public class PacketInventoryAction extends AppEngPacket
|
public class PacketInventoryAction extends AppEngPacket
|
||||||
@@ -57,6 +67,7 @@ public class PacketInventoryAction extends AppEngPacket
|
|||||||
this.slot = stream.readInt();
|
this.slot = stream.readInt();
|
||||||
this.id = stream.readLong();
|
this.id = stream.readLong();
|
||||||
final boolean hasItem = stream.readBoolean();
|
final boolean hasItem = stream.readBoolean();
|
||||||
|
|
||||||
if( hasItem )
|
if( hasItem )
|
||||||
{
|
{
|
||||||
this.slotItem = AEItemStack.fromPacket( stream );
|
this.slotItem = AEItemStack.fromPacket( stream );
|
||||||
@@ -70,7 +81,6 @@ public class PacketInventoryAction extends AppEngPacket
|
|||||||
// api
|
// api
|
||||||
public PacketInventoryAction( final InventoryAction action, final int slot, final IAEItemStack slotItem ) throws IOException
|
public PacketInventoryAction( final InventoryAction action, final int slot, final IAEItemStack slotItem ) throws IOException
|
||||||
{
|
{
|
||||||
|
|
||||||
if( Platform.isClient() )
|
if( Platform.isClient() )
|
||||||
{
|
{
|
||||||
throw new IllegalStateException( "invalid packet, client cannot post inv actions with stacks." );
|
throw new IllegalStateException( "invalid packet, client cannot post inv actions with stacks." );
|
||||||
@@ -101,6 +111,36 @@ public class PacketInventoryAction extends AppEngPacket
|
|||||||
this.configureWrite( data );
|
this.configureWrite( data );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PacketInventoryAction(final InventoryAction action, final IJEITargetSlot slot, final IAEItemStack slotItem ) throws IOException
|
||||||
|
{
|
||||||
|
|
||||||
|
this.action = action;
|
||||||
|
if (slot instanceof SlotFake)
|
||||||
|
this.slot = ((SlotFake) slot).slotNumber;
|
||||||
|
else this.slot = ((GuiFluidSlot) slot).getId();
|
||||||
|
this.id = 0;
|
||||||
|
this.slotItem = slotItem;
|
||||||
|
|
||||||
|
final ByteBuf data = Unpooled.buffer();
|
||||||
|
|
||||||
|
data.writeInt( this.getPacketID() );
|
||||||
|
data.writeInt( action.ordinal() );
|
||||||
|
data.writeInt( this.slot );
|
||||||
|
data.writeLong( this.id );
|
||||||
|
|
||||||
|
if( slotItem == null )
|
||||||
|
{
|
||||||
|
data.writeBoolean( false );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data.writeBoolean( true );
|
||||||
|
slotItem.writeToPacket( data );
|
||||||
|
}
|
||||||
|
|
||||||
|
this.configureWrite( data );
|
||||||
|
}
|
||||||
|
|
||||||
// api
|
// api
|
||||||
public PacketInventoryAction( final InventoryAction action, final int slot, final long id )
|
public PacketInventoryAction( final InventoryAction action, final int slot, final long id )
|
||||||
{
|
{
|
||||||
@@ -150,6 +190,48 @@ public class PacketInventoryAction extends AppEngPacket
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if( this.action == InventoryAction.PLACE_JEI_GHOST_ITEM )
|
||||||
|
{
|
||||||
|
if( sender.openContainer.inventorySlots.get( this.slot ) instanceof SlotFake )
|
||||||
|
{
|
||||||
|
if( this.slotItem != null )
|
||||||
|
{
|
||||||
|
sender.openContainer.inventorySlots.get( this.slot ).putStack( this.slotItem.createItemStack() );
|
||||||
|
if( sender.openContainer.inventorySlots.get( this.slot ).getStack().isEmpty() )
|
||||||
|
{
|
||||||
|
IAEFluidStack aefs = AEFluidStack.fromNBT( this.slotItem.getDefinition().getTagCompound() );
|
||||||
|
if( aefs != null )
|
||||||
|
{
|
||||||
|
FluidStack fluid = aefs.getFluidStack();
|
||||||
|
sender.openContainer.inventorySlots.get( this.slot ).putStack( AEFluidStack.fromFluidStack( fluid ).asItemStackRepresentation() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else sender.openContainer.inventorySlots.get( this.slot ).putStack( ItemStack.EMPTY );
|
||||||
|
try
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendTo( new PacketInventoryAction( InventoryAction.UPDATE_HAND, 0, AEItemStack.fromItemStack( ItemStack.EMPTY ) ), sender );
|
||||||
|
}
|
||||||
|
catch( final IOException e )
|
||||||
|
{
|
||||||
|
AELog.debug( e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( sender.openContainer instanceof ContainerFluidConfigurable )
|
||||||
|
{
|
||||||
|
if( this.slotItem != null )
|
||||||
|
{
|
||||||
|
IAEFluidStack aefs = AEFluidStack.fromNBT( this.slotItem.getDefinition().getTagCompound() );
|
||||||
|
if( aefs != null )
|
||||||
|
{
|
||||||
|
aefs.setStackSize( 1000 );
|
||||||
|
( (ContainerFluidConfigurable) sender.openContainer ).getFluidConfigInventory().setFluidInSlot( this.slot, aefs );
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketFluidSlot( Collections.singletonMap( this.slot, aefs ) ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
baseContainer.doAction( sender, this.action, this.slot, this.id );
|
baseContainer.doAction( sender, this.action, this.slot, this.id );
|
||||||
|
|||||||
@@ -23,7 +23,12 @@ import java.io.ByteArrayInputStream;
|
|||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import appeng.api.config.FuzzyMode;
|
||||||
|
import appeng.api.storage.data.IItemList;
|
||||||
|
import appeng.container.implementations.ContainerPatternTerm;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
|
|
||||||
@@ -64,6 +69,8 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
{
|
{
|
||||||
|
|
||||||
private ItemStack[][] recipe;
|
private ItemStack[][] recipe;
|
||||||
|
private ItemStack[] output;
|
||||||
|
|
||||||
|
|
||||||
// automatic.
|
// automatic.
|
||||||
public PacketJEIRecipe( final ByteBuf stream ) throws IOException
|
public PacketJEIRecipe( final ByteBuf stream ) throws IOException
|
||||||
@@ -86,7 +93,19 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ( comp.hasKey("outputs") ) {
|
||||||
|
final NBTTagList outputList = comp.getTagList("outputs", 10);
|
||||||
|
this.output = new ItemStack[3];
|
||||||
|
for( int x = 0; x < this.output.length; x++ )
|
||||||
|
{
|
||||||
|
if( outputList.tagCount() > 0 )
|
||||||
|
{
|
||||||
|
this.output[x] = new ItemStack(outputList.getCompoundTagAt( x ));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// api
|
// api
|
||||||
@@ -152,6 +171,11 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
// already the correct item?
|
// already the correct item?
|
||||||
ItemStack newItem = this.canUseInSlot( x, currentItem );
|
ItemStack newItem = this.canUseInSlot( x, currentItem );
|
||||||
|
|
||||||
|
if ( !cct.useRealItems() && this.recipe[x] != null ) {
|
||||||
|
if (this.recipe[x].length > 0 )
|
||||||
|
currentItem.setCount( recipe[x][0].getCount() );
|
||||||
|
}
|
||||||
|
|
||||||
// put away old item
|
// put away old item
|
||||||
if( newItem != currentItem && security.hasPermission( player, SecurityPermissions.INJECT ) )
|
if( newItem != currentItem && security.hasPermission( player, SecurityPermissions.INJECT ) )
|
||||||
{
|
{
|
||||||
@@ -185,6 +209,26 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
if( cct.useRealItems() )
|
if( cct.useRealItems() )
|
||||||
{
|
{
|
||||||
out = Platform.poweredExtraction( energy, storage, request, cct.getActionSource() );
|
out = Platform.poweredExtraction( energy, storage, request, cct.getActionSource() );
|
||||||
|
if( out == null )
|
||||||
|
{
|
||||||
|
Collection<IAEItemStack> outList = inv.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ).getStorageList().findFuzzy( request, FuzzyMode.IGNORE_ALL );
|
||||||
|
IAEItemStack mostDamaged = null;
|
||||||
|
for( IAEItemStack is : outList )
|
||||||
|
{
|
||||||
|
if( !is.isCraftable() )
|
||||||
|
{
|
||||||
|
if( mostDamaged == null || mostDamaged.getItemDamage() < is.getItemDamage() )
|
||||||
|
{
|
||||||
|
mostDamaged = is;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( mostDamaged != null )
|
||||||
|
{
|
||||||
|
mostDamaged.setStackSize( 1 );
|
||||||
|
out = Platform.poweredExtraction( energy, storage, mostDamaged, cct.getActionSource() );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -202,6 +246,7 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
|
|
||||||
if( out != null )
|
if( out != null )
|
||||||
{
|
{
|
||||||
|
out.setStackSize( recipe[x][y].getCount() );
|
||||||
currentItem = out.createItemStack();
|
currentItem = out.createItemStack();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -213,19 +258,37 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
|
|
||||||
if( cct.useRealItems() )
|
if( cct.useRealItems() )
|
||||||
{
|
{
|
||||||
currentItem = ad.removeItems( 1, this.recipe[x][y], null );
|
currentItem = ad.removeSimilarItems(1, this.recipe[x][y],FuzzyMode.IGNORE_ALL, null );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
currentItem = ad.simulateRemove( 1, this.recipe[x][y], null );
|
currentItem = ad.simulateSimilarRemove(recipe[x][y].getCount(), this.recipe[x][y],FuzzyMode.IGNORE_ALL, null );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!cct.useRealItems())
|
||||||
|
{
|
||||||
|
if( currentItem.isEmpty() && this.recipe[x] != null )
|
||||||
|
{
|
||||||
|
currentItem = this.recipe[x][0].copy();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ItemHandlerUtil.setStackInSlot( craftMatrix, x, currentItem );
|
ItemHandlerUtil.setStackInSlot( craftMatrix, x, currentItem );
|
||||||
}
|
}
|
||||||
|
|
||||||
con.onCraftMatrixChanged( new WrapperInvItemHandler( craftMatrix ) );
|
con.onCraftMatrixChanged( new WrapperInvItemHandler( craftMatrix ) );
|
||||||
|
|
||||||
|
if( this.output != null && con instanceof ContainerPatternTerm && !( (ContainerPatternTerm) con ).isCraftingMode() )
|
||||||
|
{
|
||||||
|
IItemHandler outputSlots = cct.getInventoryByName( "output" );
|
||||||
|
for( int i = 0; i < this.output.length; ++i )
|
||||||
|
{
|
||||||
|
if( this.output[i] == null ) continue;
|
||||||
|
ItemHandlerUtil.setStackInSlot( outputSlots, i, this.output[i] );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,7 +304,7 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
{
|
{
|
||||||
for( ItemStack option : this.recipe[slot] )
|
for( ItemStack option : this.recipe[slot] )
|
||||||
{
|
{
|
||||||
if( is.isItemEqual( option ) )
|
if( ItemStack.areItemStacksEqual( is, option ) )
|
||||||
{
|
{
|
||||||
return is;
|
return is;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -175,12 +175,46 @@ public class PacketValueConfig extends AppEngPacket
|
|||||||
}
|
}
|
||||||
else if( this.Name.equals( "PatternTerminal.Encode" ) )
|
else if( this.Name.equals( "PatternTerminal.Encode" ) )
|
||||||
{
|
{
|
||||||
cpt.encode();
|
if (this.Value.equals( "2" )) {
|
||||||
|
cpt.encodeAndMoveToInventory();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cpt.encode();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if( this.Name.equals( "PatternTerminal.Clear" ) )
|
else if( this.Name.equals( "PatternTerminal.Clear" ) )
|
||||||
{
|
{
|
||||||
cpt.clear();
|
cpt.clear();
|
||||||
}
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.MultiplyByTwo" ) )
|
||||||
|
{
|
||||||
|
cpt.multiply(2);
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.MultiplyByThree" ) )
|
||||||
|
{
|
||||||
|
cpt.multiply(3);
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.DivideByTwo" ) )
|
||||||
|
{
|
||||||
|
cpt.divide(2);
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.DivideByThree" ) )
|
||||||
|
{
|
||||||
|
cpt.divide(3);
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.IncreaseByOne" ) )
|
||||||
|
{
|
||||||
|
cpt.increase(1);
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.DecreaseByOne" ) )
|
||||||
|
{
|
||||||
|
cpt.decrease(1);
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.MaximizeCount" ) )
|
||||||
|
{
|
||||||
|
cpt.maximizeCount();
|
||||||
|
}
|
||||||
else if( this.Name.equals( "PatternTerminal.Substitute" ) )
|
else if( this.Name.equals( "PatternTerminal.Substitute" ) )
|
||||||
{
|
{
|
||||||
cpt.getPatternTerminal().setSubstitution( this.Value.equals( "1" ) );
|
cpt.getPatternTerminal().setSubstitution( this.Value.equals( "1" ) );
|
||||||
|
|||||||
@@ -59,7 +59,6 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
private final IItemList<IAEItemStack> missing = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
private final IItemList<IAEItemStack> missing = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
||||||
private final HashMap<String, TwoIntegers> opsAndMultiplier = new HashMap<>();
|
private final HashMap<String, TwoIntegers> opsAndMultiplier = new HashMap<>();
|
||||||
private final Object monitor = new Object();
|
private final Object monitor = new Object();
|
||||||
private final Stopwatch watch = Stopwatch.createUnstarted();
|
|
||||||
private CraftingTreeNode tree;
|
private CraftingTreeNode tree;
|
||||||
private final IAEItemStack output;
|
private final IAEItemStack output;
|
||||||
private boolean simulate = false;
|
private boolean simulate = false;
|
||||||
@@ -67,10 +66,7 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
private long bytes = 0;
|
private long bytes = 0;
|
||||||
private final IActionSource actionSrc;
|
private final IActionSource actionSrc;
|
||||||
private final ICraftingCallback callback;
|
private final ICraftingCallback callback;
|
||||||
private boolean running = false;
|
|
||||||
private boolean done = false;
|
private boolean done = false;
|
||||||
private int time = 5;
|
|
||||||
private int incTime = Integer.MAX_VALUE;
|
|
||||||
|
|
||||||
private World wrapWorld( final World w )
|
private World wrapWorld( final World w )
|
||||||
{
|
{
|
||||||
@@ -137,7 +133,6 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
TickHandler.INSTANCE.registerCraftingSimulation( this.world, this );
|
TickHandler.INSTANCE.registerCraftingSimulation( this.world, this );
|
||||||
this.handlePausing();
|
|
||||||
|
|
||||||
final Stopwatch timer = Stopwatch.createStarted();
|
final Stopwatch timer = Stopwatch.createStarted();
|
||||||
|
|
||||||
@@ -219,42 +214,6 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
this.finish();
|
this.finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
void handlePausing() throws InterruptedException
|
|
||||||
{
|
|
||||||
if( this.incTime > 100 )
|
|
||||||
{
|
|
||||||
this.incTime = 0;
|
|
||||||
|
|
||||||
synchronized( this.monitor )
|
|
||||||
{
|
|
||||||
if( this.watch.elapsed( TimeUnit.MICROSECONDS ) > this.time )
|
|
||||||
{
|
|
||||||
this.running = false;
|
|
||||||
this.watch.stop();
|
|
||||||
this.monitor.notify();
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !this.running )
|
|
||||||
{
|
|
||||||
AELog.craftingDebug( "crafting job will now sleep" );
|
|
||||||
|
|
||||||
while( !this.running )
|
|
||||||
{
|
|
||||||
this.monitor.wait();
|
|
||||||
}
|
|
||||||
|
|
||||||
AELog.craftingDebug( "crafting job now active" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( Thread.interrupted() )
|
|
||||||
{
|
|
||||||
throw new InterruptedException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.incTime++;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void finish()
|
private void finish()
|
||||||
{
|
{
|
||||||
if( this.callback != null )
|
if( this.callback != null )
|
||||||
@@ -266,7 +225,6 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
|
|
||||||
synchronized( this.monitor )
|
synchronized( this.monitor )
|
||||||
{
|
{
|
||||||
this.running = false;
|
|
||||||
this.done = true;
|
this.done = true;
|
||||||
this.monitor.notify();
|
this.monitor.notify();
|
||||||
}
|
}
|
||||||
@@ -310,45 +268,15 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* returns true if this needs more simulation.
|
|
||||||
*
|
|
||||||
* @param milli milliseconds of simulation
|
|
||||||
*
|
|
||||||
* @return true if this needs more simulation
|
* @return true if this needs more simulation
|
||||||
*/
|
*/
|
||||||
public boolean simulateFor( final int milli )
|
public boolean simulateFor()
|
||||||
{
|
{
|
||||||
this.time = milli;
|
synchronized( this.monitor ) {
|
||||||
|
if ( this.done ) {
|
||||||
synchronized( this.monitor )
|
|
||||||
{
|
|
||||||
if( this.done )
|
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.watch.reset();
|
|
||||||
this.watch.start();
|
|
||||||
this.running = true;
|
|
||||||
|
|
||||||
AELog.craftingDebug( "main thread is now going to sleep" );
|
|
||||||
|
|
||||||
this.monitor.notify();
|
|
||||||
|
|
||||||
while( this.running )
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
this.monitor.wait();
|
|
||||||
}
|
|
||||||
catch( final InterruptedException ignored )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AELog.craftingDebug( "main thread is now active" );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -119,7 +119,6 @@ public class CraftingTreeNode
|
|||||||
|
|
||||||
IAEItemStack request( final MECraftingInventory inv, long l, final IActionSource src ) throws CraftBranchFailure, InterruptedException
|
IAEItemStack request( final MECraftingInventory inv, long l, final IActionSource src ) throws CraftBranchFailure, InterruptedException
|
||||||
{
|
{
|
||||||
this.job.handlePausing();
|
|
||||||
|
|
||||||
final List<IAEItemStack> thingsUsed = new ArrayList<>();
|
final List<IAEItemStack> thingsUsed = new ArrayList<>();
|
||||||
|
|
||||||
|
|||||||
@@ -77,8 +77,6 @@ public class CraftingTreeProcess
|
|||||||
ic.setInventorySlotContents( x, is[x] == null ? ItemStack.EMPTY : is[x].createItemStack() );
|
ic.setInventorySlotContents( x, is[x] == null ? ItemStack.EMPTY : is[x].createItemStack() );
|
||||||
}
|
}
|
||||||
|
|
||||||
FMLCommonHandler.instance().firePlayerCraftingEvent( Platform.getPlayer( (WorldServer) world ), details.getOutput( ic, world ), ic );
|
|
||||||
|
|
||||||
for( int x = 0; x < ic.getSizeInventory(); x++ )
|
for( int x = 0; x < ic.getSizeInventory(); x++ )
|
||||||
{
|
{
|
||||||
final ItemStack g = ic.getStackInSlot( x );
|
final ItemStack g = ic.getStackInSlot( x );
|
||||||
@@ -187,7 +185,6 @@ public class CraftingTreeProcess
|
|||||||
|
|
||||||
void request( final MECraftingInventory inv, final long i, final IActionSource src ) throws CraftBranchFailure, InterruptedException
|
void request( final MECraftingInventory inv, final long i, final IActionSource src ) throws CraftBranchFailure, InterruptedException
|
||||||
{
|
{
|
||||||
this.job.handlePausing();
|
|
||||||
|
|
||||||
if( this.fullSimulation )
|
if( this.fullSimulation )
|
||||||
{
|
{
|
||||||
@@ -201,8 +198,6 @@ public class CraftingTreeProcess
|
|||||||
ic.setInventorySlotContents( entry.getKey().getSlot(), stack.createItemStack() );
|
ic.setInventorySlotContents( entry.getKey().getSlot(), stack.createItemStack() );
|
||||||
}
|
}
|
||||||
|
|
||||||
FMLCommonHandler.instance().firePlayerCraftingEvent( Platform.getPlayer( (WorldServer) this.world ), this.details.getOutput( ic, this.world ), ic );
|
|
||||||
|
|
||||||
for( int x = 0; x < ic.getSizeInventory(); x++ )
|
for( int x = 0; x < ic.getSizeInventory(); x++ )
|
||||||
{
|
{
|
||||||
ItemStack is = ic.getStackInSlot( x );
|
ItemStack is = ic.getStackInSlot( x );
|
||||||
@@ -265,7 +260,7 @@ public class CraftingTreeProcess
|
|||||||
{
|
{
|
||||||
for( final IAEItemStack is : this.details.getCondensedOutputs() )
|
for( final IAEItemStack is : this.details.getCondensedOutputs() )
|
||||||
{
|
{
|
||||||
if( is.equals( what2 ) )
|
if( is.isSameType( what2 ) )
|
||||||
{
|
{
|
||||||
what2 = what2.copy();
|
what2 = what2.copy();
|
||||||
what2.setStackSize( is.getStackSize() );
|
what2.setStackSize( is.getStackSize() );
|
||||||
|
|||||||
@@ -90,6 +90,13 @@ public class GuiFluidLevelEmitter extends GuiUpgradeable
|
|||||||
this.level.drawTextBox();
|
this.level.drawTextBox();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawFG( int offsetX, int offsetY, int mouseX, int mouseY )
|
||||||
|
{
|
||||||
|
if( isPointInRegion( 24, 43,89,this.fontRenderer.FONT_HEIGHT,mouseX,mouseY ) ) drawTooltip( mouseX - guiLeft - 7, mouseY - guiTop + 25, "Amount in millibuckets" );
|
||||||
|
super.drawFG( offsetX, offsetY, mouseX, mouseY );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean drawUpgrades()
|
protected boolean drawUpgrades()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ package appeng.fluids.client.gui.widgets;
|
|||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import appeng.container.slot.IJEITargetSlot;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||||
@@ -23,7 +24,7 @@ import appeng.fluids.util.AEFluidStack;
|
|||||||
import appeng.fluids.util.IAEFluidTank;
|
import appeng.fluids.util.IAEFluidTank;
|
||||||
|
|
||||||
|
|
||||||
public class GuiFluidSlot extends GuiCustomSlot
|
public class GuiFluidSlot extends GuiCustomSlot implements IJEITargetSlot
|
||||||
{
|
{
|
||||||
private final IAEFluidTank fluids;
|
private final IAEFluidTank fluids;
|
||||||
private final int slot;
|
private final int slot;
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import net.minecraftforge.common.capabilities.Capability;
|
|||||||
import net.minecraftforge.fluids.Fluid;
|
import net.minecraftforge.fluids.Fluid;
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||||
|
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
import appeng.api.AEApi;
|
||||||
@@ -72,7 +73,7 @@ import appeng.util.IConfigManagerHost;
|
|||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
|
|
||||||
|
|
||||||
public class DualityFluidInterface implements IGridTickable, IStorageMonitorable, IAEFluidInventory, IUpgradeableHost, IConfigManagerHost
|
public class DualityFluidInterface implements IGridTickable, IStorageMonitorable, IAEFluidInventory, IUpgradeableHost, IConfigManagerHost, IConfigurableFluidInventory
|
||||||
{
|
{
|
||||||
public static final int NUMBER_OF_TANKS = 6;
|
public static final int NUMBER_OF_TANKS = 6;
|
||||||
public static final int TANK_CAPACITY = Fluid.BUCKET_VOLUME * 4;
|
public static final int TANK_CAPACITY = Fluid.BUCKET_VOLUME * 4;
|
||||||
@@ -603,6 +604,14 @@ public class DualityFluidInterface implements IGridTickable, IStorageMonitorable
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFluidHandler getFluidInventoryByName( final String name) {
|
||||||
|
if (name.equals("config")) {
|
||||||
|
return this.config;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getInstalledUpgrades( Upgrades u )
|
public int getInstalledUpgrades( Upgrades u )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package appeng.fluids.helper;
|
||||||
|
|
||||||
|
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||||
|
|
||||||
|
public interface IConfigurableFluidInventory
|
||||||
|
{
|
||||||
|
default IFluidHandler getFluidInventoryByName( String name )
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -26,6 +26,9 @@ import java.util.Iterator;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import appeng.api.config.Settings;
|
||||||
|
import appeng.api.config.StorageFilter;
|
||||||
|
import appeng.parts.misc.PartStorageBus;
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||||
import net.minecraftforge.fluids.capability.IFluidTankProperties;
|
import net.minecraftforge.fluids.capability.IFluidTankProperties;
|
||||||
@@ -61,12 +64,18 @@ public class FluidHandlerAdapter implements IMEInventory<IAEFluidStack>, IBaseMo
|
|||||||
private final IFluidHandler fluidHandler;
|
private final IFluidHandler fluidHandler;
|
||||||
private final IGridProxyable proxyable;
|
private final IGridProxyable proxyable;
|
||||||
private final FluidHandlerAdapter.InventoryCache cache;
|
private final FluidHandlerAdapter.InventoryCache cache;
|
||||||
|
private StorageFilter mode;
|
||||||
|
|
||||||
FluidHandlerAdapter( IFluidHandler fluidHandler, IGridProxyable proxy )
|
FluidHandlerAdapter( IFluidHandler fluidHandler, IGridProxyable proxy )
|
||||||
{
|
{
|
||||||
this.fluidHandler = fluidHandler;
|
this.fluidHandler = fluidHandler;
|
||||||
this.proxyable = proxy;
|
this.proxyable = proxy;
|
||||||
this.cache = new FluidHandlerAdapter.InventoryCache( this.fluidHandler );
|
if( this.proxyable instanceof PartStorageBus )
|
||||||
|
{
|
||||||
|
PartStorageBus partStorageBus = (PartStorageBus) this.proxyable;
|
||||||
|
this.mode = ( (StorageFilter) partStorageBus.getConfigManager().getSetting( Settings.STORAGE_FILTER ) );
|
||||||
|
}
|
||||||
|
this.cache = new FluidHandlerAdapter.InventoryCache( this.fluidHandler, this.mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -195,9 +204,11 @@ public class FluidHandlerAdapter implements IMEInventory<IAEFluidStack>, IBaseMo
|
|||||||
{
|
{
|
||||||
private IAEFluidStack[] cachedAeStacks = new IAEFluidStack[0];
|
private IAEFluidStack[] cachedAeStacks = new IAEFluidStack[0];
|
||||||
private final IFluidHandler fluidHandler;
|
private final IFluidHandler fluidHandler;
|
||||||
|
private final StorageFilter mode;
|
||||||
|
|
||||||
public InventoryCache( IFluidHandler fluidHandler )
|
public InventoryCache( IFluidHandler fluidHandler, StorageFilter mode )
|
||||||
{
|
{
|
||||||
|
this.mode = mode;
|
||||||
this.fluidHandler = fluidHandler;
|
this.fluidHandler = fluidHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,8 +228,14 @@ public class FluidHandlerAdapter implements IMEInventory<IAEFluidStack>, IBaseMo
|
|||||||
{
|
{
|
||||||
// Save the old stuff
|
// Save the old stuff
|
||||||
final IAEFluidStack oldAEFS = this.cachedAeStacks[slot];
|
final IAEFluidStack oldAEFS = this.cachedAeStacks[slot];
|
||||||
final FluidStack newFS = tankProperties[slot].getContents();
|
FluidStack newFS = tankProperties[slot].getContents();
|
||||||
|
if( this.mode == StorageFilter.EXTRACTABLE_ONLY && newFS != null )
|
||||||
|
{
|
||||||
|
if( this.fluidHandler.drain( 1, false ) == null )
|
||||||
|
{
|
||||||
|
newFS = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
this.handlePossibleSlotChanges( slot, oldAEFS, newFS, changes );
|
this.handlePossibleSlotChanges( slot, oldAEFS, newFS, changes );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import appeng.fluids.helper.IConfigurableFluidInventory;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockLiquid;
|
import net.minecraft.block.BlockLiquid;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
@@ -51,9 +52,10 @@ import appeng.parts.automation.PartAbstractFormationPlane;
|
|||||||
import appeng.parts.automation.PlaneModels;
|
import appeng.parts.automation.PlaneModels;
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
import appeng.util.prioritylist.PrecisePriorityList;
|
import appeng.util.prioritylist.PrecisePriorityList;
|
||||||
|
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||||
|
|
||||||
|
|
||||||
public class PartFluidFormationPlane extends PartAbstractFormationPlane<IAEFluidStack> implements IAEFluidInventory
|
public class PartFluidFormationPlane extends PartAbstractFormationPlane<IAEFluidStack> implements IAEFluidInventory, IConfigurableFluidInventory
|
||||||
{
|
{
|
||||||
private static final PlaneModels MODELS = new PlaneModels( "part/fluid_formation_plane_", "part/fluid_formation_plane_on_" );
|
private static final PlaneModels MODELS = new PlaneModels( "part/fluid_formation_plane_", "part/fluid_formation_plane_on_" );
|
||||||
|
|
||||||
@@ -222,6 +224,14 @@ public class PartFluidFormationPlane extends PartAbstractFormationPlane<IAEFluid
|
|||||||
return this.config;
|
return this.config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFluidHandler getFluidInventoryByName( final String name) {
|
||||||
|
if (name.equals("config")) {
|
||||||
|
return this.config;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack getItemStackRepresentation()
|
public ItemStack getItemStackRepresentation()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ package appeng.fluids.parts;
|
|||||||
|
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
|
|
||||||
|
import appeng.fluids.helper.IConfigurableFluidInventory;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
@@ -30,6 +31,7 @@ import net.minecraft.util.EnumHand;
|
|||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraftforge.common.capabilities.Capability;
|
import net.minecraftforge.common.capabilities.Capability;
|
||||||
|
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
import appeng.api.AEApi;
|
||||||
@@ -61,7 +63,7 @@ import appeng.parts.PartModel;
|
|||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
|
|
||||||
|
|
||||||
public class PartFluidInterface extends PartBasicState implements IGridTickable, IStorageMonitorable, IFluidInterfaceHost, IPriorityHost
|
public class PartFluidInterface extends PartBasicState implements IGridTickable, IStorageMonitorable, IFluidInterfaceHost, IPriorityHost, IConfigurableFluidInventory
|
||||||
{
|
{
|
||||||
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/fluid_interface_base" );
|
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/fluid_interface_base" );
|
||||||
|
|
||||||
@@ -233,6 +235,11 @@ public class PartFluidInterface extends PartBasicState implements IGridTickable,
|
|||||||
return this.duality.getInventoryByName( name );
|
return this.duality.getInventoryByName( name );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFluidHandler getFluidInventoryByName( final String name) {
|
||||||
|
return this.duality.getFluidInventoryByName(name);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack getItemStackRepresentation()
|
public ItemStack getItemStackRepresentation()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ package appeng.fluids.parts;
|
|||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
|
import appeng.fluids.helper.IConfigurableFluidInventory;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
@@ -48,9 +49,10 @@ import appeng.parts.PartModel;
|
|||||||
import appeng.parts.automation.PartUpgradeable;
|
import appeng.parts.automation.PartUpgradeable;
|
||||||
import appeng.util.IConfigManagerHost;
|
import appeng.util.IConfigManagerHost;
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
|
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||||
|
|
||||||
|
|
||||||
public class PartFluidLevelEmitter extends PartUpgradeable implements IStackWatcherHost, IConfigManagerHost, IAEFluidInventory, IMEMonitorHandlerReceiver<IAEFluidStack>
|
public class PartFluidLevelEmitter extends PartUpgradeable implements IStackWatcherHost, IConfigManagerHost, IAEFluidInventory, IMEMonitorHandlerReceiver<IAEFluidStack>, IConfigurableFluidInventory
|
||||||
{
|
{
|
||||||
@PartModels
|
@PartModels
|
||||||
public static final ResourceLocation MODEL_BASE_OFF = new ResourceLocation( AppEng.MOD_ID, "part/level_emitter_base_off" );
|
public static final ResourceLocation MODEL_BASE_OFF = new ResourceLocation( AppEng.MOD_ID, "part/level_emitter_base_off" );
|
||||||
@@ -354,6 +356,14 @@ public class PartFluidLevelEmitter extends PartUpgradeable implements IStackWatc
|
|||||||
return this.config;
|
return this.config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFluidHandler getFluidInventoryByName( final String name) {
|
||||||
|
if (name.equals("config")) {
|
||||||
|
return this.config;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void readFromNBT( final NBTTagCompound data )
|
public void readFromNBT( final NBTTagCompound data )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import java.util.Objects;
|
|||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
import appeng.fluids.helper.IConfigurableFluidInventory;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
@@ -87,7 +88,7 @@ import appeng.util.prioritylist.PrecisePriorityList;
|
|||||||
* @version rv6 - 22/05/2018
|
* @version rv6 - 22/05/2018
|
||||||
* @since rv6 22/05/2018
|
* @since rv6 22/05/2018
|
||||||
*/
|
*/
|
||||||
public class PartFluidStorageBus extends PartSharedStorageBus implements IMEMonitorHandlerReceiver<IAEFluidStack>, IAEFluidInventory
|
public class PartFluidStorageBus extends PartSharedStorageBus implements IMEMonitorHandlerReceiver<IAEFluidStack>, IAEFluidInventory, IConfigurableFluidInventory
|
||||||
{
|
{
|
||||||
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/fluid_storage_bus_base" );
|
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/fluid_storage_bus_base" );
|
||||||
@PartModels
|
@PartModels
|
||||||
@@ -263,18 +264,19 @@ public class PartFluidStorageBus extends PartSharedStorageBus implements IMEMoni
|
|||||||
@Override
|
@Override
|
||||||
public void postChange( final IBaseMonitor<IAEFluidStack> monitor, final Iterable<IAEFluidStack> change, final IActionSource source )
|
public void postChange( final IBaseMonitor<IAEFluidStack> monitor, final Iterable<IAEFluidStack> change, final IActionSource source )
|
||||||
{
|
{
|
||||||
try
|
if( source == this.source || source.machine().map( machine -> machine == this ).orElse( false ) )
|
||||||
{
|
{
|
||||||
if( this.getProxy().isActive() )
|
try
|
||||||
{
|
{
|
||||||
this.getProxy()
|
if( this.getProxy().isActive() )
|
||||||
.getStorage()
|
{
|
||||||
.postAlterationOfStoredItems( AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ), change, this.source );
|
this.getProxy().getStorage().postAlterationOfStoredItems( AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ), change, this.source );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( final GridAccessException e )
|
||||||
|
{
|
||||||
|
// :(
|
||||||
}
|
}
|
||||||
}
|
|
||||||
catch( final GridAccessException e )
|
|
||||||
{
|
|
||||||
// :(
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -469,6 +471,14 @@ public class PartFluidStorageBus extends PartSharedStorageBus implements IMEMoni
|
|||||||
return this.config;
|
return this.config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFluidHandler getFluidInventoryByName(final String name) {
|
||||||
|
if (name.equals("config")) {
|
||||||
|
return this.config;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
public IPartModel getStaticModels()
|
public IPartModel getStaticModels()
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
package appeng.fluids.parts;
|
package appeng.fluids.parts;
|
||||||
|
|
||||||
|
|
||||||
|
import appeng.fluids.helper.IConfigurableFluidInventory;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
@@ -44,6 +45,7 @@ import appeng.fluids.util.IAEFluidTank;
|
|||||||
import appeng.me.GridAccessException;
|
import appeng.me.GridAccessException;
|
||||||
import appeng.parts.automation.PartUpgradeable;
|
import appeng.parts.automation.PartUpgradeable;
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
|
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -51,7 +53,7 @@ import appeng.util.Platform;
|
|||||||
* @version rv6 - 30/04/2018
|
* @version rv6 - 30/04/2018
|
||||||
* @since rv6 30/04/2018
|
* @since rv6 30/04/2018
|
||||||
*/
|
*/
|
||||||
public abstract class PartSharedFluidBus extends PartUpgradeable implements IGridTickable
|
public abstract class PartSharedFluidBus extends PartUpgradeable implements IGridTickable, IConfigurableFluidInventory
|
||||||
{
|
{
|
||||||
|
|
||||||
private final AEFluidInventory config = new AEFluidInventory( null, 9 );
|
private final AEFluidInventory config = new AEFluidInventory( null, 9 );
|
||||||
@@ -176,6 +178,14 @@ public abstract class PartSharedFluidBus extends PartUpgradeable implements IGri
|
|||||||
return this.config;
|
return this.config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFluidHandler getFluidInventoryByName( final String name) {
|
||||||
|
if (name.equals("config")) {
|
||||||
|
return this.config;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
protected IFluidStorageChannel getChannel()
|
protected IFluidStorageChannel getChannel()
|
||||||
{
|
{
|
||||||
return AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class );
|
return AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class );
|
||||||
|
|||||||
@@ -23,11 +23,13 @@ import java.util.EnumSet;
|
|||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import appeng.fluids.helper.IConfigurableFluidInventory;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraftforge.common.capabilities.Capability;
|
import net.minecraftforge.common.capabilities.Capability;
|
||||||
|
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
import appeng.api.AEApi;
|
||||||
@@ -50,7 +52,7 @@ import appeng.helpers.IPriorityHost;
|
|||||||
import appeng.tile.grid.AENetworkTile;
|
import appeng.tile.grid.AENetworkTile;
|
||||||
|
|
||||||
|
|
||||||
public class TileFluidInterface extends AENetworkTile implements IGridTickable, IFluidInterfaceHost, IPriorityHost
|
public class TileFluidInterface extends AENetworkTile implements IGridTickable, IFluidInterfaceHost, IPriorityHost, IConfigurableFluidInventory
|
||||||
{
|
{
|
||||||
private final DualityFluidInterface duality = new DualityFluidInterface( this.getProxy(), this );
|
private final DualityFluidInterface duality = new DualityFluidInterface( this.getProxy(), this );
|
||||||
|
|
||||||
@@ -176,6 +178,11 @@ public class TileFluidInterface extends AENetworkTile implements IGridTickable,
|
|||||||
return this.duality.getInventoryByName( name );
|
return this.duality.getInventoryByName( name );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFluidHandler getFluidInventoryByName(final String name) {
|
||||||
|
return this.duality.getFluidInventoryByName(name);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack getItemStackRepresentation()
|
public ItemStack getItemStackRepresentation()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -19,18 +19,22 @@
|
|||||||
package appeng.helpers;
|
package appeng.helpers;
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collection;
|
import java.util.stream.Collectors;
|
||||||
import java.util.EnumSet;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import appeng.integration.modules.gregtech.GTCEInventoryAdaptor;
|
||||||
|
import appeng.util.*;
|
||||||
|
import appeng.util.inv.*;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
import de.ellpeck.actuallyadditions.api.tile.IPhantomTile;
|
||||||
|
import gregtech.api.block.machines.BlockMachine;
|
||||||
|
import gregtech.api.metatileentity.MetaTileEntity;
|
||||||
|
import gregtech.api.metatileentity.MetaTileEntityHolder;
|
||||||
|
import gregtech.api.metatileentity.TieredMetaTileEntity;
|
||||||
|
import gregtech.api.metatileentity.WorkableTieredMetaTileEntity;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.init.Items;
|
import net.minecraft.init.Items;
|
||||||
@@ -46,6 +50,7 @@ import net.minecraft.util.math.RayTraceResult;
|
|||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.common.capabilities.Capability;
|
import net.minecraftforge.common.capabilities.Capability;
|
||||||
|
import net.minecraftforge.fml.common.Loader;
|
||||||
import net.minecraftforge.items.CapabilityItemHandler;
|
import net.minecraftforge.items.CapabilityItemHandler;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
import net.minecraftforge.items.wrapper.RangedWrapper;
|
import net.minecraftforge.items.wrapper.RangedWrapper;
|
||||||
@@ -99,19 +104,14 @@ import appeng.parts.automation.StackUpgradeInventory;
|
|||||||
import appeng.parts.automation.UpgradeInventory;
|
import appeng.parts.automation.UpgradeInventory;
|
||||||
import appeng.tile.inventory.AppEngInternalAEInventory;
|
import appeng.tile.inventory.AppEngInternalAEInventory;
|
||||||
import appeng.tile.inventory.AppEngInternalInventory;
|
import appeng.tile.inventory.AppEngInternalInventory;
|
||||||
import appeng.util.ConfigManager;
|
|
||||||
import appeng.util.IConfigManagerHost;
|
|
||||||
import appeng.util.InventoryAdaptor;
|
|
||||||
import appeng.util.Platform;
|
|
||||||
import appeng.util.inv.AdaptorItemHandler;
|
|
||||||
import appeng.util.inv.IAEAppEngInventory;
|
|
||||||
import appeng.util.inv.IInventoryDestination;
|
|
||||||
import appeng.util.inv.InvOperation;
|
|
||||||
import appeng.util.item.AEItemStack;
|
import appeng.util.item.AEItemStack;
|
||||||
|
|
||||||
|
import static gregtech.api.block.machines.BlockMachine.getMetaTileEntity;
|
||||||
|
|
||||||
|
|
||||||
public class DualityInterface implements IGridTickable, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory, IConfigManagerHost, ICraftingProvider, IUpgradeableHost
|
public class DualityInterface implements IGridTickable, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory, IConfigManagerHost, ICraftingProvider, IUpgradeableHost
|
||||||
{
|
{
|
||||||
|
private int[] failedCraftTriesSlot = {0,0,0,0,0,0,0,0,0};
|
||||||
|
|
||||||
public static final int NUMBER_OF_STORAGE_SLOTS = 9;
|
public static final int NUMBER_OF_STORAGE_SLOTS = 9;
|
||||||
public static final int NUMBER_OF_CONFIG_SLOTS = 9;
|
public static final int NUMBER_OF_CONFIG_SLOTS = 9;
|
||||||
@@ -129,11 +129,11 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
private final AppEngInternalInventory storage = new AppEngInternalInventory( this, NUMBER_OF_STORAGE_SLOTS );
|
private final AppEngInternalInventory storage = new AppEngInternalInventory( this, NUMBER_OF_STORAGE_SLOTS );
|
||||||
private final AppEngInternalInventory patterns = new AppEngInternalInventory( this, NUMBER_OF_PATTERN_SLOTS );
|
private final AppEngInternalInventory patterns = new AppEngInternalInventory( this, NUMBER_OF_PATTERN_SLOTS );
|
||||||
private final MEMonitorPassThrough<IAEItemStack> items = new MEMonitorPassThrough<>( new NullInventory<IAEItemStack>(), AEApi.instance()
|
private final MEMonitorPassThrough<IAEItemStack> items = new MEMonitorPassThrough<>( new NullInventory<IAEItemStack>(), AEApi.instance()
|
||||||
.storage()
|
.storage()
|
||||||
.getStorageChannel( IItemStorageChannel.class ) );
|
.getStorageChannel( IItemStorageChannel.class ) );
|
||||||
private final MEMonitorPassThrough<IAEFluidStack> fluids = new MEMonitorPassThrough<>( new NullInventory<IAEFluidStack>(), AEApi.instance()
|
private final MEMonitorPassThrough<IAEFluidStack> fluids = new MEMonitorPassThrough<>( new NullInventory<IAEFluidStack>(), AEApi.instance()
|
||||||
.storage()
|
.storage()
|
||||||
.getStorageChannel( IFluidStorageChannel.class ) );
|
.getStorageChannel( IFluidStorageChannel.class ) );
|
||||||
private final UpgradeInventory upgrades;
|
private final UpgradeInventory upgrades;
|
||||||
private boolean hasConfig = false;
|
private boolean hasConfig = false;
|
||||||
private int priority;
|
private int priority;
|
||||||
@@ -142,6 +142,9 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
private IMEInventory<IAEItemStack> destination;
|
private IMEInventory<IAEItemStack> destination;
|
||||||
private int isWorking = -1;
|
private int isWorking = -1;
|
||||||
private final Accessor accessor = new Accessor();
|
private final Accessor accessor = new Accessor();
|
||||||
|
private EnumSet<EnumFacing> visitedFaces = EnumSet.noneOf( EnumFacing.class );
|
||||||
|
private EnumMap<EnumFacing,List<ItemStack>> waitingToSendFacing = new EnumMap<>(EnumFacing.class);
|
||||||
|
private GTCEInventoryAdaptor GTad;
|
||||||
|
|
||||||
public DualityInterface( final AENetworkProxy networkProxy, final IInterfaceHost ih )
|
public DualityInterface( final AENetworkProxy networkProxy, final IInterfaceHost ih )
|
||||||
{
|
{
|
||||||
@@ -235,6 +238,27 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
data.setTag( "waitingToSend", waitingToSend );
|
data.setTag( "waitingToSend", waitingToSend );
|
||||||
|
|
||||||
|
NBTTagCompound sidedWaitList = new NBTTagCompound();
|
||||||
|
|
||||||
|
if (this.waitingToSendFacing != null)
|
||||||
|
{
|
||||||
|
for( EnumFacing s : this.iHost.getTargets() )
|
||||||
|
{
|
||||||
|
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 );
|
||||||
|
waitingListSided.appendTag( item );
|
||||||
|
}
|
||||||
|
sidedWaitList.setTag( s.name(), waitingListSided );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data.setTag( "sidedWaitList", sidedWaitList );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void readFromNBT( final NBTTagCompound data )
|
public void readFromNBT( final NBTTagCompound data )
|
||||||
@@ -254,6 +278,23 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.waitingToSendFacing = null;
|
||||||
|
final NBTTagCompound waitingListSided = data.getCompoundTag("sidedWaitList");
|
||||||
|
|
||||||
|
for (EnumFacing s : EnumFacing.values())
|
||||||
|
if (waitingListSided.hasKey( s.name() )) {
|
||||||
|
NBTTagList w = waitingListSided.getTagList( s.name(), 10 );
|
||||||
|
for( int x = 0; x < w.tagCount(); x++ )
|
||||||
|
{
|
||||||
|
final NBTTagCompound c = w.getCompoundTagAt( x );
|
||||||
|
if( c != null )
|
||||||
|
{
|
||||||
|
final ItemStack is = new ItemStack( c );
|
||||||
|
this.addToSendListFacing( is , EnumFacing.getFront( s.getIndex() ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.craftingTracker.readFromNBT( data );
|
this.craftingTracker.readFromNBT( data );
|
||||||
this.upgrades.readFromNBT( data, "upgrades" );
|
this.upgrades.readFromNBT( data, "upgrades" );
|
||||||
this.config.readFromNBT( data, "config" );
|
this.config.readFromNBT( data, "config" );
|
||||||
@@ -289,6 +330,30 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addToSendListFacing( final ItemStack is, EnumFacing f )
|
||||||
|
{
|
||||||
|
if( is.isEmpty() )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.waitingToSendFacing == null){
|
||||||
|
this.waitingToSendFacing = new EnumMap<>(EnumFacing.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.waitingToSendFacing.computeIfAbsent( f, k -> new ArrayList<>() );
|
||||||
|
|
||||||
|
this.waitingToSendFacing.get( f ).add( is );
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.gridProxy.getTick().wakeDevice( this.gridProxy.getNode() );
|
||||||
|
}
|
||||||
|
catch( final GridAccessException e )
|
||||||
|
{
|
||||||
|
// :P
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void readConfig()
|
private void readConfig()
|
||||||
{
|
{
|
||||||
this.hasConfig = false;
|
this.hasConfig = false;
|
||||||
@@ -386,24 +451,22 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasWorkToDo()
|
private boolean hasWorkToDo() {
|
||||||
{
|
|
||||||
if( this.hasItemsToSend() )
|
if (hasItemsToSend()){
|
||||||
{
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
for( final IAEItemStack requiredWork : this.requireWork )
|
|
||||||
{
|
|
||||||
if( requiredWork != null )
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
if(hasItemsToSendFacing()){
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (final IAEItemStack requiredWork : this.requireWork) {
|
||||||
|
if (requiredWork != null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updatePlan( final int slot )
|
private void updatePlan( final int slot )
|
||||||
@@ -430,14 +493,18 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
this.requireWork[slot] = req.copy();
|
this.requireWork[slot] = req.copy();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if( req.isSameType( stored ) ) // same type ( qty different? )!
|
else if( req.isSameType( stored ) ) // same type and quantity )!
|
||||||
{
|
{
|
||||||
if( req.getStackSize() != stored.getCount() )
|
if( req.getStackSize() == stored.getCount() )
|
||||||
|
{
|
||||||
|
this.requireWork[slot] = null;
|
||||||
|
}
|
||||||
|
else // same type ( qty different? )!
|
||||||
{
|
{
|
||||||
this.requireWork[slot] = req.copy();
|
this.requireWork[slot] = req.copy();
|
||||||
this.requireWork[slot].setStackSize( req.getStackSize() - stored.getCount() );
|
this.requireWork[slot].setStackSize( req.getStackSize() - stored.getCount() );
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
// Stored != null; dispose!
|
// Stored != null; dispose!
|
||||||
@@ -504,6 +571,21 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
return this.waitingToSend != null && !this.waitingToSend.isEmpty();
|
return this.waitingToSend != null && !this.waitingToSend.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean hasItemsToSendFacing()
|
||||||
|
{
|
||||||
|
if (waitingToSendFacing != null)
|
||||||
|
{
|
||||||
|
for( EnumFacing enumFacing : waitingToSendFacing.keySet() )
|
||||||
|
{
|
||||||
|
if( !waitingToSendFacing.get( enumFacing ).isEmpty() )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canInsert( final ItemStack stack )
|
public boolean canInsert( final ItemStack stack )
|
||||||
{
|
{
|
||||||
@@ -575,11 +657,21 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
return TickRateModulation.SLEEP;
|
return TickRateModulation.SLEEP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Previous version might have items saved in this list
|
||||||
|
//recover them
|
||||||
if( this.hasItemsToSend() )
|
if( this.hasItemsToSend() )
|
||||||
{
|
{
|
||||||
this.pushItemsOut( this.iHost.getTargets() );
|
this.pushItemsOut( this.iHost.getTargets() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hasItemsToSendFacing())
|
||||||
|
{
|
||||||
|
for( EnumFacing enumFacing : waitingToSendFacing.keySet() )
|
||||||
|
{
|
||||||
|
this.pushItemsOut( enumFacing );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final boolean couldDoWork = this.updateStorage();
|
final boolean couldDoWork = this.updateStorage();
|
||||||
return this.hasWorkToDo() ? ( couldDoWork ? TickRateModulation.URGENT : TickRateModulation.SLOWER ) : TickRateModulation.SLEEP;
|
return this.hasWorkToDo() ? ( couldDoWork ? TickRateModulation.URGENT : TickRateModulation.SLOWER ) : TickRateModulation.SLEEP;
|
||||||
}
|
}
|
||||||
@@ -640,6 +732,47 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void pushItemsOut( final EnumFacing s )
|
||||||
|
{
|
||||||
|
if (!this.waitingToSendFacing.containsKey(s) ||
|
||||||
|
(this.waitingToSendFacing.containsKey(s) && this.waitingToSendFacing.get( s ).isEmpty())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final TileEntity tile = this.iHost.getTileEntity();
|
||||||
|
final World w = tile.getWorld();
|
||||||
|
|
||||||
|
final TileEntity te = w.getTileEntity( tile.getPos().offset( s ) );
|
||||||
|
if( te == null )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Iterator<ItemStack> i = this.waitingToSendFacing.get( s ).iterator();
|
||||||
|
while ( i.hasNext() )
|
||||||
|
{
|
||||||
|
ItemStack whatToSend = i.next();
|
||||||
|
final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
||||||
|
if( ad != null )
|
||||||
|
{
|
||||||
|
final ItemStack result = ad.addItems( whatToSend );
|
||||||
|
if( !result.isEmpty() )
|
||||||
|
{
|
||||||
|
whatToSend.setCount( whatToSend.getCount() - ( whatToSend.getCount() - result.getCount() ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.waitingToSendFacing.get( s ).isEmpty() )
|
||||||
|
{
|
||||||
|
this.waitingToSendFacing.remove( s );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private boolean updateStorage()
|
private boolean updateStorage()
|
||||||
{
|
{
|
||||||
boolean didSomething = false;
|
boolean didSomething = false;
|
||||||
@@ -759,8 +892,17 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
{
|
{
|
||||||
if( this.getInstalledUpgrades( Upgrades.CRAFTING ) > 0 && itemStack != null )
|
if( this.getInstalledUpgrades( Upgrades.CRAFTING ) > 0 && itemStack != null )
|
||||||
{
|
{
|
||||||
return this.craftingTracker.handleCrafting( x, itemStack.getStackSize(), itemStack, d, this.iHost.getTileEntity().getWorld(),
|
if (this.failedCraftTriesSlot[x] <= 0)
|
||||||
|
{
|
||||||
|
boolean crafted = this.craftingTracker.handleCrafting( x, itemStack.getStackSize(), itemStack, d, this.iHost.getTileEntity().getWorld(),
|
||||||
this.gridProxy.getGrid(), this.gridProxy.getCrafting(), this.mySource );
|
this.gridProxy.getGrid(), this.gridProxy.getCrafting(), this.mySource );
|
||||||
|
|
||||||
|
if (crafted) this.failedCraftTriesSlot[x] = 0;
|
||||||
|
else{
|
||||||
|
this.failedCraftTriesSlot[x] += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.failedCraftTriesSlot[x] -= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch( final GridAccessException e )
|
catch( final GridAccessException e )
|
||||||
@@ -893,10 +1035,20 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean invIsBlocked( InventoryAdaptor inv )
|
||||||
|
{
|
||||||
|
return (inv.containsItems());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean invIsBlockedGTCE( GTCEInventoryAdaptor inv )
|
||||||
|
{
|
||||||
|
return ( !inv.canRemoveAllExceptCircuits() );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean pushPattern( final ICraftingPatternDetails patternDetails, final InventoryCrafting table )
|
public boolean pushPattern( final ICraftingPatternDetails patternDetails, final InventoryCrafting table )
|
||||||
{
|
{
|
||||||
if( this.hasItemsToSend() || !this.gridProxy.isActive() || !this.craftingList.contains( patternDetails ) )
|
if( this.hasItemsToSend() || this.hasItemsToSendFacing() || !this.gridProxy.isActive() || !this.craftingList.contains( patternDetails ) )
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -904,8 +1056,12 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
final TileEntity tile = this.iHost.getTileEntity();
|
final TileEntity tile = this.iHost.getTileEntity();
|
||||||
final World w = tile.getWorld();
|
final World w = tile.getWorld();
|
||||||
|
|
||||||
final EnumSet<EnumFacing> possibleDirections = this.iHost.getTargets();
|
if( this.visitedFaces.isEmpty() )
|
||||||
for( final EnumFacing s : possibleDirections )
|
{
|
||||||
|
this.visitedFaces = this.iHost.getTargets();
|
||||||
|
}
|
||||||
|
|
||||||
|
for( final EnumFacing s : visitedFaces )
|
||||||
{
|
{
|
||||||
final TileEntity te = w.getTileEntity( tile.getPos().offset( s ) );
|
final TileEntity te = w.getTileEntity( tile.getPos().offset( s ) );
|
||||||
if( te instanceof IInterfaceHost )
|
if( te instanceof IInterfaceHost )
|
||||||
@@ -914,6 +1070,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
{
|
{
|
||||||
if( ( (IInterfaceHost) te ).getInterfaceDuality().sameGrid( this.gridProxy.getGrid() ) )
|
if( ( (IInterfaceHost) te ).getInterfaceDuality().sameGrid( this.gridProxy.getGrid() ) )
|
||||||
{
|
{
|
||||||
|
visitedFaces.remove( s );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -928,6 +1085,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
final ICraftingMachine cm = (ICraftingMachine) te;
|
final ICraftingMachine cm = (ICraftingMachine) te;
|
||||||
if( cm.acceptsPlans() )
|
if( cm.acceptsPlans() )
|
||||||
{
|
{
|
||||||
|
visitedFaces.remove( s );
|
||||||
if( cm.pushPattern( patternDetails, table, s.getOpposite() ) )
|
if( cm.pushPattern( patternDetails, table, s.getOpposite() ) )
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
@@ -941,42 +1099,67 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
{
|
{
|
||||||
if( this.isBlocking() )
|
if( this.isBlocking() )
|
||||||
{
|
{
|
||||||
if( !ad.simulateRemove( 1, ItemStack.EMPTY, null ).isEmpty() )
|
IPhantomTile phantomTE = null;
|
||||||
|
if( Loader.isModLoaded( "actuallyadditions" ) && Loader.isModLoaded( "gregtech" ) && te instanceof IPhantomTile )
|
||||||
{
|
{
|
||||||
|
phantomTE = ( (IPhantomTile) te );
|
||||||
|
if( phantomTE.hasBoundPosition() )
|
||||||
|
{
|
||||||
|
TileEntity phantom = w.getTileEntity( phantomTE.getBoundPosition() );
|
||||||
|
if( phantom instanceof MetaTileEntityHolder && isGTCEblocked( phantom, s ) )
|
||||||
|
{
|
||||||
|
visitedFaces.remove( s );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if( Loader.isModLoaded( "gregtech" ) && te instanceof MetaTileEntityHolder )
|
||||||
|
{
|
||||||
|
if( isGTCEblocked( te, s ) )
|
||||||
|
{
|
||||||
|
visitedFaces.remove( s );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if( invIsBlocked( ad ) )
|
||||||
|
{
|
||||||
|
visitedFaces.remove( s );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( this.acceptsItems( ad, table ) )
|
if( this.acceptsItems( ad, table ) )
|
||||||
{
|
{
|
||||||
|
visitedFaces.remove( s );
|
||||||
for( int x = 0; x < table.getSizeInventory(); x++ )
|
for( int x = 0; x < table.getSizeInventory(); x++ )
|
||||||
{
|
{
|
||||||
final ItemStack is = table.getStackInSlot( x );
|
final ItemStack is = table.getStackInSlot( x );
|
||||||
if( !is.isEmpty() )
|
if( !is.isEmpty() )
|
||||||
{
|
{
|
||||||
final ItemStack added = ad.addItems( is );
|
addToSendListFacing( is, s );
|
||||||
this.addToSendList( added );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.pushItemsOut( possibleDirections );
|
pushItemsOut( s );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
visitedFaces.remove( s );
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isBusy()
|
public boolean isBusy()
|
||||||
{
|
{
|
||||||
if( this.hasItemsToSend() )
|
boolean busy = false;
|
||||||
|
|
||||||
|
if( this.hasItemsToSend() || hasItemsToSendFacing() )
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean busy = false;
|
|
||||||
|
|
||||||
if( this.isBlocking() )
|
if( this.isBlocking() )
|
||||||
{
|
{
|
||||||
final EnumSet<EnumFacing> possibleDirections = this.iHost.getTargets();
|
final EnumSet<EnumFacing> possibleDirections = this.iHost.getTargets();
|
||||||
@@ -988,24 +1171,52 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
for( final EnumFacing s : possibleDirections )
|
for( final EnumFacing s : possibleDirections )
|
||||||
{
|
{
|
||||||
final TileEntity te = w.getTileEntity( tile.getPos().offset( s ) );
|
final TileEntity te = w.getTileEntity( tile.getPos().offset( s ) );
|
||||||
|
IPhantomTile phantomTE = null;
|
||||||
|
|
||||||
final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
||||||
if( ad != null )
|
if( ad != null )
|
||||||
{
|
{
|
||||||
if( ad.simulateRemove( 1, ItemStack.EMPTY, null ).isEmpty() )
|
if( Loader.isModLoaded( "actuallyadditions") && Loader.isModLoaded( "gregtech" ) && te instanceof IPhantomTile )
|
||||||
|
{
|
||||||
|
phantomTE = ( (IPhantomTile) te );
|
||||||
|
if( phantomTE.hasBoundPosition() )
|
||||||
|
{
|
||||||
|
TileEntity phantom = w.getTileEntity( phantomTE.getBoundPosition() );
|
||||||
|
if( phantom instanceof MetaTileEntityHolder && !isGTCEblocked( phantom, s ) )
|
||||||
|
{
|
||||||
|
allAreBusy = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if( Loader.isModLoaded( "gregtech" ) && te instanceof MetaTileEntityHolder )
|
||||||
|
{
|
||||||
|
if( !isGTCEblocked( te, s ) )
|
||||||
|
{
|
||||||
|
allAreBusy = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if( !invIsBlocked( ad ) )
|
||||||
{
|
{
|
||||||
allAreBusy = false;
|
allAreBusy = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
busy = allAreBusy;
|
busy = allAreBusy;
|
||||||
}
|
}
|
||||||
|
|
||||||
return busy;
|
return busy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean isGTCEblocked(TileEntity te, EnumFacing s)
|
||||||
|
{
|
||||||
|
GTad = GTCEInventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
||||||
|
return invIsBlockedGTCE( GTad );
|
||||||
|
}
|
||||||
|
|
||||||
private boolean sameGrid( final IGrid grid ) throws GridAccessException
|
private boolean sameGrid( final IGrid grid ) throws GridAccessException
|
||||||
{
|
{
|
||||||
return grid == this.gridProxy.getGrid();
|
return grid == this.gridProxy.getGrid();
|
||||||
@@ -1061,6 +1272,20 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( this.waitingToSendFacing != null )
|
||||||
|
{
|
||||||
|
for (List<ItemStack> itemList : waitingToSendFacing.values())
|
||||||
|
{
|
||||||
|
for (final ItemStack is : itemList)
|
||||||
|
{
|
||||||
|
if (!is.isEmpty())
|
||||||
|
{
|
||||||
|
drops.add(is);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for( final ItemStack is : this.upgrades )
|
for( final ItemStack is : this.upgrades )
|
||||||
{
|
{
|
||||||
if( !is.isEmpty() )
|
if( !is.isEmpty() )
|
||||||
@@ -1184,6 +1409,13 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
final IBlockState directedBlockState = hostWorld.getBlockState( targ );
|
final IBlockState directedBlockState = hostWorld.getBlockState( targ );
|
||||||
final Block directedBlock = directedBlockState.getBlock();
|
final Block directedBlock = directedBlockState.getBlock();
|
||||||
ItemStack what = new ItemStack( directedBlock, 1, directedBlock.getMetaFromState( directedBlockState ) );
|
ItemStack what = new ItemStack( directedBlock, 1, directedBlock.getMetaFromState( directedBlockState ) );
|
||||||
|
|
||||||
|
if ( Loader.isModLoaded("gregtech") && directedBlock instanceof BlockMachine )
|
||||||
|
{
|
||||||
|
MetaTileEntity metaTileEntity = getMetaTileEntity(hostWorld, targ);
|
||||||
|
return metaTileEntity.getMetaFullName();
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Vec3d from = new Vec3d( hostTile.getPos().getX() + 0.5, hostTile.getPos().getY() + 0.5, hostTile.getPos().getZ() + 0.5 );
|
Vec3d from = new Vec3d( hostTile.getPos().getX() + 0.5, hostTile.getPos().getY() + 0.5, hostTile.getPos().getZ() + 0.5 );
|
||||||
|
|||||||
@@ -0,0 +1,98 @@
|
|||||||
|
package appeng.helpers;
|
||||||
|
|
||||||
|
import appeng.client.render.BlockPosHighlighter;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.entity.EntityPlayerSP;
|
||||||
|
import net.minecraft.client.renderer.BufferBuilder;
|
||||||
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
|
import net.minecraft.client.renderer.Tessellator;
|
||||||
|
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraftforge.client.event.RenderWorldLastEvent;
|
||||||
|
import org.lwjgl.opengl.GL11;
|
||||||
|
|
||||||
|
// taken from McJty's McJtyLib
|
||||||
|
|
||||||
|
public class HighlighterHandler
|
||||||
|
{
|
||||||
|
|
||||||
|
public static void tick( RenderWorldLastEvent event ) {
|
||||||
|
renderHilightedBlock(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void renderHilightedBlock( RenderWorldLastEvent event ) {
|
||||||
|
BlockPos c = BlockPosHighlighter.getHilightedBlock();
|
||||||
|
if (c == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Minecraft mc = Minecraft.getMinecraft();
|
||||||
|
int dimension = mc.world.provider.getDimension();
|
||||||
|
long time = System.currentTimeMillis();
|
||||||
|
|
||||||
|
if (time > BlockPosHighlighter.getExpireHilight() || dimension != BlockPosHighlighter.getDimension()) {
|
||||||
|
BlockPosHighlighter.hilightBlock(null, -1, BlockPosHighlighter.getDimension() );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (((time / 500) & 1) == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
EntityPlayerSP p = mc.player;
|
||||||
|
double doubleX = p.lastTickPosX + (p.posX - p.lastTickPosX) * event.getPartialTicks();
|
||||||
|
double doubleY = p.lastTickPosY + (p.posY - p.lastTickPosY) * event.getPartialTicks();
|
||||||
|
double doubleZ = p.lastTickPosZ + (p.posZ - p.lastTickPosZ) * event.getPartialTicks();
|
||||||
|
|
||||||
|
GlStateManager.pushMatrix();
|
||||||
|
GlStateManager.color(1.0f, 0, 0);
|
||||||
|
GlStateManager.glLineWidth(3);
|
||||||
|
GlStateManager.translate(-doubleX, -doubleY, -doubleZ);
|
||||||
|
|
||||||
|
GlStateManager.disableDepth();
|
||||||
|
GlStateManager.disableTexture2D();
|
||||||
|
|
||||||
|
Tessellator tessellator = Tessellator.getInstance();
|
||||||
|
BufferBuilder buffer = tessellator.getBuffer();
|
||||||
|
float mx = c.getX();
|
||||||
|
float my = c.getY();
|
||||||
|
float mz = c.getZ();
|
||||||
|
buffer.begin( GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR);
|
||||||
|
renderHighLightedBlocksOutline(buffer, mx, my, mz, 1.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
tessellator.draw();
|
||||||
|
|
||||||
|
GlStateManager.enableTexture2D();
|
||||||
|
GlStateManager.enableDepth();
|
||||||
|
GlStateManager.popMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void renderHighLightedBlocksOutline(BufferBuilder buffer, float mx, float my, float mz, float r, float g, float b, float a) {
|
||||||
|
buffer.pos(mx, my, mz).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx + 1, my, mz).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx, my, mz).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx, my + 1, mz).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx, my, mz).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx, my, mz + 1).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx + 1, my + 1, mz + 1).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx, my + 1, mz + 1).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx + 1, my + 1, mz + 1).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx + 1, my, mz + 1).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx + 1, my + 1, mz + 1).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx + 1, my + 1, mz).color(r, g, b, a).endVertex();
|
||||||
|
|
||||||
|
buffer.pos(mx, my + 1, mz).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx, my + 1, mz + 1).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx, my + 1, mz).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx + 1, my + 1, mz).color(r, g, b, a).endVertex();
|
||||||
|
|
||||||
|
buffer.pos(mx + 1, my, mz).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx + 1, my, mz + 1).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx + 1, my, mz).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx + 1, my + 1, mz).color(r, g, b, a).endVertex();
|
||||||
|
|
||||||
|
buffer.pos(mx, my, mz + 1).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx + 1, my, mz + 1).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx, my, mz + 1).color(r, g, b, a).endVertex();
|
||||||
|
buffer.pos(mx, my + 1, mz + 1).color(r, g, b, a).endVertex();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -43,5 +43,6 @@ public enum InventoryAction
|
|||||||
ROLL_UP,
|
ROLL_UP,
|
||||||
ROLL_DOWN,
|
ROLL_DOWN,
|
||||||
AUTO_CRAFT,
|
AUTO_CRAFT,
|
||||||
PLACE_SINGLE
|
PLACE_SINGLE,
|
||||||
|
PLACE_JEI_GHOST_ITEM
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -192,12 +192,11 @@ public class TickHandler
|
|||||||
final Collection<CraftingJob> jobSet = this.craftingJobs.get( wte.world );
|
final Collection<CraftingJob> jobSet = this.craftingJobs.get( wte.world );
|
||||||
if( !jobSet.isEmpty() )
|
if( !jobSet.isEmpty() )
|
||||||
{
|
{
|
||||||
final int simTime = Math.max( 1, AEConfig.instance().getCraftingCalculationTimePerTick() / jobSet.size() );
|
|
||||||
final Iterator<CraftingJob> i = jobSet.iterator();
|
final Iterator<CraftingJob> i = jobSet.iterator();
|
||||||
while( i.hasNext() )
|
while( i.hasNext() )
|
||||||
{
|
{
|
||||||
final CraftingJob cj = i.next();
|
final CraftingJob cj = i.next();
|
||||||
if( !cj.simulateFor( simTime ) )
|
if( !cj.simulateFor() )
|
||||||
{
|
{
|
||||||
i.remove();
|
i.remove();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package appeng.integration.modules.gregtech;
|
||||||
|
|
||||||
|
import appeng.util.inv.ItemSlot;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
|
import net.minecraftforge.items.CapabilityItemHandler;
|
||||||
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
|
public abstract class GTCEInventoryAdaptor implements Iterable<ItemSlot>
|
||||||
|
{
|
||||||
|
public static GTCEInventoryAdaptor getAdaptor(final TileEntity te, final EnumFacing d)
|
||||||
|
{
|
||||||
|
if (te != null && te.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d))
|
||||||
|
{
|
||||||
|
// Attempt getting an IItemHandler for the given side via caps
|
||||||
|
IItemHandler itemHandler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d);
|
||||||
|
if (itemHandler != null)
|
||||||
|
{
|
||||||
|
return new GTCEItemHandler(itemHandler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract boolean canRemoveAllExceptCircuits();
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
package appeng.integration.modules.gregtech;
|
||||||
|
|
||||||
|
import appeng.util.inv.ItemHandlerIterator;
|
||||||
|
import appeng.util.inv.ItemSlot;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
public class GTCEItemHandler extends GTCEInventoryAdaptor
|
||||||
|
{
|
||||||
|
ArrayList<Integer> GTCElenses = new ArrayList<>(Arrays.asList(15085,15214,15092,15111,15113,15219,15218,15243,15244,15209,15117,15206,15216,15331,15212,15213,15154,15122,15157,15190,15247));
|
||||||
|
ArrayList<Integer> GTCEmolds = new ArrayList<>(Arrays.asList(32301,32303,32304,32305,32306,32307,32308,32309,32313,32314,32315,32317,32350,32351,32352,32353,32354,32355,32356,32358,32359,32360,32361,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373));
|
||||||
|
Item smallGearExtruderShape = Item.getByNameOrId("contenttweaker:smallgearextrudershape");
|
||||||
|
Item creativePortableTankMold = Item.getByNameOrId("contenttweaker:creativeportabletankmold");
|
||||||
|
|
||||||
|
protected final IItemHandler itemHandler;
|
||||||
|
|
||||||
|
public GTCEItemHandler(IItemHandler itemHandler)
|
||||||
|
{
|
||||||
|
this.itemHandler = itemHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isBlockableItem(ItemStack stack)
|
||||||
|
{
|
||||||
|
if ( stack.getItem() == Item.getByNameOrId("gregtech:meta_item_1") ) {
|
||||||
|
int metadata = stack.getItemDamage();
|
||||||
|
if ( metadata == 32766 || GTCElenses.contains(metadata) || GTCEmolds.contains(metadata)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( stack.getItem() == smallGearExtruderShape ) return false;
|
||||||
|
if ( stack.getItem() == creativePortableTankMold) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canRemoveAllExceptCircuits()
|
||||||
|
{
|
||||||
|
int slots = this.itemHandler.getSlots();
|
||||||
|
for ( int slot = 0; slot < slots; slot++ ) {
|
||||||
|
ItemStack is = this.itemHandler.getStackInSlot(slot);
|
||||||
|
if ( is.isEmpty() || !isBlockableItem(is) ) continue;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<ItemSlot> iterator()
|
||||||
|
{
|
||||||
|
return new ItemHandlerIterator( this.itemHandler );
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,20 +19,21 @@
|
|||||||
package appeng.integration.modules.jei;
|
package appeng.integration.modules.jei;
|
||||||
|
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import appeng.client.gui.AEGuiHandler;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
|
import mezz.jei.api.*;
|
||||||
|
import mezz.jei.config.Constants;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
import mezz.jei.api.IJeiRuntime;
|
|
||||||
import mezz.jei.api.IModPlugin;
|
|
||||||
import mezz.jei.api.IModRegistry;
|
|
||||||
import mezz.jei.api.ISubtypeRegistry;
|
|
||||||
import mezz.jei.api.recipe.IRecipeCategoryRegistration;
|
import mezz.jei.api.recipe.IRecipeCategoryRegistration;
|
||||||
import mezz.jei.api.recipe.VanillaRecipeCategoryUid;
|
import mezz.jei.api.recipe.VanillaRecipeCategoryUid;
|
||||||
|
|
||||||
@@ -55,6 +56,9 @@ import appeng.items.parts.ItemFacade;
|
|||||||
@mezz.jei.api.JEIPlugin
|
@mezz.jei.api.JEIPlugin
|
||||||
public class JEIPlugin implements IModPlugin
|
public class JEIPlugin implements IModPlugin
|
||||||
{
|
{
|
||||||
|
public static IJeiRuntime runtime;
|
||||||
|
public static AEGuiHandler aeGuiHandler;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerItemSubtypes( ISubtypeRegistry subtypeRegistry )
|
public void registerItemSubtypes( ISubtypeRegistry subtypeRegistry )
|
||||||
{
|
{
|
||||||
@@ -91,7 +95,11 @@ public class JEIPlugin implements IModPlugin
|
|||||||
VanillaRecipeCategoryUid.CRAFTING );
|
VanillaRecipeCategoryUid.CRAFTING );
|
||||||
registry.getRecipeTransferRegistry()
|
registry.getRecipeTransferRegistry()
|
||||||
.addRecipeTransferHandler( new RecipeTransferHandler<>( ContainerPatternTerm.class ),
|
.addRecipeTransferHandler( new RecipeTransferHandler<>( ContainerPatternTerm.class ),
|
||||||
VanillaRecipeCategoryUid.CRAFTING );
|
Constants.UNIVERSAL_RECIPE_TRANSFER_UID );
|
||||||
|
|
||||||
|
aeGuiHandler = new AEGuiHandler();
|
||||||
|
registry.addAdvancedGuiHandlers(aeGuiHandler);
|
||||||
|
registry.addGhostIngredientHandler( aeGuiHandler.getGuiContainerClass(), aeGuiHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerDescriptions( IDefinitions definitions, IModRegistry registry )
|
private void registerDescriptions( IDefinitions definitions, IModRegistry registry )
|
||||||
@@ -214,5 +222,6 @@ public class JEIPlugin implements IModPlugin
|
|||||||
{
|
{
|
||||||
JEIModule jeiModule = (JEIModule) Integrations.jei();
|
JEIModule jeiModule = (JEIModule) Integrations.jei();
|
||||||
jeiModule.setJei( new JeiRuntimeAdapter( jeiRuntime ) );
|
jeiModule.setJei( new JeiRuntimeAdapter( jeiRuntime ) );
|
||||||
|
runtime = jeiRuntime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,12 @@ import java.util.Map;
|
|||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import appeng.container.implementations.ContainerPatternTerm;
|
||||||
|
import appeng.core.sync.packets.PacketValueConfig;
|
||||||
|
import mezz.jei.api.recipe.VanillaRecipeCategoryUid;
|
||||||
|
import mezz.jei.transfer.RecipeTransferErrorInternal;
|
||||||
|
import mezz.jei.transfer.RecipeTransferErrorTooltip;
|
||||||
|
import net.minecraft.client.resources.I18n;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.inventory.Container;
|
import net.minecraft.inventory.Container;
|
||||||
import net.minecraft.inventory.Slot;
|
import net.minecraft.inventory.Slot;
|
||||||
@@ -66,15 +72,47 @@ class RecipeTransferHandler<T extends Container> implements IRecipeTransferHandl
|
|||||||
@Override
|
@Override
|
||||||
public IRecipeTransferError transferRecipe( T container, IRecipeLayout recipeLayout, EntityPlayer player, boolean maxTransfer, boolean doTransfer )
|
public IRecipeTransferError transferRecipe( T container, IRecipeLayout recipeLayout, EntityPlayer player, boolean maxTransfer, boolean doTransfer )
|
||||||
{
|
{
|
||||||
|
final String recipeType = recipeLayout.getRecipeCategory().getUid();
|
||||||
|
|
||||||
|
if (recipeType.equals( VanillaRecipeCategoryUid.INFORMATION) || recipeType.equals(VanillaRecipeCategoryUid.FUEL))
|
||||||
|
{
|
||||||
|
return RecipeTransferErrorInternal.INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
if( !doTransfer )
|
if( !doTransfer )
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( container instanceof ContainerPatternTerm )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if( !( (ContainerPatternTerm) container ).isCraftingMode() )
|
||||||
|
{
|
||||||
|
if( recipeType.equals( VanillaRecipeCategoryUid.CRAFTING ) )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.CraftMode", "1" ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( !recipeType.equals( VanillaRecipeCategoryUid.CRAFTING ) )
|
||||||
|
{
|
||||||
|
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.CraftMode", "0" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch( IOException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Map<Integer, ? extends IGuiIngredient<ItemStack>> ingredients = recipeLayout.getItemStacks().getGuiIngredients();
|
Map<Integer, ? extends IGuiIngredient<ItemStack>> ingredients = recipeLayout.getItemStacks().getGuiIngredients();
|
||||||
|
|
||||||
final NBTTagCompound recipe = new NBTTagCompound();
|
final NBTTagCompound recipe = new NBTTagCompound();
|
||||||
|
final NBTTagList outputs = new NBTTagList();
|
||||||
|
|
||||||
|
|
||||||
int slotIndex = 0;
|
int slotIndex = 0;
|
||||||
for( Map.Entry<Integer, ? extends IGuiIngredient<ItemStack>> ingredientEntry : ingredients.entrySet() )
|
for( Map.Entry<Integer, ? extends IGuiIngredient<ItemStack>> ingredientEntry : ingredients.entrySet() )
|
||||||
@@ -82,6 +120,13 @@ class RecipeTransferHandler<T extends Container> implements IRecipeTransferHandl
|
|||||||
IGuiIngredient<ItemStack> ingredient = ingredientEntry.getValue();
|
IGuiIngredient<ItemStack> ingredient = ingredientEntry.getValue();
|
||||||
if( !ingredient.isInput() )
|
if( !ingredient.isInput() )
|
||||||
{
|
{
|
||||||
|
ItemStack output = ingredient.getDisplayedIngredient();
|
||||||
|
if( output != null )
|
||||||
|
{
|
||||||
|
final NBTTagCompound tag = new NBTTagCompound();
|
||||||
|
output.writeToNBT( tag );
|
||||||
|
outputs.appendTag( tag );
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,6 +175,8 @@ class RecipeTransferHandler<T extends Container> implements IRecipeTransferHandl
|
|||||||
slotIndex++;
|
slotIndex++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
recipe.setTag( "outputs", outputs );
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
NetworkHandler.instance().sendToServer( new PacketJEIRecipe( recipe ) );
|
NetworkHandler.instance().sendToServer( new PacketJEIRecipe( recipe ) );
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public class ItemEncodedPattern extends AEBaseItem implements ICraftingPatternIt
|
|||||||
|
|
||||||
public ItemEncodedPattern()
|
public ItemEncodedPattern()
|
||||||
{
|
{
|
||||||
this.setMaxStackSize( 1 );
|
this.setMaxStackSize( 64 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ import appeng.api.util.IReadOnlyCollection;
|
|||||||
import appeng.core.worlddata.WorldData;
|
import appeng.core.worlddata.WorldData;
|
||||||
import appeng.hooks.TickHandler;
|
import appeng.hooks.TickHandler;
|
||||||
import appeng.util.ReadOnlyCollection;
|
import appeng.util.ReadOnlyCollection;
|
||||||
|
import appeng.me.cache.CraftingGridCache;
|
||||||
|
|
||||||
|
|
||||||
public class Grid implements IGrid
|
public class Grid implements IGrid
|
||||||
@@ -219,7 +220,10 @@ public class Grid implements IGrid
|
|||||||
@Override
|
@Override
|
||||||
public MENetworkEvent postEvent( final MENetworkEvent ev )
|
public MENetworkEvent postEvent( final MENetworkEvent ev )
|
||||||
{
|
{
|
||||||
return this.eventBus.postEvent( this, ev );
|
CraftingGridCache.pauseRebuilds();
|
||||||
|
final MENetworkEvent ret = this.eventBus.postEvent( this, ev );
|
||||||
|
CraftingGridCache.unpauseRebuilds();
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ import appeng.api.util.IReadOnlyCollection;
|
|||||||
import appeng.core.AELog;
|
import appeng.core.AELog;
|
||||||
import appeng.core.worlddata.WorldData;
|
import appeng.core.worlddata.WorldData;
|
||||||
import appeng.hooks.TickHandler;
|
import appeng.hooks.TickHandler;
|
||||||
|
import appeng.me.cache.CraftingGridCache;
|
||||||
import appeng.me.pathfinding.IPathItem;
|
import appeng.me.pathfinding.IPathItem;
|
||||||
import appeng.util.IWorldCallable;
|
import appeng.util.IWorldCallable;
|
||||||
import appeng.util.ReadOnlyCollection;
|
import appeng.util.ReadOnlyCollection;
|
||||||
@@ -164,6 +165,8 @@ public class GridNode implements IGridNode, IPathItem
|
|||||||
{
|
{
|
||||||
final Object tracker = new Object();
|
final Object tracker = new Object();
|
||||||
|
|
||||||
|
CraftingGridCache.pauseRebuilds();
|
||||||
|
|
||||||
Deque<GridNode> nextRun = new ArrayDeque<>();
|
Deque<GridNode> nextRun = new ArrayDeque<>();
|
||||||
nextRun.add( this );
|
nextRun.add( this );
|
||||||
|
|
||||||
@@ -203,6 +206,7 @@ public class GridNode implements IGridNode, IPathItem
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
CraftingGridCache.unpauseRebuilds();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -114,6 +114,8 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
|
|||||||
private IStorageGrid storageGrid;
|
private IStorageGrid storageGrid;
|
||||||
private IEnergyGrid energyGrid;
|
private IEnergyGrid energyGrid;
|
||||||
private boolean updateList = false;
|
private boolean updateList = false;
|
||||||
|
private static int pauseRebuilds = 0;
|
||||||
|
private static Set<CraftingGridCache> rebuildNeeded = new HashSet<>();
|
||||||
|
|
||||||
public CraftingGridCache( final IGrid grid )
|
public CraftingGridCache( final IGrid grid )
|
||||||
{
|
{
|
||||||
@@ -240,8 +242,34 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
|
|||||||
// nothing!
|
// nothing!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void pauseRebuilds()
|
||||||
|
{
|
||||||
|
pauseRebuilds++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void unpauseRebuilds()
|
||||||
|
{
|
||||||
|
pauseRebuilds--;
|
||||||
|
if (pauseRebuilds == 0 && rebuildNeeded.size() > 0)
|
||||||
|
{
|
||||||
|
ImmutableSet<CraftingGridCache> needed = ImmutableSet.copyOf(rebuildNeeded);
|
||||||
|
rebuildNeeded.clear();
|
||||||
|
for ( CraftingGridCache cache: needed )
|
||||||
|
{
|
||||||
|
cache.updatePatterns();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void updatePatterns()
|
private void updatePatterns()
|
||||||
{
|
{
|
||||||
|
// coalesce change events during a grid traversal to a single rebuild
|
||||||
|
if (pauseRebuilds != 0)
|
||||||
|
{
|
||||||
|
rebuildNeeded.add(this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
final Map<IAEItemStack, ImmutableList<ICraftingPatternDetails>> oldItems = this.craftableItems;
|
final Map<IAEItemStack, ImmutableList<ICraftingPatternDetails>> oldItems = this.craftableItems;
|
||||||
|
|
||||||
// erase list.
|
// erase list.
|
||||||
|
|||||||
+6
-4
@@ -44,6 +44,8 @@ import appeng.api.storage.IStorageChannel;
|
|||||||
import appeng.api.storage.data.IAEStack;
|
import appeng.api.storage.data.IAEStack;
|
||||||
import appeng.api.storage.data.IItemList;
|
import appeng.api.storage.data.IItemList;
|
||||||
import appeng.me.storage.ItemWatcher;
|
import appeng.me.storage.ItemWatcher;
|
||||||
|
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
|
||||||
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
|
|
||||||
|
|
||||||
public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
||||||
@@ -58,7 +60,7 @@ public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
|||||||
@Nonnull
|
@Nonnull
|
||||||
private final IItemList<T> cachedList;
|
private final IItemList<T> cachedList;
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final Map<IMEMonitorHandlerReceiver<T>, Object> listeners;
|
private final Object2ObjectMap<IMEMonitorHandlerReceiver<T>, Object> listeners;
|
||||||
|
|
||||||
private boolean sendEvent = false;
|
private boolean sendEvent = false;
|
||||||
private boolean hasChanged = false;
|
private boolean hasChanged = false;
|
||||||
@@ -70,7 +72,7 @@ public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
|||||||
this.myGridCache = cache;
|
this.myGridCache = cache;
|
||||||
this.myChannel = chan;
|
this.myChannel = chan;
|
||||||
this.cachedList = chan.createList();
|
this.cachedList = chan.createList();
|
||||||
this.listeners = new HashMap<>();
|
this.listeners = new Object2ObjectOpenHashMap<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -139,9 +141,9 @@ public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
|||||||
@Override
|
@Override
|
||||||
public IItemList<T> getStorageList()
|
public IItemList<T> getStorageList()
|
||||||
{
|
{
|
||||||
if( this.hasChanged )
|
if( hasChanged )
|
||||||
{
|
{
|
||||||
this.hasChanged = false;
|
hasChanged = false;
|
||||||
this.cachedList.resetStatus();
|
this.cachedList.resetStatus();
|
||||||
return this.getAvailableItems( this.cachedList );
|
return this.getAvailableItems( this.cachedList );
|
||||||
}
|
}
|
||||||
|
|||||||
+44
-38
@@ -19,9 +19,9 @@
|
|||||||
package appeng.me.cache;
|
package appeng.me.cache;
|
||||||
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.*;
|
||||||
import java.util.PriorityQueue;
|
|
||||||
|
|
||||||
|
import appeng.parts.automation.PartLevelEmitter;
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
|
|
||||||
import net.minecraft.crash.CrashReport;
|
import net.minecraft.crash.CrashReport;
|
||||||
@@ -46,7 +46,9 @@ public class TickManagerCache implements ITickManager
|
|||||||
private final HashMap<IGridNode, TickTracker> alertable = new HashMap<>();
|
private final HashMap<IGridNode, TickTracker> alertable = new HashMap<>();
|
||||||
private final HashMap<IGridNode, TickTracker> sleeping = new HashMap<>();
|
private final HashMap<IGridNode, TickTracker> sleeping = new HashMap<>();
|
||||||
private final HashMap<IGridNode, TickTracker> awake = new HashMap<>();
|
private final HashMap<IGridNode, TickTracker> awake = new HashMap<>();
|
||||||
|
private final HashMap<IGridNode, TickTracker> laterTicker = new HashMap<>();
|
||||||
private final PriorityQueue<TickTracker> upcomingTicks = new PriorityQueue<>();
|
private final PriorityQueue<TickTracker> upcomingTicks = new PriorityQueue<>();
|
||||||
|
|
||||||
private long currentTick = 0;
|
private long currentTick = 0;
|
||||||
|
|
||||||
public TickManagerCache( final IGrid g )
|
public TickManagerCache( final IGrid g )
|
||||||
@@ -80,50 +82,52 @@ public class TickManagerCache implements ITickManager
|
|||||||
public void onUpdateTick()
|
public void onUpdateTick()
|
||||||
{
|
{
|
||||||
TickTracker tt = null;
|
TickTracker tt = null;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.currentTick++;
|
this.currentTick++;
|
||||||
while( !this.upcomingTicks.isEmpty() )
|
|
||||||
|
while ( !this.upcomingTicks.isEmpty() )
|
||||||
{
|
{
|
||||||
tt = this.upcomingTicks.peek();
|
tt = this.upcomingTicks.peek();
|
||||||
final int diff = (int) ( this.currentTick - tt.getLastTick() );
|
|
||||||
if( diff >= tt.getCurrentRate() )
|
// Stop once it reaches a TickTracker running at a later tick
|
||||||
|
if( tt.getNextTick() > this.currentTick )
|
||||||
{
|
{
|
||||||
// remove tt..
|
break;
|
||||||
this.upcomingTicks.poll();
|
|
||||||
final TickRateModulation mod = tt.getGridTickable().tickingRequest( tt.getNode(), diff );
|
|
||||||
|
|
||||||
switch( mod )
|
|
||||||
{
|
|
||||||
case FASTER:
|
|
||||||
tt.setRate( tt.getCurrentRate() - 2 );
|
|
||||||
break;
|
|
||||||
case IDLE:
|
|
||||||
tt.setRate( tt.getRequest().maxTickRate );
|
|
||||||
break;
|
|
||||||
case SAME:
|
|
||||||
break;
|
|
||||||
case SLEEP:
|
|
||||||
this.sleepDevice( tt.getNode() );
|
|
||||||
break;
|
|
||||||
case SLOWER:
|
|
||||||
tt.setRate( tt.getCurrentRate() + 1 );
|
|
||||||
break;
|
|
||||||
case URGENT:
|
|
||||||
tt.setRate( 0 );
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( this.awake.containsKey( tt.getNode() ) )
|
|
||||||
{
|
|
||||||
this.addToQueue( tt );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
this.upcomingTicks.poll();
|
||||||
|
|
||||||
|
final int diff = (int) ( this.currentTick - tt.getLastTick() );
|
||||||
|
final TickRateModulation mod = tt.getGridTickable().tickingRequest( tt.getNode(), diff );
|
||||||
|
|
||||||
|
switch ( mod )
|
||||||
{
|
{
|
||||||
return; // done!
|
case FASTER:
|
||||||
|
tt.setCurrentRate( tt.getCurrentRate() - 2 );
|
||||||
|
break;
|
||||||
|
case IDLE:
|
||||||
|
tt.setCurrentRate( tt.getRequest().maxTickRate );
|
||||||
|
break;
|
||||||
|
case SAME:
|
||||||
|
break;
|
||||||
|
case SLEEP:
|
||||||
|
this.sleepDevice( tt.getNode() );
|
||||||
|
break;
|
||||||
|
case SLOWER:
|
||||||
|
tt.setCurrentRate( tt.getCurrentRate() + 1 );
|
||||||
|
break;
|
||||||
|
case URGENT:
|
||||||
|
tt.setCurrentRate( 0 );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.awake.containsKey( tt.getNode() ) )
|
||||||
|
{
|
||||||
|
this.addToQueue( tt );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -134,6 +138,7 @@ public class TickManagerCache implements ITickManager
|
|||||||
tt.addEntityCrashInfo( crashreportcategory );
|
tt.addEntityCrashInfo( crashreportcategory );
|
||||||
throw new ReportedException( crashreport );
|
throw new ReportedException( crashreport );
|
||||||
}
|
}
|
||||||
|
PartLevelEmitter.wipeCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addToQueue( final TickTracker tt )
|
private void addToQueue( final TickTracker tt )
|
||||||
@@ -255,6 +260,7 @@ public class TickManagerCache implements ITickManager
|
|||||||
final TickTracker gt = this.sleeping.get( node );
|
final TickTracker gt = this.sleeping.get( node );
|
||||||
this.sleeping.remove( node );
|
this.sleeping.remove( node );
|
||||||
this.awake.put( node, gt );
|
this.awake.put( node, gt );
|
||||||
|
this.upcomingTicks.remove( gt );
|
||||||
this.addToQueue( gt );
|
this.addToQueue( gt );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
+22
-21
@@ -37,7 +37,6 @@ public class TickTracker implements Comparable<TickTracker>
|
|||||||
private final TickingRequest request;
|
private final TickingRequest request;
|
||||||
private final IGridTickable gt;
|
private final IGridTickable gt;
|
||||||
private final IGridNode node;
|
private final IGridNode node;
|
||||||
private final TickManagerCache host;
|
|
||||||
|
|
||||||
private final long LastFiveTicksTime = 0;
|
private final long LastFiveTicksTime = 0;
|
||||||
|
|
||||||
@@ -51,7 +50,6 @@ public class TickTracker implements Comparable<TickTracker>
|
|||||||
this.node = node;
|
this.node = node;
|
||||||
this.setCurrentRate( ( req.minTickRate + req.maxTickRate ) / 2 );
|
this.setCurrentRate( ( req.minTickRate + req.maxTickRate ) / 2 );
|
||||||
this.setLastTick( currentTick );
|
this.setLastTick( currentTick );
|
||||||
this.host = tickManagerCache;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getAvgNanos()
|
public long getAvgNanos()
|
||||||
@@ -59,27 +57,25 @@ public class TickTracker implements Comparable<TickTracker>
|
|||||||
return( this.LastFiveTicksTime / 5 );
|
return( this.LastFiveTicksTime / 5 );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRate( final int rate )
|
|
||||||
{
|
|
||||||
this.setCurrentRate( rate );
|
|
||||||
|
|
||||||
if( this.getCurrentRate() < this.getRequest().minTickRate )
|
|
||||||
{
|
|
||||||
this.setCurrentRate( this.getRequest().minTickRate );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( this.getCurrentRate() > this.getRequest().maxTickRate )
|
|
||||||
{
|
|
||||||
this.setCurrentRate( this.getRequest().maxTickRate );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compareTo( @Nonnull final TickTracker t )
|
public int compareTo( @Nonnull final TickTracker t )
|
||||||
{
|
{
|
||||||
final int nextTick = (int) ( ( this.getLastTick() - this.host.getCurrentTick() ) + this.getCurrentRate() );
|
int next = Long.compare( this.getNextTick(), t.getNextTick() );
|
||||||
final int ts_nextTick = (int) ( ( t.getLastTick() - this.host.getCurrentTick() ) + t.getCurrentRate() );
|
|
||||||
return nextTick - ts_nextTick;
|
if( next != 0 )
|
||||||
|
{
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
|
||||||
|
int last = Long.compare( this.getLastTick(), t.getLastTick() );
|
||||||
|
|
||||||
|
if( last != 0 )
|
||||||
|
{
|
||||||
|
return last;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Integer.compare( this.getCurrentRate(), t.getCurrentRate() );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addEntityCrashInfo( final CrashReportCategory crashreportcategory )
|
public void addEntityCrashInfo( final CrashReportCategory crashreportcategory )
|
||||||
@@ -111,7 +107,12 @@ public class TickTracker implements Comparable<TickTracker>
|
|||||||
|
|
||||||
public void setCurrentRate( final int currentRate )
|
public void setCurrentRate( final int currentRate )
|
||||||
{
|
{
|
||||||
this.currentRate = currentRate;
|
this.currentRate = Math.min( this.getRequest().maxTickRate, Math.max( this.getRequest().minTickRate, currentRate ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getNextTick()
|
||||||
|
{
|
||||||
|
return this.lastTick + this.currentRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getLastTick()
|
public long getLastTick()
|
||||||
|
|||||||
@@ -19,13 +19,9 @@
|
|||||||
package appeng.me.cluster.implementations;
|
package appeng.me.cluster.implementations;
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
@@ -34,8 +30,6 @@ import net.minecraft.item.ItemStack;
|
|||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.nbt.NBTTagList;
|
import net.minecraft.nbt.NBTTagList;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.WorldServer;
|
|
||||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
import appeng.api.AEApi;
|
||||||
import appeng.api.config.Actionable;
|
import appeng.api.config.Actionable;
|
||||||
@@ -93,6 +87,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
private final List<TileCraftingTile> storage = new ArrayList<>();
|
private final List<TileCraftingTile> storage = new ArrayList<>();
|
||||||
private final List<TileCraftingMonitorTile> status = new ArrayList<>();
|
private final List<TileCraftingMonitorTile> status = new ArrayList<>();
|
||||||
private final HashMap<IMEMonitorHandlerReceiver<IAEItemStack>, Object> listeners = new HashMap<>();
|
private final HashMap<IMEMonitorHandlerReceiver<IAEItemStack>, Object> listeners = new HashMap<>();
|
||||||
|
private final Map<ICraftingPatternDetails, Queue<ICraftingMedium>> visitedMediums = new HashMap<>();
|
||||||
private ICraftingLink myLastLink;
|
private ICraftingLink myLastLink;
|
||||||
private String myName = "";
|
private String myName = "";
|
||||||
private boolean isDestroyed = false;
|
private boolean isDestroyed = false;
|
||||||
@@ -504,17 +499,16 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
fuzz = fuzz.copy();
|
fuzz = fuzz.copy();
|
||||||
fuzz.setStackSize( g.getStackSize() );
|
fuzz.setStackSize( g.getStackSize() );
|
||||||
final IAEItemStack ais = this.inventory.extractItems( fuzz, Actionable.SIMULATE, this.machineSrc );
|
final IAEItemStack ais = this.inventory.extractItems( fuzz, Actionable.SIMULATE, this.machineSrc );
|
||||||
final ItemStack is = ais == null ? ItemStack.EMPTY : ais.createItemStack();
|
|
||||||
|
|
||||||
if( !is.isEmpty() && is.getCount() == g.getStackSize() )
|
if (ais != null && ais.getStackSize() == g.getStackSize())
|
||||||
{
|
{
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if( !is.isEmpty() )
|
else if( ais != null )
|
||||||
{
|
{
|
||||||
g = g.copy();
|
g = g.copy();
|
||||||
g.decStackSize( is.getCount() );
|
g.decStackSize( ais.getStackSize() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -526,9 +520,8 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
final IAEItemStack ais = this.inventory.extractItems( g.copy(), Actionable.SIMULATE, this.machineSrc );
|
final IAEItemStack ais = this.inventory.extractItems( g.copy(), Actionable.SIMULATE, this.machineSrc );
|
||||||
final ItemStack is = ais == null ? ItemStack.EMPTY : ais.createItemStack();
|
|
||||||
|
|
||||||
if( is.isEmpty() || is.getCount() < g.getStackSize() )
|
if (ais == null || ais.getStackSize() < g.getStackSize())
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -648,14 +641,22 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
{
|
{
|
||||||
InventoryCrafting ic = null;
|
InventoryCrafting ic = null;
|
||||||
|
|
||||||
for( final ICraftingMedium m : cc.getMediums( e.getKey() ) )
|
if (!visitedMediums.containsKey( details ) || visitedMediums.get( details ).isEmpty())
|
||||||
{
|
{
|
||||||
|
visitedMediums.put( details, new ArrayDeque<>( cc.getMediums( details ).stream().filter( Objects::nonNull ).collect( Collectors.toList()) ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!visitedMediums.get( details ).isEmpty())
|
||||||
|
{
|
||||||
|
|
||||||
|
ICraftingMedium m = visitedMediums.get( details ).poll();
|
||||||
|
|
||||||
if( e.getValue().value <= 0 )
|
if( e.getValue().value <= 0 )
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !m.isBusy() )
|
if( m != null && !m.isBusy() )
|
||||||
{
|
{
|
||||||
if( ic == null )
|
if( ic == null )
|
||||||
{
|
{
|
||||||
@@ -779,10 +780,6 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
|
|
||||||
if( details.isCraftable() )
|
if( details.isCraftable() )
|
||||||
{
|
{
|
||||||
FMLCommonHandler.instance()
|
|
||||||
.firePlayerCraftingEvent( Platform.getPlayer( (WorldServer) this.getWorld() ),
|
|
||||||
details.getOutput( ic, this.getWorld() ), ic );
|
|
||||||
|
|
||||||
for( int x = 0; x < ic.getSizeInventory(); x++ )
|
for( int x = 0; x < ic.getSizeInventory(); x++ )
|
||||||
{
|
{
|
||||||
final ItemStack output = Platform.getContainerItem( ic.getStackInSlot( x ) );
|
final ItemStack output = Platform.getContainerItem( ic.getStackInSlot( x ) );
|
||||||
@@ -1119,7 +1116,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
{
|
{
|
||||||
for( final IAEItemStack ais : t.getKey().getCondensedOutputs() )
|
for( final IAEItemStack ais : t.getKey().getCondensedOutputs() )
|
||||||
{
|
{
|
||||||
if( ais.equals( is ) )
|
if( ais.isSameType( is ) )
|
||||||
{
|
{
|
||||||
is.setStackSize( is.getStackSize() + ais.getStackSize() * t.getValue().value );
|
is.setStackSize( is.getStackSize() + ais.getStackSize() * t.getValue().value );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
package appeng.me.storage;
|
package appeng.me.storage;
|
||||||
|
|
||||||
|
|
||||||
|
import appeng.api.config.StorageFilter;
|
||||||
import appeng.api.networking.security.IActionSource;
|
import appeng.api.networking.security.IActionSource;
|
||||||
import appeng.api.networking.ticking.TickRateModulation;
|
import appeng.api.networking.ticking.TickRateModulation;
|
||||||
|
|
||||||
@@ -30,4 +31,8 @@ public interface ITickingMonitor
|
|||||||
|
|
||||||
void setActionSource( IActionSource actionSource );
|
void setActionSource( IActionSource actionSource );
|
||||||
|
|
||||||
|
default void setMode( StorageFilter setting )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,10 @@ import java.util.List;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
|
import appeng.fluids.helper.IConfigurableFluidInventory;
|
||||||
|
import appeng.fluids.parts.PartFluidLevelEmitter;
|
||||||
|
import appeng.fluids.util.AEFluidInventory;
|
||||||
|
import appeng.parts.automation.PartLevelEmitter;
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
|
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
@@ -43,6 +47,7 @@ import net.minecraft.util.math.BlockPos;
|
|||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.world.IBlockAccess;
|
import net.minecraft.world.IBlockAccess;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||||
import net.minecraftforge.fml.relauncher.Side;
|
import net.minecraftforge.fml.relauncher.Side;
|
||||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
@@ -383,6 +388,26 @@ public abstract class AEBasePart implements IPart, IGridProxyable, IActionHost,
|
|||||||
{
|
{
|
||||||
target.setStackInSlot( x, tmp.getStackInSlot( x ) );
|
target.setStackInSlot( x, tmp.getStackInSlot( x ) );
|
||||||
}
|
}
|
||||||
|
if (this instanceof PartLevelEmitter ) {
|
||||||
|
final PartLevelEmitter partLevelEmitter = (PartLevelEmitter) this;
|
||||||
|
partLevelEmitter.setReportingValue(compound.getLong("reportingValue"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this instanceof IConfigurableFluidInventory) {
|
||||||
|
final IFluidHandler tank = ((IConfigurableFluidInventory) this).getFluidInventoryByName("config");
|
||||||
|
if (tank instanceof AEFluidInventory ) {
|
||||||
|
final AEFluidInventory target = (AEFluidInventory) tank;
|
||||||
|
final AEFluidInventory tmp = new AEFluidInventory(null, target.getSlots());
|
||||||
|
tmp.readFromNBT(compound, "config");
|
||||||
|
for (int x = 0; x < tmp.getSlots(); x++) {
|
||||||
|
target.setFluidInSlot(x, tmp.getFluidInSlot(x));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this instanceof PartFluidLevelEmitter ) {
|
||||||
|
final PartFluidLevelEmitter partFluidLevelEmitter = (PartFluidLevelEmitter) this;
|
||||||
|
partFluidLevelEmitter.setReportingValue(compound.getLong("reportingValue"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -413,6 +438,21 @@ public abstract class AEBasePart implements IPart, IGridProxyable, IActionHost,
|
|||||||
if( inv instanceof AppEngInternalAEInventory )
|
if( inv instanceof AppEngInternalAEInventory )
|
||||||
{
|
{
|
||||||
( (AppEngInternalAEInventory) inv ).writeToNBT( output, "config" );
|
( (AppEngInternalAEInventory) inv ).writeToNBT( output, "config" );
|
||||||
|
if (this instanceof PartLevelEmitter) {
|
||||||
|
final PartLevelEmitter partLevelEmitter = (PartLevelEmitter) this;
|
||||||
|
output.setLong("reportingValue", partLevelEmitter.getReportingValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this instanceof IConfigurableFluidInventory) {
|
||||||
|
final IFluidHandler tank = ((IConfigurableFluidInventory) this).getFluidInventoryByName("config");
|
||||||
|
if (tank instanceof AEFluidInventory ) {
|
||||||
|
((AEFluidInventory) tank).writeToNBT(output, "config");
|
||||||
|
}
|
||||||
|
if (this instanceof PartFluidLevelEmitter) {
|
||||||
|
final PartFluidLevelEmitter partFluidLevelEmitter = (PartFluidLevelEmitter) this;
|
||||||
|
output.setLong("reportingValue", partFluidLevelEmitter.getReportingValue());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return output.hasNoTags() ? null : output;
|
return output.hasNoTags() ? null : output;
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ import appeng.util.item.AEItemStack;
|
|||||||
|
|
||||||
public class PartExportBus extends PartSharedItemBus implements ICraftingRequester
|
public class PartExportBus extends PartSharedItemBus implements ICraftingRequester
|
||||||
{
|
{
|
||||||
|
private final int[] failedCraftTriesSlot = {0,0,0,0,0,0,0,0,0};
|
||||||
|
|
||||||
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/export_bus_base" );
|
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/export_bus_base" );
|
||||||
|
|
||||||
@@ -149,13 +150,18 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
|||||||
|
|
||||||
final IAEItemStack ais = this.getConfig().getAEStackInSlot( slotToExport );
|
final IAEItemStack ais = this.getConfig().getAEStackInSlot( slotToExport );
|
||||||
|
|
||||||
if( ais == null || this.itemToSend <= 0 || this.craftOnly() )
|
if( ais == null || this.itemToSend <= 0 ) continue;
|
||||||
{
|
|
||||||
if( this.isCraftingEnabled() )
|
if ( this.craftOnly() ) {
|
||||||
{
|
if (this.failedCraftTriesSlot[x] <= 0) {
|
||||||
this.didSomething = this.craftingTracker.handleCrafting( slotToExport, this.itemToSend, ais, destination, this.getTile().getWorld(),
|
|
||||||
this.getProxy().getGrid(), cg, this.mySrc ) || this.didSomething;
|
this.didSomething = this.craftingTracker.handleCrafting(slotToExport, this.itemToSend, ais, destination, this.getTile().getWorld(),
|
||||||
|
this.getProxy().getGrid(), cg, this.mySrc) || this.didSomething;
|
||||||
|
|
||||||
|
if (this.didSomething) this.failedCraftTriesSlot[x] = 0;
|
||||||
|
else this.failedCraftTriesSlot[x] += 2;
|
||||||
}
|
}
|
||||||
|
this.failedCraftTriesSlot[x] -= 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,8 +185,15 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
|||||||
|
|
||||||
if( this.itemToSend == before && this.isCraftingEnabled() )
|
if( this.itemToSend == before && this.isCraftingEnabled() )
|
||||||
{
|
{
|
||||||
this.didSomething = this.craftingTracker.handleCrafting( slotToExport, this.itemToSend, ais, destination, this.getTile().getWorld(),
|
if (this.failedCraftTriesSlot[x] <= 0) {
|
||||||
this.getProxy().getGrid(), cg, this.mySrc ) || this.didSomething;
|
|
||||||
|
this.didSomething = this.craftingTracker.handleCrafting(slotToExport, this.itemToSend, ais, destination, this.getTile().getWorld(),
|
||||||
|
this.getProxy().getGrid(), cg, this.mySrc) || this.didSomething;
|
||||||
|
|
||||||
|
if (this.didSomething) this.failedCraftTriesSlot[x] = 0;
|
||||||
|
else this.failedCraftTriesSlot[x] += 2;
|
||||||
|
}
|
||||||
|
this.failedCraftTriesSlot[x] -= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -218,6 +218,12 @@ public class PartImportBus extends PartSharedItemBus implements IInventoryDestin
|
|||||||
private boolean importStuff( final InventoryAdaptor myAdaptor, final IAEItemStack whatToImport, final IMEMonitor<IAEItemStack> inv, final IEnergySource energy, final FuzzyMode fzMode )
|
private boolean importStuff( final InventoryAdaptor myAdaptor, final IAEItemStack whatToImport, final IMEMonitor<IAEItemStack> inv, final IEnergySource energy, final FuzzyMode fzMode )
|
||||||
{
|
{
|
||||||
final int toSend = this.calculateMaximumAmountToImport( myAdaptor, whatToImport, inv, fzMode );
|
final int toSend = this.calculateMaximumAmountToImport( myAdaptor, whatToImport, inv, fzMode );
|
||||||
|
|
||||||
|
if( toSend == 0 )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
final ItemStack newItems;
|
final ItemStack newItems;
|
||||||
|
|
||||||
if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
|
if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
|
||||||
@@ -286,8 +292,17 @@ public class PartImportBus extends PartSharedItemBus implements IInventoryDestin
|
|||||||
itemAmountNotStorable = inv.injectItems( AEItemStack.fromItemStack( simResult ), Actionable.SIMULATE, this.source );
|
itemAmountNotStorable = inv.injectItems( AEItemStack.fromItemStack( simResult ), Actionable.SIMULATE, this.source );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( simResult.isEmpty() )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if( itemAmountNotStorable != null )
|
if( itemAmountNotStorable != null )
|
||||||
{
|
{
|
||||||
|
if( simResult.getCount() == itemAmountNotStorable.getStackSize() )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
return (int) Math.min( simResult.getCount() - itemAmountNotStorable.getStackSize(), toSend );
|
return (int) Math.min( simResult.getCount() - itemAmountNotStorable.getStackSize(), toSend );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,9 +19,14 @@
|
|||||||
package appeng.parts.automation;
|
package appeng.parts.automation;
|
||||||
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
|
import appeng.me.Grid;
|
||||||
|
import appeng.me.GridNode;
|
||||||
|
import appeng.util.item.AEItemStack;
|
||||||
|
import it.unimi.dsi.fastutil.objects.Object2LongMap;
|
||||||
|
import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap;
|
||||||
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.inventory.InventoryCrafting;
|
import net.minecraft.inventory.InventoryCrafting;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@@ -118,6 +123,9 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH
|
|||||||
private double centerX;
|
private double centerX;
|
||||||
private double centerY;
|
private double centerY;
|
||||||
private double centerZ;
|
private double centerZ;
|
||||||
|
static Object2LongMap<Grid> gridItemCount = new Object2LongOpenHashMap<>();
|
||||||
|
static Object2ObjectOpenHashMap<Grid, Object2LongMap<AEItemStack>> fuzzyAEItemStackCount = new Object2ObjectOpenHashMap<>();
|
||||||
|
static Object2ObjectOpenHashMap<Grid, Object2LongMap<AEItemStack>> preciseAEItemStackCount = new Object2ObjectOpenHashMap<>();
|
||||||
|
|
||||||
@Reflected
|
@Reflected
|
||||||
public PartLevelEmitter( final ItemStack is )
|
public PartLevelEmitter( final ItemStack is )
|
||||||
@@ -315,40 +323,91 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void updateReportingValue( final IMEMonitor<IAEItemStack> monitor )
|
private void updateReportingValue( final IMEMonitor<IAEItemStack> monitor )
|
||||||
|
{
|
||||||
|
updateReportingValue( monitor,null );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateReportingValue( final IMEMonitor<IAEItemStack> monitor, Iterable<IAEItemStack> change )
|
||||||
{
|
{
|
||||||
final IAEItemStack myStack = this.config.getAEStackInSlot( 0 );
|
final IAEItemStack myStack = this.config.getAEStackInSlot( 0 );
|
||||||
|
|
||||||
if( myStack == null )
|
GridNode node = (GridNode) (this.getGridNode());
|
||||||
|
|
||||||
|
if( node != null )
|
||||||
{
|
{
|
||||||
this.lastReportedValue = 0;
|
|
||||||
for( final IAEItemStack st : monitor.getStorageList() )
|
final Grid g = node.getInternalGrid();
|
||||||
|
|
||||||
|
if( myStack == null )
|
||||||
{
|
{
|
||||||
this.lastReportedValue += st.getStackSize();
|
if( change != null )
|
||||||
|
{
|
||||||
|
if( gridItemCount.containsKey( g ) )
|
||||||
|
{
|
||||||
|
change.forEach( iaeItemStack -> lastReportedValue += iaeItemStack.getStackSize() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gridItemCount.computeIfAbsent( g, ( aLong ) -> {
|
||||||
|
this.lastReportedValue = 0;
|
||||||
|
monitor.getStorageList().forEach( iaeItemStack -> lastReportedValue += iaeItemStack.getStackSize() );
|
||||||
|
return ( lastReportedValue );
|
||||||
|
} );
|
||||||
|
this.lastReportedValue = gridItemCount.get( g );
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
|
else if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
|
||||||
{
|
|
||||||
this.lastReportedValue = 0;
|
|
||||||
final FuzzyMode fzMode = (FuzzyMode) this.getConfigManager().getSetting( Settings.FUZZY_MODE );
|
|
||||||
final Collection<IAEItemStack> fuzzyList = monitor.getStorageList().findFuzzy( myStack, fzMode );
|
|
||||||
for( final IAEItemStack st : fuzzyList )
|
|
||||||
{
|
{
|
||||||
this.lastReportedValue += st.getStackSize();
|
final FuzzyMode fzMode = (FuzzyMode) this.getConfigManager().getSetting( Settings.FUZZY_MODE );
|
||||||
}
|
if( change != null )
|
||||||
}
|
{
|
||||||
else
|
if( fuzzyAEItemStackCount.containsKey( g ) )
|
||||||
{
|
{
|
||||||
final IAEItemStack r = monitor.getStorageList().findPrecise( myStack );
|
change.forEach( iaeItemStack -> {
|
||||||
if( r == null )
|
if( iaeItemStack.sameOre( myStack ) ) lastReportedValue += iaeItemStack.getStackSize();
|
||||||
{
|
} );
|
||||||
this.lastReportedValue = 0;
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fuzzyAEItemStackCount.computeIfAbsent( g, ( grid -> new Object2LongOpenHashMap<>() ) );
|
||||||
|
fuzzyAEItemStackCount.get( g ).computeIfAbsent( (AEItemStack) myStack, ( aLong -> {
|
||||||
|
this.lastReportedValue = 0;
|
||||||
|
monitor.getStorageList().findFuzzy( myStack, fzMode ).forEach( iaeItemStack -> lastReportedValue += iaeItemStack.getStackSize() );
|
||||||
|
return ( lastReportedValue );
|
||||||
|
} ) );
|
||||||
|
|
||||||
|
this.lastReportedValue = fuzzyAEItemStackCount.get( g ).get( myStack );
|
||||||
|
if( this.lastReportedValue == 0 )
|
||||||
|
{
|
||||||
|
fuzzyAEItemStackCount.get( g ).remove( myStack );
|
||||||
|
fuzzyAEItemStackCount.trim();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.lastReportedValue = r.getStackSize();
|
if( change != null )
|
||||||
|
{
|
||||||
|
if( preciseAEItemStackCount.containsKey( g ) )
|
||||||
|
{
|
||||||
|
change.forEach( iaeItemStack -> {
|
||||||
|
if( iaeItemStack.isSameType( myStack ) ) lastReportedValue += iaeItemStack.getStackSize();
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
preciseAEItemStackCount.computeIfAbsent( g, ( grid -> new Object2LongOpenHashMap<>() ) );
|
||||||
|
preciseAEItemStackCount.get( g ).computeIfAbsent( (AEItemStack) myStack, ( aLong -> {
|
||||||
|
this.lastReportedValue = 0;
|
||||||
|
IAEItemStack precise = monitor.getStorageList().findPrecise( myStack );
|
||||||
|
if( precise != null ) lastReportedValue = precise.getStackSize();
|
||||||
|
return ( lastReportedValue );
|
||||||
|
} ) );
|
||||||
|
this.lastReportedValue = preciseAEItemStackCount.get( g ).get( myStack );
|
||||||
|
if( this.lastReportedValue == 0 )
|
||||||
|
{
|
||||||
|
preciseAEItemStackCount.get( g ).remove( myStack );
|
||||||
|
preciseAEItemStackCount.trim();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.updateState();
|
this.updateState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -400,7 +459,7 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH
|
|||||||
@Override
|
@Override
|
||||||
public void postChange( final IBaseMonitor<IAEItemStack> monitor, final Iterable<IAEItemStack> change, final IActionSource actionSource )
|
public void postChange( final IBaseMonitor<IAEItemStack> monitor, final Iterable<IAEItemStack> change, final IActionSource actionSource )
|
||||||
{
|
{
|
||||||
this.updateReportingValue( (IMEMonitor<IAEItemStack>) monitor );
|
this.updateReportingValue( (IMEMonitor<IAEItemStack>) monitor, change );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -576,4 +635,10 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH
|
|||||||
return this.isLevelEmitterOn() ? MODEL_ON_OFF : MODEL_OFF_OFF;
|
return this.isLevelEmitterOn() ? MODEL_ON_OFF : MODEL_OFF_OFF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void wipeCache(){
|
||||||
|
fuzzyAEItemStackCount.clear();
|
||||||
|
preciseAEItemStackCount.clear();
|
||||||
|
gridItemCount.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,13 +19,12 @@
|
|||||||
package appeng.parts.misc;
|
package appeng.parts.misc;
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
|
import appeng.api.config.Settings;
|
||||||
|
import appeng.api.config.StorageFilter;
|
||||||
|
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
|
||||||
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
@@ -40,11 +39,11 @@ import appeng.api.storage.channels.IItemStorageChannel;
|
|||||||
import appeng.api.storage.data.IAEItemStack;
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
import appeng.api.storage.data.IItemList;
|
import appeng.api.storage.data.IItemList;
|
||||||
import appeng.core.AELog;
|
import appeng.core.AELog;
|
||||||
import appeng.me.GridAccessException;
|
|
||||||
import appeng.me.helpers.IGridProxyable;
|
import appeng.me.helpers.IGridProxyable;
|
||||||
import appeng.me.storage.ITickingMonitor;
|
import appeng.me.storage.ITickingMonitor;
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
import appeng.util.item.AEItemStack;
|
import appeng.util.item.AEItemStack;
|
||||||
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -52,32 +51,50 @@ import appeng.util.item.AEItemStack;
|
|||||||
*/
|
*/
|
||||||
class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAEItemStack>, ITickingMonitor
|
class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAEItemStack>, ITickingMonitor
|
||||||
{
|
{
|
||||||
private final Map<IMEMonitorHandlerReceiver<IAEItemStack>, Object> listeners = new HashMap<>();
|
private final Object2ObjectMap<IMEMonitorHandlerReceiver<IAEItemStack>, Object> listeners = new Object2ObjectOpenHashMap<>();
|
||||||
private IActionSource mySource;
|
private IActionSource mySource;
|
||||||
private final IItemHandler itemHandler;
|
private final IItemHandler itemHandler;
|
||||||
private final IGridProxyable proxyable;
|
private final IGridProxyable proxyable;
|
||||||
private final InventoryCache cache;
|
private final InventoryCache cache;
|
||||||
|
private StorageFilter mode;
|
||||||
|
|
||||||
ItemHandlerAdapter( IItemHandler itemHandler, IGridProxyable proxy )
|
ItemHandlerAdapter( IItemHandler itemHandler, IGridProxyable proxy )
|
||||||
{
|
{
|
||||||
this.itemHandler = itemHandler;
|
this.itemHandler = itemHandler;
|
||||||
this.proxyable = proxy;
|
this.proxyable = proxy;
|
||||||
this.cache = new InventoryCache( this.itemHandler );
|
if( this.proxyable instanceof PartStorageBus )
|
||||||
|
{
|
||||||
|
PartStorageBus partStorageBus = (PartStorageBus) this.proxyable;
|
||||||
|
this.mode = ( (StorageFilter) partStorageBus.getConfigManager().getSetting( Settings.STORAGE_FILTER ) );
|
||||||
|
}
|
||||||
|
this.cache = new InventoryCache( this.itemHandler, this.mode );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IAEItemStack injectItems( IAEItemStack iox, Actionable type, IActionSource src )
|
public IAEItemStack injectItems( IAEItemStack iox, Actionable type, IActionSource src )
|
||||||
{
|
{
|
||||||
|
|
||||||
ItemStack orgInput = iox.createItemStack();
|
ItemStack orgInput = iox.createItemStack();
|
||||||
ItemStack remaining = orgInput;
|
ItemStack remaining = orgInput;
|
||||||
|
|
||||||
int slotCount = this.itemHandler.getSlots();
|
int slotCount = this.itemHandler.getSlots();
|
||||||
boolean simulate = ( type == Actionable.SIMULATE );
|
boolean simulate = ( type == Actionable.SIMULATE );
|
||||||
|
List<Pair<Integer, Integer>> injectedList = new ArrayList<>();
|
||||||
// This uses a brute force approach and tries to jam it in every slot the inventory exposes.
|
// This uses a brute force approach and tries to jam it in every slot the inventory exposes.
|
||||||
for( int i = 0; i < slotCount && !remaining.isEmpty(); i++ )
|
for( int i = 0; i < slotCount && !remaining.isEmpty(); i++ )
|
||||||
{
|
{
|
||||||
|
int countPre = remaining.getCount();
|
||||||
remaining = this.itemHandler.insertItem( i, remaining, simulate );
|
remaining = this.itemHandler.insertItem( i, remaining, simulate );
|
||||||
|
int countPos = remaining.getCount();
|
||||||
|
if( remaining.isEmpty() )
|
||||||
|
{
|
||||||
|
injectedList.add( Pair.of( i, countPre ) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if( countPos < countPre )
|
||||||
|
{
|
||||||
|
injectedList.add( Pair.of( i, countPre - countPos ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// At this point, we still have some items left...
|
// At this point, we still have some items left...
|
||||||
@@ -89,14 +106,30 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
|
|
||||||
if( type == Actionable.MODULATE )
|
if( type == Actionable.MODULATE )
|
||||||
{
|
{
|
||||||
try
|
if( this.cache.cachedAeStacks.length == 0 )
|
||||||
{
|
{
|
||||||
this.proxyable.getProxy().getTick().alertDevice( this.proxyable.getProxy().getNode() );
|
this.cache.update();
|
||||||
}
|
}
|
||||||
catch( GridAccessException ex )
|
else
|
||||||
{
|
{
|
||||||
// meh
|
for( Pair<Integer, Integer> pair : injectedList )
|
||||||
|
{
|
||||||
|
if( pair.getKey() >= this.cache.cachedAeStacks.length )
|
||||||
|
{
|
||||||
|
this.cache.update();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if( this.cache.cachedAeStacks[pair.getKey()] == null )
|
||||||
|
{
|
||||||
|
this.cache.cachedAeStacks[pair.getKey()] = iox.copy().setStackSize( pair.getValue() );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.cache.cachedAeStacks[pair.getKey()].incStackSize( pair.getValue() );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return AEItemStack.fromItemStack( remaining );
|
return AEItemStack.fromItemStack( remaining );
|
||||||
@@ -105,7 +138,6 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
@Override
|
@Override
|
||||||
public IAEItemStack extractItems( IAEItemStack request, Actionable mode, IActionSource src )
|
public IAEItemStack extractItems( IAEItemStack request, Actionable mode, IActionSource src )
|
||||||
{
|
{
|
||||||
|
|
||||||
ItemStack requestedItemStack = request.createItemStack();
|
ItemStack requestedItemStack = request.createItemStack();
|
||||||
int remainingSize = requestedItemStack.getCount();
|
int remainingSize = requestedItemStack.getCount();
|
||||||
|
|
||||||
@@ -113,8 +145,10 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
ItemStack gathered = ItemStack.EMPTY;
|
ItemStack gathered = ItemStack.EMPTY;
|
||||||
|
|
||||||
final boolean simulate = ( mode == Actionable.SIMULATE );
|
final boolean simulate = ( mode == Actionable.SIMULATE );
|
||||||
|
List<Pair<Integer, Integer>> extractedList = new ArrayList<>();
|
||||||
|
|
||||||
for( int i = 0; i < this.itemHandler.getSlots(); i++ )
|
|
||||||
|
for ( int i = 0; i < this.itemHandler.getSlots(); i++ )
|
||||||
{
|
{
|
||||||
ItemStack stackInInventorySlot = this.itemHandler.getStackInSlot( i );
|
ItemStack stackInInventorySlot = this.itemHandler.getStackInSlot( i );
|
||||||
|
|
||||||
@@ -132,6 +166,7 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
extracted = this.itemHandler.extractItem( i, remainingCurrentSlot, simulate );
|
extracted = this.itemHandler.extractItem( i, remainingCurrentSlot, simulate );
|
||||||
|
|
||||||
if( !extracted.isEmpty() )
|
if( !extracted.isEmpty() )
|
||||||
{
|
{
|
||||||
if( extracted.getCount() > remainingCurrentSlot )
|
if( extracted.getCount() > remainingCurrentSlot )
|
||||||
@@ -157,10 +192,15 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
remainingCurrentSlot -= extracted.getCount();
|
remainingCurrentSlot -= extracted.getCount();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while( !extracted.isEmpty() && remainingCurrentSlot > 0 );
|
while ( !extracted.isEmpty() && remainingCurrentSlot > 0 );
|
||||||
|
|
||||||
remainingSize -= stackSizeCurrentSlot - remainingCurrentSlot;
|
remainingSize -= stackSizeCurrentSlot - remainingCurrentSlot;
|
||||||
|
|
||||||
|
if (!gathered.isEmpty())
|
||||||
|
{
|
||||||
|
extractedList.add( Pair.of( i, gathered.getCount() ) );
|
||||||
|
}
|
||||||
|
|
||||||
// Done?
|
// Done?
|
||||||
if( remainingSize <= 0 )
|
if( remainingSize <= 0 )
|
||||||
{
|
{
|
||||||
@@ -172,13 +212,23 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
{
|
{
|
||||||
if( mode == Actionable.MODULATE )
|
if( mode == Actionable.MODULATE )
|
||||||
{
|
{
|
||||||
try
|
if( this.cache.cachedAeStacks.length == 0 )
|
||||||
{
|
{
|
||||||
this.proxyable.getProxy().getTick().alertDevice( this.proxyable.getProxy().getNode() );
|
this.cache.update();
|
||||||
}
|
}
|
||||||
catch( GridAccessException ex )
|
else
|
||||||
{
|
{
|
||||||
// meh
|
for( Pair<Integer, Integer> pair : extractedList )
|
||||||
|
{
|
||||||
|
if( this.cache.cachedAeStacks[pair.getKey()] != null )
|
||||||
|
{
|
||||||
|
this.cache.cachedAeStacks[pair.getKey()].decStackSize( pair.getValue() );
|
||||||
|
if( this.cache.cachedAeStacks[pair.getKey()].getStackSize() == 0 )
|
||||||
|
{
|
||||||
|
this.cache.cachedAeStacks[pair.getKey()] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,9 +305,11 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
{
|
{
|
||||||
private IAEItemStack[] cachedAeStacks = new IAEItemStack[0];
|
private IAEItemStack[] cachedAeStacks = new IAEItemStack[0];
|
||||||
private final IItemHandler itemHandler;
|
private final IItemHandler itemHandler;
|
||||||
|
private final StorageFilter mode;
|
||||||
|
|
||||||
public InventoryCache( IItemHandler itemHandler )
|
public InventoryCache( IItemHandler itemHandler, StorageFilter mode )
|
||||||
{
|
{
|
||||||
|
this.mode = mode;
|
||||||
this.itemHandler = itemHandler;
|
this.itemHandler = itemHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -282,8 +334,14 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
{
|
{
|
||||||
// Save the old stuff
|
// Save the old stuff
|
||||||
final IAEItemStack oldAeIS = this.cachedAeStacks[slot];
|
final IAEItemStack oldAeIS = this.cachedAeStacks[slot];
|
||||||
final ItemStack newIS = this.itemHandler.getStackInSlot( slot );
|
ItemStack newIS = this.itemHandler.getStackInSlot( slot );
|
||||||
|
if( this.mode == StorageFilter.EXTRACTABLE_ONLY && !newIS.isEmpty() )
|
||||||
|
{
|
||||||
|
if( this.itemHandler.extractItem( slot, 1, true ).isEmpty() )
|
||||||
|
{
|
||||||
|
newIS = ItemStack.EMPTY;
|
||||||
|
}
|
||||||
|
}
|
||||||
this.handlePossibleSlotChanges( slot, oldAeIS, newIS, changes );
|
this.handlePossibleSlotChanges( slot, oldAeIS, newIS, changes );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,297 @@
|
|||||||
|
package appeng.parts.misc;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import appeng.api.storage.IStorageChannel;
|
||||||
|
|
||||||
|
import appeng.core.AELog;
|
||||||
|
import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository;
|
||||||
|
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
|
||||||
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
|
import appeng.api.AEApi;
|
||||||
|
import appeng.api.config.Actionable;
|
||||||
|
import appeng.api.networking.security.IActionSource;
|
||||||
|
import appeng.api.networking.storage.IBaseMonitor;
|
||||||
|
import appeng.api.networking.ticking.TickRateModulation;
|
||||||
|
import appeng.api.storage.IMEInventory;
|
||||||
|
import appeng.api.storage.IMEMonitorHandlerReceiver;
|
||||||
|
import appeng.api.storage.channels.IItemStorageChannel;
|
||||||
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
|
import appeng.api.storage.data.IItemList;
|
||||||
|
import appeng.me.GridAccessException;
|
||||||
|
import appeng.me.helpers.IGridProxyable;
|
||||||
|
import appeng.me.storage.ITickingMonitor;
|
||||||
|
import appeng.util.item.AEItemStack;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps an Item Repository in such a way that it can be used as an IMEInventory for items.
|
||||||
|
* Used by the Storage Bus
|
||||||
|
*/
|
||||||
|
|
||||||
|
class ItemRepositoryAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAEItemStack>, ITickingMonitor
|
||||||
|
{
|
||||||
|
private final Object2ObjectMap<IMEMonitorHandlerReceiver<IAEItemStack>, Object> listeners = new Object2ObjectOpenHashMap<>();
|
||||||
|
private IActionSource mySource;
|
||||||
|
private final IItemRepository itemRepository;
|
||||||
|
private final IGridProxyable proxyable;
|
||||||
|
private final InventoryCache cache;
|
||||||
|
|
||||||
|
|
||||||
|
ItemRepositoryAdapter( IItemRepository itemRepository, IGridProxyable proxy )
|
||||||
|
{
|
||||||
|
this.itemRepository = itemRepository;
|
||||||
|
this.proxyable = proxy;
|
||||||
|
this.cache = new InventoryCache( this.itemRepository );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IAEItemStack injectItems( IAEItemStack iox, Actionable type, IActionSource src )
|
||||||
|
{
|
||||||
|
ItemStack orgInput = iox.createItemStack();
|
||||||
|
ItemStack remaining = orgInput;
|
||||||
|
|
||||||
|
boolean simulate = ( type == Actionable.SIMULATE );
|
||||||
|
|
||||||
|
remaining = this.itemRepository.insertItem( remaining, simulate );
|
||||||
|
|
||||||
|
// At this point, we still have some items left...
|
||||||
|
if( remaining == orgInput )
|
||||||
|
{
|
||||||
|
// The stack remained unmodified, target inventory is full
|
||||||
|
return iox;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( type == Actionable.MODULATE )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.proxyable.getProxy().getTick().alertDevice( this.proxyable.getProxy().getNode() );
|
||||||
|
}
|
||||||
|
catch( GridAccessException ex )
|
||||||
|
{
|
||||||
|
// meh
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return AEItemStack.fromItemStack( remaining );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IAEItemStack extractItems( IAEItemStack request, Actionable mode, IActionSource src )
|
||||||
|
{
|
||||||
|
ItemStack requestedItemStack = request.getDefinition();
|
||||||
|
int remainingSize = (int) Math.min( Integer.MAX_VALUE, request.getStackSize());
|
||||||
|
|
||||||
|
final boolean simulate = ( mode == Actionable.SIMULATE );
|
||||||
|
|
||||||
|
ItemStack extracted = this.itemRepository.extractItem( requestedItemStack, remainingSize, simulate );
|
||||||
|
|
||||||
|
if( extracted.getCount() > remainingSize )
|
||||||
|
{
|
||||||
|
// Something broke. It should never return more than we requested...
|
||||||
|
// We're going to silently eat the remainder
|
||||||
|
AELog.warn( "Mod that provided item handler %s is broken. Returned %s items while only requesting %d.",
|
||||||
|
this.itemRepository.getClass().getName(), extracted.toString(), remainingSize );
|
||||||
|
extracted.setCount( remainingSize );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !extracted.isEmpty() )
|
||||||
|
{
|
||||||
|
if( mode == Actionable.MODULATE )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.proxyable.getProxy().getTick().alertDevice( this.proxyable.getProxy().getNode() );
|
||||||
|
}
|
||||||
|
catch( GridAccessException ex )
|
||||||
|
{
|
||||||
|
// meh
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return AEItemStack.fromItemStack( extracted );
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IItemList<IAEItemStack> getAvailableItems( IItemList<IAEItemStack> out )
|
||||||
|
{
|
||||||
|
return this.cache.getAvailableItems( out );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IStorageChannel<IAEItemStack> getChannel()
|
||||||
|
{
|
||||||
|
return AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addListener( IMEMonitorHandlerReceiver<IAEItemStack> l, Object verificationToken )
|
||||||
|
{
|
||||||
|
this.listeners.put( l, verificationToken );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeListener( IMEMonitorHandlerReceiver<IAEItemStack> l )
|
||||||
|
{
|
||||||
|
this.listeners.remove( l );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void postDifference( Iterable<IAEItemStack> a )
|
||||||
|
{
|
||||||
|
final Iterator<Map.Entry<IMEMonitorHandlerReceiver<IAEItemStack>, Object>> i = this.listeners.entrySet().iterator();
|
||||||
|
while( i.hasNext() )
|
||||||
|
{
|
||||||
|
final Map.Entry<IMEMonitorHandlerReceiver<IAEItemStack>, Object> l = i.next();
|
||||||
|
final IMEMonitorHandlerReceiver<IAEItemStack> key = l.getKey();
|
||||||
|
if( key.isValid( l.getValue() ) )
|
||||||
|
{
|
||||||
|
key.postChange( this, a, this.mySource );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TickRateModulation onTick()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
List<IAEItemStack> changes = this.cache.update();
|
||||||
|
if( !changes.isEmpty() )
|
||||||
|
{
|
||||||
|
this.postDifference( changes );
|
||||||
|
return TickRateModulation.URGENT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return TickRateModulation.SLOWER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setActionSource( final IActionSource mySource )
|
||||||
|
{
|
||||||
|
this.mySource = mySource;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class InventoryCache
|
||||||
|
{
|
||||||
|
private IAEItemStack[] cachedAeStacks = new IAEItemStack[0];
|
||||||
|
private final IItemRepository iItemRepository;
|
||||||
|
|
||||||
|
public InventoryCache( IItemRepository iItemRepository )
|
||||||
|
{
|
||||||
|
this.iItemRepository = iItemRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IItemList<IAEItemStack> getAvailableItems( IItemList<IAEItemStack> out )
|
||||||
|
{
|
||||||
|
Arrays.stream( this.cachedAeStacks ).forEach( out::add );
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<IAEItemStack> update()
|
||||||
|
{
|
||||||
|
final List<IAEItemStack> changes = new ArrayList<>();
|
||||||
|
|
||||||
|
List<IAEItemStack> out = this.iItemRepository.getAllItems().stream().map( s -> AEItemStack.fromItemStack( s.itemPrototype ).setStackSize( s.count ) ).collect(Collectors.toList() );
|
||||||
|
|
||||||
|
final int size = out.size();
|
||||||
|
|
||||||
|
// Make room for new slots
|
||||||
|
if( size > this.cachedAeStacks.length )
|
||||||
|
{
|
||||||
|
this.cachedAeStacks = Arrays.copyOf( this.cachedAeStacks, size );
|
||||||
|
}
|
||||||
|
|
||||||
|
for( int x = 0; x < size; x++ )
|
||||||
|
{
|
||||||
|
// Save the old stuff
|
||||||
|
final IAEItemStack oldAeIS = this.cachedAeStacks[x];
|
||||||
|
final IAEItemStack newIS = out.get( x );
|
||||||
|
|
||||||
|
this.handlePossibleSlotChanges( x, oldAeIS, newIS, changes );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle cases where the number of slots actually is lower now than before
|
||||||
|
if( size < this.cachedAeStacks.length )
|
||||||
|
{
|
||||||
|
for( int x = 0; x < this.cachedAeStacks.length; x++ )
|
||||||
|
{
|
||||||
|
final IAEItemStack aeStack = this.cachedAeStacks[x];
|
||||||
|
|
||||||
|
if( aeStack != null )
|
||||||
|
{
|
||||||
|
final IAEItemStack a = aeStack.copy();
|
||||||
|
a.setStackSize( -a.getStackSize() );
|
||||||
|
changes.add( a );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reduce the cache size
|
||||||
|
this.cachedAeStacks = Arrays.copyOf( this.cachedAeStacks, size );
|
||||||
|
}
|
||||||
|
|
||||||
|
return changes;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handlePossibleSlotChanges( int slot, IAEItemStack oldAeIS, IAEItemStack newIS, List<IAEItemStack> changes )
|
||||||
|
{
|
||||||
|
if( oldAeIS != null && oldAeIS.isSameType( newIS ) )
|
||||||
|
{
|
||||||
|
this.handleStackSizeChanged( slot, oldAeIS, newIS, changes );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.handleItemChanged( slot, oldAeIS, newIS, changes );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleStackSizeChanged( int slot, IAEItemStack oldAeIS, IAEItemStack newIS, List<IAEItemStack> changes )
|
||||||
|
{
|
||||||
|
// Still the same item, but amount might have changed
|
||||||
|
final long diff = newIS.getStackSize() - oldAeIS.getStackSize();
|
||||||
|
|
||||||
|
if( diff != 0 )
|
||||||
|
{
|
||||||
|
final IAEItemStack stack = oldAeIS.copy();
|
||||||
|
stack.setStackSize( newIS.getStackSize() );
|
||||||
|
|
||||||
|
this.cachedAeStacks[slot] = stack;
|
||||||
|
|
||||||
|
final IAEItemStack a = stack.copy();
|
||||||
|
a.setStackSize( diff );
|
||||||
|
changes.add( a );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleItemChanged( int slot, IAEItemStack oldAeIS, IAEItemStack newIS, List<IAEItemStack> changes )
|
||||||
|
{
|
||||||
|
// Completely different item
|
||||||
|
this.cachedAeStacks[slot] = newIS ;
|
||||||
|
|
||||||
|
// If we had a stack previously in this slot, notify the network about its disappearance
|
||||||
|
if( oldAeIS != null )
|
||||||
|
{
|
||||||
|
oldAeIS.setStackSize( -oldAeIS.getStackSize() );
|
||||||
|
changes.add( oldAeIS );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify the network about the new stack. Note that this is null if newIS was null
|
||||||
|
if( this.cachedAeStacks[slot] != null )
|
||||||
|
{
|
||||||
|
changes.add( this.cachedAeStacks[slot] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,6 +23,7 @@ import java.util.Collections;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
@@ -33,6 +34,8 @@ import net.minecraft.util.ResourceLocation;
|
|||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.world.IBlockAccess;
|
import net.minecraft.world.IBlockAccess;
|
||||||
|
import net.minecraftforge.common.capabilities.Capability;
|
||||||
|
import net.minecraftforge.common.capabilities.CapabilityInject;
|
||||||
import net.minecraftforge.items.CapabilityItemHandler;
|
import net.minecraftforge.items.CapabilityItemHandler;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
@@ -95,6 +98,8 @@ import appeng.util.prioritylist.PrecisePriorityList;
|
|||||||
|
|
||||||
public class PartStorageBus extends PartUpgradeable implements IGridTickable, ICellContainer, IMEMonitorHandlerReceiver<IAEItemStack>, IPriorityHost
|
public class PartStorageBus extends PartUpgradeable implements IGridTickable, ICellContainer, IMEMonitorHandlerReceiver<IAEItemStack>, IPriorityHost
|
||||||
{
|
{
|
||||||
|
@CapabilityInject(IItemRepository.class)
|
||||||
|
public static Capability<IItemRepository> ITEM_REPOSITORY_CAPABILITY = null;
|
||||||
|
|
||||||
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/storage_bus_base" );
|
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/storage_bus_base" );
|
||||||
|
|
||||||
@@ -253,19 +258,19 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
|||||||
@Override
|
@Override
|
||||||
public void postChange( final IBaseMonitor<IAEItemStack> monitor, final Iterable<IAEItemStack> change, final IActionSource source )
|
public void postChange( final IBaseMonitor<IAEItemStack> monitor, final Iterable<IAEItemStack> change, final IActionSource source )
|
||||||
{
|
{
|
||||||
try
|
if( source == this.mySrc || source.machine().map( machine -> machine == this ).orElse( false ) )
|
||||||
{
|
{
|
||||||
if( this.getProxy().isActive() )
|
try
|
||||||
{
|
{
|
||||||
this.getProxy()
|
if( this.getProxy().isActive() )
|
||||||
.getStorage()
|
{
|
||||||
.postAlterationOfStoredItems( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ), change,
|
this.getProxy().getStorage().postAlterationOfStoredItems( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ), change, this.mySrc );
|
||||||
this.mySrc );
|
}
|
||||||
|
}
|
||||||
|
catch( final GridAccessException e )
|
||||||
|
{
|
||||||
|
// :(
|
||||||
}
|
}
|
||||||
}
|
|
||||||
catch( final GridAccessException e )
|
|
||||||
{
|
|
||||||
// :(
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,6 +400,15 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check via cap for IItemRepository
|
||||||
|
if (ITEM_REPOSITORY_CAPABILITY != null && target.hasCapability( ITEM_REPOSITORY_CAPABILITY, targetSide ))
|
||||||
|
{
|
||||||
|
IItemRepository handlerRepo = target.getCapability( ITEM_REPOSITORY_CAPABILITY, targetSide );
|
||||||
|
if( handlerRepo != null )
|
||||||
|
{
|
||||||
|
return new ItemRepositoryAdapter( handlerRepo, this );
|
||||||
|
}
|
||||||
|
}
|
||||||
// Check via cap for IItemHandler
|
// Check via cap for IItemHandler
|
||||||
IItemHandler handlerExt = target.getCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, targetSide );
|
IItemHandler handlerExt = target.getCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, targetSide );
|
||||||
if( handlerExt != null )
|
if( handlerExt != null )
|
||||||
@@ -420,6 +434,16 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
|||||||
return Objects.hash( target, target.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide ) );
|
return Objects.hash( target, target.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ITEM_REPOSITORY_CAPABILITY != null && target.hasCapability( ITEM_REPOSITORY_CAPABILITY, targetSide ))
|
||||||
|
{
|
||||||
|
final IItemRepository handlerRepo = target.getCapability( ITEM_REPOSITORY_CAPABILITY, targetSide );
|
||||||
|
|
||||||
|
if( handlerRepo != null )
|
||||||
|
{
|
||||||
|
return Objects.hash( target, handlerRepo, handlerRepo.getAllItems().size() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final IItemHandler itemHandler = target.getCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, targetSide );
|
final IItemHandler itemHandler = target.getCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, targetSide );
|
||||||
|
|
||||||
if( itemHandler != null )
|
if( itemHandler != null )
|
||||||
@@ -466,6 +490,7 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
|||||||
{
|
{
|
||||||
this.monitor = (ITickingMonitor) inv;
|
this.monitor = (ITickingMonitor) inv;
|
||||||
this.monitor.setActionSource( new MachineSource( this ) );
|
this.monitor.setActionSource( new MachineSource( this ) );
|
||||||
|
this.monitor.setMode( (StorageFilter) this.getConfigManager().getSetting( Settings.STORAGE_FILTER ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( inv != null )
|
if( inv != null )
|
||||||
|
|||||||
@@ -21,6 +21,10 @@ package appeng.parts.reporting;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import appeng.api.storage.channels.IFluidStorageChannel;
|
||||||
|
import appeng.api.storage.data.IAEFluidStack;
|
||||||
|
import appeng.fluids.util.AEFluidStack;
|
||||||
|
import appeng.util.item.AEStack;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
|
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
@@ -31,6 +35,9 @@ import net.minecraft.util.EnumFacing;
|
|||||||
import net.minecraft.util.EnumHand;
|
import net.minecraft.util.EnumHand;
|
||||||
import net.minecraft.util.math.RayTraceResult;
|
import net.minecraft.util.math.RayTraceResult;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
|
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||||
|
import net.minecraftforge.fluids.capability.IFluidHandlerItem;
|
||||||
import net.minecraftforge.fml.relauncher.Side;
|
import net.minecraftforge.fml.relauncher.Side;
|
||||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||||
|
|
||||||
@@ -70,7 +77,9 @@ import appeng.util.item.AEItemStack;
|
|||||||
public abstract class AbstractPartMonitor extends AbstractPartDisplay implements IPartStorageMonitor, IStackWatcherHost
|
public abstract class AbstractPartMonitor extends AbstractPartDisplay implements IPartStorageMonitor, IStackWatcherHost
|
||||||
{
|
{
|
||||||
private static final IWideReadableNumberConverter NUMBER_CONVERTER = ReadableNumberConverter.INSTANCE;
|
private static final IWideReadableNumberConverter NUMBER_CONVERTER = ReadableNumberConverter.INSTANCE;
|
||||||
|
|
||||||
private IAEItemStack configuredItem;
|
private IAEItemStack configuredItem;
|
||||||
|
private IAEFluidStack configuredFluid;
|
||||||
private String lastHumanReadableText;
|
private String lastHumanReadableText;
|
||||||
private boolean isLocked;
|
private boolean isLocked;
|
||||||
private IStackWatcher myWatcher;
|
private IStackWatcher myWatcher;
|
||||||
@@ -90,6 +99,9 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
|
|
||||||
final NBTTagCompound myItem = data.getCompoundTag( "configuredItem" );
|
final NBTTagCompound myItem = data.getCompoundTag( "configuredItem" );
|
||||||
this.configuredItem = AEItemStack.fromNBT( myItem );
|
this.configuredItem = AEItemStack.fromNBT( myItem );
|
||||||
|
|
||||||
|
final NBTTagCompound myFluid = data.getCompoundTag( "configuredFluid" );
|
||||||
|
this.configuredFluid = AEFluidStack.fromNBT( myFluid );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -104,8 +116,15 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
{
|
{
|
||||||
this.configuredItem.writeToNBT( myItem );
|
this.configuredItem.writeToNBT( myItem );
|
||||||
}
|
}
|
||||||
|
final NBTTagCompound myFluid = new NBTTagCompound();
|
||||||
|
if( this.configuredFluid != null )
|
||||||
|
{
|
||||||
|
this.configuredFluid.writeToNBT( myFluid );
|
||||||
|
}
|
||||||
|
|
||||||
data.setTag( "configuredItem", myItem );
|
data.setTag( "configuredItem", myItem );
|
||||||
|
data.setTag( "configuredFluid", myFluid );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -114,11 +133,17 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
super.writeToStream( data );
|
super.writeToStream( data );
|
||||||
|
|
||||||
data.writeBoolean( this.isLocked );
|
data.writeBoolean( this.isLocked );
|
||||||
data.writeBoolean( this.configuredItem != null );
|
//is configured
|
||||||
|
data.writeBoolean( this.configuredItem != null);
|
||||||
|
data.writeBoolean( this.configuredFluid != null);
|
||||||
if( this.configuredItem != null )
|
if( this.configuredItem != null )
|
||||||
{
|
{
|
||||||
this.configuredItem.writeToPacket( data );
|
this.configuredItem.writeToPacket( data );
|
||||||
}
|
}
|
||||||
|
else if( this.configuredFluid != null )
|
||||||
|
{
|
||||||
|
this.configuredFluid.writeToPacket( data );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -131,14 +156,22 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
|
|
||||||
this.isLocked = isLocked;
|
this.isLocked = isLocked;
|
||||||
|
|
||||||
final boolean val = data.readBoolean();
|
final boolean isItem = data.readBoolean();
|
||||||
if( val )
|
final boolean isFluid = data.readBoolean();
|
||||||
|
if( isItem )
|
||||||
{
|
{
|
||||||
this.configuredItem = AEItemStack.fromPacket( data );
|
this.configuredItem = AEItemStack.fromPacket( data );
|
||||||
|
this.configuredFluid = null;
|
||||||
|
}
|
||||||
|
else if( isFluid )
|
||||||
|
{
|
||||||
|
this.configuredFluid = AEFluidStack.fromPacket( data );
|
||||||
|
this.configuredItem = null;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.configuredItem = null;
|
this.configuredItem = null;
|
||||||
|
this.configuredFluid = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return needRedraw;
|
return needRedraw;
|
||||||
@@ -165,7 +198,25 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
if( !this.isLocked )
|
if( !this.isLocked )
|
||||||
{
|
{
|
||||||
final ItemStack eq = player.getHeldItem( hand );
|
final ItemStack eq = player.getHeldItem( hand );
|
||||||
this.configuredItem = AEItemStack.fromItemStack( eq );
|
FluidStack fluidInTank = null;
|
||||||
|
|
||||||
|
if( eq.hasCapability( CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null ) )
|
||||||
|
{
|
||||||
|
IFluidHandlerItem fluidHandlerItem = ( eq.getCapability( CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null ) );
|
||||||
|
fluidInTank = fluidHandlerItem.drain( Integer.MAX_VALUE, false );
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fluidInTank == null)
|
||||||
|
{
|
||||||
|
this.configuredFluid = null;
|
||||||
|
this.configuredItem = AEItemStack.fromItemStack( eq );
|
||||||
|
}
|
||||||
|
else if( fluidInTank.amount > 0 )
|
||||||
|
{
|
||||||
|
this.configuredFluid = AEFluidStack.fromFluidStack( fluidInTank );
|
||||||
|
this.configuredItem = null;
|
||||||
|
}
|
||||||
|
|
||||||
this.configureWatchers();
|
this.configureWatchers();
|
||||||
this.getHost().markForSave();
|
this.getHost().markForSave();
|
||||||
this.getHost().markForUpdate();
|
this.getHost().markForUpdate();
|
||||||
@@ -227,6 +278,16 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
this.updateReportingValue(
|
this.updateReportingValue(
|
||||||
this.getProxy().getStorage().getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ) );
|
this.getProxy().getStorage().getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ) );
|
||||||
}
|
}
|
||||||
|
else if ( this.configuredFluid != null )
|
||||||
|
{
|
||||||
|
if( this.myWatcher != null )
|
||||||
|
{
|
||||||
|
this.myWatcher.add( this.configuredFluid );
|
||||||
|
}
|
||||||
|
|
||||||
|
this.updateReportingValue(
|
||||||
|
this.getProxy().getStorage().getInventory( AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch( final GridAccessException e )
|
catch( final GridAccessException e )
|
||||||
{
|
{
|
||||||
@@ -234,11 +295,12 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateReportingValue( final IMEMonitor<IAEItemStack> itemInventory )
|
private <T extends IAEStack<T>> void updateReportingValue ( final IMEMonitor<T> monitor )
|
||||||
{
|
{
|
||||||
if( this.configuredItem != null )
|
|
||||||
|
if( this.configuredItem != null)
|
||||||
{
|
{
|
||||||
final IAEItemStack result = itemInventory.getStorageList().findPrecise( this.configuredItem );
|
final IAEItemStack result = (IAEItemStack) monitor.getStorageList().findPrecise( (T) this.configuredItem );
|
||||||
if( result == null )
|
if( result == null )
|
||||||
{
|
{
|
||||||
this.configuredItem.setStackSize( 0 );
|
this.configuredItem.setStackSize( 0 );
|
||||||
@@ -248,6 +310,18 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
this.configuredItem.setStackSize( result.getStackSize() );
|
this.configuredItem.setStackSize( result.getStackSize() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if( this.configuredFluid != null)
|
||||||
|
{
|
||||||
|
final IAEFluidStack result = (IAEFluidStack) monitor.getStorageList().findPrecise( (T) this.configuredFluid );
|
||||||
|
if( result == null )
|
||||||
|
{
|
||||||
|
this.configuredFluid.setStackSize( 0 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.configuredFluid.setStackSize( result.getStackSize() );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -260,7 +334,7 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final IAEItemStack ais = this.getDisplayed();
|
IAEStack<?> ais = this.getDisplayed();
|
||||||
|
|
||||||
if( ais == null )
|
if( ais == null )
|
||||||
{
|
{
|
||||||
@@ -274,8 +348,10 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
|
|
||||||
TesrRenderHelper.moveToFace( facing );
|
TesrRenderHelper.moveToFace( facing );
|
||||||
TesrRenderHelper.rotateToFace( facing, this.getSpin() );
|
TesrRenderHelper.rotateToFace( facing, this.getSpin() );
|
||||||
TesrRenderHelper.renderItem2dWithAmount( ais, 0.8f, 0.17f );
|
if (ais instanceof IAEItemStack)
|
||||||
|
TesrRenderHelper.renderItem2dWithAmount( (IAEItemStack) ais, 0.8f, 0.17f );
|
||||||
|
if (ais instanceof IAEFluidStack)
|
||||||
|
TesrRenderHelper.renderFluid2dWithAmount( (IAEFluidStack) ais, 0.8f, 0.17f );
|
||||||
GlStateManager.popMatrix();
|
GlStateManager.popMatrix();
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -287,9 +363,13 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IAEItemStack getDisplayed()
|
public IAEStack<?> getDisplayed()
|
||||||
{
|
{
|
||||||
|
if (this.configuredItem != null)
|
||||||
return this.configuredItem;
|
return this.configuredItem;
|
||||||
|
else if (this.configuredFluid != null)
|
||||||
|
return this.configuredFluid;
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -322,6 +402,26 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
final long stackSize = this.configuredItem.getStackSize();
|
final long stackSize = this.configuredItem.getStackSize();
|
||||||
final String humanReadableText = NUMBER_CONVERTER.toWideReadableForm( stackSize );
|
final String humanReadableText = NUMBER_CONVERTER.toWideReadableForm( stackSize );
|
||||||
|
|
||||||
|
if( !humanReadableText.equals( this.lastHumanReadableText ) )
|
||||||
|
{
|
||||||
|
this.lastHumanReadableText = humanReadableText;
|
||||||
|
this.getHost().markForUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( this.configuredFluid != null )
|
||||||
|
{
|
||||||
|
if( fullStack == null )
|
||||||
|
{
|
||||||
|
this.configuredFluid.setStackSize( 0 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.configuredFluid.setStackSize( fullStack.getStackSize() );
|
||||||
|
}
|
||||||
|
|
||||||
|
final long stackSize = this.configuredFluid.getStackSize() / 1000;
|
||||||
|
final String humanReadableText = NUMBER_CONVERTER.toWideReadableForm( stackSize ) + "B";
|
||||||
|
|
||||||
if( !humanReadableText.equals( this.lastHumanReadableText ) )
|
if( !humanReadableText.equals( this.lastHumanReadableText ) )
|
||||||
{
|
{
|
||||||
this.lastHumanReadableText = humanReadableText;
|
this.lastHumanReadableText = humanReadableText;
|
||||||
|
|||||||
@@ -19,15 +19,31 @@
|
|||||||
package appeng.parts.reporting;
|
package appeng.parts.reporting;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import appeng.api.config.Actionable;
|
||||||
|
import appeng.api.storage.channels.IFluidStorageChannel;
|
||||||
|
import appeng.api.storage.data.IAEFluidStack;
|
||||||
|
import appeng.api.storage.data.IAEStack;
|
||||||
|
import appeng.core.AELog;
|
||||||
|
import appeng.core.sync.network.NetworkHandler;
|
||||||
|
import appeng.core.sync.packets.PacketInventoryAction;
|
||||||
|
import appeng.fluids.util.AEFluidStack;
|
||||||
|
import appeng.helpers.InventoryAction;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.EnumHand;
|
import net.minecraft.util.EnumHand;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
|
import net.minecraftforge.fluids.FluidUtil;
|
||||||
|
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||||
|
import net.minecraftforge.fluids.capability.IFluidHandlerItem;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
import net.minecraftforge.items.wrapper.PlayerMainInvWrapper;
|
import net.minecraftforge.items.wrapper.PlayerMainInvWrapper;
|
||||||
|
|
||||||
@@ -92,6 +108,13 @@ public class PartConversionMonitor extends AbstractPartMonitor
|
|||||||
}
|
}
|
||||||
|
|
||||||
final ItemStack eq = player.getHeldItem( hand );
|
final ItemStack eq = player.getHeldItem( hand );
|
||||||
|
FluidStack fluidInTank = null;
|
||||||
|
if( eq.hasCapability( CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null ) )
|
||||||
|
{
|
||||||
|
IFluidHandlerItem fluidHandlerItem = ( eq.getCapability( CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null ) );
|
||||||
|
fluidInTank = fluidHandlerItem.drain( Integer.MAX_VALUE, false );
|
||||||
|
}
|
||||||
|
|
||||||
if( this.isLocked() )
|
if( this.isLocked() )
|
||||||
{
|
{
|
||||||
if( eq.isEmpty() )
|
if( eq.isEmpty() )
|
||||||
@@ -103,18 +126,49 @@ public class PartConversionMonitor extends AbstractPartMonitor
|
|||||||
// wrench it
|
// wrench it
|
||||||
return super.onPartActivate( player, hand, pos );
|
return super.onPartActivate( player, hand, pos );
|
||||||
}
|
}
|
||||||
|
else if( fluidInTank != null && fluidInTank.amount > 0 )
|
||||||
|
{
|
||||||
|
if( this.getDisplayed() != null && getDisplayed().equals( AEFluidStack.fromFluidStack( fluidInTank ) ) )
|
||||||
|
{
|
||||||
|
this.drainFluidContainer( player, hand );
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.insertItem( player, hand, false );
|
this.insertItem( player, hand, false );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else if( this.getDisplayed() != null && this.getDisplayed().equals( eq ) )
|
|
||||||
|
//If its a fluid container, grab its fluidstack. if its empty pass its itemstack;
|
||||||
|
|
||||||
|
if (eq.isEmpty()){
|
||||||
|
return super.onPartActivate( player, hand, pos );
|
||||||
|
}
|
||||||
|
if( fluidInTank != null && fluidInTank.amount > 0 )
|
||||||
{
|
{
|
||||||
this.insertItem( player, hand, false );
|
if( getDisplayed() instanceof IAEItemStack || getDisplayed() == null )
|
||||||
|
{
|
||||||
|
return super.onPartActivate( player, hand, pos );
|
||||||
|
}
|
||||||
|
if( ( (IAEFluidStack) this.getDisplayed() ).equals( AEFluidStack.fromFluidStack( fluidInTank ) ) )
|
||||||
|
{
|
||||||
|
this.drainFluidContainer( player, hand );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return super.onPartActivate( player, hand, pos );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return super.onPartActivate( player, hand, pos );
|
if( getDisplayed() instanceof IAEFluidStack || getDisplayed() == null )
|
||||||
|
{
|
||||||
|
return super.onPartActivate( player, hand, pos );
|
||||||
|
}
|
||||||
|
if( ( (IAEItemStack) this.getDisplayed() ).equals( eq ) )
|
||||||
|
{
|
||||||
|
this.insertItem( player, hand, false );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -138,9 +192,14 @@ public class PartConversionMonitor extends AbstractPartMonitor
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( this.getDisplayed() != null )
|
ItemStack eq = player.getHeldItem( hand );
|
||||||
|
if( this.getDisplayed() != null && this.getDisplayed() instanceof IAEItemStack )
|
||||||
{
|
{
|
||||||
this.extractItem( player, this.getDisplayed().getDefinition().getMaxStackSize() );
|
this.extractItem( player, ( (IAEItemStack) this.getDisplayed() ).getDefinition().getMaxStackSize() );
|
||||||
|
}
|
||||||
|
else if( this.getDisplayed() != null && this.getDisplayed() instanceof IAEFluidStack )
|
||||||
|
{
|
||||||
|
this.fillFluidContainer( player,hand );
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -183,9 +242,9 @@ public class PartConversionMonitor extends AbstractPartMonitor
|
|||||||
|
|
||||||
if( allItems )
|
if( allItems )
|
||||||
{
|
{
|
||||||
if( this.getDisplayed() != null )
|
if( this.getDisplayed() != null && this.getDisplayed() instanceof IAEItemStack)
|
||||||
{
|
{
|
||||||
final IAEItemStack input = this.getDisplayed().copy();
|
final IAEItemStack input = (IAEItemStack) this.getDisplayed().copy();
|
||||||
IItemHandler inv = new PlayerMainInvWrapper( player.inventory );
|
IItemHandler inv = new PlayerMainInvWrapper( player.inventory );
|
||||||
|
|
||||||
for( int x = 0; x < inv.getSlots(); x++ )
|
for( int x = 0; x < inv.getSlots(); x++ )
|
||||||
@@ -221,7 +280,9 @@ public class PartConversionMonitor extends AbstractPartMonitor
|
|||||||
|
|
||||||
private void extractItem( final EntityPlayer player, int count )
|
private void extractItem( final EntityPlayer player, int count )
|
||||||
{
|
{
|
||||||
final IAEItemStack input = this.getDisplayed();
|
if (!(this.getDisplayed() instanceof IAEItemStack))
|
||||||
|
return;
|
||||||
|
final IAEItemStack input = (IAEItemStack) this.getDisplayed();
|
||||||
if( input != null )
|
if( input != null )
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -265,6 +326,141 @@ public class PartConversionMonitor extends AbstractPartMonitor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void drainFluidContainer( final EntityPlayer player, final EnumHand hand ) {
|
||||||
|
try
|
||||||
|
{
|
||||||
|
final ItemStack held = player.getHeldItem( hand );
|
||||||
|
if( held.getCount() != 1 )
|
||||||
|
{
|
||||||
|
// only support stacksize 1 for now
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final IFluidHandlerItem fh = FluidUtil.getFluidHandler( held );
|
||||||
|
if( fh == null )
|
||||||
|
{
|
||||||
|
// only fluid handlers items
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 IEnergySource energy = this.getProxy().getEnergy();
|
||||||
|
final IMEMonitor<IAEFluidStack> cell = this.getProxy()
|
||||||
|
.getStorage()
|
||||||
|
.getInventory(
|
||||||
|
AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) );
|
||||||
|
final IAEFluidStack notStorable = Platform.poweredInsert( energy, cell, AEFluidStack.fromFluidStack( extract ), new PlayerSource( player, this ), 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( energy, cell, AEFluidStack.fromFluidStack( extract ), new PlayerSource( player, this ) );
|
||||||
|
|
||||||
|
if( notInserted != null && notInserted.getStackSize() > 0 )
|
||||||
|
{
|
||||||
|
AELog.error( "Fluid item [%s] reported a different possible amount to drain than it actually provided.", held.getDisplayName() );
|
||||||
|
}
|
||||||
|
|
||||||
|
player.setHeldItem( hand, fh.getContainer() );
|
||||||
|
}
|
||||||
|
catch( GridAccessException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fillFluidContainer( final EntityPlayer player, final EnumHand hand )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
final ItemStack held = player.getHeldItem( hand );
|
||||||
|
if( held.getCount() != 1 )
|
||||||
|
{
|
||||||
|
// only support stacksize 1 for now
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final IFluidHandlerItem fh = FluidUtil.getFluidHandler( held );
|
||||||
|
if( fh == null )
|
||||||
|
{
|
||||||
|
// only fluid handlers items
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final IAEFluidStack stack = (IAEFluidStack) this.getDisplayed().copy();
|
||||||
|
|
||||||
|
// Check how much we can store in the item
|
||||||
|
stack.setStackSize( Integer.MAX_VALUE );
|
||||||
|
int amountAllowed = fh.fill( stack.getFluidStack(), false );
|
||||||
|
stack.setStackSize( amountAllowed );
|
||||||
|
|
||||||
|
// Check if we can pull out of the system
|
||||||
|
final IEnergySource energy = this.getProxy().getEnergy();
|
||||||
|
final IMEMonitor<IAEFluidStack> cell = this.getProxy()
|
||||||
|
.getStorage()
|
||||||
|
.getInventory(
|
||||||
|
AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) );
|
||||||
|
final IAEFluidStack canPull = Platform.poweredExtraction( energy, cell, stack, new PlayerSource( player, this ), 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
|
||||||
|
stack.setStackSize( canFill );
|
||||||
|
final IAEFluidStack pulled = Platform.poweredExtraction( energy, cell, stack, new PlayerSource( player, this ) );
|
||||||
|
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() );
|
||||||
|
}
|
||||||
|
player.setHeldItem( hand, fh.getContainer() );
|
||||||
|
}
|
||||||
|
catch( GridAccessException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IPartModel getStaticModels()
|
public IPartModel getStaticModels()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -44,6 +44,9 @@ public class PartInterfaceTerminal extends AbstractPartDisplay
|
|||||||
public static final IPartModel MODELS_OFF = new PartModel( MODEL_BASE, MODEL_OFF, MODEL_STATUS_OFF );
|
public static final IPartModel MODELS_OFF = new PartModel( MODEL_BASE, MODEL_OFF, MODEL_STATUS_OFF );
|
||||||
public static final IPartModel MODELS_ON = new PartModel( MODEL_BASE, MODEL_ON, MODEL_STATUS_ON );
|
public static final IPartModel MODELS_ON = new PartModel( MODEL_BASE, MODEL_ON, MODEL_STATUS_ON );
|
||||||
public static final IPartModel MODELS_HAS_CHANNEL = new PartModel( MODEL_BASE, MODEL_ON, MODEL_STATUS_HAS_CHANNEL );
|
public static final IPartModel MODELS_HAS_CHANNEL = new PartModel( MODEL_BASE, MODEL_ON, MODEL_STATUS_HAS_CHANNEL );
|
||||||
|
public String in = "";
|
||||||
|
public String out = "";
|
||||||
|
public boolean onlyInterfacesWithFreeSlots = false;
|
||||||
|
|
||||||
public PartInterfaceTerminal( final ItemStack is )
|
public PartInterfaceTerminal( final ItemStack is )
|
||||||
{
|
{
|
||||||
@@ -69,4 +72,8 @@ public class PartInterfaceTerminal extends AbstractPartDisplay
|
|||||||
return this.selectModel( MODELS_OFF, MODELS_ON, MODELS_HAS_CHANNEL );
|
return this.selectModel( MODELS_OFF, MODELS_ON, MODELS_HAS_CHANNEL );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void saveSearchStrings(String in, String out){
|
||||||
|
this.in = in;
|
||||||
|
this.out = out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package appeng.recipes.factories.conditions;
|
||||||
|
|
||||||
|
import appeng.core.Api;
|
||||||
|
import appeng.core.AppEng;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import net.minecraft.util.JsonUtils;
|
||||||
|
import net.minecraftforge.common.crafting.IConditionFactory;
|
||||||
|
import net.minecraftforge.common.crafting.JsonContext;
|
||||||
|
|
||||||
|
import java.util.function.BooleanSupplier;
|
||||||
|
|
||||||
|
public class PartExists implements IConditionFactory {
|
||||||
|
|
||||||
|
private static final String JSON_MATERIAL_KEY = "part";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BooleanSupplier parse(JsonContext jsonContext, JsonObject jsonObject )
|
||||||
|
{
|
||||||
|
final boolean result;
|
||||||
|
|
||||||
|
if( JsonUtils.isString( jsonObject, JSON_MATERIAL_KEY ) )
|
||||||
|
{
|
||||||
|
final String part = JsonUtils.getString( jsonObject, JSON_MATERIAL_KEY );
|
||||||
|
final Object item = Api.INSTANCE.registries().recipes().resolveItem( AppEng.MOD_ID, part );
|
||||||
|
|
||||||
|
result = item != null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return () -> result;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,6 +28,8 @@ import java.util.Map;
|
|||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import appeng.fluids.helper.IConfigurableFluidInventory;
|
||||||
|
import appeng.fluids.util.AEFluidInventory;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
|
|
||||||
@@ -41,6 +43,7 @@ import net.minecraft.tileentity.TileEntity;
|
|||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
import appeng.api.implementations.tiles.ISegmentedInventory;
|
import appeng.api.implementations.tiles.ISegmentedInventory;
|
||||||
@@ -398,6 +401,18 @@ public class AEBaseTile extends TileEntity implements IOrientable, ICommonTile,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this instanceof IConfigurableFluidInventory ) {
|
||||||
|
final IFluidHandler tank = ((IConfigurableFluidInventory) this).getFluidInventoryByName("config");
|
||||||
|
if (tank instanceof AEFluidInventory) {
|
||||||
|
final AEFluidInventory target = (AEFluidInventory) tank;
|
||||||
|
final AEFluidInventory tmp = new AEFluidInventory(null, target.getSlots());
|
||||||
|
tmp.readFromNBT(compound, "config");
|
||||||
|
for (int x = 0; x < tmp.getSlots(); x++) {
|
||||||
|
target.setFluidInSlot(x, tmp.getFluidInSlot(x));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -462,6 +477,13 @@ public class AEBaseTile extends TileEntity implements IOrientable, ICommonTile,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this instanceof IConfigurableFluidInventory) {
|
||||||
|
final IFluidHandler tank = ((IConfigurableFluidInventory) this).getFluidInventoryByName("config");
|
||||||
|
if (tank instanceof AEFluidInventory ) {
|
||||||
|
((AEFluidInventory) tank).writeToNBT(output, "config");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return output.hasNoTags() ? null : output;
|
return output.hasNoTags() ? null : output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -458,8 +458,6 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
|
|||||||
final ItemStack output = this.myPlan.getOutput( this.craftingInv, this.getWorld() );
|
final ItemStack output = this.myPlan.getOutput( this.craftingInv, this.getWorld() );
|
||||||
if( !output.isEmpty() )
|
if( !output.isEmpty() )
|
||||||
{
|
{
|
||||||
FMLCommonHandler.instance().firePlayerCraftingEvent( Platform.getPlayer( (WorldServer) this.getWorld() ), output, this.craftingInv );
|
|
||||||
|
|
||||||
this.pushOut( output.copy() );
|
this.pushOut( output.copy() );
|
||||||
|
|
||||||
for( int x = 0; x < this.craftingInv.getSizeInventory(); x++ )
|
for( int x = 0; x < this.craftingInv.getSizeInventory(); x++ )
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package appeng.util;
|
||||||
|
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
|
||||||
|
|
||||||
|
public class BlockPosUtils
|
||||||
|
{
|
||||||
|
public static long getDistance( BlockPos blockPos, BlockPos blockPos2 )
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
if( (blockPos.getX() > 0 && blockPos2.getX() > 0) || (blockPos.getX() < 0 && blockPos2.getX() < 0))
|
||||||
|
{
|
||||||
|
x = blockPos.getX() - blockPos2.getX();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
x = blockPos.getX() + blockPos2.getX();
|
||||||
|
}
|
||||||
|
|
||||||
|
int y;
|
||||||
|
if( (blockPos.getY() > 0 && blockPos2.getY() > 0) || (blockPos.getY() < 0 && blockPos2.getY() < 0) )
|
||||||
|
{
|
||||||
|
y = blockPos.getY() - blockPos2.getY();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
y = blockPos.getY() + blockPos2.getY();
|
||||||
|
}
|
||||||
|
|
||||||
|
int z;
|
||||||
|
if( (blockPos.getZ() > 0 && blockPos2.getZ() > 0) || (blockPos.getZ() < 0 && blockPos2.getZ() < 0) )
|
||||||
|
{
|
||||||
|
z = blockPos.getZ() - blockPos2.getZ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
z = blockPos.getZ() + blockPos2.getZ();
|
||||||
|
}
|
||||||
|
return Math.abs( x ) + Math.abs( y ) + Math.abs( z );
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,19 +19,18 @@
|
|||||||
package appeng.util;
|
package appeng.util;
|
||||||
|
|
||||||
|
|
||||||
|
import appeng.util.inv.*;
|
||||||
|
import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
|
import net.minecraftforge.common.capabilities.Capability;
|
||||||
|
import net.minecraftforge.common.capabilities.CapabilityInject;
|
||||||
import net.minecraftforge.items.CapabilityItemHandler;
|
import net.minecraftforge.items.CapabilityItemHandler;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
import appeng.api.config.FuzzyMode;
|
import appeng.api.config.FuzzyMode;
|
||||||
import appeng.util.inv.AdaptorItemHandler;
|
|
||||||
import appeng.util.inv.AdaptorItemHandlerPlayerInv;
|
|
||||||
import appeng.util.inv.IInventoryDestination;
|
|
||||||
import appeng.util.inv.ItemSlot;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Universal Facade for other inventories. Used to conveniently interact with various types of inventories. This is not
|
* Universal Facade for other inventories. Used to conveniently interact with various types of inventories. This is not
|
||||||
@@ -41,15 +40,29 @@ import appeng.util.inv.ItemSlot;
|
|||||||
*/
|
*/
|
||||||
public abstract class InventoryAdaptor implements Iterable<ItemSlot>
|
public abstract class InventoryAdaptor implements Iterable<ItemSlot>
|
||||||
{
|
{
|
||||||
|
@CapabilityInject( IItemRepository.class)
|
||||||
|
public static Capability<IItemRepository> ITEM_REPOSITORY_CAPABILITY = null;
|
||||||
|
|
||||||
public static InventoryAdaptor getAdaptor( final TileEntity te, final EnumFacing d )
|
public static InventoryAdaptor getAdaptor( final TileEntity te, final EnumFacing d )
|
||||||
{
|
{
|
||||||
if( te != null && te.hasCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d ) )
|
if( te != null )
|
||||||
{
|
{
|
||||||
// Attempt getting an IItemHandler for the given side via caps
|
if( ITEM_REPOSITORY_CAPABILITY != null && te.hasCapability( ITEM_REPOSITORY_CAPABILITY, d ) )
|
||||||
IItemHandler itemHandler = te.getCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d );
|
|
||||||
if( itemHandler != null )
|
|
||||||
{
|
{
|
||||||
return new AdaptorItemHandler( itemHandler );
|
IItemRepository itemRepository = te.getCapability( ITEM_REPOSITORY_CAPABILITY, d );
|
||||||
|
if (itemRepository != null){
|
||||||
|
return new AdaptorItemRepository( itemRepository );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( te.hasCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d ) )
|
||||||
|
{
|
||||||
|
|
||||||
|
// Attempt getting an IItemHandler for the given side via caps
|
||||||
|
IItemHandler itemHandler = te.getCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d );
|
||||||
|
if( itemHandler != null )
|
||||||
|
{
|
||||||
|
return new AdaptorItemHandler( itemHandler );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@@ -82,4 +95,5 @@ public abstract class InventoryAdaptor implements Iterable<ItemSlot>
|
|||||||
public abstract boolean containsItems();
|
public abstract boolean containsItems();
|
||||||
|
|
||||||
public abstract boolean hasSlots();
|
public abstract boolean hasSlots();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -264,4 +264,5 @@ public class AdaptorItemHandler extends InventoryAdaptor
|
|||||||
{
|
{
|
||||||
return new ItemHandlerIterator( this.itemHandler );
|
return new ItemHandlerIterator( this.itemHandler );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,209 @@
|
|||||||
|
package appeng.util.inv;
|
||||||
|
|
||||||
|
import appeng.api.config.FuzzyMode;
|
||||||
|
import appeng.util.InventoryAdaptor;
|
||||||
|
|
||||||
|
import appeng.util.Platform;
|
||||||
|
import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
|
||||||
|
public class AdaptorItemRepository extends InventoryAdaptor
|
||||||
|
{
|
||||||
|
protected final IItemRepository itemRepository;
|
||||||
|
|
||||||
|
public AdaptorItemRepository( IItemRepository itemRepository )
|
||||||
|
{
|
||||||
|
this.itemRepository = itemRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack removeItems( int amount, ItemStack filter, IInventoryDestination destination )
|
||||||
|
{
|
||||||
|
ItemStack rv = ItemStack.EMPTY;
|
||||||
|
ItemStack extracted = ItemStack.EMPTY;
|
||||||
|
|
||||||
|
if( !filter.isEmpty() )
|
||||||
|
{
|
||||||
|
extracted = this.itemRepository.extractItem( filter, amount, true );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for( IItemRepository.ItemRecord record : this.itemRepository.getAllItems() )
|
||||||
|
{
|
||||||
|
extracted = this.itemRepository.extractItem( record.itemPrototype, amount, true );
|
||||||
|
if( !extracted.isEmpty() )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( destination != null )
|
||||||
|
{
|
||||||
|
|
||||||
|
if( extracted.isEmpty() || !destination.canInsert( extracted ) )
|
||||||
|
{
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
extracted = this.itemRepository.extractItem( filter, amount, false );
|
||||||
|
|
||||||
|
return extracted;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack simulateRemove( int amount, ItemStack filter, IInventoryDestination destination )
|
||||||
|
{
|
||||||
|
ItemStack rv = ItemStack.EMPTY;
|
||||||
|
ItemStack extracted = ItemStack.EMPTY;
|
||||||
|
|
||||||
|
if( !filter.isEmpty() )
|
||||||
|
{
|
||||||
|
extracted = this.itemRepository.extractItem( filter, amount, true );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for( IItemRepository.ItemRecord record : this.itemRepository.getAllItems() )
|
||||||
|
{
|
||||||
|
extracted = this.itemRepository.extractItem( record.itemPrototype, amount, true );
|
||||||
|
if( !extracted.isEmpty() )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( destination != null )
|
||||||
|
{
|
||||||
|
|
||||||
|
if( extracted.isEmpty() || !destination.canInsert( extracted ) )
|
||||||
|
{
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return extracted;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack removeSimilarItems( int amount, ItemStack filter, FuzzyMode fuzzyMode, IInventoryDestination destination )
|
||||||
|
{
|
||||||
|
ItemStack rv = ItemStack.EMPTY;
|
||||||
|
ItemStack extracted = ItemStack.EMPTY;
|
||||||
|
|
||||||
|
for( IItemRepository.ItemRecord record : this.itemRepository.getAllItems() )
|
||||||
|
{
|
||||||
|
if( Platform.itemComparisons().isFuzzyEqualItem( record.itemPrototype, filter, fuzzyMode ) )
|
||||||
|
{
|
||||||
|
extracted = this.itemRepository.extractItem( record.itemPrototype, amount, true );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !extracted.isEmpty() )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( destination != null )
|
||||||
|
{
|
||||||
|
|
||||||
|
if( extracted.isEmpty() || !destination.canInsert( extracted ) )
|
||||||
|
{
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
extracted = this.itemRepository.extractItem( extracted, amount, false );
|
||||||
|
|
||||||
|
return extracted;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack simulateSimilarRemove( int amount, ItemStack filter, FuzzyMode fuzzyMode, IInventoryDestination destination )
|
||||||
|
{
|
||||||
|
ItemStack rv = ItemStack.EMPTY;
|
||||||
|
ItemStack extracted = ItemStack.EMPTY;
|
||||||
|
|
||||||
|
for( IItemRepository.ItemRecord record : this.itemRepository.getAllItems() )
|
||||||
|
{
|
||||||
|
if( Platform.itemComparisons().isFuzzyEqualItem( record.itemPrototype, filter, fuzzyMode ) )
|
||||||
|
{
|
||||||
|
extracted = this.itemRepository.extractItem( record.itemPrototype, amount, true );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !extracted.isEmpty() )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( destination != null )
|
||||||
|
{
|
||||||
|
|
||||||
|
if( extracted.isEmpty() || !destination.canInsert( extracted ) )
|
||||||
|
{
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return extracted;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack addItems( ItemStack toBeAdded )
|
||||||
|
{
|
||||||
|
return this.addItems( toBeAdded, false );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ItemStack addItems( final ItemStack itemsToAdd, final boolean simulate )
|
||||||
|
{
|
||||||
|
if( itemsToAdd.isEmpty() )
|
||||||
|
{
|
||||||
|
return ItemStack.EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemStack left = itemsToAdd.copy();
|
||||||
|
|
||||||
|
left = this.itemRepository.insertItem( left, simulate );
|
||||||
|
|
||||||
|
if( left.isEmpty() )
|
||||||
|
{
|
||||||
|
return ItemStack.EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return left;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack simulateAdd( ItemStack toBeSimulated )
|
||||||
|
{
|
||||||
|
return this.addItems( toBeSimulated, true );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean containsItems()
|
||||||
|
{
|
||||||
|
return !this.itemRepository.getAllItems().isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasSlots()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<ItemSlot> iterator()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -225,4 +225,5 @@ public class AdaptorList extends InventoryAdaptor
|
|||||||
{
|
{
|
||||||
return new StackToSlotIterator( this.i.iterator() );
|
return new StackToSlotIterator( this.i.iterator() );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -203,4 +203,5 @@ public class IMEAdaptor extends InventoryAdaptor
|
|||||||
{
|
{
|
||||||
this.maxSlots = maxSlots;
|
this.maxSlots = maxSlots;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import java.util.NoSuchElementException;
|
|||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
|
|
||||||
class ItemHandlerIterator implements Iterator<ItemSlot>
|
public class ItemHandlerIterator implements Iterator<ItemSlot>
|
||||||
{
|
{
|
||||||
|
|
||||||
private final IItemHandler itemHandler;
|
private final IItemHandler itemHandler;
|
||||||
@@ -34,7 +34,7 @@ class ItemHandlerIterator implements Iterator<ItemSlot>
|
|||||||
|
|
||||||
private int slot = 0;
|
private int slot = 0;
|
||||||
|
|
||||||
ItemHandlerIterator( IItemHandler itemHandler )
|
public ItemHandlerIterator( IItemHandler itemHandler )
|
||||||
{
|
{
|
||||||
this.itemHandler = itemHandler;
|
this.itemHandler = itemHandler;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -199,7 +199,11 @@ final class AESharedItemStack implements Comparable<AESharedItemStack>
|
|||||||
{
|
{
|
||||||
if( newDef.getItem().isDamageable() )
|
if( newDef.getItem().isDamageable() )
|
||||||
{
|
{
|
||||||
if( fuzzy == FuzzyMode.IGNORE_ALL )
|
if (itemStack.getMaxDamage() == 0)
|
||||||
|
{
|
||||||
|
newDef.setItemDamage(itemStack.getItemDamage() );
|
||||||
|
}
|
||||||
|
else if ( fuzzy == FuzzyMode.IGNORE_ALL )
|
||||||
{
|
{
|
||||||
newDef.setItemDamage( MIN_DAMAGE_VALUE );
|
newDef.setItemDamage( MIN_DAMAGE_VALUE );
|
||||||
}
|
}
|
||||||
@@ -240,7 +244,11 @@ final class AESharedItemStack implements Comparable<AESharedItemStack>
|
|||||||
{
|
{
|
||||||
if( newDef.getItem().isDamageable() )
|
if( newDef.getItem().isDamageable() )
|
||||||
{
|
{
|
||||||
if( fuzzy == FuzzyMode.IGNORE_ALL )
|
if (itemStack.getMaxDamage() == 0)
|
||||||
|
{
|
||||||
|
newDef.setItemDamage(itemStack.getItemDamage() );
|
||||||
|
}
|
||||||
|
else if ( fuzzy == FuzzyMode.IGNORE_ALL )
|
||||||
{
|
{
|
||||||
newDef.setItemDamage( itemStack.getMaxDamage() + 1 );
|
newDef.setItemDamage( itemStack.getMaxDamage() + 1 );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,25 @@
|
|||||||
{
|
{
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"type": "forge:and",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:charger"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 16
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"display": {
|
"display": {
|
||||||
"icon": {
|
"icon": {
|
||||||
"item": "appliedenergistics2:part",
|
"item": "appliedenergistics2:part",
|
||||||
@@ -25,4 +46,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,11 @@
|
|||||||
{
|
{
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
"display": {
|
"display": {
|
||||||
"icon": {
|
"icon": {
|
||||||
"item": "appliedenergistics2:material",
|
"item": "appliedenergistics2:material",
|
||||||
@@ -25,4 +32,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,20 @@
|
|||||||
{
|
{
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"type": "forge:and",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:charger"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 1
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"display": {
|
"display": {
|
||||||
"icon": {
|
"icon": {
|
||||||
"item": "appliedenergistics2:charger"
|
"item": "appliedenergistics2:charger"
|
||||||
@@ -23,4 +39,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,10 @@
|
|||||||
{
|
{
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:sky_compass"
|
||||||
|
}
|
||||||
|
],
|
||||||
"display": {
|
"display": {
|
||||||
"icon": {
|
"icon": {
|
||||||
"item": "appliedenergistics2:sky_compass"
|
"item": "appliedenergistics2:sky_compass"
|
||||||
@@ -23,4 +29,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,35 @@
|
|||||||
{
|
{
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"type": "forge:and",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 13
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 14
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 15
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 19
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:controller"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"display": {
|
"display": {
|
||||||
"icon": {
|
"icon": {
|
||||||
"item": "appliedenergistics2:controller"
|
"item": "appliedenergistics2:controller"
|
||||||
@@ -23,4 +54,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,61 @@
|
|||||||
{
|
{
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"type": "forge:and",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:crafting_storage_1k"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:crafting_storage_4k"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:crafting_storage_16k"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:crafting_storage_64k"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 13
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 14
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 15
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 19
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:controller"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 360
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 340
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"display": {
|
"display": {
|
||||||
"icon": {
|
"icon": {
|
||||||
"item": "appliedenergistics2:crafting_storage_64k"
|
"item": "appliedenergistics2:crafting_storage_64k"
|
||||||
@@ -61,4 +118,4 @@
|
|||||||
"c64k"
|
"c64k"
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
+37
-1
@@ -1,4 +1,40 @@
|
|||||||
{
|
{
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"type": "forge:and",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 13
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 14
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 15
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 19
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:controller"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 360
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"display": {
|
"display": {
|
||||||
"icon": {
|
"icon": {
|
||||||
"item": "appliedenergistics2:part",
|
"item": "appliedenergistics2:part",
|
||||||
@@ -25,4 +61,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,33 @@
|
|||||||
{
|
{
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"type": "forge:and",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:charger"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 16
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:facade"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"display": {
|
"display": {
|
||||||
"icon": {
|
"icon": {
|
||||||
"item": "appliedenergistics2:facade"
|
"item": "appliedenergistics2:facade",
|
||||||
|
"nbt": "{item:\"minecraft:stone\"}"
|
||||||
},
|
},
|
||||||
"title": {
|
"title": {
|
||||||
"translate": "achievement.ae2.Facade"
|
"translate": "achievement.ae2.Facade"
|
||||||
@@ -23,4 +49,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,20 @@
|
|||||||
{
|
{
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"type": "forge:and",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:charger"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"display": {
|
"display": {
|
||||||
"icon": {
|
"icon": {
|
||||||
"item": "appliedenergistics2:material",
|
"item": "appliedenergistics2:material",
|
||||||
@@ -25,4 +41,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+21
-1
@@ -1,4 +1,24 @@
|
|||||||
{
|
{
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"type": "forge:and",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:charger"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:quartz_growth_accelerator"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"display": {
|
"display": {
|
||||||
"icon": {
|
"icon": {
|
||||||
"item": "appliedenergistics2:quartz_growth_accelerator"
|
"item": "appliedenergistics2:quartz_growth_accelerator"
|
||||||
@@ -23,4 +43,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,29 @@
|
|||||||
{
|
{
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"type": "forge:and",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:charger"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 16
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:interface"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"display": {
|
"display": {
|
||||||
"icon": {
|
"icon": {
|
||||||
"item": "appliedenergistics2:interface"
|
"item": "appliedenergistics2:interface"
|
||||||
@@ -23,4 +48,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,50 @@
|
|||||||
{
|
{
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:storage_cell_1k"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:storage_cell_4k"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:storage_cell_16k"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:storage_cell_64k"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 13
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 14
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 15
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 19
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:controller"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:io_port"
|
||||||
|
}
|
||||||
|
],
|
||||||
"display": {
|
"display": {
|
||||||
"icon": {
|
"icon": {
|
||||||
"item": "appliedenergistics2:io_port"
|
"item": "appliedenergistics2:io_port"
|
||||||
@@ -23,4 +69,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,25 @@
|
|||||||
{
|
{
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"type": "forge:and",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:charger"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 16
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"display": {
|
"display": {
|
||||||
"icon": {
|
"icon": {
|
||||||
"item": "appliedenergistics2:part",
|
"item": "appliedenergistics2:part",
|
||||||
@@ -17,4 +38,4 @@
|
|||||||
"trigger": "appliedenergistics2:network_apprentice"
|
"trigger": "appliedenergistics2:network_apprentice"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,25 @@
|
|||||||
{
|
{
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"type": "forge:and",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:charger"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 16
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"display": {
|
"display": {
|
||||||
"icon": {
|
"icon": {
|
||||||
"item": "appliedenergistics2:part",
|
"item": "appliedenergistics2:part",
|
||||||
@@ -17,4 +38,4 @@
|
|||||||
"trigger": "appliedenergistics2:network_engineer"
|
"trigger": "appliedenergistics2:network_engineer"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user