Compare commits

..
Author SHA1 Message Date
Jason Mitchell ecf45c56f8 Overlay buttons visible again 2021-03-30 00:29:50 -07:00
Jason Mitchell f67ddeecc4 Hopefully fix backwards compat
* Revert an unnecessary field movement
2021-03-28 12:01:40 -07:00
Jason Mitchell 237c96e7e5 Handler tweaks
* Add GT6 handler info (Thanks @Miradae)
* Move afuels back to FurnaceHandler and statically reference it from TemplateRecipeHandler  **Should** fix #84
2021-03-28 11:04:50 -07:00
Jason Mitchell c12775bb06 Default HandlerInfo if it can't be found. 2021-03-28 10:12:21 -07:00
Jason Mitchell 4dfc4f86bf Introduce HandlerInfo
* Switch handler info loading from code to CSV
 * Add option to load from config or JAR
 * handlers.csv is still a WIP
2021-03-28 00:12:17 -07:00
Jason Mitchell f0e09e2b0d GUI Scaling
* Recipe GUI now scales with window size, and displays more than 2 recipes per page, depending on height.
* Hacks to implement recipes per page, based on some assumptions since the height of the handlers are not exposed and are hardcoded
* _Temporarily_ disabled the overlay buttons; they were hardcoded to expect at most 2, need to make them dynamic and actually work again.
2021-03-27 13:26:11 -07:00
Prometheus0000 5d82f0af54 Fixes some handler bugs (#73)
* Fixes some handler images
* Fixed some handlers not having the right image or being in the right section

Basically just GT/BW/GT++. I also added some spaces to look nicer, and reorganized the GT/BW/GT++ a little.
2021-03-26 17:03:06 -07:00
Jason Mitchell 4c36d0625e Reorg & restyle GuiRecipe to look a bit more like JEI
Add gregtech hax to avoid overlapping
2021-03-24 21:12:18 -07:00
Jason Mitchell 5bfcc73459 Shift everything instead of conditionally 2021-03-24 18:23:30 -07:00
Lex bc1dd44c41 shift of the bookmark border 2021-03-24 18:20:20 -07:00
Jason Mitchell d2de8af64c fixes beta3 2021-03-24 17:49:24 -07:00
Jason Mitchell af50881c6e Bugfixes 2021-03-23 23:34:05 -07:00
Jason Mitchell c971199bd1 Fix IOOBE. 2021-03-23 21:59:40 -07:00
Jason Mitchell 146e882229 Angry Boubs 2021-03-22 21:20:48 -07:00
Jason Mitchell baa0a8962b Add option to switch between JEI tab style and Creative tab style 2021-03-22 20:22:00 -07:00
Léa Gris 400f38d919 impr(tab): user creative inventory tab asset and layout
This allow proprely textured GUI without the need to update a resourcepack.
2021-03-22 19:02:42 -07:00
Jason Mitchell 07ec5f67c5 DrawableResource from JEI. Swap out tab & tab icon drawing. 2021-03-21 21:43:37 -07:00
Léa Gris 79b5da1d1a refactor: override draw with correct signature 2021-03-21 19:39:12 -07:00
Jason Mitchell aa13ba7781 Fix crash on bookmark toggle
Fixes #53
2021-03-21 09:32:03 -07:00
Jason Mitchell 966e404218 JEI Style Tabs 2021-03-20 22:38:46 -07:00
Jason Mitchell b64d3a8be4 Prevent bookmarks from overlapping the armor slots on Creative+ mode 2021-03-20 16:43:24 -07:00
Jason Mitchell 34b8af475d Add bookmark toggle button.
Switch config button to JEI style, and add ctrl+click to cycle recipe, utility, and cheat mode.
2021-03-15 23:01:07 -07:00
Jason Mitchell b298f3961a Enable bookmark panel hiding 2021-03-14 12:22:27 -07:00
Jason Mitchell 2804698e71 Update build script and gradle 2021-03-14 10:24:58 -07:00
437 changed files with 15288 additions and 58019 deletions

No files matched your search

-2
View File
@@ -1,2 +0,0 @@
# Ignore spotlessApply reformat
f106b5e7665df6341ae8539f74dc391a7efc98b1
-44
View File
@@ -1,44 +0,0 @@
* text eol=lf
*.[jJ][aA][rR] binary
*.[pP][nN][gG] binary
*.[jJ][pP][gG] binary
*.[jJ][pP][eE][gG] binary
*.[gG][iI][fF] binary
*.[tT][iI][fF] binary
*.[tT][iI][fF][fF] binary
*.[iI][cC][oO] binary
*.[sS][vV][gG] text
*.[eE][pP][sS] binary
*.[xX][cC][fF] binary
*.[kK][aA][rR] binary
*.[mM]4[aA] binary
*.[mM][iI][dD] binary
*.[mM][iI][dD][iI] binary
*.[mM][pP]3 binary
*.[oO][gG][gG] binary
*.[rR][aA] binary
*.7[zZ] binary
*.[gG][zZ] binary
*.[tT][aA][rR] binary
*.[tT][gG][zZ] binary
*.[zZ][iI][pP] binary
*.[tT][cC][nN] binary
*.[sS][oO] binary
*.[dD][lL][lL] binary
*.[dD][yY][lL][iI][bB] binary
*.[pP][sS][dD] binary
*.[tT][tT][fF] binary
*.[oO][tT][fF] binary
*.[pP][aA][tT][cC][hH] -text
*.[bB][aA][tT] text eol=crlf
*.[cC][mM][dD] text eol=crlf
*.[pP][sS]1 text eol=crlf
*[aA][uU][tT][oO][gG][eE][nN][eE][rR][aA][tT][eE][dD]* binary
-60
View File
@@ -1,60 +0,0 @@
name: Report Bug
description: "Report a bug."
body:
- type: markdown
attributes:
value: "A bug/crash report with sufficient information and logs to reproduce and track down."
- type: input
id: discord
attributes:
label: Your GTNH Discord Username
description: Leave empty if you don't have one, but this will make it harder to contact you if we need additional info.
placeholder: "Example: Fake#1234"
- type: input
id: version
attributes:
label: Mod Version
description: "What version of the Mod are you using?"
placeholder: "Example: 1.0.0"
validations:
required: true
- type: textarea
id: report
attributes:
label: Bug Report
description: "Relevant information, as well as relevant logs attached such as `logs/fml-client-latest.log."
placeholder: "Example: https://mclo.gs/ OR submit the file to github by dragging it to this textbox."
validations:
required: true
- type: dropdown
id: java
attributes:
label: Java Version
description: What Java version are you using? It's worth mentioning that if you play on Java9+ you should try update to latest minor release (e.g. prefer Java 17.0.6 over 17.0.2) of that version.
options:
- Java 8
- Java 17
- Java 21
- java 25
- java 26
- Other (Please Specify)
validations:
required: true
- type: textarea
id: modlist
attributes:
label: Mod List or GTNH Pack Version
description: "List of mods, ideally a minimal reproducible set (can be retrieved from latest.log). If using GTNH please indicate pack version and any changed mods, not the entire modlist."
placeholder: "List of mods or GTNH Pack version goes here"
validations:
required: true
- type: checkboxes
id: final
attributes:
label: Final Checklist
description: Certify that you read things
options:
- label: "I have searched the issues and haven't found a similar issue."
required: true
@@ -1,28 +0,0 @@
name: Feature Request
description: "Request a feature."
body:
- type: markdown
attributes:
value: "Please use this form to request features. We ask you check if it was already requested though"
- type: input
id: discord
attributes:
label: Your GTNH Discord Username
description: Leave empty if you don't have one, but this will make it harder to contact you if we need additional info.
placeholder: "Example: Wumpus#1234"
- type: textarea
id: request
attributes:
label: Feature Request
description: "Relevant information, as well as relevant images"
placeholder: "Example: https://mclo.gs/ OR submit the file to github by dragging it to this textbox."
validations:
required: true
- type: checkboxes
id: final
attributes:
label: Final Checklist
description: Certify that you read things
options:
- label: "I have searched the issues and haven't found a similar issue."
required: true
-13
View File
@@ -1,13 +0,0 @@
name: Build and test
on:
pull_request:
branches: [ master, main, release/** ]
push:
branches: [ master, main, release/** ]
jobs:
build-and-test:
uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/build-and-test.yml@master
secrets: inherit
-17
View File
@@ -1,17 +0,0 @@
name: Optimize images
on:
pull_request:
branches: [ master, main, release/** ]
paths:
- "**/*.png"
push:
branches: [ master, main, release/** ]
paths:
- "**/*.png"
jobs:
optimize-images:
uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/optimize-images.yml@master
secrets: inherit
-14
View File
@@ -1,14 +0,0 @@
name: Release tagged build
on:
push:
tags: [ '*' ]
permissions:
contents: write
jobs:
release-tags:
uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/release-tags.yml@master
secrets: inherit
+13 -38
View File
@@ -1,40 +1,15 @@
.gradle
.settings
/.idea/
/.vscode/
/run/
/build/
/eclipse/
./build/
NotEnoughItems.iml
NotEnoughItems.ipr
NotEnoughItems.iws
*.ipr
*.iml
*.iws
.idea/**
run/*
.gradle/
*.bat
.classpath
.project
/bin/
/config/
/crash-reports/
/logs/
options.txt
/saves/
usernamecache.json
banned-ips.json
banned-players.json
eula.txt
ops.json
server.properties
servers.dat
usercache.json
whitelist.json
/out/
*.iml
*.ipr
*.iws
src/main/resources/mixins.*([!.]).json
*.bat
*.sh
*.DS_Store
!gradlew.bat
.factorypath
addon.local.gradle
addon.local.gradle.kts
addon.late.local.gradle
addon.late.local.gradle.kts
layout.json
.settings/**
-3
View File
@@ -1,3 +0,0 @@
# Any Github changes require admin approval
/.github/** @GTNewHorizons/admin
+674
View File
@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.1996
+165
View File
@@ -0,0 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
+44 -149
View File
@@ -1,165 +1,60 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
GTNH Modifications:
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Copyright (c) 2019 mitchej123
GNU LESSER GENERAL PUBLIC LICENSE - See COPYING & COPYING.LESSER
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
-----------------------------------------------------------------------------
0. Additional Definitions.
Parts inspired/borrowed/backported from JEI under the MIT License:
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
https://github.com/mezz/JustEnoughItems/tree/1.12
The MIT License (MIT)
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
Copyright (c) 2014-2015 mezz
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
-----------------------------------------------------------------------------
1. Exception to Section 3 of the GNU GPL.
Base NEI License:
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
The MIT License (MIT)
2. Conveying Modified Versions.
Copyright (c) 2014 ChickenBones
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+9 -79
View File
@@ -1,93 +1,23 @@
# NotEnoughItems Unofficial - By the GTNH Team
🌐 **Languages:** [English](README.md) | [Українська](README_uk.md)
# NotEnoughItems - GTNH
A continuation of NotEnoughItems for 1.7.10 by the developers of Gregtech: New Horizons modpack, with features either inspired and/or backported from JustEnoughItems
We've tested this against all of the mods included in GTNH, as well as a limited set of other mods (like Reika's mods). Every effort has been made to maintain backwards compatibility, however the focus is on the mods contained in the GTNH modpack.
If you have issues with NEI outside of the GTNH modpack you may report them in the [GTNH NEI GitHub](https://github.com/GTNewHorizons/NotEnoughItems).
We've tested this against all of the mods included in GTNH, as well as a limited set of other mods (like Reika's mods). Every effort has been made to maintain backwards compatibility, however the focus is on the mods contained in the GTNH modpack.
## New Features:
* Speed
- Uses a parallel stream to search the item list over multiple cores, resulting in 2-6x faster searches on average
- Loads the recipe handlers in parallel
* Speed - Uses a parallel stream to search the item list over multiple cores, resulting in 2-6x faster searches on average [Feels instantaneous]
* A textbox for search with most of the features you'd expect - moving forward, backwards, selection, etc
* Bookmarks! Are you in the process of crafting? Bookmark it using either 'A' or configure your own key.
* Toggle bookmark pane. Default shortcut key `B`. Item Subsets menu is only available if bookmarks are not visible.
* Bookmarks! What are you in the process of crafting? Bookmark it using either 'A' or configure your own key.
* Utility/Cheat buttons line up and wrap based on GUI size
* ItemList is no longer regenerated from the ItemRegistry on every inventory load
* JEI (Or Creative) Style tabs [Optional] Note: Requires explicit support to be added for an ItemStack to render, otherwise falls back to the first two letters of the handler name.
* Tabs/Handlers are loaded from a CSV config in the JAR (or optionally from the config folder). NBT IMCEvents `registerHandlerInfo` and `removeHandlerInfo` are available for mod authors to add handler information, using the same fields as the CSV file
* `@[Mod]->[item]` searching. ex: `@Mod.gregtech->iron ingot`
* Cycle between Recipe, Utility, and Cheat mode by ctrl clicking on the Wrench Icon
* GT5u Tools/Items and GT6 tools should now properly work with the Overlay Recipe Transfer
### Information Page Handler
Want to add some information about a block or item without making a massive tooltip for it? You can add information about any block or item by registering it in the Information Handler.
Information page(s) are displayed when either the uses or recipes of a matching item are searched. All matching items will cycle at the top of the information page.
Your mod can call:
```java
FMLInterModComms.sendMessage("NotEnoughItems", "addItemInfo", nbt);
```
Where nbt is an NBTTagCompound formatted as described below.
| Tag | Type | Description |
|------------------|----------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `filter` | String | A string filter to match what items should return this information page.<br/>modname:itemname, metadata, Ore Dictionary tags, and regex can all be used. The full format may be seen in `config/NEI/collapsibleitems.cfg`. |
| `page` / `pages` | String / String NBTTagList | The actual text to display. See below for differences between single and multi-page messages.<br/>Both formats will automatically translate provided strings. |
#### Single Page Format
Use the `"page"` string tag when you only want to add one page of information:
```java
NBTTagCompound tag = new NBTTagCompound();
tag.setString("filter", "minecraft:log 3");
tag.setString("page", "Exotic wood found in tropical climates.");
FMLInterModComms.sendMessage("NotEnoughItems", "addItemInfo", tag);
```
#### Multiple Page Format
Use the `"pages"` tag as an `NBTTagList` of strings when you want more than one page:
```java
NBTTagCompound tag = new NBTTagCompound();
tag.setString("filter", "minecraft:diamond_sword");
NBTTagList pages = new NBTTagList();
pages.appendTag(new NBTTagString("A powerful melee weapon."));
pages.appendTag(new NBTTagString("Can be enchanted for extra effects."));
tag.setTag("pages", pages);
FMLInterModComms.sendMessage("NotEnoughItems", "addItemInfo", tag);
```
* Each list entry is one page.
* Pages will appear in NEI with buttons to scroll through them.
#### Item Matching
All items that match `filter` will show your information page. See `config/NEI/collapsibleitems.cfg` for the full filter format.
#### Item Information Config File
If you're a modpack creator and want to make custom item information pages, they can easily be added in `config/NEI/informationpages.cfg`, which has a few more examples. The file is not created automatically: use the Export button in the NEI options under Tools > Default Config Files to copy the defaults to `config/NEI`.
## Other items of note:
* Licensed under LGPL - Use this however you want, but please give back any modifications
* Remove TMI style
* Removed inventory Load/Save state
## License
GTNH Modifications Copyright (c) 2019-2024 mitchej123 and the GTNH Team
Licensed under LGPL-3.0 or later - use this however you want, but please give back any modifications
Parts inspired/borrowed/backported from [JEI](https://github.com/mezz/JustEnoughItems/tree/1.12) under the MIT License.
Originial code Copyright (c) 2014-2015 mezz and was licensed under the MIT License.
-93
View File
@@ -1,93 +0,0 @@
# NotEnoughItems Unofficial — від команди GTNH
🌐 **Мови:** [English](README.md) | [Українська](README_uk.md)
Продовження модифікації NotEnoughItems для 1.7.10 від розробників збірки GregTech: New Horizons із функціями, натхненними та/або бекпортованими з JustEnoughItems.
Ми протестували цю версію з усіма модами, що входять до GTNH, а також із обмеженим набором інших модів (як-от моди від Reika). Було докладено всіх зусиль для збереження зворотної сумісності, однак основну увагу приділено модам зі збірки GTNH.
Якщо у вас виникли проблеми з NEI за межами збірки GTNH, ви можете повідомити про них у [GitHub-репозиторії GTNH NEI](https://github.com/GTNewHorizons/NotEnoughItems).
## Нові можливості:
* Швидкодія
- Використовує паралельний потік для пошуку у списку предметів на кількох ядрах процесора, що в середньому пришвидшує пошук у 2–6 разів.
- Завантажує обробники рецептів паралельно.
* Текстове поле пошуку з більшістю очікуваних функцій — переміщення курсора вперед/назад, виділення тексту тощо.
* Закладки! Перебуваєте у процесі крафту? Додайте потрібний рецепт до закладок за допомогою клавіші «A» або налаштуйте власну клавішу.
* Перемикання видимості панелі закладок. Гаряча клавіша за замовчуванням — `B`. Меню «Підгрупи предметів» доступне лише тоді, коли панель закладок прихована.
* Кнопки утиліт та читів вирівнюються в ряд та переносяться на новий рядок залежно від розміру графічного інтерфейсу.
* Список предметів (`ItemList`) більше не генерується повторно з `ItemRegistry` під час кожного відкриття інвентарю.
* Вкладки у стилі JEI (або творчого режиму) [За бажанням]. Примітка: вимагає явної підтримки для рендерингу `ItemStack`, інакше використовуються перші дві літери назви обробника.
* Вкладки/обробники завантажуються з конфігураційного CSV-файлу в JAR-архіві (або за бажанням з папки `config`). Для авторів модів доступні IMC-повідомлення з NBT-даними `registerHandlerInfo` та `removeHandlerInfo` для додавання інформації про обробники з використанням тих самих полів, що й у CSV-файлі.
* Пошук за допомогою синтаксису `@[Мод]->[предмет]`. Наприклад: `@Mod.gregtech->iron ingot`.
* Перемикання між режимами рецептів, утиліт та читів за допомогою CTRL + ЛКМ по іконці гайкового ключа.
* Інструменти/предмети з GT5u та інструменти з GT6 тепер мають коректно працювати з функцією накладення та перенесення рецепта.
### Обробник інформаційних сторінок
Хочете додати інформацію про блок чи предмет, не створюючи для нього величезну підказку? Ви можете додати інформацію про будь-який блок чи предмет, зареєструвавши його в обробнику інформації.
Інформаційні сторінки відображаються під час пошуку рецептів або способів використання відповідного предмета. Усі відповідні предмети будуть циклічно змінюватися у верхній частині інформаційної сторінки.
Ваш мод може викликати:
```java
FMLInterModComms.sendMessage("NotEnoughItems", "addItemInfo", nbt);
```
Де `nbt` — це `NBTTagCompound`, відформатований, як описано нижче.
| Тег | Тип | Опис |
|------------------|--------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `filter` | `String` | Текстовий фільтр для визначення предметів, для яких має відображатися ця інформаційна сторінка.<br/>Можна використовувати `modname:itemname`, метадані, теги OreDictionary та регулярні вирази. Повний формат можна переглянути у `config/NEI/collapsibleitems.cfg`. |
| `page` / `pages` | `String` / `String NBTTagList` | Безпосередньо текст для відображення. Різницю між одно- та багатосторінковими повідомленнями див. нижче.<br/>Обидва формати підтримують автоматичний переклад наданих рядків. |
#### Односторінковий формат
Використовуйте текстовий тег `"page"`, якщо хочете додати лише одну сторінку інформації:
```java
NBTTagCompound tag = new NBTTagCompound();
tag.setString("filter", "minecraft:log 3");
tag.setString("page", "Exotic wood found in tropical climates.");
FMLInterModComms.sendMessage("NotEnoughItems", "addItemInfo", tag);
```
#### Багатосторінковий формат
Використовуйте тег `"pages"` як `NBTTagList` із рядків, якщо потрібно додати понад одну сторінку:
```java
NBTTagCompound tag = new NBTTagCompound();
tag.setString("filter", "minecraft:diamond_sword");
NBTTagList pages = new NBTTagList();
pages.appendTag(new NBTTagString("A powerful melee weapon."));
pages.appendTag(new NBTTagString("Can be enchanted for extra effects."));
tag.setTag("pages", pages);
FMLInterModComms.sendMessage("NotEnoughItems", "addItemInfo", tag);
```
* Кожен елемент списку — це одна сторінка.
* Сторінки з’являтимуться в NEI з кнопками для їх гортання.
#### Відповідність предметів
Усі предмети, що відповідають фільтру `filter`, відображатимуть вашу інформаційну сторінку. Повний формат фільтра див. у `config/NEI/collapsibleitems.cfg`.
#### Файл конфігурації інформації про предмети
Якщо ви творець збірки модів і хочете створити власні інформаційні сторінки для предметів, їх можна легко додати у файлі `config/NEI/informationpages.cfg`, де також наведено ще кілька прикладів.
## Інші примітки:
* Вилучено стиль TMI
* Вилучено збереження/завантаження стану інвентарю
## Ліцензія
Авторські права на модифікації від команди GTNH (c) 2019-2024 належать mitchej123 та команді GTNH.
Поширюється за ліцензією LGPL-3.0 або новішої версії — використовуйте цей код на власний розсуд, але, будь ласка, діліться з розробниками будь-якими внесеними вами змінами.
Окремі частини коду натхненні, запозичені або бекпортовані з [JEI](https://github.com/mezz/JustEnoughItems/tree/1.12) за ліцензією MIT.
Авторські права на оригінальний код (c) 2014-2015 належать mezz; код поширювався за ліцензією MIT.
-29
View File
@@ -1,29 +0,0 @@
compileJava {
options.encoding = "UTF-8"
}
generateGrammarSource {
maxHeapSize = "128m"
arguments += ['-package', 'codechicken.nei.search', '-visitor', '-no-listener']
outputDirectory = file("${projectDir}/build/generated/sources/search/antlr/codechicken/nei/search/")
}
compileJava.dependsOn generateGrammarSource
sourcesJar.dependsOn generateGrammarSource
sourcesJar {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
sourceSets {
main {
java.srcDirs += ["build/generated/sources/search/antlr/"]
}
}
test {
useJUnitPlatform()
testLogging {
events "passed", "skipped", "failed"
}
}
+155 -3
View File
@@ -1,6 +1,158 @@
//version: 1707058017
buildscript {
repositories {
mavenCentral()
jcenter()
maven {
name = "gt"
url = "https://gregtech.overminddl1.com/"
}
maven {
name = "forge"
url = "http://files.minecraftforge.net/maven"
}
maven {
name = "jitpack"
url = "https://jitpack.io"
}
}
dependencies {
classpath "com.github.GTNH2:ForgeGradle:FG_1.2-SNAPSHOT"
}
}
plugins {
id 'antlr'
id 'com.gtnewhorizons.gtnhconvention'
id("org.ajoberstar.grgit") version("3.1.1")
}
//add dependency repositories
repositories {
maven {
name = "chickenbones"
url = "http://chickenbones.net/maven"
}
}
apply plugin: "java"
apply plugin: "idea"
apply plugin: 'forge'
idea {
module {
inheritOutputDirs = true
downloadJavadoc = true
downloadSources = true
}
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
group = "codechicken"
archivesBaseName = "NotEnoughItems"
// Define properties file
ext.configFile = file "build.properties"
configFile.withReader {
// Load config. It shall from now be referenced as simply config or project.config
def prop = new Properties()
prop.load(it)
project.ext.config = new ConfigSlurper().parse prop
}
//
//configurations.all {
// resolutionStrategy.cacheChangingModulesFor(0, TimeUnit.SECONDS)
// setTransitive(false)
//}
configurations {
shade
compile.extendsFrom shade
}
dependencies {
compile "codechicken:CodeChickenLib:${config.mc_version}-${config.ccl_version}:dev"
compile "codechicken:CodeChickenCore:${config.mc_version}-${config.ccc_version}:dev"
shade "org.apache.commons:commons-csv:1.5"
}
version = "${project.config.mod_version}"
println config.mc_version + "-" + config.forge_version
// Setup the forge minecraft plugin data. Specify the preferred forge/minecraft version here
minecraft {
version = config.mc_version + "-" + config.forge_version
}
def root = project.projectDir;
sourceSets {
main {
java {
srcDir new File(root, "src")
}
resources {
srcDir new File(root, "resources")
}
}
}
processResources {
//redo task if any of these properties change
inputs.property "version", project.version
inputs.property "mc_version", config.mc_version
// Replace properties in info files
from(sourceSets.main.resources.srcDirs) {
include '*.info'
expand 'version':project.version,'mc_version':config.mc_version
}
// Move access transformer to META-INF
rename '(.+_at.cfg)', 'META-INF/$1'
//
// // copy everything else, that's not the mcmod.info
// from(sourceSets.main.resources.srcDirs) {
// exclude "mcmod.info"
// }
}
version = "${project.minecraft.version}-${project.version}"
def commonManifest = {
attributes 'FMLCorePlugin': 'codechicken.nei.asm.NEICorePlugin'
attributes 'FMLAT': 'nei_at.cfg'
}
jar {
getArchiveClassifier().set("universal")
manifest commonManifest
configurations.shade.each { dep ->
from(project.zipTree(dep)){
exclude 'META-INF', 'META-INF/**'
}
}
}
task sourceJar(type: Jar) {
from sourceSets.main.java
from new File(root, "dev")
getArchiveClassifier().set("src")
}
task devJar(type: Jar) {
from sourceSets.main.output
getArchiveClassifier().set("dev")
manifest commonManifest
}
// Tell the artifact system about our extra jars
artifacts {
archives sourceJar, devJar
}
minecraft {
srgExtra "PK: org/apache/commons/csv nei/org/apache/commons/csv"
srgExtra "PK: org/apache/commons/csv/CSVFormat nei/org/apache/commons/csv/CSVFormat"
}
+5
View File
@@ -0,0 +1,5 @@
mc_version=1.7.10
forge_version=10.13.4.1614-1.7.10
ccl_version=1.1.3.138
ccc_version=1.0.7.+
mod_version=2.1.0-GTNH-beta9
-42
View File
@@ -1,42 +0,0 @@
// Add your dependencies here
configurations.create('gtnhlibEmbed') {
canBeConsumed = false
canBeResolved = true
}
dependencies {
api('com.github.GTNewHorizons:CodeChickenCore:1.4.22:dev')
devOnlyNonPublishable('com.github.GTNewHorizons:GTNHLib:0.11.54:dev')
shadowImplementation('org.apache.commons:commons-csv:1.10.0')
compileOnly('maven.modrinth:forge-essentials:7.5.1')
compileOnly('com.cardinalstar.cubicchunks:CubicChunks1710:v0.1.14-alpha:dev')
antlr('org.antlr:antlr4:4.13.2')
shadowImplementation('org.antlr:antlr4-runtime:4.13.2')
testImplementation(platform('org.junit:junit-bom:5.13.4'))
testImplementation('org.junit.jupiter:junit-jupiter')
testImplementation("org.mockito:mockito-core:5.+")
testRuntimeOnly('org.junit.platform:junit-platform-launcher')
testRuntimeOnly("org.lwjgl.lwjgl:lwjgl:2.9.3");
compileOnly("com.github.GTNewHorizons:GTNHLib:0.11.54") { transitive = false }
gtnhlibEmbed("com.github.GTNewHorizons:GTNHLib:0.11.54") { transitive = false }
}
def embedArchiveOperations = gtnhGradle.archiveOperations
def gtnhlibEmbedContents = configurations.gtnhlibEmbed.elements.map { files ->
files.collect { embedArchiveOperations.zipTree(it.asFile) }
}
[tasks.jar, tasks.shadowJar].each {
it.configure {
from(gtnhlibEmbedContents) {
include 'com/gtnewhorizon/gtnhlib/color/ColorResource.class'
include 'com/gtnewhorizon/gtnhlib/color/ColorResource$*.class'
}
}
}
@@ -0,0 +1,808 @@
package net.minecraft.client.gui.inventory;
import codechicken.nei.guihook.GuiContainerManager;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
@SideOnly(Side.CLIENT)
public abstract class GuiContainer extends GuiScreen
{
protected static final ResourceLocation field_147001_a = new ResourceLocation("textures/gui/container/inventory.png");
/** The X size of the inventory window in pixels. */
public int xSize = 176;
/** The Y size of the inventory window in pixels. */
public int ySize = 166;
/** A list of the players inventory slots */
public Container inventorySlots;
/**
* Starting X position for the Gui. Inconsistent use for Gui backgrounds.
*/
public int guiLeft;
/**
* Starting Y position for the Gui. Inconsistent use for Gui backgrounds.
*/
public int guiTop;
private Slot theSlot;
/** Used when touchscreen is enabled. */
private Slot clickedSlot;
/** Used when touchscreen is enabled. */
private boolean isRightMouseClick;
/** Used when touchscreen is enabled */
private ItemStack draggedStack;
private int field_147011_y;
private int field_147010_z;
private Slot returningStackDestSlot;
private long returningStackTime;
/** Used when touchscreen is enabled */
private ItemStack returningStack;
private Slot field_146985_D;
private long field_146986_E;
protected final Set field_147008_s = new HashSet();
protected boolean field_147007_t;
private int field_146987_F;
private int field_146988_G;
private boolean field_146995_H;
private int field_146996_I;
private long field_146997_J;
private Slot field_146998_K;
private int field_146992_L;
private boolean field_146993_M;
private ItemStack field_146994_N;
private static final String __OBFID = "CL_00000737";
public GuiContainerManager manager;
public GuiContainer(Container par1Container)
{
this.inventorySlots = par1Container;
this.field_146995_H = true;
}
/**
* Adds the buttons (and other controls) to the screen in question.
*/
public void initGui()
{
super.initGui();
this.mc.thePlayer.openContainer = this.inventorySlots;
this.guiLeft = (this.width - this.xSize) / 2;
this.guiTop = (this.height - this.ySize) / 2;
}
/**
* Draws the screen and all the components in it.
*/
public void drawScreen(int par1, int par2, float par3)
{
manager.preDraw();
this.drawDefaultBackground();
int k = this.guiLeft;
int l = this.guiTop;
this.drawGuiContainerBackgroundLayer(par3, par1, par2);
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
RenderHelper.disableStandardItemLighting();
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_DEPTH_TEST);
super.drawScreen(par1, par2, par3);
RenderHelper.enableGUIStandardItemLighting();
GL11.glPushMatrix();
GL11.glTranslatef((float)k, (float)l, 0.0F);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
this.theSlot = null;
short short1 = 240;
short short2 = 240;
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)short1 / 1.0F, (float)short2 / 1.0F);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
int k1;
for (int i1 = 0; i1 < this.inventorySlots.inventorySlots.size(); ++i1)
{
Slot slot = (Slot)this.inventorySlots.inventorySlots.get(i1);
this.func_146977_a(slot);
if (this.isMouseOverSlot(slot, par1, par2) && slot.func_111238_b() && !manager.objectUnderMouse(par1, par2))
{
this.theSlot = slot;
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_DEPTH_TEST);
int j1 = slot.xDisplayPosition;
k1 = slot.yDisplayPosition;
GL11.glColorMask(true, true, true, false);
this.drawGradientRect(j1, k1, j1 + 16, k1 + 16, -2130706433, -2130706433);
GL11.glColorMask(true, true, true, true);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_DEPTH_TEST);
}
}
//Forge: Force lighting to be disabled as there are some issue where lighting would
//incorrectly be applied based on items that are in the inventory.
GL11.glDisable(GL11.GL_LIGHTING);
this.drawGuiContainerForegroundLayer(par1, par2);
GL11.glEnable(GL11.GL_LIGHTING);
manager.renderObjects(par1, par2);
InventoryPlayer inventoryplayer = this.mc.thePlayer.inventory;
ItemStack itemstack = this.draggedStack == null ? inventoryplayer.getItemStack() : this.draggedStack;
if (itemstack != null)
{
byte b0 = 8;
k1 = this.draggedStack == null ? 8 : 16;
String s = null;
if (this.draggedStack != null && this.isRightMouseClick)
{
itemstack = itemstack.copy();
itemstack.stackSize = MathHelper.ceiling_float_int((float)itemstack.stackSize / 2.0F);
}
else if (this.field_147007_t && this.field_147008_s.size() > 1)
{
itemstack = itemstack.copy();
itemstack.stackSize = this.field_146996_I;
if (itemstack.stackSize == 0)
{
s = "" + EnumChatFormatting.YELLOW + "0";
}
}
this.drawItemStack(itemstack, par1 - k - b0, par2 - l - k1, s);
}
if (this.returningStack != null)
{
float f1 = (float)(Minecraft.getSystemTime() - this.returningStackTime) / 100.0F;
if (f1 >= 1.0F)
{
f1 = 1.0F;
this.returningStack = null;
}
k1 = this.returningStackDestSlot.xDisplayPosition - this.field_147011_y;
int j2 = this.returningStackDestSlot.yDisplayPosition - this.field_147010_z;
int l1 = this.field_147011_y + (int)((float)k1 * f1);
int i2 = this.field_147010_z + (int)((float)j2 * f1);
this.drawItemStack(this.returningStack, l1, i2, (String)null);
}
GL11.glPopMatrix();
/*
if (inventoryplayer.getItemStack() == null && this.theSlot != null && this.theSlot.getHasStack())
{
ItemStack itemstack1 = this.theSlot.getStack();
this.renderToolTip(itemstack1, par1, par2);
}
*/
manager.renderToolTips(par1, par2);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_DEPTH_TEST);
RenderHelper.enableStandardItemLighting();
}
private void drawItemStack(ItemStack p_146982_1_, int p_146982_2_, int p_146982_3_, String p_146982_4_)
{
GL11.glTranslatef(0.0F, 0.0F, 32.0F);
this.zLevel = 500.0F;
itemRender.zLevel = 500.0F;
FontRenderer font = null;
if (p_146982_1_ != null) font = p_146982_1_.getItem().getFontRenderer(p_146982_1_);
if (font == null) font = fontRendererObj;
itemRender.renderItemAndEffectIntoGUI(font, this.mc.getTextureManager(), p_146982_1_, p_146982_2_, p_146982_3_);
itemRender.renderItemOverlayIntoGUI(font, this.mc.getTextureManager(), p_146982_1_, p_146982_2_, p_146982_3_ - (this.draggedStack == null ? 0 : 8), p_146982_4_);
this.zLevel = 0.0F;
itemRender.zLevel = 0.0F;
}
/**
* Draw the foreground layer for the GuiContainer (everything in front of the items)
*/
protected void drawGuiContainerForegroundLayer(int p_146979_1_, int p_146979_2_) {}
protected abstract void drawGuiContainerBackgroundLayer(float var1, int var2, int var3);
private void func_146977_a(Slot p_146977_1_)
{
int i = p_146977_1_.xDisplayPosition;
int j = p_146977_1_.yDisplayPosition;
ItemStack itemstack = p_146977_1_.getStack();
boolean flag = false;
boolean flag1 = p_146977_1_ == this.clickedSlot && this.draggedStack != null && !this.isRightMouseClick;
ItemStack itemstack1 = this.mc.thePlayer.inventory.getItemStack();
String s = null;
if (p_146977_1_ == this.clickedSlot && this.draggedStack != null && this.isRightMouseClick && itemstack != null)
{
itemstack = itemstack.copy();
itemstack.stackSize /= 2;
}
else if (this.field_147007_t && this.field_147008_s.contains(p_146977_1_) && itemstack1 != null)
{
if (this.field_147008_s.size() == 1)
{
return;
}
if (Container.func_94527_a(p_146977_1_, itemstack1, true) && this.inventorySlots.canDragIntoSlot(p_146977_1_))
{
itemstack = itemstack1.copy();
flag = true;
Container.func_94525_a(this.field_147008_s, this.field_146987_F, itemstack, p_146977_1_.getStack() == null ? 0 : p_146977_1_.getStack().stackSize);
if (itemstack.stackSize > itemstack.getMaxStackSize())
{
s = EnumChatFormatting.YELLOW + "" + itemstack.getMaxStackSize();
itemstack.stackSize = itemstack.getMaxStackSize();
}
if (itemstack.stackSize > p_146977_1_.getSlotStackLimit())
{
s = EnumChatFormatting.YELLOW + "" + p_146977_1_.getSlotStackLimit();
itemstack.stackSize = p_146977_1_.getSlotStackLimit();
}
}
else
{
this.field_147008_s.remove(p_146977_1_);
this.func_146980_g();
}
}
this.zLevel = 100.0F;
itemRender.zLevel = 100.0F;
if (itemstack == null)
{
IIcon iicon = p_146977_1_.getBackgroundIconIndex();
if (iicon != null)
{
GL11.glDisable(GL11.GL_LIGHTING);
this.mc.getTextureManager().bindTexture(TextureMap.locationItemsTexture);
this.drawTexturedModelRectFromIcon(i, j, iicon, 16, 16);
GL11.glEnable(GL11.GL_LIGHTING);
flag1 = true;
}
}
if (!flag1)
{
if (flag)
{
drawRect(i, j, i + 16, j + 16, -2130706433);
}
GL11.glEnable(GL11.GL_DEPTH_TEST);
manager.renderSlotUnderlay(p_146977_1_);
manager.drawSlotItem(p_146977_1_, itemstack, i, j, s);
manager.renderSlotOverlay(p_146977_1_);
}
itemRender.zLevel = 0.0F;
this.zLevel = 0.0F;
}
private void func_146980_g()
{
ItemStack itemstack = this.mc.thePlayer.inventory.getItemStack();
if (itemstack != null && this.field_147007_t)
{
this.field_146996_I = itemstack.stackSize;
ItemStack itemstack1;
int i;
for (Iterator iterator = this.field_147008_s.iterator(); iterator.hasNext(); this.field_146996_I -= itemstack1.stackSize - i)
{
Slot slot = (Slot)iterator.next();
itemstack1 = itemstack.copy();
i = slot.getStack() == null ? 0 : slot.getStack().stackSize;
Container.func_94525_a(this.field_147008_s, this.field_146987_F, itemstack1, i);
if (itemstack1.stackSize > itemstack1.getMaxStackSize())
{
itemstack1.stackSize = itemstack1.getMaxStackSize();
}
if (itemstack1.stackSize > slot.getSlotStackLimit())
{
itemstack1.stackSize = slot.getSlotStackLimit();
}
}
}
}
/**
* Returns the slot at the given coordinates or null if there is none.
*/
public Slot getSlotAtPosition(int p_146975_1_, int p_146975_2_)
{
for (int k = 0; k < this.inventorySlots.inventorySlots.size(); ++k)
{
Slot slot = (Slot)this.inventorySlots.inventorySlots.get(k);
if (this.isMouseOverSlot(slot, p_146975_1_, p_146975_2_))
{
return slot;
}
}
return null;
}
/**
* Called when the mouse is clicked.
*/
protected void mouseClicked(int par1, int par2, int par3)
{
if (manager.mouseClicked(par1, par2, par3))
return;
super.mouseClicked(par1, par2, par3);
boolean flag = par3 == this.mc.gameSettings.keyBindPickBlock.getKeyCode() + 100;
Slot slot = this.getSlotAtPosition(par1, par2);
long l = Minecraft.getSystemTime();
this.field_146993_M = this.field_146998_K == slot && l - this.field_146997_J < 250L && this.field_146992_L == par3;
this.field_146995_H = false;
if (par3 == 0 || par3 == 1 || flag)
{
int i1 = this.guiLeft;
int j1 = this.guiTop;
boolean flag1 = par1 < i1 || par2 < j1 || par1 >= i1 + this.xSize || par2 >= j1 + this.ySize;
int k1 = -1;
if (slot != null)
{
k1 = slot.slotNumber;
}
if (flag1)
{
k1 = -999;
}
if (this.mc.gameSettings.touchscreen && flag1 && this.mc.thePlayer.inventory.getItemStack() == null)
{
this.mc.displayGuiScreen((GuiScreen)null);
return;
}
if (k1 != -1)
{
if (this.mc.gameSettings.touchscreen)
{
if (slot != null && slot.getHasStack())
{
this.clickedSlot = slot;
this.draggedStack = null;
this.isRightMouseClick = par3 == 1;
}
else
{
this.clickedSlot = null;
}
}
else if (!this.field_147007_t)
{
if (this.mc.thePlayer.inventory.getItemStack() == null)
{
if (par3 == this.mc.gameSettings.keyBindPickBlock.getKeyCode() + 100)
{
managerHandleMouseClick(slot, k1, par3, 3);
}
else
{
boolean flag2 = k1 != -999 && (Keyboard.isKeyDown(42) || Keyboard.isKeyDown(54));
byte b0 = 0;
if (flag2)
{
this.field_146994_N = slot != null && slot.getHasStack() ? slot.getStack() : null;
b0 = 1;
}
else if (k1 == -999)
{
b0 = 4;
}
managerHandleMouseClick(slot, k1, par3, b0);
}
this.field_146995_H = true;
}
else
{
this.field_147007_t = true;
this.field_146988_G = par3;
this.field_147008_s.clear();
if (par3 == 0)
{
this.field_146987_F = 0;
}
else if (par3 == 1)
{
this.field_146987_F = 1;
}
}
}
}
}
this.field_146998_K = slot;
this.field_146997_J = l;
this.field_146992_L = par3;
}
/**
* Called when a mouse button is pressed and the mouse is moved around. Parameters are : mouseX, mouseY,
* lastButtonClicked & timeSinceMouseClick.
*/
protected void mouseClickMove(int p_146273_1_, int p_146273_2_, int p_146273_3_, long p_146273_4_)
{
Slot slot = this.getSlotAtPosition(p_146273_1_, p_146273_2_);
ItemStack itemstack = this.mc.thePlayer.inventory.getItemStack();
manager.mouseDragged(p_146273_1_, p_146273_2_, p_146273_3_, p_146273_4_);
if (this.clickedSlot != null && this.mc.gameSettings.touchscreen)
{
if (p_146273_3_ == 0 || p_146273_3_ == 1)
{
if (this.draggedStack == null)
{
if (slot != this.clickedSlot)
{
this.draggedStack = this.clickedSlot.getStack().copy();
}
}
else if (this.draggedStack.stackSize > 1 && slot != null && Container.func_94527_a(slot, this.draggedStack, false))
{
long i1 = Minecraft.getSystemTime();
if (this.field_146985_D == slot)
{
if (i1 - this.field_146986_E > 500L)
{
managerHandleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, 0, 0);
managerHandleMouseClick(slot, slot.slotNumber, 1, 0);
managerHandleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, 0, 0);
this.field_146986_E = i1 + 750L;
--this.draggedStack.stackSize;
}
}
else
{
this.field_146985_D = slot;
this.field_146986_E = i1;
}
}
}
}
else if (this.field_147007_t && slot != null && itemstack != null && itemstack.stackSize > this.field_147008_s.size() && Container.func_94527_a(slot, itemstack, true) && slot.isItemValid(itemstack) && this.inventorySlots.canDragIntoSlot(slot))
{
this.field_147008_s.add(slot);
this.func_146980_g();
}
}
/**
* Called when the mouse is moved or a mouse button is released. Signature: (mouseX, mouseY, which) which==-1 is
* mouseMove, which==0 or which==1 is mouseUp
*/
protected void mouseMovedOrUp(int p_146286_1_, int p_146286_2_, int p_146286_3_)
{
if(manager.overrideMouseUp(p_146286_1_, p_146286_2_, p_146286_3_))
return;
Slot slot = this.getSlotAtPosition(p_146286_1_, p_146286_2_);
int l = this.guiLeft;
int i1 = this.guiTop;
boolean flag = p_146286_1_ < l || p_146286_2_ < i1 || p_146286_1_ >= l + this.xSize || p_146286_2_ >= i1 + this.ySize;
int j1 = -1;
if (slot != null)
{
j1 = slot.slotNumber;
}
if (flag)
{
j1 = -999;
}
Slot slot1;
Iterator iterator;
if (this.field_146993_M && slot != null && p_146286_3_ == 0 && this.inventorySlots.func_94530_a((ItemStack)null, slot))
{
if (isShiftKeyDown())
{
if (slot != null && slot.inventory != null && this.field_146994_N != null)
{
iterator = this.inventorySlots.inventorySlots.iterator();
while (iterator.hasNext())
{
slot1 = (Slot)iterator.next();
if (slot1 != null && slot1.canTakeStack(this.mc.thePlayer) && slot1.getHasStack() && slot1.inventory == slot.inventory && Container.func_94527_a(slot1, this.field_146994_N, true))
{
managerHandleMouseClick(slot1, slot1.slotNumber, p_146286_3_, 1);
}
}
}
}
else
{
managerHandleMouseClick(slot, j1, p_146286_3_, 6);
}
this.field_146993_M = false;
this.field_146997_J = 0L;
}
else
{
if (this.field_147007_t && this.field_146988_G != p_146286_3_)
{
this.field_147007_t = false;
this.field_147008_s.clear();
this.field_146995_H = true;
return;
}
if (this.field_146995_H)
{
this.field_146995_H = false;
return;
}
boolean flag1;
if (this.clickedSlot != null && this.mc.gameSettings.touchscreen)
{
if (p_146286_3_ == 0 || p_146286_3_ == 1)
{
if (this.draggedStack == null && slot != this.clickedSlot)
{
this.draggedStack = this.clickedSlot.getStack();
}
flag1 = Container.func_94527_a(slot, this.draggedStack, false);
if (j1 != -1 && this.draggedStack != null && flag1)
{
managerHandleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, p_146286_3_, 0);
managerHandleMouseClick(slot, j1, 0, 0);
if (this.mc.thePlayer.inventory.getItemStack() != null)
{
managerHandleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, p_146286_3_, 0);
this.field_147011_y = p_146286_1_ - l;
this.field_147010_z = p_146286_2_ - i1;
this.returningStackDestSlot = this.clickedSlot;
this.returningStack = this.draggedStack;
this.returningStackTime = Minecraft.getSystemTime();
}
else
{
this.returningStack = null;
}
}
else if (this.draggedStack != null)
{
this.field_147011_y = p_146286_1_ - l;
this.field_147010_z = p_146286_2_ - i1;
this.returningStackDestSlot = this.clickedSlot;
this.returningStack = this.draggedStack;
this.returningStackTime = Minecraft.getSystemTime();
}
this.draggedStack = null;
this.clickedSlot = null;
}
}
else if (this.field_147007_t && !this.field_147008_s.isEmpty())
{
managerHandleMouseClick((Slot)null, -999, Container.func_94534_d(0, this.field_146987_F), 5);
iterator = this.field_147008_s.iterator();
while (iterator.hasNext())
{
slot1 = (Slot)iterator.next();
managerHandleMouseClick(slot1, slot1.slotNumber, Container.func_94534_d(1, this.field_146987_F), 5);
}
managerHandleMouseClick((Slot)null, -999, Container.func_94534_d(2, this.field_146987_F), 5);
}
else if (this.mc.thePlayer.inventory.getItemStack() != null)
{
if (p_146286_3_ == this.mc.gameSettings.keyBindPickBlock.getKeyCode() + 100)
{
managerHandleMouseClick(slot, j1, p_146286_3_, 3);
}
else
{
flag1 = j1 != -999 && (Keyboard.isKeyDown(42) || Keyboard.isKeyDown(54));
if (flag1)
{
this.field_146994_N = slot != null && slot.getHasStack() ? slot.getStack() : null;
}
managerHandleMouseClick(slot, j1, p_146286_3_, flag1 ? 1 : 0);
}
}
else if(p_146286_3_ >= 0)
manager.mouseUp(p_146286_1_, p_146286_2_, p_146286_3_);
}
if (this.mc.thePlayer.inventory.getItemStack() == null)
{
this.field_146997_J = 0L;
}
this.field_147007_t = false;
}
/**
* Returns if the passed mouse position is over the specified slot.
*/
private boolean isMouseOverSlot(Slot p_146981_1_, int p_146981_2_, int p_146981_3_)
{
return this.func_146978_c(p_146981_1_.xDisplayPosition, p_146981_1_.yDisplayPosition, 16, 16, p_146981_2_, p_146981_3_);
}
protected boolean func_146978_c(int p_146978_1_, int p_146978_2_, int p_146978_3_, int p_146978_4_, int p_146978_5_, int p_146978_6_)
{
int k1 = this.guiLeft;
int l1 = this.guiTop;
p_146978_5_ -= k1;
p_146978_6_ -= l1;
return p_146978_5_ >= p_146978_1_ - 1 && p_146978_5_ < p_146978_1_ + p_146978_3_ + 1 && p_146978_6_ >= p_146978_2_ - 1 && p_146978_6_ < p_146978_2_ + p_146978_4_ + 1;
}
protected void handleMouseClick(Slot p_146984_1_, int p_146984_2_, int p_146984_3_, int p_146984_4_)
{
if (p_146984_1_ != null)
{
p_146984_2_ = p_146984_1_.slotNumber;
}
manager.handleSlotClick(p_146984_2_, p_146984_3_, p_146984_4_);
}
/**
* Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e).
*/
protected void keyTyped(char par1, int par2)
{
if(manager.lastKeyTyped(par2, par1))
return;
if (par2 == 1 || par2 == this.mc.gameSettings.keyBindInventory.getKeyCode())
{
this.mc.thePlayer.closeScreen();
}
this.checkHotbarKeys(par2);
if (this.theSlot != null && this.theSlot.getHasStack())
{
if (par2 == this.mc.gameSettings.keyBindPickBlock.getKeyCode())
{
managerHandleMouseClick(this.theSlot, this.theSlot.slotNumber, 0, 3);
}
else if (par2 == this.mc.gameSettings.keyBindDrop.getKeyCode())
{
managerHandleMouseClick(this.theSlot, this.theSlot.slotNumber, isCtrlKeyDown() ? 1 : 0, 4);
}
}
}
/**
* This function is what controls the hotbar shortcut check when you press a number key when hovering a stack.
*/
protected boolean checkHotbarKeys(int p_146983_1_)
{
if (this.mc.thePlayer.inventory.getItemStack() == null && this.theSlot != null)
{
for (int j = 0; j < 9; ++j)
{
if (p_146983_1_ == this.mc.gameSettings.keyBindsHotbar[j].getKeyCode())
{
managerHandleMouseClick(this.theSlot, this.theSlot.slotNumber, j, 2);
return true;
}
}
}
return false;
}
/**
* Called when the screen is unloaded. Used to disable keyboard repeat events
*/
public void onGuiClosed()
{
if (this.mc.thePlayer != null)
{
this.inventorySlots.onContainerClosed(this.mc.thePlayer);
}
}
/**
* Returns true if this GUI should pause the game when it is displayed in single-player
*/
public boolean doesGuiPauseGame()
{
return false;
}
/**
* Called from the main game loop to update the screen.
*/
public void updateScreen()
{
super.updateScreen();
manager.updateScreen();
if (!this.mc.thePlayer.isEntityAlive() || this.mc.thePlayer.isDead)
{
this.mc.thePlayer.closeScreen();
}
}
public void setWorldAndResolution(Minecraft mc, int i, int j)
{
super.setWorldAndResolution(mc, i, j);
if(mc.currentScreen == this)
{
manager = new GuiContainerManager(this);
manager.load();
}
}
public void handleKeyboardInput()
{
manager.handleKeyboardInput();
}
public void handleMouseInput()
{
super.handleMouseInput();
manager.handleMouseWheel();
}
public void managerHandleMouseClick(Slot slot, int slotIndex, int button, int modifiers)
{
manager.handleMouseClick(slot, slotIndex, button, modifiers);
}
}
-243
View File
@@ -1,243 +0,0 @@
# ExampleMod tag to use as Blowdryer (Spotless, etc.) settings version, leave empty to disable.
# LOCAL to test local config updates.
gtnh.settings.blowdryerTag = 0.2.0
# Human-readable mod name, available for mcmod.info population.
modName = NotEnoughItems
# Case-sensitive identifier string, available for mcmod.info population and used for automatic mixin JSON generation.
# Conventionally lowercase.
modId = NotEnoughItems
# Root package of the mod, used to find various classes in other properties,
# mcmod.info substitution, enabling assertions in run tasks, etc.
modGroup = codechicken.nei
# Whether to use modGroup as the maven publishing group.
# When false, com.github.GTNewHorizons is used.
useModGroupForPublishing = false
# Updates your build.gradle and settings.gradle automatically whenever an update is available.
autoUpdateBuildScript = false
# Version of Minecraft to target
minecraftVersion = 1.7.10
# Version of Minecraft Forge to target
forgeVersion = 10.13.4.1614
# Specify an MCP channel for dependency deobfuscation and the deobfParams task.
channel = stable
# Specify an MCP mappings version for dependency deobfuscation and the deobfParams task.
mappingsVersion = 12
# Defines other MCP mappings for dependency deobfuscation.
remoteMappings = https\://raw.githubusercontent.com/MinecraftForge/FML/1.7.10/conf/
# Select a default username for testing your mod. You can always override this per-run by running
# `./gradlew runClient --username=AnotherPlayer`, or configuring this command in your IDE.
developmentEnvironmentUserName = Developer
# Enables modern Java syntax support. Valid values:
# - false: No modern syntax, Java 8 only
# - jabel: Jabel syntax-only support, compiles to J8 bytecode
# - jvmDowngrader: Full modern Java via JVM Downgrader (syntax + stdlib APIs)
# - modern: Native modern Java bytecode, no downgrading
enableModernJavaSyntax = jabel
# If set, ignores the above setting and compiles with the given toolchain. This may cause unexpected issues,
# and should *not* be used in most situations. -1 disables this.
# forceToolchainVersion = -1
# Target JVM version for JVM Downgrader bytecode downgrading.
# Only used when enableModernJavaSyntax = jvmDowngrader
# downgradeTargetVersion = 8
# Comma-separated list of Java versions for multi-release jar support (JVM Downgrader only).
# Classes will be available in META-INF/versions/N/ for each version N in this list.
# Default: "21,25" (J25+ gets native classes, J21-24 gets partial downgrade, J8-20 gets full downgrade).
# jvmDowngraderMultiReleaseVersions = 21,25
# Specifies how JVM Downgrader API stubs are provided. Options:
# - shade: Shade minimized stubs into the jar
# - gtnhlib: GTNHLib provides stubs at runtime (adds version constraint)
# - external: Another dependency provides stubs (no constraint, no warning)
# - (empty): Warning reminding you to configure stubs
# Note: 'shade' option requires you to verify license compliance, see: https://github.com/unimined/JvmDowngrader/blob/main/LICENSE.md
# jvmDowngraderStubsProvider =
# Enables injecting missing generics into the decompiled source code for a better coding experience.
# Turns most publicly visible List, Map, etc. into proper List<E>, Map<K, V> types.
enableGenericInjection = true
# Generate a class with a String field for the mod version named as defined below.
# If generateGradleTokenClass is empty or not missing, no such class will be generated.
# If gradleTokenVersion is empty or missing, the field will not be present in the class.
generateGradleTokenClass = codechicken.nei.Tags
# Name of the token containing the project's current version to generate/replace.
gradleTokenVersion = VERSION
# [DEPRECATED] Mod ID replacement token.
gradleTokenModId =
# [DEPRECATED] Mod name replacement token.
gradleTokenModName =
# [DEPRECATED] Mod Group replacement token.
gradleTokenGroupName =
# [DEPRECATED]
# Multiple source files can be defined here by providing a comma-separated list: Class1.java,Class2.java,Class3.java
# public static final String VERSION = "GRADLETOKEN_VERSION";
# The string's content will be replaced with your mod's version when compiled. You should use this to specify your mod's
# version in @Mod([...], version = VERSION, [...]).
# Leave these properties empty to skip individual token replacements.
replaceGradleTokenInFile =
# In case your mod provides an API for other mods to implement you may declare its package here. Otherwise, you can
# leave this property empty.
# Example value: (apiPackage = api) + (modGroup = com.myname.mymodid) -> com.myname.mymodid.api
apiPackage =
# Specify the configuration file for Forge's access transformers here. It must be placed into /src/main/resources/META-INF/
# There can be multiple files in a space-separated list.
# Example value: mymodid_at.cfg nei_at.cfg
accessTransformersFile = nei_at.cfg
# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled!
usesMixins = false
# Set to a non-empty string to configure mixins in a separate source set under src/VALUE, instead of src/main.
# This can speed up compile times thanks to not running the mixin annotation processor on all input sources.
# Mixin classes will have access to "main" classes, but not the other way around.
separateMixinSourceSet =
# Adds some debug arguments like verbose output and class export.
usesMixinDebug = false
# Specify the location of your implementation of IMixinConfigPlugin. Leave it empty otherwise.
mixinPlugin =
# Specify the package that contains all of your Mixins. The package must exist or
# the build will fail. If you have a package property defined in your mixins.<modid>.json,
# it must match with this or the build will fail.
mixinsPackage =
# Specify the core mod entry class if you use a core mod. This class must implement IFMLLoadingPlugin!
# This parameter is for legacy compatibility only
# Example value: (coreModClass = asm.FMLPlugin) + (modGroup = com.myname.mymodid) -> com.myname.mymodid.asm.FMLPlugin
coreModClass = asm.NEICorePlugin
# If your project is only a consolidation of mixins or a core mod and does NOT contain a 'normal' mod ( = some class
# that is annotated with @Mod) you want this to be true. When in doubt: leave it on false!
containsMixinsAndOrCoreModOnly = true
# Enables Mixins even if this mod doesn't use them, useful if one of the dependencies uses mixins.
forceEnableMixins = false
# If enabled, you may use 'shadowCompile' for dependencies. They will be integrated into your jar. It is your
# responsibility to check the license and request permission for distribution if required.
usesShadowedDependencies = true
# If disabled, won't remove unused classes from shadowed dependencies. Some libraries use reflection to access
# their own classes, making the minimization unreliable.
minimizeShadowedDependencies = true
# If disabled, won't rename the shadowed classes.
relocateShadowedDependencies = true
# Adds CurseMaven, Modrinth, and some more well-known 1.7.10 repositories.
includeWellKnownRepositories = true
# A list of repositories to exclude from the includeWellKnownRepositories setting. Should be a space separated
# list of strings, with the acceptable keys being(case does not matter):
# cursemaven
# modrinth
excludeWellKnownRepositories =
# Change these to your Maven coordinates if you want to publish to a custom Maven repository instead of the default GTNH Maven.
# Authenticate with the MAVEN_USER and MAVEN_PASSWORD environment variables.
# If you need a more complex setup disable maven publishing here and add a publishing repository to addon.gradle.
usesMavenPublishing = true
# Maven repository to publish the mod to.
# mavenPublishUrl = https\://nexus.gtnewhorizons.com/repository/releases/
# Publishing to Modrinth requires you to set the MODRINTH_TOKEN environment variable to your current Modrinth API token.
#
# The project's ID on Modrinth. Can be either the slug or the ID.
# Leave this empty if you don't want to publish to Modrinth.
modrinthProjectId = notenoughitems-unofficial
# The project's relations on Modrinth. You can use this to refer to other projects on Modrinth.
# Syntax: scope1-type1:name1;scope2-type2:name2;...
# Where scope can be one of [required, optional, incompatible, embedded],
# type can be one of [project, version],
# and the name is the Modrinth project or version slug/id of the other mod.
# Example: required-project:fplib;optional-project:gasstation;incompatible-project:gregtech
# Note: UniMixins is automatically set as a required dependency if usesMixins = true.
modrinthRelations = required-project\:codechickencore-unofficial
# Publishing to CurseForge requires you to set the CURSEFORGE_TOKEN environment variable to one of your CurseForge API tokens.
#
# The project's numeric ID on CurseForge. You can find this in the About Project box.
# Leave this empty if you don't want to publish on CurseForge.
curseForgeProjectId = 358228
# Comma-separated supported CurseForge environments: client, server (case-insensitive).
# Use client or server for mods that only support one environment. Defaults to client,server.
# These tags describe where the mod can run, not whether installation is required on both sides.
curseForgeEnvironments = client,server
# The project's relations on CurseForge. You can use this to refer to other projects on CurseForge.
# Syntax: type1:name1;type2:name2;...
# Where type can be one of [requiredDependency, embeddedLibrary, optionalDependency, tool, incompatible],
# and the name is the CurseForge project slug of the other mod.
# Example: requiredDependency:railcraft;embeddedLibrary:cofhlib;incompatible:buildcraft
# Note: UniMixins is automatically set as a required dependency if usesMixins = true.
curseForgeRelations = requiredDependency\:codechickencore-unofficial
# Optional parameter to customize the produced artifacts. Use this to preserve artifact naming when migrating older
# projects. New projects should not use this parameter.
# customArchiveBaseName =
# Optional parameter to customize the default working directory used by the runClient* tasks. Relative to the project directory.
# runClientWorkingDirectory = run/client
# Optional parameter to customize the default working directory used by the runServer* tasks. Relative to the project directory.
# runServerWorkingDirectory = run/server
# Optional parameter to have the build automatically fail if an illegal version is used.
# This can be useful if you e.g. only want to allow versions in the form of '1.1.xxx'.
# The check is ONLY performed if the version is a git tag.
# Note: the specified string must be escaped, so e.g. 1\\.1\\.\\d+ instead of 1\.1\.\d+
# versionPattern =
# Uncomment to prevent the source code from being published.
# noPublishedSources = true
# Uncomment this to disable Spotless checks.
# This should only be uncommented to keep it easier to sync with upstream/other forks.
# That is, if there is no other active fork/upstream, NEVER change this.
# disableSpotless = true
# Uncomment this to disable Checkstyle checks (currently wildcard import check).
# disableCheckstyle = true
# Override the IDEA build type. Valid values are: "" (leave blank, do not override), "idea" (force use native IDEA build), "gradle"
# (force use delegated build).
# This is meant to be set in $HOME/.gradle/gradle.properties.
# e.g. add "systemProp.org.gradle.project.ideaOverrideBuildType=idea" will override the build type to be native build.
# WARNING: If you do use this option, it will overwrite whatever you have in your existing projects. This might not be what you want!
# Usually there is no need to uncomment this here as other developers do not necessarily use the same build type as you.
# ideaOverrideBuildType = idea
# Whether IDEA should run spotless checks when pressing the Build button.
# This is meant to be set in $HOME/.gradle/gradle.properties.
# ideaCheckSpotlessOnBuild = true
# Non-GTNH properties
org.gradle.configuration-cache = true
org.gradle.parallel = true
-12
View File
@@ -1,12 +0,0 @@
#This file is generated by updateDaemonJvm
toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/539ea72837c6244075f8ee037babc29e/redirect
toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/876dbbf00bf4ef6190f7da074cee903a/redirect
toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/539ea72837c6244075f8ee037babc29e/redirect
toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/876dbbf00bf4ef6190f7da074cee903a/redirect
toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/9064f22734b42ac03e85df04b632e167/redirect
toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/4d0277c49991306ac78048580fe34bcf/redirect
toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/539ea72837c6244075f8ee037babc29e/redirect
toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/876dbbf00bf4ef6190f7da074cee903a/redirect
toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/a9fa3b809e484a1e1ac4308a5dda661a/redirect
toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/aa99913fa6d767d899ffc96082da01ca/redirect
toolchainVersion=25
Binary file not shown.
+1 -5
View File
@@ -1,9 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.1-bin.zip
networkTimeout=10000
retries=0
retryBackOffMs=500
validateDistributionUrl=true
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Vendored
+113 -173
View File
@@ -1,7 +1,7 @@
#!/bin/sh
#!/usr/bin/env sh
#
# Copyright © 2015 the original authors.
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -15,114 +15,80 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#
##############################################################################
#
# gradlew start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh gradlew
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
MAX_FD="maximum"
warn () {
echo "$*"
} >&2
}
die () {
echo
echo "$*"
echo
exit 1
} >&2
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD=$JAVA_HOME/bin/java
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -131,118 +97,92 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"
Vendored
+50 -32
View File
@@ -13,28 +13,22 @@
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem gradlew startup script for Windows
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables, and ensure extensions are enabled
setlocal EnableExtensions
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@@ -43,40 +37,64 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
if "%ERRORLEVEL%" == "0" goto init
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
"%COMSPEC%" /c exit 1
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
if exist "%JAVA_EXE%" goto init
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
"%COMSPEC%" /c exit 1
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
@rem Execute gradlew
@rem endlocal doesn't take effect until after the line is parsed and variables are expanded
@rem which allows us to clear the local environment before executing the java command
endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:exitWithErrorLevel
@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts
"%COMSPEC%" /c exit %ERRORLEVEL%
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
-2
View File
@@ -1,2 +0,0 @@
before_install:
- ./gradlew setupCIWorkspace
-8
View File
@@ -1,8 +0,0 @@
// Add any additional repositories for your dependencies here
repositories {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
@@ -7,6 +7,13 @@ ILOAD 4
PUTSTATIC codechicken/nei/ItemMobSpawner.placedZ:I
RETURN
list d_spawnerWorld
ACONST_NULL
list spawnerWorld
ALOAD 0
INVOKEVIRTUAL net/minecraft/tileentity/MobSpawnerBaseLogic.func_98271_a()Lnet/minecraft/world/World;
list n_commaFix
LDC *
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
@@ -62,27 +69,6 @@ ICONST_0
ICONST_1 #keep the destination alpha
INVOKESTATIC net/minecraft/client/renderer/OpenGlHelper.func_148821_a (IIII)V
list m_keyBindingOnTickAll
ILOAD 0
INVOKESTATIC codechicken/nei/asm/KeyBindingFixHooks.onTickAll (I)V
RETURN
list m_keyBindingSetStateAll
ILOAD 0
ILOAD 1
INVOKESTATIC codechicken/nei/asm/KeyBindingFixHooks.setKeyBindStateAll (IZ)V
RETURN
list saveOptionsHook
INVOKESTATIC codechicken/nei/asm/SaveOptionsFixHooks.onBeforeSaveOptions ()V
list n_saveOptionsSendSettings
ALOAD 0
INVOKEVIRTUAL net/minecraft/client/settings/GameSettings.func_82879_c ()V
list saveOptionsRestoreHook
INVOKESTATIC codechicken/nei/asm/SaveOptionsFixHooks.onAfterSaveOptions ()V
#begin GuiContainer patches
@@ -121,12 +107,6 @@ RETURN
list m_handleMouseInput
ALOAD 0
GETFIELD net/minecraft/client/gui/inventory/GuiContainer.manager : Lcodechicken/nei/guihook/GuiContainerManager;
INVOKEVIRTUAL codechicken/nei/guihook/GuiContainerManager.handleMouseHotkey ()Z
IFEQ LCONT
RETURN
LCONT
ALOAD 0
INVOKESPECIAL net/minecraft/client/gui/GuiScreen.func_146274_d ()V
ALOAD 0
GETFIELD net/minecraft/client/gui/inventory/GuiContainer.manager : Lcodechicken/nei/guihook/GuiContainerManager;
@@ -410,3 +390,4 @@ INVOKEVIRTUAL codechicken/nei/guihook/GuiContainerManager.objectUnderMouse (II)Z
IFEQ LCONT
RETURN
LCONT
+340
View File
@@ -0,0 +1,340 @@
handler,modName,itemName,nbtInfo,modId,modRequired,excludedModId,yShift,handlerHeight,handlerWidth,maxRecipesPerPage,imageResource,imageX,imageY,imageWidth,imageHeight,itemNotes
codechicken.nei.recipe.BrewingRecipeHandler,minecraft,minecraft:brewing_stand,,minecraft,FALSE,,,65,166,5,,,,,,
codechicken.nei.recipe.FireworkRecipeHandler,minecraft,minecraft:fireworks,,minecraft,FALSE,,,65,166,5,,,,,,
codechicken.nei.recipe.FurnaceRecipeHandler,minecraft,minecraft:furnace,,minecraft,FALSE,,,65,166,5,,,,,,
codechicken.nei.recipe.ShapedRecipeHandler,minecraft,minecraft:crafting_table,,minecraft,FALSE,,,65,166,5,,,,,,
codechicken.nei.recipe.ShapelessRecipeHandler,minecraft,minecraft:crafting_table,,minecraft,FALSE,,,65,166,5,,,,,,
codechicken.nei.recipe.FuelRecipeHandler,minecraft,,,minecraft,FALSE,,,65,166,5,nei:textures/nei_tabbed_sprites.png,80,0,14,14,
advsolar.client.nei.MTRecipeHandler,AdvancedSolarPanel,AdvancedSolarPanel:BlockMolecularTransformer,,AdvancedSolarPanel,TRUE,,,68,,5,,,,,,
appeng.integration.modules.NEIHelpers.NEIAEShapedRecipeHandler,AppliedEnergistics2,appliedenergistics2:item.ItemMultiPart:380,,appliedenergistics2,TRUE,,,,,,,,,,,
appeng.integration.modules.NEIHelpers.NEIAEShapelessRecipeHandler,AppliedEnergistics2,appliedenergistics2:item.ItemMultiPart:380,,appliedenergistics2,TRUE,,,,,,,,,,,
appeng.integration.modules.NEIHelpers.NEIFacadeRecipeHandler,AppliedEnergistics2,appliedenergistics2:item.ItemFacade:192,,appliedenergistics2,TRUE,,,65,,5,,,,,,
appeng.integration.modules.NEIHelpers.NEIGrinderRecipeHandler,AppliedEnergistics2,appliedenergistics2:item.ItemMultiMaterial:8,,appliedenergistics2,TRUE,,,,,,,,,,,
appeng.integration.modules.NEIHelpers.NEIInscriberRecipeHandler,AppliedEnergistics2,appliedenergistics2:tile.BlockInscriber,,appliedenergistics2,TRUE,,,70,,5,,,,,,
appeng.integration.modules.NEIHelpers.NEIWorldCraftingHandler,AppliedEnergistics2,appliedenergistics2:item.ItemMultiMaterial:9,,appliedenergistics2,TRUE,,,85,,5,,,,,,There's only some explanatory text for fluix crystals and QEDs
aroma1997.core.recipes.nei.ShapedAromicRecipeHandler,AromaBackup,minecraft:crafting_table,,AromaBackup,TRUE,,,,,,,,,,,
aroma1997.core.recipes.nei.ShapelessAromicRecipeHandler,AromaBackup,minecraft:crafting_table,,AromaBackup,TRUE,,,,,,,,,,,
fox.spiteful.avaritia.compat.nei.CompressionHandler,Avaritia,Avaritia:Neutronium_Compressor,,Avaritia,TRUE,,,50,,6,,,,,,
fox.spiteful.avaritia.compat.nei.ExtremeShapedRecipeHandler,Avaritia,Avaritia:Dire_Crafting,,Avaritia,TRUE,,,208,256,1,,,,,,Part of it even goes off the left side (included)
fox.spiteful.avaritia.compat.nei.ExtremeShapelessRecipeHandler,Avaritia,Avaritia:Dire_Crafting,,Avaritia,TRUE,,,208,256,1,,,,,,"If you can cut off/place over the jaggedness at the bottom, you could barely get a second one"
WayofTime.alchemicalWizardry.client.nei.NEIAlchemyRecipeHandler,BloodMagic,AWWayofTime:blockWritingTable,,AWWayofTime,TRUE,,,68,,5,,,,,,
WayofTime.alchemicalWizardry.client.nei.NEIAltarRecipeHandler,BloodMagic,AWWayofTime:Altar,,AWWayofTime,TRUE,,,65,,5,,,,,,Handler name needs shifting left
WayofTime.alchemicalWizardry.client.nei.NEIBindingRitualHandler,BloodMagic,AWWayofTime:sacrificialKnife,,AWWayofTime,TRUE,,,50,,6,,,,,,
WayofTime.alchemicalWizardry.client.nei.NEIBloodOrbShapedHandler,BloodMagic,AWWayofTime:AlchemicalWizardrybloodRune:3,,AWWayofTime,TRUE,,,65,,5,,,,,,
WayofTime.alchemicalWizardry.client.nei.NEIBloodOrbShapelessHandler,BloodMagic,AWWayofTime:AlchemicalWizardrybloodRune:4,,AWWayofTime,TRUE,,,65,,5,,,,,,
bw.fuels.acidgens,BartWorks,gregtech:gt.blockmachines:12726,,bartworks,TRUE,,,145,,2,,,,,,
bw.recipe.cal,BartWorks,gregtech:gt.blockmachines:12735,,bartworks,TRUE,,,135,,2,,,,,,
com.github.bartimaeusnek.bartworks.neiHandler.BW_NEI_BioLabHandler,BartWorks,gregtech:gt.blockmachines:12699,,bartworks,TRUE,,,145,,2,,,,,,
com.github.bartimaeusnek.bartworks.neiHandler.BW_NEI_BioVatHandler,BartWorks,gregtech:gt.blockmachines:12712,,bartworks,TRUE,,,140,,2,,,,,,
com.github.bartimaeusnek.bartworks.neiHandler.BW_NEI_OreHandler,BartWorks,bartworks:bw.blockores.01:89,,bartworks,TRUE,,,135,,2,,,,,,
gt.recipe.electricimplosioncompressor,BartWorks,gregtech:gt.blockmachines:12734 Electric implosion compressor,,bartworks,TRUE,,,135,,2,,,,,,
net.bdew.neiaddons.botany.flowers.FlowerBreedingHandler,Botany,Botany:flower,,Botany,TRUE,,,65,,5,,,,,,
buildcraft.compat.nei.RecipeHandlerRefinery,BuildCraft,BuildCraft|Factory:refineryBlock,,BuildCraft|Factory,TRUE,,,60,,5,,,,,,There's only 2 recipes though
buildcraft.compat.nei.RecipeHandlerAssemblyTable,BuildCraft,BuildCraft|Silicon:laserTableBlock,,BuildCraft|Silicon,TRUE,,,100,,3,,,,,,
buildcraft.compat.nei.RecipeHandlerIntegrationTable,BuildCraft,BuildCraft|Silicon:laserTableBlock:2,,BuildCraft|Silicon,TRUE,,,85,,4,,,,,,
team.chisel.compat.nei.RecipeHandlerChisel,Chisel,chisel:chisel,,chisel,TRUE,,,135,,2,,,,,,
crazypants.enderio.nei.AlloySmelterRecipeHandler,EnderIO,EnderIO:blockAlloySmelter,,EnderIO,TRUE,,,65,,5,,,,,,
crazypants.enderio.nei.EnchanterRecipeHandler,EnderIO,EnderIO:blockEnchanter,,EnderIO,TRUE,,,65,,5,,,,,,
crazypants.enderio.nei.SagMillRecipeHandler,EnderIO,EnderIO:blockSagMill,,EnderIO,TRUE,,,68,,5,,,,,,
crazypants.enderio.nei.SliceAndSpliceRecipeHandler,EnderIO,EnderIO:blockSliceAndSplice,,EnderIO,TRUE,,,65,,5,,,,,,
crazypants.enderio.nei.SoulBinderRecipeHandler,EnderIO,EnderIO:blockSoulBinder,,EnderIO,TRUE,,,68,,5,,,,,,
crazypants.enderio.nei.VatRecipeHandler,EnderIO,EnderIO:blockVat,,EnderIO,TRUE,,,65,,5,,,,,,
extracells.integration.nei.UniversalTerminalRecipe,ExtraCells,extracells:part.base:9,,extracells,TRUE,,,65,,5,,,,,,
com.rwtema.extrautils.nei.EnderConstructorHandler,ExtraUtilities,ExtraUtilities:endConstructor,,ExtraUtilities,TRUE,,,68,,5,,,,,,
com.rwtema.extrautils.nei.FMPMicroBlocksHandler,ExtraUtilities,ForgeMicroblock:sawIron,,ExtraUtilities,TRUE,,,65,,5,,,,,,
com.rwtema.extrautils.nei.InfoHandler,ExtraUtilities,ExtraUtilities:chandelier,,ExtraUtilities,TRUE,,,135,,2,,,,,,"Info on blocks, can vary wildly. EQ was this length, there might be a longer one"
com.rwtema.extrautils.nei.MicroBlocksHandler,ExtraUtilities,ExtraUtilities:microblocks:1,,ExtraUtilities,TRUE,,,,,,,,,,,
com.rwtema.extrautils.nei.SoulHandler,ExtraUtilities,ExtraUtilities:mini-soul,,ExtraUtilities,TRUE,,,,,,,,,,,
hellfirepvp.beebetteratbees.client.gui.BBABGuiRecipeTreeHandler,Bees,Forestry:beeQueenGE,,Forestry,TRUE,,,140,,2,,,,,,
forestry.factory.recipes.nei.NEIHandlerBottler,Forestry,Forestry:factory,,Forestry,TRUE,,,68,,5,,,,,,
forestry.factory.recipes.nei.NEIHandlerCarpenter,Forestry,Forestry:factory:1,,Forestry,TRUE,,,65,,5,,,,,,
forestry.factory.recipes.nei.NEIHandlerCentrifuge,Forestry,Forestry:factory:2,,Forestry,TRUE,,,65,,5,,,,,,
forestry.factory.recipes.nei.NEIHandlerFabricator,Forestry,Forestry:factory2,,Forestry,TRUE,,,,,,,,,,,
forestry.factory.recipes.nei.NEIHandlerFermenter,Forestry,Forestry:factory:3,,Forestry,TRUE,,,65,,5,,,,,,
forestry.factory.recipes.nei.NEIHandlerMoistener,Forestry,Forestry:factory:4,,Forestry,TRUE,,,68,,5,,,,,,
forestry.factory.recipes.nei.NEIHandlerSqueezer,Forestry,Forestry:factory:5,,Forestry,TRUE,,,68,,5,,,,,,
forestry.factory.recipes.nei.NEIHandlerStill,Forestry,Forestry:factory:6,,Forestry,TRUE,,,65,,5,,,,,,
net.bdew.neiaddons.forestry.bees.BeeBreedingHandler,Forestry,Forestry:beeQueenGE,,Forestry,TRUE,,,65,,5,,,,,,
net.bdew.neiaddons.forestry.bees.BeeProduceHandler,Forestry,Forestry:beeQueenGE,,Forestry,TRUE,,,65,,5,,,,,,
net.bdew.neiaddons.forestry.butterflies.ButterflyBreedingHandler,Forestry,Forestry:butterflyGE,,Forestry,TRUE,,,,,,,,,,,
net.bdew.neiaddons.forestry.trees.TreeBreedingHandler,Forestry,Forestry:saplingGE,,Forestry,TRUE,,,65,,5,,,,,,
net.bdew.neiaddons.forestry.trees.TreeProduceHandler,Forestry,Forestry:saplingGE,,Forestry,TRUE,,,65,,5,,,,,,
galaxyspace.core.nei.rocket.RocketT1RecipeHandler,Galacticraft,GalacticraftCore:item.spaceship,,GalacticraftCore,TRUE,,,125,,2,,,,,,
micdoodle8.mods.galacticraft.core.nei.BuggyRecipeHandler,Galacticraft,GalacticraftCore:tile.rocketWorkbench,,GalacticraftCore,TRUE,,10,135,,2,,,,,,
micdoodle8.mods.galacticraft.core.nei.CircuitFabricatorRecipeHandler,Galacticraft,GalacticraftCore:tile.machine2:4,,GalacticraftCore,TRUE,,,,,,,,,,,
micdoodle8.mods.galacticraft.core.nei.ElectricIngotCompressorRecipeHandler,Galacticraft,GalacticraftCore:tile.machine2,,GalacticraftCore,TRUE,,,,,,,,,,,
micdoodle8.mods.galacticraft.core.nei.IngotCompressorRecipeHandler,Galacticraft,GalacticraftCore:tile.machine:12,,GalacticraftCore,TRUE,,,,,,,,,,,
micdoodle8.mods.galacticraft.core.nei.RefineryRecipeHandler,Galacticraft,GalacticraftCore:tile.refinery,,GalacticraftCore,TRUE,,,,,,,,,,,
micdoodle8.mods.galacticraft.planets.asteroids.nei.AstroMinerRecipeHandler,Galacticraft,GalacticraftCore:tile.rocketWorkbench,,GalacticraftCore,TRUE,,,100,,3,,,,,,
micdoodle8.mods.galacticraft.planets.mars.nei.CargoRocketRecipeHandler,Galacticraft,GalacticraftCore:tile.rocketWorkbench,,GalacticraftCore,TRUE,,10,125,,2,,,,,,
micdoodle8.mods.galacticraft.planets.mars.nei.GasLiquefierRecipeHandler,Galacticraft,GalacticraftMars:tile.marsMachineT2,,GalacticraftCore,TRUE,,,,,,,,,,,
micdoodle8.mods.galacticraft.planets.mars.nei.MethaneSynthesizerRecipeHandler,Galacticraft,GalacticraftMars:tile.marsMachineT2:4,,GalacticraftCore,TRUE,,,,,,,,,,,
galaxyspace.core.nei.rocket.RocketT2RecipeHandler,Galacticraft,GalacticraftMars:item.spaceshipTier2:1,,GalacticraftMars,TRUE,,5,145,,2,,,,,,
galaxyspace.core.nei.rocket.RocketT3RecipeHandler,Galacticraft,GalacticraftMars:item.itemTier3Rocket,,GalacticraftMars,TRUE,,5,145,,2,,,,,,
galaxyspace.core.nei.AssemblyMachineRecipeHandler,GalaxySpace,GalaxySpace:assemblymachine,,GalaxySpace,TRUE,,,,,,,,,,,
galaxyspace.core.nei.rocket.RocketT4RecipeHandler,GalaxySpace,GalaxySpace:item.Tier4Rocket,,GalaxySpace,TRUE,,10,160,,2,,,,,,
galaxyspace.core.nei.rocket.RocketT5RecipeHandler,GalaxySpace,GalaxySpace:item.Tier5Rocket,,GalaxySpace,TRUE,,10,160,,2,,,,,,
galaxyspace.core.nei.rocket.RocketT6RecipeHandler,GalaxySpace,GalaxySpace:item.Tier6Rocket,,GalaxySpace,TRUE,,10,160,,2,,,,,,
galaxyspace.core.nei.rocket.RocketT7RecipeHandler,GalaxySpace,GalaxySpace:item.Tier7Rocket,,GalaxySpace,TRUE,,10,180,,1,,,,,,
galaxyspace.core.nei.rocket.RocketT8RecipeHandler,GalaxySpace,GalaxySpace:item.Tier8Rocket,,GalaxySpace,TRUE,,10,180,,1,,,,,,
net.bdew.gendustry.nei.ExtractorHandler,Gendustry,gendustry:Extractor,,gendustry,TRUE,,,68,,5,,,,,,
net.bdew.gendustry.nei.ImprinterHandler,Gendustry,gendustry:Imprinter,,gendustry,TRUE,,,68,,5,,,,,,
net.bdew.gendustry.nei.LiquifierHandler,Gendustry,gendustry:Liquifier,,gendustry,TRUE,,,68,,5,,,,,,
net.bdew.gendustry.nei.MutagenProducerHandler,Gendustry,gendustry:MutagenProducer,,gendustry,TRUE,,,68,,5,,,,,,
net.bdew.gendustry.nei.MutatronHandler,Gendustry,gendustry:Mutatron,,gendustry,TRUE,,,65,,5,,,,,,
net.bdew.gendustry.nei.ReplicatorHandler,Gendustry,gendustry:Replicator,,gendustry,TRUE,,,68,,5,,,,,,
net.bdew.gendustry.nei.SamplerHandler,Gendustry,gendustry:Sampler,,gendustry,TRUE,,,68,,5,,,,,,
net.bdew.gendustry.nei.TemplateCraftingHandler,Gendustry,gendustry:GeneTemplate,,gendustry,TRUE,,,105,,3,,,,,,"I don't think there's any actual recipes here, just a generic one"
net.bdew.gendustry.nei.TransposerHandler,Gendustry,gendustry:Transposer,,gendustry,TRUE,,,68,,5,,,,,,
gt.recipe.alloysmelter,gregtech,gregtech:gt.blockmachines:201,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,Amplifabricator
gt.recipe.arcfurnace,gregtech,gregtech:gt.blockmachines:651,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,Bronze boiler
gt.recipe.assembler,gregtech,gregtech:gt.blockmachines:211,,gregtech,TRUE,gregapi_post,6,145,166,2,,,,,,Byproducts from ore processing
gt.recipe.autoclave,gregtech,gregtech:gt.blockmachines:571,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,Disabled 'Thermal Generator'? Or compat for the IC2 geothermal?
gt.recipe.blastfurnace,gregtech,gregtech:gt.blockmachines:1000,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,Disabled CNC machine?
gt.recipe.brewer,gregtech,gregtech:gt.blockmachines:491,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,ECE
gt.recipe.byproductlist,gregtech,gregtech:gt.metaitem.01:2019,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicgenerator.magicenergyconverter.tier.01
gt.recipe.canner,gregtech,gregtech:gt.blockmachines:231,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicgenerator.plasmagenerator.tier.05
gt.recipe.centrifuge,gregtech,gregtech:gt.blockmachines:361,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.arcfurnace.tier.01
gt.recipe.chemicalbath,gregtech,gregtech:gt.blockmachines:541,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.assembler.tier.01
gt.recipe.chemicalreactor,gregtech,gregtech:gt.blockmachines:421,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.autoclave.tier.01
gt.recipe.circuitassembler,gregtech,gregtech:gt.blockmachines:1180,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.bender.tier.01
gt.recipe.cncmachine,gregtech,gregtech:gt.metaitem.01:23305,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.boxinator.tier.01
gt.recipe.cokeoven,gregtech,gregtech:gt.blockmachines:791,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.brewery.tier.01
gt.recipe.componentassembler,gregtech,gregtech:gt.blockmachines:211,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.canner.tier.01
gt.recipe.compressor,gregtech,gregtech:gt.blockmachines:241,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.centrifuge.tier.01
gt.recipe.craker,gregtech,gregtech:gt.blockmachines:1160,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.chemicalbath.tier.01
gt.recipe.cuttingsaw,gregtech,gregtech:gt.blockmachines:251,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.chemicalreactor.tier.01
gt.recipe.dieselgeneratorfuel,gregtech,gregtech:gt.blockmachines:1110,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.circuitassembler.tier.01
gt.recipe.distillationtower,gregtech,gregtech:gt.blockmachines:1126,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.compressor.tier.01
gt.recipe.distillery,gregtech,gregtech:gt.blockmachines:531,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.cutter.tier.01
gt.recipe.electrolyzer,gregtech,gregtech:gt.blockmachines:371,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.distillery.tier.01
gt.recipe.electromagneticseparator,gregtech,gregtech:gt.blockmachines:561,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.electrolyzer.tier.01
gt.recipe.extractor,gregtech,gregtech:gt.blockmachines:271,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.electromagneticseparator.tier.01
gt.recipe.extrahugenaquadahreactor,gregtech,gregtech:gt.blockmachines:1189,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.extractor.tier.01
gt.recipe.extremedieselgeneratorfuel,gregtech,gregtech:gt.blockmachines:2105,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.extruder.tier.01
gt.recipe.extruder,gregtech,gregtech:gt.blockmachines:281,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.fermenter.tier.01
gt.recipe.fakeAssemblylineProcess,gregtech,gregtech:gt.blockmachines:1170,,gregtech,TRUE,gregapi_post,12,135,166,2,,,,,,gt.blockmachines.basicmachine.fluidcanner.tier.01
gt.recipe.fermenter,gregtech,gregtech:gt.blockmachines:501,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.fluidextractor.tier.01
gt.recipe.fluidcanner,gregtech,gregtech:gt.blockmachines:431,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.fluidheater.tier.01
gt.recipe.fluidextractor,gregtech,gregtech:gt.blockmachines:511,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.fluidsolidifier.tier.01
gt.recipe.fluidheater,gregtech,gregtech:gt.blockmachines:621,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.hammer.tier.01
gt.recipe.fluidnaquadahreactor,gregtech,gregtech:gt.blockmachines:1192,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.laserengraver.tier.01
gt.recipe.fluidsolidifier,gregtech,gregtech:gt.blockmachines:521,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.lathe.tier.01
gt.recipe.fusionreactor,gregtech,gregtech:gt.blockmachines:1193,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.macerator.tier.01
gt.recipe.gasturbinefuel,gregtech,gregtech:gt.blockmachines:1115,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.massfab.tier.01
gt.recipe.hammer,gregtech,gregtech:gt.blockmachines:611,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.microwave.tier.01
gt.recipe.hugenaquadahreactor,gregtech,gregtech:gt.blockmachines:1188,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.mixer.tier.01
gt.recipe.implosioncompressor,gregtech,gregtech:gt.blockmachines:12734,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.orewasher.tier.01
gt.recipe.largeboilerfakefuels,gregtech,gregtech:gt.blockmachines:1020,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.plasmaarcfurnace.tier.01
gt.recipe.largechemicalreactor,gregtech,gregtech:gt.blockmachines:1169,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.polarizer.tier.01
gt.recipe.largenaquadahreactor,gregtech,gregtech:gt.blockmachines:1191,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.press.tier.01
gt.recipe.laserengraver,gregtech,gregtech:gt.blockmachines:591,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.printer.tier.01
gt.recipe.lathe,gregtech,gregtech:gt.blockmachines:291,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.recycler.tier.01
gt.recipe.macerator,gregtech,gregtech:gt.blockmachines:301,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.replicator.tier.01
gt.recipe.magicfuels,gregtech,gregtech:gt.blockmachines:1123,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.rockbreaker.tier.01
gt.recipe.massfab,gregtech,gregtech:gt.blockmachines:461,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.scanner.tier.01
gt.recipe.metalbender,gregtech,gregtech:gt.blockmachines:221,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.sifter.tier.01
gt.recipe.microwave,gregtech,gregtech:gt.blockmachines:311,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.slicer.tier.01
gt.recipe.mixer,gregtech,gregtech:gt.blockmachines:581,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.thermalcentrifuge.tier.01
gt.recipe.orewasher,gregtech,gregtech:gt.blockmachines:391,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.unboxinator.tier.01
gt.recipe.packager,gregtech,gregtech:gt.blockmachines:401,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.basicmachine.wiremill.tier.01
gt.recipe.plasmaarcfurnace,gregtech,gregtech:gt.blockmachines:661,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.electricimplosioncompressor
gt.recipe.plasmageneratorfuels,gregtech,gregtech:gt.blockmachines:1196,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.fusioncomputer.tier.06
gt.recipe.polarizer,gregtech,gregtech:gt.blockmachines:551,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.industrialcokeoven.controller.tier.single
gt.recipe.press,gregtech,gregtech:gt.blockmachines:601,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,Needs more Yshift? Or doesn't apply properly? Added more
gt.recipe.primitiveblastfurnace,gregtech,gregtech:gt.blockmachines:140,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.multimachine.blastfurnace
gt.recipe.printer,gregtech,gregtech:gt.blockmachines:321,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.multimachine.boiler.bronze
gt.recipe.pyro,gregtech,gregtech:gt.blockmachines:1159,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.multimachine.brickedblastfurnace
gt.recipe.replicator,gregtech,gregtech:gt.blockmachines:481,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.multimachine.chemicalreactor
gt.recipe.rockbreaker,gregtech,gregtech:gt.blockmachines:441,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.multimachine.cracker
gt.recipe.scanner,gregtech,gregtech:gt.blockmachines:341,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.multimachine.distillationtower
gt.recipe.semifluidboilerfuels,gregtech,gregtech:gt.blockmachines:1020,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.multimachine.pyro
gt.recipe.sifter,gregtech,gregtech:gt.blockmachines:641,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,gt.blockmachines.multimachine.vacuumfreezer
gt.recipe.slicer,gregtech,gregtech:gt.blockmachines:631,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,GT++'s incomplete compound fabricator?
gt.recipe.smallnaquadahreactor,gregtech,gregtech:gt.blockmachines:1190,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,LV Combustion gen
gt.recipe.thermalcentrifuge,gregtech,gregtech:gt.blockmachines:381,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,LV gas turbine
gt.recipe.thermalgeneratorfuel,gregtech,IC2:blockGenerator:1,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,Naq Reactor Mark I
gt.recipe.unpackager,gregtech,gregtech:gt.blockmachines:411,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,Naq Reactor Mark II
gt.recipe.uuamplifier,gregtech,gregtech:gt.blockmachines:471,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,Naq Reactor Mark III. Misnamed in code
gt.recipe.vacuumfreezer,gregtech,gregtech:gt.blockmachines:1002,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,Naq Reactor Mark IV. Slightly different name for recipe map
gt.recipe.wiremill,gregtech,gregtech:gt.blockmachines:351,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,Naq Reactor Mark V. Slightly different name for recipe map
ic.recipe.recycler,gregtech,gregtech:gt.blockmachines:331,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
pers.gwyog.gtneioreplugin.plugin.gregtech5.PluginGT5SmallOreStat,Gregtech,gregtech:gt.blockores:85,,gregtech,TRUE,,,145,,2,,,,,,
pers.gwyog.gtneioreplugin.plugin.gregtech5.PluginGT5VeinStat,Gregtech,gregtech:gt.blockores:386,,gregtech,TRUE,,,135,,2,,,,,,
ic2.neiIntegration.core.recipehandler.AdvRecipeHandler,IC2,IC2:blockreactorvessel,,IC2,TRUE,,,65,,5,,,,,,
ic2.neiIntegration.core.recipehandler.AdvShapelessRecipeHandler,IC2,IC2:blockreactorvessel,,IC2,TRUE,,,65,,5,,,,,,
ic2.neiIntegration.core.recipehandler.BlastFurnaceRecipeHandler,IC2,IC2:blockMachine3:1,,IC2,TRUE,,,65,,5,,,,,,
ic2.neiIntegration.core.recipehandler.BlockCutterRecipeHandler,IC2,IC2:blockMachine3:2,,IC2,TRUE,,,65,,5,,,,,,
ic2.neiIntegration.core.recipehandler.CentrifugeRecipeHandler,IC2,IC2:blockMachine2:3,,IC2,TRUE,,,65,,5,,,,,,
ic2.neiIntegration.core.recipehandler.CompressorRecipeHandler,IC2,IC2:blockMachine:5,,IC2,TRUE,,,65,,5,,,,,,
ic2.neiIntegration.core.recipehandler.ExtractorRecipeHandler,IC2,IC2:blockMachine:4,,IC2,TRUE,,,65,,5,,,,,,
ic2.neiIntegration.core.recipehandler.FluidCannerRecipeHandler,IC2,IC2:blockMachine:6,,IC2,TRUE,,,65,,5,,,,,,
ic2.neiIntegration.core.recipehandler.LatheRecipeHandler,IC2,IC2:blockMachine3:8,,IC2,TRUE,,,65,,5,,,,,,
ic2.neiIntegration.core.recipehandler.MaceratorRecipeHandler,IC2,IC2:blockMachine:3,,IC2,TRUE,,,65,,5,,,,,,
ic2.neiIntegration.core.recipehandler.MetalFormerRecipeHandlerCutting,IC2,IC2:blockMachine2:4,,IC2,TRUE,,,55,,6,,,,,,
ic2.neiIntegration.core.recipehandler.MetalFormerRecipeHandlerExtruding,IC2,IC2:blockMachine2:4,,IC2,TRUE,,,55,,6,,,,,,
ic2.neiIntegration.core.recipehandler.MetalFormerRecipeHandlerRolling,IC2,IC2:blockMachine2:4,,IC2,TRUE,,,55,,6,,,,,,
ic2.neiIntegration.core.recipehandler.OreWashingRecipeHandler,IC2,IC2:blockMachine2:5,,IC2,TRUE,,,,,,,,,,,
ic2.neiIntegration.core.recipehandler.ScrapboxRecipeHandler,IC2,IC2:itemScrapbox,,IC2,TRUE,,,50,,6,,,,,,
ic2.neiIntegration.core.recipehandler.SolidCannerRecipeHandler,IC2,IC2:blockMachine2:9,,IC2,TRUE,,,,,,,,,,,
speiger.src.crops.prediction.NEIPlugin,IC2CropsNEI,IC2:blockCrop,,Ic2Nei,TRUE,,,135,,2,,,,,,"Not actual recipes, just info"
tonius.neiintegration.mods.mcforge.RecipeHandlerFluidRegistry,Minecraft,minecraft:water,,minecraft,FALSE,,,,,,,,,,,
tonius.neiintegration.mods.mcforge.RecipeHandlerOreDictionary,Minecraft,minecraft:iron_ore,,minecraft,FALSE,,,,,,,,,,,
gt.recipe.alloyblastsmelter,GT++,gregtech:gt.blockmachines:810,,miscutils,TRUE,,,,,,,,,,,ABS
gt.recipe.rocketenginefuel,GT++,gregtech:gt.blockmachines:793,,miscutils,TRUE,,,,,,,,,,,Basic (EV) rocket fuel gen
gt.recipe.cyclotron,GT++,gregtech:gt.blockmachines:828,,miscutils,TRUE,,,,,,,,,,,Cyclotron
gt.recipe.chemicaldehydrator,GT++,gregtech:gt.blockmachines:911,,miscutils,TRUE,,,,,,,,,,,Dehydrator
gt.recipe.slowfusionreactor,GT++,gregtech:gt.blockmachines:31015,,miscutils,TRUE,,,,,,,,,,,gt.blockmachines.gtplusplus.fusion.single
gt.recipe.RTGgenerators,GT++,gregtech:gt.blockmachines:869,,miscutils,TRUE,,,,,,,,,,,GT++ version of the RTG
gt.recipe.cokeoven,GT++,gregtech:gt.blockmachines:791,,miscutils,TRUE,,,,,,,,,,,ICO
gt.recipe.semifluidgeneratorfuels,GT++,gregtech:gt.blockmachines:837,,miscutils,TRUE,,,,,,,,,,,Semifluid gen
gt.recipe.fishpond,GT++,gregtech:gt.blockmachines:829,,miscutils,TRUE,,,,,,,,,,,Zhuhai
gt.recipe.advanced.mixer,GT++,gregtech:gt.blockmachines:811,,miscutils,TRUE,,,,,,,,,,,
gt.recipe.cryogenicfreezer,GT++,gregtech:gt.blockmachines:910,,miscutils,TRUE,,,,,,,,,,,
gt.recipe.fissionfuel,GT++,gregtech:gt.blockmachines:835,,miscutils,TRUE,,,,,,,,,,,
gt.recipe.geothermalfuel,GT++,gregtech:gt.blockmachines:830,,miscutils,TRUE,,,,,,,,,,,
gt.recipe.lftr,GT++,gregtech:gt.blockmachines:751,,miscutils,TRUE,,,,,,,,,,,
gt.recipe.lftr.2,GT++,gregtech:gt.blockmachines:751,,miscutils,TRUE,,,,,,,,,,,
gt.recipe.matterfab2,GT++,gregtech:gt.blockmachines:799,,miscutils,TRUE,,,,,,,,,,,
gt.recipe.multicentrifuge,GT++,gregtech:gt.blockmachines:790,,miscutils,TRUE,,,,,,,,,,,
gt.recipe.multielectro,GT++,gregtech:gt.blockmachines:796,,miscutils,TRUE,,,,,,,,,,,
gt.recipe.simplewasher,GT++,gregtech:gt.blockmachines:767,,miscutils,TRUE,,,,,,,,,,,
gt.recipe.vacfurnace,GT++,gregtech:gt.blockmachines:995,,miscutils,TRUE,,,,,,,,,,,
gtPlusPlus.nei.DecayableRecipeHandler,GT++,miscutils:dustRadium226,,miscutils,TRUE,,,75,,4,,,,,,
gtPlusPlus.nei.GT_NEI_FlotationCell,GT++,gregtech:gt.blockmachines:31028,,miscutils,TRUE,,,120,,2,,,,,,
gtPlusPlus.nei.GT_NEI_FluidReactor,GT++,gregtech:gt.blockmachines:998,,miscutils,TRUE,,,,,,,,,,,
gtPlusPlus.nei.GT_NEI_MillingMachine,GT++,gregtech:gt.blockmachines:31027,,miscutils,TRUE,,,120,,2,,,,,,
li.cil.oc.integration.nei.CallbackDocHandler,OpenComputers,OpenComputers:item:98,,OpenComputers,TRUE,,,,,,,,,,,
li.cil.oc.integration.nei.ManualUsageHandler,OpenComputers,OpenComputers:item:98,,OpenComputers,TRUE,,,,,,,,,,,
tonius.neiintegration.mods.harvestcraft.RecipeHandlerApiary,Pam's Harvestcraft,harvestcraft:apiary,,harvestcraft,TRUE,,,70,,5,,,,,,There's only 1 though
tonius.neiintegration.mods.harvestcraft.RecipeHandlerChurn,Pam's Harvestcraft,harvestcraft:churn,,harvestcraft,TRUE,,,65,,5,,,,,,Same as above
tonius.neiintegration.mods.harvestcraft.RecipeHandlerOven,Pam's Harvestcraft,harvestcraft:oven,,harvestcraft,TRUE,,,65,,5,,,,,,
tonius.neiintegration.mods.harvestcraft.RecipeHandlerPresser,Pam's Harvestcraft,harvestcraft:presser,,harvestcraft,TRUE,,,65,,5,,,,,,
tonius.neiintegration.mods.harvestcraft.RecipeHandlerQuern,Pam's Harvestcraft,harvestcraft:quern,,harvestcraft,TRUE,,,65,,5,,,,,,
gcewing.projectblue.nei.NEIRecipeHandler,ProjectBlue,ProjectBlue:sprayCan,,ProjectBlue,TRUE,,,65,,5,,,,,,
mrtjp.projectred.core.libmc.recipe.PRShapedRecipeHandler,ProjectRed,ProjRed|Transmission:projectred.transmission.wire:7,,ProjRed|Transmission,TRUE,,,,,,,,,,,
mrtjp.projectred.core.libmc.recipe.PRShapelessRecipeHandler,ProjectRed,ProjRed|Transmission:projectred.transmission.wire:7,,ProjRed|Transmission,TRUE,,,,,,,,,,,
tonius.neiintegration.mods.railcraft.RecipeHandlerBlastFurnace,Railcraft,Railcraft:machine.alpha:12,,Railcraft,TRUE,,,,,,,,,,,
tonius.neiintegration.mods.railcraft.RecipeHandlerCokeOven,Railcraft,Railcraft:machine.alpha:7,,Railcraft,TRUE,,,65,,5,,,,,,
tonius.neiintegration.mods.railcraft.RecipeHandlerRockCrusher,Railcraft,Railcraft:machine.alpha:15,,Railcraft,TRUE,,,,,,,,,,,
tonius.neiintegration.mods.railcraft.RecipeHandlerRollingMachineShaped,Railcraft,Railcraft:machine.alpha:8,,Railcraft,TRUE,,,65,,5,,,,,,
tonius.neiintegration.mods.railcraft.RecipeHandlerRollingMachineShapeless,Railcraft,Railcraft:machine.alpha:8,,Railcraft,TRUE,,,,,,,,,,,
lumien.randomthings.Handler.ModCompability.NEI.ImbuingStationRecipeHandler,RandomThings,RandomThings:imbuingStation,,RandomThings,TRUE,,,120,,2,,,,,,
com.github.technus.tectech.nei.TT_NEI_ResearchHandler,TecTech,gregtech:gt.blockmachines:15331,,tectech,TRUE,,6,140,,2,,,,,,
com.github.technus.tectech.nei.TT_NEI_ScannerHandler,TecTech,tectech:item.em.definitionScanStorage,,tectech,TRUE,,,,,,,,,,,
com.djgiannuzz.thaumcraftneiplugin.nei.recipehandler.ArcaneShapedRecipeHandler,Thaumcraft,Thaumcraft:blockTable:15,,Thaumcraft,TRUE,,,140,,2,,,,,,
com.djgiannuzz.thaumcraftneiplugin.nei.recipehandler.ArcaneShapelessRecipeHandler,Thaumcraft,Thaumcraft:blockTable:15,,Thaumcraft,TRUE,,,140,,2,,,,,,
com.djgiannuzz.thaumcraftneiplugin.nei.recipehandler.CrucibleRecipeHandler,Thaumcraft,Thaumcraft:blockMetalDevice,,Thaumcraft,TRUE,,,140,,2,,,,,,Using R on an item you get from the crucible basically never works
com.djgiannuzz.thaumcraftneiplugin.nei.recipehandler.InfusionRecipeHandler,Thaumcraft,Thaumcraft:blockStoneDevice:2,,Thaumcraft,TRUE,,,140,,2,,,,,,
ru.timeconqueror.tcneiadditions.nei.arcaneworkbench.ArcaneCraftingShapedHandler,Thaumcraft,Thaumcraft:blockTable:15,,Thaumcraft,TRUE,,,140,,2,,,,,,
ru.timeconqueror.tcneiadditions.nei.AspectCombinationHandler,Thaumcraft,Thaumcraft:ItemResearchNotes,,Thaumcraft,TRUE,,,130,,2,,,,,,In sets of 5. Each one is ~30 height
ru.timeconqueror.tcneiadditions.nei.AspectFromItemStackHandler,Thaumcraft,Thaumcraft:ItemResearchNotes,,Thaumcraft,TRUE,,,140,,2,,,,,,
tconstruct.plugins.nei.RecipeHandlerAlloying,Tinker's Construct,TConstruct:Smeltery,,TConstruct,TRUE,,,65,,5,,,,,,
tconstruct.plugins.nei.RecipeHandlerCastingBasin,Tinker's Construct,TConstruct:SearedBlock:2,,TConstruct,TRUE,,,65,,5,,,,,,
tconstruct.plugins.nei.RecipeHandlerCastingTable,Tinker's Construct,TConstruct:SearedBlock,,TConstruct,TRUE,,,65,,5,,,,,,
tconstruct.plugins.nei.RecipeHandlerDryingRack,Tinker's Construct,TConstruct:Armor.DryingRack,,TConstruct,TRUE,,,55,,5,,,,,,
tconstruct.plugins.nei.RecipeHandlerMelting,Tinker's Construct,TConstruct:LavaTank:2,,TConstruct,TRUE,,,65,,5,,,,,,
tconstruct.plugins.nei.RecipeHandlerToolMaterials,Tinker's Construct,TConstruct:ToolStationBlock,,TConstruct,TRUE,,,110,,3,,,,,,"Longer if more modifiers, I went through the whole list"
net.p455w0rd.wirelesscraftingterminal.integration.modules.NEIHelpers.NEIAEShapedRecipeHandler,WirelessCraftingTerminal,ae2wct:wirelessCraftingTerminal,,ae2wct,TRUE,,,,,,,,,,,
alkalus.main.nei.NEI_Handler_Cauldron,witchery,witchery:cauldron,,WitcheryExtras,TRUE,,,65,,5,,,,,,
alkalus.main.nei.NEI_Handler_Distillery,witchery,witchery:distilleryidle,,WitcheryExtras,TRUE,,,140,,2,,,,,,
alkalus.main.nei.NEI_Handler_Kettle,witchery,witchery:kettle,,WitcheryExtras,TRUE,,,65,,5,,,,,,
alkalus.main.nei.NEI_Handler_Oven,witchery,witchery:witchesovenidle,,WitcheryExtras,TRUE,,,,,,,,,,,Not working at all now
alkalus.main.nei.NEI_Handler_SpinningWheel,witchery,witchery:spinningwheel,,WitcheryExtras,TRUE,,,65,,5,,,,,,
com.emoniph.witchery.integration.NEICauldronRecipeHandler,witchery,witchery:cauldron,,witchery,TRUE,,,65,,5,,,,,,Replaced by WE presumably
com.emoniph.witchery.integration.NEIDistilleryRecipeHandler,witchery,witchery:distilleryidle,,witchery,TRUE,,,140,,2,,,,,,Replaced by WE presumably
com.emoniph.witchery.integration.NEIKettleRecipeHandler,witchery,witchery:kettle,,witchery,TRUE,,,65,,5,,,,,,Replaced by WE presumably
com.emoniph.witchery.integration.NEISpinningWheelRecipeHandler,witchery,witchery:spinningwheel,,witchery,TRUE,,,,,,,,,,,Replaced by WE presumably
com.emoniph.witchery.integration.NEIWitchesOvenRecipeHandler,witchery,witchery:witchesovenidle,,witchery,TRUE,,,65,,5,,,,,,Replaced by WE presumably
witchinggadgets.client.nei.NEIInfernalBlastfurnaceHandler,WitchingGadgets,WitchingGadgets:WG_StoneDevice:2,,WitchingGadgets,TRUE,,,65,,5,,,,,,
witchinggadgets.client.nei.NEISpinningWheelHandler,WitchingGadgets,WitchingGadgets:WG_WoodenDevice,,WitchingGadgets,TRUE,,,110,,3,,,,,,
gt.recipe.anvil,Gregtech 6,gregtech:gt.multitileentity:32031,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.anvil.bend.big,Gregtech 6,gregtech:gt.multitileentity:32031,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.anvil.bend.small,Gregtech 6,gregtech:gt.multitileentity:32031,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.aquaticfarm,Gregtech 6,gregtech:gt.multitileentity:17131,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.assembler,Gregtech 6,gregtech:gt.multitileentity:20621,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.autoclave,Gregtech 6,gregtech:gt.multitileentity:22004,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.bath,Gregtech 6,gregtech:gt.multitileentity:22002,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.bedrockorelist,Gregtech 6,gregtech:gt.multitileentity:17999,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.biolab,Gregtech 6,gregtech:gt.multitileentity:17127,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.boxinator,Gregtech 6,gregtech:gt.multitileentity:20581,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.bumblelyzer,Gregtech 6,gregtech:gt.multitileentity:20541,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.bumblequeen,Gregtech 6,gregtech:gt.multiitem.bumblebee:1,"{""gt.bumble"": {}}",gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.burnmixer,Gregtech 6,gregtech:gt.multitileentity:20521,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.byproductlist,Gregtech 6,minecraft:diamond_ore,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.canner,Gregtech 6,gregtech:gt.multitileentity:20161,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.catalyticcracking,Gregtech 6,gregtech:gt.multitileentity:20481,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.centrifuge,Gregtech 6,gregtech:gt.multitileentity:20081,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.clustermill,Gregtech 6,gregtech:gt.multitileentity:20141,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.coagulator,Gregtech 6,gregtech:gt.multitileentity:22000,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.cokeoven,Gregtech 6,gregtech:gt.multitileentity:17000,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.compressor,Gregtech 6,gregtech:gt.multitileentity:20101,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.crackingtower,Gregtech 6,gregtech:gt.multitileentity:17115,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.cruciblealloying,Gregtech 6,gregtech:gt.multitileentity:1005,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.cruciblesmelting,Gregtech 6,gregtech:gt.multitileentity:1005,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.crusher,Gregtech 6,gregtech:gt.multitileentity:20021,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.cryodistillationtower,Gregtech 6,gregtech:gt.multitileentity:17111,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.cryomixer,Gregtech 6,gregtech:gt.multitileentity:20571,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.crystallisationcrucible,Gregtech 6,gregtech:gt.multitileentity:20251,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.cutter,Gregtech 6,gregtech:gt.multitileentity:20061,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.debarker,Gregtech 6,gregtech:gt.multitileentity:20551,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.distillationtower,Gregtech 6,gregtech:gt.multitileentity:20191,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.distillery,Gregtech 6,gregtech:gt.multitileentity:20191,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.drying,Gregtech 6,gregtech:gt.multitileentity:20311,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.electrolyzer,Gregtech 6,gregtech:gt.multitileentity:20091,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.extruder,Gregtech 6,gregtech:gt.multitileentity:20202,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.fermenter,Gregtech 6,gregtech:gt.multitileentity:22003,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.fluidsolidifier,Gregtech 6,gregtech:gt.multitileentity:20611,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.freezer,Gregtech 6,gregtech:gt.multitileentity:20561,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.fuels.burn,Gregtech 6,gregtech:gt.multitileentity:1109,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.fuels.engine,Gregtech 6,gregtech:gt.multitileentity:9147,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.fuels.fluidbed,Gregtech 6,gregtech:gt.multitileentity:9009,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.fuels.gas,Gregtech 6,gregtech:gt.multitileentity:1609,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.fuels.plasma,Gregtech 6,gregtech:gt.multitileentity:17251,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.fuels.turbine,Gregtech 6,gregtech:gt.multitileentity:17231,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.fusionreactor,Gregtech 6,gregtech:gt.multitileentity:17198,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.generifier,Gregtech 6,gregtech:gt.multitileentity:22001,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.heatmixer,Gregtech 6,gregtech:gt.multitileentity:20506,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.implosioncompressor,Gregtech 6,gregtech:gt.multitileentity:17110,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.incubator,Gregtech 6,gregtech:gt.multitileentity:22005,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.injector,Gregtech 6,gregtech:gt.multitileentity:20261,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.ionizer,Gregtech 6,gregtech:gt.multitileentity:17315,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.juicer,Gregtech 6,gregtech:gt.multitileentity:32722,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.laminator,Gregtech 6,gregtech:gt.multitileentity:20391,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.lasercutter,Gregtech 6,gregtech:gt.multitileentity:20631,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.laserengraver,Gregtech 6,gregtech:gt.multitileentity:20321,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.lathe,Gregtech 6,gregtech:gt.multitileentity:20041,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.lightning,Gregtech 6,gregtech:gt.multitileentity:20501,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.loom,Gregtech 6,gregtech:gt.multitileentity:20211,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.magneticseparator,Gregtech 6,gregtech:gt.multitileentity:20301,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.maskaligner,Gregtech 6,gregtech:gt.multitileentity:17122,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.massfab,Gregtech 6,gregtech:gt.multitileentity:20411,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.mixer,Gregtech 6,gregtech:gt.multitileentity:20181,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.mortar,Gregtech 6,gregtech:gt.multitileentity:32735,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.nanofab,Gregtech 6,gregtech:gt.multitileentity:20441,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.oilcleaner,Gregtech 6,gregtech:gt.multitileentity:17116,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.particlecollider,Gregtech 6,gregtech:gt.multitileentity:17200,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.plantalyzer,Gregtech 6,gregtech:gt.multitileentity:20531,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.polarizer,Gregtech 6,gregtech:gt.multitileentity:20221,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.press,Gregtech 6,gregtech:gt.multitileentity:20231,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.printer,Gregtech 6,gregtech:gt.multitileentity:20271,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.replicator,Gregtech 6,gregtech:gt.multitileentity:20431,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.roaster,Gregtech 6,gregtech:gt.multitileentity:20171,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.rollbender,Gregtech 6,gregtech:gt.multitileentity:20121,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.rollformer,Gregtech 6,gregtech:gt.multitileentity:20131,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.rollingmill,Gregtech 6,gregtech:gt.multitileentity:20111,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.scannermolecular,Gregtech 6,gregtech:gt.multitileentity:20423,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.scannervisuals,Gregtech 6,gregtech:gt.multitileentity:20281,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.sharpener,Gregtech 6,gregtech:gt.multitileentity:20511,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.shredder,Gregtech 6,gregtech:gt.multitileentity:20011,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.sifter,Gregtech 6,gregtech:gt.multitileentity:20051,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.slicer,Gregtech 6,gregtech:gt.multitileentity:20381,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.sluice,Gregtech 6,gregtech:gt.multitileentity:20291,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.smelter,Gregtech 6,gregtech:gt.multitileentity:20241,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.squeezer,Gregtech 6,gregtech:gt.multitileentity:20071,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.steamcracking,Gregtech 6,gregtech:gt.multitileentity:20491,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.toolhead,Gregtech 6,gregtech:gt.meta.toolHeadPickaxe:260,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.unboxinator,Gregtech 6,gregtech:gt.multitileentity:20591,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.welder,Gregtech 6,gregtech:gt.multitileentity:20331,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.well,Gregtech 6,gregtech:gt.multitileentity:17124,,gregapi_post,TRUE,,15,145,166,2,,,,,,
gt.recipe.wiremill,Gregtech 6,gregtech:gt.multitileentity:20151,,gregapi_post,TRUE,,15,145,166,2,,,,,,
1 handler modName itemName nbtInfo modId modRequired excludedModId yShift handlerHeight handlerWidth maxRecipesPerPage imageResource imageX imageY imageWidth imageHeight itemNotes
2 codechicken.nei.recipe.BrewingRecipeHandler minecraft minecraft:brewing_stand minecraft FALSE 65 166 5
3 codechicken.nei.recipe.FireworkRecipeHandler minecraft minecraft:fireworks minecraft FALSE 65 166 5
4 codechicken.nei.recipe.FurnaceRecipeHandler minecraft minecraft:furnace minecraft FALSE 65 166 5
5 codechicken.nei.recipe.ShapedRecipeHandler minecraft minecraft:crafting_table minecraft FALSE 65 166 5
6 codechicken.nei.recipe.ShapelessRecipeHandler minecraft minecraft:crafting_table minecraft FALSE 65 166 5
7 codechicken.nei.recipe.FuelRecipeHandler minecraft minecraft FALSE 65 166 5 nei:textures/nei_tabbed_sprites.png 80 0 14 14
8 advsolar.client.nei.MTRecipeHandler AdvancedSolarPanel AdvancedSolarPanel:BlockMolecularTransformer AdvancedSolarPanel TRUE 68 5
9 appeng.integration.modules.NEIHelpers.NEIAEShapedRecipeHandler AppliedEnergistics2 appliedenergistics2:item.ItemMultiPart:380 appliedenergistics2 TRUE
10 appeng.integration.modules.NEIHelpers.NEIAEShapelessRecipeHandler AppliedEnergistics2 appliedenergistics2:item.ItemMultiPart:380 appliedenergistics2 TRUE
11 appeng.integration.modules.NEIHelpers.NEIFacadeRecipeHandler AppliedEnergistics2 appliedenergistics2:item.ItemFacade:192 appliedenergistics2 TRUE 65 5
12 appeng.integration.modules.NEIHelpers.NEIGrinderRecipeHandler AppliedEnergistics2 appliedenergistics2:item.ItemMultiMaterial:8 appliedenergistics2 TRUE
13 appeng.integration.modules.NEIHelpers.NEIInscriberRecipeHandler AppliedEnergistics2 appliedenergistics2:tile.BlockInscriber appliedenergistics2 TRUE 70 5
14 appeng.integration.modules.NEIHelpers.NEIWorldCraftingHandler AppliedEnergistics2 appliedenergistics2:item.ItemMultiMaterial:9 appliedenergistics2 TRUE 85 5 There's only some explanatory text for fluix crystals and QEDs
15 aroma1997.core.recipes.nei.ShapedAromicRecipeHandler AromaBackup minecraft:crafting_table AromaBackup TRUE
16 aroma1997.core.recipes.nei.ShapelessAromicRecipeHandler AromaBackup minecraft:crafting_table AromaBackup TRUE
17 fox.spiteful.avaritia.compat.nei.CompressionHandler Avaritia Avaritia:Neutronium_Compressor Avaritia TRUE 50 6
18 fox.spiteful.avaritia.compat.nei.ExtremeShapedRecipeHandler Avaritia Avaritia:Dire_Crafting Avaritia TRUE 208 256 1 Part of it even goes off the left side (included)
19 fox.spiteful.avaritia.compat.nei.ExtremeShapelessRecipeHandler Avaritia Avaritia:Dire_Crafting Avaritia TRUE 208 256 1 If you can cut off/place over the jaggedness at the bottom, you could barely get a second one
20 WayofTime.alchemicalWizardry.client.nei.NEIAlchemyRecipeHandler BloodMagic AWWayofTime:blockWritingTable AWWayofTime TRUE 68 5
21 WayofTime.alchemicalWizardry.client.nei.NEIAltarRecipeHandler BloodMagic AWWayofTime:Altar AWWayofTime TRUE 65 5 Handler name needs shifting left
22 WayofTime.alchemicalWizardry.client.nei.NEIBindingRitualHandler BloodMagic AWWayofTime:sacrificialKnife AWWayofTime TRUE 50 6
23 WayofTime.alchemicalWizardry.client.nei.NEIBloodOrbShapedHandler BloodMagic AWWayofTime:AlchemicalWizardrybloodRune:3 AWWayofTime TRUE 65 5
24 WayofTime.alchemicalWizardry.client.nei.NEIBloodOrbShapelessHandler BloodMagic AWWayofTime:AlchemicalWizardrybloodRune:4 AWWayofTime TRUE 65 5
25 bw.fuels.acidgens BartWorks gregtech:gt.blockmachines:12726 bartworks TRUE 145 2
26 bw.recipe.cal BartWorks gregtech:gt.blockmachines:12735 bartworks TRUE 135 2
27 com.github.bartimaeusnek.bartworks.neiHandler.BW_NEI_BioLabHandler BartWorks gregtech:gt.blockmachines:12699 bartworks TRUE 145 2
28 com.github.bartimaeusnek.bartworks.neiHandler.BW_NEI_BioVatHandler BartWorks gregtech:gt.blockmachines:12712 bartworks TRUE 140 2
29 com.github.bartimaeusnek.bartworks.neiHandler.BW_NEI_OreHandler BartWorks bartworks:bw.blockores.01:89 bartworks TRUE 135 2
30 gt.recipe.electricimplosioncompressor BartWorks gregtech:gt.blockmachines:12734 Electric implosion compressor bartworks TRUE 135 2
31 net.bdew.neiaddons.botany.flowers.FlowerBreedingHandler Botany Botany:flower Botany TRUE 65 5
32 buildcraft.compat.nei.RecipeHandlerRefinery BuildCraft BuildCraft|Factory:refineryBlock BuildCraft|Factory TRUE 60 5 There's only 2 recipes though
33 buildcraft.compat.nei.RecipeHandlerAssemblyTable BuildCraft BuildCraft|Silicon:laserTableBlock BuildCraft|Silicon TRUE 100 3
34 buildcraft.compat.nei.RecipeHandlerIntegrationTable BuildCraft BuildCraft|Silicon:laserTableBlock:2 BuildCraft|Silicon TRUE 85 4
35 team.chisel.compat.nei.RecipeHandlerChisel Chisel chisel:chisel chisel TRUE 135 2
36 crazypants.enderio.nei.AlloySmelterRecipeHandler EnderIO EnderIO:blockAlloySmelter EnderIO TRUE 65 5
37 crazypants.enderio.nei.EnchanterRecipeHandler EnderIO EnderIO:blockEnchanter EnderIO TRUE 65 5
38 crazypants.enderio.nei.SagMillRecipeHandler EnderIO EnderIO:blockSagMill EnderIO TRUE 68 5
39 crazypants.enderio.nei.SliceAndSpliceRecipeHandler EnderIO EnderIO:blockSliceAndSplice EnderIO TRUE 65 5
40 crazypants.enderio.nei.SoulBinderRecipeHandler EnderIO EnderIO:blockSoulBinder EnderIO TRUE 68 5
41 crazypants.enderio.nei.VatRecipeHandler EnderIO EnderIO:blockVat EnderIO TRUE 65 5
42 extracells.integration.nei.UniversalTerminalRecipe ExtraCells extracells:part.base:9 extracells TRUE 65 5
43 com.rwtema.extrautils.nei.EnderConstructorHandler ExtraUtilities ExtraUtilities:endConstructor ExtraUtilities TRUE 68 5
44 com.rwtema.extrautils.nei.FMPMicroBlocksHandler ExtraUtilities ForgeMicroblock:sawIron ExtraUtilities TRUE 65 5
45 com.rwtema.extrautils.nei.InfoHandler ExtraUtilities ExtraUtilities:chandelier ExtraUtilities TRUE 135 2 Info on blocks, can vary wildly. EQ was this length, there might be a longer one
46 com.rwtema.extrautils.nei.MicroBlocksHandler ExtraUtilities ExtraUtilities:microblocks:1 ExtraUtilities TRUE
47 com.rwtema.extrautils.nei.SoulHandler ExtraUtilities ExtraUtilities:mini-soul ExtraUtilities TRUE
48 hellfirepvp.beebetteratbees.client.gui.BBABGuiRecipeTreeHandler Bees Forestry:beeQueenGE Forestry TRUE 140 2
49 forestry.factory.recipes.nei.NEIHandlerBottler Forestry Forestry:factory Forestry TRUE 68 5
50 forestry.factory.recipes.nei.NEIHandlerCarpenter Forestry Forestry:factory:1 Forestry TRUE 65 5
51 forestry.factory.recipes.nei.NEIHandlerCentrifuge Forestry Forestry:factory:2 Forestry TRUE 65 5
52 forestry.factory.recipes.nei.NEIHandlerFabricator Forestry Forestry:factory2 Forestry TRUE
53 forestry.factory.recipes.nei.NEIHandlerFermenter Forestry Forestry:factory:3 Forestry TRUE 65 5
54 forestry.factory.recipes.nei.NEIHandlerMoistener Forestry Forestry:factory:4 Forestry TRUE 68 5
55 forestry.factory.recipes.nei.NEIHandlerSqueezer Forestry Forestry:factory:5 Forestry TRUE 68 5
56 forestry.factory.recipes.nei.NEIHandlerStill Forestry Forestry:factory:6 Forestry TRUE 65 5
57 net.bdew.neiaddons.forestry.bees.BeeBreedingHandler Forestry Forestry:beeQueenGE Forestry TRUE 65 5
58 net.bdew.neiaddons.forestry.bees.BeeProduceHandler Forestry Forestry:beeQueenGE Forestry TRUE 65 5
59 net.bdew.neiaddons.forestry.butterflies.ButterflyBreedingHandler Forestry Forestry:butterflyGE Forestry TRUE
60 net.bdew.neiaddons.forestry.trees.TreeBreedingHandler Forestry Forestry:saplingGE Forestry TRUE 65 5
61 net.bdew.neiaddons.forestry.trees.TreeProduceHandler Forestry Forestry:saplingGE Forestry TRUE 65 5
62 galaxyspace.core.nei.rocket.RocketT1RecipeHandler Galacticraft GalacticraftCore:item.spaceship GalacticraftCore TRUE 125 2
63 micdoodle8.mods.galacticraft.core.nei.BuggyRecipeHandler Galacticraft GalacticraftCore:tile.rocketWorkbench GalacticraftCore TRUE 10 135 2
64 micdoodle8.mods.galacticraft.core.nei.CircuitFabricatorRecipeHandler Galacticraft GalacticraftCore:tile.machine2:4 GalacticraftCore TRUE
65 micdoodle8.mods.galacticraft.core.nei.ElectricIngotCompressorRecipeHandler Galacticraft GalacticraftCore:tile.machine2 GalacticraftCore TRUE
66 micdoodle8.mods.galacticraft.core.nei.IngotCompressorRecipeHandler Galacticraft GalacticraftCore:tile.machine:12 GalacticraftCore TRUE
67 micdoodle8.mods.galacticraft.core.nei.RefineryRecipeHandler Galacticraft GalacticraftCore:tile.refinery GalacticraftCore TRUE
68 micdoodle8.mods.galacticraft.planets.asteroids.nei.AstroMinerRecipeHandler Galacticraft GalacticraftCore:tile.rocketWorkbench GalacticraftCore TRUE 100 3
69 micdoodle8.mods.galacticraft.planets.mars.nei.CargoRocketRecipeHandler Galacticraft GalacticraftCore:tile.rocketWorkbench GalacticraftCore TRUE 10 125 2
70 micdoodle8.mods.galacticraft.planets.mars.nei.GasLiquefierRecipeHandler Galacticraft GalacticraftMars:tile.marsMachineT2 GalacticraftCore TRUE
71 micdoodle8.mods.galacticraft.planets.mars.nei.MethaneSynthesizerRecipeHandler Galacticraft GalacticraftMars:tile.marsMachineT2:4 GalacticraftCore TRUE
72 galaxyspace.core.nei.rocket.RocketT2RecipeHandler Galacticraft GalacticraftMars:item.spaceshipTier2:1 GalacticraftMars TRUE 5 145 2
73 galaxyspace.core.nei.rocket.RocketT3RecipeHandler Galacticraft GalacticraftMars:item.itemTier3Rocket GalacticraftMars TRUE 5 145 2
74 galaxyspace.core.nei.AssemblyMachineRecipeHandler GalaxySpace GalaxySpace:assemblymachine GalaxySpace TRUE
75 galaxyspace.core.nei.rocket.RocketT4RecipeHandler GalaxySpace GalaxySpace:item.Tier4Rocket GalaxySpace TRUE 10 160 2
76 galaxyspace.core.nei.rocket.RocketT5RecipeHandler GalaxySpace GalaxySpace:item.Tier5Rocket GalaxySpace TRUE 10 160 2
77 galaxyspace.core.nei.rocket.RocketT6RecipeHandler GalaxySpace GalaxySpace:item.Tier6Rocket GalaxySpace TRUE 10 160 2
78 galaxyspace.core.nei.rocket.RocketT7RecipeHandler GalaxySpace GalaxySpace:item.Tier7Rocket GalaxySpace TRUE 10 180 1
79 galaxyspace.core.nei.rocket.RocketT8RecipeHandler GalaxySpace GalaxySpace:item.Tier8Rocket GalaxySpace TRUE 10 180 1
80 net.bdew.gendustry.nei.ExtractorHandler Gendustry gendustry:Extractor gendustry TRUE 68 5
81 net.bdew.gendustry.nei.ImprinterHandler Gendustry gendustry:Imprinter gendustry TRUE 68 5
82 net.bdew.gendustry.nei.LiquifierHandler Gendustry gendustry:Liquifier gendustry TRUE 68 5
83 net.bdew.gendustry.nei.MutagenProducerHandler Gendustry gendustry:MutagenProducer gendustry TRUE 68 5
84 net.bdew.gendustry.nei.MutatronHandler Gendustry gendustry:Mutatron gendustry TRUE 65 5
85 net.bdew.gendustry.nei.ReplicatorHandler Gendustry gendustry:Replicator gendustry TRUE 68 5
86 net.bdew.gendustry.nei.SamplerHandler Gendustry gendustry:Sampler gendustry TRUE 68 5
87 net.bdew.gendustry.nei.TemplateCraftingHandler Gendustry gendustry:GeneTemplate gendustry TRUE 105 3 I don't think there's any actual recipes here, just a generic one
88 net.bdew.gendustry.nei.TransposerHandler Gendustry gendustry:Transposer gendustry TRUE 68 5
89 gt.recipe.alloysmelter gregtech gregtech:gt.blockmachines:201 gregtech TRUE gregapi_post 6 135 166 2 Amplifabricator
90 gt.recipe.arcfurnace gregtech gregtech:gt.blockmachines:651 gregtech TRUE gregapi_post 6 135 166 2 Bronze boiler
91 gt.recipe.assembler gregtech gregtech:gt.blockmachines:211 gregtech TRUE gregapi_post 6 145 166 2 Byproducts from ore processing
92 gt.recipe.autoclave gregtech gregtech:gt.blockmachines:571 gregtech TRUE gregapi_post 6 135 166 2 Disabled 'Thermal Generator'? Or compat for the IC2 geothermal?
93 gt.recipe.blastfurnace gregtech gregtech:gt.blockmachines:1000 gregtech TRUE gregapi_post 6 135 166 2 Disabled CNC machine?
94 gt.recipe.brewer gregtech gregtech:gt.blockmachines:491 gregtech TRUE gregapi_post 6 135 166 2 ECE
95 gt.recipe.byproductlist gregtech gregtech:gt.metaitem.01:2019 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicgenerator.magicenergyconverter.tier.01
96 gt.recipe.canner gregtech gregtech:gt.blockmachines:231 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicgenerator.plasmagenerator.tier.05
97 gt.recipe.centrifuge gregtech gregtech:gt.blockmachines:361 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.arcfurnace.tier.01
98 gt.recipe.chemicalbath gregtech gregtech:gt.blockmachines:541 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.assembler.tier.01
99 gt.recipe.chemicalreactor gregtech gregtech:gt.blockmachines:421 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.autoclave.tier.01
100 gt.recipe.circuitassembler gregtech gregtech:gt.blockmachines:1180 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.bender.tier.01
101 gt.recipe.cncmachine gregtech gregtech:gt.metaitem.01:23305 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.boxinator.tier.01
102 gt.recipe.cokeoven gregtech gregtech:gt.blockmachines:791 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.brewery.tier.01
103 gt.recipe.componentassembler gregtech gregtech:gt.blockmachines:211 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.canner.tier.01
104 gt.recipe.compressor gregtech gregtech:gt.blockmachines:241 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.centrifuge.tier.01
105 gt.recipe.craker gregtech gregtech:gt.blockmachines:1160 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.chemicalbath.tier.01
106 gt.recipe.cuttingsaw gregtech gregtech:gt.blockmachines:251 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.chemicalreactor.tier.01
107 gt.recipe.dieselgeneratorfuel gregtech gregtech:gt.blockmachines:1110 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.circuitassembler.tier.01
108 gt.recipe.distillationtower gregtech gregtech:gt.blockmachines:1126 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.compressor.tier.01
109 gt.recipe.distillery gregtech gregtech:gt.blockmachines:531 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.cutter.tier.01
110 gt.recipe.electrolyzer gregtech gregtech:gt.blockmachines:371 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.distillery.tier.01
111 gt.recipe.electromagneticseparator gregtech gregtech:gt.blockmachines:561 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.electrolyzer.tier.01
112 gt.recipe.extractor gregtech gregtech:gt.blockmachines:271 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.electromagneticseparator.tier.01
113 gt.recipe.extrahugenaquadahreactor gregtech gregtech:gt.blockmachines:1189 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.extractor.tier.01
114 gt.recipe.extremedieselgeneratorfuel gregtech gregtech:gt.blockmachines:2105 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.extruder.tier.01
115 gt.recipe.extruder gregtech gregtech:gt.blockmachines:281 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.fermenter.tier.01
116 gt.recipe.fakeAssemblylineProcess gregtech gregtech:gt.blockmachines:1170 gregtech TRUE gregapi_post 12 135 166 2 gt.blockmachines.basicmachine.fluidcanner.tier.01
117 gt.recipe.fermenter gregtech gregtech:gt.blockmachines:501 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.fluidextractor.tier.01
118 gt.recipe.fluidcanner gregtech gregtech:gt.blockmachines:431 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.fluidheater.tier.01
119 gt.recipe.fluidextractor gregtech gregtech:gt.blockmachines:511 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.fluidsolidifier.tier.01
120 gt.recipe.fluidheater gregtech gregtech:gt.blockmachines:621 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.hammer.tier.01
121 gt.recipe.fluidnaquadahreactor gregtech gregtech:gt.blockmachines:1192 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.laserengraver.tier.01
122 gt.recipe.fluidsolidifier gregtech gregtech:gt.blockmachines:521 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.lathe.tier.01
123 gt.recipe.fusionreactor gregtech gregtech:gt.blockmachines:1193 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.macerator.tier.01
124 gt.recipe.gasturbinefuel gregtech gregtech:gt.blockmachines:1115 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.massfab.tier.01
125 gt.recipe.hammer gregtech gregtech:gt.blockmachines:611 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.microwave.tier.01
126 gt.recipe.hugenaquadahreactor gregtech gregtech:gt.blockmachines:1188 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.mixer.tier.01
127 gt.recipe.implosioncompressor gregtech gregtech:gt.blockmachines:12734 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.orewasher.tier.01
128 gt.recipe.largeboilerfakefuels gregtech gregtech:gt.blockmachines:1020 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.plasmaarcfurnace.tier.01
129 gt.recipe.largechemicalreactor gregtech gregtech:gt.blockmachines:1169 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.polarizer.tier.01
130 gt.recipe.largenaquadahreactor gregtech gregtech:gt.blockmachines:1191 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.press.tier.01
131 gt.recipe.laserengraver gregtech gregtech:gt.blockmachines:591 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.printer.tier.01
132 gt.recipe.lathe gregtech gregtech:gt.blockmachines:291 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.recycler.tier.01
133 gt.recipe.macerator gregtech gregtech:gt.blockmachines:301 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.replicator.tier.01
134 gt.recipe.magicfuels gregtech gregtech:gt.blockmachines:1123 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.rockbreaker.tier.01
135 gt.recipe.massfab gregtech gregtech:gt.blockmachines:461 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.scanner.tier.01
136 gt.recipe.metalbender gregtech gregtech:gt.blockmachines:221 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.sifter.tier.01
137 gt.recipe.microwave gregtech gregtech:gt.blockmachines:311 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.slicer.tier.01
138 gt.recipe.mixer gregtech gregtech:gt.blockmachines:581 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.thermalcentrifuge.tier.01
139 gt.recipe.orewasher gregtech gregtech:gt.blockmachines:391 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.unboxinator.tier.01
140 gt.recipe.packager gregtech gregtech:gt.blockmachines:401 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.basicmachine.wiremill.tier.01
141 gt.recipe.plasmaarcfurnace gregtech gregtech:gt.blockmachines:661 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.electricimplosioncompressor
142 gt.recipe.plasmageneratorfuels gregtech gregtech:gt.blockmachines:1196 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.fusioncomputer.tier.06
143 gt.recipe.polarizer gregtech gregtech:gt.blockmachines:551 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.industrialcokeoven.controller.tier.single
144 gt.recipe.press gregtech gregtech:gt.blockmachines:601 gregtech TRUE gregapi_post 6 135 166 2 Needs more Yshift? Or doesn't apply properly? Added more
145 gt.recipe.primitiveblastfurnace gregtech gregtech:gt.blockmachines:140 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.multimachine.blastfurnace
146 gt.recipe.printer gregtech gregtech:gt.blockmachines:321 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.multimachine.boiler.bronze
147 gt.recipe.pyro gregtech gregtech:gt.blockmachines:1159 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.multimachine.brickedblastfurnace
148 gt.recipe.replicator gregtech gregtech:gt.blockmachines:481 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.multimachine.chemicalreactor
149 gt.recipe.rockbreaker gregtech gregtech:gt.blockmachines:441 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.multimachine.cracker
150 gt.recipe.scanner gregtech gregtech:gt.blockmachines:341 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.multimachine.distillationtower
151 gt.recipe.semifluidboilerfuels gregtech gregtech:gt.blockmachines:1020 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.multimachine.pyro
152 gt.recipe.sifter gregtech gregtech:gt.blockmachines:641 gregtech TRUE gregapi_post 6 135 166 2 gt.blockmachines.multimachine.vacuumfreezer
153 gt.recipe.slicer gregtech gregtech:gt.blockmachines:631 gregtech TRUE gregapi_post 6 135 166 2 GT++'s incomplete compound fabricator?
154 gt.recipe.smallnaquadahreactor gregtech gregtech:gt.blockmachines:1190 gregtech TRUE gregapi_post 6 135 166 2 LV Combustion gen
155 gt.recipe.thermalcentrifuge gregtech gregtech:gt.blockmachines:381 gregtech TRUE gregapi_post 6 135 166 2 LV gas turbine
156 gt.recipe.thermalgeneratorfuel gregtech IC2:blockGenerator:1 gregtech TRUE gregapi_post 6 135 166 2 Naq Reactor Mark I
157 gt.recipe.unpackager gregtech gregtech:gt.blockmachines:411 gregtech TRUE gregapi_post 6 135 166 2 Naq Reactor Mark II
158 gt.recipe.uuamplifier gregtech gregtech:gt.blockmachines:471 gregtech TRUE gregapi_post 6 135 166 2 Naq Reactor Mark III. Misnamed in code
159 gt.recipe.vacuumfreezer gregtech gregtech:gt.blockmachines:1002 gregtech TRUE gregapi_post 6 135 166 2 Naq Reactor Mark IV. Slightly different name for recipe map
160 gt.recipe.wiremill gregtech gregtech:gt.blockmachines:351 gregtech TRUE gregapi_post 6 135 166 2 Naq Reactor Mark V. Slightly different name for recipe map
161 ic.recipe.recycler gregtech gregtech:gt.blockmachines:331 gregtech TRUE gregapi_post 6 135 166 2
162 pers.gwyog.gtneioreplugin.plugin.gregtech5.PluginGT5SmallOreStat Gregtech gregtech:gt.blockores:85 gregtech TRUE 145 2
163 pers.gwyog.gtneioreplugin.plugin.gregtech5.PluginGT5VeinStat Gregtech gregtech:gt.blockores:386 gregtech TRUE 135 2
164 ic2.neiIntegration.core.recipehandler.AdvRecipeHandler IC2 IC2:blockreactorvessel IC2 TRUE 65 5
165 ic2.neiIntegration.core.recipehandler.AdvShapelessRecipeHandler IC2 IC2:blockreactorvessel IC2 TRUE 65 5
166 ic2.neiIntegration.core.recipehandler.BlastFurnaceRecipeHandler IC2 IC2:blockMachine3:1 IC2 TRUE 65 5
167 ic2.neiIntegration.core.recipehandler.BlockCutterRecipeHandler IC2 IC2:blockMachine3:2 IC2 TRUE 65 5
168 ic2.neiIntegration.core.recipehandler.CentrifugeRecipeHandler IC2 IC2:blockMachine2:3 IC2 TRUE 65 5
169 ic2.neiIntegration.core.recipehandler.CompressorRecipeHandler IC2 IC2:blockMachine:5 IC2 TRUE 65 5
170 ic2.neiIntegration.core.recipehandler.ExtractorRecipeHandler IC2 IC2:blockMachine:4 IC2 TRUE 65 5
171 ic2.neiIntegration.core.recipehandler.FluidCannerRecipeHandler IC2 IC2:blockMachine:6 IC2 TRUE 65 5
172 ic2.neiIntegration.core.recipehandler.LatheRecipeHandler IC2 IC2:blockMachine3:8 IC2 TRUE 65 5
173 ic2.neiIntegration.core.recipehandler.MaceratorRecipeHandler IC2 IC2:blockMachine:3 IC2 TRUE 65 5
174 ic2.neiIntegration.core.recipehandler.MetalFormerRecipeHandlerCutting IC2 IC2:blockMachine2:4 IC2 TRUE 55 6
175 ic2.neiIntegration.core.recipehandler.MetalFormerRecipeHandlerExtruding IC2 IC2:blockMachine2:4 IC2 TRUE 55 6
176 ic2.neiIntegration.core.recipehandler.MetalFormerRecipeHandlerRolling IC2 IC2:blockMachine2:4 IC2 TRUE 55 6
177 ic2.neiIntegration.core.recipehandler.OreWashingRecipeHandler IC2 IC2:blockMachine2:5 IC2 TRUE
178 ic2.neiIntegration.core.recipehandler.ScrapboxRecipeHandler IC2 IC2:itemScrapbox IC2 TRUE 50 6
179 ic2.neiIntegration.core.recipehandler.SolidCannerRecipeHandler IC2 IC2:blockMachine2:9 IC2 TRUE
180 speiger.src.crops.prediction.NEIPlugin IC2CropsNEI IC2:blockCrop Ic2Nei TRUE 135 2 Not actual recipes, just info
181 tonius.neiintegration.mods.mcforge.RecipeHandlerFluidRegistry Minecraft minecraft:water minecraft FALSE
182 tonius.neiintegration.mods.mcforge.RecipeHandlerOreDictionary Minecraft minecraft:iron_ore minecraft FALSE
183 gt.recipe.alloyblastsmelter GT++ gregtech:gt.blockmachines:810 miscutils TRUE ABS
184 gt.recipe.rocketenginefuel GT++ gregtech:gt.blockmachines:793 miscutils TRUE Basic (EV) rocket fuel gen
185 gt.recipe.cyclotron GT++ gregtech:gt.blockmachines:828 miscutils TRUE Cyclotron
186 gt.recipe.chemicaldehydrator GT++ gregtech:gt.blockmachines:911 miscutils TRUE Dehydrator
187 gt.recipe.slowfusionreactor GT++ gregtech:gt.blockmachines:31015 miscutils TRUE gt.blockmachines.gtplusplus.fusion.single
188 gt.recipe.RTGgenerators GT++ gregtech:gt.blockmachines:869 miscutils TRUE GT++ version of the RTG
189 gt.recipe.cokeoven GT++ gregtech:gt.blockmachines:791 miscutils TRUE ICO
190 gt.recipe.semifluidgeneratorfuels GT++ gregtech:gt.blockmachines:837 miscutils TRUE Semifluid gen
191 gt.recipe.fishpond GT++ gregtech:gt.blockmachines:829 miscutils TRUE Zhuhai
192 gt.recipe.advanced.mixer GT++ gregtech:gt.blockmachines:811 miscutils TRUE
193 gt.recipe.cryogenicfreezer GT++ gregtech:gt.blockmachines:910 miscutils TRUE
194 gt.recipe.fissionfuel GT++ gregtech:gt.blockmachines:835 miscutils TRUE
195 gt.recipe.geothermalfuel GT++ gregtech:gt.blockmachines:830 miscutils TRUE
196 gt.recipe.lftr GT++ gregtech:gt.blockmachines:751 miscutils TRUE
197 gt.recipe.lftr.2 GT++ gregtech:gt.blockmachines:751 miscutils TRUE
198 gt.recipe.matterfab2 GT++ gregtech:gt.blockmachines:799 miscutils TRUE
199 gt.recipe.multicentrifuge GT++ gregtech:gt.blockmachines:790 miscutils TRUE
200 gt.recipe.multielectro GT++ gregtech:gt.blockmachines:796 miscutils TRUE
201 gt.recipe.simplewasher GT++ gregtech:gt.blockmachines:767 miscutils TRUE
202 gt.recipe.vacfurnace GT++ gregtech:gt.blockmachines:995 miscutils TRUE
203 gtPlusPlus.nei.DecayableRecipeHandler GT++ miscutils:dustRadium226 miscutils TRUE 75 4
204 gtPlusPlus.nei.GT_NEI_FlotationCell GT++ gregtech:gt.blockmachines:31028 miscutils TRUE 120 2
205 gtPlusPlus.nei.GT_NEI_FluidReactor GT++ gregtech:gt.blockmachines:998 miscutils TRUE
206 gtPlusPlus.nei.GT_NEI_MillingMachine GT++ gregtech:gt.blockmachines:31027 miscutils TRUE 120 2
207 li.cil.oc.integration.nei.CallbackDocHandler OpenComputers OpenComputers:item:98 OpenComputers TRUE
208 li.cil.oc.integration.nei.ManualUsageHandler OpenComputers OpenComputers:item:98 OpenComputers TRUE
209 tonius.neiintegration.mods.harvestcraft.RecipeHandlerApiary Pam's Harvestcraft harvestcraft:apiary harvestcraft TRUE 70 5 There's only 1 though
210 tonius.neiintegration.mods.harvestcraft.RecipeHandlerChurn Pam's Harvestcraft harvestcraft:churn harvestcraft TRUE 65 5 Same as above
211 tonius.neiintegration.mods.harvestcraft.RecipeHandlerOven Pam's Harvestcraft harvestcraft:oven harvestcraft TRUE 65 5
212 tonius.neiintegration.mods.harvestcraft.RecipeHandlerPresser Pam's Harvestcraft harvestcraft:presser harvestcraft TRUE 65 5
213 tonius.neiintegration.mods.harvestcraft.RecipeHandlerQuern Pam's Harvestcraft harvestcraft:quern harvestcraft TRUE 65 5
214 gcewing.projectblue.nei.NEIRecipeHandler ProjectBlue ProjectBlue:sprayCan ProjectBlue TRUE 65 5
215 mrtjp.projectred.core.libmc.recipe.PRShapedRecipeHandler ProjectRed ProjRed|Transmission:projectred.transmission.wire:7 ProjRed|Transmission TRUE
216 mrtjp.projectred.core.libmc.recipe.PRShapelessRecipeHandler ProjectRed ProjRed|Transmission:projectred.transmission.wire:7 ProjRed|Transmission TRUE
217 tonius.neiintegration.mods.railcraft.RecipeHandlerBlastFurnace Railcraft Railcraft:machine.alpha:12 Railcraft TRUE
218 tonius.neiintegration.mods.railcraft.RecipeHandlerCokeOven Railcraft Railcraft:machine.alpha:7 Railcraft TRUE 65 5
219 tonius.neiintegration.mods.railcraft.RecipeHandlerRockCrusher Railcraft Railcraft:machine.alpha:15 Railcraft TRUE
220 tonius.neiintegration.mods.railcraft.RecipeHandlerRollingMachineShaped Railcraft Railcraft:machine.alpha:8 Railcraft TRUE 65 5
221 tonius.neiintegration.mods.railcraft.RecipeHandlerRollingMachineShapeless Railcraft Railcraft:machine.alpha:8 Railcraft TRUE
222 lumien.randomthings.Handler.ModCompability.NEI.ImbuingStationRecipeHandler RandomThings RandomThings:imbuingStation RandomThings TRUE 120 2
223 com.github.technus.tectech.nei.TT_NEI_ResearchHandler TecTech gregtech:gt.blockmachines:15331 tectech TRUE 6 140 2
224 com.github.technus.tectech.nei.TT_NEI_ScannerHandler TecTech tectech:item.em.definitionScanStorage tectech TRUE
225 com.djgiannuzz.thaumcraftneiplugin.nei.recipehandler.ArcaneShapedRecipeHandler Thaumcraft Thaumcraft:blockTable:15 Thaumcraft TRUE 140 2
226 com.djgiannuzz.thaumcraftneiplugin.nei.recipehandler.ArcaneShapelessRecipeHandler Thaumcraft Thaumcraft:blockTable:15 Thaumcraft TRUE 140 2
227 com.djgiannuzz.thaumcraftneiplugin.nei.recipehandler.CrucibleRecipeHandler Thaumcraft Thaumcraft:blockMetalDevice Thaumcraft TRUE 140 2 Using R on an item you get from the crucible basically never works
228 com.djgiannuzz.thaumcraftneiplugin.nei.recipehandler.InfusionRecipeHandler Thaumcraft Thaumcraft:blockStoneDevice:2 Thaumcraft TRUE 140 2
229 ru.timeconqueror.tcneiadditions.nei.arcaneworkbench.ArcaneCraftingShapedHandler Thaumcraft Thaumcraft:blockTable:15 Thaumcraft TRUE 140 2
230 ru.timeconqueror.tcneiadditions.nei.AspectCombinationHandler Thaumcraft Thaumcraft:ItemResearchNotes Thaumcraft TRUE 130 2 In sets of 5. Each one is ~30 height
231 ru.timeconqueror.tcneiadditions.nei.AspectFromItemStackHandler Thaumcraft Thaumcraft:ItemResearchNotes Thaumcraft TRUE 140 2
232 tconstruct.plugins.nei.RecipeHandlerAlloying Tinker's Construct TConstruct:Smeltery TConstruct TRUE 65 5
233 tconstruct.plugins.nei.RecipeHandlerCastingBasin Tinker's Construct TConstruct:SearedBlock:2 TConstruct TRUE 65 5
234 tconstruct.plugins.nei.RecipeHandlerCastingTable Tinker's Construct TConstruct:SearedBlock TConstruct TRUE 65 5
235 tconstruct.plugins.nei.RecipeHandlerDryingRack Tinker's Construct TConstruct:Armor.DryingRack TConstruct TRUE 55 5
236 tconstruct.plugins.nei.RecipeHandlerMelting Tinker's Construct TConstruct:LavaTank:2 TConstruct TRUE 65 5
237 tconstruct.plugins.nei.RecipeHandlerToolMaterials Tinker's Construct TConstruct:ToolStationBlock TConstruct TRUE 110 3 Longer if more modifiers, I went through the whole list
238 net.p455w0rd.wirelesscraftingterminal.integration.modules.NEIHelpers.NEIAEShapedRecipeHandler WirelessCraftingTerminal ae2wct:wirelessCraftingTerminal ae2wct TRUE
239 alkalus.main.nei.NEI_Handler_Cauldron witchery witchery:cauldron WitcheryExtras TRUE 65 5
240 alkalus.main.nei.NEI_Handler_Distillery witchery witchery:distilleryidle WitcheryExtras TRUE 140 2
241 alkalus.main.nei.NEI_Handler_Kettle witchery witchery:kettle WitcheryExtras TRUE 65 5
242 alkalus.main.nei.NEI_Handler_Oven witchery witchery:witchesovenidle WitcheryExtras TRUE Not working at all now
243 alkalus.main.nei.NEI_Handler_SpinningWheel witchery witchery:spinningwheel WitcheryExtras TRUE 65 5
244 com.emoniph.witchery.integration.NEICauldronRecipeHandler witchery witchery:cauldron witchery TRUE 65 5 Replaced by WE presumably
245 com.emoniph.witchery.integration.NEIDistilleryRecipeHandler witchery witchery:distilleryidle witchery TRUE 140 2 Replaced by WE presumably
246 com.emoniph.witchery.integration.NEIKettleRecipeHandler witchery witchery:kettle witchery TRUE 65 5 Replaced by WE presumably
247 com.emoniph.witchery.integration.NEISpinningWheelRecipeHandler witchery witchery:spinningwheel witchery TRUE Replaced by WE presumably
248 com.emoniph.witchery.integration.NEIWitchesOvenRecipeHandler witchery witchery:witchesovenidle witchery TRUE 65 5 Replaced by WE presumably
249 witchinggadgets.client.nei.NEIInfernalBlastfurnaceHandler WitchingGadgets WitchingGadgets:WG_StoneDevice:2 WitchingGadgets TRUE 65 5
250 witchinggadgets.client.nei.NEISpinningWheelHandler WitchingGadgets WitchingGadgets:WG_WoodenDevice WitchingGadgets TRUE 110 3
251 gt.recipe.anvil Gregtech 6 gregtech:gt.multitileentity:32031 gregapi_post TRUE 15 145 166 2
252 gt.recipe.anvil.bend.big Gregtech 6 gregtech:gt.multitileentity:32031 gregapi_post TRUE 15 145 166 2
253 gt.recipe.anvil.bend.small Gregtech 6 gregtech:gt.multitileentity:32031 gregapi_post TRUE 15 145 166 2
254 gt.recipe.aquaticfarm Gregtech 6 gregtech:gt.multitileentity:17131 gregapi_post TRUE 15 145 166 2
255 gt.recipe.assembler Gregtech 6 gregtech:gt.multitileentity:20621 gregapi_post TRUE 15 145 166 2
256 gt.recipe.autoclave Gregtech 6 gregtech:gt.multitileentity:22004 gregapi_post TRUE 15 145 166 2
257 gt.recipe.bath Gregtech 6 gregtech:gt.multitileentity:22002 gregapi_post TRUE 15 145 166 2
258 gt.recipe.bedrockorelist Gregtech 6 gregtech:gt.multitileentity:17999 gregapi_post TRUE 15 145 166 2
259 gt.recipe.biolab Gregtech 6 gregtech:gt.multitileentity:17127 gregapi_post TRUE 15 145 166 2
260 gt.recipe.boxinator Gregtech 6 gregtech:gt.multitileentity:20581 gregapi_post TRUE 15 145 166 2
261 gt.recipe.bumblelyzer Gregtech 6 gregtech:gt.multitileentity:20541 gregapi_post TRUE 15 145 166 2
262 gt.recipe.bumblequeen Gregtech 6 gregtech:gt.multiitem.bumblebee:1 {"gt.bumble": {}} gregapi_post TRUE 15 145 166 2
263 gt.recipe.burnmixer Gregtech 6 gregtech:gt.multitileentity:20521 gregapi_post TRUE 15 145 166 2
264 gt.recipe.byproductlist Gregtech 6 minecraft:diamond_ore gregapi_post TRUE 15 145 166 2
265 gt.recipe.canner Gregtech 6 gregtech:gt.multitileentity:20161 gregapi_post TRUE 15 145 166 2
266 gt.recipe.catalyticcracking Gregtech 6 gregtech:gt.multitileentity:20481 gregapi_post TRUE 15 145 166 2
267 gt.recipe.centrifuge Gregtech 6 gregtech:gt.multitileentity:20081 gregapi_post TRUE 15 145 166 2
268 gt.recipe.clustermill Gregtech 6 gregtech:gt.multitileentity:20141 gregapi_post TRUE 15 145 166 2
269 gt.recipe.coagulator Gregtech 6 gregtech:gt.multitileentity:22000 gregapi_post TRUE 15 145 166 2
270 gt.recipe.cokeoven Gregtech 6 gregtech:gt.multitileentity:17000 gregapi_post TRUE 15 145 166 2
271 gt.recipe.compressor Gregtech 6 gregtech:gt.multitileentity:20101 gregapi_post TRUE 15 145 166 2
272 gt.recipe.crackingtower Gregtech 6 gregtech:gt.multitileentity:17115 gregapi_post TRUE 15 145 166 2
273 gt.recipe.cruciblealloying Gregtech 6 gregtech:gt.multitileentity:1005 gregapi_post TRUE 15 145 166 2
274 gt.recipe.cruciblesmelting Gregtech 6 gregtech:gt.multitileentity:1005 gregapi_post TRUE 15 145 166 2
275 gt.recipe.crusher Gregtech 6 gregtech:gt.multitileentity:20021 gregapi_post TRUE 15 145 166 2
276 gt.recipe.cryodistillationtower Gregtech 6 gregtech:gt.multitileentity:17111 gregapi_post TRUE 15 145 166 2
277 gt.recipe.cryomixer Gregtech 6 gregtech:gt.multitileentity:20571 gregapi_post TRUE 15 145 166 2
278 gt.recipe.crystallisationcrucible Gregtech 6 gregtech:gt.multitileentity:20251 gregapi_post TRUE 15 145 166 2
279 gt.recipe.cutter Gregtech 6 gregtech:gt.multitileentity:20061 gregapi_post TRUE 15 145 166 2
280 gt.recipe.debarker Gregtech 6 gregtech:gt.multitileentity:20551 gregapi_post TRUE 15 145 166 2
281 gt.recipe.distillationtower Gregtech 6 gregtech:gt.multitileentity:20191 gregapi_post TRUE 15 145 166 2
282 gt.recipe.distillery Gregtech 6 gregtech:gt.multitileentity:20191 gregapi_post TRUE 15 145 166 2
283 gt.recipe.drying Gregtech 6 gregtech:gt.multitileentity:20311 gregapi_post TRUE 15 145 166 2
284 gt.recipe.electrolyzer Gregtech 6 gregtech:gt.multitileentity:20091 gregapi_post TRUE 15 145 166 2
285 gt.recipe.extruder Gregtech 6 gregtech:gt.multitileentity:20202 gregapi_post TRUE 15 145 166 2
286 gt.recipe.fermenter Gregtech 6 gregtech:gt.multitileentity:22003 gregapi_post TRUE 15 145 166 2
287 gt.recipe.fluidsolidifier Gregtech 6 gregtech:gt.multitileentity:20611 gregapi_post TRUE 15 145 166 2
288 gt.recipe.freezer Gregtech 6 gregtech:gt.multitileentity:20561 gregapi_post TRUE 15 145 166 2
289 gt.recipe.fuels.burn Gregtech 6 gregtech:gt.multitileentity:1109 gregapi_post TRUE 15 145 166 2
290 gt.recipe.fuels.engine Gregtech 6 gregtech:gt.multitileentity:9147 gregapi_post TRUE 15 145 166 2
291 gt.recipe.fuels.fluidbed Gregtech 6 gregtech:gt.multitileentity:9009 gregapi_post TRUE 15 145 166 2
292 gt.recipe.fuels.gas Gregtech 6 gregtech:gt.multitileentity:1609 gregapi_post TRUE 15 145 166 2
293 gt.recipe.fuels.plasma Gregtech 6 gregtech:gt.multitileentity:17251 gregapi_post TRUE 15 145 166 2
294 gt.recipe.fuels.turbine Gregtech 6 gregtech:gt.multitileentity:17231 gregapi_post TRUE 15 145 166 2
295 gt.recipe.fusionreactor Gregtech 6 gregtech:gt.multitileentity:17198 gregapi_post TRUE 15 145 166 2
296 gt.recipe.generifier Gregtech 6 gregtech:gt.multitileentity:22001 gregapi_post TRUE 15 145 166 2
297 gt.recipe.heatmixer Gregtech 6 gregtech:gt.multitileentity:20506 gregapi_post TRUE 15 145 166 2
298 gt.recipe.implosioncompressor Gregtech 6 gregtech:gt.multitileentity:17110 gregapi_post TRUE 15 145 166 2
299 gt.recipe.incubator Gregtech 6 gregtech:gt.multitileentity:22005 gregapi_post TRUE 15 145 166 2
300 gt.recipe.injector Gregtech 6 gregtech:gt.multitileentity:20261 gregapi_post TRUE 15 145 166 2
301 gt.recipe.ionizer Gregtech 6 gregtech:gt.multitileentity:17315 gregapi_post TRUE 15 145 166 2
302 gt.recipe.juicer Gregtech 6 gregtech:gt.multitileentity:32722 gregapi_post TRUE 15 145 166 2
303 gt.recipe.laminator Gregtech 6 gregtech:gt.multitileentity:20391 gregapi_post TRUE 15 145 166 2
304 gt.recipe.lasercutter Gregtech 6 gregtech:gt.multitileentity:20631 gregapi_post TRUE 15 145 166 2
305 gt.recipe.laserengraver Gregtech 6 gregtech:gt.multitileentity:20321 gregapi_post TRUE 15 145 166 2
306 gt.recipe.lathe Gregtech 6 gregtech:gt.multitileentity:20041 gregapi_post TRUE 15 145 166 2
307 gt.recipe.lightning Gregtech 6 gregtech:gt.multitileentity:20501 gregapi_post TRUE 15 145 166 2
308 gt.recipe.loom Gregtech 6 gregtech:gt.multitileentity:20211 gregapi_post TRUE 15 145 166 2
309 gt.recipe.magneticseparator Gregtech 6 gregtech:gt.multitileentity:20301 gregapi_post TRUE 15 145 166 2
310 gt.recipe.maskaligner Gregtech 6 gregtech:gt.multitileentity:17122 gregapi_post TRUE 15 145 166 2
311 gt.recipe.massfab Gregtech 6 gregtech:gt.multitileentity:20411 gregapi_post TRUE 15 145 166 2
312 gt.recipe.mixer Gregtech 6 gregtech:gt.multitileentity:20181 gregapi_post TRUE 15 145 166 2
313 gt.recipe.mortar Gregtech 6 gregtech:gt.multitileentity:32735 gregapi_post TRUE 15 145 166 2
314 gt.recipe.nanofab Gregtech 6 gregtech:gt.multitileentity:20441 gregapi_post TRUE 15 145 166 2
315 gt.recipe.oilcleaner Gregtech 6 gregtech:gt.multitileentity:17116 gregapi_post TRUE 15 145 166 2
316 gt.recipe.particlecollider Gregtech 6 gregtech:gt.multitileentity:17200 gregapi_post TRUE 15 145 166 2
317 gt.recipe.plantalyzer Gregtech 6 gregtech:gt.multitileentity:20531 gregapi_post TRUE 15 145 166 2
318 gt.recipe.polarizer Gregtech 6 gregtech:gt.multitileentity:20221 gregapi_post TRUE 15 145 166 2
319 gt.recipe.press Gregtech 6 gregtech:gt.multitileentity:20231 gregapi_post TRUE 15 145 166 2
320 gt.recipe.printer Gregtech 6 gregtech:gt.multitileentity:20271 gregapi_post TRUE 15 145 166 2
321 gt.recipe.replicator Gregtech 6 gregtech:gt.multitileentity:20431 gregapi_post TRUE 15 145 166 2
322 gt.recipe.roaster Gregtech 6 gregtech:gt.multitileentity:20171 gregapi_post TRUE 15 145 166 2
323 gt.recipe.rollbender Gregtech 6 gregtech:gt.multitileentity:20121 gregapi_post TRUE 15 145 166 2
324 gt.recipe.rollformer Gregtech 6 gregtech:gt.multitileentity:20131 gregapi_post TRUE 15 145 166 2
325 gt.recipe.rollingmill Gregtech 6 gregtech:gt.multitileentity:20111 gregapi_post TRUE 15 145 166 2
326 gt.recipe.scannermolecular Gregtech 6 gregtech:gt.multitileentity:20423 gregapi_post TRUE 15 145 166 2
327 gt.recipe.scannervisuals Gregtech 6 gregtech:gt.multitileentity:20281 gregapi_post TRUE 15 145 166 2
328 gt.recipe.sharpener Gregtech 6 gregtech:gt.multitileentity:20511 gregapi_post TRUE 15 145 166 2
329 gt.recipe.shredder Gregtech 6 gregtech:gt.multitileentity:20011 gregapi_post TRUE 15 145 166 2
330 gt.recipe.sifter Gregtech 6 gregtech:gt.multitileentity:20051 gregapi_post TRUE 15 145 166 2
331 gt.recipe.slicer Gregtech 6 gregtech:gt.multitileentity:20381 gregapi_post TRUE 15 145 166 2
332 gt.recipe.sluice Gregtech 6 gregtech:gt.multitileentity:20291 gregapi_post TRUE 15 145 166 2
333 gt.recipe.smelter Gregtech 6 gregtech:gt.multitileentity:20241 gregapi_post TRUE 15 145 166 2
334 gt.recipe.squeezer Gregtech 6 gregtech:gt.multitileentity:20071 gregapi_post TRUE 15 145 166 2
335 gt.recipe.steamcracking Gregtech 6 gregtech:gt.multitileentity:20491 gregapi_post TRUE 15 145 166 2
336 gt.recipe.toolhead Gregtech 6 gregtech:gt.meta.toolHeadPickaxe:260 gregapi_post TRUE 15 145 166 2
337 gt.recipe.unboxinator Gregtech 6 gregtech:gt.multitileentity:20591 gregapi_post TRUE 15 145 166 2
338 gt.recipe.welder Gregtech 6 gregtech:gt.multitileentity:20331 gregapi_post TRUE 15 145 166 2
339 gt.recipe.well Gregtech 6 gregtech:gt.multitileentity:17124 gregapi_post TRUE 15 145 166 2
340 gt.recipe.wiremill Gregtech 6 gregtech:gt.multitileentity:20151 gregapi_post TRUE 15 145 166 2
@@ -44,27 +44,28 @@ nei.chat.rain.on=Déšť zapnut
nei.chat.rain.off=Déšť vypnut
nei.chat.time=Den %d. %d:00
nei.chat.give.noitem=Nemáš žádný takový předmět.
nei.chat.chunkoverlay.0=Chunk Overlay: Off
nei.chat.chunkoverlay.1=Chunk Overlay: Chunk Corners
nei.chat.chunkoverlay.2=Chunk Overlay: Chunks
nei.chat.chunkoverlay.3=Chunk Overlay: GT Ore Veins
nei.options=NEI volby
nei.options.back=Zpět
nei.options.world=Svět
nei.options.global=Globální
nei.options.global.tip.0=Nastavení se aplikuje pro všechny světy
nei.options.global.tip.1=Klikni na W vedle :option pro povolení :override pro tento svět
nei.options.wbutton.tip.0=Používám globální nastavení
nei.options.wbutton.tip.1=Přepisuji globální nastavení
nei.options.keys=Nastavení kláves
nei.options.keys.gui=NEI Inventář
nei.options.keys.recipe.recipe=Recept
nei.options.keys.recipe.usage=Použití
nei.options.keys.gui=Inventář
nei.options.keys.gui.recipe=Recept
nei.options.keys.gui.usage=Použití
nei.options.keys.gui.enchant=Očarování
nei.options.keys.gui.potion=Lektvary
nei.options.keys.recipe.back=Předchozí recept
nei.options.keys.gui.back=Předchozí recept
nei.options.keys.gui.prev=Předchozí stránka
nei.options.keys.gui.next=Další stránka
nei.options.keys.gui.hide=Přepnout viditelnost NEI
nei.options.keys.gui.search=Zaměřit vyhledávací pole
nei.options.keys.world=NEI Svět
nei.options.keys.world=Svět
nei.options.keys.world.chunkoverlay=Ohraničení chunku
nei.options.keys.world.moboverlay=Označení míst spawnu monster
nei.options.keys.world.highlight_tips=Informace o bloku
@@ -83,18 +84,18 @@ nei.options.inventory.widgetsenabled.false=NEI zakázáno
nei.options.inventory.cheatmode.0=Mód receptů
nei.options.inventory.cheatmode.1=Užitný mód
nei.options.inventory.cheatmode.2=Cheatovací mód
nei.options.inventory.guirecipe.profile=Profilové recepty
nei.options.inventory.guirecipe.profile.true=Povoleny
nei.options.inventory.guirecipe.profile.false=Nepovoleny
nei.options.inventory.profileRecipes=Profilové recepty
nei.options.inventory.profileRecipes.true=Povoleny
nei.options.inventory.profileRecipes.false=Nepovoleny
nei.options.inventory.itemsort=Řazení panelu předmětů
nei.options.inventory.itemIDs=IDčka předmětů
nei.options.inventory.itemIDs.0=Skryté
nei.options.inventory.itemIDs.1=Automatické
nei.options.inventory.itemIDs.2=Zobrazené
nei.options.inventory.search.patternMode=Vyhledavací mód
nei.options.inventory.search.patternMode.0=Prostý
nei.options.inventory.search.patternMode.1=Rozšířený
nei.options.inventory.search.patternMode.2=Regexy
nei.options.inventory.searchmode=Vyhledavací mód
nei.options.inventory.searchmode.0=Prostý
nei.options.inventory.searchmode.1=Rozšířený
nei.options.inventory.searchmode.2=Regexy
nei.options.inventory.utilities=Nástroje
nei.options.inventory.utilities.tip=Vyber doplňky pro mód nástrojů
nei.options.inventory.utilities.time=Čas
@@ -48,27 +48,28 @@ nei.chat.rain.on=Regen angeschaltet
nei.chat.rain.off=Regen ausgeschaltet
nei.chat.time=Tag %d. %d:00
nei.chat.give.noitem=Solch ein Item gibt es nicht.
nei.chat.chunkoverlay.0=Chunk Overlay: Off
nei.chat.chunkoverlay.1=Chunk Overlay: Chunk Corners
nei.chat.chunkoverlay.2=Chunk Overlay: Chunks
nei.chat.chunkoverlay.3=Chunk Overlay: GT Ore Veins
nei.options=NEI-Optionen
nei.options.back=Zurück
nei.options.world=Welt
nei.options.global=Global
nei.options.global.tip.0=Optionen werden auf alle Welten angewandt
nei.options.global.tip.1=Klicke W neben einer:Option , um das Übergehen: für diese Welt zu aktivieren
nei.options.wbutton.tip.0=Nutzt globale Einstellungen
nei.options.wbutton.tip.1=Übergeht globale Einstellungen
nei.options.keys=Tastenbelegung
nei.options.keys.gui=NEI Inventar
nei.options.keys.recipe.recipe=Rezept
nei.options.keys.recipe.usage=Nutzung
nei.options.keys.gui=Inventar
nei.options.keys.gui.recipe=Rezept
nei.options.keys.gui.usage=Nutzung
nei.options.keys.gui.enchant=Verzauberungen
nei.options.keys.gui.potion=Tränke
nei.options.keys.recipe.back=Vorheriges Rezept
nei.options.keys.gui.back=Vorheriges Rezept
nei.options.keys.gui.prev=Vorherige Seite
nei.options.keys.gui.next=Nächste Seite
nei.options.keys.gui.hide=Verstelle NEI-Sichtbarkeit
nei.options.keys.gui.search=Fokussiere Such-Leiste
nei.options.keys.world=NEI Welt
nei.options.keys.world=Welt
nei.options.keys.world.chunkoverlay=Chunk-Grenzen-Overlay
nei.options.keys.world.moboverlay=Mob-Spawn-Overlay
nei.options.keys.world.highlight_tips=Highlight-Tooltips
@@ -87,38 +88,18 @@ nei.options.inventory.widgetsenabled.false=NEI Deaktiviert
nei.options.inventory.cheatmode.0=Rezeptmodus
nei.options.inventory.cheatmode.1=Mehrzweckmodus
nei.options.inventory.cheatmode.2=Cheat-Modus
nei.options.inventory.guirecipe.profile=Profil-Rezepte
nei.options.inventory.guirecipe.profile.true=Wahr
nei.options.inventory.guirecipe.profile.false=Falsch
nei.options.inventory.profileRecipes=Profil-Rezepte
nei.options.inventory.profileRecipes.true=Wahr
nei.options.inventory.profileRecipes.false=Falsch
nei.options.inventory.itemsort=Item-Panel-Sortierung
nei.options.inventory.itemIDs=Item-IDs
nei.options.inventory.itemIDs.0=Versteckt
nei.options.inventory.itemIDs.1=Auto
nei.options.inventory.itemIDs.2=Gezeigt
nei.options.inventory.search.patternMode=Suchmodus
nei.options.inventory.search.patternMode.0=Gewöhnlich
nei.options.inventory.search.patternMode.1=Erweitert
nei.options.inventory.search.patternMode.2=Regex
nei.options.inventory.search.modNameSearchMode=Modname Suchmodus
nei.options.inventory.search.modNameSearchMode.0=Immer
nei.options.inventory.search.modNameSearchMode.1=Präfix: %s
nei.options.inventory.search.modNameSearchMode.2=Nie
nei.options.inventory.search.tooltipSearchMode=Tooltip Suchmodus
nei.options.inventory.search.tooltipSearchMode.0=Immer
nei.options.inventory.search.tooltipSearchMode.1=Präfix: %s
nei.options.inventory.search.tooltipSearchMode.2=Nie
nei.options.inventory.search.identifierSearchMode=Identifikator Suchmodus
nei.options.inventory.search.identifierSearchMode.0=Immer
nei.options.inventory.search.identifierSearchMode.1=Präfix: %s
nei.options.inventory.search.identifierSearchMode.2=Nie
nei.options.inventory.search.oreDictSearchMode=OreDict Suchmodus
nei.options.inventory.search.oreDictSearchMode.0=Immer
nei.options.inventory.search.oreDictSearchMode.1=Präfix: %s
nei.options.inventory.search.oreDictSearchMode.2=Nie
nei.options.inventory.search.subsetsSearchMode=Item-SubSet Suchmodus
nei.options.inventory.search.subsetsSearchMode.0=Immer
nei.options.inventory.search.subsetsSearchMode.1=Präfix: %s
nei.options.inventory.search.subsetsSearchMode.2=Nie
nei.options.inventory.searchmode=Suchmodus
nei.options.inventory.searchmode.0=Gewöhnlich
nei.options.inventory.searchmode.1=Erweitert
nei.options.inventory.searchmode.2=Regex
nei.options.inventory.utilities=Nützliches
nei.options.inventory.utilities.tip=Wähle Inhalte für den Mehrzweckmodus
nei.options.inventory.utilities.time=Zeit
+256
View File
@@ -0,0 +1,256 @@
nei.load=Load
nei.save=Save
# PC/Linux Control Key
nei.key.ctrl=CTRL
# Mac Command Key
nei.key.ctrl.mac=CMD
nei.bookmark.toggle=Bookmarks
nei.bookmark.toggle.tip=Toggle visibility of the Bookmark Panel
nei.enchant=Enchant
nei.enchant.level=Level
nei.enchant.locked=Locked
nei.enchant.unlocked=Unlocked
nei.potion.favourite=Favourite Potions
nei.potion.duration=Duration
nei.potion.level=Level
nei.inventory.options=Options
nei.inventory.options.tip=NEI Config
nei.inventory.options.tip.cheatmode.0=Recipe Mode
nei.inventory.options.tip.cheatmode.1=Utility Mode
nei.inventory.options.tip.cheatmode.2=Cheat Mode
nei.inventory.options.tip.cheatmode.disable=%s-click here to cycle between Recipe, Utility, and Cheat Mode.
nei.inventory.prev=Prev
nei.inventory.next=Next
nei.inventory.item_subsets=Item Subsets
nei.inventory.delete.inv=DELETE ALL ITEMS from current inventory screen
nei.inventory.delete.one=Delete %s
nei.inventory.delete.all=Delete ALL %s
nei.inventory.delete.enable=Enable delete mode
nei.inventory.delete.1=Turn delete mode on
nei.inventory.delete.0=Turn delete mode off
nei.inventory.rain.enable=Enable rain
nei.inventory.rain.1=Turn rain on
nei.inventory.rain.0=Turn rain off
nei.inventory.magnet.enable=Enable magnet mode
nei.inventory.magnet.1=Turn magnet mode on
nei.inventory.magnet.0=Turn magnet mode off
nei.inventory.dawn.enable=Enable dawn-noon
nei.inventory.dawn.set=Set time to dawn
nei.inventory.noon.enable=Enable noon-dusk
nei.inventory.noon.set=Set time to noon
nei.inventory.dusk.enable=Enable dusk-midnight
nei.inventory.dusk.set=Set time to dusk
nei.inventory.midnight.enable=Enable midnight-dawn
nei.inventory.midnight.set=Set time to midnight
nei.inventory.heal=Heal the player
nei.inventory.current.gamemode.0=Current gamemode: survival
nei.inventory.current.gamemode.1=Current gamemode: creative
nei.inventory.current.gamemode.2=Current gamemode: creative+
nei.inventory.current.gamemode.3=Current gamemode: adventure
nei.inventory.gamemode.0=Click: Set gamemode to survival
nei.inventory.gamemode.1=Click: Set gamemode to creative
nei.inventory.gamemode.2=Click: Set gamemode to creative+
nei.inventory.gamemode.3=Click: Set gamemode to adventure
nei.chat.gamemode.0=You are now playing survival
nei.chat.gamemode.1=You are now playing creative
nei.chat.gamemode.2=You are now playing creative+
nei.chat.gamemode.3=You are now playing adventure
nei.chat.rain.on=Rain turned on
nei.chat.rain.off=Rain turned off
nei.chat.time=Day %d. %d:00
nei.chat.give.noitem=No such item.
nei.options=NEI Options
nei.options.back=Back
nei.options.world=World
nei.options.global=Global
nei.options.global.tip.0=Options apply to all worlds
nei.options.global.tip.1=Click the W beside an:option to enable an:override for this world
nei.options.wbutton.tip.0=Using global settings
nei.options.wbutton.tip.1=Overriding global setting
nei.options.keys=KeyBindings
nei.options.keys.showenchant=Show Enchant
nei.options.keys.gui=Inventory
nei.options.keys.gui.recipe=Recipe
nei.options.keys.gui.usage=Usage
nei.options.keys.gui.enchant=Enchantments
nei.options.keys.gui.potion=Potions
nei.options.keys.gui.back=Back to last Recipe
nei.options.keys.gui.prev=Prev Item Panel Page
nei.options.keys.gui.next=Next Item Panel Page
nei.options.keys.gui.hide=Toggle NEI Visibility
nei.options.keys.gui.next_recipe=Next Recipe
nei.options.keys.gui.prev_recipe=Prev Recipe
nei.options.keys.gui.next_machine=Next Machine
nei.options.keys.gui.prev_machine=Prev Machine
nei.options.keys.gui.search=Focus Search Bar
nei.options.keys.gui.bookmark=Add Bookmark
nei.options.keys.gui.hide_bookmarks=Toggle Bookmark Panel Visibility
nei.options.keys.world=World
nei.options.keys.world.chunkoverlay=Chunk Boundary Overlay
nei.options.keys.world.moboverlay=Mob Spawn Overlay
nei.options.keys.world.highlight_tips=Highlight Tooltips
nei.options.keys.world.dawn=Dawn
nei.options.keys.world.noon=Noon
nei.options.keys.world.dusk=Dusk
nei.options.keys.world.midnight=Midnight
nei.options.keys.world.rain=Rain
nei.options.keys.world.heal=Heal
nei.options.keys.world.creative=Gamemode
nei.options.keys.world.creative.tip=Cycle Gamemode
nei.options.inventory=Inventory
nei.options.inventory.bookmarksEnabled=Bookmarks Panel Visibility
nei.options.inventory.bookmarksEnabled.true=Visible
nei.options.inventory.bookmarksEnabled.false=Hidden
nei.options.inventory.jei_style_tabs=JEI Style Tabs
nei.options.inventory.jei_style_tabs.true=Yes
nei.options.inventory.jei_style_tabs.false=No [Weirdo]
nei.options.inventory.creative_tab_style=Creative or JEI tab style
nei.options.inventory.creative_tab_style.true=Creative
nei.options.inventory.creative_tab_style.false=JEI
nei.options.inventory.widgetsenabled.true=NEI Enabled
nei.options.inventory.widgetsenabled.false=NEI Disabled
nei.options.inventory.cheatmode.0=Recipe Mode
nei.options.inventory.cheatmode.1=Utility Mode
nei.options.inventory.cheatmode.2=Cheat Mode
nei.options.inventory.profileRecipes=Profile Recipes
nei.options.inventory.profileRecipes.true=True
nei.options.inventory.profileRecipes.false=False
nei.options.inventory.itemsort=Item Panel Sorting
nei.options.inventory.itemIDs=Item IDs
nei.options.inventory.itemIDs.0=Hidden
nei.options.inventory.itemIDs.1=Auto
nei.options.inventory.itemIDs.2=Shown
nei.options.inventory.searchmode=Search Mode
nei.options.inventory.searchmode.0=Plain
nei.options.inventory.searchmode.1=Extended
nei.options.inventory.searchmode.2=Regex
nei.options.inventory.utilities=Utilities
nei.options.inventory.utilities.tip=Select features for utility mode
nei.options.inventory.utilities.time=Time
nei.options.inventory.utilities.rain=Rain
nei.options.inventory.utilities.heal=Heal
nei.options.inventory.utilities.delete=Delete
nei.options.inventory.utilities.magnet=Magnet
nei.options.inventory.utilities.gamemode=Gamemode
nei.options.inventory.utilities.enchant=Enchanting
nei.options.inventory.utilities.potion=Potions
nei.options.inventory.utilities.item=Items
nei.options.inventory.gamemodes=Gamemodes
nei.options.inventory.gamemodes.tip=Select the gamemodes to cycle through
nei.options.inventory.gamemodes.creative=Creative
nei.options.inventory.gamemodes.creative+=Creative+
nei.options.inventory.gamemodes.adventure=Adventure
nei.options.command=Commands
nei.options.command.creative=Gamemode
nei.options.command.creative.tip={0} = 1 for creative, 0 for survival, {1} = player
nei.options.command.item=Item
nei.options.command.item.tip={0} = player, {1} = id, {2} = amount, {3} = damage, {4} = nbt, {5} = name
nei.options.command.time=Time
nei.options.command.time.tip={0} = worldtime
nei.options.command.rain=Rain
nei.options.command.rain.tip={0} = 1 for on, 0 for off
nei.options.command.heal=Heal
nei.options.command.heal.tip={0} = player
nei.options.world.highlight_tips=Highlight Tooltips
nei.options.world.highlight_tips.hide=Hidden
nei.options.world.highlight_tips.show=Shown
nei.options.world.highlight_tips.sample=Sample
nei.options.tools=Tools
nei.options.tools.handler_load_from_config=Load handlers from Config
nei.options.tools.handler_load_from_config.true=Config
nei.options.tools.handler_load_from_config.false=JAR
nei.options.tools.dump=Data Dumps
nei.options.tools.dump.dump=Dump
nei.options.tools.dump.dumped=%s IDs dumped to %s
nei.options.tools.dump.mode.0=Used
nei.options.tools.dump.mode.1=Free
nei.options.tools.dump.mode.2=All
nei.options.tools.dump.item=Item
nei.options.tools.dump.items=Items
nei.options.tools.dump.block=Block
nei.options.tools.dump.blocks=Blocks
nei.options.tools.dump.potion=Potion
nei.options.tools.dump.potions=Potions
nei.options.tools.dump.enchantment=Enchantment
nei.options.tools.dump.enchantments=Enchantments
nei.options.tools.dump.biome=Biome
nei.options.tools.dump.biomes=Biomes
nei.options.tools.dump.itempanel=Item Panel
nei.options.tools.dump.itempanel.dumped=Item Panel contents were dumped to %s
nei.options.tools.dump.itempanel.mode.0=CSV
nei.options.tools.dump.itempanel.mode.1=NBT
nei.options.tools.dump.itempanel.mode.2=Json
nei.options.tools.dump.itempanel.mode.3=PNG
nei.options.tools.dump.itempanel.icon.dumped=Item Panel icons were dumped to %s
nei.options.tools.dump.itempanel.icon.cancelled=Dump cancelled
nei.options.tools.dump.handlers=NEI Handlers
nei.options.tools.dump.handlers.dumped=handlers were dumped to %s
nei.options.tools.dump.handlers.mode.0=CSV
nei.options.tools.dump.handlers.mode.1=Json
nei.recipe.page=Page %s/%s
nei.recipe.tooltip=Recipes
nei.recipe.shaped=Shaped Crafting
nei.recipe.shapeless=Shapeless Crafting
nei.recipe.furnace=Smelting
nei.recipe.fuel=Fuel
nei.recipe.fuel.required=%s required
nei.recipe.fuel.processed=%s processed
nei.recipe.fuel.produced=%s produced
nei.recipe.firework=Fireworks
nei.recipe.firework.tooltip0=Dyes add colours to the charges
nei.recipe.firework.tooltip1=Recolouring adds fade colours to the charge
nei.recipe.firework.tooltip2=Multiple charges can be spawned from one rocket
nei.recipe.brewing=Brewing
nei.recipe.profiler.crafting=Crafting Profiling
nei.recipe.profiler.usage=Usage Profiling
nei.itemsort.minecraft=Minecraft
nei.itemsort.minecraft.tip=Sorts items from vanilla minecraft first
nei.itemsort.mod=Mod
nei.itemsort.mod.tip=Groups items in the same mod, sorted by mod name
nei.itemsort.id=Item ID
nei.itemsort.default=Default
nei.itemsort.default.tip=Leave the natural ordering of each item unchanged
nei.itemsort.damage=Item Damage
nei.itemsort.name=Display Name
nei.subsets.Blocks=Blocks
nei.subsets.Blocks.MobSpawners=Mob Spawners
nei.subsets.CreativeTabs=Creative Tabs
nei.subsets.Items=Items
nei.subsets.Items.Armor=Armor
nei.subsets.Items.Armor.Boots=Boots
nei.subsets.Items.Armor.Chestplates=Chestplates
nei.subsets.Items.Armor.Helmets=Helmets
nei.subsets.Items.Armor.Leggings=Leggings
nei.subsets.Items.Food=Food
nei.subsets.Items.Potions=Potions
nei.subsets.Items.Potions.Ingredients=Ingredients
nei.subsets.Items.Potions.Negative=Negative
nei.subsets.Items.Potions.Neutral=Neutral
nei.subsets.Items.Potions.Positive=Positive
nei.subsets.Items.Potions.Splash=Splash
nei.subsets.Items.Tools=Tools
nei.subsets.Items.Tools.Axes=Axes
nei.subsets.Items.Tools.Hoes=Hoes
nei.subsets.Items.Tools.Other=Other
nei.subsets.Items.Tools.Pickaxes=Pickaxes
nei.subsets.Items.Tools.Shovels=Shovels
nei.subsets.Items.Weapons=Weapons
nei.subsets.Items.Weapons.Ranged=Ranged
nei.subsets.Items.Weapons.Swords=Swords
nei.subsets.Mod=Mod
@@ -47,27 +47,28 @@ nei.chat.rain.on=Vihm sisse lülitatud
nei.chat.rain.off=Vihm välja lülitatud
nei.chat.time=Päev %d. %d:00
nei.chat.give.noitem=Pole sellist asja olemas.
nei.chat.chunkoverlay.0=Chunk Overlay: Off
nei.chat.chunkoverlay.1=Chunk Overlay: Chunk Corners
nei.chat.chunkoverlay.2=Chunk Overlay: Chunks
nei.chat.chunkoverlay.3=Chunk Overlay: GT Ore Veins
nei.options=NEI Valikud
nei.options.back=Tagasi
nei.options.world=Maailm
nei.options.global=Globaalne
nei.options.global.tip.0=Valikud mõjutavad kõiki maailmi
nei.options.global.tip.1=Vajuta W kõrval:valiku, et ületeh:ületeha see maailm
nei.options.wbutton.tip.0=Kasutab globaalseid seadeid
nei.options.wbutton.tip.1=Globaalsete seadmete ületegemine
nei.options.keys=Klahviseosed
nei.options.keys.gui=NEI Seljakott
nei.options.keys.recipe.recipe=Retsept
nei.options.keys.recipe.usage=Kasutus
nei.options.keys.gui=Seljakott
nei.options.keys.gui.recipe=Retsept
nei.options.keys.gui.usage=Kasutus
nei.options.keys.gui.enchant=Loitsud
nei.options.keys.gui.potion=Joogid
nei.options.keys.recipe.back=Eel. Retsept
nei.options.keys.gui.back=Eel. Retsept
nei.options.keys.gui.prev=Eel. Leht
nei.options.keys.gui.next=Järg. Leht
nei.options.keys.gui.hide=Lülita NEI nähtavust
nei.options.keys.gui.search=Fokuseeri otsingu riba
nei.options.keys.world=NEI Maailm
nei.options.keys.world=Maailm
nei.options.keys.world.chunkoverlay=Chunk'i ääre ülekate
nei.options.keys.world.moboverlay=Koletiste sündimis ülekate
nei.options.keys.world.highlight_tips=Highlight Tooltips
@@ -86,18 +87,18 @@ nei.options.inventory.widgetsenabled.false=NEI keelatud
nei.options.inventory.cheatmode.0=Retsepti mood
nei.options.inventory.cheatmode.1=Utiliidi mood
nei.options.inventory.cheatmode.2=Petmis mood
nei.options.inventory.guirecipe.profile=Profileeri retsepte
nei.options.inventory.guirecipe.profile.true=Tõene
nei.options.inventory.guirecipe.profile.false=Väär
nei.options.inventory.profileRecipes=Profileeri retsepte
nei.options.inventory.profileRecipes.true=Tõene
nei.options.inventory.profileRecipes.false=Väär
nei.options.inventory.itemsort=Item Panel Sorting
nei.options.inventory.itemIDs=Asja ID-d
nei.options.inventory.itemIDs.0=Peidetud
nei.options.inventory.itemIDs.1=Auto
nei.options.inventory.itemIDs.2=Näidatud
nei.options.inventory.search.patternMode=Otsimis mood
nei.options.inventory.search.patternMode.0=Plain
nei.options.inventory.search.patternMode.1=Extended
nei.options.inventory.search.patternMode.2=Regex
nei.options.inventory.searchmode=Otsimis mood
nei.options.inventory.searchmode.0=Plain
nei.options.inventory.searchmode.1=Extended
nei.options.inventory.searchmode.2=Regex
nei.options.inventory.utilities=Utiliidid
nei.options.inventory.utilities.tip=Vali funktsioonid utiliidi moodi jaoks
nei.options.inventory.utilities.time=Aeg
@@ -45,27 +45,28 @@ nei.chat.rain.on=Pluie activée
nei.chat.rain.off=Pluie désactivée
nei.chat.time=Jour %d. %d:00
nei.chat.give.noitem=Objet inexistant.
nei.chat.chunkoverlay.0=Chunk Overlay: Off
nei.chat.chunkoverlay.1=Chunk Overlay: Chunk Corners
nei.chat.chunkoverlay.2=Chunk Overlay: Chunks
nei.chat.chunkoverlay.3=Chunk Overlay: GT Ore Veins
nei.options=NEI Options
nei.options.back=Retour
nei.options.world=Monde
nei.options.global=Global
nei.options.global.tip.0=Les options s'appliquent à tous les mondes
nei.options.global.tip.1=Cliquez sur le "W" à coté d'une option pour l'activer pour ce monde
nei.options.wbutton.tip.0=Utilisation des paramètres globaux
nei.options.wbutton.tip.1=Annuler l'utilisation des paramètres globaux
nei.options.keys=Raccourcis clavier
nei.options.keys.gui=NEI Inventaire
nei.options.keys.recipe.recipe=Recette
nei.options.keys.recipe.usage=Usage
nei.options.keys.gui=Inventaire
nei.options.keys.gui.recipe=Recette
nei.options.keys.gui.usage=Usage
nei.options.keys.gui.enchant=Enchantements
nei.options.keys.gui.potion=Potions
nei.options.keys.recipe.back=Recette précédente
nei.options.keys.gui.back=Recette précédente
nei.options.keys.gui.prev=Recette suivante
nei.options.keys.gui.next=Page suivante
nei.options.keys.gui.hide=Afficher ou cacher NEI
nei.options.keys.gui.search=Sélectionner la barre de recherche
nei.options.keys.world=NEI Monde
nei.options.keys.world=Monde
nei.options.keys.world.chunkoverlay=Overlay limitation des chunks
nei.options.keys.world.moboverlay=Overlay spawn des monstres
nei.options.keys.world.highlight_tips=Mettez en surbrillance les info-bulles
@@ -84,18 +85,18 @@ nei.options.inventory.widgetsenabled.false=NEI désactivé
nei.options.inventory.cheatmode.0=Mode recette
nei.options.inventory.cheatmode.1=Mode utilitaire
nei.options.inventory.cheatmode.2=Mode triche
nei.options.inventory.guirecipe.profile=Profil Recettes
nei.options.inventory.guirecipe.profile.true=Vrai
nei.options.inventory.guirecipe.profile.false=Faux
nei.options.inventory.profileRecipes=Profil Recettes
nei.options.inventory.profileRecipes.true=Vrai
nei.options.inventory.profileRecipes.false=Faux
nei.options.inventory.itemsort=Tri du panneau d'élément
nei.options.inventory.itemIDs=Objet IDs
nei.options.inventory.itemIDs.0=Cachés
nei.options.inventory.itemIDs.1=Auto
nei.options.inventory.itemIDs.2=Montrés
nei.options.inventory.search.patternMode=Mode de recherche
nei.options.inventory.search.patternMode.0=Simple
nei.options.inventory.search.patternMode.1=Avancé
nei.options.inventory.search.patternMode.2=Expression rationnelle
nei.options.inventory.searchmode=Mode de recherche
nei.options.inventory.searchmode.0=Simple
nei.options.inventory.searchmode.1=Avancé
nei.options.inventory.searchmode.2=Expression rationnelle
nei.options.inventory.utilities=Utilitaires
nei.options.inventory.utilities.tip=Sélectionnez les fonctions pour le mode utilitaire
nei.options.inventory.utilities.time=Heure
@@ -129,11 +130,6 @@ nei.options.world.highlight_tips=Mettez en surbrillance les info-bulles
nei.options.world.highlight_tips.hide=Caché
nei.options.world.highlight_tips.show=Montré
nei.options.world.overlays=Paramètres des overlays
nei.options.world.overlays.lock.true=Activé
nei.options.world.overlays.lock.false=Désactivé
nei.options.world.overlays.lock=Conserver les overlays entre les dimensions
nei.options.tools=Outils
nei.options.tools.dump=Data Dumps
nei.options.tools.dump.dump=Jeter
@@ -48,27 +48,28 @@ nei.chat.rain.on=Pioggia attivata
nei.chat.rain.off=Pioggia disattivata
nei.chat.time=Giorno %d. %d:00
nei.chat.give.noitem=Nessun oggetto del genere.
nei.chat.chunkoverlay.0=Chunk Overlay: Off
nei.chat.chunkoverlay.1=Chunk Overlay: Chunk Corners
nei.chat.chunkoverlay.2=Chunk Overlay: Chunks
nei.chat.chunkoverlay.3=Chunk Overlay: GT Ore Veins
nei.options=Opzioni NEI
nei.options.back=Indietro
nei.options.world=Mondo
nei.options.global=Globale
nei.options.global.tip.0=Opzioni cambiano su tutti i mondi
nei.options.global.tip.1=Clicca la W vicino a una:opzione per impostarla:solo su questo mondo
nei.options.wbutton.tip.0=Usando le opzioni globali
nei.options.wbutton.tip.1=Sovrascrivendo le opzioni globali
nei.options.keys=Controlli
nei.options.keys.gui=NEI Inventario
nei.options.keys.recipe.recipe=Ricetta
nei.options.keys.recipe.usage=Usi
nei.options.keys.gui=Inventario
nei.options.keys.gui.recipe=Ricetta
nei.options.keys.gui.usage=Usi
nei.options.keys.gui.enchant=Incantare
nei.options.keys.gui.potion=Pozioni
nei.options.keys.recipe.back=Ricetta precedente
nei.options.keys.gui.back=Ricetta precedente
nei.options.keys.gui.prev=Pagina precedente
nei.options.keys.gui.next=Pagina successiva
nei.options.keys.gui.hide=Modifica visibilità NEI
nei.options.keys.gui.search=Attiva barra di ricerca
nei.options.keys.world=NEI Mondo
nei.options.keys.world=Mondo
nei.options.keys.world.chunkoverlay=Mostra confini dei chunk
nei.options.keys.world.moboverlay=Mostra spawn dei mob
nei.options.keys.world.highlight_tips=Esalta tooltips
@@ -87,18 +88,18 @@ nei.options.inventory.widgetsenabled.false=NEI Disattivato
nei.options.inventory.cheatmode.0=Modalità ricette
nei.options.inventory.cheatmode.1=Modalità utilità
nei.options.inventory.cheatmode.2=Modalità cheat
nei.options.inventory.guirecipe.profile=Ricerca profilo
nei.options.inventory.guirecipe.profile.true=Vero
nei.options.inventory.guirecipe.profile.false=Falso
nei.options.inventory.profileRecipes=Ricerca profilo
nei.options.inventory.profileRecipes.true=Vero
nei.options.inventory.profileRecipes.false=Falso
nei.options.inventory.itemsort=Pannello ordine degli oggetti
nei.options.inventory.itemIDs=ID degli oggetti
nei.options.inventory.itemIDs.0=Nascosti
nei.options.inventory.itemIDs.1=Auto
nei.options.inventory.itemIDs.2=Mostrati
nei.options.inventory.search.patternMode=Modalità di ricerca
nei.options.inventory.search.patternMode.0=Piatto
nei.options.inventory.search.patternMode.1=Esteso
nei.options.inventory.search.patternMode.2=Regex
nei.options.inventory.searchmode=Modalità di ricerca
nei.options.inventory.searchmode.0=Piatto
nei.options.inventory.searchmode.1=Esteso
nei.options.inventory.searchmode.2=Regex
nei.options.inventory.utilities=Utilità
nei.options.inventory.utilities.tip=Seleziona funzioni per modalità utilità
nei.options.inventory.utilities.time=Tempo
@@ -214,4 +215,4 @@ nei.subsets.Items.Tools.Shovels=Pale
nei.subsets.Items.Weapons=Armi
nei.subsets.Items.Weapons.Ranged=Da lancio
nei.subsets.Items.Weapons.Swords=Spade
nei.subsets.Mod=Mod
nei.subsets.Mod=Mod
@@ -43,27 +43,28 @@ nei.chat.rain.on=비 on
nei.chat.rain.off=비 off
nei.chat.time=%d번째 날. %d시 정각
nei.chat.give.noitem=아이템이 없습니다.
nei.chat.chunkoverlay.0=Chunk Overlay: Off
nei.chat.chunkoverlay.1=Chunk Overlay: Chunk Corners
nei.chat.chunkoverlay.2=Chunk Overlay: Chunks
nei.chat.chunkoverlay.3=Chunk Overlay: GT Ore Veins
nei.options=NEI 옵션
nei.options.back=뒤로
nei.options.world=세계
nei.options.global=글로벌
nei.options.global.tip.0= 모든세계의 NEI의 옵션을 적용합니다
nei.options.global.tip.1= 월드의 설정을 재정의 하려면 w를 클릭
nei.options.wbutton.tip.0=글로벌로 세팅
nei.options.wbutton.tip.1=전역 설정
nei.options.keys=키 바인딩
nei.options.keys.gui=NEI 인벤토리
nei.options.keys.recipe.recipe=레시피
nei.options.keys.recipe.usage=사용법
nei.options.keys.gui.enchant=인첸트
nei.options.keys.gui=인벤토리
nei.options.keys.gui.recipe=레시피
nei.options.keys.gui.usage=사용법
nei.options.keys.gui.nei.enchant=인첸트
nei.options.keys.gui.potion=포션
nei.options.keys.recipe.back=이전 레시피
nei.options.keys.gui.back=이전 레시피
nei.options.keys.gui.prev=이전 페이지
nei.options.keys.gui.next=다음 페이지
nei.options.keys.gui.hide=NEI 활성/비활성화
nei.options.keys.gui.search=빠른 검색
nei.options.keys.world=NEI 월드
nei.options.keys.world=월드
nei.options.keys.world.chunkoverlay=청크경계 확인
nei.options.keys.world.moboverlay=몹스폰 확인
nei.options.keys.world.highlight_tips=하이라이트 툴팁
@@ -82,18 +83,18 @@ nei.options.inventory.widgetsenabled.false=NEI 비활성화
nei.options.inventory.cheatmode.0=레시피모드
nei.options.inventory.cheatmode.1=유틸리티모드
nei.options.inventory.cheatmode.2=치트모드
nei.options.inventory.guirecipe.profile=프로파일 레시피
nei.options.inventory.guirecipe.profile.true=설정
nei.options.inventory.guirecipe.profile.false=비설정
nei.options.inventory.profileRecipes=프로파일 레시피
nei.options.inventory.profileRecipes.true=설정
nei.options.inventory.profileRecipes.false=비설정
nei.options.inventory.itemsort=아이템 정렬
nei.options.inventory.itemIDs=아이템 ID
nei.options.inventory.itemIDs.0= 숨기기
nei.options.inventory.itemIDs.1=자동
nei.options.inventory.itemIDs.2=보이기
nei.options.inventory.search.patternMode=검색모드
nei.options.inventory.search.patternMode.0=모두
nei.options.inventory.search.patternMode.1=확장
nei.options.inventory.search.patternMode.2=정규표현식
nei.options.inventory.searchmode=검색모드
nei.options.inventory.searchmode.0=모두
nei.options.inventory.searchmode.1=확장
nei.options.inventory.searchmode.2=정규표현식
nei.options.inventory.utilities=유틸리티
nei.options.inventory.utilities.tip=유틸리티 모드기능을 선택
nei.options.inventory.utilities.time=시간
@@ -44,27 +44,28 @@ nei.chat.rain.on=Deszcz włączony
nei.chat.rain.off=Deszcz wyączony
nei.chat.time=Dzień %d. %d:00
nei.chat.give.noitem=Nie ma takego przedmiotu.
nei.chat.chunkoverlay.0=Chunk Overlay: Off
nei.chat.chunkoverlay.1=Chunk Overlay: Chunk Corners
nei.chat.chunkoverlay.2=Chunk Overlay: Chunks
nei.chat.chunkoverlay.3=Chunk Overlay: GT Ore Veins
nei.options=Opcje NEI
nei.options.back=Wstecz
nei.options.world=Światowe
nei.options.global=Globalne
nei.options.global.tip.0=Opcje działają we wszystkich światach
nei.options.global.tip.1=Naciśnij 'W' obok opcji by włączyć nadpis dla tego świata
nei.options.wbutton.tip.0=Używanie ustawień globalnych
nei.options.wbutton.tip.1=Nadpisywanie ustawienia globalnego
nei.options.keys=Ustawienia klawiszy
nei.options.keys.gui=NEI Ekwipunek
nei.options.keys.recipe.recipe=Recepta
nei.options.keys.recipe.usage=Użytek
nei.options.keys.gui=Ekwipunek
nei.options.keys.gui.recipe=Recepta
nei.options.keys.gui.usage=Użytek
nei.options.keys.gui.enchant=Zaklęcia
nei.options.keys.gui.potion=Eleksiry
nei.options.keys.recipe.back=Poprzednia recepta
nei.options.keys.gui.back=Poprzednia recepta
nei.options.keys.gui.prev=Poprzednia strona
nei.options.keys.gui.next=Następna strona
nei.options.keys.gui.hide=Przełącz widzialność NEI
nei.options.keys.gui.search=Ustaw ostrość na pasek wyszukiwania
nei.options.keys.world=NEI Świat
nei.options.keys.world=Świat
nei.options.keys.world.chunkoverlay=Nakładka granic chunków
nei.options.keys.world.moboverlay=Nakładka pojawiania się mobów
nei.options.keys.world.highlight_tips=Podpowiedzi podświetleń
@@ -84,18 +85,18 @@ nei.options.inventory.cheatmode.0=Tryb recept
nei.options.inventory.cheatmode.1=Tryb użytku
nei.options.inventory.cheatmode.2=Tryb oszukiwania
nei.options.inventory.guirecipe.profile=Profiluj recepty
nei.options.inventory.guirecipe.profile.true=Tak
nei.options.inventory.guirecipe.profile.false=Nie
nei.options.inventory.profileRecipes=Profiluj recepty
nei.options.inventory.profileRecipes.true=Tak
nei.options.inventory.profileRecipes.false=Nie
nei.options.inventory.itemsort=Sortowanie paelu przedmiotów
nei.options.inventory.itemIDs=ID przedmiotów
nei.options.inventory.itemIDs.0=Ukryte
nei.options.inventory.itemIDs.1=Automatyczne
nei.options.inventory.itemIDs.2=Pokazane
nei.options.inventory.search.patternMode=Tryb wyszukiwania
nei.options.inventory.search.patternMode.0=Prosty
nei.options.inventory.search.patternMode.1=Rozszerzony
nei.options.inventory.search.patternMode.2=Wyrażenia regularne
nei.options.inventory.searchmode=Tryb wyszukiwania
nei.options.inventory.searchmode.0=Prosty
nei.options.inventory.searchmode.1=Rozszerzony
nei.options.inventory.searchmode.2=Wyrażenia regularne
nei.options.inventory.utilities=Narzędzia
nei.options.inventory.utilities.tip=Wybierz cechy trybu użytkowego
nei.options.inventory.utilities.time=Czas
@@ -44,27 +44,28 @@ nei.chat.rain.on=Chuva ligada
nei.chat.rain.off=Chuva desligada
nei.chat.time=Dia %d. %d:00
nei.chat.give.noitem=Nenhum item com esse nome.
nei.chat.chunkoverlay.0=Chunk Overlay: Off
nei.chat.chunkoverlay.1=Chunk Overlay: Chunk Corners
nei.chat.chunkoverlay.2=Chunk Overlay: Chunks
nei.chat.chunkoverlay.3=Chunk Overlay: GT Ore Veins
nei.options=Opções do NEI
nei.options.back=Voltar
nei.options.world=Mundo
nei.options.global=Global
nei.options.global.tip.0=Opções se aplicam a todos os mundos
nei.options.global.tip.1=Clique no W do lado de uma:opção para permitir uma :ultrapassagem para esse mundo.
nei.options.wbutton.tip.0=Usando configurações globais
nei.options.wbutton.tip.1=Substituindo configurações globais
nei.options.keys=Atalhos de Teclado
nei.options.keys.gui=NEI Inventário
nei.options.keys.recipe.recipe=Receita
nei.options.keys.recipe.usage=Uso
nei.options.keys.gui=Inventário
nei.options.keys.gui.recipe=Receita
nei.options.keys.gui.usage=Uso
nei.options.keys.gui.enchant=Encantamentos
nei.options.keys.gui.potion=Poções
nei.options.keys.recipe.back=Receita Ant.
nei.options.keys.gui.back=Receita Ant.
nei.options.keys.gui.prev=Pág. Anterior
nei.options.keys.gui.next=Próxima Pág.
nei.options.keys.gui.hide=Trocar Visibilidade do NEI
nei.options.keys.gui.search=Focar na Barra de Buscas
nei.options.keys.world=NEI Mundo
nei.options.keys.world=Mundo
nei.options.keys.world.chunkoverlay=Sobreposição de Fronteira de Chunks
nei.options.keys.world.moboverlay=Sobreposição de Spawn de Mobs
nei.options.keys.world.highlight_tips=Destacar Dicas
@@ -85,17 +86,17 @@ nei.options.inventory.cheatmode.1=Modo Utilidade
nei.options.inventory.cheatmode.2=Modo Cheat
nei.options.inventory.profileRecAtivaripes=Perfilar Receitas
nei.options.inventory.guirecipe.profile.true=Verdadeiro
nei.options.inventory.guirecipe.profile.false=Falso
nei.options.inventory.profileRecipes.true=Verdadeiro
nei.options.inventory.profileRecipes.false=Falso
nei.options.inventory.itemsort=Ordenamento do Painel de Itens
nei.options.inventory.itemIDs=IDs de Itens
nei.options.inventory.itemIDs.0=Escondido
nei.options.inventory.itemIDs.1=Auto
nei.options.inventory.itemIDs.2=Mostrado
nei.options.inventory.search.patternMode=Modo de Pesquisa
nei.options.inventory.search.patternMode.0=Plano
nei.options.inventory.search.patternMode.1=Extendido
nei.options.inventory.search.patternMode.2=Regex
nei.options.inventory.searchmode=Modo de Pesquisa
nei.options.inventory.searchmode.0=Plano
nei.options.inventory.searchmode.1=Extendido
nei.options.inventory.searchmode.2=Regex
nei.options.inventory.utilities=Utilidades
nei.options.inventory.utilities.tip=Selecionar funções para o modo utilidade
nei.options.inventory.utilities.time=Tempo
+218
View File
@@ -0,0 +1,218 @@
nei.load=Загрузить
nei.save=Сохранить
nei.enchant=Зачаровывание
nei.enchant.level=Уровень
nei.enchant.locked=Открытые
nei.enchant.unlocked=Закрытые
nei.potion.favourite=Любимые зелья
nei.potion.duration=Длительность
nei.potion.level=Уровень
nei.inventory.options=Опции
nei.inventory.prev=Предыдущая
nei.inventory.next=Следующая
nei.inventory.item_subsets=Подмножества предметов
nei.inventory.delete.one=Удалить %s
nei.inventory.delete.all=Удалить ВСЕ %s
nei.inventory.delete.enable=Режим удаления
nei.inventory.delete.1=Включить режим удаления
nei.inventory.delete.0=Выключить режим удаления
nei.inventory.rain.enable=Дождь
nei.inventory.rain.1=Включить дождь
nei.inventory.rain.0=Выключить дождь
nei.inventory.magnet.enable=Режим магнита
nei.inventory.magnet.1=Включить режим магнита
nei.inventory.magnet.0=Выключить режим магнита
nei.inventory.dawn.enable=Включить рассвет-полдень
nei.inventory.dawn.set=Установить время на рассвет
nei.inventory.noon.enable=Включить полдень-сумерки
nei.inventory.noon.set=Установить время на полдень
nei.inventory.dusk.enable=Включить сумерки-полночь
nei.inventory.dusk.set=Установить время на сумерки
nei.inventory.midnight.enable=Включить полночь-рассвет
nei.inventory.midnight.set=Установить время на полночь
nei.inventory.heal=Исцелить игрока
nei.inventory.gamemode.0=Установить игровой режим на выживание
nei.inventory.gamemode.1=Установить игровой режим на творческий
nei.inventory.gamemode.2=Установить игровой режим на творческий+
nei.inventory.gamemode.3=Установить игровой режим на приключение
nei.chat.gamemode.0=Теперь Вы играете в режиме выживание
nei.chat.gamemode.1=Теперь Вы играете в режиме творчество
nei.chat.gamemode.2=Теперь Вы играете в режиме творчество+
nei.chat.gamemode.3=Теперь Вы играете в режиме приключение
nei.chat.rain.on=Дождь включён
nei.chat.rain.off=Дождь выключен
nei.chat.time=День %d. %d:00
nei.chat.give.noitem=Нет такого предмета.
nei.options=Опции NEI
nei.options.back=Назад
nei.options.world=Мировые
nei.options.global=Глобальные
nei.options.global.tip.0=Настройки применяются ко всем мирам
nei.options.global.tip.1=Нажмите W рядом с:опцией, чтобы включить:перезапись для этого мира
nei.options.wbutton.tip.0=Использование глобальных настроек
nei.options.wbutton.tip.1=Перезапись глобальных настроек
nei.options.keys=Назначения клавиш
nei.options.keys.gui=Инвентарь
nei.options.keys.gui.recipe=Рецепт
nei.options.keys.gui.usage=Использование
nei.options.keys.gui.enchant=Чары
nei.options.keys.gui.potion=Зелья
nei.options.keys.gui.back=Предыдущий рецепт
nei.options.keys.gui.prev=Предыдущая страница
nei.options.keys.gui.next=Следующая страница
nei.options.keys.gui.hide=Переключить видимость NEI
nei.options.keys.gui.search=Сфокусироваться на панели поиска
nei.options.keys.world=Мир
nei.options.keys.world.chunkoverlay=Наложение границ чанков
nei.options.keys.world.moboverlay=Наложение появления мобов
nei.options.keys.world.highlight_tips=Показывать всплывающие подсказки
nei.options.keys.world.dawn=Рассвет
nei.options.keys.world.noon=Полдень
nei.options.keys.world.dusk=Сумерки
nei.options.keys.world.midnight=Полночь
nei.options.keys.world.rain=Дождь
nei.options.keys.world.heal=Исцеление
nei.options.keys.world.creative=Игровой режим
nei.options.keys.world.creative.tip=Круг игровых режимов
nei.options.inventory=Инвентарь
nei.options.inventory.widgetsenabled.true=NEI включён
nei.options.inventory.widgetsenabled.false=NEI выключен
nei.options.inventory.cheatmode.0=Режим рецептов
nei.options.inventory.cheatmode.1=Режим полезностей
nei.options.inventory.cheatmode.2=Чит-режим
nei.options.inventory.profileRecipes=Рецепты профиля
nei.options.inventory.profileRecipes.true=Да
nei.options.inventory.profileRecipes.false=Нет
nei.options.inventory.itemsort=Панель сортировки предметов
nei.options.inventory.itemIDs=ID предметов
nei.options.inventory.itemIDs.0=Спрятаны
nei.options.inventory.itemIDs.1=Авто
nei.options.inventory.itemIDs.2=Показаны
nei.options.inventory.searchmode=Режим поиска
nei.options.inventory.searchmode.0=Обычный
nei.options.inventory.searchmode.1=Расширенный
nei.options.inventory.searchmode.2=Регулярные выражения
nei.options.inventory.utilities=Полезности
nei.options.inventory.utilities.tip=Выберете функции для режима полезностей
nei.options.inventory.utilities.time=Время
nei.options.inventory.utilities.rain=Дождь
nei.options.inventory.utilities.heal=Исцеление
nei.options.inventory.utilities.delete=Удаление
nei.options.inventory.utilities.magnet=Магнит
nei.options.inventory.utilities.gamemode=Игровой режим
nei.options.inventory.utilities.enchant=Зачаровывание
nei.options.inventory.utilities.potion=Зелья
nei.options.inventory.utilities.item=Предметы
nei.options.inventory.gamemodes=Игровые режимы
nei.options.inventory.gamemodes.tip=Выберете игровые режимы для переключения между ними
nei.options.inventory.gamemodes.creative=Творческий
nei.options.inventory.gamemodes.creative+=Творческий+
nei.options.inventory.gamemodes.adventure=Приключение
nei.options.command=Команды
nei.options.command.creative=Игровой режим
nei.options.command.creative.tip={0} = 1 для творческого, 0 для выживания, {1} = игрок
nei.options.command.item=Предмет
nei.options.command.item.tip={0} = игрок, {1} = id, {2} = количество, {3} = урон, {4} = nbt, {5} = имя
nei.options.command.time=Время
nei.options.command.time.tip={0} = мировое время
nei.options.command.rain=Дождь
nei.options.command.rain.tip={0} = 1 для включения, 0 для выключения
nei.options.command.heal=Исцеление
nei.options.command.heal.tip={0} = игрок
nei.options.world.highlight_tips=Всплывающие подсказки
nei.options.world.highlight_tips.hide=Спрятаны
nei.options.world.highlight_tips.show=Показаны
nei.options.world.highlight_tips.sample=Пример
nei.options.tools=Инструменты
nei.options.tools.dump=Дампы памяти
nei.options.tools.dump.dump=Дамп
nei.options.tools.dump.dumped=ID %s сохранены в %s
nei.options.tools.dump.mode.0=Используемые
nei.options.tools.dump.mode.1=Свободные
nei.options.tools.dump.mode.2=Все
nei.options.tools.dump.item=Предмет
nei.options.tools.dump.items=Предметы
nei.options.tools.dump.block=Блок
nei.options.tools.dump.blocks=Блоки
nei.options.tools.dump.potion=Зелье
nei.options.tools.dump.potions=Зелья
nei.options.tools.dump.enchantment=Зачарование
nei.options.tools.dump.enchantments=Зачарования
nei.options.tools.dump.biome=Биом
nei.options.tools.dump.biomes=Биомы
nei.options.tools.dump.itempanel=Панель предметов
nei.options.tools.dump.itempanel.dumped=Содержимое панели предметов сохранено в %s
nei.options.tools.dump.itempanel.mode.0=CSV
nei.options.tools.dump.itempanel.mode.1=NBT
nei.options.tools.dump.itempanel.mode.2=Json
nei.options.tools.dump.itempanel.mode.3=PNG
nei.options.tools.dump.itempanel.icon.dumped=Иконки панели предметов сохранены в %s
nei.options.tools.dump.itempanel.icon.cancelled=Дамп отменён
nei.recipe.page=Страница %s/%s
nei.recipe.tooltip=Рецепты
nei.recipe.shaped=Форменное создание
nei.recipe.shapeless=Бесформенное создание
nei.recipe.furnace=Выплавка
nei.recipe.fuel=Топливо
nei.recipe.fuel.required=Требуется: %s
nei.recipe.fuel.processed=Обработано: %s
nei.recipe.fuel.produced=Произведено: %s
nei.recipe.firework=Фейерверки
nei.recipe.firework.tooltip0=Красители добавляют цвета на звёздочку
nei.recipe.firework.tooltip1=Recolouring adds fade colours to the charge
nei.recipe.firework.tooltip2=Multiple charges can be spawned from one rocket
nei.recipe.brewing=Зельеварение
nei.recipe.profiler.crafting=Профилирование создания
nei.recipe.profiler.usage=Использование профилирования
nei.itemsort.minecraft=Minecraft
nei.itemsort.minecraft.tip=Сортирует предметы сначало из оригинального Minecraft
nei.itemsort.mod=По модификации
nei.itemsort.mod.tip=Группирует предметы в один мод, на основе имени мода
nei.itemsort.id=ID предмета
nei.itemsort.default=По-умолчанию
nei.itemsort.default.tip=Обычный порядок предметов
nei.itemsort.damage=Повреждение предмета
nei.itemsort.name=Отображаемое имя
nei.subsets.Blocks=Блоки
nei.subsets.Blocks.MobSpawners=Спаунеры
nei.subsets.CreativeTabs=Творческие вкладки
nei.subsets.Items=Предметы
nei.subsets.Items.Armor=Броня
nei.subsets.Items.Armor.Boots=Ботинки
nei.subsets.Items.Armor.Chestplates=Кирасы
nei.subsets.Items.Armor.Helmets=Шлемы
nei.subsets.Items.Armor.Leggings=Поножи
nei.subsets.Items.Food=Еда
nei.subsets.Items.Potions=Зелья
nei.subsets.Items.Potions.Ingredients=Ингридиенты
nei.subsets.Items.Potions.Negative=Негативные
nei.subsets.Items.Potions.Neutral=Нейтральные
nei.subsets.Items.Potions.Positive=Полезные
nei.subsets.Items.Potions.Splash=Взрывные
nei.subsets.Items.Tools=Инструменты
nei.subsets.Items.Tools.Axes=Топоры
nei.subsets.Items.Tools.Hoes=Мотыги
nei.subsets.Items.Tools.Other=Другие
nei.subsets.Items.Tools.Pickaxes=Кирки
nei.subsets.Items.Tools.Shovels=Лопаты
nei.subsets.Items.Weapons=Оружие
nei.subsets.Items.Weapons.Ranged=Дальнего боя
nei.subsets.Items.Weapons.Swords=Мечи
nei.subsets.Mod=Модификации
@@ -44,27 +44,28 @@ nei.chat.rain.on=Dážď bol zapnutý
nei.chat.rain.off=Dážď bol vypnutý
nei.chat.time=Deň %d. %d:00
nei.chat.give.noitem=Žiaden takýto item.
nei.chat.chunkoverlay.0=Chunk Overlay: Off
nei.chat.chunkoverlay.1=Chunk Overlay: Chunk Corners
nei.chat.chunkoverlay.2=Chunk Overlay: Chunks
nei.chat.chunkoverlay.3=Chunk Overlay: GT Ore Veins
nei.options=Nastavenia NEI
nei.options.back=Späť
nei.options.world=Svet
nei.options.global=Globálne
nei.options.global.tip.0=Nastavenia sa aplikujú na všetky svety
nei.options.global.tip.1=Klikni W vedľa an:možnosti a povoľ an:náhradu pre tento svet
nei.options.wbutton.tip.0=Používajú sa globálne nastavenia
nei.options.wbutton.tip.1=Globálne nastavenia sú nahradené
nei.options.keys=Klávesové skratky
nei.options.keys.gui=NEI Inventár
nei.options.keys.recipe.recipe=Recept
nei.options.keys.recipe.usage=Použitie
nei.options.keys.gui=Inventár
nei.options.keys.gui.recipe=Recept
nei.options.keys.gui.usage=Použitie
nei.options.keys.gui.enchant=Očarovania
nei.options.keys.gui.potion=Elixíry
nei.options.keys.recipe.back=Predchádzajúci recept
nei.options.keys.gui.back=Predchádzajúci recept
nei.options.keys.gui.prev=Predchádzajúca strana
nei.options.keys.gui.next=Nasledujúca strana
nei.options.keys.gui.hide=Prepni viditeľnosť NEI
nei.options.keys.gui.search=Zamerania na vyhľadávací riadok
nei.options.keys.world=NEI Svet
nei.options.keys.world=Svet
nei.options.keys.world.chunkoverlay=Vrstva hraníc chunkov
nei.options.keys.world.moboverlay=Vrstva zrodenia sa monštier
nei.options.keys.world.highlight_tips=Zvýraznenie opisov
@@ -84,18 +85,18 @@ nei.options.inventory.cheatmode.0=Mód Receptov
nei.options.inventory.cheatmode.1=Úžitkový mód
nei.options.inventory.cheatmode.2=Čítovací mód
nei.options.inventory.guirecipe.profile=Profilovanie receptov
nei.options.inventory.guirecipe.profile.true=Áno
nei.options.inventory.guirecipe.profile.false=Nie
nei.options.inventory.profileRecipes=Profilovanie receptov
nei.options.inventory.profileRecipes.true=Áno
nei.options.inventory.profileRecipes.false=Nie
nei.options.inventory.itemsort=Zoradenie itemov
nei.options.inventory.itemIDs=ID itemov
nei.options.inventory.itemIDs.0=Skryté
nei.options.inventory.itemIDs.1=Automatické
nei.options.inventory.itemIDs.2=Zobrazené
nei.options.inventory.search.patternMode=Spôsob vyhľadávania
nei.options.inventory.search.patternMode.0=Jednoduchý
nei.options.inventory.search.patternMode.1=Rozšírený
nei.options.inventory.search.patternMode.2=Regulárne výrazy
nei.options.inventory.searchmode=Spôsob vyhľadávania
nei.options.inventory.searchmode.0=Jednoduchý
nei.options.inventory.searchmode.1=Rozšírený
nei.options.inventory.searchmode.2=Regulárne výrazy
nei.options.inventory.utilities=Utility
nei.options.inventory.utilities.tip=Zvoľ funkcie pre úžitkový mód
nei.options.inventory.utilities.time=Čas
@@ -19,14 +19,14 @@ nei.inventory.delete.0=Silme modunu kapat
nei.inventory.rain.enable=Yağmuru Aktif Et
nei.inventory.rain.1=Yağmur yağdır
nei.inventory.rain.0=Yağmuru durdur
nei.inventory.magnet.enable=Mıknatısı aktif et
nei.inventory.magnet.enable=Mıknatısı aktif et
nei.inventory.magnet.1=Mıknatısı aç
nei.inventory.magnet.0=Mıknatısı kapat
nei.inventory.dawn.enable=Sabah-Öğle aktif et
nei.inventory.dawn.set=Sabah yap
nei.inventory.noon.enable=Öğlen-akşam aktif et
nei.inventory.noon.set=Öğlen yap
nei.inventory.dusk.enable=Akşam-Gece aktif et
nei.inventory.dusk.enable=Akşam-Gece aktif et
nei.inventory.dusk.set=Akşam yap
nei.inventory.midnight.enable=Gece-Sabah aktif et
nei.inventory.midnight.set=Gece yarısı yap
@@ -44,27 +44,28 @@ nei.chat.rain.on=Yağmur açıldı
nei.chat.rain.off=Yağmur kapatıldı
nei.chat.time=Gün %d. %d:00
nei.chat.give.noitem=İtem verilemez.
nei.chat.chunkoverlay.0=Chunk Overlay: Off
nei.chat.chunkoverlay.1=Chunk Overlay: Chunk Corners
nei.chat.chunkoverlay.2=Chunk Overlay: Chunks
nei.chat.chunkoverlay.3=Chunk Overlay: GT Ore Veins
nei.options=NEI Ayarları
nei.options.back=Geri
nei.options.world=Dünya
nei.options.global=Genel
nei.options.global.tip.0=Ayarlar tüm dünyalar için kaydedilecek
nei.options.global.tip.1=W tuşuna tıklayın:seçeneği aç:dünyada gör
nei.options.wbutton.tip.0=Genel ayarları kullanıyorsunuz
nei.options.wbutton.tip.1=Genel ayarların üstüne yazılıyor
nei.options.keys=Tuşlar
nei.options.keys.gui=NEI Envanter
nei.options.keys.recipe.recipe=Tarifler
nei.options.keys.recipe.usage=Kullanım yeri
nei.options.keys.gui=Envanter
nei.options.keys.gui.recipe=Tarifler
nei.options.keys.gui.usage=Kullanım yeri
nei.options.keys.gui.enchant=Büylüler
nei.options.keys.gui.potion=İksirler
nei.options.keys.recipe.back=Önceki tarif
nei.options.keys.gui.back=Önceki tarif
nei.options.keys.gui.prev=Önceki sayfa
nei.options.keys.gui.next=Sonraki sayfa
nei.options.keys.gui.hide=Nei görünürlük ayarı
nei.options.keys.gui.search=Arama çubuğu odağı
nei.options.keys.world=NEI Dünya
nei.options.keys.world=Dünya
nei.options.keys.world.chunkoverlay=Chunk sınır yerleşimi
nei.options.keys.world.moboverlay=Mob Spawn yerleşimi
nei.options.keys.world.highlight_tips=Nesne ipucu
@@ -84,18 +85,18 @@ nei.options.inventory.cheatmode.0=Tarif modu
nei.options.inventory.cheatmode.1=Yardımcı mod
nei.options.inventory.cheatmode.2=Hileli mod
nei.options.inventory.guirecipe.profile=Profil tarifleri
nei.options.inventory.guirecipe.profile.true=Yazı
nei.options.inventory.guirecipe.profile.false=Şekil
nei.options.inventory.profileRecipes=Profil tarifleri
nei.options.inventory.profileRecipes.true=Yazı
nei.options.inventory.profileRecipes.false=Şekil
nei.options.inventory.itemsort=Item Panel Sıralaması
nei.options.inventory.itemIDs=Item IDleri
nei.options.inventory.itemIDs.0=Gizli
nei.options.inventory.itemIDs.1=Otomatik
nei.options.inventory.itemIDs.2=Göster
nei.options.inventory.search.patternMode=Arama Modu
nei.options.inventory.search.patternMode.0=Normal
nei.options.inventory.search.patternMode.1=Gelişmiş
nei.options.inventory.search.patternMode.2=Regex
nei.options.inventory.searchmode=Arama Modu
nei.options.inventory.searchmode.0=Normal
nei.options.inventory.searchmode.1=Gelişmiş
nei.options.inventory.searchmode.2=Regex
nei.options.inventory.utilities=Yardımcılar
nei.options.inventory.utilities.tip=Yardımcıları seç
nei.options.inventory.utilities.time=Saat
@@ -147,7 +148,7 @@ nei.options.tools.dump.enchantments=Büyüler
nei.options.tools.dump.biome=Biyom
nei.options.tools.dump.biomes=Biyomlar
nei.options.tools.dump.itempanel=Item Paneli
nei.options.tools.dump.itempanel.dumped=Item panelinden %s kadar silindi
nei.options.tools.dump.itempanel.dumped=Item panelinden %s kadar silindi
nei.options.tools.dump.itempanel.mode.0=CSV
nei.options.tools.dump.itempanel.mode.1=NBT
nei.options.tools.dump.itempanel.mode.2=Json
@@ -1,17 +1,6 @@
nei.load=载入
nei.save=保存
# PC/Linux Control Key
nei.key.ctrl=CTRL
# Mac Command Key
nei.key.ctrl.mac=CMD
nei.bookmark.toggle=书签
nei.bookmark.toggle.tip=显示/隐藏书签页
nei.bookmark.viewmode.toggle.tip=切换书签栏浏览模式
nei.itempanel.quantity.default=一组
nei.itempanel.loading=物品列表加载中...
nei.enchant=附魔
nei.enchant.level=等级
@@ -23,11 +12,6 @@ nei.potion.duration=持续时间
nei.potion.level=等级
nei.inventory.options=选项
nei.inventory.options.tip=NEI设置
nei.inventory.options.tip.cheatmode.0=合成模式
nei.inventory.options.tip.cheatmode.1=实用模式
nei.inventory.options.tip.cheatmode.2=作弊模式
nei.inventory.options.tip.cheatmode.disable=%s-点击此处以循环切换合成/实用/作弊模式.
nei.inventory.prev=上一页
nei.inventory.next=下一页
nei.inventory.item_subsets=物品分类
@@ -52,15 +36,10 @@ nei.inventory.dusk.set=设置时间为黄昏
nei.inventory.midnight.enable=激活午夜时间设置
nei.inventory.midnight.set=设置时间为午夜
nei.inventory.heal=治愈玩家并回满饱食度
nei.inventory.current.gamemode.0=当前游戏模式: 生存
nei.inventory.current.gamemode.1=当前游戏模式: 创造
nei.inventory.current.gamemode.2=当前游戏模式: 创造+
nei.inventory.current.gamemode.3=当前游戏模式: 冒险
nei.inventory.gamemode.0=点击设置为生存模式
nei.inventory.gamemode.1=点击设置为创造模式
nei.inventory.gamemode.2=点击设置为创造+模式
nei.inventory.gamemode.3=点击设置为冒险模式
nei.inventory.gamemode.0=设置为生存模式
nei.inventory.gamemode.1=设置为创造模式
nei.inventory.gamemode.2=设置为创造模式+
nei.inventory.gamemode.3=设置为冒险模式
nei.chat.gamemode.0=生存模式开启
nei.chat.gamemode.1=创造模式开启
@@ -70,42 +49,34 @@ nei.chat.rain.on=开启雨雪
nei.chat.rain.off=关闭雨雪
nei.chat.time=白天 %d. %d:00
nei.chat.give.noitem=没有此物品
nei.chat.recipe.error=加载合成表过程中出现错误.请查看日志了解详情.
nei.chat.render.error=渲染物品过程中出现错误.请查看日志了解详情.
nei.chat.chunkoverlay.0=Chunk Overlay: Off
nei.chat.chunkoverlay.1=Chunk Overlay: Chunk Corners
nei.chat.chunkoverlay.2=Chunk Overlay: Chunks
nei.chat.chunkoverlay.3=Chunk Overlay: GT Ore Veins
nei.options=NEI选项
nei.options.back=后退
nei.options.world=世界
nei.options.global=全局
nei.options.global.tip.0=选项适用于所有世界
nei.options.global.tip.1=点击选项左侧W按钮可覆写该世界设置
nei.options.wbutton.tip.0=使用全局设置
nei.options.wbutton.tip.1=覆写全局设置
nei.options.keys=按键绑定
nei.options.keys.showenchant=显示附魔值
nei.options.keys.gui=NEI 物品栏
nei.options.keys.recipe.recipe=查看合成
nei.options.keys.recipe.usage=查看用途
nei.options.keys.showenchant=显示附魔
nei.options.keys.gui=物品栏
nei.options.keys.gui.recipe=查看合成
nei.options.keys.gui.usage=查看用途
nei.options.keys.gui.enchant=附魔
nei.options.keys.gui.potion=药水
nei.options.keys.recipe.back=返回上一合成表
nei.options.keys.gui.back=返回上一合成表
nei.options.keys.gui.prev=上一页
nei.options.keys.gui.next=下一页
nei.options.keys.gui.hide=隐藏/显示NEI界面
nei.options.keys.recipe.next_recipe=下一合成表
nei.options.keys.recipe.prev_recipe=上一合成表
nei.options.keys.recipe.next_machine=下一机器
nei.options.keys.recipe.prev_machine=上一机器
nei.options.keys.gui.next_recipe=下一合成表
nei.options.keys.gui.prev_recipe=上一合成表
nei.options.keys.gui.next_machine=下一机器
nei.options.keys.gui.prev_machine=上一机器
nei.options.keys.gui.search=跳转到搜索框
nei.options.keys.bookmark.add=添加书签
nei.options.keys.bookmark.hide=显示/隐藏书签页
nei.options.keys.gui.overlay=使用覆盖合成表
nei.options.keys.gui.getprevioussearch=上一个搜索
nei.options.keys.gui.getnextsearch=下一个搜索
nei.options.keys.copy.name=复制物品名称 (Ctrl +)
nei.options.keys.copy.oredict=复制物品矿词词典 (Ctrl +)
nei.options.keys.copy.identifier=复制物品ID (Ctrl +)
nei.options.keys.world=NEI 世界
nei.options.keys.gui.bookmark=添加书签
nei.options.keys.world=世界
nei.options.keys.world.chunkoverlay=区块(chunks)边界显示
nei.options.keys.world.moboverlay=刷怪区域显示
nei.options.keys.world.highlight_tips=显示选中方块名称
@@ -119,44 +90,24 @@ nei.options.keys.world.creative=游戏模式
nei.options.keys.world.creative.tip=循环游戏模式
nei.options.inventory=物品栏
nei.options.inventory.bookmarks.worldSpecific=书签存储位置
nei.options.inventory.bookmarks.worldSpecific.true=存档内
nei.options.inventory.bookmarks.worldSpecific.false=全局
nei.options.inventory.bookmarks.enabled=显示/隐藏书签页
nei.options.inventory.bookmarks.enabled.true=显示
nei.options.inventory.bookmarks.enabled.false=隐藏
nei.options.inventory.guirecipe.jeiStyleTabs=JEI标签页
nei.options.inventory.guirecipe.jeiStyleTabs.true=是
nei.options.inventory.guirecipe.jeiStyleTabs.false=否 [不会吧]
nei.options.inventory.guirecipe.jeiStyleRecipeCatalyst=JEI风格可执行合成表机器显示[测试中]
nei.options.inventory.bookmarks.animation=REI风格书签动画
nei.options.inventory.bookmarks.animation.true=是
nei.options.inventory.bookmarks.animation.false=否
nei.options.inventory.bookmarks.showRecipeMarker=在书签栏显示合成产物标记
nei.options.inventory.bookmarks.showRecipeMarker.0=否
nei.options.inventory.showItemQuantityWidget=显示物品数量栏(右下角)
nei.options.inventory.showItemQuantityWidget.true=是
nei.options.inventory.showItemQuantityWidget.false=否
nei.options.inventory.bookmarks.ignorePotionOverlap=忽略书签与药水效果重叠
nei.options.inventory.bookmarks.ignorePotionOverlap.true=忽略
nei.options.inventory.bookmarks.ignorePotionOverlap.false=规避
nei.options.inventory.widgetsenabled.true=激活NEI
nei.options.inventory.widgetsenabled.false=禁用NEI
nei.options.inventory.cheatmode.0=合成模式
nei.options.inventory.cheatmode.1=实用模式
nei.options.inventory.cheatmode.2=作弊模式
nei.options.inventory.guirecipe.profile=合成查阅性能分析
nei.options.inventory.guirecipe.profile.true=开启
nei.options.inventory.guirecipe.profile.false=关闭
nei.options.inventory.layoutstyle=界面风格
nei.options.inventory.profileRecipes=合成查阅性能分析
nei.options.inventory.profileRecipes.true=开启
nei.options.inventory.profileRecipes.false=关闭
nei.options.inventory.itemsort=物品面板排序方式
nei.options.inventory.itemIDs=物品ID
nei.options.inventory.itemIDs.0=隐藏
nei.options.inventory.itemIDs.1=自动
nei.options.inventory.itemIDs.2=显示
nei.options.inventory.search.patternMode=搜索模式
nei.options.inventory.search.patternMode.0=简单
nei.options.inventory.search.patternMode.1=扩展
nei.options.inventory.search.patternMode.2=正则表达式
nei.options.inventory.searchmode=搜索模式
nei.options.inventory.searchmode.0=简单
nei.options.inventory.searchmode.1=扩展
nei.options.inventory.searchmode.2=正则表达式
nei.options.inventory.utilities=按钮
nei.options.inventory.utilities.tip=选择实用模式的功能
nei.options.inventory.utilities.time=时间
@@ -173,12 +124,6 @@ nei.options.inventory.gamemodes.tip=选择游戏模式循环调整时的选项
nei.options.inventory.gamemodes.creative=创造模式
nei.options.inventory.gamemodes.creative+=创造模式+
nei.options.inventory.gamemodes.adventure=冒险模式
nei.options.inventory.disableMouseScrollTransfer=禁用鼠标滚轮移动物品
nei.options.inventory.disableMouseScrollTransfer.true=开启
nei.options.inventory.disableMouseScrollTransfer.false=关闭
nei.options.inventory.invertMouseScrollTransfer=反转鼠标滚轮方向
nei.options.inventory.invertMouseScrollTransfer.true=开启
nei.options.inventory.invertMouseScrollTransfer.false=关闭
nei.options.command=指令
nei.options.command.creative=游戏模式
@@ -197,8 +142,6 @@ nei.options.world.highlight_tips.hide=隐藏
nei.options.world.highlight_tips.show=显示
nei.options.world.highlight_tips.sample=样本
nei.options.world.panels=面板布局
nei.options.tools=工具
nei.options.tools.dump=数据存储
nei.options.tools.dump.dump=存储
@@ -224,10 +167,9 @@ nei.options.tools.dump.itempanel.mode.2=Json
nei.options.tools.dump.itempanel.mode.3=PNG
nei.options.tools.dump.itempanel.icon.dumped=物品面板图标已保存到.minecraft/e%s
nei.options.tools.dump.itempanel.icon.cancelled=保存取消
nei.options.tools.dump.handlers=NEI预设
nei.options.tools.dump.handlers.dumped=预设(handlers)已存至 %s
nei.options.tools.dump.handlers.mode.0=CSV
nei.options.tools.dump.handlers.mode.1=Json
nei.layoutstyle.minecraft=Minecraft风格
nei.layoutstyle.oldtmi=老式TMI风格
nei.recipe.page=页数 %s/%s
nei.recipe.tooltip=合成表
@@ -235,12 +177,8 @@ nei.recipe.shaped=有序合成
nei.recipe.shapeless=无序合成
nei.recipe.furnace=烧制
nei.recipe.fuel=燃料
nei.recipe.fuel.smeltCount=可冶炼%s个物品
# Deprecated
nei.recipe.fuel.required=需要%s个
# Deprecated
nei.recipe.fuel.required=需要%s个
nei.recipe.fuel.processed=可烧制%s个
# Deprecated
nei.recipe.fuel.produced=可制作%s个
nei.recipe.firework=烟花
nei.recipe.firework.tooltip0=添加多种染料可增加烟火之星的颜色
@@ -43,27 +43,28 @@ nei.chat.rain.on=開啟雨雪
nei.chat.rain.off=關閉雨雪
nei.chat.time=白天 %d. %d:00
nei.chat.give.noitem=沒有此物品
nei.chat.chunkoverlay.0=Chunk Overlay: Off
nei.chat.chunkoverlay.1=Chunk Overlay: Chunk Corners
nei.chat.chunkoverlay.2=Chunk Overlay: Chunks
nei.chat.chunkoverlay.3=Chunk Overlay: GT Ore Veins
nei.options=NEI 選項
nei.options.back=後退
nei.options.world=世界
nei.options.global=全局
nei.options.global.tip.0=選項適用於所有世界
nei.options.global.tip.1=點擊旁邊的W可重寫該世界設置
nei.options.wbutton.tip.0=使用全局設定
nei.options.wbutton.tip.1=覆蓋全局設定
nei.options.keys=按鍵設定
nei.options.keys.gui=NEI 物品欄
nei.options.keys.recipe.recipe=合成表
nei.options.keys.recipe.usage=用途
nei.options.keys.gui=物品欄
nei.options.keys.gui.recipe=合成表
nei.options.keys.gui.usage=用途
nei.options.keys.gui.enchant=附魔
nei.options.keys.gui.potion=藥水
nei.options.keys.recipe.back=上一個合成表
nei.options.keys.gui.back=上一個合成表
nei.options.keys.gui.prev=上一頁
nei.options.keys.gui.next=下一頁
nei.options.keys.gui.hide=隱藏/顯示NEI界面
nei.options.keys.gui.search=焦點搜索欄
nei.options.keys.world=NEI 世界
nei.options.keys.world=世界
nei.options.keys.world.chunkoverlay=區塊邊界顯示
nei.options.keys.world.moboverlay=怪物生成區域顯示
nei.options.keys.world.highlight_tips=高亮工具提示
@@ -83,18 +84,18 @@ nei.options.inventory.cheatmode.0=合成模式
nei.options.inventory.cheatmode.1=實用模式
nei.options.inventory.cheatmode.2=作弊模式
nei.options.inventory.guirecipe.profile=合成查詢
nei.options.inventory.guirecipe.profile.true=開啟
nei.options.inventory.guirecipe.profile.false=關閉
nei.options.inventory.profileRecipes=合成查詢
nei.options.inventory.profileRecipes.true=開啟
nei.options.inventory.profileRecipes.false=關閉
nei.options.inventory.itemsort=物品面板排序方式
nei.options.inventory.itemIDs=物品ID
nei.options.inventory.itemIDs.0=隱藏
nei.options.inventory.itemIDs.1=自動
nei.options.inventory.itemIDs.2=顯示
nei.options.inventory.search.patternMode=搜索模式
nei.options.inventory.search.patternMode.0=簡單
nei.options.inventory.search.patternMode.1=擴展
nei.options.inventory.search.patternMode.2=正則表達式
nei.options.inventory.searchmode=搜索模式
nei.options.inventory.searchmode.0=簡單
nei.options.inventory.searchmode.1=擴展
nei.options.inventory.searchmode.2=正則表達式
nei.options.inventory.utilities=按鈕
nei.options.inventory.utilities.tip=選擇實用模式的功能
nei.options.inventory.utilities.time=時間
@@ -171,7 +172,7 @@ nei.recipe.profiler.crafting=合成查詢性能分析
nei.recipe.profiler.usage=用途查詢性能分析
nei.itemsort.minecraft=Minecraft
nei.itemsort.minecraft.tip=從原版物品開始排序
nei.itemsort.minecraft.tip=從原版物品開始排序
nei.itemsort.mod=Mod
nei.itemsort.mod.tip=將每一個mod分為一組,按照mod名稱排序
nei.itemsort.id=按物品ID排序
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

File renamed without changes.
+21
View File
@@ -0,0 +1,21 @@
[
{
"modid": "NotEnoughItems",
"name": "Not Enough Items",
"version": "${version}",
"mcversion": "${mc_version}",
"description": "Recipe Viewer, Inventory Manager, Item Spawner, Cheats and more; GTNH Version
<plugins>
Supporters: EmuCraft Team, Victor Zimmer, lexi85, Ace_Trainer_Tullius, Bacon_Donut, Iarinu",
"url": "http://www.minecraftforum.net/topic/909223",
"credits": "Alexandria - original idea",
"license": "LGPL-3.0",
"authorList": [ "ChickenBones", "mitchej123" ],
"dependencies": [
"CodeChickenCore"
]
}
]
+17 -24
View File
@@ -1,26 +1,19 @@
/*
* This settings file was auto generated by the Gradle buildInit task
* by 'sunstrike' at '21/11/13 14:14' with Gradle 1.9
*
* The settings file is used to specify which projects to include in your build.
* In a single project build this file can be empty or even removed.
*
* Detailed information about configuring a multi-project build in Gradle can be found
* in the user guide at http://gradle.org/docs/1.9/userguide/multi_project_builds.html
*/
pluginManagement {
repositories {
maven {
// RetroFuturaGradle
name "GTNH Maven"
url "https://nexus.gtnewhorizons.com/repository/public/"
mavenContent {
includeGroup("com.gtnewhorizons")
includeGroupByRegex("com\\.gtnewhorizons\\..+")
}
}
gradlePluginPortal()
mavenCentral()
mavenLocal()
}
}
plugins {
id 'com.gtnewhorizons.gtnhsettingsconvention' version '2.0.34'
}
rootProject.name = "NotEnoughItems"
/*
// To declare projects as part of a multi-project build use the 'include' method
include 'shared'
include 'api'
include 'services:webservice'
*/
rootProject.name = 'NotEnoughItems'
+174
View File
@@ -0,0 +1,174 @@
package codechicken.nei;
import codechicken.nei.util.NBTJson;
import com.google.gson.JsonParser;
import com.google.gson.JsonSyntaxException;
import cpw.mods.fml.common.registry.GameData;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import org.apache.commons.io.IOUtils;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/*
* TODO:
* 1) Bookmark button to toggle visibility
*/
public class BookmarkPanel extends ItemPanel {
public void init() {
super.init();
}
@Override
protected void setItems() {
realItems = _items;
}
public String getLabelText() {
return super.getLabelText() + " [" + realItems.size() + "]";
}
public void addOrRemoveItem(ItemStack item) {
ItemStack normalized = normalize(item);
if(!remove(normalized)) {
_items.add(normalized);
}
saveBookmarks();
}
public static NBTTagCompound itemStackToNBT(ItemStack stack, NBTTagCompound nbTag)
{
String strId = Item.itemRegistry.getNameForObject(stack.getItem());
nbTag.setString("strId", strId);
nbTag.setByte("Count", (byte)stack.stackSize);
nbTag.setShort("Damage", (short)stack.getItemDamage());
if (stack.stackTagCompound != null)
{
nbTag.setTag("tag", stack.stackTagCompound);
}
return nbTag;
}
public static ItemStack loadFromNBT(NBTTagCompound nbtTag)
{
if (!nbtTag.hasKey("id")) {
final short id = (short)GameData.getItemRegistry().getId(nbtTag.getString("strId"));
nbtTag.setShort("id", id);
}
ItemStack stack = ItemStack.loadItemStackFromNBT(nbtTag);
return stack;
}
public void saveBookmarks() {
List<String> strings = new ArrayList<>();
for (ItemStack item:_items) {
strings.add(NBTJson.toJson(itemStackToNBT(item, new NBTTagCompound())));
}
File file = NEIClientConfig.bookmarkFile;
if(file != null) {
try(FileWriter writer = new FileWriter(file)) {
IOUtils.writeLines(strings, "\n", writer);
} catch (IOException e) {
NEIClientConfig.logger.error("Filed to save bookmarks list to file {}", file, e);
}
}
}
public void loadBookmarks() {
File file = NEIClientConfig.bookmarkFile;
if (file == null || !file.exists()) {
return;
}
List<String> itemStrings;
try (FileReader reader = new FileReader(file)) {
NEIClientConfig.logger.info("Loading bookmarks from file {}", file);
itemStrings = IOUtils.readLines(reader);
} catch (IOException e) {
NEIClientConfig.logger.error("Failed to load bookmarks from file {}", file, e);
return;
}
_items.clear();
JsonParser parser = new JsonParser();
for (String itemStr: itemStrings) {
try {
NBTTagCompound itemStackNBT = (NBTTagCompound) NBTJson.toNbt(parser.parse(itemStr));
ItemStack itemStack = loadFromNBT(itemStackNBT);
if (itemStack != null) {
_items.add(itemStack);
} else {
NEIClientConfig.logger.warn("Failed to load bookmarked ItemStack from json string, the item no longer exists:\n{}", itemStr);
}
} catch (IllegalArgumentException | JsonSyntaxException e) {
NEIClientConfig.logger.error("Failed to load bookmarked ItemStack from json string:\n{}", itemStr);
}
}
}
protected ItemStack normalize(ItemStack item) {
ItemStack copy = item.copy();
copy.stackSize = 1;
return copy;
}
private boolean remove(ItemStack item) {
int i = 0;
for (ItemStack existing : _items) {
if (existing == item || existing.isItemEqual(item)) {
_items.remove(i);
return true;
}
i++;
}
return false;
}
@Override
public int getX(GuiContainer gui) {
return 5;
}
@Override
public int getMarginLeft() {
return 5;
}
@Override
public int getButtonTop() {
LayoutStyleMinecraft layout = (LayoutStyleMinecraft)LayoutManager.getLayoutStyle();
return 2 + (((int)Math.ceil((double)layout.buttonCount / layout.numButtons)) * 18);
}
@Override
public int getNextX(GuiContainer gui) {
return gui.width - prev.w - 2 - ((gui.xSize + gui.width) /2 + 2) - 16;
}
@Override
public int getPrevX(GuiContainer gui) {
return 2;
}
@Override
public int getPageX(GuiContainer gui) {
return gui.guiLeft * 3 / 2 + gui.xSize + 1 - ((gui.xSize + gui.width) / 2 + 2) - 16;
}
public int getHightAdjustment() {
return 0;
}
public int getWidth(GuiContainer gui) {
return LayoutManager.getLeftSize(gui) - ( (gui.xSize + gui.width) / 2 + 3 ) - 16;
}
}
@@ -1,11 +1,11 @@
package codechicken.nei;
import static codechicken.lib.gui.GuiDraw.getStringWidth;
import java.util.List;
public abstract class Button extends Widget {
import static codechicken.lib.gui.GuiDraw.getStringWidth;
public abstract class Button extends Widget
{
public Button(String s) {
label = s;
}
@@ -15,7 +15,7 @@ public abstract class Button extends Widget {
}
public int contentWidth() {
return getRenderIcon() == null ? getStringWidth(getRenderLabel()) : getRenderIcon().width;
return getRenderIcon() == null ? getStringWidth(label) : getRenderIcon().width;
}
@Override
@@ -25,7 +25,9 @@ public abstract class Button extends Widget {
@Override
public boolean handleClick(int mx, int my, int button) {
if (button == 1 || button == 0) if (onButtonPress(button == 1)) NEIClientUtils.playClickSound();
if (button == 1 || button == 0)
if (onButtonPress(button == 1))
NEIClientUtils.playClickSound();
return true;
}
@@ -37,35 +39,36 @@ public abstract class Button extends Widget {
@Override
public List<String> handleTooltip(int mx, int my, List<String> tooltip) {
if (!contains(mx, my)) return tooltip;
if (!contains(mx, my))
return tooltip;
final String tip = getButtonTip();
if (tip != null) tooltip.add(tip);
if (tip != null)
tooltip.add(tip);
addTooltips(tooltip);
return tooltip;
}
public String getButtonTip() {
return null;
}
public void addTooltips(List<String> tooltip) {}
public void addTooltips(List<String> tooltip) {}
public String getRenderLabel() {
return label;
}
public int getRenderLabelColor() {
return 0;
}
public final String label;
public Image icon;
/**
* 0x4 = state flag, as opposed to 1 click 0 = normal 1 = on 2 = disabled
* 0x4 = state flag, as opposed to 1 click
* 0 = normal
* 1 = on
* 2 = disabled
*/
public int state;
}
@@ -1,21 +1,20 @@
package codechicken.nei;
public abstract class ButtonCycled extends Button {
public abstract class ButtonCycled extends Button
{
public ButtonCycled() {}
public ButtonCycled(int num) {
icons = new Image[num];
init();
}
@Override
public Image getRenderIcon() {
public Image getRenderIcon()
{
return icons[index];
}
public void init() {}
public int index;
public Image[] icons;
}
+230
View File
@@ -0,0 +1,230 @@
package codechicken.nei;
import codechicken.core.ClientUtils;
import codechicken.core.GuiModListScroll;
import codechicken.lib.packet.PacketCustom;
import codechicken.nei.api.API;
import codechicken.nei.api.ItemInfo;
import cpw.mods.fml.client.CustomModLoadingErrorDisplayException;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import cpw.mods.fml.common.gameevent.TickEvent.Phase;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiErrorScreen;
import net.minecraft.client.gui.GuiMainMenu;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiSelectWorld;
import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.common.MinecraftForge;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ClientHandler
{
private static ClientHandler instance;
private ArrayList<EntityItem> SMPmagneticItems = new ArrayList<>();
private World lastworld;
private GuiScreen lastGui;
public void addSMPMagneticItem(int i, World world) {
WorldClient cworld = (WorldClient) world;
Entity e = cworld.getEntityByID(i);
if (!(e instanceof EntityItem)) {
return;
}
SMPmagneticItems.add((EntityItem) e);
}
private void updateMagnetMode(World world, EntityPlayerSP player) {
if (!NEIClientConfig.getMagnetMode()) return;
float distancexz = 16;
float distancey = 8;
double maxspeedxz = 0.5;
double maxspeedy = 0.5;
double speedxz = 0.05;
double speedy = 0.07;
List<EntityItem> items;
if (world.isRemote) {
items = SMPmagneticItems;
} else {
items = world.getEntitiesWithinAABB(EntityItem.class, player.boundingBox.expand(distancexz, distancey, distancexz));
}
for (Iterator<EntityItem> iterator = items.iterator(); iterator.hasNext(); ) {
EntityItem item = iterator.next();
if (item.delayBeforeCanPickup > 0) continue;
if (item.isDead && world.isRemote) iterator.remove();
if (!NEIClientUtils.canItemFitInInventory(player, item.getEntityItem())) continue;
double dx = player.posX - item.posX;
double dy = player.posY + player.getEyeHeight() - item.posY;
double dz = player.posZ - item.posZ;
double absxz = Math.sqrt(dx * dx + dz * dz);
double absy = Math.abs(dy);
if (absxz > distancexz) {
continue;
}
if (absxz > 1) {
dx /= absxz;
dz /= absxz;
}
if (absy > 1) {
dy /= absy;
}
double vx = item.motionX + speedxz * dx;
double vy = item.motionY + speedy * dy;
double vz = item.motionZ + speedxz * dz;
double absvxz = Math.sqrt(vx * vx + vz * vz);
double absvy = Math.abs(vy);
double rationspeedxz = absvxz / maxspeedxz;
if (rationspeedxz > 1) {
vx /= rationspeedxz;
vz /= rationspeedxz;
}
double rationspeedy = absvy / maxspeedy;
if (rationspeedy > 1) {
vy /= rationspeedy;
}
if (absvxz < 0.2 && absxz < 0.2 && world.isRemote) {
item.setDead();
}
item.setVelocity(vx, vy, vz);
}
}
public static void preInit() {
ItemInfo.preInit();
}
public static void load() {
instance = new ClientHandler();
GuiModListScroll.register("NotEnoughItems");
PacketCustom.assignHandler(NEICPH.channel, new NEICPH());
FMLCommonHandler.instance().bus().register(instance);
MinecraftForge.EVENT_BUS.register(instance);
API.registerHighlightHandler(new DefaultHighlightHandler(), ItemInfo.Layout.HEADER);
HUDRenderer.load();
WorldOverlayRenderer.load();
}
@SubscribeEvent
public void tickEvent(TickEvent.ClientTickEvent event) {
if(event.phase == Phase.END)
return;
Minecraft mc = Minecraft.getMinecraft();
if(mc.theWorld != null) {
loadWorld(mc.theWorld, false);
if (!NEIClientConfig.isEnabled())
return;
KeyManager.tickKeyStates();
NEIController.updateUnlimitedItems(mc.thePlayer.inventory);
if (mc.currentScreen == null)
NEIController.processCreativeCycling(mc.thePlayer.inventory);
updateMagnetMode(mc.theWorld, mc.thePlayer);
}
GuiScreen gui = mc.currentScreen;
if (gui != lastGui) {
if (gui instanceof GuiMainMenu)
lastworld = null;
else if (gui instanceof GuiSelectWorld)
NEIClientConfig.reloadSaves();
}
lastGui = gui;
}
@SubscribeEvent
public void tickEvent(TickEvent.RenderTickEvent event) {
if(event.phase == Phase.END && NEIClientConfig.isEnabled())
HUDRenderer.renderOverlay();
}
@SubscribeEvent
public void renderLastEvent(RenderWorldLastEvent event) {
if (NEIClientConfig.isEnabled())
WorldOverlayRenderer.render(event.partialTicks);
}
public void loadWorld(World world, boolean fromServer) {
if (world != lastworld) {
SMPmagneticItems.clear();
WorldOverlayRenderer.reset();
if (!fromServer) {
NEIClientConfig.setHasSMPCounterPart(false);
NEIClientConfig.setInternalEnabled(false);
if (!Minecraft.getMinecraft().isSingleplayer())//wait for server to initiate in singleplayer
NEIClientConfig.loadWorld("remote/" + ClientUtils.getServerIP().replace(':', '~'));
}
lastworld = world;
}
}
public static ClientHandler instance() {
return instance;
}
public static RuntimeException throwCME(final String message) {
final GuiScreen errorGui = new GuiErrorScreen(null, null)
{
@Override
public void handleMouseInput() {}
@Override
public void handleKeyboardInput() {}
@Override
public void drawScreen(int par1, int par2, float par3) {
drawDefaultBackground();
String[] s_msg = message.split("\n");
for (int i = 0; i < s_msg.length; ++i)
drawCenteredString(fontRendererObj, s_msg[i], width / 2, height / 3 + 12 * i, 0xFFFFFFFF);
}
};
@SuppressWarnings("serial")
CustomModLoadingErrorDisplayException e = new CustomModLoadingErrorDisplayException()
{
@Override
public void initGui(GuiErrorScreen errorScreen, FontRenderer fontRenderer) {
Minecraft.getMinecraft().displayGuiScreen(errorGui);
}
@Override
public void drawScreen(GuiErrorScreen errorScreen, FontRenderer fontRenderer, int mouseRelX, int mouseRelY, float tickTime) {}
};
throw e;
}
}
@@ -1,5 +1,7 @@
package codechicken.nei;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
@@ -9,13 +11,10 @@ import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class ContainerCreativeInv extends Container {
private class SlotArmor extends Slot {
public class ContainerCreativeInv extends Container
{
private class SlotArmor extends Slot
{
final int armorType;
public SlotArmor(IInventory inv, int x, int y, int slot, int armor) {
@@ -40,16 +39,15 @@ public class ContainerCreativeInv extends Container {
}
}
private class SlotBlockArmor extends SlotArmor {
private class SlotBlockArmor extends SlotArmor
{
public SlotBlockArmor(IInventory inv, int x, int y, int slot, int armor) {
super(inv, x, y, slot, armor);
}
@Override
public boolean isItemValid(ItemStack stack) {
return super.isItemValid(stack) || stack != null; // && Block.getBlockFromItem(stack.getItem()) !=
// Blocks.air;
return super.isItemValid(stack) || stack != null;// && Block.getBlockFromItem(stack.getItem()) != Blocks.air;
}
}
@@ -58,34 +56,33 @@ public class ContainerCreativeInv extends Container {
public ContainerCreativeInv(EntityPlayer player, ExtendedCreativeInv extraInv) {
this.player = player;
InventoryPlayer invPlayer = player.inventory;
for (int row = 0; row < 6; row++) for (int col = 0; col < 9; col++)
addSlotToContainer(new Slot(extraInv, col + row * 9, 8 + col * 18, 5 + row * 18));
for (int row = 0; row < 6; row++)
for (int col = 0; col < 9; col++)
addSlotToContainer(new Slot(extraInv, col + row * 9, 8 + col * 18, 5 + row * 18));
for (int row = 0; row < 3; ++row) for (int col = 0; col < 9; ++col)
addSlotToContainer(new Slot(invPlayer, col + row * 9 + 9, 8 + col * 18, 118 + row * 18));
for (int row = 0; row < 3; ++row)
for (int col = 0; col < 9; ++col)
addSlotToContainer(new Slot(invPlayer, col + row * 9 + 9, 8 + col * 18, 118 + row * 18));
for (int col = 0; col < 9; ++col) addSlotToContainer(new Slot(invPlayer, col, 8 + col * 18, 176));
for (int col = 0; col < 9; ++col)
addSlotToContainer(new Slot(invPlayer, col, 8 + col * 18, 176));
addSlotToContainer(new SlotBlockArmor(invPlayer, invPlayer.getSizeInventory() - 1, -15, 23, 0));
for (int armorType = 1; armorType < 4; armorType++) addSlotToContainer(
new SlotArmor(
invPlayer,
invPlayer.getSizeInventory() - 1 - armorType,
-15,
23 + armorType * 18,
armorType));
for (int armorType = 1; armorType < 4; armorType++)
addSlotToContainer(new SlotArmor(invPlayer, invPlayer.getSizeInventory() - 1 - armorType, -15, 23 + armorType * 18, armorType));
}
@Override
public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int slotIndex) {
ItemStack transferredStack = null;
Slot slot = inventorySlots.get(slotIndex);
Slot slot = (Slot) inventorySlots.get(slotIndex);
if (slot != null && slot.getHasStack()) {
ItemStack stack = slot.getStack();
transferredStack = stack.copy();
if (stack.getItem() instanceof ItemArmor armor) {
if (stack.getItem() instanceof ItemArmor) {
ItemArmor armor = (ItemArmor) stack.getItem();
if (!getSlot(90 + armor.armorType).getHasStack()) {
getSlot(90 + armor.armorType).putStack(transferredStack);
slot.putStack(null);
@@ -94,13 +91,16 @@ public class ContainerCreativeInv extends Container {
}
if (slotIndex < 54) {
if (!this.mergeItemStack(stack, 54, 90, true)) return null;
if (!this.mergeItemStack(stack, 54, 90, true))
return null;
} else if (!this.mergeItemStack(stack, 0, 54, false)) {
return null;
}
if (stack.stackSize == 0) slot.putStack(null);
else slot.onSlotChanged();
if (stack.stackSize == 0)
slot.putStack(null);
else
slot.onSlotChanged();
}
return transferredStack;
@@ -1,29 +1,28 @@
package codechicken.nei;
import java.util.ArrayList;
import codechicken.lib.render.CCRenderState;
import net.minecraft.client.gui.Gui;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.ContainerEnchantment;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.world.World;
import org.lwjgl.opengl.GL11;
import codechicken.lib.render.CCRenderState;
import java.util.ArrayList;
/**
* This is crap code, don't ever do this.
*/
public class ContainerEnchantmentModifier extends ContainerEnchantment {
public static class EnchantmentHash {
public class ContainerEnchantmentModifier extends ContainerEnchantment
{
public static class EnchantmentHash
{
public EnchantmentHash(Enchantment e, int i, int l) {
enchantment = e;
state = i;
@@ -105,11 +104,10 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment {
int barempty = height - getScrollBarHeight();
int sbary = rely + (int) (barempty * percentscrolled + 0.5);
if (button == 0 && getScrollBarHeight() < height && // the scroll bar can move (not full length)
mousex >= relx + cwidth
&& mousex < relx + cwidth + getScrollBarWidth()
&& mousey >= rely
&& mousey < rely + height) // in the scroll pane
if (button == 0 &&
getScrollBarHeight() < height && //the scroll bar can move (not full length)
mousex >= relx + cwidth && mousex < relx + cwidth + getScrollBarWidth() &&
mousey >= rely && mousey < rely + height)//in the scroll pane
{
if (mousey < sbary) {
percentscrolled = (mousey - rely) / (float) barempty;
@@ -128,7 +126,7 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment {
}
public void mouseUp(int mousex, int mousey, int button) {
if (scrollclicky >= 0 && button == 0) // we were scrolling and we released mouse
if (scrollclicky >= 0 && button == 0)//we were scrolling and we released mouse
{
scrollclicky = -1;
}
@@ -137,7 +135,8 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment {
public boolean clickButton(int mousex, int mousey, int button) {
mousex -= parentscreen.guiLeft;
mousey -= parentscreen.guiTop;
if (mousex >= relx && mousex < relx + cwidth && mousey >= rely && mousey <= rely + height) // in the box
if (mousex >= relx && mousex < relx + cwidth &&
mousey >= rely && mousey <= rely + height)//in the box
{
int slot = getClickedSlot(mousey);
if (slot >= getNumSlots()) return false;
@@ -163,22 +162,24 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment {
public boolean addEnchantment(int e, int level) {
if (e < Enchantment.enchantmentsList.length && Enchantment.enchantmentsList[e] != null) {
inventorySlots.get(0).getStack().addEnchantment(Enchantment.enchantmentsList[e], level);
((Slot) inventorySlots.get(0)).getStack().addEnchantment(Enchantment.enchantmentsList[e], level);
return true;
}
return false;
}
public void removeEnchantment(int e) {
ItemStack stack = inventorySlots.get(0).getStack();
ItemStack stack = ((Slot) inventorySlots.get(0)).getStack();
NBTTagList nbttaglist = stack.getEnchantmentTagList();
if (nbttaglist != null) {
for (int i = 0; i < nbttaglist.tagCount(); i++) {
int ID = nbttaglist.getCompoundTagAt(i).getShort("id");
if (ID == e) {
nbttaglist.removeTag(i);
if (nbttaglist.tagCount() == 0) stack.getTagCompound().removeTag("ench");
if (stack.getTagCompound().hasNoTags()) stack.setTagCompound(null);
if (nbttaglist.tagCount() == 0)
stack.getTagCompound().removeTag("ench");
if (stack.getTagCompound().hasNoTags())
stack.setTagCompound(null);
return;
}
}
@@ -190,7 +191,8 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment {
}
public void onCraftMatrixChanged(IInventory iinventory) {
if (parentscreen != null) updateEnchantmentOptions(GuiEnchantmentModifier.validateEnchantments());
if (parentscreen != null)
updateEnchantmentOptions(GuiEnchantmentModifier.validateEnchantments());
}
public void updateEnchantmentOptions(boolean validate) {
@@ -219,10 +221,9 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment {
if (NEIServerUtils.stackHasEnchantment(toolstack, e.effectId)) {
state = 2;
level = NEIServerUtils.getEnchantmentLevel(toolstack, e.effectId);
} else
if (NEIServerUtils.doesEnchantmentConflict(NEIServerUtils.getEnchantments(toolstack), e) && validate) {
state = 1;
}
} else if (NEIServerUtils.doesEnchantmentConflict(NEIServerUtils.getEnchantments(toolstack), e) && validate) {
state = 1;
}
slotEnchantment.add(new EnchantmentHash(e, state, level));
}
if (numoptions != slotEnchantment.size()) {
@@ -256,28 +257,10 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment {
CCRenderState.changeTexture("textures/gui/container/enchanting_table.png");
GL11.glColor3f(1, 1, 1);
if (hasScrollBar()) {
gui.drawTexturedModalRect(
relx,
rely + slot * slotheight,
0,
gui.ySize + slotheight * shade,
cwidth - 30,
slotheight);
gui.drawTexturedModalRect(
relx + cwidth - 30,
rely + slot * slotheight,
cwidth - 23,
gui.ySize + slotheight * shade,
30,
slotheight);
gui.drawTexturedModalRect(relx, rely + slot * slotheight, 0, gui.ySize + slotheight * shade, cwidth - 30, slotheight);
gui.drawTexturedModalRect(relx + cwidth - 30, rely + slot * slotheight, cwidth - 23, gui.ySize + slotheight * shade, 30, slotheight);
} else {
gui.drawTexturedModalRect(
relx,
rely + slot * slotheight,
0,
gui.ySize + slotheight * shade,
cwidth + 7,
slotheight);
gui.drawTexturedModalRect(relx, rely + slot * slotheight, 0, gui.ySize + slotheight * shade, cwidth + 7, slotheight);
}
gui.getFontRenderer().drawString(text, relx + 4, rely + slot * slotheight + 5, textColourFromState(shade));
@@ -294,32 +277,18 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment {
int sbary = rely + (int) ((height - getScrollBarHeight()) * percentscrolled + 0.5);
int sbarx = relx + cwidth;
Gui.drawRect(sbarx, rely, sbarx + getScrollBarWidth(), rely + height, 0xFF202020); // background
Gui.drawRect(sbarx, sbary, sbarx + getScrollBarWidth(), sbary + getScrollBarHeight(), 0xFF8B8B8B); // corners
Gui.drawRect(sbarx, sbary, sbarx + getScrollBarWidth() - 1, sbary + getScrollBarHeight() - 1, 0xFFF0F0F0); // topleft
// up
Gui.drawRect(
sbarx + 1,
sbary + 1,
sbarx + getScrollBarWidth() - 1,
sbary + getScrollBarHeight() - 1,
0xFF555555); // bottom right down
Gui.drawRect(
sbarx + 1,
sbary + 1,
sbarx + getScrollBarWidth() - 2,
sbary + getScrollBarHeight() - 2,
0xFFC6C6C6); // scrollbar
Gui.drawRect(sbarx, rely, sbarx + getScrollBarWidth(), rely + height, 0xFF202020);//background
Gui.drawRect(sbarx, sbary, sbarx + getScrollBarWidth(), sbary + getScrollBarHeight(), 0xFF8B8B8B);//corners
Gui.drawRect(sbarx, sbary, sbarx + getScrollBarWidth() - 1, sbary + getScrollBarHeight() - 1, 0xFFF0F0F0);//topleft up
Gui.drawRect(sbarx + 1, sbary + 1, sbarx + getScrollBarWidth() - 1, sbary + getScrollBarHeight() - 1, 0xFF555555);//bottom right down
Gui.drawRect(sbarx + 1, sbary + 1, sbarx + getScrollBarWidth() - 2, sbary + getScrollBarHeight() - 2, 0xFFC6C6C6);//scrollbar
}
private int textColourFromState(int shade) {
switch (shade) {
case 0:
return 0x685e4a;
case 1:
return 0x407f10;
default:
return 0xffff80;
switch(shade) {
case 0: return 0x685e4a;
case 1: return 0x407f10;
default: return 0xffff80;
}
}
@@ -1,5 +1,10 @@
package codechicken.nei;
import codechicken.lib.inventory.ContainerExtended;
import codechicken.lib.inventory.InventoryNBT;
import codechicken.lib.inventory.InventoryUtils;
import codechicken.lib.inventory.SlotHandleClicks;
import codechicken.lib.packet.PacketCustom;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.IInventory;
@@ -11,16 +16,10 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.potion.PotionEffect;
import codechicken.lib.inventory.ContainerExtended;
import codechicken.lib.inventory.InventoryNBT;
import codechicken.lib.inventory.InventoryUtils;
import codechicken.lib.inventory.SlotHandleClicks;
import codechicken.lib.packet.PacketCustom;
public class ContainerPotionCreator extends ContainerExtended {
public class SlotPotion extends Slot {
public class ContainerPotionCreator extends ContainerExtended
{
public class SlotPotion extends Slot
{
public SlotPotion(IInventory inv, int slotIndex, int x, int y) {
super(inv, slotIndex, x, y);
}
@@ -35,15 +34,16 @@ public class ContainerPotionCreator extends ContainerExtended {
super.onSlotChanged();
if (getHasStack()) {
ItemStack stack = getStack();
if (!stack.hasTagCompound()) stack.setTagCompound(new NBTTagCompound());
if (!stack.hasTagCompound())
stack.setTagCompound(new NBTTagCompound());
if (!stack.getTagCompound().hasKey("CustomPotionEffects"))
stack.getTagCompound().setTag("CustomPotionEffects", new NBTTagList());
}
}
}
public class SlotPotionStore extends SlotHandleClicks {
public class SlotPotionStore extends SlotHandleClicks
{
public SlotPotionStore(IInventory inv, int slotIndex, int x, int y) {
super(inv, slotIndex, x, y);
}
@@ -60,7 +60,8 @@ public class ContainerPotionCreator extends ContainerExtended {
putStack(InventoryUtils.copyStack(held, 1));
player.inventory.setItemStack(null);
}
} else if (getHasStack()) player.inventory.setItemStack(getStack());
} else if (getHasStack())
player.inventory.setItemStack(getStack());
return null;
}
@@ -71,8 +72,8 @@ public class ContainerPotionCreator extends ContainerExtended {
}
}
public static class InventoryPotionStore extends InventoryNBT {
public static class InventoryPotionStore extends InventoryNBT
{
public InventoryPotionStore() {
super(9, NEIClientConfig.global.nbt.getCompoundTag("potionStore"));
}
@@ -81,6 +82,7 @@ public class ContainerPotionCreator extends ContainerExtended {
public void markDirty() {
super.markDirty();
NEIClientConfig.global.nbt.setTag("potionStore", tag);
NEIClientConfig.global.saveNBT();
}
}
@@ -94,13 +96,15 @@ public class ContainerPotionCreator extends ContainerExtended {
this.potionStoreInv = potionStoreInv;
addSlotToContainer(new SlotPotion(potionInv, 0, 25, 102));
for (int i = 0; i < 9; i++) addSlotToContainer(new SlotPotionStore(potionStoreInv, i, 8 + i * 18, 14));
for (int i = 0; i < 9; i++)
addSlotToContainer(new SlotPotionStore(potionStoreInv, i, 8 + i * 18, 14));
bindPlayerInventory(inventoryPlayer, 8, 125);
}
@Override
public boolean doMergeStackAreas(int slotIndex, ItemStack stack) {
if (slotIndex < 10) return mergeItemStack(stack, 10, 46, true);
if (slotIndex < 10)
return mergeItemStack(stack, 10, 46, true);
return mergeItemStack(stack, 0, 1, false);
}
@@ -113,27 +117,30 @@ public class ContainerPotionCreator extends ContainerExtended {
public void onContainerClosed(EntityPlayer player) {
super.onContainerClosed(player);
if (!player.worldObj.isRemote) InventoryUtils.dropOnClose(player, potionInv);
if (!player.worldObj.isRemote)
InventoryUtils.dropOnClose(player, potionInv);
}
@SuppressWarnings("unchecked")
@Override
public void handleServerPacket(PacketCustom packet) {
ItemStack potion = potionInv.getStackInSlot(0);
if (potion == null) return;
if (potion == null)
return;
boolean add = packet.getType() == 3;
int effectID = packet.readUByte();
NBTTagList effects = potion.getTagCompound().getTagList("CustomPotionEffects", 10);
NBTTagList newEffects = new NBTTagList();
for (int i = 0; i < effects.tagCount(); i++) {
for(int i = 0; i < effects.tagCount(); i++) {
NBTTagCompound tag = effects.getCompoundTagAt(i);
PotionEffect e = PotionEffect.readCustomPotionEffectFromNBT(tag);
if (e.getPotionID() != effectID) newEffects.appendTag(tag);
if(e.getPotionID() != effectID)
newEffects.appendTag(tag);
}
if (add) newEffects.appendTag(
new PotionEffect(effectID, packet.readInt(), packet.readUByte())
.writeCustomPotionEffectToNBT(new NBTTagCompound()));
if(add)
newEffects.appendTag(new PotionEffect(effectID, packet.readInt(), packet.readUByte()).writeCustomPotionEffectToNBT(new NBTTagCompound()));
potion.getTagCompound().setTag("CustomPotionEffects", newEffects);
}
@@ -150,4 +157,4 @@ public class ContainerPotionCreator extends ContainerExtended {
packet.writeByte(effectID);
packet.sendToServer();
}
}
}
@@ -1,34 +1,35 @@
package codechicken.nei;
import java.util.List;
import codechicken.nei.api.IHighlightHandler;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.guihook.GuiContainerManager;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.World;
import codechicken.nei.api.IHighlightHandler;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.guihook.GuiContainerManager;
public class DefaultHighlightHandler implements IHighlightHandler {
import java.util.List;
public class DefaultHighlightHandler implements IHighlightHandler
{
@Override
public List<String> handleTextData(ItemStack stack, World world, EntityPlayer player, MovingObjectPosition mop,
List<String> currenttip, ItemInfo.Layout layout) {
public List<String> handleTextData(ItemStack stack, World world, EntityPlayer player, MovingObjectPosition mop, List<String> currenttip, ItemInfo.Layout layout) {
String name = null;
try {
String s = GuiContainerManager.itemDisplayNameShort(stack);
if (!s.endsWith("Unnamed")) name = s;
if (s != null && !s.endsWith("Unnamed"))
name = s;
if (name != null) currenttip.add(name);
if (name != null)
currenttip.add(name);
} catch (Exception ignored) {}
if (name != null && stack.getItem() == Items.redstone) {
int md = world.getBlockMetadata(mop.blockX, mop.blockY, mop.blockZ);
String s = "" + md;
if (s.length() < 2) s = " " + s;
if (s.length() < 2)
s = " " + s;
currenttip.set(currenttip.size() - 1, name + " " + s);
}
@@ -1,13 +1,12 @@
package codechicken.nei;
import cpw.mods.fml.relauncher.Side;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.relauncher.Side;
public class ExtendedCreativeInv implements IInventory {
public class ExtendedCreativeInv implements IInventory
{
final PlayerSave playerSave;
final Side side;
@@ -23,7 +22,8 @@ public class ExtendedCreativeInv implements IInventory {
@Override
public ItemStack getStackInSlot(int slot) {
if (side.isClient()) return NEIClientConfig.creativeInv[slot];
if (side.isClient())
return NEIClientConfig.creativeInv[slot];
return playerSave.creativeInv[slot];
}
@@ -58,8 +58,10 @@ public class ExtendedCreativeInv implements IInventory {
@Override
public void setInventorySlotContents(int slot, ItemStack stack) {
if (side.isClient()) NEIClientConfig.creativeInv[slot] = stack;
else playerSave.creativeInv[slot] = stack;
if (side.isClient())
NEIClientConfig.creativeInv[slot] = stack;
else
playerSave.creativeInv[slot] = stack;
markDirty();
}
@@ -76,7 +78,8 @@ public class ExtendedCreativeInv implements IInventory {
@Override
public void markDirty() {
if (side.isServer()) playerSave.setCreativeDirty();
if (side.isServer())
playerSave.setCreativeDirty();
}
@Override
@@ -85,10 +88,12 @@ public class ExtendedCreativeInv implements IInventory {
}
@Override
public void openInventory() {}
public void openInventory() {
}
@Override
public void closeInventory() {}
public void closeInventory() {
}
@Override
public boolean isItemValidForSlot(int slot, ItemStack stack) {
@@ -99,4 +104,5 @@ public class ExtendedCreativeInv implements IInventory {
public boolean hasCustomInventoryName() {
return true;
}
}
@@ -1,30 +1,27 @@
package codechicken.nei;
import static codechicken.nei.NEIServerUtils.areStacksIdentical;
import static codechicken.nei.NEIServerUtils.areStacksSameType;
import static codechicken.nei.NEIServerUtils.copyStack;
import codechicken.nei.guihook.GuiContainerManager;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import codechicken.nei.guihook.GuiContainerManager;
public class FastTransferManager {
import static codechicken.nei.NEIServerUtils.areStacksIdentical;
import static codechicken.nei.NEIServerUtils.areStacksSameType;
import static codechicken.nei.NEIServerUtils.copyStack;
public class FastTransferManager
{
/**
* Based on the general assumption that we want to fill top to bottom, left to right
*/
public static class SlotPositionComparator implements Comparator<Integer> {
public static class SlotPositionComparator implements Comparator<Integer>
{
final Container container;
public SlotPositionComparator(Container c) {
@@ -50,7 +47,8 @@ public class FastTransferManager {
stack.stackSize = 1;
for (int slotNo = 0; slotNo < container.inventorySlots.size(); slotNo++) {
if (slotZoneMap.containsKey(slotNo) || !container.getSlot(slotNo).isItemValid(stack)) continue;
if (slotZoneMap.containsKey(slotNo) || !container.getSlot(slotNo).isItemValid(stack))
continue;
HashSet<Integer> connectedSlots = new HashSet<>();
findConnectedSlots(container, slotNo, connectedSlots);
@@ -71,11 +69,11 @@ public class FastTransferManager {
final int threshold = 18;
for (int i = 0; i < container.inventorySlots.size(); i++) {
if (connectedSlots.contains(i)) continue;
if (connectedSlots.contains(i))
continue;
Slot slot1 = container.getSlot(i);
if (Math.abs(slot.xDisplayPosition - slot1.xDisplayPosition) <= threshold
&& Math.abs(slot.yDisplayPosition - slot1.yDisplayPosition) <= threshold) {
if (Math.abs(slot.xDisplayPosition - slot1.xDisplayPosition) <= threshold && Math.abs(slot.yDisplayPosition - slot1.yDisplayPosition) <= threshold) {
findConnectedSlots(container, i, connectedSlots);
}
}
@@ -84,14 +82,15 @@ public class FastTransferManager {
public static int findSlotWithItem(Container container, ItemStack teststack) {
for (int slotNo = 0; slotNo < container.inventorySlots.size(); slotNo++) {
ItemStack stack = container.getSlot(slotNo).getStack();
if (areStacksSameType(stack, teststack)) return slotNo;
if (areStacksSameType(stack, teststack))
return slotNo;
}
return -1;
}
public static void clearSlots(Container container) {
for (int slotNo = 0; slotNo < container.inventorySlots.size(); slotNo++)
container.inventorySlots.get(slotNo).putStack(null);
((Slot) container.inventorySlots.get(slotNo)).putStack(null);
}
public void performMassTransfer(GuiContainer window, int fromSlot, int toSlot, ItemStack heldStack) {
@@ -100,16 +99,20 @@ public class FastTransferManager {
Integer fromZone = slotZoneMap.get(fromSlot);
Integer toZone = slotZoneMap.get(toSlot);
if (fromZone == null || toZone == null || fromZone.equals(toZone)) return;
if (fromZone == null || toZone == null || fromZone.equals(toZone))
return;
if (NEIClientUtils.getHeldItem() != null && !areStacksSameType(heldStack, NEIClientUtils.getHeldItem())) return;
if (NEIClientUtils.getHeldItem() != null && !areStacksSameType(heldStack, NEIClientUtils.getHeldItem()))
return;
if (!fillZoneWithHeldItem(window, toZone)) return;
if (!fillZoneWithHeldItem(window, toZone))
return;
for (int transferFrom : slotZones.get(fromZone)) {
ItemStack transferStack = window.inventorySlots.getSlot(transferFrom).getStack();
if (!areStacksSameType(heldStack, transferStack)) continue;
if (!areStacksSameType(heldStack, transferStack))
continue;
clickSlot(window, transferFrom);
if (!fillZoneWithHeldItem(window, toZone)) {
@@ -127,7 +130,8 @@ public class FastTransferManager {
Slot slot = container.getSlot(fromSlot);
ItemStack stack = slot.getStack();
if (stack == null) return -1;
if (stack == null)
return -1;
stack.stackSize = 1;
slot.putStack(stack.copy());
@@ -137,19 +141,19 @@ public class FastTransferManager {
LinkedList<ItemStack> compareAfter = saveContainer(container);
try {
// if(compareAfter.get(fromSlot) != null)//transfer failed
// return -1;
//if(compareAfter.get(fromSlot) != null)//transfer failed
//return -1;
for (int i = 0; i < compareBefore.size(); i++) {
if (i == fromSlot) continue;
if (i == fromSlot)
continue;
ItemStack before = compareBefore.get(i);
ItemStack after = compareAfter.get(i);
if (!areStacksIdentical(before, after) && after != null)
if (before == null ? areStacksSameType(stack, after) : // transfered into this empty slot
areStacksSameType(stack, after) && after.stackSize - before.stackSize > 0) // it added to
// this stack
if (before == null ? areStacksSameType(stack, after) ://transfered into this empty slot
areStacksSameType(stack, after) && after.stackSize - before.stackSize > 0)//it added to this stack
return i;
}
@@ -177,48 +181,45 @@ public class FastTransferManager {
public void transferItem(GuiContainer window, int fromSlot) {
int toSlot = findShiftClickDestinationSlot(window.inventorySlots, fromSlot);
if (toSlot == -1) return;
if (toSlot == -1)
return;
Slot from = window.inventorySlots.getSlot(fromSlot);
if (from.isItemValid(from.getStack())) moveOneItem(window, fromSlot, toSlot);
else // slots that you can't put stuff in
if (from.isItemValid(from.getStack()))
moveOneItem(window, fromSlot, toSlot);
else//slots that you can't put stuff in
moveOutputSet(window, fromSlot, toSlot);
}
public void transferItems(GuiContainer window, int fromSlot, int itemCount) {
for (int i = 0; i < itemCount; i++) {
transferItem(window, fromSlot);
}
}
public void moveOutputSet(GuiContainer window, int fromSlot, int toSlot) {
if (NEIClientUtils.getHeldItem() != null) return;
clickSlot(window, fromSlot); // pickup fromSlot
if (NEIClientUtils.getHeldItem() == null) // maybe this container does auto transfers. No need to pick up the
// final item
if (NEIClientUtils.getHeldItem() != null)
return;
clickSlot(window, toSlot); // place one in toSlot
clickSlot(window, fromSlot);//pickup fromSlot
if (NEIClientUtils.getHeldItem() == null)//maybe this container does auto transfers. No need to pick up the final item
return;
clickSlot(window, toSlot);//place one in toSlot
}
public void moveOneItem(GuiContainer window, int fromSlot, int toSlot) {
clickSlot(window, fromSlot); // pickup fromSlot
clickSlot(window, toSlot, 1); // place one in toSlot
clickSlot(window, fromSlot); // place down in fromSlot
clickSlot(window, fromSlot);//pickup fromSlot
clickSlot(window, toSlot, 1);//place one in toSlot
clickSlot(window, fromSlot);//place down in fromSlot
}
public void retrieveItem(GuiContainer window, int toSlot) {
Slot slot = window.inventorySlots.getSlot(toSlot);
ItemStack slotStack = slot.getStack();
if (slotStack == null || slotStack.stackSize == slot.getSlotStackLimit()
|| slotStack.stackSize == slotStack.getMaxStackSize())
if (slotStack == null ||
slotStack.stackSize == slot.getSlotStackLimit() ||
slotStack.stackSize == slotStack.getMaxStackSize())
return;
generateSlotMap(window.inventorySlots, slotStack);
Integer destZone = slotZoneMap.get(toSlot);
if (destZone == null) // slots that don't accept
if (destZone == null)//slots that don't accept
return;
int firstZoneSlot = findShiftClickDestinationSlot(window.inventorySlots, toSlot);
@@ -227,14 +228,17 @@ public class FastTransferManager {
Integer integer = slotZoneMap.get(firstZoneSlot);
if (integer != null) {
firstZone = integer;
if (retrieveItemFromZone(window, firstZone, toSlot)) return;
if (retrieveItemFromZone(window, firstZone, toSlot))
return;
}
}
for (int zone = 0; zone < slotZones.size(); zone++) {
if (zone == destZone || zone == firstZone) continue;
if (zone == destZone || zone == firstZone)
continue;
if (retrieveItemFromZone(window, zone, toSlot)) return;
if (retrieveItemFromZone(window, zone, toSlot))
return;
}
retrieveItemFromZone(window, destZone, toSlot);
@@ -243,14 +247,14 @@ public class FastTransferManager {
private boolean retrieveItemFromZone(GuiContainer window, int zone, int toSlot) {
ItemStack stack = window.inventorySlots.getSlot(toSlot).getStack();
for (int i : slotZones.get(zone)) {
if (i == toSlot) continue;
if (i == toSlot)
continue;
Slot slot = window.inventorySlots.getSlot(i);
ItemStack stack1 = slot.getStack();
if (areStacksSameType(stack, stack1) && stack1.stackSize != slot.getSlotStackLimit() && // get from full
// stacks on second
// pass
if (areStacksSameType(stack, stack1) &&
stack1.stackSize != slot.getSlotStackLimit() && //get from full stacks on second pass
stack1.stackSize != stack1.getMaxStackSize()) {
moveOneItem(window, i, toSlot);
return true;
@@ -258,7 +262,8 @@ public class FastTransferManager {
}
for (int i : slotZones.get(zone)) {
if (i == toSlot) continue;
if (i == toSlot)
continue;
Slot slot = window.inventorySlots.getSlot(i);
ItemStack stack1 = slot.getStack();
@@ -283,49 +288,32 @@ public class FastTransferManager {
GuiContainerManager.getManager(window).handleSlotClick(slotIndex, button, modifier);
}
public static int dropHeldItem(GuiContainer window) {
final EntityPlayerSP player = window.mc.thePlayer;
final ItemStack held = player.inventory.getItemStack();
if (held == null) return -1;
for (int i = 0; i < window.inventorySlots.inventorySlots.size(); i++) {
final Slot slot = window.inventorySlots.inventorySlots.get(i);
if (slot.inventory instanceof InventoryPlayer && !slot.getHasStack() && slot.isItemValid(held)) {
clickSlot(window, i, 0, 0);
if (player.inventory.getItemStack() == null) {
return i;
}
}
}
return -1;
}
private boolean fillZoneWithHeldItem(GuiContainer window, int zoneIndex) {
for (int transferTo : slotZones.get(zoneIndex)) {
ItemStack held = NEIClientUtils.getHeldItem();
if (held == null) break;
if (held == null)
break;
ItemStack inToSlot = window.inventorySlots.getSlot(transferTo).getStack();
if (!areStacksSameType(inToSlot, held)) continue;
if (!areStacksSameType(inToSlot, held))
continue;
clickSlot(window, transferTo);
}
for (int transferTo : slotZones.get(zoneIndex)) // repeat on empty slots
for (int transferTo : slotZones.get(zoneIndex))//repeat on empty slots
{
ItemStack held = NEIClientUtils.getHeldItem();
if (held == null) break;
if (held == null)
break;
ItemStack inToSlot = window.inventorySlots.getSlot(transferTo).getStack();
if (inToSlot != null) continue;
if (inToSlot != null)
continue;
clickSlot(window, transferTo);
}
@@ -335,13 +323,14 @@ public class FastTransferManager {
public void throwAll(GuiContainer window, int pickedUpFromSlot) {
ItemStack held = NEIClientUtils.getHeldItem();
if (held == null) return;
if (held == null)
return;
clickSlot(window, -999);
generateSlotMap(window.inventorySlots, held);
Integer zone = slotZoneMap.get(pickedUpFromSlot);
if (zone == null) // something went wrong and we can't work out where the item was picked up from
if(zone == null) //something went wrong and we can't work out where the item was picked up from
return;
for (int slotIndex : slotZones.get(zone)) {
@@ -1,19 +1,17 @@
package codechicken.nei;
import static codechicken.nei.NEIClientUtils.translate;
import codechicken.lib.render.CCRenderState;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.world.World;
import org.lwjgl.opengl.GL11;
import codechicken.lib.render.CCRenderState;
public class GuiEnchantmentModifier extends GuiContainer {
import static codechicken.nei.NEIClientUtils.translate;
public class GuiEnchantmentModifier extends GuiContainer
{
final ContainerEnchantmentModifier container;
public GuiEnchantmentModifier(InventoryPlayer inventoryplayer, World world, int i, int j, int k) {
@@ -24,8 +22,8 @@ public class GuiEnchantmentModifier extends GuiContainer {
@Override
protected void drawGuiContainerForegroundLayer(int par1, int par2) {
fontRendererObj.drawString(translate("enchant"), 12, 6, ColorUtils.textGray.getColor());
fontRendererObj.drawString(translate("enchant.level"), 19, 20, ColorUtils.textGray.getColor());
fontRendererObj.drawString(translate("enchant"), 12, 6, 0x404040);
fontRendererObj.drawString(translate("enchant.level"), 19, 20, 0x404040);
}
protected void drawGuiContainerBackgroundLayer(float f, int i, int j) {
@@ -39,11 +37,7 @@ public class GuiEnchantmentModifier extends GuiContainer {
container.drawScrollBar(this);
String levelstring = "" + container.level;
fontRendererObj.drawString(
levelstring,
33 - fontRendererObj.getStringWidth(levelstring) / 2,
34,
ColorUtils.textLightGray.getColor());
fontRendererObj.drawString(levelstring, 33 - fontRendererObj.getStringWidth(levelstring) / 2, 34, 0xFF606060);
GL11.glTranslatef(-guiLeft, -guiTop, 0);
}
@@ -66,6 +60,7 @@ public class GuiEnchantmentModifier extends GuiContainer {
public static void toggleEnchantmentValidation() {
NEIClientConfig.world.nbt.setBoolean("validateenchantments", !validateEnchantments());
NEIClientConfig.world.saveNBT();
}
protected void actionPerformed(GuiButton guibutton) {
@@ -82,8 +77,8 @@ public class GuiEnchantmentModifier extends GuiContainer {
private void changeLevel(int i) {
container.level += i;
buttonList.get(0).enabled = container.level != 1;
buttonList.get(1).enabled = container.level != 10;
((GuiButton) buttonList.get(0)).enabled = container.level != 1;
((GuiButton) buttonList.get(1)).enabled = container.level != 10;
}
protected void mouseClicked(int i, int j, int k) {
@@ -1,23 +1,18 @@
package codechicken.nei;
import codechicken.lib.render.CCRenderState;
import codechicken.nei.api.INEIGuiHandler;
import codechicken.nei.api.TaggedInventoryArea;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import org.lwjgl.opengl.GL11;
import java.util.Collections;
import java.util.List;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import org.lwjgl.opengl.GL11;
import codechicken.lib.render.CCRenderState;
import codechicken.lib.vec.Rectangle4i;
import codechicken.nei.AutoFocusWidget.INEIAutoFocusSearchEnable;
import codechicken.nei.api.INEIGuiHandler;
import codechicken.nei.api.TaggedInventoryArea;
public class GuiExtendedCreativeInv extends GuiContainer implements INEIGuiHandler, INEIAutoFocusSearchEnable {
public class GuiExtendedCreativeInv extends GuiContainer implements INEIGuiHandler
{
public GuiExtendedCreativeInv(Container par1Container) {
super(par1Container);
ySize = 198;
@@ -56,17 +51,6 @@ public class GuiExtendedCreativeInv extends GuiContainer implements INEIGuiHandl
@Override
public boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h) {
return (new Rectangle4i(guiLeft - 15, guiTop + 18, 18, 18 * 4 + 4)).intersects(new Rectangle4i(x, y, w, h));
}
@Override
protected void handleMouseClick(Slot slotIn, int slotId, int clickedButton, int clickType) {
// Hack for armor slots, because they are outside the container
if (slotIn != null && clickType == 4 && slotIn.xDisplayPosition < 0) {
clickType = 0;
}
super.handleMouseClick(slotIn, slotId, clickedButton, clickType);
return false;
}
}
+41
View File
@@ -0,0 +1,41 @@
package codechicken.nei;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
public class GuiNEIButton extends GuiButton
{
protected static final ResourceLocation guiTex = new ResourceLocation("textures/gui/widgets.png");
public GuiNEIButton(int i, int j, int k, int l, int i1, String s)
{
super(i, j, k, l, i1, s);
}
public void drawButton(Minecraft minecraft, int i, int j)
{
if(!visible)
return;
FontRenderer fontrenderer = minecraft.fontRenderer;
minecraft.renderEngine.bindTexture(guiTex);
GL11.glColor4f(1, 1, 1, 1);
boolean flag = i >= xPosition && j >= yPosition && i < xPosition + width && j < yPosition + height;
int k = getHoverState(flag);
drawTexturedModalRect(xPosition, yPosition, 0, 46 + k * 20, width / 2, height / 2);//top left
drawTexturedModalRect(xPosition + width / 2, yPosition, 200 - width / 2, 46 + k * 20, width / 2, height / 2);//top right
drawTexturedModalRect(xPosition, yPosition + height / 2, 0, 46 + k * 20 + 20 - height / 2, width / 2, height / 2);//bottom left
drawTexturedModalRect(xPosition + width / 2, yPosition + height / 2, 200 - width / 2, 46 + k * 20 + 20 - height / 2, width / 2, height / 2);//bottom right
mouseDragged(minecraft, i, j);
if(!enabled)
drawCenteredString(fontrenderer, displayString, xPosition + width / 2, yPosition + (height - 8) / 2, 0xffa0a0a0);
else if(flag)
drawCenteredString(fontrenderer, displayString, xPosition + width / 2, yPosition + (height - 8) / 2, 0xffffa0);
else
drawCenteredString(fontrenderer, displayString, xPosition + width / 2, yPosition + (height - 8) / 2, 0xe0e0e0);
}
}
@@ -1,37 +1,37 @@
package codechicken.nei;
import static codechicken.nei.NEIClientUtils.translate;
import java.awt.Dimension;
import java.util.ArrayList;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.StatCollector;
import org.lwjgl.opengl.GL11;
import codechicken.core.gui.GuiCCButton;
import codechicken.core.gui.GuiCCTextField;
import codechicken.core.gui.GuiScrollSlot;
import codechicken.core.inventory.GuiContainerWidget;
import codechicken.lib.render.CCRenderState;
import codechicken.lib.render.FontUtils;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.StatCollector;
import org.lwjgl.opengl.GL11;
public class GuiPotionCreator extends GuiContainerWidget {
import java.awt.Dimension;
import java.util.ArrayList;
public class GuiSlotPotionEffects extends GuiScrollSlot {
import static codechicken.nei.NEIClientUtils.translate;
public class GuiPotionCreator extends GuiContainerWidget
{
public class GuiSlotPotionEffects extends GuiScrollSlot
{
public int selectedslot = -1;
public boolean enabled = true;
private final ArrayList<Potion> validPotions = new ArrayList<>();
public GuiSlotPotionEffects(int x, int y) {
super(x, y, 108, 76);
for (Potion p : Potion.potionTypes) if (p != null) validPotions.add(p);
for (Potion p : Potion.potionTypes)
if (p != null)
validPotions.add(p);
setSmoothScroll(false);
setMargins(0, 0, 0, 0);
}
@@ -48,7 +48,8 @@ public class GuiPotionCreator extends GuiContainerWidget {
}
@Override
public void drawOverlay(float frame) {}
public void drawOverlay(float frame) {
}
@Override
public int scrollbarGuideAlignment() {
@@ -68,18 +69,13 @@ public class GuiPotionCreator extends GuiContainerWidget {
Potion potion = validPotions.get(slot);
PotionEffect effect = getEffect(potion.id);
boolean blank = effect == null;
if (effect == null) effect = new PotionEffect(potion.id, 1200, 0);
if (effect == null)
effect = new PotionEffect(potion.id, 1200, 0);
int shade = selectedslot == slot ? 2 : blank ? 1 : 0;
CCRenderState.changeTexture("textures/gui/container/enchanting_table.png");
drawTexturedModalRect(x, y, 0, 166 + getSlotHeight(slot) * shade, width - 30, getSlotHeight(slot));
drawTexturedModalRect(
x + width - 30,
y,
width - 23,
166 + getSlotHeight(slot) * shade,
30,
getSlotHeight(slot));
drawTexturedModalRect(x + width - 30, y, width - 23, 166 + getSlotHeight(slot) * shade, 30, getSlotHeight(slot));
if (potion.hasStatusIcon()) {
CCRenderState.changeTexture("textures/gui/container/inventory.png");
@@ -108,7 +104,8 @@ public class GuiPotionCreator extends GuiContainerWidget {
NBTTagList potionTagList = potion.getTagCompound().getTagList("CustomPotionEffects", 10);
for (int i = 0; i < potionTagList.tagCount(); i++) {
PotionEffect effect = PotionEffect.readCustomPotionEffectFromNBT(potionTagList.getCompoundTagAt(i));
if (effect.getPotionID() == id) return effect;
if (effect.getPotionID() == id)
return effect;
}
}
return null;
@@ -121,7 +118,8 @@ public class GuiPotionCreator extends GuiContainerWidget {
@Override
protected void slotClicked(int slot, int button, int mx, int my, int count) {
if (!enabled) return;
if (!enabled)
return;
if (button == 0) {
select(slot);
@@ -147,16 +145,19 @@ public class GuiPotionCreator extends GuiContainerWidget {
}
public void setEnabled(boolean b) {
if (b == enabled) return;
if (b == enabled)
return;
enabled = b;
if (!enabled) deselect();
if (!enabled)
deselect();
}
private void select(int slot) {
selectedslot = slot;
durationField.setEnabled(true);
PotionEffect effect = getEffect(validPotions.get(slot).id);
if (effect == null) effect = new PotionEffect(validPotions.get(slot).id, 1200, 0);
if (effect == null)
effect = new PotionEffect(validPotions.get(slot).id, 1200, 0);
durationField.setDurationTicks(effect.getDuration());
amplifier = effect.getAmplifier();
validateInputButtons();
@@ -174,8 +175,8 @@ public class GuiPotionCreator extends GuiContainerWidget {
}
}
public class GuiDurationField extends GuiCCTextField {
public class GuiDurationField extends GuiCCTextField
{
private String baseValue;
public GuiDurationField(int x, int y, int width, int height) {
@@ -189,22 +190,27 @@ public class GuiPotionCreator extends GuiContainerWidget {
i /= 20;
String minutes = Integer.toString(i / 60);
String seconds = Integer.toString(i % 60);
if (seconds.length() == 1) seconds = '0' + seconds;
if (seconds.length() == 1)
seconds = '0' + seconds;
setText(minutes + seconds);
}
@Override
public void setEnabled(boolean b) {
super.setEnabled(b);
if (!isEnabled()) setText("100");
if (!isEnabled())
setText("100");
}
@Override
public void onFocusChanged() {
if (isFocused()) baseValue = getText();
if (isFocused())
baseValue = getText();
else {
if (!validateValue()) setText(baseValue);
else applyEffect();
if (!validateValue())
setText(baseValue);
else
applyEffect();
}
}
@@ -225,8 +231,7 @@ public class GuiPotionCreator extends GuiContainerWidget {
@Override
public void drawText() {
String s = getText();
String seconds = s
.substring(Math.max(0, s.length() - 2), Math.max(0, s.length() - 2) + Math.min(s.length(), 2));
String seconds = s.substring(Math.max(0, s.length() - 2), Math.max(0, s.length() - 2) + Math.min(s.length(), 2));
String minutes = s.length() < 3 ? "" : s.substring(0, s.length() - 2);
int ty = y + height / 2 - 4;
int tcolour = getTextColour();
@@ -289,10 +294,10 @@ public class GuiPotionCreator extends GuiContainerWidget {
CCRenderState.changeTexture("nei:textures/gui/potion.png");
drawTexturedModalRect(0, 0, 0, 0, xSize, ySize);
FontUtils.drawCenteredString(translate("potion.favourite"), xSize / 2, 4, ColorUtils.textGray.getColor());
fontRendererObj.drawString(translate("potion.duration"), 12, 40, ColorUtils.textGray.getColor());
fontRendererObj.drawString(translate("potion.level"), 19, 73, ColorUtils.textGray.getColor());
FontUtils.drawCenteredString(translateAmplifier(amplifier), 33, 86, ColorUtils.textGray.getColor());
FontUtils.drawCenteredString(translate("potion.favourite"), xSize / 2, 4, 0x404040);
fontRendererObj.drawString(translate("potion.duration"), 12, 40, 0x404040);
fontRendererObj.drawString(translate("potion.level"), 19, 73, 0x404040);
FontUtils.drawCenteredString(translateAmplifier(amplifier), 33, 86, 0xFF606060);
}
@Override
@@ -311,8 +316,10 @@ public class GuiPotionCreator extends GuiContainerWidget {
@Override
public void actionPerformed(String ident, Object... params) {
if (ident.equals("ampDown")) amplifier--;
else if (ident.equals("ampUp")) amplifier++;
if (ident.equals("ampDown"))
amplifier--;
else if (ident.equals("ampUp"))
amplifier++;
applyEffect();
validateInputButtons();
}
@@ -1,34 +1,32 @@
package codechicken.nei;
import codechicken.lib.config.ConfigTag;
import codechicken.nei.KeyManager.IKeyStateTracker;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.guihook.GuiContainerManager;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.util.MovingObjectPosition.MovingObjectType;
import net.minecraft.world.World;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import java.awt.Dimension;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
import static codechicken.lib.gui.GuiDraw.displaySize;
import static codechicken.lib.gui.GuiDraw.drawString;
import static codechicken.lib.gui.GuiDraw.drawTooltipBox;
import static codechicken.lib.gui.GuiDraw.getStringWidth;
import java.awt.Dimension;
import java.awt.Point;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.util.MovingObjectPosition.MovingObjectType;
import net.minecraft.world.World;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import codechicken.lib.config.ConfigTag;
import codechicken.nei.KeyManager.IKeyStateTracker;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.guihook.GuiContainerManager;
import codechicken.nei.recipe.StackInfo;
public class HUDRenderer implements IKeyStateTracker {
public class HUDRenderer implements IKeyStateTracker
{
@Override
public void tickKeyStates() {
if (KeyManager.isPressed("world.highlight_tips")) {
if (KeyManager.keyStates.get("world.highlight_tips").down) {
ConfigTag tag = NEIClientConfig.getSetting("world.highlight_tips");
tag.setBooleanValue(!tag.getBooleanValue());
}
@@ -36,26 +34,37 @@ public class HUDRenderer implements IKeyStateTracker {
public static void renderOverlay() {
Minecraft mc = Minecraft.getMinecraft();
if (mc.currentScreen == null && mc.theWorld != null
&& !mc.gameSettings.keyBindPlayerList.getIsKeyPressed()
&& NEIClientConfig.getBooleanSetting("world.highlight_tips")
&& mc.objectMouseOver != null
&& mc.objectMouseOver.typeOfHit == MovingObjectType.BLOCK) {
if (mc.currentScreen == null &&
mc.theWorld != null &&
!mc.gameSettings.keyBindPlayerList.getIsKeyPressed() &&
NEIClientConfig.getBooleanSetting("world.highlight_tips") &&
mc.objectMouseOver != null &&
mc.objectMouseOver.typeOfHit == MovingObjectType.BLOCK) {
World world = mc.theWorld;
final List<ItemStack> items = ItemInfo.getIdentifierItems(world, mc.thePlayer, mc.objectMouseOver);
ArrayList<ItemStack> items = ItemInfo.getIdentifierItems(world, mc.thePlayer, mc.objectMouseOver);
if (items.isEmpty())
return;
if (items.isEmpty()) return;
int minDamage = Integer.MAX_VALUE;
ItemStack stack = null;
for(ItemStack astack : items) {
if(astack.getItem() != null && astack.getItemDamage() < minDamage) {
stack = astack;
minDamage = stack.getItemDamage();
}
}
final ItemStack stack = StackInfo.getItemStackWithMinimumDamage(items.toArray(new ItemStack[0]));
renderOverlay(stack, ItemInfo.getText(stack, world, mc.thePlayer, mc.objectMouseOver), getPositioning());
}
}
public static void renderOverlay(ItemStack stack, List<String> textData, Point pos) {
if ((stack == null || stack.getItem() == null) && textData.isEmpty()) return;
if((stack == null || stack.getItem() == null) && textData.isEmpty())
return;
int w = 0;
for (String s : textData) w = Math.max(w, getStringWidth(s) + 29);
for (String s : textData)
w = Math.max(w, getStringWidth(s) + 29);
int h = Math.max(24, 10 + 10 * textData.size());
Dimension size = displaySize();
@@ -76,7 +85,8 @@ public class HUDRenderer implements IKeyStateTracker {
RenderHelper.enableGUIStandardItemLighting();
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
if (stack != null && stack.getItem() != null) GuiContainerManager.drawItem(x + 5, y + h / 2 - 8, stack);
if (stack != null && stack.getItem() != null)
GuiContainerManager.drawItem(x + 5, y + h / 2 - 8, stack);
}
private static Point getPositioning() {
@@ -88,4 +98,4 @@ public class HUDRenderer implements IKeyStateTracker {
public static void load() {
KeyManager.trackers.add(new HUDRenderer());
}
}
}
@@ -1,13 +1,14 @@
package codechicken.nei;
public class Image {
public class Image
{
public int x;
public int y;
public int width;
public int height;
public Image(int x, int y, int w, int h) {
public Image(int x, int y, int w, int h)
{
this.x = x;
this.y = y;
width = w;
@@ -1,40 +1,55 @@
package codechicken.nei;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import codechicken.lib.inventory.InventoryUtils;
import codechicken.nei.api.IInfiniteItemHandler;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
public class InfiniteStackSizeHandler implements IInfiniteItemHandler {
public class InfiniteStackSizeHandler implements IInfiniteItemHandler
{
@Override
public void onPickup(ItemStack heldItem) {
public void onPickup(ItemStack heldItem)
{
heldItem.stackSize = 1;
}
@Override
public void onPlaceInfinite(ItemStack heldItem) {
public void onPlaceInfinite(ItemStack heldItem)
{
heldItem.stackSize = 111;
}
@Override
public boolean canHandleItem(ItemStack stack) {
public boolean canHandleItem(ItemStack stack)
{
return !stack.isItemStackDamageable();
}
@Override
public boolean isItemInfinite(ItemStack stack) {
public boolean isItemInfinite(ItemStack stack)
{
return stack.stackSize == -1 || stack.stackSize > 100;
}
@Override
public void replenishInfiniteStack(InventoryPlayer inv, int slotNo) {
inv.getStackInSlot(slotNo).stackSize = 111;
public void replenishInfiniteStack(InventoryPlayer inv, int slotNo)
{
ItemStack stack = inv.getStackInSlot(slotNo);
stack.stackSize = 111;
for(int i = 0; i < inv.getSizeInventory(); i++)
{
if(i == slotNo)
continue;
if(NEIServerUtils.areStacksSameType(stack, inv.getStackInSlot(i)))
inv.setInventorySlotContents(i, null);
}
}
@Override
public ItemStack getInfiniteItem(ItemStack typeStack) {
public ItemStack getInfiniteItem(ItemStack typeStack)
{
return InventoryUtils.copyStack(typeStack, -1);
}
}
@@ -1,12 +1,11 @@
package codechicken.nei;
import codechicken.nei.api.IInfiniteItemHandler;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import codechicken.nei.api.IInfiniteItemHandler;
public class InfiniteToolHandler implements IInfiniteItemHandler {
public class InfiniteToolHandler implements IInfiniteItemHandler
{
@Override
public void onPickup(ItemStack heldItem) {
heldItem.setItemDamage(0);
@@ -4,13 +4,15 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.InventoryCrafting;
public class InventoryCraftingDummy extends InventoryCrafting {
public InventoryCraftingDummy() {
super(new Container() {
public class InventoryCraftingDummy extends InventoryCrafting
{
public InventoryCraftingDummy()
{
super(new Container()
{
@Override
public boolean canInteractWith(EntityPlayer entityplayer) {
public boolean canInteractWith(EntityPlayer entityplayer)
{
return true;
}
}, 3, 3);
+284
View File
@@ -0,0 +1,284 @@
package codechicken.nei;
import codechicken.nei.ThreadOperationTimer.TimeoutException;
import codechicken.nei.api.ItemFilter;
import codechicken.nei.api.ItemFilter.ItemFilterProvider;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.guihook.GuiContainerManager;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class ItemList
{
/**
* Fields are replaced atomically and contents never modified.
*/
public static volatile List<ItemStack> items = new ArrayList<>();
/**
* Fields are replaced atomically and contents never modified.
*/
public static volatile ListMultimap<Item, ItemStack> itemMap = ArrayListMultimap.create();
/**
* Updates to this should be synchronised on this
*/
public static final List<ItemFilterProvider> itemFilterers = new LinkedList<>();
public static final List<ItemsLoadedCallback> loadCallbacks = new LinkedList<>();
private static final HashSet<Item> erroredItems = new HashSet<>();
private static final HashSet<String> stackTraces = new HashSet<>();
public static class EverythingItemFilter implements ItemFilter
{
@Override
public boolean matches(ItemStack item) {
return true;
}
}
public static class NothingItemFilter implements ItemFilter
{
@Override
public boolean matches(ItemStack item) {
return false;
}
}
public static class PatternItemFilter implements ItemFilter
{
public Pattern pattern;
public PatternItemFilter(Pattern pattern) {
this.pattern = pattern;
}
@Override
public boolean matches(ItemStack item) {
return pattern.matcher(ItemInfo.getSearchName(item)).find();
}
}
public static class AllMultiItemFilter implements ItemFilter
{
public List<ItemFilter> filters;
public AllMultiItemFilter(List<ItemFilter> filters) {
this.filters = filters;
}
public AllMultiItemFilter() {
this(new LinkedList<>());
}
@Override
public boolean matches(ItemStack item) {
for(ItemFilter filter : filters)
try {
if (!filter.matches(item)) return false;
} catch (Exception e) {
NEIClientConfig.logger.error("Exception filtering "+item+" with "+filter, e);
}
return true;
}
}
public static class AnyMultiItemFilter implements ItemFilter
{
public List<ItemFilter> filters;
public AnyMultiItemFilter(List<ItemFilter> filters) {
this.filters = filters;
}
public AnyMultiItemFilter() {
this(new LinkedList<>());
}
@Override
public boolean matches(ItemStack item) {
for(ItemFilter filter : filters)
try {
if (filter.matches(item)) return true;
} catch (Exception e) {
NEIClientConfig.logger.error("Exception filtering "+item+" with "+filter, e);
}
return false;
}
}
public static interface ItemsLoadedCallback
{
public void itemsLoaded();
}
public static boolean itemMatchesAll(ItemStack item, List<ItemFilter> filters) {
for(ItemFilter filter : filters) {
try {
if (!filter.matches(item))
return false;
} catch (Exception e) {
NEIClientConfig.logger.error("Exception filtering "+item+" with "+filter, e);
}
}
return true;
}
/**
* @deprecated use getItemListFilter().matches(item)
*/
@Deprecated
public static boolean itemMatches(ItemStack item) {
return getItemListFilter().matches(item);
}
public static ItemFilter getItemListFilter() {
return new AllMultiItemFilter(getItemFilters());
}
public static List<ItemFilter> getItemFilters() {
LinkedList<ItemFilter> filters = new LinkedList<>();
synchronized (itemFilterers) {
for(ItemFilterProvider p : itemFilterers)
filters.add(p.getFilter());
}
return filters;
}
public static final RestartableTask loadItems = new RestartableTask("NEI Item Loading")
{
private void damageSearch(Item item, List<ItemStack> permutations) {
HashSet<String> damageIconSet = new HashSet<>();
for (int damage = 0; damage < 16; damage++)
try {
ItemStack itemstack = new ItemStack(item, 1, damage);
IIcon icon = item.getIconIndex(itemstack);
String name = GuiContainerManager.concatenatedDisplayName(itemstack, false);
String s = name + "@" + (icon == null ? 0 : icon.hashCode());
if (!damageIconSet.contains(s)) {
damageIconSet.add(s);
permutations.add(itemstack);
}
}
catch(TimeoutException t) {
throw t;
}
catch(Throwable t) {
NEIServerUtils.logOnce(t, stackTraces, "Ommiting "+item+":"+damage+" "+item.getClass().getSimpleName(), item.toString());
}
}
@Override
public void execute() {
// System.out.println("Executing NEI Item Loading");
ThreadOperationTimer timer = getTimer(500);
LinkedList<ItemStack> items = new LinkedList<>();
LinkedList<ItemStack> permutations = new LinkedList<>();
ListMultimap<Item, ItemStack> itemMap = ArrayListMultimap.create();
timer.setLimit(500);
for (Item item : (Iterable<Item>) Item.itemRegistry) {
if (interrupted()) return;
if (item == null || erroredItems.contains(item))
continue;
try {
timer.reset(item);
permutations.clear();
permutations.addAll(ItemInfo.itemOverrides.get(item));
if (permutations.isEmpty())
item.getSubItems(item, null, permutations);
if (permutations.isEmpty())
damageSearch(item, permutations);
permutations.addAll(ItemInfo.itemVariants.get(item));
timer.reset();
items.addAll(permutations);
itemMap.putAll(item, permutations);
} catch (Throwable t) {
NEIServerConfig.logger.error("Removing item: " + item + " from list.", t);
erroredItems.add(item);
}
}
if(interrupted()) return;
ItemList.items = items;
ItemList.itemMap = itemMap;
for(ItemsLoadedCallback callback : loadCallbacks)
callback.itemsLoaded();
updateFilter.restart();
}
};
public static ForkJoinPool getPool(int poolSize) {
if(poolSize < 1)
poolSize = 1;
return new ForkJoinPool(poolSize);
}
public static final int numProcessors = Runtime.getRuntime().availableProcessors();
public static ForkJoinPool forkJoinPool = getPool(numProcessors * 2 / 3);
public static final RestartableTask updateFilter = new RestartableTask("NEI Item Filtering")
{
@Override
public void execute() {
// System.out.println("Executing NEI Item Filtering");
ArrayList<ItemStack> filtered;
ItemFilter filter = getItemListFilter();
try {
filtered = ItemList.forkJoinPool.submit(() -> items.parallelStream()
.filter(filter::matches)
.collect(Collectors.toCollection(ArrayList::new))).get();
} catch (InterruptedException | ExecutionException e) {
filtered = new ArrayList<>();
e.printStackTrace();
stop();
}
if(interrupted()) return;
ItemSorter.sort(filtered);
if(interrupted()) return;
ItemPanel.updateItemList(filtered);
}
};
/**
* @deprecated Use updateFilter.restart()
*/
@Deprecated
public static void updateFilter() {
updateFilter.restart();
}
/**
* @deprecated Use loadItems.restart()
*/
@Deprecated
public static void loadItems() {
loadItems.restart();
}
}
+141
View File
@@ -0,0 +1,141 @@
package codechicken.nei;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.monster.IMob;
import net.minecraft.entity.passive.EntityPig;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntityMobSpawner;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import net.minecraftforge.client.MinecraftForgeClient;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ItemMobSpawner extends ItemBlock
{
private static Map<Integer, EntityLiving> entityHashMap;
private static Map<Integer, String> IDtoNameMap;
public static int idPig;
private static boolean loaded;
public ItemMobSpawner() {
super(Blocks.mob_spawner);
hasSubtypes = true;
MinecraftForgeClient.registerItemRenderer(this, new SpawnerRenderer());
entityHashMap = new HashMap<>();
IDtoNameMap = new HashMap<>();
}
/**
* These are ASM translated from BlockMobSpawner
*/
public static int placedX;
public static int placedY;
public static int placedZ;
@Override
public IIcon getIconFromDamage(int par1) {
return Blocks.mob_spawner.getBlockTextureFromSide(0);
}
public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int x, int y, int z, int par7, float par8, float par9, float par10) {
if (super.onItemUse(itemstack, entityplayer, world, x, y, z, par7, par8, par9, par10) && world.isRemote) {
TileEntityMobSpawner tileentitymobspawner = (TileEntityMobSpawner) world.getTileEntity(placedX, placedY, placedZ);
if (tileentitymobspawner != null) {
setDefaultTag(itemstack);
String mobtype = IDtoNameMap.get(itemstack.getItemDamage());
if (mobtype != null) {
NEICPH.sendMobSpawnerID(placedX, placedY, placedZ, mobtype);
tileentitymobspawner.func_145881_a().setEntityName(mobtype);
}
}
return true;
}
return false;
}
@Override
public void addInformation(ItemStack itemstack, EntityPlayer par2EntityPlayer, List list, boolean par4) {
setDefaultTag(itemstack);
int meta = itemstack.getItemDamage();
if (meta == 0) {
meta = idPig;
}
Entity e = getEntity(meta);
list.add("\u00A7" + (e instanceof IMob ? "4" : "3") + IDtoNameMap.get(meta));
}
public static EntityLiving getEntity(int ID) {
EntityLiving e = entityHashMap.get(ID);
if (e == null) {
World world = NEIClientUtils.mc().theWorld;
loadSpawners(world);
Class<?> clazz = (Class<?>) EntityList.IDtoClassMapping.get(ID);
try {
e = (EntityLiving) clazz.getConstructor(new Class[]{World.class}).newInstance(world);
} catch (Throwable t) {
if(clazz == null)
NEIClientConfig.logger.error("Null class for entity ("+ID+", "+IDtoNameMap.get(ID));
else
NEIClientConfig.logger.error("Error creating instance of entity: " + clazz.getName(), t);
e = getEntity(idPig);
}
entityHashMap.put(ID, e);
}
return e;
}
private void setDefaultTag(ItemStack itemstack) {
if (!IDtoNameMap.containsKey(itemstack.getItemDamage()))
itemstack.setItemDamage(idPig);
}
public static void loadSpawners(World world) {
if (loaded) return;
loaded = true;
HashMap<Class<Entity>, String> classToStringMapping = (HashMap<Class<Entity>, String>) EntityList.classToStringMapping;
HashMap<Class<Entity>, Integer> classToIDMapping = (HashMap<Class<Entity>, Integer>) EntityList.classToIDMapping;
for (Class<Entity> eclass : classToStringMapping.keySet()) {
if (!EntityLiving.class.isAssignableFrom(eclass))
continue;
try {
EntityLiving entityliving = (EntityLiving) eclass.getConstructor(new Class[]{World.class}).newInstance(world);
entityliving.isChild();
int id = classToIDMapping.get(eclass);
String name = classToStringMapping.get(eclass);
if (name.equals("EnderDragon"))
continue;
IDtoNameMap.put(id, name);
if (name.equals("Pig"))
idPig = id;
} catch (Throwable ignored) {
}
}
IDtoNameMap.entrySet().removeIf(e -> getEntity(e.getKey()).getClass() == EntityPig.class && !e.getValue().equals("Pig"));
}
@Override
public void getSubItems(Item item, CreativeTabs tab, List list) {
if(!NEIClientConfig.hasSMPCounterPart())
list.add(new ItemStack(item));
else
for(int i : IDtoNameMap.keySet())
list.add(new ItemStack(item, 1, i));
}
}
+479
View File
@@ -0,0 +1,479 @@
package codechicken.nei;
import codechicken.lib.vec.Rectangle4i;
import codechicken.nei.api.GuiInfo;
import codechicken.nei.api.INEIGuiHandler;
import codechicken.nei.guihook.GuiContainerManager;
import codechicken.nei.recipe.GuiCraftingRecipe;
import codechicken.nei.recipe.GuiRecipe;
import codechicken.nei.recipe.GuiUsageRecipe;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import java.util.ArrayList;
import static codechicken.lib.gui.GuiDraw.drawRect;
import static codechicken.nei.NEIClientConfig.canPerformAction;
public class ItemPanel extends Widget {
/**
* Backwards compat :-/
*/
public static ArrayList<ItemStack> items = new ArrayList<>();
/**
* Should not be externally modified, use updateItemList
*/
public ArrayList<ItemStack> realItems = new ArrayList<>();
/**
* Swapped into visible items on update
*/
protected ArrayList<ItemStack> _items = realItems;
public ArrayList<ItemStack> getItems() {
return realItems;
}
public static void updateItemList(ArrayList<ItemStack> newItems) {
ItemPanels.itemPanel._items = newItems;
}
public class ItemPanelSlot
{
public ItemStack item;
public int slotIndex;
public ItemPanelSlot(int index) {
item = realItems.get(index);
slotIndex = index;
}
}
public ItemStack draggedStack;
public int mouseDownSlot = -1;
public Button prev;
public Button next;
public Label pageLabel;
private int marginLeft;
private int marginTop;
private int rows;
private int columns;
private boolean[] validSlotMap;
private int firstIndex;
private int itemsPerPage;
private int page;
private int numPages;
public void init() {
pageLabel = new Label("(0/0)", true);
prev = new Button("Prev")
{
public boolean onButtonPress(boolean rightclick) {
if (!rightclick) {
scroll(-1);
return true;
}
return false;
}
@Override
public String getRenderLabel() {
return "<";
}
};
next = new Button("Next")
{
public boolean onButtonPress(boolean rightclick) {
if (!rightclick) {
scroll(1);
return true;
}
return false;
}
@Override
public String getRenderLabel() {
return ">";
}
};
}
public int getX(GuiContainer gui) {
return (gui.xSize + gui.width) / 2 + 3;
}
public int getMarginLeft() {
return x + (w % 18) / 2;
}
public int getMarginTop() {
return y + (h % 18) / 2;
}
public int getButtonTop() {
return 2;
}
public int getNextX(GuiContainer gui) {
return gui.width - prev.w - 2;
}
public int getPrevX(GuiContainer gui) {
return (gui.xSize + gui.width) / 2 + 2;
}
public int getPageX(GuiContainer gui) {
return gui.guiLeft * 3 / 2 + gui.xSize + 1;
}
public int getHeight(GuiContainer gui) {
return gui.height - 15 - y + getHightAdjustment();
}
public int getHightAdjustment() {
int hAdj = 0;
if (!canPerformAction("item"))
hAdj += 15;
return hAdj;
}
public int getWidth(GuiContainer gui) {
return LayoutManager.getSideWidth(gui) - x;
}
public String getLabelText() {
return pageLabel.text = "(" + getPage() + "/" + getNumPages() + ")";
}
protected void setItems() {
realItems = _items;
// Backwards compat
ItemPanels.itemPanel._items = _items;
}
public void resize(GuiContainer gui) {
setItems();
final int buttonHeight = 16;
final int buttonWidth = 16;
prev.x = getPrevX(gui);
prev.y = getButtonTop();
prev.h = buttonHeight;
prev.w = buttonWidth;
next.x = getNextX(gui);
next.y = getButtonTop();
next.h = buttonHeight;
next.w = buttonWidth;
pageLabel.x = getPageX(gui);
pageLabel.y = prev.y + 5;
pageLabel.text = getLabelText();
y = prev.h + prev.y;
x = getX(gui);
w = getWidth(gui);
h = getHeight(gui);
marginLeft = getMarginLeft();
marginTop = getMarginTop();
columns = w / 18;
rows = h / 18;
//sometimes width and height can be negative with certain resizing
if(rows < 0) rows = 0;
if(columns < 0) columns = 0;
calculatePage();
updateValidSlots();
}
private void calculatePage() {
if (itemsPerPage == 0)
numPages = 0;
else
numPages = (int) Math.ceil((float) realItems.size() / (float) itemsPerPage);
if (firstIndex >= realItems.size())
firstIndex = 0;
if (numPages == 0)
page = 0;
else
page = firstIndex / itemsPerPage + 1;
}
public void setVisible() {
LayoutManager.addWidget(prev);
LayoutManager.addWidget(next);
LayoutManager.addWidget(pageLabel);
}
private void updateValidSlots() {
GuiContainer gui = NEIClientUtils.getGuiContainer();
validSlotMap = new boolean[rows * columns];
itemsPerPage = 0;
for (int i = 0; i < validSlotMap.length; i++)
if (slotValid(gui, i)) {
validSlotMap[i] = true;
itemsPerPage++;
}
}
private boolean slotValid(GuiContainer gui, int i) {
Rectangle4i rect = getSlotRect(i);
for (INEIGuiHandler handler : GuiInfo.guiHandlers)
if (handler.hideItemPanelSlot(gui, rect.x, rect.y, rect.w, rect.h))
return false;
return true;
}
public Rectangle4i getSlotRect(int i) {
return getSlotRect(i / columns, i % columns);
}
public Rectangle4i getSlotRect(int row, int column) {
return new Rectangle4i(marginLeft + column * 18, marginTop + row * 18, 18, 18);
}
@Override
public void draw(int mousex, int mousey) {
if (itemsPerPage == 0)
return;
GuiContainerManager.enableMatrixStackLogging();
int index = firstIndex;
for (int i = 0; i < rows * columns && index < realItems.size(); i++) {
if (validSlotMap[i]) {
Rectangle4i rect = getSlotRect(i);
if (rect.contains(mousex, mousey))
drawRect(rect.x, rect.y, rect.w, rect.h, 0xee555555);//highlight
GuiContainerManager.drawItem(rect.x + 1, rect.y + 1, realItems.get(index));
index++;
}
}
GuiContainerManager.disableMatrixStackLogging();
}
@Override
public void postDraw(int mousex, int mousey) {
if (draggedStack != null) {
GuiContainerManager.drawItems.zLevel += 100;
GuiContainerManager.drawItem(mousex - 8, mousey - 8, draggedStack);
GuiContainerManager.drawItems.zLevel -= 100;
}
}
@Override
public void mouseDragged(int mousex, int mousey, int button, long heldTime) {
if (mouseDownSlot >= 0 && draggedStack == null && NEIClientUtils.getHeldItem() == null &&
NEIClientConfig.hasSMPCounterPart() && !GuiInfo.hasCustomSlots(NEIClientUtils.getGuiContainer())) {
ItemPanelSlot mouseOverSlot = getSlotMouseOver(mousex, mousey);
ItemStack stack = new ItemPanelSlot(mouseDownSlot).item;
if (stack != null && (mouseOverSlot == null || mouseOverSlot.slotIndex != mouseDownSlot || heldTime > 500)) {
int amount = NEIClientConfig.getItemQuantity();
if (amount == 0)
amount = stack.getMaxStackSize();
draggedStack = NEIServerUtils.copyStack(stack, amount);
}
}
}
@Override
public boolean handleClick(int mousex, int mousey, int button) {
if (handleDraggedClick(mousex, mousey, button))
return true;
if (NEIClientUtils.getHeldItem() != null) {
for (INEIGuiHandler handler : GuiInfo.guiHandlers)
if (handler.hideItemPanelSlot(NEIClientUtils.getGuiContainer(), mousex, mousey, 1, 1))
return false;
if (NEIClientConfig.canPerformAction("delete") && NEIClientConfig.canPerformAction("item"))
if (button == 1)
NEIClientUtils.decreaseSlotStack(-999);
else
NEIClientUtils.deleteHeldItem();
else
NEIClientUtils.dropHeldItem();
return true;
}
ItemPanelSlot hoverSlot = getSlotMouseOver(mousex, mousey);
if (hoverSlot != null) {
if (button == 2) {
ItemStack stack = hoverSlot.item;
if (stack != null) {
int amount = NEIClientConfig.getItemQuantity();
if (amount == 0)
amount = stack.getMaxStackSize();
draggedStack = NEIServerUtils.copyStack(stack, amount);
}
} else {
mouseDownSlot = hoverSlot.slotIndex;
}
return true;
}
return false;
}
private boolean handleDraggedClick(int mousex, int mousey, int button) {
if (draggedStack == null)
return false;
GuiContainer gui = NEIClientUtils.getGuiContainer();
boolean handled = false;
for (INEIGuiHandler handler : GuiInfo.guiHandlers)
if (handler.handleDragNDrop(gui, mousex, mousey, draggedStack, button)) {
handled = true;
if (draggedStack.stackSize == 0) {
draggedStack = null;
return true;
}
}
if (handled)
return true;
Slot overSlot = gui.getSlotAtPosition(mousex, mousey);
if (overSlot != null && overSlot.isItemValid(draggedStack)) {
if (NEIClientConfig.canCheatItem(draggedStack)) {
int contents = overSlot.getHasStack() ? overSlot.getStack().stackSize : 0;
int add = button == 0 ? draggedStack.stackSize : 1;
if (overSlot.getHasStack() && !NEIServerUtils.areStacksSameType(draggedStack, overSlot.getStack()))
contents = 0;
int total = Math.min(contents + add, Math.min(overSlot.getSlotStackLimit(), draggedStack.getMaxStackSize()));
if (total > contents) {
NEIClientUtils.setSlotContents(overSlot.slotNumber, NEIServerUtils.copyStack(draggedStack, total), true);
NEICPH.sendGiveItem(NEIServerUtils.copyStack(draggedStack, total), false, false);
draggedStack.stackSize -= total - contents;
}
if (draggedStack.stackSize == 0)
draggedStack = null;
} else {
draggedStack = null;
}
} else if (mousex < gui.guiLeft || mousey < gui.guiTop || mousex >= gui.guiLeft + gui.xSize || mousey >= gui.guiTop + gui.ySize) {
draggedStack = null;
}
return true;
}
@Override
public boolean handleClickExt(int mousex, int mousey, int button) {
return handleDraggedClick(mousex, mousey, button);
}
@Override
public void mouseUp(int mousex, int mousey, int button) {
ItemPanelSlot hoverSlot = getSlotMouseOver(mousex, mousey);
if (hoverSlot != null && hoverSlot.slotIndex == mouseDownSlot && draggedStack == null) {
ItemStack item = hoverSlot.item;
if (NEIController.manager.window instanceof GuiRecipe || !NEIClientConfig.canCheatItem(item)) {
if (button == 0)
GuiCraftingRecipe.openRecipeGui("item", item);
else if (button == 1)
GuiUsageRecipe.openRecipeGui("item", item);
draggedStack = null;
mouseDownSlot = -1;
return;
}
NEIClientUtils.cheatItem(item, button, -1);
}
mouseDownSlot = -1;
}
@Override
public boolean onMouseWheel(int i, int mousex, int mousey) {
if (!contains(mousex, mousey))
return false;
scroll(-i);
return true;
}
@Override
public boolean handleKeyPress(int keyID, char keyChar) {
if (keyID == NEIClientConfig.getKeyBinding("gui.next")) {
scroll(1);
return true;
}
if (keyID == NEIClientConfig.getKeyBinding("gui.prev")) {
scroll(-1);
return true;
}
return false;
}
@Override
public ItemStack getStackMouseOver(int mousex, int mousey) {
ItemPanelSlot slot = getSlotMouseOver(mousex, mousey);
return slot == null ? null : slot.item;
}
public ItemPanelSlot getSlotMouseOver(int mousex, int mousey) {
int index = firstIndex;
for (int i = 0; i < rows * columns && index < realItems.size(); i++)
if (validSlotMap[i]) {
if (getSlotRect(i).contains(mousex, mousey))
return new ItemPanelSlot(index);
index++;
}
return null;
}
public void scroll(int i) {
if (itemsPerPage != 0) {
int oldIndex = firstIndex;
firstIndex += i * itemsPerPage;
if (firstIndex >= realItems.size())
firstIndex = 0;
if (firstIndex < 0)
if (oldIndex > 0)
firstIndex = 0;
else
firstIndex = (realItems.size() - 1) / itemsPerPage * itemsPerPage;
calculatePage();
}
}
public int getPage() {
return page;
}
public int getNumPages() {
return numPages;
}
@Override
public boolean contains(int px, int py) {
GuiContainer gui = NEIClientUtils.getGuiContainer();
Rectangle4i rect = new Rectangle4i(px, py, 1, 1);
for (INEIGuiHandler handler : GuiInfo.guiHandlers)
if (handler.hideItemPanelSlot(gui, rect.x, rect.y, rect.w, rect.h))
return false;
return super.contains(px, py);
}
}
@@ -1,7 +1,6 @@
package codechicken.nei;
public class ItemPanels {
public static final ItemPanel itemPanel = new ItemPanel();
public static final BookmarkPanel bookmarkPanel = new BookmarkPanel();
}
@@ -0,0 +1,44 @@
package codechicken.nei;
public class ItemQuantityField extends TextField
{
public ItemQuantityField(String ident) {
super(ident);
centered = true;
}
// Find a way to work this this back in
public boolean isValid(String string) {
if (string.equals(""))
return true;
try {
return Integer.parseInt(string) >= 0;
} catch (NumberFormatException nfe) {
return false;
}
}
public int intValue() {
return intValue(text());
}
public int intValue(String s) {
try {
return Integer.parseInt(s);
} catch (NumberFormatException nfe) {
return 0;
}
}
@Override
public void loseFocus() {
setText(Integer.toString(NEIClientConfig.getItemQuantity()));
}
@Override
public void onTextChange(String oldText) {
if (intValue(oldText) != intValue())//hacky recursion stopper
NEIClientUtils.setItemQuantity(intValue());
}
}
@@ -1,25 +1,24 @@
package codechicken.nei;
import codechicken.lib.config.ConfigTagParent;
import codechicken.nei.ItemList.ItemsLoadedCallback;
import codechicken.nei.api.API;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.config.GuiItemSorter;
import codechicken.nei.config.OptionOpenGui;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.StatCollector;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.StatCollector;
import codechicken.lib.config.ConfigTagParent;
import codechicken.nei.api.API;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.config.GuiItemSorter;
import codechicken.nei.config.OptionOpenGui;
public class ItemSorter implements Comparator<ItemStack> {
public static class SortEntry {
public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
{
public static class SortEntry
{
public final String name;
public final Comparator<ItemStack> comparator;
@@ -33,7 +32,7 @@ public class ItemSorter implements Comparator<ItemStack> {
}
public String getTooltip() {
String tipname = name + ".tip";
String tipname = name+".tip";
String tip = StatCollector.translateToLocal(tipname);
return !tip.equals(tipname) ? tip : null;
}
@@ -43,11 +42,12 @@ public class ItemSorter implements Comparator<ItemStack> {
public static ArrayList<SortEntry> list = new ArrayList<>();
public static final ItemSorter instance = new ItemSorter();
// optimisations
public Map<ItemStack, Integer> ordering = new HashMap<>();
//optimisations
public HashMap<ItemStack, Integer> ordering = null;
public static void sort(List<ItemStack> items) {
public static void sort(ArrayList<ItemStack> items) {
try {
// items = (ArrayList<ItemStack>) items.parallelStream().sorted(instance).collect(Collectors.toList());
items.sort(instance);
} catch (Exception e) {
NEIClientConfig.logger.error("Exception sorting item list", e);
@@ -56,15 +56,26 @@ public class ItemSorter implements Comparator<ItemStack> {
@Override
public int compare(ItemStack o1, ItemStack o2) {
for (SortEntry e : list) {
for(SortEntry e : list) {
int c = e.comparator.compare(o1, o2);
if (c != 0) return c;
if(c != 0) return c;
}
return 0;
}
@Override
public void itemsLoaded() {
HashMap<ItemStack, Integer> newMap = new HashMap<>();
int i = 0;
for(ItemStack stack : ItemList.items)
newMap.put(stack, i++);
ordering = newMap;
}
public static SortEntry find(String name) {
for (SortEntry e : entries) if (e.name.equals(name)) return e;
for(SortEntry e : entries)
if(e.name.equals(name))
return e;
return null;
}
@@ -78,11 +89,11 @@ public class ItemSorter implements Comparator<ItemStack> {
entries.add(e);
ArrayList<SortEntry> nlist = new ArrayList<>(list);
nlist.add(e);
list = nlist; // concurrency
list = nlist;//concurrency
}
public static void initConfig(ConfigTagParent tag) {
// minecraft, mod, id, default, meta, name
//minecraft, mod, id, default, meta, name
API.addSortOption("nei.itemsort.minecraft", (o1, o2) -> {
boolean m1 = "minecraft".equals(ItemInfo.itemOwners.get(o1.getItem()));
boolean m2 = "minecraft".equals(ItemInfo.itemOwners.get(o2.getItem()));
@@ -91,8 +102,8 @@ public class ItemSorter implements Comparator<ItemStack> {
API.addSortOption("nei.itemsort.mod", (o1, o2) -> {
String mod1 = ItemInfo.itemOwners.get(o1.getItem());
String mod2 = ItemInfo.itemOwners.get(o2.getItem());
if (mod1 == null) return mod2 == null ? 0 : 1;
if (mod2 == null) return -1;
if(mod1 == null) return mod2 == null ? 0 : 1;
if(mod2 == null) return -1;
return mod1.compareTo(mod2);
});
API.addSortOption("nei.itemsort.id", (o1, o2) -> {
@@ -103,8 +114,8 @@ public class ItemSorter implements Comparator<ItemStack> {
API.addSortOption("nei.itemsort.default", (o1, o2) -> {
Integer order1 = instance.ordering.get(o1);
Integer order2 = instance.ordering.get(o2);
if (order1 == null) return order2 == null ? 0 : 1;
if (order2 == null) return -1;
if(order1 == null) return order2 == null ? 0 : 1;
if(order2 == null) return -1;
return compareInt(order1, order2);
});
API.addSortOption("nei.itemsort.damage", (o1, o2) -> {
@@ -113,32 +124,44 @@ public class ItemSorter implements Comparator<ItemStack> {
return compareInt(id1, id2);
});
API.addSortOption("nei.itemsort.name", (o1, o2) -> {
String name1 = o1.getDisplayName();
String name2 = o2.getDisplayName();
String name1 = ItemInfo.getSearchName(o1);
String name2 = ItemInfo.getSearchName(o2);
return name1.compareTo(name2);
});
tag.getTag("inventory.itemsort").setDefaultValue(getSaveString(list));
API.addOption(new OptionOpenGui("inventory.itemsort", GuiItemSorter.class));
API.addOption(new OptionOpenGui("inventory.itemsort", GuiItemSorter.class) {
@Override
public void useGlobals() {
super.useGlobals();
list = fromSaveString(activeTag().getValue());
}
});
ItemList.loadCallbacks.add(instance);
}
public static String getSaveString(List<SortEntry> list) {
StringBuilder sb = new StringBuilder();
for (SortEntry e : list) {
if (sb.length() > 0) sb.append(',');
for(SortEntry e : list) {
if(sb.length() > 0)
sb.append(',');
sb.append(e.name);
}
return sb.toString();
}
public static ArrayList<SortEntry> fromSaveString(String s) {
if (s == null) return new ArrayList<>(entries);
if(s == null)
return new ArrayList<>(entries);
ArrayList<SortEntry> list = new ArrayList<>();
for (String s2 : s.split(",")) {
for(String s2 : s.split(",")) {
SortEntry e = find(s2.trim());
if (e != null) list.add(e);
if(e != null)
list.add(e);
}
for (SortEntry e : entries) if (!list.contains(e)) list.add(e);
for(SortEntry e : entries)
if(!list.contains(e))
list.add(e);
return list;
}
@@ -1,38 +1,30 @@
package codechicken.nei;
import com.google.common.base.Objects;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import static codechicken.lib.inventory.InventoryUtils.actualDamage;
import static codechicken.lib.inventory.InventoryUtils.newItemStack;
import static net.minecraftforge.oredict.OreDictionary.WILDCARD_VALUE;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import com.google.common.base.Objects;
/**
* A maplike class for ItemStack keys with wildcard damage/NBT. Optimised for lookup
*/
public class ItemStackMap<T> {
public static class StackMetaKey {
public class ItemStackMap<T>
{
public static class StackMetaKey
{
public final int damage;
public final NBTTagCompound tag;
private final int hashCode;
public StackMetaKey(int damage, NBTTagCompound tag) {
if (tag != null && tag.hasNoTags()) {
tag = null;
}
this.hashCode = Objects.hashCode(damage, tag);
this.damage = damage;
this.tag = tag;
}
@@ -42,17 +34,19 @@ public class ItemStackMap<T> {
}
public int hashCode() {
return this.hashCode;
return Objects.hashCode(damage, tag);
}
public boolean equals(Object o) {
if (!(o instanceof StackMetaKey t)) return false;
if (!(o instanceof StackMetaKey))
return false;
StackMetaKey t = (StackMetaKey) o;
return damage == t.damage && Objects.equal(tag, t.tag);
}
}
public static class Entry<T> {
public static class Entry<T>
{
public final ItemStack key;
public final T value;
@@ -62,8 +56,8 @@ public class ItemStackMap<T> {
}
}
public class DetailMap {
public class DetailMap
{
private boolean hasWildcard;
private T wildcard;
private HashMap<Integer, T> damageMap;
@@ -72,7 +66,8 @@ public class ItemStackMap<T> {
private int size;
public T get(ItemStack key) {
if (wildcard != null) return wildcard;
if (wildcard != null)
return wildcard;
if (damageMap != null) {
final T ret = damageMap.get(actualDamage(key));
@@ -82,7 +77,8 @@ public class ItemStackMap<T> {
final T ret = tagMap.get(key.stackTagCompound);
if (ret != null) return ret;
}
if (metaMap != null) return metaMap.get(new StackMetaKey(key));
if (metaMap != null)
return metaMap.get(new StackMetaKey(key));
return null;
}
@@ -133,50 +129,63 @@ public class ItemStackMap<T> {
}
private void updateSize() {
int newSize = (hasWildcard ? 1 : 0) + (metaMap != null ? metaMap.size() : 0)
+ (tagMap != null ? tagMap.size() : 0)
+ (damageMap != null ? damageMap.size() : 0);
int newSize = (hasWildcard ? 1 : 0) +
(metaMap != null ? metaMap.size() : 0) +
(tagMap != null ? tagMap.size() : 0) +
(damageMap != null ? damageMap.size() : 0);
if (newSize != size) {
ItemStackMap.this.size += newSize - size;
if(newSize != size) {
ItemStackMap.this.size += newSize-size;
size = newSize;
}
}
public void addKeys(Item item, List<ItemStack> list) {
if (wildcard != null) list.add(wildcard(item));
if (wildcard != null)
list.add(wildcard(item));
if (damageMap != null)
for (int damage : damageMap.keySet()) list.add(newItemStack(item, 1, damage, WILDCARD_TAG));
for (int damage : damageMap.keySet())
list.add(newItemStack(item, 1, damage, WILDCARD_TAG));
if (tagMap != null)
for (NBTTagCompound tag : tagMap.keySet()) list.add(newItemStack(item, 1, WILDCARD_VALUE, tag));
for (NBTTagCompound tag : tagMap.keySet())
list.add(newItemStack(item, 1, WILDCARD_VALUE, tag));
if (metaMap != null)
for (StackMetaKey key : metaMap.keySet()) list.add(newItemStack(item, 1, key.damage, key.tag));
for (StackMetaKey key : metaMap.keySet())
list.add(newItemStack(item, 1, key.damage, key.tag));
}
public void addValues(List<T> list) {
if (wildcard != null) list.add(wildcard);
if (damageMap != null) list.addAll(damageMap.values());
if (tagMap != null) list.addAll(tagMap.values());
if (metaMap != null) list.addAll(metaMap.values());
if (wildcard != null)
list.add(wildcard);
if (damageMap != null)
list.addAll(damageMap.values());
if (tagMap != null)
list.addAll(tagMap.values());
if (metaMap != null)
list.addAll(metaMap.values());
}
public void addEntries(Item item, List<Entry<T>> list) {
if (wildcard != null) list.add(new Entry<>(newItemStack(item, 1, WILDCARD_VALUE, WILDCARD_TAG), wildcard));
if (damageMap != null) for (Map.Entry<Integer, T> entry : damageMap.entrySet())
list.add(new Entry<>(newItemStack(item, 1, entry.getKey(), WILDCARD_TAG), entry.getValue()));
if (tagMap != null) for (Map.Entry<NBTTagCompound, T> entry : tagMap.entrySet())
list.add(new Entry<>(newItemStack(item, 1, WILDCARD_VALUE, entry.getKey()), entry.getValue()));
if (metaMap != null) for (Map.Entry<StackMetaKey, T> entry : metaMap.entrySet()) list.add(
new Entry<>(newItemStack(item, 1, entry.getKey().damage, entry.getKey().tag), entry.getValue()));
if (wildcard != null)
list.add(new Entry<>(newItemStack(item, 1, WILDCARD_VALUE, WILDCARD_TAG), wildcard));
if (damageMap != null)
for (Map.Entry<Integer, T> entry : damageMap.entrySet())
list.add(new Entry<>(newItemStack(item, 1, entry.getKey(), WILDCARD_TAG), entry.getValue()));
if (tagMap != null)
for (Map.Entry<NBTTagCompound, T> entry : tagMap.entrySet())
list.add(new Entry<>(newItemStack(item, 1, WILDCARD_VALUE, entry.getKey()), entry.getValue()));
if (metaMap != null)
for (Map.Entry<StackMetaKey, T> entry : metaMap.entrySet())
list.add(new Entry<>(newItemStack(item, 1, entry.getKey().damage, entry.getKey().tag), entry.getValue()));
}
}
public static int getKeyType(int damage, NBTTagCompound tag) {
int i = 0;
if (isWildcard(damage)) i = 1;
if (isWildcard(tag)) i |= 2;
return i;
}
int i = 0;
if (isWildcard(damage)) i = 1;
if (isWildcard(tag)) i |= 2;
return i;
}
public static ItemStack wildcard(Item item) {
return newItemStack(item, 1, WILDCARD_VALUE, WILDCARD_TAG);
@@ -197,7 +206,7 @@ public class ItemStackMap<T> {
WILDCARD_TAG.setBoolean("*", true);
}
private final Map<Item, DetailMap> itemMap = new LinkedHashMap<>();
private final HashMap<Item, DetailMap> itemMap = new HashMap<>();
private int size;
public T get(ItemStack key) {
@@ -209,38 +218,23 @@ public class ItemStackMap<T> {
return map == null ? null : map.get(key);
}
public T getOrDefault(ItemStack key, T defaultValue) {
T e = get(key);
return e == null ? defaultValue : e;
}
public void put(ItemStack key, T value) {
if (key == null || key.getItem() == null) return;
if (key == null || key.getItem() == null)
return;
DetailMap map = itemMap.computeIfAbsent(key.getItem(), k -> new DetailMap());
DetailMap map = itemMap.get(key.getItem());
if (map == null)
itemMap.put(key.getItem(), map = new DetailMap());
map.put(key, value);
}
public T computeIfAbsent(ItemStack key, Function<ItemStack, ? extends T> mappingFunction) {
T value;
if ((value = get(key)) == null) {
T newValue;
if ((newValue = mappingFunction.apply(key)) != null) {
put(key, newValue);
return newValue;
}
}
return value;
}
public void clear() {
itemMap.clear();
size = 0;
}
public T remove(ItemStack key) {
if (key == null || key.getItem() == null) return null;
if (key == null || key.getItem() == null)
return null;
DetailMap map = itemMap.get(key.getItem());
return map == null ? null : map.remove(key);
@@ -248,19 +242,22 @@ public class ItemStackMap<T> {
public List<ItemStack> keys() {
LinkedList<ItemStack> list = new LinkedList<>();
for (Map.Entry<Item, DetailMap> entry : itemMap.entrySet()) entry.getValue().addKeys(entry.getKey(), list);
for (Map.Entry<Item, DetailMap> entry : itemMap.entrySet())
entry.getValue().addKeys(entry.getKey(), list);
return list;
}
public List<T> values() {
LinkedList<T> list = new LinkedList<>();
for (DetailMap map : itemMap.values()) map.addValues(list);
for (DetailMap map : itemMap.values())
map.addValues(list);
return list;
}
public List<Entry<T>> entries() {
LinkedList<Entry<T>> list = new LinkedList<>();
for (Map.Entry<Item, DetailMap> entry : itemMap.entrySet()) entry.getValue().addEntries(entry.getKey(), list);
for (Map.Entry<Item, DetailMap> entry : itemMap.entrySet())
entry.getValue().addEntries(entry.getKey(), list);
return list;
}
@@ -1,25 +1,27 @@
package codechicken.nei;
import codechicken.nei.api.ItemFilter;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import codechicken.nei.api.ItemFilter;
public class ItemStackSet extends ItemStackMap<ItemStack> implements ItemFilter {
public class ItemStackSet extends ItemStackMap<ItemStack> implements ItemFilter
{
public ItemStackSet with(ItemStack... items) {
for (ItemStack item : items) add(item);
for(ItemStack item : items)
add(item);
return this;
}
public ItemStackSet with(Item... items) {
for (Item item : items) add(ItemStackMap.wildcard(item));
for(Item item : items)
add(ItemStackMap.wildcard(item));
return this;
}
public ItemStackSet with(Block... blocks) {
for (Block block : blocks) add(ItemStackMap.wildcard(Item.getItemFromBlock(block)));
for(Block block : blocks)
add(ItemStackMap.wildcard(Item.getItemFromBlock(block)));
return this;
}
@@ -27,16 +29,6 @@ public class ItemStackSet extends ItemStackMap<ItemStack> implements ItemFilter
put(item, item);
}
public ItemStackSet addAll(Iterable<ItemStack> items) {
for (ItemStack item : items) add(item);
return this;
}
public ItemStackSet removeAll(Iterable<ItemStack> items) {
for (ItemStack item : items) remove(item);
return this;
}
public boolean contains(ItemStack item) {
return get(item) != null;
}
+52
View File
@@ -0,0 +1,52 @@
package codechicken.nei;
import org.lwjgl.input.Keyboard;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map.Entry;
/**
* Good old down/held/up keystate tracker
*/
public class KeyManager
{
public static interface IKeyStateTracker
{
public void tickKeyStates();
}
public static class KeyState
{
public boolean down;
public boolean held;
public boolean up;
}
public static HashMap<String, KeyState> keyStates = new HashMap<>();
public static LinkedList<IKeyStateTracker> trackers = new LinkedList<>();
public static void tickKeyStates()
{
for(Entry<String, KeyState> entry : keyStates.entrySet())
{
int keyCode = NEIClientConfig.getKeyBinding(entry.getKey());
boolean down = keyCode != 0 && Keyboard.isKeyDown(keyCode);
KeyState state = entry.getValue();
if(down)
{
state.down = !state.held;
state.up = false;
}
else
{
state.up = state.held;
state.down = false;
}
state.held = down;
}
for(IKeyStateTracker tracker : trackers)
tracker.tickKeyStates();
}
}
@@ -3,25 +3,30 @@ package codechicken.nei;
import static codechicken.lib.gui.GuiDraw.drawString;
import static codechicken.lib.gui.GuiDraw.drawStringC;
public class Label extends Widget {
public class Label extends Widget
{
final boolean centered;
final int colour;
public String text;
public Label(String s, boolean center, int color) {
public Label(String s, boolean center, int color)
{
text = s;
centered = center;
colour = color;
}
public Label(String s, boolean center) {
public Label(String s, boolean center)
{
this(s, center, 0xFFFFFFFF);
}
@Override
public void draw(int mousex, int mousey) {
if (centered) drawStringC(text, x, y, colour);
else drawString(text, x, y, colour);
public void draw(int mousex, int mousey)
{
if(centered)
drawStringC(text, x, y, colour);
else
drawString(text, x, y, colour);
}
}
@@ -0,0 +1,202 @@
package codechicken.nei;
import codechicken.nei.api.LayoutStyle;
import net.minecraft.client.gui.inventory.GuiContainer;
import org.lwjgl.opengl.GL11;
import static codechicken.lib.gui.GuiDraw.drawStringC;
import static codechicken.nei.LayoutManager.bookmarkPanel;
import static codechicken.nei.LayoutManager.bookmarksButton;
import static codechicken.nei.LayoutManager.delete;
import static codechicken.nei.LayoutManager.dropDown;
import static codechicken.nei.LayoutManager.gamemode;
import static codechicken.nei.LayoutManager.heal;
import static codechicken.nei.LayoutManager.itemPanel;
import static codechicken.nei.LayoutManager.less;
import static codechicken.nei.LayoutManager.magnet;
import static codechicken.nei.LayoutManager.more;
import static codechicken.nei.LayoutManager.options;
import static codechicken.nei.LayoutManager.quantity;
import static codechicken.nei.LayoutManager.rain;
import static codechicken.nei.LayoutManager.searchField;
import static codechicken.nei.LayoutManager.timeButtons;
import static codechicken.nei.NEIClientConfig.canPerformAction;
import static codechicken.nei.NEIClientConfig.disabledActions;
import static codechicken.nei.NEIClientConfig.getMagnetMode;
import static codechicken.nei.NEIClientConfig.isEnabled;
public class LayoutStyleMinecraft extends LayoutStyle
{
public int buttonCount;
public int leftSize;
public int numButtons;
@Override
public String getName() {
return "minecraft";
}
@Override
public void init() {
delete.icon = new Image(144, 12, 12, 12);
rain.icon = new Image(120, 12, 12, 12);
gamemode.icons[0] = new Image(132, 12, 12, 12);
gamemode.icons[1] = new Image(156, 12, 12, 12);
gamemode.icons[2] = new Image(168, 12, 12, 12);
magnet.icon = new Image(180, 24, 12, 12);
timeButtons[0].icon = new Image(132, 24, 12, 12);
timeButtons[1].icon = new Image(120, 24, 12, 12);
timeButtons[2].icon = new Image(144, 24, 12, 12);
timeButtons[3].icon = new Image(156, 24, 12, 12);
heal.icon = new Image(168, 24, 12, 12);
}
@Override
public void reset() {
buttonCount = 0;
}
@Override
public void layout(GuiContainer gui, VisiblityData visiblity) {
reset();
leftSize = ItemPanels.bookmarkPanel.getWidth(gui);
numButtons = Math.max(leftSize / 18, 1);
delete.state = 0x4;
if (NEIController.getDeleteMode())
delete.state |= 1;
else if (!visiblity.enableDeleteMode)
delete.state |= 2;
rain.state = 0x4;
if (disabledActions.contains("rain"))
rain.state |= 2;
else if (NEIClientUtils.isRaining())
rain.state |= 1;
gamemode.state = 0x4;
if (NEIClientUtils.getGamemode() != 0) {
gamemode.state |= 0x1;
gamemode.index = NEIClientUtils.getGamemode() - 1;
} else {
if (NEIClientUtils.isValidGamemode("creative"))
gamemode.index = 0;
else if (NEIClientUtils.isValidGamemode("creative+"))
gamemode.index = 1;
else if (NEIClientUtils.isValidGamemode("adventure"))
gamemode.index = 2;
}
bookmarksButton.index = NEIClientConfig.isBookmarkPanelHidden() ? 0 : 1;
options.index = NEIClientConfig.getCheatMode();
magnet.state = 0x4 | (getMagnetMode() ? 1 : 0);
if (canPerformAction("delete"))
layoutButton(delete);
if (canPerformAction("rain"))
layoutButton(rain);
if (NEIClientUtils.isValidGamemode("creative") ||
NEIClientUtils.isValidGamemode("creative+") ||
NEIClientUtils.isValidGamemode("adventure"))
layoutButton(gamemode);
if (canPerformAction("magnet"))
layoutButton(magnet);
if (canPerformAction("time")) {
for (int i = 0; i < 4; i++) {
timeButtons[i].state = disabledActions.contains(NEIActions.timeZones[i]) ? 2 : 0;
layoutButton(timeButtons[i]);
}
}
if (canPerformAction("heal"))
layoutButton(heal);
itemPanel.resize(gui);
bookmarkPanel.resize(gui);
more.w = more.h = less.w = less.h = 16;
less.x = itemPanel.prev.x;
more.x = gui.width - less.w - 2;
more.y = less.y = gui.height - more.h - 2;
quantity.x = less.x + less.w + 2;
quantity.y = less.y;
quantity.w = more.x - quantity.x - 2;
quantity.h = less.h;
options.x = isEnabled() ? 0 : 6;
options.y = isEnabled() ? gui.height - 22 : gui.height - 28;
options.w = 22;
options.h = 22;
bookmarksButton.x = 24 + (isEnabled() ? 0 : 6);
bookmarksButton.y = isEnabled() ? gui.height - 22 : gui.height - 28;
bookmarksButton.w = 22;
bookmarksButton.h = 22;
searchField.y = gui.height - searchField.h - 2;
dropDown.x = gui.guiLeft;
dropDown.h = 20;
dropDown.w = Math.min(itemPanel.prev.x - dropDown.x - 3, 100);
searchField.h = 20;
searchField.w = 150;
searchField.x = (gui.width - searchField.w) / 2;
if (!visiblity.showItemSection) {
searchField.setFocus(false);
}
}
public void layoutButton(Button button) {
button.x = 2 + (buttonCount % numButtons) * 20;
button.y = 3 + (buttonCount / numButtons) * 18;
button.h = 17;
button.w = button.contentWidth() + 6;
buttonCount++;
}
@Override
public void drawButton(Button b, int mousex, int mousey) {
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glColor4f(1, 1, 1, 1);
int tex;
if ((b.state & 0x3) == 2)
tex = 0;
else if ((b.state & 0x4) == 0 && b.contains(mousex, mousey) ||//not a state button and mouseover
(b.state & 0x3) == 1)//state active
tex = 2;
else
tex = 1;
LayoutManager.drawButtonBackground(b.x, b.y, b.w, b.h, true, tex);
Image icon = b.getRenderIcon();
if (icon == null) {
int colour = tex == 2 ? 0xffffa0 : tex == 0 ? 0x601010 : 0xe0e0e0;
drawStringC(b.getRenderLabel(), b.x + b.w / 2, b.y + (b.h - 8) / 2, colour);
} else {
GL11.glColor4f(1, 1, 1, 1);
final int iconX = b.x + (b.w - icon.width) / 2;
final int iconY = b.y + (b.h - icon.height) / 2;
LayoutManager.drawIcon(iconX, iconY, icon);
}
}
@Override
public void drawSubsetTag(String text, int x, int y, int w, int h, int state, boolean mouseover) {
if(state == 1)
GL11.glColor4f(0.65F, 0.65F, 0.65F, 1.0F);
else
GL11.glColor4f(1, 1, 1, 1);
LayoutManager.drawButtonBackground(x, y, w, h, false, state == 0 ? 0 : 1);
if(text != null)
drawStringC(text, x, y, w, h, state == 2 ? 0xFFE0E0E0 : 0xFFA0A0A0);
}
}
@@ -5,40 +5,47 @@ import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
public class NEIActions {
public class NEIActions
{
public static final int protocol = 0;
public static HashMap<String, NEIActions> nameActionMap = new HashMap<>();
public static HashSet<String> canDisable = new HashSet<>();
public static void addAction(String name, String base, boolean smpreq) {
public static void addAction(String name, String base, boolean smpreq)
{
NEIActions action = new NEIActions(name, base, smpreq);
nameActionMap.put(name, action);
}
private static void addAction(String name, String base) {
private static void addAction(String name, String base)
{
addAction(name, base, false);
}
public static void addAction(String name) {
public static void addAction(String name)
{
addAction(name, name);
}
private static void addAction(String name, boolean smpreq) {
private static void addAction(String name, boolean smpreq)
{
addAction(name, name, smpreq);
}
public static String base(String name) {
public static String base(String name)
{
NEIActions action = nameActionMap.get(name);
return action == null ? name : action.base;
}
public static boolean smpRequired(String name) {
public static boolean smpRequired(String name)
{
return nameActionMap.get(name).smpreq;
}
public static void init() {
public static void init()
{
addAction("time");
addAction("dawn", "time");
addAction("noon", "time");
@@ -54,7 +61,6 @@ public class NEIActions {
addAction("magnet", true);
addAction("enchant", true);
addAction("potion", true);
addAction("autocraft");
canDisable.add("dawn");
canDisable.add("noon");
@@ -62,23 +68,27 @@ public class NEIActions {
canDisable.add("midnight");
canDisable.add("rain");
}
public static final String[] timeZones = new String[] { "dawn", "noon", "dusk", "midnight" };
public static final String[] gameModes = new String[] { "survival", "creative", "creative+", "adventure" };
public static final String[] timeZones = new String[]{"dawn", "noon", "dusk", "midnight"};
public static final String[] gameModes = new String[]{"survival", "creative", "creative+", "adventure"};
public String name;
public String base;
public boolean smpreq;
public NEIActions(String name, String base, boolean smpreq) {
public NEIActions(String name, String base, boolean smpreq)
{
this.name = name;
this.base = base;
this.smpreq = smpreq;
}
public static List<String> baseActions() {
public static List<String> baseActions()
{
List<String> list = new LinkedList<>();
for (NEIActions a : nameActionMap.values()) if (a.base.equals(a.name)) list.add(a.name);
for(NEIActions a : nameActionMap.values())
if(a.base.equals(a.name))
list.add(a.name);
return list;
}
}
@@ -1,78 +1,54 @@
package codechicken.nei;
import static codechicken.nei.PacketIDs.C2S;
import static codechicken.nei.PacketIDs.S2C;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.inventory.GuiInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.play.INetHandlerPlayClient;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.world.World;
import codechicken.core.ClientUtils;
import codechicken.lib.inventory.InventoryUtils;
import codechicken.lib.packet.PacketCustom;
import codechicken.lib.packet.PacketCustom.IClientPacketHandler;
import codechicken.nei.commands.CommandBookmarkAdd;
import cpw.mods.fml.relauncher.Side;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.inventory.GuiInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.network.play.INetHandlerPlayClient;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.world.World;
public class NEICPH implements IClientPacketHandler {
public class NEICPH implements IClientPacketHandler
{
public static final String channel = "NEI";
@Override
public void handlePacket(PacketCustom packet, Minecraft mc, INetHandlerPlayClient netHandler) {
switch (packet.getType()) {
case S2C.SEND_SERVER_SIDE_CHECK:
case 1:
handleSMPCheck(packet.readUByte(), packet.readString(), mc.theWorld);
break;
case S2C.SEND_LOGIN_STATE:
case 10:
handleLoginState(packet);
break;
case S2C.SEND_ACTION_DISABLED:
case 11:
handleActionDisabled(packet);
break;
case S2C.SEND_ACTION_ENABLED:
case 12:
handleActionEnabled(packet);
break;
case S2C.SEND_MAGNETIC_ITEM:
case 13:
ClientHandler.instance().addSMPMagneticItem(packet.readInt(), mc.theWorld);
break;
case S2C.SEND_GAME_MODE:
case 14:
handleGamemode(mc, packet.readUByte());
break;
case S2C.OPEN_ENCHANTMENT_GUI:
ClientUtils.openSMPGui(
packet.readUByte(),
new GuiEnchantmentModifier(mc.thePlayer.inventory, mc.theWorld, 0, 0, 0));
case 21:
ClientUtils.openSMPGui(packet.readUByte(), new GuiEnchantmentModifier(mc.thePlayer.inventory, mc.theWorld, 0, 0, 0));
break;
case S2C.SET_CREATIVE_PLUS_MODE:
if (packet.readBoolean()) ClientUtils.openSMPGui(
packet.readUByte(),
new GuiExtendedCreativeInv(
new ContainerCreativeInv(mc.thePlayer, new ExtendedCreativeInv(null, Side.CLIENT))));
else mc.displayGuiScreen(new GuiInventory(mc.thePlayer));
case 23:
if (packet.readBoolean())
ClientUtils.openSMPGui(packet.readUByte(), new GuiExtendedCreativeInv(new ContainerCreativeInv(mc.thePlayer, new ExtendedCreativeInv(null, Side.CLIENT))));
else
mc.displayGuiScreen(new GuiInventory(mc.thePlayer));
break;
case S2C.OPEN_POTION_GUI:
case 24:
ClientUtils.openSMPGui(packet.readUByte(), new GuiPotionCreator(mc.thePlayer.inventory));
break;
case S2C.CACHE_BOOKMARK_DATA:
handleCacheBookmarkData(packet);
break;
case S2C.SYNC:
ServerSync.onReply(packet.readInt());
break;
}
}
private void handleCacheBookmarkData(PacketCustom packet) {
final String payloadId = packet.readString();
final NBTTagCompound payloadTag = packet.readNBTTagCompound();
if (payloadTag != null) {
CommandBookmarkAdd.cachePayload(payloadId, payloadTag);
}
}
@@ -82,32 +58,40 @@ public class NEICPH implements IClientPacketHandler {
private void handleActionEnabled(PacketCustom packet) {
String name = packet.readString();
if (packet.readBoolean()) NEIClientConfig.enabledActions.add(name);
else NEIClientConfig.enabledActions.remove(name);
if (packet.readBoolean())
NEIClientConfig.enabledActions.add(name);
else
NEIClientConfig.enabledActions.remove(name);
}
private void handleActionDisabled(PacketCustom packet) {
String name = packet.readString();
if (packet.readBoolean()) NEIClientConfig.disabledActions.add(name);
else NEIClientConfig.disabledActions.remove(name);
if (packet.readBoolean())
NEIClientConfig.disabledActions.add(name);
else
NEIClientConfig.disabledActions.remove(name);
}
private void handleLoginState(PacketCustom packet) {
NEIClientConfig.permissableActions.clear();
int num = packet.readUByte();
for (int i = 0; i < num; i++) NEIClientConfig.permissableActions.add(packet.readString());
for (int i = 0; i < num; i++)
NEIClientConfig.permissableActions.add(packet.readString());
NEIClientConfig.disabledActions.clear();
num = packet.readUByte();
for (int i = 0; i < num; i++) NEIClientConfig.disabledActions.add(packet.readString());
for (int i = 0; i < num; i++)
NEIClientConfig.disabledActions.add(packet.readString());
NEIClientConfig.enabledActions.clear();
num = packet.readUByte();
for (int i = 0; i < num; i++) NEIClientConfig.enabledActions.add(packet.readString());
for (int i = 0; i < num; i++)
NEIClientConfig.enabledActions.add(packet.readString());
NEIClientConfig.bannedBlocks.clear();
num = packet.readInt();
for (int i = 0; i < num; i++) NEIClientConfig.bannedBlocks.add(packet.readItemStack());
for(int i = 0; i < num; i++)
NEIClientConfig.bannedBlocks.add(packet.readItemStack());
if (NEIClientUtils.getGuiContainer() != null)
LayoutManager.instance().refresh(NEIClientUtils.getGuiContainer());
@@ -122,7 +106,7 @@ public class NEICPH implements IClientPacketHandler {
try {
ClientHandler.instance().loadWorld(world, true);
NEIClientConfig.setHasSMPCounterPart(true);
NEIClientConfig.loadWorld(getSaveName());
NEIClientConfig.loadWorld(getSaveName(worldName));
sendRequestLoginInfo();
} catch (Exception e) {
NEIClientConfig.logger.error("Error handling SMP Check", e);
@@ -130,14 +114,15 @@ public class NEICPH implements IClientPacketHandler {
}
}
private static String getSaveName() {
if (Minecraft.getMinecraft().isSingleplayer()) return "local/" + ClientUtils.getWorldSaveName();
private static String getSaveName(String worldName) {
if (Minecraft.getMinecraft().isSingleplayer())
return "local/" + ClientUtils.getWorldSaveName();
return "remote/" + ClientUtils.getServerIP().replace(':', '~');
return "remote/" + ClientUtils.getServerIP().replace(':', '~') + "/" + worldName;
}
public static void sendGiveItem(ItemStack spawnstack, boolean infinite, boolean doSpawn) {
PacketCustom packet = new PacketCustom(channel, C2S.GIVE_ITEM);
PacketCustom packet = new PacketCustom(channel, 1);
packet.writeItemStack(spawnstack, true);
packet.writeBoolean(infinite);
packet.writeBoolean(doSpawn);
@@ -145,7 +130,7 @@ public class NEICPH implements IClientPacketHandler {
}
public static void sendDeleteAllItems() {
PacketCustom packet = new PacketCustom(channel, C2S.DELETE_ALL_ITEMS);
PacketCustom packet = new PacketCustom(channel, 4);
packet.sendToServer();
}
@@ -159,18 +144,12 @@ public class NEICPH implements IClientPacketHandler {
sendSetSlot(slot, item, false);
}
PacketCustom packet = new PacketCustom(channel, C2S.REQUEST_CONTAINER_CONTENTS);
packet.sendToServer();
}
public static void sendRequestContainer() {
PacketCustom packet = new PacketCustom(channel, C2S.REQUEST_CONTAINER);
packet.writeInt(Minecraft.getMinecraft().thePlayer.openContainer.getInventory().size());
PacketCustom packet = new PacketCustom(channel, 11);
packet.sendToServer();
}
public static void sendSetSlot(int slot, ItemStack stack, boolean container) {
PacketCustom packet = new PacketCustom(channel, C2S.SET_SLOT);
PacketCustom packet = new PacketCustom(channel, 5);
packet.writeBoolean(container);
packet.writeShort(slot);
packet.writeItemStack(stack);
@@ -178,44 +157,38 @@ public class NEICPH implements IClientPacketHandler {
}
private static void sendRequestLoginInfo() {
PacketCustom packet = new PacketCustom(channel, C2S.REQUEST_LOGIN_INFO);
PacketCustom packet = new PacketCustom(channel, 10);
packet.sendToServer();
}
public static void sendToggleMagnetMode() {
PacketCustom packet = new PacketCustom(channel, C2S.TOGGLE_MAGNET);
PacketCustom packet = new PacketCustom(channel, 6);
packet.sendToServer();
}
public static void sendSetTime(int hour) {
PacketCustom packet = new PacketCustom(channel, C2S.SET_TIME);
PacketCustom packet = new PacketCustom(channel, 7);
packet.writeByte(hour);
packet.sendToServer();
}
public static void sendHeal() {
PacketCustom packet = new PacketCustom(channel, C2S.HEAL);
PacketCustom packet = new PacketCustom(channel, 8);
packet.sendToServer();
}
public static void sendToggleRain() {
PacketCustom packet = new PacketCustom(channel, C2S.TOGGLE_RAIN);
packet.sendToServer();
}
public static void sendChatLink(NBTTagCompound payloadTag) {
PacketCustom packet = new PacketCustom(channel, C2S.SEND_CHAT_ITEM_LINK);
packet.writeNBTTagCompound(payloadTag);
PacketCustom packet = new PacketCustom(channel, 9);
packet.sendToServer();
}
public static void sendOpenEnchantmentWindow() {
PacketCustom packet = new PacketCustom(channel, C2S.REQUEST_ENCHANTMENT_GUI);
PacketCustom packet = new PacketCustom(channel, 21);
packet.sendToServer();
}
public static void sendModifyEnchantment(int enchID, int level, boolean add) {
PacketCustom packet = new PacketCustom(channel, C2S.MODIFY_ENCHANTMENT);
PacketCustom packet = new PacketCustom(channel, 22);
packet.writeByte(enchID);
packet.writeByte(level);
packet.writeBoolean(add);
@@ -223,30 +196,32 @@ public class NEICPH implements IClientPacketHandler {
}
public static void sendSetPropertyDisabled(String name, boolean enable) {
PacketCustom packet = new PacketCustom(channel, C2S.CHANGE_PROPERTY);
PacketCustom packet = new PacketCustom(channel, 12);
packet.writeString(name);
packet.writeBoolean(enable);
packet.sendToServer();
}
public static void sendGamemode(int mode) {
new PacketCustom(channel, C2S.SET_GAME_MODE).writeByte(mode).sendToServer();
new PacketCustom(channel, 13)
.writeByte(mode)
.sendToServer();
}
public static void sendCreativeInv(boolean open) {
PacketCustom packet = new PacketCustom(channel, C2S.SET_CREATIVE_PLUS_MODE);
PacketCustom packet = new PacketCustom(channel, 23);
packet.writeBoolean(open);
packet.sendToServer();
}
public static void sendCreativeScroll(int steps) {
PacketCustom packet = new PacketCustom(channel, C2S.CYCLE_CREATIVE_INV);
PacketCustom packet = new PacketCustom(channel, 14);
packet.writeInt(steps);
packet.sendToServer();
}
public static void sendMobSpawnerID(int x, int y, int z, String mobtype) {
PacketCustom packet = new PacketCustom(channel, C2S.SEND_MOB_SPAWNER_ID);
PacketCustom packet = new PacketCustom(channel, 15);
packet.writeCoord(x, y, z);
packet.writeString(mobtype);
packet.sendToServer();
@@ -254,16 +229,15 @@ public class NEICPH implements IClientPacketHandler {
public static void sendOpenPotionWindow() {
ItemStack[] potionStore = new ItemStack[9];
InventoryUtils.readItemStacksFromTag(
potionStore,
NEIClientConfig.global.nbt.getCompoundTag("potionStore").getTagList("items", 10));
PacketCustom packet = new PacketCustom(channel, C2S.REQUEST_POTION_GUI);
for (ItemStack stack : potionStore) packet.writeItemStack(stack);
InventoryUtils.readItemStacksFromTag(potionStore, NEIClientConfig.global.nbt.getCompoundTag("potionStore").getTagList("items", 10));
PacketCustom packet = new PacketCustom(channel, 24);
for (ItemStack stack : potionStore)
packet.writeItemStack(stack);
packet.sendToServer();
}
public static void sendDummySlotSet(int slotNumber, ItemStack stack) {
PacketCustom packet = new PacketCustom(channel, C2S.SET_DUMMY_SLOT);
PacketCustom packet = new PacketCustom(channel, 25);
packet.writeShort(slotNumber);
packet.writeItemStack(stack, true);
packet.sendToServer();
@@ -1,18 +1,17 @@
package codechicken.nei;
import java.util.Collections;
import java.util.List;
import codechicken.nei.api.INEIGuiAdapter;
import codechicken.nei.api.TaggedInventoryArea;
import net.minecraft.client.gui.inventory.GuiChest;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.ContainerChest;
import net.minecraft.item.ItemStack;
import codechicken.nei.api.INEIGuiAdapter;
import codechicken.nei.api.TaggedInventoryArea;
public class NEIChestGuiHandler extends INEIGuiAdapter {
import java.util.Collections;
import java.util.List;
public class NEIChestGuiHandler extends INEIGuiAdapter
{
public int chestSize(GuiContainer gui) {
return ((ContainerChest) gui.inventorySlots).getLowerChestInventory().getSizeInventory();
}
@@ -24,8 +23,6 @@ public class NEIChestGuiHandler extends INEIGuiAdapter {
@Override
public List<TaggedInventoryArea> getInventoryAreas(GuiContainer gui) {
return gui instanceof GuiChest
? Collections.singletonList(new TaggedInventoryArea("Chest", 0, chestSize(gui), gui.inventorySlots))
: null;
return gui instanceof GuiChest ? Collections.singletonList(new TaggedInventoryArea("Chest", 0, chestSize(gui), gui.inventorySlots)) : null;
}
}
+469
View File
@@ -0,0 +1,469 @@
package codechicken.nei;
import codechicken.core.CCUpdateChecker;
import codechicken.core.ClassDiscoverer;
import codechicken.core.ClientUtils;
import codechicken.core.CommonUtils;
import codechicken.lib.config.ConfigFile;
import codechicken.lib.config.ConfigTag;
import codechicken.lib.config.ConfigTagParent;
import codechicken.nei.api.API;
import codechicken.nei.api.GuiInfo;
import codechicken.nei.api.IConfigureNEI;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.api.NEIInfo;
import codechicken.nei.config.ConfigSet;
import codechicken.nei.config.GuiHighlightTips;
import codechicken.nei.config.GuiNEIOptionList;
import codechicken.nei.config.GuiOptionList;
import codechicken.nei.config.OptionCycled;
import codechicken.nei.config.OptionGamemodes;
import codechicken.nei.config.OptionList;
import codechicken.nei.config.OptionOpenGui;
import codechicken.nei.config.OptionTextField;
import codechicken.nei.config.OptionToggleButton;
import codechicken.nei.config.OptionToggleButtonBoubs;
import codechicken.nei.config.OptionUtilities;
import codechicken.nei.recipe.GuiRecipeTab;
import codechicken.nei.recipe.RecipeInfo;
import codechicken.obfuscator.ObfuscationRun;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraft.world.storage.SaveFormatComparator;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.lwjgl.input.Keyboard;
import java.io.File;
import java.util.HashSet;
import java.util.List;
public class NEIClientConfig
{
private static boolean configLoaded;
private static boolean enabledOverride;
public static Logger logger = LogManager.getLogger("NotEnoughItems");
public static File configDir = new File(CommonUtils.getMinecraftDir(), "config/NEI/");
public static ConfigSet global = new ConfigSet(
new File("saves/NEI/client.dat"),
new ConfigFile(new File(configDir, "client.cfg")));
public static ConfigSet world;
public static final File bookmarkFile = new File(configDir, "bookmarks.ini");
public static final File handlerFile = new File(configDir, "handlers.csv");
public static ItemStack[] creativeInv;
public static boolean hasSMPCounterpart;
public static HashSet<String> permissableActions = new HashSet<>();
public static HashSet<String> disabledActions = new HashSet<>();
public static HashSet<String> enabledActions = new HashSet<>();
public static ItemStackSet bannedBlocks = new ItemStackSet();
static {
if (global.config.getTag("checkUpdates").getBooleanValue(true))
CCUpdateChecker.updateCheck("NotEnoughItems");
linkOptionList();
setDefaults();
}
private static void setDefaults() {
ConfigTagParent tag = global.config;
tag.setComment("Main configuration of NEI.\nMost of these options can be changed ingame.\nDeleting any element will restore it to it's default value");
tag.getTag("command").useBraces().setComment("Change these options if you have a different mod installed on the server that handles the commands differently, Eg. Bukkit Essentials");
tag.setNewLineMode(1);
tag.getTag("inventory.widgetsenabled").getBooleanValue(true);
API.addOption(new OptionToggleButton("inventory.widgetsenabled"));
tag.getTag("inventory.hidden").getBooleanValue(false);
tag.getTag("inventory.cheatmode").getIntValue(2);
tag.getTag("inventory.lockmode").setComment("For those who can't help themselves.\nSet this to a mode and you will be unable to change it ingame").getIntValue(-1);
API.addOption(new OptionCycled("inventory.cheatmode", 3)
{
@Override
public boolean optionValid(int index) {
return getLockedMode() == -1 || getLockedMode() == index && NEIInfo.isValidMode(index);
}
});
checkCheatMode();
tag.getTag("inventory.utilities").setDefaultValue("delete, magnet");
API.addOption(new OptionUtilities("inventory.utilities"));
tag.getTag("inventory.gamemodes").setDefaultValue("creative, creative+, adventure");
API.addOption(new OptionGamemodes("inventory.gamemodes"));
ItemSorter.initConfig(tag);
tag.getTag("inventory.itemIDs").getIntValue(1);
API.addOption(new OptionCycled("inventory.itemIDs", 3, true));
tag.getTag("inventory.searchmode").getIntValue(1);
API.addOption(new OptionCycled("inventory.searchmode", 3, true));
tag.getTag("world.highlight_tips").getBooleanValue(false);
tag.getTag("world.highlight_tips.x").getIntValue(5000);
tag.getTag("world.highlight_tips.y").getIntValue(100);
API.addOption(new OptionOpenGui("world.highlight_tips", GuiHighlightTips.class));
tag.getTag("inventory.profileRecipes").getBooleanValue(false);
API.addOption(new OptionToggleButton("inventory.profileRecipes", true));
tag.getTag("command.creative").setDefaultValue("/gamemode {0} {1}");
API.addOption(new OptionTextField("command.creative"));
tag.getTag("command.item").setDefaultValue("/give {0} {1} {2} {3} {4}");
API.addOption(new OptionTextField("command.item"));
tag.getTag("command.time").setDefaultValue("/time set {0}");
API.addOption(new OptionTextField("command.time"));
tag.getTag("command.rain").setDefaultValue("/toggledownfall");
API.addOption(new OptionTextField("command.rain"));
tag.getTag("command.heal").setDefaultValue("");
API.addOption(new OptionTextField("command.heal"));
tag.getTag("inventory.bookmarksEnabled").setComment("Enable/disable bookmarks").getBooleanValue(true);
API.addOption(new OptionToggleButton("inventory.bookmarksEnabled", true));
tag.getTag("inventory.jei_style_tabs").setComment("Enable/disable JEI Style Tabs").getBooleanValue(true);
API.addOption(new OptionToggleButtonBoubs("inventory.jei_style_tabs", true));
tag.getTag("inventory.creative_tab_style").setComment("Creative or JEI style tabs").getBooleanValue(false);
API.addOption(new OptionToggleButton("inventory.creative_tab_style", true));
tag.getTag("tools.handler_load_from_config").setComment("ADVANCED: Load handlers from config").getBooleanValue(false);
API.addOption(new OptionToggleButton("tools.handler_load_from_config", true) {
@Override
public boolean onClick(int button) {
super.onClick(button);
GuiRecipeTab.loadHandlerInfo();
return true;
}
});
setDefaultKeyBindings();
}
private static void linkOptionList() {
OptionList.setOptionList(new OptionList("nei.options")
{
@Override
public ConfigSet globalConfigSet() {
return global;
}
@Override
public ConfigSet worldConfigSet() {
return world;
}
@Override
public OptionList configBase() {
return this;
}
@Override
public GuiOptionList getGui(GuiScreen parent, OptionList list, boolean world) {
return new GuiNEIOptionList(parent, list, world);
}
});
}
private static void setDefaultKeyBindings() {
API.addKeyBind("gui.recipe", Keyboard.KEY_R);
API.addKeyBind("gui.usage", Keyboard.KEY_U);
API.addKeyBind("gui.back", Keyboard.KEY_BACK);
API.addKeyBind("gui.enchant", Keyboard.KEY_X);
API.addKeyBind("gui.potion", Keyboard.KEY_P);
API.addKeyBind("gui.prev", Keyboard.KEY_PRIOR);
API.addKeyBind("gui.next", Keyboard.KEY_NEXT);
API.addKeyBind("gui.prev_machine", Keyboard.KEY_UP);
API.addKeyBind("gui.next_machine", Keyboard.KEY_DOWN);
API.addKeyBind("gui.prev_recipe", Keyboard.KEY_LEFT);
API.addKeyBind("gui.next_recipe", Keyboard.KEY_RIGHT);
API.addKeyBind("gui.hide", Keyboard.KEY_O);
API.addKeyBind("gui.search", Keyboard.KEY_F);
API.addKeyBind("gui.bookmark", Keyboard.KEY_A);
API.addKeyBind("gui.hide_bookmarks", Keyboard.KEY_B);
API.addKeyBind("world.chunkoverlay", Keyboard.KEY_F9);
API.addKeyBind("world.moboverlay", Keyboard.KEY_F7);
API.addKeyBind("world.highlight_tips", Keyboard.KEY_NUMPAD0);
API.addKeyBind("world.dawn", 0);
API.addKeyBind("world.noon", 0);
API.addKeyBind("world.dusk", 0);
API.addKeyBind("world.midnight", 0);
API.addKeyBind("world.rain", 0);
API.addKeyBind("world.heal", 0);
API.addKeyBind("world.creative", 0);
}
public static OptionList getOptionList() {
return OptionList.getOptionList("nei.options");
}
public static void loadWorld(String saveName) {
setInternalEnabled(true);
logger.debug("Loading "+(Minecraft.getMinecraft().isSingleplayer() ? "Local" : "Remote")+" World");
bootNEI(ClientUtils.getWorld());
File saveDir = new File(CommonUtils.getMinecraftDir(), "saves/NEI/" + saveName);
boolean newWorld = !saveDir.exists();
if (newWorld)
saveDir.mkdirs();
world = new ConfigSet(new File(saveDir, "NEI.dat"), new ConfigFile(new File(saveDir, "NEI.cfg")));
onWorldLoad(newWorld);
}
private static void onWorldLoad(boolean newWorld) {
world.config.setComment("World based configuration of NEI.\nMost of these options can be changed ingame.\nDeleting any element will restore it to it's default value");
setWorldDefaults();
creativeInv = new ItemStack[54];
LayoutManager.searchField.setText(getSearchExpression());
LayoutManager.quantity.setText(Integer.toString(getItemQuantity()));
SubsetWidget.loadHidden();
if (newWorld && Minecraft.getMinecraft().isSingleplayer())
world.config.getTag("inventory.cheatmode").setIntValue(NEIClientUtils.mc().playerController.isInCreativeMode() ? 2 : 0);
NEIInfo.load(ClientUtils.getWorld());
}
private static void setWorldDefaults() {
NBTTagCompound nbt = world.nbt;
if (!nbt.hasKey("search")) nbt.setString("search", "");
if (!nbt.hasKey("quantity")) nbt.setInteger("quantity", 0);
if (!nbt.hasKey("validateenchantments")) nbt.setBoolean("validateenchantments", false);
world.saveNBT();
}
public static int getKeyBinding(String string) {
return getSetting("keys." + string).getIntValue();
}
public static void setDefaultKeyBinding(String string, int key) {
getSetting("keys." + string).getIntValue(key);
}
public static void bootNEI(World world) {
if (configLoaded)
return;
ItemInfo.load(world);
GuiInfo.load();
RecipeInfo.load();
LayoutManager.load();
ItemPanels.bookmarkPanel.loadBookmarks();
NEIController.load();
configLoaded = true;
new Thread("NEI Plugin Loader") {
@Override
public void run() {
ClassDiscoverer classDiscoverer = new ClassDiscoverer(test -> test.startsWith("NEI") && test.endsWith("Config.class"), IConfigureNEI.class);
classDiscoverer.findClasses();
for (Class<?> clazz : classDiscoverer.classes) {
try {
IConfigureNEI config = (IConfigureNEI) clazz.newInstance();
config.loadConfig();
NEIModContainer.plugins.add(config);
logger.debug("Loaded " + clazz.getName());
} catch (Exception e) {
logger.error("Failed to Load " + clazz.getName(), e);
}
}
}
}.start();
ItemSorter.loadConfig();
}
public static boolean isWorldSpecific(String setting) {
if(world == null) return false;
ConfigTag tag = world.config.getTag(setting, false);
return tag != null && tag.value != null;
}
public static ConfigTag getSetting(String s) {
return isWorldSpecific(s) ? world.config.getTag(s) : global.config.getTag(s);
}
public static boolean getBooleanSetting(String s) {
return getSetting(s).getBooleanValue();
}
public static boolean isHidden() {
return !enabledOverride || getBooleanSetting("inventory.hidden");
}
public static boolean isBookmarkPanelHidden() {
return !getBooleanSetting("inventory.bookmarksEnabled");
}
public static boolean areJEIStyleTabsVisible() {
return getBooleanSetting("inventory.jei_style_tabs");
}
public static boolean useCreativeTabStyle() {
return getBooleanSetting("inventory.creative_tab_style");
}
public static boolean isEnabled() {
return enabledOverride && getBooleanSetting("inventory.widgetsenabled");
}
public static boolean loadHandlersFromJar() {
return !getBooleanSetting("tools.handler_load_from_config");
}
public static void setEnabled(boolean flag) {
getSetting("inventory.widgetsenabled").setBooleanValue(flag);
}
public static int getItemQuantity() {
return world.nbt.getInteger("quantity");
}
public static int getCheatMode() {
return getIntSetting("inventory.cheatmode");
}
private static void checkCheatMode() {
if (getLockedMode() != -1)
setIntSetting("inventory.cheatmode", getLockedMode());
}
public static int getLockedMode() {
return getIntSetting("inventory.lockmode");
}
public static int getLayoutStyle() {
return getIntSetting("inventory.layoutstyle");
}
public static String getStringSetting(String s) {
return getSetting(s).getValue();
}
public static boolean showIDs() {
int i = getIntSetting("inventory.itemIDs");
return i == 2 || (i == 1 && isEnabled() && !isHidden());
}
public static void toggleBooleanSetting(String setting) {
ConfigTag tag = getSetting(setting);
tag.setBooleanValue(!tag.getBooleanValue());
}
public static void cycleSetting(String setting, int max) {
ConfigTag tag = getSetting(setting);
tag.setIntValue((tag.getIntValue() + 1) % max);
}
public static int getIntSetting(String setting) {
return getSetting(setting).getIntValue();
}
public static void setIntSetting(String setting, int val) {
getSetting(setting).setIntValue(val);
}
public static String getSearchExpression() {
return world.nbt.getString("search");
}
public static void setSearchExpression(String expression) {
world.nbt.setString("search", expression);
world.saveNBT();
}
public static boolean getMagnetMode() {
return enabledActions.contains("magnet");
}
public static boolean invCreativeMode() {
return enabledActions.contains("creative+") && canPerformAction("creative+");
}
public static boolean areDamageVariantsShown() {
return hasSMPCounterPart() || getSetting("command.item").getValue().contains("{3}");
}
public static boolean hasSMPCounterPart() {
return hasSMPCounterpart;
}
public static void setHasSMPCounterPart(boolean flag) {
hasSMPCounterpart = flag;
permissableActions.clear();
bannedBlocks.clear();
disabledActions.clear();
enabledActions.clear();
}
public static boolean canCheatItem(ItemStack stack) {
return canPerformAction("item") && !bannedBlocks.contains(stack);
}
public static boolean canPerformAction(String name) {
if (!isEnabled())
return false;
if (!modePermitsAction(name))
return false;
String base = NEIActions.base(name);
if (hasSMPCounterpart)
return permissableActions.contains(base);
if (NEIActions.smpRequired(name))
return false;
String cmd = getStringSetting("command." + base);
return cmd != null && cmd.startsWith("/");
}
private static boolean modePermitsAction(String name) {
if (getCheatMode() == 0) return false;
if (getCheatMode() == 2) return true;
String[] actions = getStringArrSetting("inventory.utilities");
for (String action : actions)
if (action.equalsIgnoreCase(name))
return true;
return false;
}
public static String[] getStringArrSetting(String s) {
return getStringSetting(s).replace(" ", "").split(",");
}
public static void setInternalEnabled(boolean b) {
enabledOverride = b;
}
public static void reloadSaves() {
File saveDir = new File(CommonUtils.getMinecraftDir(), "saves/NEI/local");
if (!saveDir.exists())
return;
List<SaveFormatComparator> saves;
try {
saves = Minecraft.getMinecraft().getSaveLoader().getSaveList();
} catch (Exception e) {
logger.error("Error loading saves", e);
return;
}
HashSet<String> saveFileNames = new HashSet<>();
for (SaveFormatComparator save : saves)
saveFileNames.add(save.getFileName());
for (File file : saveDir.listFiles())
if (file.isDirectory() && !saveFileNames.contains(file.getName()))
ObfuscationRun.deleteDir(file, true);
}
}
+367
View File
@@ -0,0 +1,367 @@
package codechicken.nei;
import codechicken.lib.inventory.InventoryRange;
import codechicken.lib.inventory.InventoryUtils;
import codechicken.lib.util.LangProxy;
import codechicken.nei.api.GuiInfo;
import codechicken.nei.api.IInfiniteItemHandler;
import codechicken.nei.api.INEIGuiHandler;
import codechicken.nei.api.ItemInfo;
import com.google.common.collect.Iterables;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IChatComponent;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.input.Keyboard;
import java.text.MessageFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import static codechicken.nei.NEIClientConfig.canCheatItem;
import static codechicken.nei.NEIClientConfig.canPerformAction;
import static codechicken.nei.NEIClientConfig.getItemQuantity;
import static codechicken.nei.NEIClientConfig.getStringArrSetting;
import static codechicken.nei.NEIClientConfig.getStringSetting;
import static codechicken.nei.NEIClientConfig.hasSMPCounterPart;
import static codechicken.nei.NEIClientConfig.invCreativeMode;
import static codechicken.nei.NEIClientConfig.world;
public class NEIClientUtils extends NEIServerUtils
{
public static LangProxy lang = new LangProxy("nei");
public static Minecraft mc() {
return Minecraft.getMinecraft();
}
public static String translate(String key, Object... params) {
return lang.format(key, params);
}
public static void printChatMessage(IChatComponent msg) {
if (mc().ingameGUI != null)
mc().ingameGUI.getChatGUI().printChatMessage(msg);
}
public static void deleteHeldItem() {
deleteSlotStack(-999);
}
public static void dropHeldItem() {
mc().playerController.windowClick(((GuiContainer) mc().currentScreen).inventorySlots.windowId, -999, 0, 0, mc().thePlayer);
}
public static void deleteSlotStack(int slotNumber) {
setSlotContents(slotNumber, null, true);
}
public static void decreaseSlotStack(int slotNumber) {
ItemStack stack = slotNumber == -999 ? getHeldItem() : mc().thePlayer.openContainer.getSlot(slotNumber).getStack();
if (stack == null)
return;
if (stack.stackSize == 1)
deleteSlotStack(slotNumber);
else {
stack = stack.copy();
stack.stackSize--;
setSlotContents(slotNumber, stack, true);
}
}
public static void deleteEverything() {
NEICPH.sendDeleteAllItems();
}
public static void deleteItemsOfType(ItemStack type) {
Container c = getGuiContainer().inventorySlots;
for (int i = 0; i < c.inventorySlots.size(); i++) {
Slot slot = c.getSlot(i);
if (slot == null)
continue;
ItemStack stack = slot.getStack();
if (stack != null && stack.getItem() == type.getItem() && stack.getItemDamage() == type.getItemDamage()) {
setSlotContents(i, null, true);
slot.putStack(null);
}
}
}
public static ItemStack getHeldItem() {
return mc().thePlayer.inventory.getItemStack();
}
public static void setSlotContents(int slot, ItemStack item, boolean containerInv) {
NEICPH.sendSetSlot(slot, item, containerInv);
if (slot == -999)
mc().thePlayer.inventory.setItemStack(item);
}
/**
* @param mode -1 = normal cheats, 0 = no infinites, 1 = replenish stack
*/
public static void cheatItem(ItemStack stack, int button, int mode) {
if (!canCheatItem(stack))
return;
if (mode == -1 && button == 0 && shiftKey() && NEIClientConfig.hasSMPCounterPart()) {
for (IInfiniteItemHandler handler : ItemInfo.infiniteHandlers) {
if (!handler.canHandleItem(stack))
continue;
ItemStack inf = handler.getInfiniteItem(stack);
if (inf != null) {
giveStack(inf, inf.stackSize, true);
return;
}
}
cheatItem(stack, button, 0);
} else if (button == 1) {
giveStack(stack, 1);
} else {
if (mode == 1 && stack.stackSize < stack.getMaxStackSize()) {
giveStack(stack, stack.getMaxStackSize() - stack.stackSize);
} else {
int amount = getItemQuantity();
if (amount == 0)
amount = stack.getMaxStackSize();
giveStack(stack, amount);
}
}
}
public static void giveStack(ItemStack itemstack) {
giveStack(itemstack, itemstack.stackSize);
}
public static void giveStack(ItemStack itemstack, int i) {
giveStack(itemstack, i, false);
}
public static void giveStack(ItemStack base, int i, boolean infinite) {
ItemStack stack = copyStack(base, i);
if (hasSMPCounterPart()) {
ItemStack typestack = copyStack(stack, 1);
if (!infinite && !canItemFitInInventory(mc().thePlayer, stack) && (mc().currentScreen instanceof GuiContainer)) {
GuiContainer gui = getGuiContainer();
List<Iterable<Integer>> handlerSlots = new LinkedList<>();
for(INEIGuiHandler handler : GuiInfo.guiHandlers)
handlerSlots.add(handler.getItemSpawnSlots(gui, typestack));
int increment = typestack.getMaxStackSize();
int given = 0;
for(int slotNo : Iterables.concat(handlerSlots)) {
Slot slot = gui.inventorySlots.getSlot(slotNo);
if(!slot.isItemValid(typestack) || !InventoryUtils.canStack(slot.getStack(), typestack))
continue;
int qty = Math.min(stack.stackSize - given, increment);
int current = slot.getHasStack() ? slot.getStack().stackSize : 0;
qty = Math.min(qty, slot.getSlotStackLimit() - current);
ItemStack newStack = copyStack(typestack, qty + current);
slot.putStack(newStack);
setSlotContents(slotNo, newStack, true);
given += qty;
if(given >= stack.stackSize)
break;
}
if(given > 0)
NEICPH.sendGiveItem(copyStack(typestack, given), false, false);
} else
NEICPH.sendGiveItem(stack, infinite, true);
} else {
for (int given = 0; given < stack.stackSize; ) {
int qty = Math.min(stack.stackSize - given, stack.getMaxStackSize());
sendCommand(getStringSetting("command.item"),
mc().thePlayer.getCommandSenderName(),
Item.getIdFromItem(stack.getItem()),
qty,
stack.getItemDamage(),
stack.hasTagCompound() ? stack.getTagCompound().toString() : "",
Item.itemRegistry.getNameForObject(stack.getItem()));
given += qty;
}
}
}
public static boolean canItemFitInInventory(EntityPlayer player, ItemStack itemstack) {
return InventoryUtils.getInsertibleQuantity(new InventoryRange(player.inventory, 0, 36), itemstack) > 0;
}
public static boolean shiftKey() {
return Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT);
}
public static boolean controlKey() {
return Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL);
}
public static int getGamemode() {
if (invCreativeMode())
return 2;
else if (mc().playerController.isInCreativeMode())
return 1;
else if (mc().playerController.currentGameType.isAdventure())
return 3;
else
return 0;
}
public static boolean isValidGamemode(String s) {
return s.equals("survival") ||
canPerformAction(s) &&
Arrays.asList(getStringArrSetting("inventory.gamemodes")).contains(s);
}
public static int getNextGamemode() {
int mode = getGamemode();
int nmode = mode;
while (true) {
nmode = (nmode + 1) % NEIActions.gameModes.length;
if (nmode == mode || isValidGamemode(NEIActions.gameModes[nmode]))
break;
}
return nmode;
}
public static void cycleGamemode() {
int mode = getGamemode();
int nmode = getNextGamemode();
if (mode == nmode)
return;
if (hasSMPCounterPart())
NEICPH.sendGamemode(nmode);
else
sendCommand(getStringSetting("command.creative"), getGameType(nmode), mc().thePlayer.getCommandSenderName());
}
public static long getTime() {
return mc().theWorld.getWorldInfo().getWorldTime();
}
public static void setTime(long l) {
mc().theWorld.getWorldInfo().setWorldTime(l);
}
public static void setHourForward(int hour) {
long day = (getTime() / 24000L) * 24000L;
long newTime = day + 24000L + hour * 1000;
if (hasSMPCounterPart())
NEICPH.sendSetTime(hour);
else
sendCommand(getStringSetting("command.time"), newTime);
}
public static void sendCommand(String command, Object... args) {
if (command.length() == 0)
return;
NumberFormat numberformat = NumberFormat.getIntegerInstance();
numberformat.setGroupingUsed(false);
MessageFormat messageformat = new MessageFormat(command);
for (int i = 0; i < args.length; i++)
if (args[i] instanceof Integer || args[i] instanceof Long)
messageformat.setFormatByArgumentIndex(i, numberformat);
mc().thePlayer.sendChatMessage(messageformat.format(args));
}
public static boolean isRaining() {
return mc().theWorld.getWorldInfo().isRaining();
}
public static void toggleRaining() {
if (hasSMPCounterPart())
NEICPH.sendToggleRain();
else
sendCommand(getStringSetting("command.rain"), isRaining() ? 0 : 1);
}
public static void healPlayer() {
if (hasSMPCounterPart())
NEICPH.sendHeal();
else
sendCommand(getStringSetting("command.heal"), mc().thePlayer.getCommandSenderName());
}
public static void toggleMagnetMode() {
if (hasSMPCounterPart())
NEICPH.sendToggleMagnetMode();
}
public static ArrayList<int[]> concatIntegersToRanges(List<Integer> damages) {
ArrayList<int[]> ranges = new ArrayList<>();
if (damages.size() == 0) return ranges;
Collections.sort(damages);
int start = -1;
int next = 0;
for (Integer i : damages) {
if (start == -1) {
start = next = i;
continue;
}
if (next + 1 != i) {
ranges.add(new int[]{start, next});
start = next = i;
continue;
}
next = i;
}
ranges.add(new int[]{start, next});
return ranges;
}
public static ArrayList<int[]> addIntegersToRanges(List<int[]> ranges, List<Integer> damages) {
for (int[] range : ranges)
for (int integer = range[0]; integer <= range[1]; integer++)
damages.add(integer);
return concatIntegersToRanges(damages);
}
public static boolean safeKeyDown(int keyCode) {
try {
return Keyboard.isKeyDown(keyCode);
} catch (IndexOutOfBoundsException e) {
return false;
}
}
public static void setItemQuantity(int i) {
world.nbt.setInteger("quantity", i);
world.saveNBT();
LayoutManager.quantity.setText(Integer.toString(i));
}
public static GuiContainer getGuiContainer() {
if (mc().currentScreen instanceof GuiContainer)
return (GuiContainer) mc().currentScreen;
return null;
}
public static boolean altKey() {
return Keyboard.isKeyDown(Keyboard.KEY_LMENU) || Keyboard.isKeyDown(Keyboard.KEY_RMENU);
}
public static void playClickSound() {
mc().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
}
}
@@ -0,0 +1,5 @@
package codechicken.nei;
public class NEICompatibility
{
}
@@ -1,38 +1,27 @@
package codechicken.nei;
import static codechicken.lib.gui.GuiDraw.getMousePosition;
import static codechicken.nei.NEIClientConfig.canCheatItem;
import java.awt.Point;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.gui.inventory.GuiContainerCreative;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Slot;
import net.minecraft.inventory.SlotCrafting;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.client.ClientCommandHandler;
import codechicken.core.CommonUtils;
import codechicken.lib.gui.GuiDraw;
import codechicken.nei.api.API;
import codechicken.nei.api.GuiInfo;
import codechicken.nei.api.IInfiniteItemHandler;
import codechicken.nei.api.INEIGuiHandler;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.commands.CommandBookmarkAdd;
import codechicken.nei.commands.CommandRecipeId;
import codechicken.nei.commands.CommandUntranslator;
import codechicken.nei.guihook.GuiContainerManager;
import codechicken.nei.guihook.IContainerInputHandler;
import codechicken.nei.guihook.IContainerSlotClickHandler;
import codechicken.nei.util.EmptyContainer;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.gui.inventory.GuiContainerCreative;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Slot;
import net.minecraft.inventory.SlotCrafting;
import net.minecraft.item.ItemStack;
public class NEIController implements IContainerSlotClickHandler, IContainerInputHandler {
import java.awt.Point;
import java.util.LinkedList;
import static codechicken.lib.gui.GuiDraw.getMousePosition;
public class NEIController implements IContainerSlotClickHandler, IContainerInputHandler
{
private static final NEIController instance = new NEIController();
public static GuiContainerManager manager;
@@ -48,8 +37,6 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
public static void load() {
GuiContainerManager.addSlotClickHandler(instance);
GuiContainerManager.addInputHandler(instance);
if (CommonUtils.isClient()) registerClientCommands();
}
public static void load(GuiContainer gui) {
@@ -57,70 +44,57 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
deleteMode = false;
GuiInfo.clearGuiHandlers();
fastTransferManager = null;
if (!NEIClientConfig.isEnabled()) return;
if (!NEIClientConfig.isEnabled())
return;
fastTransferManager = new FastTransferManager();
if (gui instanceof INEIGuiHandler) API.registerNEIGuiHandler((INEIGuiHandler) gui);
if (gui instanceof INEIGuiHandler)
API.registerNEIGuiHandler((INEIGuiHandler) gui);
}
public static boolean isSpreading(GuiContainer gui) {
return gui.field_147007_t && gui.field_147008_s.size() > 1;
}
@SideOnly(Side.CLIENT)
public static void registerClientCommands() {
ClientCommandHandler.instance.registerCommand(new CommandBookmarkAdd());
ClientCommandHandler.instance.registerCommand(new CommandRecipeId());
ClientCommandHandler.instance.registerCommand(new CommandUntranslator());
}
public static void updateUnlimitedItems(InventoryPlayer inventory) {
if (!NEIClientConfig.canPerformAction("item") || !NEIClientConfig.hasSMPCounterPart()) return;
if (!NEIClientConfig.canPerformAction("item") || !NEIClientConfig.hasSMPCounterPart())
return;
int size = inventory.getSizeInventory();
for (int i = 0; i < size; i++) {
LinkedList<ItemStack> beforeStacks = new LinkedList<>();
for (int i = 0; i < inventory.getSizeInventory(); i++)
beforeStacks.add(NEIServerUtils.copyStack(inventory.getStackInSlot(i)));
for (int i = 0; i < inventory.getSizeInventory(); i++) {
ItemStack stack = inventory.getStackInSlot(i);
if (stack == null) continue;
if (stack == null)
continue;
for (IInfiniteItemHandler handler : ItemInfo.infiniteHandlers) {
if (!handler.canHandleItem(stack) || !handler.isItemInfinite(stack)) continue;
for (IInfiniteItemHandler handler : ItemInfo.infiniteHandlers)
if (handler.canHandleItem(stack) && handler.isItemInfinite(stack))
handler.replenishInfiniteStack(inventory, i);
}
long beforeSize = packStackSize(stack.stackSize, stack.getItemDamage());
handler.replenishInfiniteStack(inventory, i);
for (int i = 0; i < inventory.getSizeInventory(); i++) {
ItemStack newstack = inventory.getStackInSlot(i);
ItemStack newstack = inventory.getStackInSlot(i);
if (!sameStack(stack, beforeSize, newstack)) {
NEIClientUtils.setSlotContents(i, newstack, false); // sends via SMP handler ;)
stack.stackSize = (int) (beforeSize >> 32);
stack.setItemDamage((int) beforeSize);
inventory.setInventorySlotContents(i, stack); // restore in case of SMP fail
}
if (!NEIServerUtils.areStacksIdentical(beforeStacks.get(i), newstack)) {
inventory.setInventorySlotContents(i, beforeStacks.get(i));//restore in case of SMP fail
NEIClientUtils.setSlotContents(i, newstack, false);//sends via SMP handler ;)
}
}
}
private static long packStackSize(int stackSize, int itemDamage) {
return ((long) stackSize << 32) | (itemDamage & 0xFFFFFFFFL);
}
private static boolean sameStack(ItemStack before, long beforeSize, ItemStack stack) {
if (stack == null) return before == null;
return before != null && Item.getIdFromItem(before.getItem()) == Item.getIdFromItem(stack.getItem())
&& beforeSize == packStackSize(stack.stackSize, stack.getItemDamage());
}
public static void processCreativeCycling(InventoryPlayer inventory) {
if (NEIClientConfig.invCreativeMode() && NEIClientUtils.controlKey()) {
if (selectedItem != inventory.currentItem) {
if (inventory.currentItem == selectedItem + 1 || (inventory.currentItem == 0 && selectedItem == 8)) // foward
if (inventory.currentItem == selectedItem + 1 || (inventory.currentItem == 0 && selectedItem == 8))//foward
{
NEICPH.sendCreativeScroll(1);
inventory.currentItem = selectedItem;
} else if (inventory.currentItem == selectedItem - 1
|| (inventory.currentItem == 8 && selectedItem == 0)) {
NEICPH.sendCreativeScroll(-1);
inventory.currentItem = selectedItem;
}
} else if (inventory.currentItem == selectedItem - 1 || (inventory.currentItem == 8 && selectedItem == 0)) {
NEICPH.sendCreativeScroll(-1);
inventory.currentItem = selectedItem;
}
}
}
@@ -129,72 +103,61 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
@Override
public void beforeSlotClick(GuiContainer gui, int slotIndex, int button, Slot slot, int modifier) {
if (!NEIClientConfig.isEnabled()) return;
if (!NEIClientConfig.isEnabled())
return;
firstheld = NEIClientUtils.getHeldItem();
}
@Override
public boolean handleSlotClick(GuiContainer gui, int slotIndex, int button, Slot slot, int modifier,
boolean eventconsumed) {
if (eventconsumed || !NEIClientConfig.isEnabled() || isSpreading(gui)) return eventconsumed;
public boolean handleSlotClick(GuiContainer gui, int slotIndex, int button, Slot slot, int modifier, boolean eventconsumed) {
if (eventconsumed ||
!NEIClientConfig.isEnabled() ||
isSpreading(gui))
return eventconsumed;
if (deleteMode && slotIndex >= 0 && slot != null) {
if (NEIClientUtils.shiftKey() && button == 0) {
ItemStack itemstack1 = slot.getStack();
if (itemstack1 != null) NEIClientUtils.deleteItemsOfType(itemstack1);
if (itemstack1 != null)
NEIClientUtils.deleteItemsOfType(itemstack1);
} else if (button == 1) NEIClientUtils.decreaseSlotStack(slot.slotNumber);
else NEIClientUtils.deleteSlotStack(slot.slotNumber);
} else if (button == 1)
NEIClientUtils.decreaseSlotStack(slot.slotNumber);
else
NEIClientUtils.deleteSlotStack(slot.slotNumber);
return true;
}
if (button == 1 && modifier != 2 && slot instanceof SlotCrafting) // right click
if (button == 1 && slot instanceof SlotCrafting)//right click
{
for (int i1 = 0; i1 < 64; i1++) // click this slot 64 times
for (int i1 = 0; i1 < 64; i1++)//click this slot 64 times
manager.handleSlotClick(slot.slotNumber, button, 0);
return true;
}
if (NEIClientUtils.controlKey() && modifier != 4 // Drop key pressed:
// net.minecraft.client.gui.inventory.GuiContainer.keyTyped
&& slot != null
&& slot.getStack() != null
if (NEIClientUtils.controlKey()
&& slot != null && slot.getStack() != null
&& slot.isItemValid(slot.getStack())) {
if (!canCheatItem(slot.getStack())) return false;
NEIClientUtils.cheatItem(slot.getStack(), button, 1);
return true;
}
if (GuiInfo.hasCustomSlots(gui)) return false;
if(GuiInfo.hasCustomSlots(gui))
return false;
if (NEIClientUtils.shiftKey() && button != 2) { // MMB is used by other mods when an itemstack is picked.
// fix small mouse movement while clicking causing slotIndex to be -999
if (slotIndex == -999) {
final Point mouse = GuiDraw.getMousePosition();
slot = gui.getSlotAtPosition(mouse.x, mouse.y);
if (slotIndex >= 0 && NEIClientUtils.shiftKey() && NEIClientUtils.getHeldItem() != null && !slot.getHasStack()) {
ItemStack held = NEIClientUtils.getHeldItem();
manager.handleSlotClick(slot.slotNumber, button, 0);
if (slot.isItemValid(held) && !ItemInfo.fastTransferExemptions.contains(slot.getClass()))
fastTransferManager.performMassTransfer(gui, pickedUpFromSlot, slotIndex, held);
if (slot != null) {
slotIndex = slot.slotNumber;
}
}
return true;
}
if (slotIndex >= 0 && NEIClientUtils.getHeldItem() != null && !slot.getHasStack()) {
final ItemStack held = NEIClientUtils.getHeldItem();
manager.handleSlotClick(slot.slotNumber, button, 0);
if (slot.isItemValid(held) && !ItemInfo.fastTransferExemptions.contains(slot.getClass())) {
fastTransferManager.performMassTransfer(gui, pickedUpFromSlot, slotIndex, held);
}
return true;
}
if (slotIndex == -999 && button == 0) {
fastTransferManager.throwAll(gui, pickedUpFromSlot);
return true;
}
if (slotIndex == -999 && NEIClientUtils.shiftKey() && button == 0) {
fastTransferManager.throwAll(gui, pickedUpFromSlot);
return true;
}
return false;
@@ -202,15 +165,16 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
@Override
public void afterSlotClick(GuiContainer gui, int slotIndex, int button, Slot slot, int modifier) {
if (!NEIClientConfig.isEnabled()) return;
if (!NEIClientConfig.isEnabled())
return;
ItemStack nowHeld = NEIClientUtils.getHeldItem();
if (firstheld != nowHeld) pickedUpFromSlot = slotIndex;
if (firstheld != nowHeld)
pickedUpFromSlot = slotIndex;
if (NEIClientConfig.canPerformAction("item") && NEIClientConfig.hasSMPCounterPart()) {
if (heldStackInfinite != null && slot != null
&& slot.inventory == NEIClientUtils.mc().thePlayer.inventory) {
if (heldStackInfinite != null && slot != null && slot.inventory == NEIClientUtils.mc().thePlayer.inventory) {
ItemStack stack = slot.getStack();
if (stack != null) {
heldStackInfinite.onPlaceInfinite(stack);
@@ -218,7 +182,8 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
NEIClientUtils.setSlotContents(slotIndex, stack, true);
}
if (firstheld != nowHeld) heldStackInfinite = null;
if (firstheld != nowHeld)
heldStackInfinite = null;
if (firstheld != nowHeld && nowHeld != null) {
for (IInfiniteItemHandler handler : ItemInfo.infiniteHandlers) {
@@ -235,10 +200,14 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
@Override
public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyCode) {
if (!NEIClientConfig.isEnabled() || GuiInfo.hasCustomSlots(gui) || isSpreading(gui)) return false;
if (!NEIClientConfig.isEnabled() ||
GuiInfo.hasCustomSlots(gui) ||
isSpreading(gui))
return false;
Slot slot = GuiContainerManager.getSlotMouseOver(gui);
if (slot == null) return false;
if (slot == null)
return false;
int slotIndex = slot.slotNumber;
@@ -255,22 +224,16 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
@Override
public boolean mouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {
if (!NEIClientConfig.isEnabled() || GuiInfo.hasCustomSlots(gui)
|| !NEIClientConfig.isMouseScrollTransferEnabled())
if (!NEIClientConfig.isEnabled() || GuiInfo.hasCustomSlots(gui))
return false;
// slot in GuiRecipe does not contain actual stack
// and scroll should be handled by GuiRecipe, not here
if (gui.inventorySlots instanceof EmptyContainer) return false;
Point mousePos = getMousePosition();
Slot mouseover = manager.window.getSlotAtPosition(mousePos.x, mousePos.y);
if (mouseover != null && mouseover.getHasStack()) {
if (NEIClientConfig.shouldInvertMouseScrollTransfer()) {
scrolled = -scrolled;
}
if (scrolled > 0) fastTransferManager.transferItem(manager.window, mouseover.slotNumber);
else fastTransferManager.retrieveItem(manager.window, mouseover.slotNumber);
if (scrolled > 0)
fastTransferManager.transferItem(manager.window, mouseover.slotNumber);
else
fastTransferManager.retrieveItem(manager.window, mouseover.slotNumber);
return true;
}
return false;
@@ -287,26 +250,32 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
}
@Override
public void onKeyTyped(GuiContainer gui, char keyChar, int keyID) {}
public void onKeyTyped(GuiContainer gui, char keyChar, int keyID) {
}
@Override
public void onMouseClicked(GuiContainer gui, int mousex, int mousey, int button) {}
public void onMouseClicked(GuiContainer gui, int mousex, int mousey, int button) {
}
@Override
public void onMouseDragged(GuiContainer gui, int mousex, int mousey, int button, long heldTime) {}
public void onMouseDragged(GuiContainer gui, int mousex, int mousey, int button, long heldTime) {
}
@Override
public void onMouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {}
public void onMouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {
}
@Override
public void onMouseUp(GuiContainer gui, int mousex, int mousey, int button) {}
public void onMouseUp(GuiContainer gui, int mousex, int mousey, int button) {
}
public static boolean canUseDeleteMode() {
return !(NEIClientUtils.getGuiContainer() instanceof GuiContainerCreative);
}
public static void toggleDeleteMode() {
if (canUseDeleteMode()) deleteMode = !deleteMode;
if(canUseDeleteMode())
deleteMode = !deleteMode;
}
public static boolean getDeleteMode() {
@@ -1,20 +1,22 @@
package codechicken.nei;
import codechicken.nei.api.INEIGuiAdapter;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.gui.inventory.GuiContainerCreative;
import net.minecraft.creativetab.CreativeTabs;
import codechicken.nei.api.INEIGuiAdapter;
public class NEICreativeGuiHandler extends INEIGuiAdapter {
public class NEICreativeGuiHandler extends INEIGuiAdapter
{
@Override
public VisiblityData modifyVisiblity(GuiContainer gui, VisiblityData currentVisibility) {
if (!(gui instanceof GuiContainerCreative)) return currentVisibility;
if (((GuiContainerCreative) gui).func_147056_g() != CreativeTabs.tabInventory.getTabIndex())
public VisiblityData modifyVisiblity(GuiContainer gui, VisiblityData currentVisibility)
{
if(!(gui instanceof GuiContainerCreative))
return currentVisibility;
if(((GuiContainerCreative)gui).func_147056_g() != CreativeTabs.tabInventory.getTabIndex())
currentVisibility.showItemSection = currentVisibility.enableDeleteMode = false;
return currentVisibility;
}
}
@@ -1,21 +1,21 @@
package codechicken.nei;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import codechicken.lib.inventory.ContainerExtended;
import codechicken.lib.inventory.SlotDummy;
import codechicken.nei.api.INEIGuiAdapter;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
public class NEIDummySlotHandler extends INEIGuiAdapter {
public class NEIDummySlotHandler extends INEIGuiAdapter
{
@Override
public boolean handleDragNDrop(GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button) {
public boolean handleDragNDrop(GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button)
{
Slot slot = gui.getSlotAtPosition(mousex, mousey);
if (slot instanceof SlotDummy && slot.isItemValid(draggedStack)
&& gui.inventorySlots instanceof ContainerExtended) {
((SlotDummy) slot).slotClick(draggedStack, button, NEIClientUtils.shiftKey());
if(slot instanceof SlotDummy && slot.isItemValid(draggedStack) && gui.inventorySlots instanceof ContainerExtended)
{
((SlotDummy)slot).slotClick(draggedStack, button, NEIClientUtils.shiftKey());
NEICPH.sendDummySlotSet(slot.slotNumber, slot.getStack());
return true;
}
+115
View File
@@ -0,0 +1,115 @@
package codechicken.nei;
import codechicken.core.CommonUtils;
import codechicken.core.launch.CodeChickenCorePlugin;
import codechicken.nei.api.IConfigureNEI;
import codechicken.nei.asm.NEICorePlugin;
import codechicken.nei.recipe.GuiRecipeTab;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import cpw.mods.fml.client.FMLFileResourcePack;
import cpw.mods.fml.client.FMLFolderResourcePack;
import cpw.mods.fml.common.DummyModContainer;
import cpw.mods.fml.common.LoadController;
import cpw.mods.fml.common.MetadataCollection;
import cpw.mods.fml.common.ModMetadata;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.versioning.ArtifactVersion;
import cpw.mods.fml.common.versioning.VersionParser;
import cpw.mods.fml.common.versioning.VersionRange;
import net.minecraft.util.EnumChatFormatting;
import java.io.File;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
public class NEIModContainer extends DummyModContainer
{
public static LinkedList<IConfigureNEI> plugins = new LinkedList<>();
public NEIModContainer() {
super(MetadataCollection.from(MetadataCollection.class.getResourceAsStream("/neimod.info"), "NotEnoughItems").getMetadataForId("NotEnoughItems", null));
loadMetadata();
}
@Override
public Set<ArtifactVersion> getRequirements() {
Set<ArtifactVersion> deps = new HashSet<>();
deps.add(VersionParser.parseVersionReference("CodeChickenCore@["+CodeChickenCorePlugin.version+",)"));
return deps;
}
@Override
public List<ArtifactVersion> getDependencies() {
return new LinkedList<>(getRequirements());
}
private String description;
private void loadMetadata() {
description = super.getMetadata().description.replace("Supporters:", EnumChatFormatting.AQUA+"Supporters:");
}
@Override
public ModMetadata getMetadata() {
StringBuilder s_plugins = new StringBuilder();
if (plugins.size() == 0) {
s_plugins.append(EnumChatFormatting.RED).append("No installed plugins.");
} else {
s_plugins.append(EnumChatFormatting.GREEN).append("Installed plugins: ");
for (int i = 0; i < plugins.size(); i++) {
if (i > 0)
s_plugins.append(", ");
IConfigureNEI plugin = plugins.get(i);
s_plugins.append(plugin.getName()).append(" ").append(plugin.getVersion());
}
s_plugins.append(".");
}
ModMetadata meta = super.getMetadata();
meta.description = description.replace("<plugins>", s_plugins.toString());
return meta;
}
@Override
public boolean registerBus(EventBus bus, LoadController controller) {
bus.register(this);
return true;
}
@Subscribe
public void preInit(FMLPreInitializationEvent event) {
if (CommonUtils.isClient())
ClientHandler.preInit();
}
@Subscribe
public void init(FMLInitializationEvent event) {
if (CommonUtils.isClient())
ClientHandler.load();
ServerHandler.load();
}
@Subscribe
public void postInit(FMLPostInitializationEvent event) {
if (CommonUtils.isClient())
GuiRecipeTab.loadHandlerInfo();
}
@Override
public VersionRange acceptableMinecraftVersionRange() {
return VersionParser.parseRange(CodeChickenCorePlugin.mcVersion);
}
@Override
public File getSource() {
return NEICorePlugin.location;
}
@Override
public Class<?> getCustomResourcePackClass() {
return getSource().isDirectory() ? FMLFolderResourcePack.class : FMLFileResourcePack.class;
}
}
@@ -1,22 +1,5 @@
package codechicken.nei;
import static codechicken.nei.PacketIDs.C2S;
import static codechicken.nei.PacketIDs.S2C;
import java.util.LinkedList;
import java.util.Set;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.InventoryBasic;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.play.INetHandlerPlayServer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityMobSpawner;
import net.minecraft.world.World;
import codechicken.core.CommonUtils;
import codechicken.core.ServerUtils;
import codechicken.lib.inventory.SlotDummy;
@@ -24,96 +7,91 @@ import codechicken.lib.packet.PacketCustom;
import codechicken.lib.packet.PacketCustom.IServerPacketHandler;
import codechicken.lib.vec.BlockCoord;
import cpw.mods.fml.relauncher.Side;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.InventoryBasic;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.network.play.INetHandlerPlayServer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityMobSpawner;
import net.minecraft.world.World;
public class NEISPH implements IServerPacketHandler {
import java.util.LinkedList;
import java.util.Set;
public class NEISPH implements IServerPacketHandler
{
@Override
public void handlePacket(PacketCustom packet, EntityPlayerMP sender, INetHandlerPlayServer netHandler) {
if (!NEIServerConfig.authenticatePacket(sender, packet)) return;
if (!NEIServerConfig.authenticatePacket(sender, packet))
return;
switch (packet.getType()) {
case C2S.GIVE_ITEM:
case 1:
handleGiveItem(sender, packet);
break;
case C2S.DELETE_ALL_ITEMS:
case 4:
NEIServerUtils.deleteAllItems(sender);
break;
case C2S.SET_SLOT:
case 5:
setInventorySlot(sender, packet);
break;
case C2S.TOGGLE_MAGNET:
case 6:
NEIServerUtils.toggleMagnetMode(sender);
break;
case C2S.SET_TIME:
case 7:
NEIServerUtils.setHourForward(sender.worldObj, packet.readUByte(), true);
break;
case C2S.HEAL:
case 8:
NEIServerUtils.healPlayer(sender);
break;
case C2S.TOGGLE_RAIN:
case 9:
NEIServerUtils.toggleRaining(sender.worldObj, true);
break;
case C2S.REQUEST_LOGIN_INFO:
case 10:
sendLoginState(sender);
break;
case C2S.REQUEST_CONTAINER_CONTENTS:
case 11:
sender.sendContainerAndContentsToPlayer(sender.openContainer, sender.openContainer.getInventory());
break;
case C2S.CHANGE_PROPERTY:
case 12:
handlePropertyChange(sender, packet);
break;
case C2S.SET_GAME_MODE:
case 13:
NEIServerUtils.setGamemode(sender, packet.readUByte());
break;
case C2S.CYCLE_CREATIVE_INV:
case 14:
NEIServerUtils.cycleCreativeInv(sender, packet.readInt());
break;
case C2S.SEND_MOB_SPAWNER_ID:
case 15:
handleMobSpawnerID(sender.worldObj, packet.readCoord(), packet.readString());
break;
case C2S.REQUEST_CONTAINER:
handleRequestContainer(sender, packet.readInt());
break;
case C2S.REQUEST_ENCHANTMENT_GUI:
case 21:
openEnchantmentGui(sender);
break;
case C2S.MODIFY_ENCHANTMENT:
case 22:
modifyEnchantment(sender, packet.readUByte(), packet.readUByte(), packet.readBoolean());
break;
case C2S.SET_CREATIVE_PLUS_MODE:
case 23:
processCreativeInv(sender, packet.readBoolean());
break;
case C2S.REQUEST_POTION_GUI:
case 24:
openPotionGui(sender, packet);
break;
case C2S.SET_DUMMY_SLOT:
case 25:
handleDummySlotSet(sender, packet);
break;
case C2S.SEND_CHAT_ITEM_LINK:
handleSendChatItemLink(sender, packet);
break;
case C2S.SYNC:
handleSync(sender, packet.readInt());
break;
}
}
private void handleSync(EntityPlayerMP sender, int id) {
sender.sendContainerAndContentsToPlayer(sender.openContainer, sender.openContainer.getInventory());
new PacketCustom(channel, S2C.SYNC).writeInt(id).sendToPlayer(sender);
}
private void handleSendChatItemLink(EntityPlayerMP sender, PacketCustom packet) {
final NBTTagCompound payloadTag = packet.readNBTTagCompound();
NEIServerUtils.sendChatItemLink(sender, payloadTag);
}
private void handleDummySlotSet(EntityPlayerMP sender, PacketCustom packet) {
int slotNumber = packet.readShort();
ItemStack stack = packet.readItemStack(true);
Slot slot = sender.openContainer.getSlot(slotNumber);
if (slot instanceof SlotDummy) slot.putStack(stack);
if (slot instanceof SlotDummy)
slot.putStack(stack);
}
private void handleMobSpawnerID(World world, BlockCoord coord, String mobtype) {
@@ -125,11 +103,6 @@ public class NEISPH implements IServerPacketHandler {
}
}
private void handleRequestContainer(EntityPlayerMP sender, int containerSize) {
if (sender.openContainer.getInventory().size() != containerSize) return;
sender.sendContainerToPlayer(sender.openContainer);
}
private void handlePropertyChange(EntityPlayerMP sender, PacketCustom packet) {
String name = packet.readString();
if (NEIServerConfig.canPlayerPerformAction(sender.getCommandSenderName(), name))
@@ -138,22 +111,15 @@ public class NEISPH implements IServerPacketHandler {
public static void processCreativeInv(EntityPlayerMP sender, boolean open) {
if (open) {
ServerUtils.openSMPContainer(
sender,
new ContainerCreativeInv(
sender,
new ExtendedCreativeInv(
NEIServerConfig.forPlayer(sender.getCommandSenderName()),
Side.SERVER)),
(player, windowId) -> {
PacketCustom packet = new PacketCustom(channel, S2C.SET_CREATIVE_PLUS_MODE);
packet.writeBoolean(true);
packet.writeByte(windowId);
packet.sendToPlayer(player);
});
ServerUtils.openSMPContainer(sender, new ContainerCreativeInv(sender, new ExtendedCreativeInv(NEIServerConfig.forPlayer(sender.getCommandSenderName()), Side.SERVER)), (player, windowId) -> {
PacketCustom packet = new PacketCustom(channel, 23);
packet.writeBoolean(true);
packet.writeByte(windowId);
packet.sendToPlayer(player);
});
} else {
sender.closeContainer();
PacketCustom packet = new PacketCustom(channel, S2C.SET_CREATIVE_PLUS_MODE);
PacketCustom packet = new PacketCustom(channel, 23);
packet.writeBoolean(false);
packet.sendToPlayer(sender);
}
@@ -169,8 +135,7 @@ public class NEISPH implements IServerPacketHandler {
ItemStack item = packet.readItemStack();
ItemStack old = NEIServerUtils.getSlotContents(player, slot, container);
boolean deleting = item == null
|| old != null && NEIServerUtils.areStacksSameType(item, old) && item.stackSize < old.stackSize;
boolean deleting = item == null || old != null && NEIServerUtils.areStacksSameType(item, old) && item.stackSize < old.stackSize;
if (NEIServerConfig.canPlayerPerformAction(player.getCommandSenderName(), deleting ? "delete" : "item"))
NEIServerUtils.setSlotContents(player, slot, item, container);
}
@@ -185,33 +150,36 @@ public class NEISPH implements IServerPacketHandler {
}
private void openEnchantmentGui(EntityPlayerMP player) {
ServerUtils.openSMPContainer(
player,
new ContainerEnchantmentModifier(player.inventory, player.worldObj, 0, 0, 0),
(player1, windowId) -> {
PacketCustom packet = new PacketCustom(channel, S2C.OPEN_ENCHANTMENT_GUI);
packet.writeByte(windowId);
packet.sendToPlayer(player1);
});
ServerUtils.openSMPContainer(player, new ContainerEnchantmentModifier(player.inventory, player.worldObj, 0, 0, 0), (player1, windowId) -> {
PacketCustom packet = new PacketCustom(channel, 21);
packet.writeByte(windowId);
packet.sendToPlayer(player1);
});
}
private void openPotionGui(EntityPlayerMP player, PacketCustom packet) {
InventoryBasic b = new InventoryBasic("potionStore", true, 9);
for (int i = 0; i < b.getSizeInventory(); i++) b.setInventorySlotContents(i, packet.readItemStack());
for (int i = 0; i < b.getSizeInventory(); i++)
b.setInventorySlotContents(i, packet.readItemStack());
ServerUtils.openSMPContainer(player, new ContainerPotionCreator(player.inventory, b), (player1, windowId) -> {
PacketCustom packet1 = new PacketCustom(channel, S2C.OPEN_POTION_GUI);
PacketCustom packet1 = new PacketCustom(channel, 24);
packet1.writeByte(windowId);
packet1.sendToPlayer(player1);
});
}
public static void sendActionDisabled(int dim, String name, boolean disable) {
new PacketCustom(channel, S2C.SEND_ACTION_DISABLED).writeString(name).writeBoolean(disable)
new PacketCustom(channel, 11)
.writeString(name)
.writeBoolean(disable)
.sendToDimension(dim);
}
public static void sendActionEnabled(EntityPlayerMP player, String name, boolean enable) {
new PacketCustom(channel, S2C.SEND_ACTION_ENABLED).writeString(name).writeBoolean(enable).sendToPlayer(player);
new PacketCustom(channel, 12)
.writeString(name)
.writeBoolean(enable)
.sendToPlayer(player);
}
private void sendLoginState(EntityPlayerMP player) {
@@ -222,34 +190,41 @@ public class NEISPH implements IServerPacketHandler {
PlayerSave playerSave = NEIServerConfig.forPlayer(player.getCommandSenderName());
for (String name : NEIActions.nameActionMap.keySet()) {
if (NEIServerConfig.canPlayerPerformAction(player.getCommandSenderName(), name)) actions.add(name);
if (NEIServerConfig.isActionDisabled(player.dimension, name)) disabled.add(name);
if (playerSave.isActionEnabled(name)) enabled.add(name);
if (NEIServerConfig.canPlayerPerformAction(player.getCommandSenderName(), name))
actions.add(name);
if (NEIServerConfig.isActionDisabled(player.dimension, name))
disabled.add(name);
if (playerSave.isActionEnabled(name))
enabled.add(name);
}
for (ItemStackMap.Entry<Set<String>> entry : NEIServerConfig.bannedItems.entries())
if (!NEIServerConfig.isPlayerInList(player.getCommandSenderName(), entry.value, true))
bannedItems.add(entry.key);
PacketCustom packet = new PacketCustom(channel, S2C.SEND_LOGIN_STATE);
PacketCustom packet = new PacketCustom(channel, 10);
packet.writeByte(actions.size());
for (String s : actions) packet.writeString(s);
for (String s : actions)
packet.writeString(s);
packet.writeByte(disabled.size());
for (String s : disabled) packet.writeString(s);
for (String s : disabled)
packet.writeString(s);
packet.writeByte(enabled.size());
for (String s : enabled) packet.writeString(s);
for (String s : enabled)
packet.writeString(s);
packet.writeInt(bannedItems.size());
for (ItemStack stack : bannedItems) packet.writeItemStack(stack);
for (ItemStack stack : bannedItems)
packet.writeItemStack(stack);
packet.sendToPlayer(player);
}
public static void sendHasServerSideTo(EntityPlayerMP player) {
NEIServerConfig.logger.debug("Sending serverside check to: " + player.getCommandSenderName());
PacketCustom packet = new PacketCustom(channel, S2C.SEND_SERVER_SIDE_CHECK);
PacketCustom packet = new PacketCustom(channel, 1);
packet.writeByte(NEIActions.protocol);
packet.writeString(CommonUtils.getWorldName(player.worldObj));
@@ -257,7 +232,7 @@ public class NEISPH implements IServerPacketHandler {
}
public static void sendAddMagneticItemTo(EntityPlayerMP player, EntityItem item) {
PacketCustom packet = new PacketCustom(channel, S2C.SEND_MAGNETIC_ITEM);
PacketCustom packet = new PacketCustom(channel, 13);
packet.writeInt(item.getEntityId());
packet.sendToPlayer(player);
@@ -1,5 +1,23 @@
package codechicken.nei;
import codechicken.core.CommonUtils;
import codechicken.core.ServerUtils;
import codechicken.lib.config.ConfigFile;
import codechicken.lib.inventory.InventoryUtils;
import codechicken.lib.packet.PacketCustom;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.JsonToNBT;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.World;
import net.minecraftforge.common.DimensionManager;
import org.apache.commons.io.IOUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.File;
import java.io.FileReader;
import java.io.PrintWriter;
@@ -12,62 +30,26 @@ import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.JsonToNBT;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.permission.PermissionLevel;
import net.minecraftforge.permission.PermissionManager;
public class NEIServerConfig
{
private static MinecraftServer server;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import codechicken.core.CommonUtils;
import codechicken.core.ServerUtils;
import codechicken.lib.config.ConfigFile;
import codechicken.lib.inventory.InventoryUtils;
import codechicken.lib.packet.PacketCustom;
public class NEIServerConfig {
private static boolean firstLoad;
public static Logger logger = LogManager.getLogger("NotEnoughItems");
public static File saveDir;
public static ConfigFile serverConfig;
public static Map<Integer, NBTTagCompound> dimTags = new HashMap<>();
public static HashMap<String, PlayerSave> playerSaves = new HashMap<>();
public static ItemStackMap<Set<String>> bannedItems = new ItemStackMap<>();
private static boolean doesPermAPIExist = false;
public static void resetFirstLoad() {
firstLoad = true;
}
public static void load(World world) {
if (firstLoad) {
firstLoad = false;
if (MinecraftServer.getServer() != server) {
logger.debug("Loading NEI Server");
server = MinecraftServer.getServer();
saveDir = new File(DimensionManager.getCurrentSaveRootDirectory(), "NEI");
dimTags.clear();
loadConfig();
loadBannedItems();
try {
Class.forName("net.minecraftforge.permission.PermissionManager");
doesPermAPIExist = true;
NEIActions.baseActions().forEach(
action -> {
PermissionManager.registerPermission("nei.permissions." + action, PermissionLevel.OP);
});
} catch (ClassNotFoundException ignored) {}
}
loadWorld(world);
}
@@ -80,7 +62,7 @@ public class NEIServerConfig {
try {
File file = new File(getSaveDir(world), "world.dat");
NBTTagCompound tag = NEIServerUtils.readNBT(file);
if (tag == null) tag = new NBTTagCompound();
if(tag == null) tag = new NBTTagCompound();
dimTags.put(CommonUtils.getDimension(world), tag);
} catch (Exception e) {
throw new RuntimeException(e);
@@ -93,8 +75,7 @@ public class NEIServerConfig {
serverConfig.setNewLineMode(1);
serverConfig.getTag("permissions").useBraces();
serverConfig.getTag("permissions")
.setComment("List of players who can use these features.\nEg. time=CodeChicken, Friend1");
serverConfig.getTag("permissions").setComment("List of players who can use these features.\nEg. time=CodeChicken, Friend1");
setDefaultFeature("time");
setDefaultFeature("rain");
@@ -108,16 +89,17 @@ public class NEIServerConfig {
setDefaultFeature("save-state");
setDefaultFeature("item");
setDefaultFeature("delete");
setDefaultFeature("autocraft", "ALL");
setDefaultFeature("notify-item", "CONSOLE, OP");
}
private static void setDefaultFeature(String featurename, String... names) {
if (names.length == 0) names = new String[] { "OP" };
if (names.length == 0)
names = new String[]{"OP"};
StringBuilder list = new StringBuilder();
for (int i = 0; i < names.length; i++) {
if (i >= 1) list.append(", ");
if (i >= 1)
list.append(", ");
list.append(names[i]);
}
serverConfig.getTag("permissions." + featurename).setDefaultValue(list.toString());
@@ -125,11 +107,7 @@ public class NEIServerConfig {
private static void saveWorld(int dim) {
try {
final File saveDir = getSaveDir(DimensionManager.getWorld(dim));
if (!saveDir.isDirectory()) {
FileUtils.forceMkdir(saveDir);
}
File file = new File(saveDir, "world.dat");
File file = new File(getSaveDir(DimensionManager.getWorld(dim)), "world.dat");
NEIServerUtils.writeNBT(dimTags.get(dim), file);
} catch (Exception e) {
throw new RuntimeException(e);
@@ -137,21 +115,18 @@ public class NEIServerConfig {
}
public static boolean canPlayerPerformAction(String playername, String name) {
String node = "permissions." + NEIActions.base(name);
boolean hasPerm = doesPermAPIExist
? PermissionManager.checkPermission(ServerUtils.getPlayer(playername), "nei." + node)
: false;
return hasPerm || isPlayerInList(playername, getPlayerList(node), true);
return isPlayerInList(playername, getPlayerList("permissions." + NEIActions.base(name)), true);
}
public static boolean isPlayerInList(String playername, Set<String> list, boolean allowCards) {
if (playername.equals("CONSOLE")) return list.contains(playername);
if (playername.equals("CONSOLE"))
return list.contains(playername);
playername = playername.toLowerCase();
if (allowCards) {
if (list.contains("ALL")) return true;
if (list.contains("ALL"))
return true;
if ((ServerUtils.isPlayerOP(playername) || ServerUtils.isPlayerOwner(playername)) && list.contains("OP"))
return true;
}
@@ -198,7 +173,8 @@ public class NEIServerConfig {
StringBuilder sb = new StringBuilder();
int i = 0;
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); i++) {
if (i != 0) sb.append(", ");
if (i != 0)
sb.append(", ");
sb.append(iterator.next());
}
@@ -209,7 +185,7 @@ public class NEIServerConfig {
private static void loadBannedItems() {
bannedItems.clear();
File file = new File(saveDir, "banneditems.cfg");
if (!file.exists()) {
if(!file.exists()) {
bannedItems.put(new ItemStack(Blocks.command_block), new HashSet<>(Collections.singletonList("NONE")));
saveBannedItems();
return;
@@ -217,20 +193,22 @@ public class NEIServerConfig {
try {
FileReader r = new FileReader(file);
int line = 0;
for (String s : IOUtils.readLines(r)) {
if (s.charAt(0) == '#' || s.trim().isEmpty()) continue;
for(String s : IOUtils.readLines(r)) {
if(s.charAt(0) == '#' || s.trim().length() == 0)
continue;
int delim = s.lastIndexOf('=');
if (delim < 0) {
logger.error("line " + line + ": Missing =");
if(delim < 0) {
logger.error("line "+line+": Missing =");
continue;
}
try {
NBTTagCompound key = (NBTTagCompound) JsonToNBT.func_150315_a(s.substring(0, delim));
Set<String> values = new HashSet<>();
for (String s2 : s.substring(delim + 1).split(",")) values.add(s2.trim());
for(String s2 : s.substring(delim+1).split(","))
values.add(s2.trim());
bannedItems.put(InventoryUtils.loadPersistant(key), values);
} catch (Exception e) {
logger.error("line " + line + ": " + e.getMessage());
logger.error("line "+line+": "+e.getMessage());
}
}
r.close();
@@ -242,22 +220,22 @@ public class NEIServerConfig {
public static void saveBannedItems() {
File file = new File(saveDir, "banneditems.cfg");
try {
if (!file.exists()) file.createNewFile();
if(!file.exists())
file.createNewFile();
PrintWriter p = new PrintWriter(file);
p.println(
"#Saved in this format for external editing. The format isn't that hard to figure out. If you think you're up to it, modify it here!");
p.println("#Saved in this format for external editing. The format isn't that hard to figure out. If you think you're up to it, modify it here!");
for (ItemStackMap.Entry<Set<String>> entry : bannedItems.entries()) {
NBTTagCompound key = InventoryUtils.savePersistant(entry.key, new NBTTagCompound());
key.removeTag("Count");
if (key.getByte("Damage") == 0) key.removeTag("Damage");
if(key.getByte("Damage") == 0) key.removeTag("Damage");
p.print(key.toString());
p.print("=[");
int i = 0;
for (String s : entry.value) {
if (i++ != 0) p.print(", ");
if(i++ != 0) p.print(", ");
p.print(s);
}
p.println("]");
@@ -274,15 +252,14 @@ public class NEIServerConfig {
public static void loadPlayer(EntityPlayer player) {
logger.debug("Loading Player: " + player.getGameProfile().getName());
playerSaves.put(
player.getCommandSenderName(),
new PlayerSave(player.getCommandSenderName(), new File(saveDir, "players")));
playerSaves.put(player.getCommandSenderName(), new PlayerSave(player.getCommandSenderName(), new File(saveDir, "players")));
}
public static void unloadPlayer(EntityPlayer player) {
logger.debug("Unloading Player: " + player.getCommandSenderName());
PlayerSave playerSave = playerSaves.remove(player.getCommandSenderName());
if (playerSave != null) playerSave.save();
if (playerSave != null)
playerSave.save();
}
public static boolean authenticatePacket(EntityPlayerMP sender, PacketCustom packet) {
+411
View File
@@ -0,0 +1,411 @@
package codechicken.nei;
import codechicken.core.CommonUtils;
import codechicken.core.ServerUtils;
import codechicken.lib.inventory.InventoryRange;
import codechicken.lib.inventory.InventoryUtils;
import codechicken.lib.packet.PacketCustom;
import net.minecraft.command.ICommandSender;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IChatComponent;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraft.world.WorldSettings.GameType;
import net.minecraftforge.oredict.OreDictionary;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.zip.ZipException;
public class NEIServerUtils
{
public static boolean isRaining(World world) {
return world.getWorldInfo().isRaining();
}
public static void toggleRaining(World world, boolean notify) {
boolean raining = !world.isRaining();
if (!raining)//turn off
((WorldServer) world).provider.resetRainAndThunder();
else
world.getWorldInfo().setRaining(!isRaining(world));
if (notify)
ServerUtils.sendChatToAll(new ChatComponentTranslation("nei.chat.rain." + (raining ? "on" : "off")));
}
public static void healPlayer(EntityPlayer player) {
player.heal(20);
player.getFoodStats().addStats(20, 1);
player.extinguish();
}
public static long getTime(World world) {
return world.getWorldInfo().getWorldTime();
}
public static void setTime(long l, World world) {
world.getWorldInfo().setWorldTime(l);
}
public static void setSlotContents(EntityPlayer player, int slot, ItemStack item, boolean containerInv) {
if (slot == -999)
player.inventory.setItemStack(item);
else if (containerInv)
player.openContainer.putStackInSlot(slot, item);
else
player.inventory.setInventorySlotContents(slot, item);
}
public static ItemStack getSlotContents(EntityPlayer player, int slot, boolean containerInv) {
if (slot == -999)
return player.inventory.getItemStack();
else if (containerInv)
return player.openContainer.getSlot(slot).getStack();
else
return player.inventory.getStackInSlot(slot);
}
@SuppressWarnings("unchecked")
public static void deleteAllItems(EntityPlayerMP player) {
for (Slot slot : (List<Slot>) player.openContainer.inventorySlots)
slot.putStack(null);
player.sendContainerAndContentsToPlayer(player.openContainer, player.openContainer.getInventory());
}
public static void setHourForward(World world, int hour, boolean notify) {
long day = (getTime(world) / 24000L) * 24000L;
long newTime = day + 24000L + hour * 1000;
setTime(newTime, world);
if (notify)
ServerUtils.sendChatToAll(new ChatComponentTranslation("nei.chat.time", getTime(world) / 24000L, hour));
}
public static void advanceDisabledTimes(World world) {
int dim = CommonUtils.getDimension(world);
int hour = (int) (getTime(world) % 24000) / 1000;
int newhour = hour;
while (NEIServerConfig.isActionDisabled(dim, NEIActions.timeZones[newhour / 6]))
newhour = ((newhour / 6 + 1) % 4) * 6;
if (newhour != hour)
setHourForward(world, newhour, false);
}
public static boolean canItemFitInInventory(EntityPlayer player, ItemStack itemstack) {
return InventoryUtils.insertItem(new InventoryRange(player.inventory, 0, 36), itemstack, true) == 0;
}
public static void sendNotice(ICommandSender sender, IChatComponent msg, String permission) {
ChatComponentTranslation notice = new ChatComponentTranslation("chat.type.admin", sender.getCommandSenderName(), msg.createCopy());
notice.getChatStyle().setColor(EnumChatFormatting.GRAY).setItalic(true);
if (NEIServerConfig.canPlayerPerformAction("CONSOLE", permission))
MinecraftServer.getServer().addChatMessage(notice);
for (EntityPlayer p : ServerUtils.getPlayers())
if(p == sender)
p.addChatComponentMessage(msg);
else if (NEIServerConfig.canPlayerPerformAction(p.getCommandSenderName(), permission))
p.addChatComponentMessage(notice);
}
/**
* @param stack1 The {@link ItemStack} being compared.
* @param stack2 The {@link ItemStack} to compare to.
* @return whether the two items are the same in terms of damage and itemID.
*/
public static boolean areStacksSameType(ItemStack stack1, ItemStack stack2) {
return stack1 != null && stack2 != null &&
(stack1.getItem() == stack2.getItem() &&
(!stack2.getHasSubtypes() || stack2.getItemDamage() == stack1.getItemDamage()) &&
ItemStack.areItemStackTagsEqual(stack2, stack1));
}
/**
* {@link ItemStack}s with damage -1 are wildcards allowing all damages. Eg all colours of wool are allowed to create Beds.
*
* @param stack1 The {@link ItemStack} being compared.
* @param stack2 The {@link ItemStack} to compare to.
* @return whether the two items are the same from the perspective of a crafting inventory.
*/
public static boolean areStacksSameTypeCrafting(ItemStack stack1, ItemStack stack2) {
return stack1 != null && stack2 != null &&
stack1.getItem() == stack2.getItem() &&
(stack1.getItemDamage() == stack2.getItemDamage() || stack1.getItemDamage() == OreDictionary.WILDCARD_VALUE || stack2.getItemDamage() == OreDictionary.WILDCARD_VALUE || stack1.getItem().isDamageable());
}
/**
* A simple function for comparing ItemStacks in a compatible with comparators.
*
* @param stack1 The {@link ItemStack} being compared.
* @param stack2 The {@link ItemStack} to compare to.
* @return The ordering of stack1 relative to stack2.
*/
public static int compareStacks(ItemStack stack1, ItemStack stack2) {
if (stack1 == stack2) return 0;//catches both null
if (stack1 == null || stack2 == null) return stack1 == null ? -1 : 1;//null stack goes first
if (stack1.getItem() != stack2.getItem()) return Item.getIdFromItem(stack1.getItem()) - Item.getIdFromItem(stack2.getItem());
if (stack1.stackSize != stack2.stackSize) return stack1.stackSize - stack2.stackSize;
return stack1.getItemDamage() - stack2.getItemDamage();
}
public static boolean areStacksIdentical(ItemStack stack1, ItemStack stack2) {
return compareStacks(stack1, stack2) == 0;
}
public static IChatComponent setColour(IChatComponent msg, EnumChatFormatting colour) {
msg.getChatStyle().setColor(colour);
return msg;
}
public static void givePlayerItem(EntityPlayerMP player, ItemStack stack, boolean infinite, boolean doGive) {
if (stack.getItem() == null) {
player.addChatComponentMessage(setColour(new ChatComponentTranslation("nei.chat.give.noitem"), EnumChatFormatting.WHITE));
return;
}
int given = stack.stackSize;
if(doGive) {
if (infinite)
player.inventory.addItemStackToInventory(stack);
else
given -= InventoryUtils.insertItem(player.inventory, stack, false);
}
sendNotice(player, new ChatComponentTranslation("commands.give.success", stack.func_151000_E(), infinite ? "\u221E" : Integer.toString(given), player.getCommandSenderName()), "notify-item");
player.openContainer.detectAndSendChanges();
}
public static ItemStack copyStack(ItemStack itemstack, int i) {
if (itemstack == null)
return null;
itemstack.stackSize += i;
return itemstack.splitStack(i);
}
public static ItemStack copyStack(ItemStack itemstack) {
if (itemstack == null)
return null;
return copyStack(itemstack, itemstack.stackSize);
}
public static void toggleMagnetMode(EntityPlayerMP player) {
PlayerSave playerSave = NEIServerConfig.forPlayer(player.getCommandSenderName());
playerSave.enableAction("magnet", !playerSave.isActionEnabled("magnet"));
}
public static int getCreativeMode(EntityPlayerMP player) {
if (NEIServerConfig.forPlayer(player.getCommandSenderName()).isActionEnabled("creative+"))
return 2;
else if (player.theItemInWorldManager.isCreative())
return 1;
else if (player.theItemInWorldManager.getGameType().isAdventure())
return 3;
else
return 0;
}
public static GameType getGameType(int mode) {
switch (mode) {
case 0:
return GameType.SURVIVAL;
case 1:
case 2:
return GameType.CREATIVE;
case 3:
return GameType.ADVENTURE;
}
return null;
}
public static void setGamemode(EntityPlayerMP player, int mode) {
if (mode < 0 || mode >= NEIActions.gameModes.length ||
NEIActions.nameActionMap.containsKey(NEIActions.gameModes[mode]) &&
!NEIServerConfig.canPlayerPerformAction(player.getCommandSenderName(), NEIActions.gameModes[mode]))
return;
//creative+
NEIServerConfig.forPlayer(player.getCommandSenderName()).enableAction("creative+", mode == 2);
if(mode == 2 && !(player.openContainer instanceof ContainerCreativeInv))//open the container immediately for the client
NEISPH.processCreativeInv(player, true);
//change it on the server
player.theItemInWorldManager.setGameType(getGameType(mode));
//tell the client to change it
new PacketCustom(NEISPH.channel, 14).writeByte(mode).sendToPlayer(player);
player.addChatMessage(new ChatComponentTranslation("nei.chat.gamemode." + mode));
}
public static void cycleCreativeInv(EntityPlayerMP player, int steps) {
InventoryPlayer inventory = player.inventory;
//top down [row][col]
ItemStack[][] slots = new ItemStack[10][9];
PlayerSave playerSave = NEIServerConfig.forPlayer(player.getCommandSenderName());
//get
System.arraycopy(inventory.mainInventory, 0, slots[9], 0, 9);
for (int row = 0; row < 3; row++)
System.arraycopy(inventory.mainInventory, (row + 1) * 9, slots[row + 6], 0, 9);
for (int row = 0; row < 6; row++)
System.arraycopy(playerSave.creativeInv, row * 9, slots[row], 0, 9);
ItemStack[][] newslots = new ItemStack[10][];
//put back
for (int row = 0; row < 10; row++)
newslots[(row + steps + 10) % 10] = slots[row];
System.arraycopy(newslots[9], 0, inventory.mainInventory, 0, 9);
for (int row = 0; row < 3; row++)
System.arraycopy(newslots[row + 6], 0, inventory.mainInventory, (row + 1) * 9, 9);
for (int row = 0; row < 6; row++)
System.arraycopy(newslots[row], 0, playerSave.creativeInv, row * 9, 9);
playerSave.setDirty();
}
public static List<int[]> getEnchantments(ItemStack itemstack) {
ArrayList<int[]> arraylist = new ArrayList<>();
if (itemstack != null) {
NBTTagList nbttaglist = itemstack.getEnchantmentTagList();
if (nbttaglist != null)
for (int i = 0; i < nbttaglist.tagCount(); i++) {
NBTTagCompound tag = nbttaglist.getCompoundTagAt(i);
arraylist.add(new int[]{tag.getShort("id"), tag.getShort("lvl")});
}
}
return arraylist;
}
public static boolean stackHasEnchantment(ItemStack itemstack, int e) {
List<int[]> allenchantments = getEnchantments(itemstack);
for (int[] ai : allenchantments)
if (ai[0] == e)
return true;
return false;
}
public static int getEnchantmentLevel(ItemStack itemstack, int e) {
List<int[]> allenchantments = getEnchantments(itemstack);
for (int[] ai : allenchantments)
if (ai[0] == e)
return ai[1];
return -1;
}
public static boolean doesEnchantmentConflict(List<int[]> enchantments, Enchantment e) {
for (int[] ai : enchantments)
if (!e.canApplyTogether(Enchantment.enchantmentsList[ai[0]]))
return true;
return false;
}
public static RuntimeException throwCME(String msg) {
if (CommonUtils.isClient())
return ClientHandler.throwCME(msg);
throw new RuntimeException(msg);
}
@SuppressWarnings("unchecked")
public static ItemStack[] extractRecipeItems(Object obj) {
if (obj instanceof ItemStack)
return new ItemStack[]{(ItemStack) obj};
if (obj instanceof ItemStack[])
return (ItemStack[]) obj;
if (obj instanceof List)
return ((List<ItemStack>) obj).toArray(new ItemStack[0]);
throw new ClassCastException(obj+" not an ItemStack, ItemStack[] or List<ItemStack?");
}
public static List<Integer> getRange(final int start, final int end) {
return new AbstractList<Integer>()
{
@Override
public Integer get(int index) {
return start+index;
}
@Override
public int size() {
return end-start;
}
};
}
public static StringBuilder fixTrailingCommaList(StringBuilder sb) {
if(sb.charAt(sb.length()-1) == ',')
sb.deleteCharAt(sb.length()-1);
return sb;
}
public static void logOnce(Throwable t, Set<String> stackTraces, String message) {
logOnce(t, stackTraces, message, "");
}
public static void logOnce(Throwable t, Set<String> stackTraces, String message, String identifier) {
StringWriter sw = new StringWriter();
t.printStackTrace(new PrintWriter(sw));
String stackTrace = identifier + sw.toString();
if (!stackTraces.contains(stackTrace)) {
NEIServerConfig.logger.error(message, t);
stackTraces.add(stackTrace);
}
}
public static NBTTagCompound readNBT(File file) throws IOException {
if(!file.exists()) return null;
FileInputStream in = new FileInputStream(file);
NBTTagCompound tag;
try {
tag = CompressedStreamTools.readCompressed(in);
} catch(ZipException e) {
if(e.getMessage().equals("Not in GZIP format"))
tag = CompressedStreamTools.read(file);
else
throw e;
}
in.close();
return tag;
}
public static void writeNBT(NBTTagCompound tag, File file) throws IOException {
FileOutputStream out = new FileOutputStream(file);
CompressedStreamTools.writeCompressed(tag, out);
out.close();
}
}
@@ -1,25 +1,28 @@
package codechicken.nei;
import java.util.ArrayList;
import codechicken.nei.api.IStackPositioner;
public class OffsetPositioner implements IStackPositioner {
import java.util.ArrayList;
public OffsetPositioner(int x, int y) {
public class OffsetPositioner implements IStackPositioner
{
public OffsetPositioner(int x, int y)
{
offsetx = x;
offsety = y;
}
@Override
public ArrayList<PositionedStack> positionStacks(ArrayList<PositionedStack> ai) {
for (PositionedStack stack : ai) {
stack.relx += offsetx;
stack.rely += offsety;
public ArrayList<PositionedStack> positionStacks(ArrayList<PositionedStack> ai)
{
for(PositionedStack stack : ai)
{
stack.relx+=offsetx;
stack.rely+=offsety;
}
return ai;
}
public int offsetx;
public int offsety;
}
@@ -1,17 +1,16 @@
package codechicken.nei;
import java.io.File;
import codechicken.core.ServerUtils;
import codechicken.lib.inventory.InventoryUtils;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import codechicken.core.ServerUtils;
import codechicken.lib.inventory.InventoryUtils;
public class PlayerSave {
import java.io.File;
public class PlayerSave
{
public String username;
private File saveFile;
@@ -28,17 +27,20 @@ public class PlayerSave {
wasOp = ServerUtils.isPlayerOP(playername);
saveFile = new File(saveLocation, username + ".dat");
if (!saveFile.getParentFile().exists()) saveFile.getParentFile().mkdirs();
if (!saveFile.getParentFile().exists())
saveFile.getParentFile().mkdirs();
load();
}
private void load() {
nbt = new NBTTagCompound();
try {
if (!saveFile.exists()) saveFile.createNewFile();
if (saveFile.length() > 0) nbt = NEIServerUtils.readNBT(saveFile);
if (!saveFile.exists())
saveFile.createNewFile();
if (saveFile.length() > 0)
nbt = NEIServerUtils.readNBT(saveFile);
} catch (Exception e) {
NEIClientConfig.logger.error("Error loading player save: " + username, e);
NEIClientConfig.logger.error("Error loading player save: "+username, e);
}
loadCreativeInv();
@@ -47,19 +49,22 @@ public class PlayerSave {
private void loadCreativeInv() {
creativeInv = new ItemStack[54];
NBTTagList itemList = nbt.getTagList("creativeitems", 10);
if (itemList != null) InventoryUtils.readItemStacksFromTag(creativeInv, itemList);
if (itemList != null)
InventoryUtils.readItemStacksFromTag(creativeInv, itemList);
}
public void save() {
if (!isDirty) return;
if (!isDirty)
return;
if (creativeInvDirty) saveCreativeInv();
if (creativeInvDirty)
saveCreativeInv();
try {
NEIServerUtils.writeNBT(nbt, saveFile);
isDirty = false;
} catch (Exception e) {
NEIClientConfig.logger.error("Error saving player: " + username, e);
NEIClientConfig.logger.error("Error saving player: "+username, e);
}
}
@@ -92,7 +97,8 @@ public class PlayerSave {
private NBTTagCompound getEnabledActions() {
NBTTagCompound tag = nbt.getCompoundTag("enabledActions");
if (!nbt.hasKey("enabledActions")) nbt.setTag("enabledActions", tag);
if (!nbt.hasKey("enabledActions"))
nbt.setTag("enabledActions", tag);
return tag;
}
@@ -1,61 +1,69 @@
package codechicken.nei;
import static codechicken.nei.NEIClientConfig.canPerformAction;
import codechicken.nei.guihook.IContainerInputHandler;
import net.minecraft.client.gui.inventory.GuiContainer;
import codechicken.nei.guihook.IContainerInputHandler;
public class PopupInputHandler implements IContainerInputHandler {
import static codechicken.nei.NEIClientConfig.canPerformAction;
import static codechicken.nei.NEIClientConfig.getKeyBinding;
public class PopupInputHandler implements IContainerInputHandler
{
@Override
public boolean keyTyped(GuiContainer gui, char keyChar, int keyCode) {
public boolean keyTyped(GuiContainer gui, char keyChar, int keyCode)
{
return false;
}
@Override
public boolean mouseClicked(GuiContainer gui, int mousex, int mousey, int button) {
public boolean mouseClicked(GuiContainer gui, int mousex, int mousey, int button)
{
return false;
}
@Override
public void onKeyTyped(GuiContainer gui, char keyChar, int keyID) {}
@Override
public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyID) {
return false;
public void onKeyTyped(GuiContainer gui, char keyChar, int keyID)
{
}
@Override
public boolean onHotkeyPressed(GuiContainer gui) {
if (KeyManager.isHashDown("gui.enchant") && canPerformAction("enchant")) {
public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyID)
{
if(keyID == getKeyBinding("gui.enchant") && canPerformAction("enchant"))
{
NEICPH.sendOpenEnchantmentWindow();
return true;
}
if (KeyManager.isHashDown("gui.potion") && canPerformAction("potion")) {
if(keyID == getKeyBinding("gui.potion") && canPerformAction("potion"))
{
NEICPH.sendOpenPotionWindow();
return true;
}
return false;
}
@Override
public void onMouseClicked(GuiContainer gui, int mousex, int mousey, int button) {}
public void onMouseClicked(GuiContainer gui, int mousex, int mousey, int button)
{
}
@Override
public void onMouseUp(GuiContainer gui, int mousex, int mousey, int button) {}
public void onMouseUp(GuiContainer gui, int mousex, int mousey, int button)
{
}
@Override
public boolean mouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {
public boolean mouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled)
{
return false;
}
@Override
public void onMouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {}
public void onMouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled)
{
}
@Override
public void onMouseDragged(GuiContainer gui, int mousex, int mousey, int button, long heldTime) {}
public void onMouseDragged(GuiContainer gui, int mousex, int mousey, int button, long heldTime)
{
}
}
+119
View File
@@ -0,0 +1,119 @@
package codechicken.nei;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
import java.util.ArrayList;
import java.util.List;
/**
* Simply an {@link ItemStack} with position.
* Mainly used in the recipe handlers.
*/
public class PositionedStack
{
public int relx;
public int rely;
public ItemStack[] items;
//compatibility dummy
public ItemStack item;
private boolean permutated = false;
public PositionedStack(Object object, int x, int y, boolean genPerms)
{
items = NEIServerUtils.extractRecipeItems(object);
relx = x;
rely = y;
if(genPerms)
generatePermutations();
else
setPermutationToRender(0);
}
public PositionedStack(Object object, int x, int y)
{
this(object, x, y, true);
}
public void generatePermutations()
{
if(permutated)
return;
ArrayList<ItemStack> stacks = new ArrayList<>();
for(ItemStack item : items)
{
if(item == null || item.getItem() == null)
continue;
if(item.getItemDamage() == Short.MAX_VALUE)
{
List<ItemStack> permutations = ItemList.itemMap.get(item.getItem());
if(!permutations.isEmpty())
{
for(ItemStack stack : permutations)
stacks.add(stack.copy());
}
else
{
ItemStack base = new ItemStack(item.getItem(), item.stackSize);
base.stackTagCompound = item.stackTagCompound;
stacks.add(base);
}
continue;
}
stacks.add(item.copy());
}
items = stacks.toArray(new ItemStack[0]);
if(items.length == 0)
items = new ItemStack[]{new ItemStack(Blocks.fire)};
permutated = true;
setPermutationToRender(0);
}
public void setMaxSize(int i)
{
for(ItemStack item : items)
if(item.stackSize > i)
item.stackSize = i;
}
public PositionedStack copy()
{
return new PositionedStack(items, relx, rely);
}
public void setPermutationToRender(int index)
{
item = items[index].copy();
if(item.getItem() == null)
item = new ItemStack(Blocks.fire);
else if(item.getItemDamage() == OreDictionary.WILDCARD_VALUE && item.getItem() != null && item.getItem().isRepairable())
item.setItemDamage(0);
}
public boolean contains(ItemStack ingredient)
{
for(ItemStack item : items)
if(NEIServerUtils.areStacksSameTypeCrafting(item, ingredient))
return true;
return false;
}
public boolean contains(Item ingred)
{
for(ItemStack item : items)
if(item.getItem() == ingred)
return true;
return false;
}
}
@@ -1,7 +1,7 @@
package codechicken.nei;
public abstract class RestartableTask {
public abstract class RestartableTask
{
public final String name;
private Thread thread;
private volatile boolean restart;
@@ -15,22 +15,21 @@ public abstract class RestartableTask {
private void start() {
thread = new Thread(name) {
@Override
public void run() {
do {
while (stopped) try {
Thread.sleep(1);
} catch (InterruptedException ignored) {}
if (!restart) execute();
} while (!finish());
while(stopped)
try { Thread.sleep(1); } catch (InterruptedException ignored) {}
if(!restart)
execute();
} while(!finish());
}
};
thread.start();
}
private synchronized boolean finish() {
if (restart) {
if(restart) {
restart = false;
return false;
} else {
@@ -45,18 +44,19 @@ public abstract class RestartableTask {
}
public synchronized void restart() {
if (thread != null) {
if(thread != null) {
stopped = false;
restart = true;
} else start();
}
else
start();
}
/**
* Stops execution until restart is called. If a thread is running, the restart flag will be set, and the thread
* will be paused once the execute method exits.
* Stops execution until restart is called. If a thread is running, the restart flag will be set, and the thread will be paused once the execute method exits.
*/
public synchronized void stop() {
if (thread != null) {
if(thread != null) {
stopped = true;
restart = true;
}
Loaded 100 of 437 files, more files were not shown because too many files have changed in this diff. Show more