mirror of
https://github.com/GTNewHorizons/NotEnoughItems.git
synced 2026-11-15 09:44:44 +00:00
Compare commits
110
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
678a5ac00d | ||
|
|
4e8687184d | ||
|
|
fe4566901a | ||
|
|
de2b2ece69 | ||
|
|
d20a80a77c | ||
|
|
6cced8dea0 | ||
|
|
68b9453328 | ||
|
|
ae21012ea2 | ||
|
|
2b31129ef9 | ||
|
|
ba77a63545 | ||
|
|
8f7d698e7d | ||
|
|
72d44fd711 | ||
|
|
d735cc2a38 | ||
|
|
91e9b2a5ae | ||
|
|
96e4fe55e8 | ||
|
|
8717df0cbb | ||
|
|
d6a6551561 | ||
|
|
995ed24056 | ||
|
|
2917f2a4c9 | ||
|
|
5b2ff42d4f | ||
|
|
6f2782b06e | ||
|
|
f17bf6e8e2 | ||
|
|
10ee4d17ef | ||
|
|
f6acd768f3 | ||
|
|
8a5146b672 | ||
|
|
1632a90d15 | ||
|
|
269b16a8de | ||
|
|
1e93f719fe | ||
|
|
db6e3d33ca | ||
|
|
991a6dc772 | ||
|
|
5f1ed67a8b | ||
|
|
49b22e0683 | ||
|
|
00dacef241 | ||
|
|
c4da6706a5 | ||
|
|
f588543b64 | ||
|
|
f006a93dd5 | ||
|
|
6609911d96 | ||
|
|
3291dab52d | ||
|
|
b31de63fe6 | ||
|
|
0cfc3301f6 | ||
|
|
837411aa41 | ||
|
|
ee3d685a14 | ||
|
|
47951372cb | ||
|
|
7834d72ecf | ||
|
|
3ced04b4d3 | ||
|
|
75c02f0357 | ||
|
|
51ea8bba34 | ||
|
|
b0c6f358f7 | ||
|
|
c73edaa72e | ||
|
|
caebccc1fd | ||
|
|
a0c5ea42b9 | ||
|
|
23d4be06e8 | ||
|
|
1e36822fa4 | ||
|
|
3ce702343d | ||
|
|
a3387f0290 | ||
|
|
116b96f67b | ||
|
|
60fe49d18c | ||
|
|
cab0aff563 | ||
|
|
144a37cebb | ||
|
|
2d18dcf42b | ||
|
|
5bbcc570f9 | ||
|
|
98c9f03e74 | ||
|
|
5dde7cad8b | ||
|
|
ce17ec8026 | ||
|
|
63f49a5e4a | ||
|
|
e2a9d02c4c | ||
|
|
6695185c54 | ||
|
|
e5b8a4c9c9 | ||
|
|
60d033e879 | ||
|
|
0310b4177f | ||
|
|
304cc12750 | ||
|
|
a7ca6c8527 | ||
|
|
43b71b1de6 | ||
|
|
b6070dd508 | ||
|
|
492c99b8e3 | ||
|
|
4fc368135d | ||
|
|
58117fa368 | ||
|
|
db339e94f4 | ||
|
|
7126a6d3b0 | ||
|
|
b00f4d1514 | ||
|
|
5b3a255be9 | ||
|
|
65710c959a | ||
|
|
95ee685b93 | ||
|
|
888f86f2da | ||
|
|
b4780716ec | ||
|
|
52fb89daf6 | ||
|
|
dd18d2b775 | ||
|
|
1cf8f4c1d2 | ||
|
|
a016795056 | ||
|
|
f8d492e5f5 | ||
|
|
8b073543b3 | ||
|
|
8ef7978044 | ||
|
|
afd25919c5 | ||
|
|
1bd64bc1b8 | ||
|
|
45d0621da4 | ||
|
|
4a34aa1796 | ||
|
|
fe7066eeb8 | ||
|
|
c80ab9d6ab | ||
|
|
475fda6ceb | ||
|
|
ae2cc2c600 | ||
|
|
37a571d878 | ||
|
|
3c9b801e74 | ||
|
|
e123ab2f30 | ||
|
|
5fdb5824df | ||
|
|
344b22a322 | ||
|
|
ae1d0d9bba | ||
|
|
079835e5d0 | ||
|
|
a8919dcd95 | ||
|
|
a88a13e7cf | ||
|
|
8bdcf65250 |
No files matched your search
@@ -0,0 +1,9 @@
|
||||
directory="run/crash-reports"
|
||||
if [ -d $directory ]; then
|
||||
echo "Crash reports detected:"
|
||||
cat $directory/*
|
||||
exit 1
|
||||
else
|
||||
echo "No crash reports detected"
|
||||
exit 0
|
||||
fi
|
||||
@@ -0,0 +1,45 @@
|
||||
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
|
||||
|
||||
name: Build and test
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ master, main ]
|
||||
push:
|
||||
branches: [ master, main ]
|
||||
|
||||
jobs:
|
||||
build-and-test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up JDK 8
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: '8'
|
||||
distribution: 'adopt'
|
||||
cache: gradle
|
||||
|
||||
- name: Grant execute permission for gradlew
|
||||
run: chmod +x gradlew
|
||||
|
||||
- name: Setup the workspace
|
||||
run: ./gradlew setupCIWorkspace
|
||||
|
||||
- name: Build the mod
|
||||
run: ./gradlew build
|
||||
|
||||
- name: Run server for 1 minute
|
||||
run: |
|
||||
mkdir run
|
||||
echo "eula=true" > run/eula.txt
|
||||
timeout 10 ./gradlew runServer || true
|
||||
|
||||
- name: Test no crashes happend
|
||||
run: |
|
||||
chmod +x .github/scripts/test-no-crash-reports.sh
|
||||
.github/scripts/test-no-crash-reports.sh
|
||||
@@ -0,0 +1,51 @@
|
||||
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
|
||||
|
||||
name: Release tagged build
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '*'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set release version
|
||||
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
|
||||
|
||||
- name: Set up JDK 8
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: '8'
|
||||
distribution: 'adopt'
|
||||
cache: gradle
|
||||
|
||||
- name: Grant execute permission for gradlew
|
||||
run: chmod +x gradlew
|
||||
|
||||
- name: Setup the workspace
|
||||
run: ./gradlew setupCIWorkspace
|
||||
|
||||
- name: Build the mod
|
||||
run: ./gradlew build
|
||||
|
||||
- name: Release under current tag
|
||||
uses: "marvinpinto/action-automatic-releases@latest"
|
||||
with:
|
||||
repo_token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
automatic_release_tag: "${{ env.RELEASE_VERSION }}"
|
||||
prerelease: false
|
||||
title: "${{ env.RELEASE_VERSION }}"
|
||||
files: build/libs/*.jar
|
||||
|
||||
- name: Publish to Maven
|
||||
run: ./gradlew publish
|
||||
env:
|
||||
MAVEN_USER: ${{ secrets.MAVEN_USER }}
|
||||
MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}
|
||||
+27
-13
@@ -1,15 +1,29 @@
|
||||
./build/
|
||||
NotEnoughItems.iml
|
||||
NotEnoughItems.ipr
|
||||
NotEnoughItems.iws
|
||||
*.ipr
|
||||
*.iml
|
||||
*.iws
|
||||
.idea/**
|
||||
run/*
|
||||
.gradle/
|
||||
|
||||
*.bat
|
||||
.gradle
|
||||
.settings
|
||||
/.idea/
|
||||
/run/
|
||||
/build/
|
||||
/eclipse/
|
||||
.classpath
|
||||
.project
|
||||
.settings/**
|
||||
/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
|
||||
@@ -0,0 +1,3 @@
|
||||
# Any Github changes require admin approval
|
||||
/.github/** @GTNewHorizons/admin
|
||||
|
||||
@@ -1,674 +0,0 @@
|
||||
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
@@ -1,165 +0,0 @@
|
||||
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.
|
||||
+149
-44
@@ -1,60 +1,165 @@
|
||||
GTNH Modifications:
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (c) 2019 mitchej123
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE - See COPYING & COPYING.LESSER
|
||||
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.
|
||||
|
||||
Parts inspired/borrowed/backported from JEI under the MIT License:
|
||||
0. Additional Definitions.
|
||||
|
||||
https://github.com/mezz/JustEnoughItems/tree/1.12
|
||||
|
||||
The MIT License (MIT)
|
||||
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.
|
||||
|
||||
Copyright (c) 2014-2015 mezz
|
||||
"The Library" refers to a covered work governed by this License,
|
||||
other than an Application or a Combined Work as defined below.
|
||||
|
||||
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:
|
||||
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.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
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 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 "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.
|
||||
|
||||
Base NEI License:
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
The MIT License (MIT)
|
||||
You may convey a covered work under sections 3 and 4 of this License
|
||||
without being bound by section 3 of the GNU GPL.
|
||||
|
||||
Copyright (c) 2014 ChickenBones
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
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:
|
||||
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:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
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 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.
|
||||
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.
|
||||
@@ -1,12 +1,10 @@
|
||||
# NotEnoughItems Unofficial - By the GTNH Team
|
||||
|
||||
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
|
||||
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.
|
||||
|
||||
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).
|
||||
|
||||
## New Features:
|
||||
|
||||
@@ -20,12 +18,21 @@ We've tested this against all of the mods included in GTNH, as well as a limited
|
||||
* 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: `@Gregtech->iron ingot`
|
||||
* `@[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 should now properly work with the Overlay Recipe Transfer
|
||||
* GT5u Tools/Items and GT6 tools should now properly work with the Overlay Recipe Transfer
|
||||
|
||||
## 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-2022 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.
|
||||
@@ -0,0 +1,3 @@
|
||||
compileJava {
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
+688
-98
@@ -1,41 +1,75 @@
|
||||
//version: 1652851397
|
||||
/*
|
||||
DO NOT CHANGE THIS FILE!
|
||||
|
||||
Also, you may replace this file at any time if there is an update available.
|
||||
Please check https://github.com/GTNewHorizons/ExampleMod1.7.10/blob/main/build.gradle for updates.
|
||||
*/
|
||||
|
||||
|
||||
import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation
|
||||
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
||||
import org.gradle.internal.logging.text.StyledTextOutput.Style
|
||||
import org.gradle.internal.logging.text.StyledTextOutputFactory
|
||||
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
jcenter()
|
||||
maven {
|
||||
name = "gt"
|
||||
url = "https://gregtech.overminddl1.com/"
|
||||
name 'forge'
|
||||
url 'https://maven.minecraftforge.net'
|
||||
}
|
||||
maven {
|
||||
name = "forge"
|
||||
url = "http://files.minecraftforge.net/maven"
|
||||
name 'sonatype'
|
||||
url 'https://oss.sonatype.org/content/repositories/snapshots/'
|
||||
}
|
||||
maven {
|
||||
name = "jitpack"
|
||||
url = "https://jitpack.io"
|
||||
name 'Scala CI dependencies'
|
||||
url 'https://repo1.maven.org/maven2/'
|
||||
}
|
||||
maven {
|
||||
name 'jitpack'
|
||||
url 'https://jitpack.io'
|
||||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath "com.github.GTNH2:ForgeGradle:FG_1.2-SNAPSHOT"
|
||||
classpath 'com.github.GTNewHorizons:ForgeGradle:1.2.7'
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
id("org.ajoberstar.grgit") version("3.1.1")
|
||||
id 'java-library'
|
||||
id 'idea'
|
||||
id 'eclipse'
|
||||
id 'scala'
|
||||
id 'maven-publish'
|
||||
id 'org.jetbrains.kotlin.jvm' version '1.5.30' apply false
|
||||
id 'org.jetbrains.kotlin.kapt' version '1.5.30' apply false
|
||||
id 'com.google.devtools.ksp' version '1.5.30-1.0.0' apply false
|
||||
id 'org.ajoberstar.grgit' version '4.1.1'
|
||||
id 'com.github.johnrengelman.shadow' version '4.0.4'
|
||||
id 'com.palantir.git-version' version '0.13.0' apply false
|
||||
id 'de.undercouch.download' version '5.0.1'
|
||||
id 'com.github.gmazzo.buildconfig' version '3.0.3' apply false
|
||||
}
|
||||
|
||||
//add dependency repositories
|
||||
repositories {
|
||||
maven {
|
||||
name = "chickenbones"
|
||||
url = "http://chickenbones.net/maven"
|
||||
}
|
||||
if (project.file('.git/HEAD').isFile()) {
|
||||
apply plugin: 'com.palantir.git-version'
|
||||
}
|
||||
|
||||
apply plugin: "java"
|
||||
apply plugin: "idea"
|
||||
def out = services.get(StyledTextOutputFactory).create('an-output')
|
||||
|
||||
apply plugin: 'forge'
|
||||
|
||||
def projectJavaVersion = JavaLanguageVersion.of(8)
|
||||
|
||||
java {
|
||||
toolchain {
|
||||
languageVersion.set(projectJavaVersion)
|
||||
}
|
||||
}
|
||||
|
||||
idea {
|
||||
module {
|
||||
inheritOutputDirs = true
|
||||
@@ -44,115 +78,671 @@ idea {
|
||||
}
|
||||
}
|
||||
|
||||
java {
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
if(JavaVersion.current() != JavaVersion.VERSION_1_8) {
|
||||
throw new GradleException("This project requires Java 8, but it's running on " + JavaVersion.current())
|
||||
}
|
||||
|
||||
group = "codechicken"
|
||||
archivesBaseName = "NotEnoughItems"
|
||||
checkPropertyExists("modName")
|
||||
checkPropertyExists("modId")
|
||||
checkPropertyExists("modGroup")
|
||||
checkPropertyExists("autoUpdateBuildScript")
|
||||
checkPropertyExists("minecraftVersion")
|
||||
checkPropertyExists("forgeVersion")
|
||||
checkPropertyExists("replaceGradleTokenInFile")
|
||||
checkPropertyExists("gradleTokenModId")
|
||||
checkPropertyExists("gradleTokenModName")
|
||||
checkPropertyExists("gradleTokenVersion")
|
||||
checkPropertyExists("gradleTokenGroupName")
|
||||
checkPropertyExists("apiPackage")
|
||||
checkPropertyExists("accessTransformersFile")
|
||||
checkPropertyExists("usesMixins")
|
||||
checkPropertyExists("mixinPlugin")
|
||||
checkPropertyExists("mixinsPackage")
|
||||
checkPropertyExists("coreModClass")
|
||||
checkPropertyExists("containsMixinsAndOrCoreModOnly")
|
||||
checkPropertyExists("usesShadowedDependencies")
|
||||
checkPropertyExists("developmentEnvironmentUserName")
|
||||
|
||||
// Define properties file
|
||||
ext.configFile = file "build.properties"
|
||||
boolean noPublishedSources = project.findProperty("noPublishedSources") ? project.noPublishedSources.toBoolean() : false
|
||||
boolean usesMixinDebug = project.findProperty('usesMixinDebug') ?: project.usesMixins.toBoolean()
|
||||
|
||||
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
|
||||
String javaSourceDir = "src/main/java/"
|
||||
String scalaSourceDir = "src/main/scala/"
|
||||
String kotlinSourceDir = "src/main/kotlin/"
|
||||
|
||||
String targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/")
|
||||
String targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/")
|
||||
String targetPackageKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/")
|
||||
if(!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) {
|
||||
throw new GradleException("Could not resolve \"modGroup\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin)
|
||||
}
|
||||
//
|
||||
//configurations.all {
|
||||
// resolutionStrategy.cacheChangingModulesFor(0, TimeUnit.SECONDS)
|
||||
// setTransitive(false)
|
||||
//}
|
||||
|
||||
if(apiPackage) {
|
||||
targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/")
|
||||
targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/")
|
||||
targetPackageKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/")
|
||||
if(!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) {
|
||||
throw new GradleException("Could not resolve \"apiPackage\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin)
|
||||
}
|
||||
}
|
||||
|
||||
if(accessTransformersFile) {
|
||||
String targetFile = "src/main/resources/META-INF/" + accessTransformersFile
|
||||
if(!getFile(targetFile).exists()) {
|
||||
throw new GradleException("Could not resolve \"accessTransformersFile\"! Could not find " + targetFile)
|
||||
}
|
||||
}
|
||||
|
||||
if(usesMixins.toBoolean()) {
|
||||
if(mixinsPackage.isEmpty() || mixinPlugin.isEmpty()) {
|
||||
throw new GradleException("\"mixinPlugin\" requires \"mixinsPackage\" and \"mixinPlugin\" to be set!")
|
||||
}
|
||||
|
||||
targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinsPackage.toString().replaceAll("\\.", "/")
|
||||
targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinsPackage.toString().replaceAll("\\.", "/")
|
||||
targetPackageKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinsPackage.toString().replaceAll("\\.", "/")
|
||||
if(!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) {
|
||||
throw new GradleException("Could not resolve \"mixinsPackage\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin)
|
||||
}
|
||||
|
||||
String targetFileJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinPlugin.toString().replaceAll("\\.", "/") + ".java"
|
||||
String targetFileScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinPlugin.toString().replaceAll("\\.", "/") + ".scala"
|
||||
String targetFileScalaJava = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinPlugin.toString().replaceAll("\\.", "/") + ".java"
|
||||
String targetFileKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinPlugin.toString().replaceAll("\\.", "/") + ".kt"
|
||||
if(!(getFile(targetFileJava).exists() || getFile(targetFileScala).exists() || getFile(targetFileScalaJava).exists() || getFile(targetFileKotlin).exists())) {
|
||||
throw new GradleException("Could not resolve \"mixinPlugin\"! Could not find " + targetFileJava + " or " + targetFileScala + " or " + targetFileScalaJava + " or " + targetFileKotlin)
|
||||
}
|
||||
}
|
||||
|
||||
if(coreModClass) {
|
||||
String targetFileJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + coreModClass.toString().replaceAll("\\.", "/") + ".java"
|
||||
String targetFileScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + coreModClass.toString().replaceAll("\\.", "/") + ".scala"
|
||||
String targetFileScalaJava = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + coreModClass.toString().replaceAll("\\.", "/") + ".java"
|
||||
String targetFileKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + coreModClass.toString().replaceAll("\\.", "/") + ".kt"
|
||||
if(!(getFile(targetFileJava).exists() || getFile(targetFileScala).exists() || getFile(targetFileScalaJava).exists() || getFile(targetFileKotlin).exists())) {
|
||||
throw new GradleException("Could not resolve \"coreModClass\"! Could not find " + targetFileJava + " or " + targetFileScala + " or " + targetFileScalaJava + " or " + targetFileKotlin)
|
||||
}
|
||||
}
|
||||
|
||||
configurations.all {
|
||||
resolutionStrategy.cacheChangingModulesFor(0, TimeUnit.SECONDS)
|
||||
|
||||
// Make sure GregTech build won't time out
|
||||
System.setProperty("org.gradle.internal.http.connectionTimeout", 120000 as String)
|
||||
System.setProperty("org.gradle.internal.http.socketTimeout", 120000 as String)
|
||||
}
|
||||
|
||||
// Fix Jenkins' Git: chmod a file should not be detected as a change and append a '.dirty' to the version
|
||||
try {
|
||||
'git config core.fileMode false'.execute()
|
||||
}
|
||||
catch (Exception ignored) {
|
||||
out.style(Style.Failure).println("git isn't installed at all")
|
||||
}
|
||||
|
||||
// Pulls version first from the VERSION env and then git tag
|
||||
String identifiedVersion
|
||||
String versionOverride = System.getenv("VERSION") ?: null
|
||||
try {
|
||||
identifiedVersion = versionOverride == null ? gitVersion() : versionOverride
|
||||
}
|
||||
catch (Exception ignored) {
|
||||
out.style(Style.Failure).text(
|
||||
'This mod must be version controlled by Git AND the repository must provide at least one tag,\n' +
|
||||
'or the VERSION override must be set! ').style(Style.SuccessHeader).text('(Do NOT download from GitHub using the ZIP option, instead\n' +
|
||||
'clone the repository, see ').style(Style.Info).text('https://gtnh.miraheze.org/wiki/Development').style(Style.SuccessHeader).println(' for details.)'
|
||||
)
|
||||
versionOverride = 'NO-GIT-TAG-SET'
|
||||
identifiedVersion = versionOverride
|
||||
}
|
||||
version = minecraftVersion + '-' + identifiedVersion
|
||||
ext {
|
||||
modVersion = identifiedVersion
|
||||
}
|
||||
|
||||
if(identifiedVersion == versionOverride) {
|
||||
out.style(Style.Failure).text('Override version to ').style(Style.Identifier).text(modVersion).style(Style.Failure).println('!\7')
|
||||
}
|
||||
|
||||
group = modGroup
|
||||
if(project.hasProperty("customArchiveBaseName") && customArchiveBaseName) {
|
||||
archivesBaseName = customArchiveBaseName
|
||||
}
|
||||
else {
|
||||
archivesBaseName = modId
|
||||
}
|
||||
|
||||
def arguments = []
|
||||
def jvmArguments = []
|
||||
|
||||
if (usesMixins.toBoolean()) {
|
||||
arguments += [
|
||||
"--tweakClass org.spongepowered.asm.launch.MixinTweaker"
|
||||
]
|
||||
if (usesMixinDebug.toBoolean()) {
|
||||
jvmArguments += [
|
||||
"-Dmixin.debug.countInjections=true",
|
||||
"-Dmixin.debug.verbose=true",
|
||||
"-Dmixin.debug.export=true"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
minecraft {
|
||||
version = minecraftVersion + '-' + forgeVersion + '-' + minecraftVersion
|
||||
runDir = 'run'
|
||||
|
||||
if (replaceGradleTokenInFile) {
|
||||
replaceIn replaceGradleTokenInFile
|
||||
if(gradleTokenModId) {
|
||||
replace gradleTokenModId, modId
|
||||
}
|
||||
if(gradleTokenModName) {
|
||||
replace gradleTokenModName, modName
|
||||
}
|
||||
if(gradleTokenVersion) {
|
||||
replace gradleTokenVersion, modVersion
|
||||
}
|
||||
if(gradleTokenGroupName) {
|
||||
replace gradleTokenGroupName, modGroup
|
||||
}
|
||||
}
|
||||
|
||||
clientIntellijRun {
|
||||
args(arguments)
|
||||
jvmArgs(jvmArguments)
|
||||
|
||||
if(developmentEnvironmentUserName) {
|
||||
args("--username", developmentEnvironmentUserName)
|
||||
}
|
||||
}
|
||||
|
||||
serverIntellijRun {
|
||||
args(arguments)
|
||||
jvmArgs(jvmArguments)
|
||||
}
|
||||
}
|
||||
|
||||
if(file('addon.gradle').exists()) {
|
||||
apply from: 'addon.gradle'
|
||||
}
|
||||
|
||||
apply from: 'repositories.gradle'
|
||||
|
||||
configurations {
|
||||
shade
|
||||
compile.extendsFrom shade
|
||||
implementation.extendsFrom(shadowImplementation) // TODO: remove after all uses are refactored
|
||||
implementation.extendsFrom(shadowCompile)
|
||||
implementation.extendsFrom(shadeCompile)
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
name 'Overmind forge repo mirror'
|
||||
url 'https://gregtech.overminddl1.com/'
|
||||
}
|
||||
if(usesMixins.toBoolean()) {
|
||||
maven {
|
||||
name 'sponge'
|
||||
url 'https://repo.spongepowered.org/repository/maven-public'
|
||||
}
|
||||
maven {
|
||||
url 'https://jitpack.io'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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")
|
||||
if(usesMixins.toBoolean()) {
|
||||
annotationProcessor('org.ow2.asm:asm-debug-all:5.0.3')
|
||||
annotationProcessor('com.google.guava:guava:24.1.1-jre')
|
||||
annotationProcessor('com.google.code.gson:gson:2.8.6')
|
||||
annotationProcessor('org.spongepowered:mixin:0.8-SNAPSHOT')
|
||||
// using 0.8 to workaround a issue in 0.7 which fails mixin application
|
||||
compile('com.github.GTNewHorizons:SpongePoweredMixin:0.7.12-GTNH') {
|
||||
// Mixin includes a lot of dependencies that are too up-to-date
|
||||
exclude module: 'launchwrapper'
|
||||
exclude module: 'guava'
|
||||
exclude module: 'gson'
|
||||
exclude module: 'commons-io'
|
||||
exclude module: 'log4j-core'
|
||||
}
|
||||
resources {
|
||||
srcDir new File(root, "resources")
|
||||
compile('com.github.GTNewHorizons:SpongeMixins:1.5.0')
|
||||
}
|
||||
}
|
||||
|
||||
apply from: 'dependencies.gradle'
|
||||
|
||||
def mixingConfigRefMap = 'mixins.' + modId + '.refmap.json'
|
||||
def refMap = "${tasks.compileJava.temporaryDir}" + File.separator + mixingConfigRefMap
|
||||
def mixinSrg = "${tasks.reobf.temporaryDir}" + File.separator + "mixins.srg"
|
||||
|
||||
task generateAssets {
|
||||
if (usesMixins.toBoolean()) {
|
||||
def mixinConfigFile = getFile("/src/main/resources/mixins." + modId + ".json");
|
||||
if (!mixinConfigFile.exists()) {
|
||||
mixinConfigFile.text = """{
|
||||
"required": true,
|
||||
"minVersion": "0.7.11",
|
||||
"package": "${modGroup}.${mixinsPackage}",
|
||||
"plugin": "${modGroup}.${mixinPlugin}",
|
||||
"refmap": "${mixingConfigRefMap}",
|
||||
"target": "@env(DEFAULT)",
|
||||
"compatibilityLevel": "JAVA_8",
|
||||
"mixins": [],
|
||||
"client": [],
|
||||
"server": []
|
||||
}
|
||||
"""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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"
|
||||
// }
|
||||
task relocateShadowJar(type: ConfigureShadowRelocation) {
|
||||
target = tasks.shadowJar
|
||||
prefix = modGroup + ".shadow"
|
||||
}
|
||||
|
||||
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)){
|
||||
shadowJar {
|
||||
project.configurations.shadeCompile.each { dep ->
|
||||
from(project.zipTree(dep)) {
|
||||
exclude 'META-INF', 'META-INF/**'
|
||||
}
|
||||
}
|
||||
|
||||
manifest {
|
||||
attributes(getManifestAttributes())
|
||||
}
|
||||
|
||||
minimize() // This will only allow shading for actually used classes
|
||||
configurations = [project.configurations.shadowImplementation, project.configurations.shadowCompile]
|
||||
dependsOn(relocateShadowJar)
|
||||
}
|
||||
|
||||
task sourceJar(type: Jar) {
|
||||
from sourceSets.main.java
|
||||
from new File(root, "dev")
|
||||
getArchiveClassifier().set("src")
|
||||
jar {
|
||||
project.configurations.shadeCompile.each { dep ->
|
||||
from(project.zipTree(dep)) {
|
||||
exclude 'META-INF', 'META-INF/**'
|
||||
}
|
||||
}
|
||||
|
||||
manifest {
|
||||
attributes(getManifestAttributes())
|
||||
}
|
||||
|
||||
if(usesShadowedDependencies.toBoolean()) {
|
||||
dependsOn(shadowJar)
|
||||
enabled = false
|
||||
}
|
||||
}
|
||||
|
||||
reobf {
|
||||
if(usesMixins.toBoolean()) {
|
||||
addExtraSrgFile mixinSrg
|
||||
}
|
||||
}
|
||||
|
||||
afterEvaluate {
|
||||
if(usesMixins.toBoolean()) {
|
||||
tasks.compileJava {
|
||||
options.compilerArgs += [
|
||||
"-AreobfSrgFile=${tasks.reobf.srg}",
|
||||
"-AoutSrgFile=${mixinSrg}",
|
||||
"-AoutRefMapFile=${refMap}",
|
||||
// Elan: from what I understand they are just some linter configs so you get some warning on how to properly code
|
||||
"-XDenableSunApiLintControl",
|
||||
"-XDignore.symbol.file"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
runClient {
|
||||
if(developmentEnvironmentUserName) {
|
||||
arguments += [
|
||||
"--username",
|
||||
developmentEnvironmentUserName
|
||||
]
|
||||
}
|
||||
|
||||
args(arguments)
|
||||
jvmArgs(jvmArguments)
|
||||
}
|
||||
|
||||
runServer {
|
||||
args(arguments)
|
||||
jvmArgs(jvmArguments)
|
||||
}
|
||||
|
||||
tasks.withType(JavaExec).configureEach {
|
||||
javaLauncher.set(
|
||||
javaToolchains.launcherFor {
|
||||
languageVersion = projectJavaVersion
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
processResources {
|
||||
// this will ensure that this task is redone when the versions change.
|
||||
inputs.property "version", project.version
|
||||
inputs.property "mcversion", project.minecraft.version
|
||||
|
||||
// replace stuff in mcmod.info, nothing else
|
||||
from(sourceSets.main.resources.srcDirs) {
|
||||
include 'mcmod.info'
|
||||
|
||||
// replace modVersion and minecraftVersion
|
||||
expand "minecraftVersion": project.minecraft.version,
|
||||
"modVersion": modVersion,
|
||||
"modId": modId,
|
||||
"modName": modName
|
||||
}
|
||||
|
||||
if(usesMixins.toBoolean()) {
|
||||
from refMap
|
||||
}
|
||||
|
||||
// copy everything else that's not the mcmod.info
|
||||
from(sourceSets.main.resources.srcDirs) {
|
||||
exclude 'mcmod.info'
|
||||
}
|
||||
}
|
||||
|
||||
def getManifestAttributes() {
|
||||
def manifestAttributes = [:]
|
||||
if(!containsMixinsAndOrCoreModOnly.toBoolean() && (usesMixins.toBoolean() || coreModClass)) {
|
||||
manifestAttributes += ["FMLCorePluginContainsFMLMod": true]
|
||||
}
|
||||
|
||||
if(accessTransformersFile) {
|
||||
manifestAttributes += ["FMLAT" : accessTransformersFile.toString()]
|
||||
}
|
||||
|
||||
if(coreModClass) {
|
||||
manifestAttributes += ["FMLCorePlugin": modGroup + "." + coreModClass]
|
||||
}
|
||||
|
||||
if(usesMixins.toBoolean()) {
|
||||
manifestAttributes += [
|
||||
"TweakClass" : "org.spongepowered.asm.launch.MixinTweaker",
|
||||
"MixinConfigs" : "mixins." + modId + ".json",
|
||||
"ForceLoadAsMod" : !containsMixinsAndOrCoreModOnly.toBoolean()
|
||||
]
|
||||
}
|
||||
return manifestAttributes
|
||||
}
|
||||
|
||||
task sourcesJar(type: Jar) {
|
||||
from (sourceSets.main.allSource)
|
||||
from (file("$projectDir/LICENSE"))
|
||||
getArchiveClassifier().set('sources')
|
||||
}
|
||||
|
||||
task shadowDevJar(type: ShadowJar) {
|
||||
project.configurations.shadeCompile.each { dep ->
|
||||
from(project.zipTree(dep)) {
|
||||
exclude 'META-INF', 'META-INF/**'
|
||||
}
|
||||
}
|
||||
|
||||
from sourceSets.main.output
|
||||
getArchiveClassifier().set("dev")
|
||||
|
||||
manifest {
|
||||
attributes(getManifestAttributes())
|
||||
}
|
||||
|
||||
minimize() // This will only allow shading for actually used classes
|
||||
configurations = [project.configurations.shadowImplementation, project.configurations.shadowCompile]
|
||||
}
|
||||
|
||||
task relocateShadowDevJar(type: ConfigureShadowRelocation) {
|
||||
target = tasks.shadowDevJar
|
||||
prefix = modGroup + ".shadow"
|
||||
}
|
||||
|
||||
task circularResolverJar(type: Jar) {
|
||||
dependsOn(relocateShadowDevJar)
|
||||
dependsOn(shadowDevJar)
|
||||
enabled = false
|
||||
}
|
||||
|
||||
task devJar(type: Jar) {
|
||||
project.configurations.shadeCompile.each { dep ->
|
||||
from(project.zipTree(dep)) {
|
||||
exclude 'META-INF', 'META-INF/**'
|
||||
}
|
||||
}
|
||||
|
||||
from sourceSets.main.output
|
||||
getArchiveClassifier().set("dev")
|
||||
manifest commonManifest
|
||||
|
||||
manifest {
|
||||
attributes(getManifestAttributes())
|
||||
}
|
||||
|
||||
if(usesShadowedDependencies.toBoolean()) {
|
||||
dependsOn(circularResolverJar)
|
||||
enabled = false
|
||||
}
|
||||
}
|
||||
|
||||
task apiJar(type: Jar) {
|
||||
from (sourceSets.main.allSource) {
|
||||
include modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/") + '/**'
|
||||
}
|
||||
|
||||
from (sourceSets.main.output) {
|
||||
include modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/") + '/**'
|
||||
}
|
||||
|
||||
from (sourceSets.main.resources.srcDirs) {
|
||||
include("LICENSE")
|
||||
}
|
||||
|
||||
getArchiveClassifier().set('api')
|
||||
}
|
||||
|
||||
// Tell the artifact system about our extra jars
|
||||
artifacts {
|
||||
archives sourceJar, devJar
|
||||
if(!noPublishedSources) {
|
||||
archives sourcesJar
|
||||
}
|
||||
archives devJar
|
||||
if(apiPackage) {
|
||||
archives apiJar
|
||||
}
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
// The gradle metadata includes all of the additional deps that we disabled from POM generation (including forgeBin with no groupID),
|
||||
// and isn't strictly needed with the POM so just disable it.
|
||||
tasks.withType(GenerateModuleMetadata) {
|
||||
enabled = false
|
||||
}
|
||||
|
||||
// workaround variable hiding in pom processing
|
||||
def projectConfigs = project.configurations
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
maven(MavenPublication) {
|
||||
from components.java
|
||||
if(usesShadowedDependencies.toBoolean()) {
|
||||
artifact source: shadowJar, classifier: ""
|
||||
}
|
||||
if(!noPublishedSources) {
|
||||
artifact source: sourcesJar, classifier: "sources"
|
||||
}
|
||||
artifact source: usesShadowedDependencies.toBoolean() ? shadowDevJar : devJar, classifier: "dev"
|
||||
if (apiPackage) {
|
||||
artifact source: apiJar, classifier: "api"
|
||||
}
|
||||
|
||||
groupId = System.getenv("ARTIFACT_GROUP_ID") ?: "com.github.GTNewHorizons"
|
||||
artifactId = System.getenv("ARTIFACT_ID") ?: project.name
|
||||
// Using the identified version, not project.version as it has the prepended 1.7.10
|
||||
version = System.getenv("RELEASE_VERSION") ?: identifiedVersion
|
||||
|
||||
// remove extra garbage from minecraft and minecraftDeps configuration
|
||||
pom.withXml {
|
||||
def badArtifacts = [:].withDefault {[] as Set<String>}
|
||||
for (configuration in [projectConfigs.minecraft, projectConfigs.minecraftDeps]) {
|
||||
for (dependency in configuration.allDependencies) {
|
||||
badArtifacts[dependency.group == null ? "" : dependency.group] += dependency.name
|
||||
}
|
||||
}
|
||||
// example for specifying extra stuff to ignore
|
||||
// badArtifacts["org.example.group"] += "artifactName"
|
||||
|
||||
Node pomNode = asNode()
|
||||
pomNode.dependencies.'*'.findAll() {
|
||||
badArtifacts[it.groupId.text()].contains(it.artifactId.text())
|
||||
}.each() {
|
||||
it.parent().remove(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
url = "http://jenkins.usrv.eu:8081/nexus/content/repositories/releases"
|
||||
credentials {
|
||||
username = System.getenv("MAVEN_USER") ?: "NONE"
|
||||
password = System.getenv("MAVEN_PASSWORD") ?: "NONE"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Updating
|
||||
task updateBuildScript {
|
||||
doLast {
|
||||
if (performBuildScriptUpdate(projectDir.toString())) return
|
||||
|
||||
print("Build script already up-to-date!")
|
||||
}
|
||||
}
|
||||
|
||||
if (isNewBuildScriptVersionAvailable(projectDir.toString())) {
|
||||
if (autoUpdateBuildScript.toBoolean()) {
|
||||
performBuildScriptUpdate(projectDir.toString())
|
||||
} else {
|
||||
out.style(Style.SuccessHeader).println("Build script update available! Run 'gradle updateBuildScript'")
|
||||
}
|
||||
}
|
||||
|
||||
static URL availableBuildScriptUrl() {
|
||||
new URL("https://raw.githubusercontent.com/GTNewHorizons/ExampleMod1.7.10/main/build.gradle")
|
||||
}
|
||||
|
||||
boolean performBuildScriptUpdate(String projectDir) {
|
||||
if (isNewBuildScriptVersionAvailable(projectDir)) {
|
||||
def buildscriptFile = getFile("build.gradle")
|
||||
availableBuildScriptUrl().withInputStream { i -> buildscriptFile.withOutputStream { it << i } }
|
||||
out.style(Style.Success).print("Build script updated. Please REIMPORT the project or RESTART your IDE!")
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
boolean isNewBuildScriptVersionAvailable(String projectDir) {
|
||||
Map parameters = ["connectTimeout": 2000, "readTimeout": 2000]
|
||||
|
||||
String currentBuildScript = getFile("build.gradle").getText()
|
||||
String currentBuildScriptHash = getVersionHash(currentBuildScript)
|
||||
String availableBuildScript = availableBuildScriptUrl().newInputStream(parameters).getText()
|
||||
String availableBuildScriptHash = getVersionHash(availableBuildScript)
|
||||
|
||||
boolean isUpToDate = currentBuildScriptHash.empty || availableBuildScriptHash.empty || currentBuildScriptHash == availableBuildScriptHash
|
||||
return !isUpToDate
|
||||
}
|
||||
|
||||
static String getVersionHash(String buildScriptContent) {
|
||||
String versionLine = buildScriptContent.find("^//version: [a-z0-9]*")
|
||||
if(versionLine != null) {
|
||||
return versionLine.split(": ").last()
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
configure(updateBuildScript) {
|
||||
group = 'forgegradle'
|
||||
description = 'Updates the build script to the latest version'
|
||||
}
|
||||
|
||||
// Deobfuscation
|
||||
|
||||
def deobf(String sourceURL) {
|
||||
try {
|
||||
URL url = new URL(sourceURL)
|
||||
String fileName = url.getFile()
|
||||
|
||||
//get rid of directories:
|
||||
int lastSlash = fileName.lastIndexOf("/")
|
||||
if(lastSlash > 0) {
|
||||
fileName = fileName.substring(lastSlash + 1)
|
||||
}
|
||||
//get rid of extension:
|
||||
if(fileName.endsWith(".jar")) {
|
||||
fileName = fileName.substring(0, fileName.lastIndexOf("."))
|
||||
}
|
||||
|
||||
String hostName = url.getHost()
|
||||
if(hostName.startsWith("www.")) {
|
||||
hostName = hostName.substring(4)
|
||||
}
|
||||
List parts = Arrays.asList(hostName.split("\\."))
|
||||
Collections.reverse(parts)
|
||||
hostName = String.join(".", parts)
|
||||
|
||||
return deobf(sourceURL, hostName + "/" + fileName)
|
||||
} catch(Exception e) {
|
||||
return deobf(sourceURL, "deobf/" + String.valueOf(sourceURL.hashCode()))
|
||||
}
|
||||
}
|
||||
|
||||
// The method above is to be preferred. Use this method if the filename is not at the end of the URL.
|
||||
def deobf(String sourceURL, String fileName) {
|
||||
String cacheDir = System.getProperty("user.home") + "/.gradle/caches/"
|
||||
String bon2Dir = cacheDir + "forge_gradle/deobf"
|
||||
String bon2File = bon2Dir + "/BON2-2.5.0.jar"
|
||||
String obfFile = cacheDir + "modules-2/files-2.1/" + fileName + ".jar"
|
||||
String deobfFile = cacheDir + "modules-2/files-2.1/" + fileName + "-deobf.jar"
|
||||
|
||||
if(file(deobfFile).exists()) {
|
||||
return files(deobfFile)
|
||||
}
|
||||
|
||||
download.run {
|
||||
src 'https://github.com/GTNewHorizons/BON2/releases/download/2.5.0/BON2-2.5.0.CUSTOM-all.jar'
|
||||
dest bon2File
|
||||
quiet true
|
||||
overwrite false
|
||||
}
|
||||
|
||||
download.run {
|
||||
src sourceURL
|
||||
dest obfFile
|
||||
quiet true
|
||||
overwrite false
|
||||
}
|
||||
|
||||
exec {
|
||||
commandLine 'java', '-jar', bon2File, '--inputJar', obfFile, '--outputJar', deobfFile, '--mcVer', '1.7.10', '--mappingsVer', 'stable_12', '--notch'
|
||||
workingDir bon2Dir
|
||||
standardOutput = new ByteArrayOutputStream()
|
||||
}
|
||||
|
||||
return files(deobfFile)
|
||||
}
|
||||
|
||||
// Helper methods
|
||||
|
||||
def checkPropertyExists(String propertyName) {
|
||||
if (!project.hasProperty(propertyName)) {
|
||||
throw new GradleException("This project requires a property \"" + propertyName + "\"! Please add it your \"gradle.properties\". You can find all properties and their description here: https://github.com/GTNewHorizons/ExampleMod1.7.10/blob/main/gradle.properties")
|
||||
}
|
||||
}
|
||||
|
||||
def getFile(String relativePath) {
|
||||
return new File(projectDir, relativePath)
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
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
|
||||
@@ -0,0 +1,7 @@
|
||||
// Add your dependencies here
|
||||
|
||||
dependencies {
|
||||
compile('com.github.GTNewHorizons:CodeChickenLib:1.1.5.3:dev')
|
||||
compile('com.github.GTNewHorizons:CodeChickenCore:1.1.3:dev')
|
||||
shadowImplementation('org.apache.commons:commons-csv:1.8')
|
||||
}
|
||||
@@ -1,808 +0,0 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
modName = NotEnoughItems
|
||||
|
||||
# This is a case-sensitive string to identify your mod. Convention is to use lower case.
|
||||
modId = NotEnoughItems
|
||||
|
||||
modGroup = codechicken.nei
|
||||
|
||||
# WHY is there no version field?
|
||||
# The build script relies on git to provide a version via tags. It is super easy and will enable you to always know the
|
||||
# code base or your binary. Check out this tutorial: https://blog.mattclemente.com/2017/10/13/versioning-with-git-tags/
|
||||
|
||||
# Will update your build.gradle automatically whenever an update is available
|
||||
autoUpdateBuildScript = false
|
||||
|
||||
minecraftVersion = 1.7.10
|
||||
forgeVersion = 10.13.4.1614
|
||||
|
||||
# Select a username for testing your mod with breakpoints. You may leave this empty for a random username each time you
|
||||
# restart Minecraft in development. Choose this dependent on your mod:
|
||||
# Do you need consistent player progressing (for example Thaumcraft)? -> Select a name
|
||||
# Do you need to test how your custom blocks interacts with a player that is not the owner? -> leave name empty
|
||||
developmentEnvironmentUserName = Developer
|
||||
|
||||
# Define a source file of your project with:
|
||||
# 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 = NEIModContainer.java
|
||||
gradleTokenModId = GRADLETOKEN_MODID
|
||||
gradleTokenModName = GRADLETOKEN_MODNAME
|
||||
gradleTokenVersion = GRADLETOKEN_VERSION
|
||||
gradleTokenGroupName =
|
||||
|
||||
# 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/
|
||||
# Example value: mymodid_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
|
||||
# Specify the location of your implementation of IMixinPlugin. Leave it empty otherwise.
|
||||
mixinPlugin =
|
||||
# Specify the package that contains all of your Mixins. You may only place Mixins in this package or the build will fail!
|
||||
mixinsPackage =
|
||||
# Specify the core mod entry class if you use a core mod. This class must implement IFMLLoadingPlugin!
|
||||
# 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
|
||||
|
||||
# If enabled, you may use 'shadowImplementation' for dependencies. They will be integrated in your jar. It is your
|
||||
# responsibility check the licence and request permission for distribution, if required.
|
||||
usesShadowedDependencies = true
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.1-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
@@ -0,0 +1,2 @@
|
||||
before_install:
|
||||
- ./gradlew setupCIWorkspace
|
||||
@@ -0,0 +1,18 @@
|
||||
// Add any additional repositiroes for your dependencies here
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven {
|
||||
name 'GTNH Maven'
|
||||
url 'http://jenkins.usrv.eu:8081/nexus/content/groups/public/'
|
||||
}
|
||||
maven {
|
||||
url 'https://cursemaven.com'
|
||||
content {
|
||||
includeGroup 'curse.maven'
|
||||
}
|
||||
}
|
||||
maven {
|
||||
url 'https://jitpack.io'
|
||||
}
|
||||
}
|
||||
@@ -1,387 +0,0 @@
|
||||
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,,,65,,5,,,,,,
|
||||
appeng.integration.modules.NEIHelpers.NEIAEShapelessRecipeHandler,AppliedEnergistics2,appliedenergistics2:item.ItemMultiPart:380,,appliedenergistics2,TRUE,,,65,,5,,,,,,
|
||||
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,,,65,,5,,,,,,
|
||||
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,,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,,,,,,
|
||||
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,,,,,,
|
||||
gt.recipe.arcfurnace,gregtech,gregtech:gt.blockmachines:651,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.assembler,gregtech,gregtech:gt.blockmachines:211,,gregtech,TRUE,gregapi_post,6,145,166,2,,,,,,
|
||||
gt.recipe.autoclave,gregtech,gregtech:gt.blockmachines:571,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.blastfurnace,gregtech,gregtech:gt.blockmachines:1000,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.brewer,gregtech,gregtech:gt.blockmachines:491,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.byproductlist,gregtech,gregtech:gt.metaitem.01:2019,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.canner,gregtech,gregtech:gt.blockmachines:231,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.centrifuge,gregtech,gregtech:gt.blockmachines:361,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.chemicalbath,gregtech,gregtech:gt.blockmachines:541,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.chemicalreactor,gregtech,gregtech:gt.blockmachines:421,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.circuitassembler,gregtech,gregtech:gt.blockmachines:1180,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.cncmachine,gregtech,gregtech:gt.metaitem.01:23305,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.cokeoven,gregtech,gregtech:gt.blockmachines:791,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.componentassembler,gregtech,gregtech:gt.blockmachines:211,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.compressor,gregtech,gregtech:gt.blockmachines:241,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.craker,gregtech,gregtech:gt.blockmachines:1160,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.cuttingsaw,gregtech,gregtech:gt.blockmachines:251,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.dieselgeneratorfuel,gregtech,gregtech:gt.blockmachines:1110,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.distillationtower,gregtech,gregtech:gt.blockmachines:1126,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.distillery,gregtech,gregtech:gt.blockmachines:531,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.electrolyzer,gregtech,gregtech:gt.blockmachines:371,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.electromagneticseparator,gregtech,gregtech:gt.blockmachines:561,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.extractor,gregtech,gregtech:gt.blockmachines:271,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.extrahugenaquadahreactor,gregtech,gregtech:gt.blockmachines:1189,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.extremedieselgeneratorfuel,gregtech,gregtech:gt.blockmachines:2105,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.extruder,gregtech,gregtech:gt.blockmachines:281,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.fakeAssemblylineProcess,gregtech,gregtech:gt.blockmachines:1170,,gregtech,TRUE,gregapi_post,12,135,166,2,,,,,,
|
||||
gt.recipe.fermenter,gregtech,gregtech:gt.blockmachines:501,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.fluidcanner,gregtech,gregtech:gt.blockmachines:431,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.fluidextractor,gregtech,gregtech:gt.blockmachines:511,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.fluidheater,gregtech,gregtech:gt.blockmachines:621,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.fluidnaquadahreactor,gregtech,gregtech:gt.blockmachines:1192,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.fluidsolidifier,gregtech,gregtech:gt.blockmachines:521,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.fusionreactor,gregtech,gregtech:gt.blockmachines:1193,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.gasturbinefuel,gregtech,gregtech:gt.blockmachines:1115,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.hammer,gregtech,gregtech:gt.blockmachines:611,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.hugenaquadahreactor,gregtech,gregtech:gt.blockmachines:1188,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.implosioncompressor,gregtech,gregtech:gt.blockmachines:12734,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.largeboilerfakefuels,gregtech,gregtech:gt.blockmachines:1020,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.largechemicalreactor,gregtech,gregtech:gt.blockmachines:1169,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.largenaquadahreactor,gregtech,gregtech:gt.blockmachines:1191,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.laserengraver,gregtech,gregtech:gt.blockmachines:591,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.lathe,gregtech,gregtech:gt.blockmachines:291,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.macerator,gregtech,gregtech:gt.blockmachines:301,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.magicfuels,gregtech,gregtech:gt.blockmachines:1123,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.massfab,gregtech,gregtech:gt.blockmachines:461,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.metalbender,gregtech,gregtech:gt.blockmachines:221,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.microwave,gregtech,gregtech:gt.blockmachines:311,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.mixer,gregtech,gregtech:gt.blockmachines:581,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.orewasher,gregtech,gregtech:gt.blockmachines:391,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.packager,gregtech,gregtech:gt.blockmachines:401,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.plasmaarcfurnace,gregtech,gregtech:gt.blockmachines:661,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.plasmageneratorfuels,gregtech,gregtech:gt.blockmachines:1196,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.polarizer,gregtech,gregtech:gt.blockmachines:551,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.press,gregtech,gregtech:gt.blockmachines:601,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.primitiveblastfurnace,gregtech,gregtech:gt.blockmachines:140,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.printer,gregtech,gregtech:gt.blockmachines:321,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.pyro,gregtech,gregtech:gt.blockmachines:1159,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.replicator,gregtech,gregtech:gt.blockmachines:481,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.rockbreaker,gregtech,gregtech:gt.blockmachines:441,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.scanner,gregtech,gregtech:gt.blockmachines:341,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.semifluidboilerfuels,gregtech,gregtech:gt.blockmachines:1020,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.sifter,gregtech,gregtech:gt.blockmachines:641,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.slicer,gregtech,gregtech:gt.blockmachines:631,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.smallnaquadahreactor,gregtech,gregtech:gt.blockmachines:1190,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.thermalcentrifuge,gregtech,gregtech:gt.blockmachines:381,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.thermalgeneratorfuel,gregtech,IC2:blockGenerator:1,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.unpackager,gregtech,gregtech:gt.blockmachines:411,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.uuamplifier,gregtech,gregtech:gt.blockmachines:471,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.vacuumfreezer,gregtech,gregtech:gt.blockmachines:1002,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
gt.recipe.wiremill,gregtech,gregtech:gt.blockmachines:351,,gregtech,TRUE,gregapi_post,6,135,166,2,,,,,,
|
||||
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,,6,135,166,2,,,,,,ABS
|
||||
gt.recipe.rocketenginefuel,GT++,gregtech:gt.blockmachines:793,,miscutils,TRUE,,6,135,166,2,,,,,,Basic (EV) rocket fuel gen
|
||||
gt.recipe.cyclotron,GT++,gregtech:gt.blockmachines:828,,miscutils,TRUE,,6,135,166,2,,,,,,Cyclotron
|
||||
gt.recipe.chemicaldehydrator,GT++,gregtech:gt.blockmachines:911,,miscutils,TRUE,,6,135,166,2,,,,,,Dehydrator
|
||||
gt.recipe.slowfusionreactor,GT++,gregtech:gt.blockmachines:31015,,miscutils,TRUE,,6,135,166,2,,,,,,gt.blockmachines.gtplusplus.fusion.single
|
||||
gt.recipe.RTGgenerators,GT++,gregtech:gt.blockmachines:869,,miscutils,TRUE,,6,135,166,2,,,,,,GT++ version of the RTG
|
||||
gt.recipe.cokeoven,GT++,gregtech:gt.blockmachines:791,,miscutils,TRUE,,6,135,166,2,,,,,,ICO
|
||||
gt.recipe.semifluidgeneratorfuels,GT++,gregtech:gt.blockmachines:837,,miscutils,TRUE,,6,135,166,2,,,,,,Semifluid gen
|
||||
gt.recipe.fishpond,GT++,gregtech:gt.blockmachines:829,,miscutils,TRUE,,6,135,166,2,,,,,,Zhuhai
|
||||
gt.recipe.advanced.mixer,GT++,gregtech:gt.blockmachines:811,,miscutils,TRUE,,6,135,166,2,,,,,,
|
||||
gt.recipe.cryogenicfreezer,GT++,gregtech:gt.blockmachines:910,,miscutils,TRUE,,6,135,166,2,,,,,,
|
||||
gt.recipe.fissionfuel,GT++,gregtech:gt.blockmachines:835,,miscutils,TRUE,,6,135,166,2,,,,,,
|
||||
gt.recipe.geothermalfuel,GT++,gregtech:gt.blockmachines:830,,miscutils,TRUE,,6,135,166,2,,,,,,
|
||||
gt.recipe.lftr,GT++,gregtech:gt.blockmachines:751,,miscutils,TRUE,,6,135,166,2,,,,,,
|
||||
gt.recipe.lftr.2,GT++,gregtech:gt.blockmachines:751,,miscutils,TRUE,,6,135,166,2,,,,,,
|
||||
gt.recipe.matterfab2,GT++,gregtech:gt.blockmachines:799,,miscutils,TRUE,,6,135,166,2,,,,,,
|
||||
gt.recipe.multicentrifuge,GT++,gregtech:gt.blockmachines:790,,miscutils,TRUE,,6,135,166,2,,,,,,
|
||||
gt.recipe.multielectro,GT++,gregtech:gt.blockmachines:796,,miscutils,TRUE,,6,135,166,2,,,,,,
|
||||
gt.recipe.simplewasher,GT++,gregtech:gt.blockmachines:767,,miscutils,TRUE,,6,135,166,2,,,,,,
|
||||
gt.recipe.vacfurnace,GT++,gregtech:gt.blockmachines:995,,miscutils,TRUE,,6,135,166,2,,,,,,
|
||||
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,,,120,,2,,,,,,
|
||||
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,,,,,,
|
||||
smelting,Gregtech 6,gregtech:gt.multitileentity:20001,,gregapi_post,TRUE,,15,145,166,2,,,,,,This uses the same recipe map as the MC furnace
|
||||
gt.recipe.trees,Gregtech 6,minecraft:sapling,,gregapi_post,TRUE,,15,145,166,2,,,,,,
|
||||
moze_intel.projecte.integration.NEI.NEIWorldTransmuteHandler,ProjectE,ProjectE:item.pe_philosophers_stone,,ProjectE,TRUE,,,45,,10,,,,,,
|
||||
moze_intel.projecte.integration.NEI.NEIPhiloSmeltingHandler,ProjectE,ProjectE:item.pe_philosophers_stone,,ProjectE,TRUE,,,,,5,,,,,,
|
||||
moze_intel.projecte.integration.NEI.NEIKleinStarHandler,ProjectE,ProjectE:item.pe_klein_star,,ProjectE,TRUE,,,,,5,,,,,,
|
||||
moze_intel.projecte.integration.NEI.NEIAlchBagHandler,ProjectE,ProjectE:item.pe_alchemical_bag,,ProjectE,TRUE,,,,,5,,,,,,
|
||||
de.katzenpapst.amunra.nei.recipehandler.ARCircuitFab,Pra's Galacticraft Mod,GalacticraftCore:tile.machine2:4,,GalacticraftAmunRa,TRUE,,,,,,,,,,,
|
||||
de.katzenpapst.amunra.nei.recipehandler.ARNasaWorkbenchShuttle,Pra's Galacticraft Mod,GalacticraftAmunRa:item.itemShuttle,,GalacticraftAmunRa,TRUE,,,130,168,16,,,,,,
|
||||
vazkii.botania.client.integration.nei.recipe.RecipeHandlerFloatingFlowers,Botania,Botania:miniIsland,,Botania,TRUE,,,,,5,,,,,,
|
||||
vazkii.botania.client.integration.nei.recipe.RecipeHandlerPetalApothecary,Botania,Botania:altar,,Botania,TRUE,,,102,137,4,,,,,,
|
||||
vazkii.botania.client.integration.nei.recipe.RecipeHandlerRunicAltar,Botania,Botania:runeAltar,,Botania,TRUE,,,122,137,4,,,,,,
|
||||
vazkii.botania.client.integration.nei.recipe.RecipeHandlerManaPool,Botania,Botania:pool,,Botania,TRUE,,,90,137,4,,,,,,
|
||||
vazkii.botania.client.integration.nei.recipe.RecipeHandlerElvenTrade,Botania,Botania:alfheimPortal,,Botania,TRUE,,,90,130,4,,,,,,
|
||||
vazkii.botania.client.integration.nei.recipe.RecipeHandlerBrewery,Botania,Botania:brewery,,Botania,TRUE,,,,,4,,,,,,
|
||||
vazkii.botania.client.integration.nei.recipe.RecipeHandlerPureDaisy,Botania,Botania:specialFlower,"{type: ""puredaisy""}",Botania,TRUE,,,,,4,,,,,,
|
||||
vazkii.botania.client.integration.nei.recipe.RecipeHandlerLexicaBotania,Botania,Botania:lexicon,,Botania,TRUE,,,,,,,,,,,
|
||||
com.jaquadro.minecraft.storagedrawers.integration.notenoughitems.UpgradeItemRecipeHandler,Storage Drawers,minecraft:crafting_table,,StorageDrawers,TRUE,,,65,166,5,,,,,,
|
||||
ieArcFurnace,Immersive Engineering,ImmersiveEngineering:graphiteElectrode,,ImmersiveEngineering,TRUE,,,65,166,5,,,,,,
|
||||
NEIArcFurnaceHandlerAlloying,Immersive Engineering,terrafirmacraftplus:item.Bronze Ingot,,ImmersiveEngineering,TRUE,,,65,166,5,,,,,,
|
||||
NEIArcFurnaceHandlerOres,Immersive Engineering,minecraft:iron_ore,,ImmersiveEngineering,TRUE,,,65,166,5,,,,,,
|
||||
NEIArcFurnaceHandlerSmelting,Immersive Engineering,terrafirmacraftplus:item.Ore:100,,ImmersiveEngineering,TRUE,,,65,166,5,,,,,,
|
||||
NEIArcFurnaceHandlerGlassworking,Immersive Engineering,minecraft:glass,,ImmersiveEngineering,TRUE,,,65,166,5,,,,,,
|
||||
NEIArcFurnaceHandlerDecarburization,Immersive Engineering,terrafirmacraftplus:item.Wrought Iron Ingot,,ImmersiveEngineering,TRUE,,,65,166,5,,,,,,
|
||||
NEIArcFurnaceHandlerCarburization,Immersive Engineering,terrafirmacraftplus:item.HC Steel Ingot,,ImmersiveEngineering,TRUE,,,65,166,5,,,,,,
|
||||
NEIArcFurnaceHandlerHeating,Immersive Engineering,,,ImmersiveEngineering,TRUE,,,65,166,5,nei:textures/nei_tabbed_sprites.png,80,0,14,14,
|
||||
NEIArcFurnaceHandlerMelting,Immersive Engineering,terrafirmacraftplus:item.Molten Glass,,ImmersiveEngineering,TRUE,,,65,166,5,,,,,,
|
||||
NEIArcFurnaceHandlerWelding,Immersive Engineering,terrafirmacraftplus:item.Bismuth Double Ingot,,ImmersiveEngineering,TRUE,,,65,166,5,,,,,,
|
||||
NEIArcFurnaceHandlerElectrolysis,Immersive Engineering,teloaddon:Alumina,,ImmersiveEngineering,TRUE,,,65,166,5,,,,,,
|
||||
blusunrize.immersiveengineering.client.nei.NEIShaderBagHandler,Immersive Engineering,ImmersiveEngineering:shaderBag,,ImmersiveEngineering,TRUE,,,65,166,5,,,,,,
|
||||
blusunrize.immersiveengineering.client.nei.NEIBlueprintHandler,Immersive Engineering,ImmersiveEngineering:blueprint,,ImmersiveEngineering,TRUE,,,65,166,5,,,,,,
|
||||
blusunrize.immersiveengineering.client.nei.NEICokeOvenHandler,Immersive Engineering,ImmersiveEngineering:stoneDecoration:1,,ImmersiveEngineering,TRUE,,,71,166,5,,,,,,
|
||||
blusunrize.immersiveengineering.client.nei.NEIBlastFurnaceHandler,Immersive Engineering,ImmersiveEngineering:stoneDecoration:2,,ImmersiveEngineering,TRUE,,,71,166,5,,,,,,
|
||||
blusunrize.immersiveengineering.client.nei.NEISqueezerHandler,Immersive Engineering,ImmersiveEngineering:metalMultiblock:2,,ImmersiveEngineering,TRUE,,,71,166,5,,,,,,
|
||||
blusunrize.immersiveengineering.client.nei.NEIFermenterHandler,Immersive Engineering,ImmersiveEngineering:metalMultiblock:3,,ImmersiveEngineering,TRUE,,,71,166,5,,,,,,
|
||||
blusunrize.immersiveengineering.client.nei.NEIRefineryHandler,Immersive Engineering,ImmersiveEngineering:metalDevice2:5,,ImmersiveEngineering,TRUE,,,65,166,5,,,,,,
|
||||
blusunrize.immersiveengineering.client.nei.NEIBottlingMachineHandler,Immersive Engineering,minecraft:glass_bottle,,ImmersiveEngineering,TRUE,,,65,166,5,,,,,,
|
||||
blusunrize.immersiveengineering.client.nei.NEIMetalPressHandler,Immersive Engineering,ImmersiveEngineering:mold,,ImmersiveEngineering,TRUE,,,65,166,5,,,,,,
|
||||
blusunrize.immersiveengineering.client.nei.NEICrusherHandler,Immersive Engineering,minecraft:hopper,,ImmersiveEngineering,TRUE,,,71,166,5,,,,,,
|
||||
net.dries007.tfcnei.recipeHandlers.AnvilRecipeHandler,TerraFirmaCraft+,terrafirmacraftplus:Anvil,,terrafirmacraftplus,TRUE,,10,138,208,2,,,,,,
|
||||
net.dries007.tfcnei.recipeHandlers.QuernRecipeHandler,TerraFirmaCraft+,terrafirmacraftplus:item.Quern,,terrafirmacraftplus,TRUE,,,65,166,5,,,,,,
|
||||
net.dries007.tfcnei.recipeHandlers.KilnRecipeHandler,TerraFirmaCraft+,,,terrafirmacraftplus,TRUE,,,65,166,5,terrafirmacraftneiplugin:textures/gui/pitkiln.png,47,38,14,14,
|
||||
net.dries007.tfcnei.recipeHandlers.LoomRecipeHandler,TerraFirmaCraft+,terrafirmacraftplus:Loom,,terrafirmacraftplus,TRUE,,,65,166,5,,,,,,
|
||||
net.dries007.tfcnei.recipeHandlers.KnappingRecipeHandler,TerraFirmaCraft+,terrafirmacraftplus:item.LooseRock,,terrafirmacraftplus,TRUE,,,96,166,3,,,,,,
|
||||
net.dries007.tfcnei.recipeHandlers.ClothingRecipeHandler,TerraFirmaCraft+,terrafirmacraftplus:item.Bone Needle Thread,,terrafirmacraftplus,TRUE,,,65,166,5,,,,,,
|
||||
net.dries007.tfcnei.recipeHandlers.BarrelRecipeHandler,TerraFirmaCraft+,terrafirmacraftplus:Barrel,,terrafirmacraftplus,TRUE,,,65,166,5,,,,,,
|
||||
net.dries007.tfcnei.recipeHandlers.AlloyRecipeHandler,TerraFirmaCraft+,terrafirmacraftplus:Crucible,,terrafirmacraftplus,TRUE,,,65,166,5,,,,,,
|
||||
net.dries007.tfcnei.recipeHandlers.HeatRecipeHandler,TerraFirmaCraft+,terrafirmacraftplus:Firepit,,terrafirmacraftplus,TRUE,,,65,166,5,,,,,,
|
||||
|
Binary file not shown.
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,21 +0,0 @@
|
||||
[
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -1,19 +0,0 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/*
|
||||
// To declare projects as part of a multi-project build use the 'include' method
|
||||
include 'shared'
|
||||
include 'api'
|
||||
include 'services:webservice'
|
||||
*/
|
||||
|
||||
rootProject.name = 'NotEnoughItems'
|
||||
@@ -1,174 +0,0 @@
|
||||
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,479 +0,0 @@
|
||||
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,222 +0,0 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.lib.math.MathHelper;
|
||||
import codechicken.lib.render.RenderUtils;
|
||||
import codechicken.nei.KeyManager.IKeyStateTracker;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EnumCreatureType;
|
||||
import net.minecraft.entity.passive.EntityPig;
|
||||
import net.minecraft.util.AxisAlignedBB;
|
||||
import net.minecraft.world.EnumSkyBlock;
|
||||
import net.minecraft.world.SpawnerAnimals;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.biome.BiomeGenBase;
|
||||
import net.minecraft.world.chunk.Chunk;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
public class WorldOverlayRenderer implements IKeyStateTracker
|
||||
{
|
||||
public static int mobOverlay = 0;
|
||||
public static int chunkOverlay = 0;
|
||||
|
||||
public static void reset() {
|
||||
mobOverlay = 0;
|
||||
chunkOverlay = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tickKeyStates() {
|
||||
if (Minecraft.getMinecraft().currentScreen != null)
|
||||
return;
|
||||
|
||||
if (KeyManager.keyStates.get("world.moboverlay").down)
|
||||
mobOverlay = (mobOverlay + 1) % 2;
|
||||
if (KeyManager.keyStates.get("world.chunkoverlay").down)
|
||||
chunkOverlay = (chunkOverlay + 1) % 3;
|
||||
}
|
||||
|
||||
public static void render(float frame) {
|
||||
GL11.glPushMatrix();
|
||||
Entity entity = Minecraft.getMinecraft().renderViewEntity;
|
||||
RenderUtils.translateToWorldCoords(entity, frame);
|
||||
|
||||
renderChunkBounds(entity);
|
||||
renderMobSpawnOverlay(entity);
|
||||
GL11.glPopMatrix();
|
||||
}
|
||||
|
||||
private static void renderMobSpawnOverlay(Entity entity) {
|
||||
if (mobOverlay == 0)
|
||||
return;
|
||||
|
||||
GL11.glDisable(GL11.GL_TEXTURE_2D);
|
||||
GL11.glEnable(GL11.GL_BLEND);
|
||||
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||
GL11.glDisable(GL11.GL_LIGHTING);
|
||||
GL11.glLineWidth(1.5F);
|
||||
GL11.glBegin(GL11.GL_LINES);
|
||||
|
||||
GL11.glColor4f(1, 0, 0, 1);
|
||||
int curSpawnMode = 2;
|
||||
|
||||
World world = entity.worldObj;
|
||||
int x1 = (int) entity.posX;
|
||||
int z1 = (int) entity.posZ;
|
||||
int y1 = (int) MathHelper.clip(entity.posY, 16, world.getHeight() - 16);
|
||||
|
||||
for (int x = x1 - 16; x <= x1 + 16; x++)
|
||||
for (int z = z1 - 16; z <= z1 + 16; z++) {
|
||||
Chunk chunk = world.getChunkFromBlockCoords(x, z);
|
||||
BiomeGenBase biome = world.getBiomeGenForCoords(x, z);
|
||||
if (biome.getSpawnableList(EnumCreatureType.monster).isEmpty() || biome.getSpawningChance() <= 0)
|
||||
continue;
|
||||
|
||||
for (int y = y1 - 16; y < y1 + 16; y++) {
|
||||
int spawnMode = getSpawnMode(chunk, x, y, z);
|
||||
if (spawnMode == 0)
|
||||
continue;
|
||||
|
||||
if (spawnMode != curSpawnMode) {
|
||||
if (spawnMode == 1)
|
||||
GL11.glColor4f(1, 1, 0, 1);
|
||||
else
|
||||
GL11.glColor4f(1, 0, 0, 1);
|
||||
curSpawnMode = spawnMode;
|
||||
}
|
||||
|
||||
GL11.glVertex3d(x, y + 0.004, z);
|
||||
GL11.glVertex3d(x + 1, y + 0.004, z + 1);
|
||||
GL11.glVertex3d(x + 1, y + 0.004, z);
|
||||
GL11.glVertex3d(x, y + 0.004, z + 1);
|
||||
}
|
||||
}
|
||||
|
||||
GL11.glEnd();
|
||||
GL11.glEnable(GL11.GL_LIGHTING);
|
||||
GL11.glEnable(GL11.GL_TEXTURE_2D);
|
||||
GL11.glDisable(GL11.GL_BLEND);
|
||||
}
|
||||
|
||||
private static final Entity dummyEntity = new EntityPig(null);
|
||||
private static final AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(0, 0, 0, 0, 0, 0);
|
||||
private static int getSpawnMode(Chunk chunk, int x, int y, int z) {
|
||||
if (!SpawnerAnimals.canCreatureTypeSpawnAtLocation(EnumCreatureType.monster, chunk.worldObj, x, y, z) ||
|
||||
chunk.getSavedLightValue(EnumSkyBlock.Block, x & 15, y, z & 15) >= 8)
|
||||
return 0;
|
||||
|
||||
aabb.minX = x + 0.2;
|
||||
aabb.maxX = x + 0.8;
|
||||
aabb.minY = y + 0.01;
|
||||
aabb.maxY = y + 1.8;
|
||||
aabb.minZ = z + 0.2;
|
||||
aabb.maxZ = z + 0.8;
|
||||
if (!chunk.worldObj.checkNoEntityCollision(aabb) ||
|
||||
!chunk.worldObj.getCollidingBoundingBoxes(dummyEntity, aabb).isEmpty() ||
|
||||
chunk.worldObj.isAnyLiquid(aabb))
|
||||
return 0;
|
||||
|
||||
if (chunk.getSavedLightValue(EnumSkyBlock.Sky, x & 15, y, z & 15) >= 8)
|
||||
return 1;
|
||||
return 2;
|
||||
}
|
||||
|
||||
private static void renderChunkBounds(Entity entity) {
|
||||
if (chunkOverlay == 0)
|
||||
return;
|
||||
|
||||
GL11.glDisable(GL11.GL_TEXTURE_2D);
|
||||
GL11.glEnable(GL11.GL_BLEND);
|
||||
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||
GL11.glDisable(GL11.GL_LIGHTING);
|
||||
GL11.glLineWidth(1.5F);
|
||||
GL11.glBegin(GL11.GL_LINES);
|
||||
|
||||
for (int cx = -4; cx <= 4; cx++)
|
||||
for (int cz = -4; cz <= 4; cz++) {
|
||||
double x1 = (entity.chunkCoordX + cx) << 4;
|
||||
double z1 = (entity.chunkCoordZ + cz) << 4;
|
||||
double x2 = x1 + 16;
|
||||
double z2 = z1 + 16;
|
||||
|
||||
double dy = 128;
|
||||
double y1 = Math.floor(entity.posY - dy / 2);
|
||||
double y2 = y1 + dy;
|
||||
if (y1 < 0) {
|
||||
y1 = 0;
|
||||
y2 = dy;
|
||||
}
|
||||
|
||||
if (y1 > entity.worldObj.getHeight()) {
|
||||
y2 = entity.worldObj.getHeight();
|
||||
y1 = y2 - dy;
|
||||
}
|
||||
|
||||
double dist = Math.pow(1.5, -(cx * cx + cz * cz));
|
||||
|
||||
GL11.glColor4d(0.9, 0, 0, dist);
|
||||
if (cx >= 0 && cz >= 0) {
|
||||
GL11.glVertex3d(x2, y1, z2);
|
||||
GL11.glVertex3d(x2, y2, z2);
|
||||
}
|
||||
if (cx >= 0 && cz <= 0) {
|
||||
GL11.glVertex3d(x2, y1, z1);
|
||||
GL11.glVertex3d(x2, y2, z1);
|
||||
}
|
||||
if (cx <= 0 && cz >= 0) {
|
||||
GL11.glVertex3d(x1, y1, z2);
|
||||
GL11.glVertex3d(x1, y2, z2);
|
||||
}
|
||||
if (cx <= 0 && cz <= 0) {
|
||||
GL11.glVertex3d(x1, y1, z1);
|
||||
GL11.glVertex3d(x1, y2, z1);
|
||||
}
|
||||
|
||||
if (chunkOverlay == 2 && cx == 0 && cz == 0) {
|
||||
dy = 32;
|
||||
y1 = Math.floor(entity.posY - dy / 2);
|
||||
y2 = y1 + dy;
|
||||
if (y1 < 0) {
|
||||
y1 = 0;
|
||||
y2 = dy;
|
||||
}
|
||||
|
||||
if (y1 > entity.worldObj.getHeight()) {
|
||||
y2 = entity.worldObj.getHeight();
|
||||
y1 = y2 - dy;
|
||||
}
|
||||
|
||||
GL11.glColor4d(0, 0.9, 0, 0.4);
|
||||
for (double y = (int) y1; y <= y2; y++) {
|
||||
GL11.glVertex3d(x2, y, z1);
|
||||
GL11.glVertex3d(x2, y, z2);
|
||||
GL11.glVertex3d(x1, y, z1);
|
||||
GL11.glVertex3d(x1, y, z2);
|
||||
GL11.glVertex3d(x1, y, z2);
|
||||
GL11.glVertex3d(x2, y, z2);
|
||||
GL11.glVertex3d(x1, y, z1);
|
||||
GL11.glVertex3d(x2, y, z1);
|
||||
}
|
||||
for (double h = 1; h <= 15; h++) {
|
||||
GL11.glVertex3d(x1 + h, y1, z1);
|
||||
GL11.glVertex3d(x1 + h, y2, z1);
|
||||
GL11.glVertex3d(x1 + h, y1, z2);
|
||||
GL11.glVertex3d(x1 + h, y2, z2);
|
||||
GL11.glVertex3d(x1, y1, z1 + h);
|
||||
GL11.glVertex3d(x1, y2, z1 + h);
|
||||
GL11.glVertex3d(x2, y1, z1 + h);
|
||||
GL11.glVertex3d(x2, y2, z1 + h);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GL11.glEnd();
|
||||
GL11.glEnable(GL11.GL_LIGHTING);
|
||||
GL11.glEnable(GL11.GL_TEXTURE_2D);
|
||||
GL11.glDisable(GL11.GL_BLEND);
|
||||
}
|
||||
|
||||
public static void load() {
|
||||
KeyManager.trackers.add(new WorldOverlayRenderer());
|
||||
}
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
package codechicken.nei.api;
|
||||
|
||||
import codechicken.nei.NEIChestGuiHandler;
|
||||
import codechicken.nei.NEICreativeGuiHandler;
|
||||
import codechicken.nei.NEIDummySlotHandler;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.client.gui.inventory.GuiContainerCreative;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
|
||||
public class GuiInfo
|
||||
{
|
||||
public static final LinkedList<INEIGuiHandler> guiHandlers = new LinkedList<>();
|
||||
public static final HashSet<Class<? extends GuiContainer>> customSlotGuis = new HashSet<>();
|
||||
|
||||
public static void load() {
|
||||
API.registerNEIGuiHandler(new NEICreativeGuiHandler());
|
||||
API.registerNEIGuiHandler(new NEIChestGuiHandler());
|
||||
API.registerNEIGuiHandler(new NEIDummySlotHandler());
|
||||
customSlotGuis.add(GuiContainerCreative.class);
|
||||
}
|
||||
|
||||
public static void clearGuiHandlers() {
|
||||
for (Iterator<INEIGuiHandler> iterator = guiHandlers.iterator(); iterator.hasNext(); )
|
||||
if (iterator.next() instanceof GuiContainer)
|
||||
iterator.remove();
|
||||
}
|
||||
|
||||
public static boolean hasCustomSlots(GuiContainer gui) {
|
||||
return customSlotGuis.contains(gui.getClass());
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
package codechicken.nei.api;
|
||||
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
|
||||
public interface IGuiContainerOverlay
|
||||
{
|
||||
public GuiContainer getFirstScreen();
|
||||
}
|
||||
@@ -1,87 +0,0 @@
|
||||
package codechicken.nei.config;
|
||||
|
||||
import codechicken.nei.NEIClientConfig;
|
||||
import codechicken.nei.recipe.GuiRecipeTab;
|
||||
import codechicken.nei.recipe.HandlerInfo;
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
import cpw.mods.fml.common.Loader;
|
||||
import cpw.mods.fml.common.event.FMLInterModComms;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class IMCHandler {
|
||||
private IMCHandler() {}
|
||||
|
||||
public static void processIMC(List<FMLInterModComms.IMCMessage> messages) {
|
||||
for (FMLInterModComms.IMCMessage message : messages) {
|
||||
String type = message.key;
|
||||
if (type == null || type.isEmpty()) continue;
|
||||
|
||||
if(type.equals("registerHandlerInfo")) {
|
||||
if (!message.isNBTMessage()) {
|
||||
logInvalidMessage(message, "NBT");
|
||||
continue;
|
||||
}
|
||||
final NBTTagCompound tag = message.getNBTValue();
|
||||
final String handler = tag.getString("handler");
|
||||
NEIClientConfig.logger.info("Processing registerHandlerInfo `" + handler + "` from " + message.getSender());
|
||||
|
||||
final String modName = tag.getString("modName");
|
||||
final String modId = tag.getString("modId");
|
||||
final boolean requiresMod = tag.getBoolean("modRequired");
|
||||
final String excludedModId = tag.hasKey("excludedModId") ? tag.getString("excludedModId") : null;
|
||||
|
||||
if(handler.equals("") || modName.equals("") || modId.equals("")) {
|
||||
NEIClientConfig.logger.warn("Missing relevant information to registerHandlerInfo!");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (requiresMod && !Loader.isModLoaded(modId)) continue;
|
||||
if (excludedModId != null && Loader.isModLoaded(excludedModId)) continue;
|
||||
|
||||
HandlerInfo info = new HandlerInfo(handler, modName, modId, requiresMod, excludedModId);
|
||||
final String imageResource = tag.hasKey("imageResource") ? tag.getString("imageResource") : null;
|
||||
if(imageResource != null && !imageResource.equals("")) {
|
||||
info.setImage(imageResource, tag.getInteger("imageX"), tag.getInteger("imageY"), tag.getInteger("imageWidth"), tag.getInteger("imageHeight"));
|
||||
}
|
||||
if(!info.hasImageOrItem()) {
|
||||
final String itemName = tag.getString("itemName");
|
||||
if (itemName != null && !itemName.equals("")) {
|
||||
info.setItem(itemName, tag.hasKey("nbtInfo") ? tag.getString("nbtInfo") : null);
|
||||
}
|
||||
}
|
||||
final int yShift = tag.hasKey("yShift") ? tag.getInteger("yShift") : 0;
|
||||
info.setYShift(yShift);
|
||||
|
||||
try {
|
||||
final int imageHeight = tag.hasKey("handlerHeight") ? tag.getInteger("handlerHeight") : HandlerInfo.DEFAULT_HEIGHT;
|
||||
final int imageWidth = tag.hasKey("handlerWidth") ? tag.getInteger("handlerWidth") : HandlerInfo.DEFAULT_WIDTH;
|
||||
final int maxRecipesPerPage = tag.hasKey("maxRecipesPerPage") ? tag.getInteger("maxRecipesPerPage") : HandlerInfo.DEFAULT_MAX_PER_PAGE;
|
||||
info.setHandlerDimensions(imageHeight, imageWidth, maxRecipesPerPage);
|
||||
} catch (NumberFormatException ignored) {
|
||||
NEIClientConfig.logger.info("Error setting handler dimensions for " + handler);
|
||||
}
|
||||
|
||||
GuiRecipeTab.handlerMap.remove(handler);
|
||||
GuiRecipeTab.handlerMap.put(handler, info);
|
||||
} else if(type.equals("removeHandlerInfo")) {
|
||||
if (!message.isNBTMessage()) {
|
||||
logInvalidMessage(message, "NBT");
|
||||
continue;
|
||||
}
|
||||
final NBTTagCompound tag = message.getNBTValue();
|
||||
final String handler = tag.getString("handler");
|
||||
NEIClientConfig.logger.info("Processing removeHandlerInfo `" + handler + "` from " + message.getSender());
|
||||
|
||||
GuiRecipeTab.handlerMap.remove(handler);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static void logInvalidMessage(FMLInterModComms.IMCMessage message, String type) {
|
||||
FMLLog.bigWarning(String.format("Received invalid IMC '%s' from %s. Not a %s Message.", message.key, message.getSender(), type));
|
||||
}
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
package codechicken.nei.recipe;
|
||||
|
||||
import codechicken.core.TaskProfiler;
|
||||
import codechicken.nei.ItemList;
|
||||
import codechicken.nei.NEIClientUtils;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class GuiCraftingRecipe extends GuiRecipe
|
||||
{
|
||||
public static boolean openRecipeGui(String outputId, Object... results) {
|
||||
Minecraft mc = NEIClientUtils.mc();
|
||||
GuiScreen prevscreen = mc.currentScreen;// instanceof GuiContainer ? (GuiContainer) mc.currentScreen : null;
|
||||
|
||||
ArrayList<ICraftingHandler> handlers;
|
||||
TaskProfiler profiler = ProfilerRecipeHandler.getProfiler();
|
||||
profiler.start("recipe.concurrent.crafting");
|
||||
|
||||
// Pre-find the fuels so we're not fighting over it
|
||||
FuelRecipeHandler.findFuelsOnceParallel();
|
||||
|
||||
try {
|
||||
handlers = ItemList.forkJoinPool.submit(() -> craftinghandlers.parallelStream()
|
||||
.map(h -> h.getRecipeHandler(outputId, results))
|
||||
.filter(h -> h.numRecipes() > 0)
|
||||
.collect(Collectors.toCollection(ArrayList::new))).get();
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
} finally {
|
||||
profiler.end();
|
||||
}
|
||||
|
||||
if (handlers.isEmpty())
|
||||
return false;
|
||||
|
||||
mc.displayGuiScreen(new GuiCraftingRecipe(prevscreen, handlers));
|
||||
return true;
|
||||
}
|
||||
|
||||
private GuiCraftingRecipe(GuiScreen prevgui, ArrayList<ICraftingHandler> handlers) {
|
||||
super(prevgui);
|
||||
currenthandlers = handlers;
|
||||
}
|
||||
|
||||
public static void registerRecipeHandler(ICraftingHandler handler) {
|
||||
for (ICraftingHandler handler1 : craftinghandlers)
|
||||
if (handler1.getClass() == handler.getClass())
|
||||
return;
|
||||
|
||||
craftinghandlers.add(handler);
|
||||
}
|
||||
|
||||
public ArrayList<? extends IRecipeHandler> getCurrentRecipeHandlers() {
|
||||
return currenthandlers;
|
||||
}
|
||||
|
||||
public ArrayList<ICraftingHandler> currenthandlers;
|
||||
|
||||
public static ArrayList<ICraftingHandler> craftinghandlers = new ArrayList<>();
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
package codechicken.nei.recipe;
|
||||
|
||||
import codechicken.core.TaskProfiler;
|
||||
import codechicken.nei.ItemList;
|
||||
import codechicken.nei.NEIClientUtils;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class GuiUsageRecipe extends GuiRecipe
|
||||
{
|
||||
public static boolean openRecipeGui(String inputId, Object... ingredients) {
|
||||
Minecraft mc = NEIClientUtils.mc();
|
||||
GuiContainer prevscreen = mc.currentScreen instanceof GuiContainer ? (GuiContainer) mc.currentScreen : null;
|
||||
|
||||
ArrayList<IUsageHandler> handlers;
|
||||
TaskProfiler profiler = ProfilerRecipeHandler.getProfiler();
|
||||
|
||||
// Pre-find the fuels so we're not fighting over it
|
||||
FuelRecipeHandler.findFuelsOnceParallel();
|
||||
|
||||
profiler.start("recipe.concurrent.usage");
|
||||
try {
|
||||
handlers = ItemList.forkJoinPool.submit(() -> usagehandlers.parallelStream()
|
||||
.map(h -> h.getUsageHandler(inputId, ingredients))
|
||||
.filter(h -> h.numRecipes() > 0)
|
||||
.collect(Collectors.toCollection(ArrayList::new))).get();
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
} finally {
|
||||
profiler.end();
|
||||
}
|
||||
|
||||
if (handlers.isEmpty())
|
||||
return false;
|
||||
|
||||
mc.displayGuiScreen(new GuiUsageRecipe(prevscreen, handlers));
|
||||
return true;
|
||||
}
|
||||
|
||||
private GuiUsageRecipe(GuiContainer prevgui, ArrayList<IUsageHandler> handlers) {
|
||||
super(prevgui);
|
||||
currenthandlers = handlers;
|
||||
}
|
||||
|
||||
public static void registerUsageHandler(IUsageHandler handler) {
|
||||
for (IUsageHandler handler1 : usagehandlers) {
|
||||
if (handler1.getClass() == handler.getClass())
|
||||
return;
|
||||
}
|
||||
|
||||
usagehandlers.add(handler);
|
||||
}
|
||||
|
||||
public ArrayList<? extends IRecipeHandler> getCurrentRecipeHandlers() {
|
||||
return currenthandlers;
|
||||
}
|
||||
|
||||
public ArrayList<IUsageHandler> currenthandlers;
|
||||
|
||||
public static ArrayList<IUsageHandler> usagehandlers = new ArrayList<>();
|
||||
}
|
||||
@@ -1,90 +0,0 @@
|
||||
package codechicken.nei.recipe;
|
||||
|
||||
import codechicken.nei.ItemPanels;
|
||||
import codechicken.nei.NEIClientConfig;
|
||||
import codechicken.nei.NEIClientUtils;
|
||||
import codechicken.nei.guihook.GuiContainerManager;
|
||||
import codechicken.nei.guihook.IContainerInputHandler;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class RecipeItemInputHandler implements IContainerInputHandler
|
||||
{
|
||||
@Override
|
||||
public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyCode)
|
||||
{
|
||||
ItemStack stackover = GuiContainerManager.getStackMouseOver(gui);
|
||||
if(stackover == null)
|
||||
return false;
|
||||
|
||||
if(keyCode == NEIClientConfig.getKeyBinding("gui.usage") || (keyCode == NEIClientConfig.getKeyBinding("gui.recipe") && NEIClientUtils.shiftKey()))
|
||||
return GuiUsageRecipe.openRecipeGui("item", stackover.copy());
|
||||
|
||||
if(keyCode == NEIClientConfig.getKeyBinding("gui.recipe"))
|
||||
return GuiCraftingRecipe.openRecipeGui("item", stackover.copy());
|
||||
|
||||
if(keyCode == NEIClientConfig.getKeyBinding("gui.bookmark")) {
|
||||
NEIClientConfig.logger.debug("Adding or removing {} from bookmarks", stackover.getDisplayName());
|
||||
ItemPanels.bookmarkPanel.addOrRemoveItem(stackover.copy());
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean mouseClicked(GuiContainer gui, int mousex, int mousey, int button)
|
||||
{
|
||||
ItemStack stackover = GuiContainerManager.getStackMouseOver(gui);
|
||||
|
||||
if(stackover == null)
|
||||
return false;
|
||||
|
||||
if (!(gui instanceof GuiRecipe))
|
||||
return false;
|
||||
|
||||
if(button == 0)
|
||||
return GuiCraftingRecipe.openRecipeGui("item", stackover.copy());
|
||||
|
||||
if(button == 1)
|
||||
return GuiUsageRecipe.openRecipeGui("item", stackover.copy());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onKeyTyped(GuiContainer gui, char keyChar, int keyID)
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMouseClicked(GuiContainer gui, int mousex, int mousey, int button)
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMouseUp(GuiContainer gui, int mousex, int mousey, int button)
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean keyTyped(GuiContainer gui, char keyChar, int keyID)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
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)
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMouseDragged(GuiContainer gui, int mousex, int mousey, int button, long heldTime)
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,929 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.core.CommonUtils;
|
||||
import codechicken.lib.vec.Rectangle4i;
|
||||
import codechicken.nei.util.NBTJson;
|
||||
import codechicken.nei.recipe.StackInfo;
|
||||
import codechicken.nei.recipe.BookmarkRecipeId;
|
||||
import codechicken.nei.ItemPanel.ItemPanelSlot;
|
||||
import codechicken.nei.guihook.GuiContainerManager;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.JsonPrimitive;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonSyntaxException;
|
||||
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import static codechicken.lib.gui.GuiDraw.getMousePosition;
|
||||
import static codechicken.lib.gui.GuiDraw.drawRect;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
public class BookmarkPanel extends PanelWidget
|
||||
{
|
||||
|
||||
protected File bookmarkFile;
|
||||
protected boolean bookmarksIsLoaded = false;
|
||||
public int sortedStackIndex = -1;
|
||||
public int sortedNamespaceIndex = -1;
|
||||
|
||||
|
||||
public Button namespacePrev;
|
||||
public Button namespaceNext;
|
||||
public Label namespaceLabel;
|
||||
|
||||
|
||||
protected ArrayList<BookmarkGrid> namespaces = new ArrayList<>();
|
||||
protected int activeNamespaceIndex = 0;
|
||||
|
||||
|
||||
protected static class BookmarkStackMeta
|
||||
{
|
||||
public int factor;
|
||||
public BookmarkRecipeId recipeId;
|
||||
public boolean ingredient = false;
|
||||
public boolean fluidDisplay = false;
|
||||
|
||||
|
||||
public BookmarkStackMeta(BookmarkRecipeId recipeId, int count, boolean ingredient, boolean fluidDisplay)
|
||||
{
|
||||
this.recipeId = recipeId;
|
||||
this.factor = count;
|
||||
this.ingredient = ingredient;
|
||||
this.fluidDisplay = fluidDisplay;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected static class BookmarkGrid extends ItemsGrid
|
||||
{
|
||||
protected List<BookmarkStackMeta> metadata = new ArrayList<>();
|
||||
|
||||
public int indexOf(ItemStack stackA, BookmarkRecipeId recipeId)
|
||||
{
|
||||
final boolean useNBT = NEIClientConfig.useNBTInBookmarks();
|
||||
|
||||
for (int idx = 0; idx < realItems.size(); idx++) {
|
||||
final BookmarkStackMeta meta = getMetadata(idx);
|
||||
if ((recipeId == null && meta.recipeId == null || recipeId != null && meta.recipeId != null && recipeId.equals(meta.recipeId)) && StackInfo.equalItemAndNBT(stackA, realItems.get(idx), useNBT)) {
|
||||
return idx;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
public BookmarkStackMeta getMetadata(int idx)
|
||||
{
|
||||
return metadata.get(idx);
|
||||
}
|
||||
|
||||
public void addItem(ItemStack stackA, BookmarkStackMeta meta)
|
||||
{
|
||||
realItems.add(stackA);
|
||||
metadata.add(meta);
|
||||
refreshBuffer = true;
|
||||
}
|
||||
|
||||
public void replaceItem(int idx, ItemStack stack)
|
||||
{
|
||||
realItems.set(idx, stack);
|
||||
refreshBuffer = true;
|
||||
}
|
||||
|
||||
public void removeRecipe(int idx, boolean removeFullRecipe)
|
||||
{
|
||||
final BookmarkStackMeta meta = getMetadata(idx);
|
||||
|
||||
if (removeFullRecipe && meta.recipeId != null) {
|
||||
removeRecipe(meta.recipeId);
|
||||
} else {
|
||||
removeItem(idx);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void removeRecipe(BookmarkRecipeId recipeIdA)
|
||||
{
|
||||
BookmarkRecipeId recipeIdB;
|
||||
|
||||
for (int slotIndex = metadata.size() - 1; slotIndex >= 0; slotIndex--) {
|
||||
recipeIdB = getRecipeId(slotIndex);
|
||||
|
||||
if (recipeIdB != null && recipeIdB.equals(recipeIdA)) {
|
||||
removeItem(slotIndex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected boolean removeItem(int idx)
|
||||
{
|
||||
realItems.remove(idx);
|
||||
metadata.remove(idx);
|
||||
refreshBuffer = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
public BookmarkRecipeId getRecipeId(int idx)
|
||||
{
|
||||
return getMetadata(idx).recipeId;
|
||||
}
|
||||
|
||||
public BookmarkRecipeId findRecipeId(ItemStack stackA)
|
||||
{
|
||||
final boolean useNBT = NEIClientConfig.useNBTInBookmarks();
|
||||
|
||||
for (int idx = 0; idx < realItems.size(); idx++) {
|
||||
if (StackInfo.equalItemAndNBT(stackA, getItem(idx), useNBT)) {
|
||||
return getRecipeId(idx);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void moveItem(int src, int dst)
|
||||
{
|
||||
realItems.add(dst, realItems.remove(src));
|
||||
metadata.add(dst, metadata.remove(src));
|
||||
refreshBuffer = true;
|
||||
}
|
||||
|
||||
private boolean isPartOfFocusedRecipe(ItemPanelSlot focused, int myIdx) {
|
||||
return (NEIClientUtils.shiftKey()
|
||||
&& LayoutManager.bookmarkPanel.sortedStackIndex == -1
|
||||
&& focused != null
|
||||
&& getRecipeId(focused.slotIndex) != null
|
||||
&& getRecipeId(myIdx) != null
|
||||
&& getRecipeId(focused.slotIndex).equals(getRecipeId(myIdx)));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void drawSlotOutline(@Nullable ItemPanelSlot focus, int idx, Rectangle4i rect) {
|
||||
if(LayoutManager.bookmarkPanel.sortedNamespaceIndex == LayoutManager.bookmarkPanel.activeNamespaceIndex && LayoutManager.bookmarkPanel.sortedStackIndex == idx) {
|
||||
drawRect(rect.x, rect.y, rect.w, rect.h, 0xee555555);//highlight
|
||||
} else if(focus != null) {
|
||||
BookmarkStackMeta meta = getMetadata(idx);
|
||||
if (isPartOfFocusedRecipe(focus, idx)) {
|
||||
drawRect(rect.x, rect.y, rect.w, rect.h, meta.ingredient? 0x88b3b300: 0x88009933);//highlight recipe
|
||||
} else if(focus.slotIndex == idx) {
|
||||
drawRect(rect.x, rect.y, rect.w, rect.h, 0xee555555);//highlight
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void drawItem(Rectangle4i rect, int idx)
|
||||
{
|
||||
if (LayoutManager.bookmarkPanel.sortedNamespaceIndex != LayoutManager.bookmarkPanel.activeNamespaceIndex || LayoutManager.bookmarkPanel.sortedStackIndex != idx) {
|
||||
final ItemStack stack = getItem(idx);
|
||||
final BookmarkStackMeta meta = getMetadata(idx);
|
||||
|
||||
GuiContainerManager.drawItem(rect.x + 1, rect.y + 1, stack, true, meta.factor < 0 || meta.fluidDisplay? "": String.valueOf(stack.stackSize));
|
||||
|
||||
if (meta.recipeId != null && !meta.ingredient && NEIClientConfig.showRecipeMarker()) {
|
||||
drawRecipeMarker(rect.x, rect.y, GuiContainerManager.getFontRenderer(stack));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void drawRecipeMarker(int offsetX, int offsetY, FontRenderer fontRenderer )
|
||||
{
|
||||
final float scaleFactor = fontRenderer.getUnicodeFlag() ? 0.85f : 0.5f;
|
||||
final float inverseScaleFactor = 1.0f / scaleFactor;
|
||||
|
||||
GuiContainerManager.enable2DRender();
|
||||
GL11.glScaled(scaleFactor, scaleFactor, scaleFactor);
|
||||
|
||||
final int X = (int) ( ( (float) offsetX + 1.0f) * inverseScaleFactor );
|
||||
final int Y = (int) ( ( (float) offsetY + 1.0f) * inverseScaleFactor );
|
||||
fontRenderer.drawStringWithShadow("R", X, Y, 0xA0A0A0);
|
||||
|
||||
GL11.glScaled(inverseScaleFactor, inverseScaleFactor, inverseScaleFactor);
|
||||
GuiContainerManager.enable3DRender();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public BookmarkPanel()
|
||||
{
|
||||
grid = new BookmarkGrid();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init()
|
||||
{
|
||||
super.init();
|
||||
|
||||
namespaceLabel = new Label("1", true);
|
||||
|
||||
namespacePrev = new Button("Prev")
|
||||
{
|
||||
public boolean onButtonPress(boolean rightclick)
|
||||
{
|
||||
|
||||
if (rightclick) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return prevNamespace();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRenderLabel()
|
||||
{
|
||||
return "<";
|
||||
}
|
||||
};
|
||||
|
||||
namespaceNext = new Button("Next")
|
||||
{
|
||||
public boolean onButtonPress(boolean rightclick)
|
||||
{
|
||||
if (rightclick) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return nextNamespace();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRenderLabel()
|
||||
{
|
||||
return ">";
|
||||
}
|
||||
};
|
||||
|
||||
namespaces.add(new BookmarkGrid());
|
||||
grid = namespaces.get(activeNamespaceIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLabelText()
|
||||
{
|
||||
return String.format("(%d/%d) [%d]", getPage(), Math.max(1, getNumPages()), grid.size());
|
||||
}
|
||||
|
||||
|
||||
public void addOrRemoveItem(ItemStack stackA)
|
||||
{
|
||||
addOrRemoveItem(stackA, "", null);
|
||||
}
|
||||
|
||||
public void addOrRemoveItem(ItemStack stackover, String handlerName, List<PositionedStack> ingredients)
|
||||
{
|
||||
loadBookmarksIfNeeded();
|
||||
|
||||
final Point mousePos = getMousePosition();
|
||||
final ItemPanelSlot slot = getSlotMouseOver(mousePos.x, mousePos.y);
|
||||
final boolean addFullRecipe = NEIClientUtils.shiftKey();
|
||||
final BookmarkGrid BGrid = (BookmarkGrid) grid;
|
||||
|
||||
if (slot != null && StackInfo.equalItemAndNBT(slot.item, stackover, true)) {
|
||||
BGrid.removeRecipe(slot.slotIndex, addFullRecipe);
|
||||
} else {
|
||||
final boolean saveStackSize = NEIClientUtils.controlKey();
|
||||
final NBTTagCompound nbTagA = StackInfo.itemStackToNBT(stackover, saveStackSize);
|
||||
final ItemStack normalizedA = StackInfo.loadFromNBT(nbTagA);
|
||||
BookmarkRecipeId recipeId = null;
|
||||
|
||||
if (NEIClientConfig.saveCurrentRecipeInBookmarksEnabled() && handlerName != "" && ingredients != null && !ingredients.isEmpty()) {
|
||||
recipeId = new BookmarkRecipeId(handlerName, ingredients);
|
||||
}
|
||||
|
||||
final int idx = BGrid.indexOf(normalizedA, recipeId);
|
||||
|
||||
if (idx != -1) {
|
||||
BGrid.removeRecipe(idx, addFullRecipe);
|
||||
} else {
|
||||
|
||||
if (addFullRecipe && handlerName != "" && ingredients != null && !ingredients.isEmpty()) {
|
||||
final Map<NBTTagCompound, Integer> unique = new HashMap<>();
|
||||
final ArrayList<NBTTagCompound> sorted = new ArrayList<>();
|
||||
|
||||
BGrid.removeRecipe(recipeId);
|
||||
|
||||
for (PositionedStack stack : ingredients) {
|
||||
final NBTTagCompound nbTag = StackInfo.itemStackToNBT(stack.item, saveStackSize);
|
||||
|
||||
if (unique.get(nbTag) == null) {
|
||||
unique.put(nbTag, 1);
|
||||
sorted.add(nbTag);
|
||||
} else if (saveStackSize) {
|
||||
unique.put(nbTag, unique.get(nbTag) + 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
for (NBTTagCompound nbTag : sorted) {
|
||||
nbTag.setInteger("Count", nbTag.getInteger("Count") * unique.get(nbTag));
|
||||
BGrid.addItem(StackInfo.loadFromNBT(nbTag), new BookmarkStackMeta(recipeId, (saveStackSize ? 1: -1) * nbTag.getInteger("Count"), true, nbTag.hasKey("gtFluidName")));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
BGrid.addItem(normalizedA, new BookmarkStackMeta(recipeId, (saveStackSize ? 1: -1) * nbTagA.getInteger("Count"), false, nbTagA.hasKey("gtFluidName")));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
fixCountOfNamespaces();
|
||||
saveBookmarks();
|
||||
}
|
||||
|
||||
public BookmarkRecipeId getBookmarkRecipeId(ItemStack stackA)
|
||||
{
|
||||
|
||||
BookmarkRecipeId mouseOverRecipeId = getBookmarkMouseOverRecipeId(stackA);
|
||||
if (mouseOverRecipeId != null) return mouseOverRecipeId;
|
||||
|
||||
BookmarkRecipeId recipeId = ((BookmarkGrid) grid).findRecipeId(stackA);
|
||||
|
||||
if (recipeId == null) {
|
||||
|
||||
for (int idx = 0; idx < namespaces.size() && recipeId == null; idx++) {
|
||||
if (idx == activeNamespaceIndex) continue;
|
||||
recipeId = namespaces.get(idx).findRecipeId(stackA);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return recipeId;
|
||||
}
|
||||
|
||||
public BookmarkRecipeId getBookmarkMouseOverRecipeId(ItemStack stackA)
|
||||
{
|
||||
final Point mousePos = getMousePosition();
|
||||
final ItemPanelSlot slot = getSlotMouseOver(mousePos.x, mousePos.y);
|
||||
|
||||
if (slot != null) {
|
||||
if (stackA == null || StackInfo.equalItemAndNBT(slot.item, stackA, true)) {
|
||||
return ((BookmarkGrid) grid).getRecipeId(slot.slotIndex);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public BookmarkRecipeId getBookmarkMouseOverRecipeId()
|
||||
{
|
||||
return getBookmarkMouseOverRecipeId(null);
|
||||
}
|
||||
|
||||
protected String getNamespaceLabelText(boolean shortFormat)
|
||||
{
|
||||
String activePage = String.valueOf(activeNamespaceIndex + 1);
|
||||
|
||||
return shortFormat? activePage: (activePage + "/" + fixCountOfNamespaces());
|
||||
}
|
||||
|
||||
protected int fixCountOfNamespaces()
|
||||
{
|
||||
|
||||
if (namespaces.get(namespaces.size() - 1).size() > 0) {
|
||||
namespaces.add(new BookmarkGrid());
|
||||
} else if (activeNamespaceIndex == namespaces.size() - 2 && grid.size() == 0) {
|
||||
namespaces.remove(namespaces.size() - 1);
|
||||
}
|
||||
|
||||
return namespaces.size();
|
||||
}
|
||||
|
||||
protected boolean removeEmptyNamespaces()
|
||||
{
|
||||
|
||||
if (activeNamespaceIndex != namespaces.size() - 1 && grid.size() == 0) {
|
||||
namespaces.remove(activeNamespaceIndex);
|
||||
grid = namespaces.get(activeNamespaceIndex);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
protected boolean prevNamespace()
|
||||
{
|
||||
if (!bookmarksIsLoaded) {
|
||||
return false;
|
||||
}
|
||||
|
||||
fixCountOfNamespaces();
|
||||
removeEmptyNamespaces();
|
||||
|
||||
if (activeNamespaceIndex == 0) {
|
||||
activeNamespaceIndex = namespaces.size() - 1;
|
||||
} else {
|
||||
activeNamespaceIndex --;
|
||||
}
|
||||
|
||||
grid = namespaces.get(activeNamespaceIndex);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
protected boolean nextNamespace()
|
||||
{
|
||||
if (!bookmarksIsLoaded) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (removeEmptyNamespaces()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (activeNamespaceIndex == fixCountOfNamespaces() - 1) {
|
||||
activeNamespaceIndex = 0;
|
||||
} else {
|
||||
activeNamespaceIndex ++;
|
||||
}
|
||||
|
||||
grid = namespaces.get(activeNamespaceIndex);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void setBookmarkFile(String worldPath)
|
||||
{
|
||||
|
||||
final File dir = new File(CommonUtils.getMinecraftDir(), "saves/NEI/" + worldPath);
|
||||
|
||||
if (!dir.exists()) {
|
||||
dir.mkdirs();
|
||||
}
|
||||
|
||||
bookmarkFile = new File(dir, "bookmarks.ini");
|
||||
|
||||
if (!bookmarkFile.exists()) {
|
||||
final File globalBookmarks = new File(CommonUtils.getMinecraftDir(), "saves/NEI/global/bookmarks.ini");
|
||||
final File configBookmarks = new File(NEIClientConfig.configDir, "bookmarks.ini");
|
||||
final File defaultBookmarks = configBookmarks.exists()? configBookmarks: globalBookmarks;
|
||||
|
||||
if (defaultBookmarks.exists()) {
|
||||
|
||||
try {
|
||||
bookmarkFile.createNewFile();
|
||||
|
||||
InputStream src = new FileInputStream(defaultBookmarks);
|
||||
OutputStream dst = new FileOutputStream(bookmarkFile);
|
||||
|
||||
IOUtils.copy(src, dst);
|
||||
|
||||
src.close();
|
||||
dst.close();
|
||||
|
||||
} catch(IOException e) {}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bookmarksIsLoaded = false;
|
||||
}
|
||||
|
||||
public void saveBookmarks()
|
||||
{
|
||||
|
||||
if (bookmarkFile == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
ArrayList<String> strings = new ArrayList<>();
|
||||
|
||||
for (int grpIdx = 0; grpIdx < namespaces.size() - 1; grpIdx++) {
|
||||
final BookmarkGrid grid = namespaces.get(grpIdx);
|
||||
|
||||
if (grpIdx > 0) {
|
||||
strings.add("");//namespace separator; ignore first namespace
|
||||
}
|
||||
|
||||
for (int idx = 0; idx < grid.size(); idx++) {
|
||||
|
||||
try {
|
||||
final NBTTagCompound nbTag = StackInfo.itemStackToNBT(grid.getItem(idx));
|
||||
|
||||
if (nbTag != null) {
|
||||
JsonObject row = new JsonObject();
|
||||
BookmarkStackMeta meta = grid.getMetadata(idx);
|
||||
|
||||
row.add("item", NBTJson.toJsonObject(nbTag));
|
||||
row.add("factor", new JsonPrimitive(meta.factor));
|
||||
row.add("ingredient", new JsonPrimitive(meta.ingredient));
|
||||
|
||||
if (meta.recipeId != null) {
|
||||
row.add("recipeId", meta.recipeId.toJsonObject());
|
||||
}
|
||||
|
||||
strings.add(NBTJson.toJson(row));
|
||||
}
|
||||
|
||||
} catch (JsonSyntaxException e) {
|
||||
NEIClientConfig.logger.error("Failed to stringify bookmarked ItemStack to json string");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
try (FileOutputStream output = new FileOutputStream(bookmarkFile)) {
|
||||
IOUtils.writeLines(strings, "\n", output, StandardCharsets.UTF_8);
|
||||
} catch (IOException e) {
|
||||
NEIClientConfig.logger.error("Filed to save bookmarks list to file {}", bookmarkFile, e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void loadBookmarksIfNeeded()
|
||||
{
|
||||
|
||||
if (bookmarksIsLoaded) {
|
||||
return;
|
||||
}
|
||||
|
||||
bookmarksIsLoaded = true;
|
||||
|
||||
if (bookmarkFile == null || !bookmarkFile.exists()) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<String> itemStrings;
|
||||
try (FileInputStream reader = new FileInputStream(bookmarkFile)) {
|
||||
NEIClientConfig.logger.info("Loading bookmarks from file {}", bookmarkFile);
|
||||
itemStrings = IOUtils.readLines(reader, StandardCharsets.UTF_8);
|
||||
} catch (IOException e) {
|
||||
NEIClientConfig.logger.error("Failed to load bookmarks from file {}", bookmarkFile, e);
|
||||
return;
|
||||
}
|
||||
|
||||
namespaces.clear();
|
||||
namespaces.add(new BookmarkGrid());
|
||||
activeNamespaceIndex = 0;
|
||||
|
||||
final JsonParser parser = new JsonParser();
|
||||
|
||||
for (String itemStr: itemStrings) {
|
||||
try {
|
||||
|
||||
if (itemStr.isEmpty()) {
|
||||
|
||||
if (namespaces.get(activeNamespaceIndex).size() > 0) {
|
||||
//do not create empty namespaces
|
||||
namespaces.add(new BookmarkGrid());
|
||||
activeNamespaceIndex++;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
JsonObject jsonObject = parser.parse(itemStr).getAsJsonObject();
|
||||
BookmarkRecipeId recipeId = null;
|
||||
NBTTagCompound itemStackNBT;
|
||||
|
||||
if (jsonObject.get("item") != null) {
|
||||
itemStackNBT = (NBTTagCompound) NBTJson.toNbt(jsonObject.get("item"));
|
||||
} else {// old format
|
||||
itemStackNBT = (NBTTagCompound) NBTJson.toNbt(jsonObject);
|
||||
}
|
||||
|
||||
if (jsonObject.get("recipeId") != null && jsonObject.get("recipeId") instanceof JsonObject) {
|
||||
recipeId = new BookmarkRecipeId((JsonObject) jsonObject.get("recipeId"));
|
||||
}
|
||||
|
||||
ItemStack itemStack = StackInfo.loadFromNBT(itemStackNBT);
|
||||
|
||||
|
||||
if (itemStack != null) {
|
||||
namespaces.get(activeNamespaceIndex).addItem(itemStack, new BookmarkStackMeta(
|
||||
recipeId,
|
||||
jsonObject.has("factor")? jsonObject.get("factor").getAsInt(): 0,
|
||||
jsonObject.has("ingredient")? jsonObject.get("ingredient").getAsBoolean(): false,
|
||||
itemStackNBT.hasKey("gtFluidName")
|
||||
));
|
||||
} 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);
|
||||
}
|
||||
}
|
||||
|
||||
if (namespaces.get(activeNamespaceIndex).size() == 0) {
|
||||
activeNamespaceIndex = Math.max(activeNamespaceIndex - 1, 0);
|
||||
}
|
||||
|
||||
grid = namespaces.get(activeNamespaceIndex);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void resize(GuiContainer gui)
|
||||
{
|
||||
loadBookmarksIfNeeded();
|
||||
super.resize(gui);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected int resizeHeader(GuiContainer gui)
|
||||
{
|
||||
final LayoutStyleMinecraft layout = (LayoutStyleMinecraft) LayoutManager.getLayoutStyle();
|
||||
final int rows = (int) Math.ceil((double) layout.buttonCount / layout.numButtons);
|
||||
final int diff = rows * 18 + getMarginTop(gui) - y;
|
||||
|
||||
if (diff > 0) {
|
||||
y += diff;
|
||||
h -= diff;
|
||||
}
|
||||
|
||||
return super.resizeHeader(gui);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int resizeFooter(GuiContainer gui)
|
||||
{
|
||||
final int BUTTON_SIZE = 16;
|
||||
|
||||
final ButtonCycled button = LayoutManager.bookmarksButton;
|
||||
final int leftBorder = y + h > button.y? button.x + button.w + 2: x;
|
||||
final int rightBorder = x + w;
|
||||
final int center = leftBorder + Math.max(0, (rightBorder - leftBorder) / 2);
|
||||
int labelWidth = 2;
|
||||
|
||||
namespacePrev.h = namespaceNext.h = BUTTON_SIZE;
|
||||
namespacePrev.w = namespaceNext.w = BUTTON_SIZE;
|
||||
namespacePrev.y = namespaceNext.y = y + h - BUTTON_SIZE;
|
||||
|
||||
|
||||
if (rightBorder - leftBorder >= 70) {
|
||||
labelWidth = 36;
|
||||
namespaceLabel.text = getNamespaceLabelText(false);
|
||||
} else {
|
||||
labelWidth = 18;
|
||||
namespaceLabel.text = getNamespaceLabelText(true);
|
||||
}
|
||||
|
||||
namespaceLabel.y = namespacePrev.y + 5;
|
||||
namespaceLabel.x = center;
|
||||
|
||||
namespacePrev.x = center - labelWidth / 2 - 2 - namespacePrev.w;
|
||||
namespaceNext.x = center + labelWidth / 2 + 2;
|
||||
|
||||
return BUTTON_SIZE + 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setVisible()
|
||||
{
|
||||
super.setVisible();
|
||||
|
||||
if (grid.getPerPage() > 0) {
|
||||
LayoutManager.addWidget(namespacePrev);
|
||||
LayoutManager.addWidget(namespaceNext);
|
||||
LayoutManager.addWidget(namespaceLabel);
|
||||
}
|
||||
}
|
||||
|
||||
protected String getPositioningSettingName()
|
||||
{
|
||||
return "world.panels.bookmarks";
|
||||
}
|
||||
|
||||
public int getMarginLeft(GuiContainer gui)
|
||||
{
|
||||
return PADDING;
|
||||
}
|
||||
|
||||
public int getMarginTop(GuiContainer gui)
|
||||
{
|
||||
return PADDING;
|
||||
}
|
||||
|
||||
public int getWidth(GuiContainer gui)
|
||||
{
|
||||
return gui.width - (gui.xSize + gui.width) / 2 - PADDING * 2;
|
||||
}
|
||||
|
||||
public int getHeight(GuiContainer gui)
|
||||
{
|
||||
return gui.height - getMarginTop(gui) - PADDING;
|
||||
}
|
||||
|
||||
|
||||
protected ItemStack getDraggedStackWithQuantity(int mouseDownSlot)
|
||||
{
|
||||
final ItemStack stack = grid.getItem(mouseDownSlot);
|
||||
|
||||
if (stack == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final BookmarkStackMeta meta = ((BookmarkGrid) grid).getMetadata(mouseDownSlot);
|
||||
int amount = stack.stackSize;
|
||||
|
||||
if (meta.factor < 0 && !meta.fluidDisplay) {
|
||||
amount = NEIClientConfig.getItemQuantity();
|
||||
|
||||
if (amount == 0) {
|
||||
amount = stack.getMaxStackSize();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return NEIServerUtils.copyStack(stack, amount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseDragged(int mousex, int mousey, int button, long heldTime)
|
||||
{
|
||||
|
||||
if (button == 0 && NEIClientUtils.shiftKey() && mouseDownSlot >= 0) {
|
||||
ItemPanelSlot mouseOverSlot = getSlotMouseOver(mousex, mousey);
|
||||
|
||||
if (sortedStackIndex == -1) {
|
||||
final ItemStack stack = grid.getItem(mouseDownSlot);
|
||||
|
||||
if (stack != null && (mouseOverSlot == null || mouseOverSlot.slotIndex != mouseDownSlot || heldTime > 250)) {
|
||||
sortedNamespaceIndex = activeNamespaceIndex;
|
||||
sortedStackIndex = mouseDownSlot;
|
||||
grid.refreshBuffer = true;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
if (mouseOverSlot == null && sortedNamespaceIndex != activeNamespaceIndex) {
|
||||
mouseOverSlot = getNextSlot(mousex, mousey);
|
||||
}
|
||||
|
||||
if (mouseOverSlot != null) {
|
||||
|
||||
if (sortedNamespaceIndex != activeNamespaceIndex) {
|
||||
BookmarkGrid BGrid = namespaces.get(sortedNamespaceIndex);
|
||||
BookmarkStackMeta meta = BGrid.getMetadata(sortedStackIndex);
|
||||
ItemStack stack = BGrid.getItem(sortedStackIndex);
|
||||
BGrid.removeItem(sortedStackIndex);
|
||||
|
||||
((BookmarkGrid) grid).addItem(stack, meta);
|
||||
|
||||
sortedNamespaceIndex = activeNamespaceIndex;
|
||||
sortedStackIndex = grid.size() - 1;
|
||||
}
|
||||
|
||||
if (mouseOverSlot.slotIndex != sortedStackIndex) {
|
||||
((BookmarkGrid) grid).moveItem(sortedStackIndex, mouseOverSlot.slotIndex);
|
||||
sortedStackIndex = mouseOverSlot.slotIndex;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
super.mouseDragged(mousex, mousey, button, heldTime);
|
||||
}
|
||||
|
||||
private ItemPanelSlot getNextSlot(int mousex, int mousey)
|
||||
{
|
||||
int idx = grid.getPage() * grid.getPerPage() - grid.getPerPage();
|
||||
int gSize = grid.size();
|
||||
|
||||
for (int i = 0; i < grid.getRows() * grid.getColumns() && idx <= gSize; i++) {
|
||||
|
||||
if (!grid.isInvalidSlot(i)) {
|
||||
|
||||
if (idx == gSize && grid.getSlotRect(i).contains(mousex, mousey)) {
|
||||
return new ItemPanelSlot(idx, null);
|
||||
}
|
||||
|
||||
idx++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postDraw(int mousex, int mousey)
|
||||
{
|
||||
|
||||
if (sortedStackIndex != -1) {
|
||||
GuiContainerManager.drawItems.zLevel += 100;
|
||||
GuiContainerManager.drawItem(mousex - 8, mousey - 8, namespaces.get(sortedNamespaceIndex).getItem(sortedStackIndex).copy(), true);
|
||||
GuiContainerManager.drawItems.zLevel -= 100;
|
||||
}
|
||||
|
||||
super.postDraw(mousex, mousey);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void mouseUp(int mousex, int mousey, int button)
|
||||
{
|
||||
if (sortedStackIndex != -1) {
|
||||
draggedStack = null;
|
||||
sortedNamespaceIndex = -1;
|
||||
sortedStackIndex = -1;
|
||||
mouseDownSlot = -1;
|
||||
grid.refreshBuffer = true; /* make sure grid redraws the new item */
|
||||
saveBookmarks();
|
||||
} else {
|
||||
super.mouseUp(mousex, mousey, button);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onMouseWheel(int shift, int mousex, int mousey)
|
||||
{
|
||||
|
||||
if (new Rectangle4i(namespacePrev.x, namespacePrev.y, namespaceNext.x + namespaceNext.w - namespacePrev.x, namespacePrev.h).contains(mousex, mousey)) {
|
||||
|
||||
if (shift > 0) {
|
||||
prevNamespace();
|
||||
} else {
|
||||
nextNamespace();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!contains(mousex, mousey)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (NEIClientUtils.controlKey()) {
|
||||
final ItemPanelSlot slot = getSlotMouseOver(mousex, mousey);
|
||||
|
||||
if (slot != null) {
|
||||
final BookmarkGrid BGrid = (BookmarkGrid)grid;
|
||||
final BookmarkRecipeId recipeId = BGrid.getRecipeId(slot.slotIndex);
|
||||
final boolean addFullRecipe = NEIClientUtils.shiftKey();
|
||||
|
||||
if (addFullRecipe) {
|
||||
BookmarkStackMeta iMeta;
|
||||
|
||||
for (int slotIndex = grid.size() - 1; slotIndex >= 0; slotIndex--) {
|
||||
iMeta = BGrid.getMetadata(slotIndex);
|
||||
|
||||
if (iMeta.recipeId != null && iMeta.recipeId.equals(recipeId) && slotIndex != slot.slotIndex) {
|
||||
shiftStackSize(slotIndex, shift);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
shiftStackSize(slot.slotIndex, shift);
|
||||
|
||||
saveBookmarks();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return super.onMouseWheel(shift, mousex, mousey);
|
||||
}
|
||||
|
||||
protected void shiftStackSize(int slotIndex, int shift)
|
||||
{
|
||||
final BookmarkGrid BGrid = (BookmarkGrid)grid;
|
||||
final NBTTagCompound nbTag = StackInfo.itemStackToNBT(BGrid.getItem(slotIndex), true);
|
||||
final BookmarkStackMeta meta = BGrid.getMetadata(slotIndex);
|
||||
final int factor = Math.abs(meta.factor);
|
||||
|
||||
if (nbTag.getInteger("Count") == factor && meta.factor < 0 && shift > 0) {
|
||||
meta.factor = factor;
|
||||
} else {
|
||||
meta.factor = nbTag.getInteger("Count") == factor && shift < 0? -1 * factor: factor;
|
||||
nbTag.setInteger("Count", Math.max(nbTag.getInteger("Count") + factor * shift, factor));
|
||||
BGrid.replaceItem(slotIndex, StackInfo.loadFromNBT(nbTag));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
+148
@@ -5,8 +5,13 @@ import codechicken.core.GuiModListScroll;
|
||||
import codechicken.lib.packet.PacketCustom;
|
||||
import codechicken.nei.api.API;
|
||||
import codechicken.nei.api.ItemInfo;
|
||||
import codechicken.nei.recipe.GuiRecipeTab;
|
||||
import codechicken.nei.recipe.StackInfo;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import cpw.mods.fml.client.CustomModLoadingErrorDisplayException;
|
||||
import cpw.mods.fml.common.FMLCommonHandler;
|
||||
import cpw.mods.fml.common.Loader;
|
||||
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
|
||||
import cpw.mods.fml.common.gameevent.TickEvent;
|
||||
import cpw.mods.fml.common.gameevent.TickEvent.Phase;
|
||||
@@ -23,13 +28,53 @@ import net.minecraft.entity.item.EntityItem;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.client.event.RenderWorldLastEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import org.apache.commons.csv.CSVFormat;
|
||||
import org.apache.commons.csv.CSVParser;
|
||||
import org.apache.commons.csv.CSVRecord;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class ClientHandler
|
||||
{
|
||||
private static String[] defaultSerialHandlers = {
|
||||
"WayofTime.alchemicalWizardry.client.nei.NEIAlchemyRecipeHandler"
|
||||
};
|
||||
private static String[] defaultHeightHackHandlerRegex = {
|
||||
"buildcraft.compat.nei.*",
|
||||
"cofh.thermalexpansion.plugins.nei.handlers.*",
|
||||
"crazypants.enderio.nei.*",
|
||||
"forestry.factory.recipes.nei.*",
|
||||
"ic2.neiIntegration.core.recipehandler.*",
|
||||
"mariculture.plugins.nei.*",
|
||||
"redgear.brewcraft.plugins.nei.*",
|
||||
"tconstruct.plugins.nei.*",
|
||||
"WayofTime.alchemicalWizardry.client.nei.*",
|
||||
};
|
||||
private static String[] defaultHandlerOrdering = {
|
||||
"# Each line in this file should either be a comment (starts with '#') or an ordering.",
|
||||
"# Ordering lines are <handler ID>,<ordering number>.",
|
||||
"# Handlers will be sorted in order of number ascending, so smaller numbers first.",
|
||||
"# Any handlers that are missing from this file will be assigned to 0.",
|
||||
"# Negative numbers are fine.",
|
||||
"# If you delete this file, it will be regenerated with all registered handler IDs.",
|
||||
};
|
||||
private static ClientHandler instance;
|
||||
|
||||
private ArrayList<EntityItem> SMPmagneticItems = new ArrayList<>();
|
||||
@@ -114,7 +159,52 @@ public class ClientHandler
|
||||
}
|
||||
|
||||
public static void preInit() {
|
||||
loadSerialHandlers();
|
||||
loadHeightHackHandlers();
|
||||
ItemInfo.preInit();
|
||||
StackInfo.loadGuidFilters();
|
||||
}
|
||||
|
||||
public static void loadSerialHandlers() {
|
||||
File file = NEIClientConfig.serialHandlersFile;
|
||||
if(!file.exists()) {
|
||||
try(FileWriter writer = new FileWriter(file)) {
|
||||
NEIClientConfig.logger.info("Creating default serial handlers list {}", file);
|
||||
Collection<String> toSave = Loader.isModLoaded("dreamcraft") ? Collections.singletonList("") : Arrays.asList(defaultSerialHandlers);
|
||||
IOUtils.writeLines(toSave, "\n", writer);
|
||||
} catch (IOException e) {
|
||||
NEIClientConfig.logger.error("Failed to save default serial handlers list to file {}", file, e);
|
||||
}
|
||||
}
|
||||
try (FileReader reader = new FileReader(file)) {
|
||||
NEIClientConfig.logger.info("Loading serial handlers from file {}", file);
|
||||
NEIClientConfig.serialHandlers = new HashSet<>(IOUtils.readLines(reader));
|
||||
} catch (IOException e) {
|
||||
NEIClientConfig.logger.error("Failed to load serial handlers from file {}", file, e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void loadHeightHackHandlers() {
|
||||
File file = NEIClientConfig.heightHackHandlersFile;
|
||||
if (!file.exists()) {
|
||||
try (FileWriter writer = new FileWriter(file)) {
|
||||
NEIClientConfig.logger.info("Creating default height hack handlers list {}", file);
|
||||
Collection<String> toSave = Arrays.asList(defaultHeightHackHandlerRegex);
|
||||
IOUtils.writeLines(toSave, "\n", writer);
|
||||
} catch (IOException e) {
|
||||
NEIClientConfig.logger.error("Failed to save default height hack handlers list to file {}", file, e);
|
||||
}
|
||||
}
|
||||
|
||||
try (FileReader reader = new FileReader(file)) {
|
||||
NEIClientConfig.logger.info("Loading height hack handlers from file {}", file);
|
||||
NEIClientConfig.heightHackHandlerRegex =
|
||||
IOUtils.readLines(reader).stream()
|
||||
.map(Pattern::compile)
|
||||
.collect(Collectors.toCollection(HashSet::new));
|
||||
} catch (IOException e) {
|
||||
NEIClientConfig.logger.error("Failed to load height hack handlers from file {}", file, e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void load() {
|
||||
@@ -130,6 +220,58 @@ public class ClientHandler
|
||||
WorldOverlayRenderer.load();
|
||||
}
|
||||
|
||||
public static void postInit() {
|
||||
loadHandlerOrdering();
|
||||
}
|
||||
|
||||
public static void loadHandlerOrdering() {
|
||||
File file = NEIClientConfig.handlerOrderingFile;
|
||||
if (!file.exists()) {
|
||||
try (FileWriter writer = new FileWriter(file)) {
|
||||
NEIClientConfig.logger.info("Creating default handler ordering CSV {}", file);
|
||||
|
||||
List<String> toWrite = Lists.newArrayList(defaultHandlerOrdering);
|
||||
GuiRecipeTab.handlerMap.keySet().stream()
|
||||
.sorted()
|
||||
.forEach(handlerId -> toWrite.add(String.format("%s,0", handlerId)));
|
||||
|
||||
IOUtils.writeLines(toWrite, "\n", writer);
|
||||
} catch (IOException e) {
|
||||
NEIClientConfig.logger.error("Failed to save default handler ordering to file {}", file, e);
|
||||
}
|
||||
}
|
||||
|
||||
URL url;
|
||||
try {
|
||||
url = file.toURI().toURL();
|
||||
} catch (MalformedURLException e) {
|
||||
NEIClientConfig.logger.info("Invalid URL for handler ordering CSV.");
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
try (BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()))) {
|
||||
NEIClientConfig.logger.info("Loading handler ordering from file {}", file);
|
||||
CSVParser csvParser = CSVFormat.EXCEL.withCommentMarker('#').parse(reader);
|
||||
for (CSVRecord record : csvParser) {
|
||||
final String handlerId = record.get(0);
|
||||
|
||||
int ordering;
|
||||
try {
|
||||
ordering = Integer.parseInt(record.get(1));
|
||||
} catch (NumberFormatException e) {
|
||||
NEIClientConfig.logger.error("Error parsing CSV record {}: {}", record, e);
|
||||
continue;
|
||||
}
|
||||
|
||||
NEIClientConfig.handlerOrdering.put(handlerId, ordering);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
NEIClientConfig.logger.info("Error parsing CSV");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void tickEvent(TickEvent.ClientTickEvent event) {
|
||||
if(event.phase == Phase.END)
|
||||
@@ -157,6 +299,10 @@ public class ClientHandler
|
||||
lastworld = null;
|
||||
else if (gui instanceof GuiSelectWorld)
|
||||
NEIClientConfig.reloadSaves();
|
||||
else if(gui == null) {
|
||||
/* prevent WorldClient reference being held in the Gui */
|
||||
NEIController.manager = null;
|
||||
}
|
||||
}
|
||||
lastGui = gui;
|
||||
}
|
||||
@@ -186,6 +332,8 @@ public class ClientHandler
|
||||
|
||||
if (!Minecraft.getMinecraft().isSingleplayer())//wait for server to initiate in singleplayer
|
||||
NEIClientConfig.loadWorld("remote/" + ClientUtils.getServerIP().replace(':', '~'));
|
||||
|
||||
ItemMobSpawner.clearEntityReferences(world);
|
||||
}
|
||||
|
||||
lastworld = world;
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+18
-2
@@ -1,10 +1,12 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.lib.render.CCRenderState;
|
||||
import codechicken.lib.vec.Rectangle4i;
|
||||
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.inventory.Slot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
@@ -50,7 +52,21 @@ public class GuiExtendedCreativeInv extends GuiContainer implements INEIGuiHandl
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h) {
|
||||
return false;
|
||||
public boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h)
|
||||
{
|
||||
return (new Rectangle4i(guiLeft - 15, guiTop + 18, 18, 18 * 4 + 4)).intersects(new Rectangle4i(x, y, w, h));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handleMouseClick(Slot p_146984_1_, int p_146984_2_, int p_146984_3_, int p_146984_4_)
|
||||
{
|
||||
|
||||
//Hack for armor slots, because they are outside the container
|
||||
if (p_146984_1_ != null && p_146984_4_ == 4 && p_146984_1_.xDisplayPosition < 0) {
|
||||
p_146984_4_ = 0;
|
||||
}
|
||||
|
||||
super.handleMouseClick(p_146984_1_, p_146984_2_, p_146984_3_, p_146984_4_);
|
||||
}
|
||||
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -185,13 +185,13 @@ public class ItemList
|
||||
@SuppressWarnings("unchecked")
|
||||
public void execute() {
|
||||
// System.out.println("Executing NEI Item Loading");
|
||||
ThreadOperationTimer timer = getTimer(500);
|
||||
ThreadOperationTimer timer = getTimer(NEIClientConfig.getItemLoadingTimeout());
|
||||
|
||||
LinkedList<ItemStack> items = new LinkedList<>();
|
||||
LinkedList<ItemStack> permutations = new LinkedList<>();
|
||||
ListMultimap<Item, ItemStack> itemMap = ArrayListMultimap.create();
|
||||
|
||||
timer.setLimit(500);
|
||||
timer.setLimit(NEIClientConfig.getItemLoadingTimeout());
|
||||
for (Item item : (Iterable<Item>) Item.itemRegistry) {
|
||||
if (interrupted()) return;
|
||||
|
||||
@@ -252,6 +252,7 @@ public class ItemList
|
||||
|
||||
try {
|
||||
filtered = ItemList.forkJoinPool.submit(() -> items.parallelStream()
|
||||
.filter(PresetsWidget::matches)
|
||||
.filter(filter::matches)
|
||||
.collect(Collectors.toCollection(ArrayList::new))).get();
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
+4
@@ -96,6 +96,10 @@ public class ItemMobSpawner extends ItemBlock
|
||||
return e;
|
||||
}
|
||||
|
||||
public static void clearEntityReferences(World newWorld) {
|
||||
entityHashMap.values().removeIf(e -> e.worldObj != newWorld);
|
||||
}
|
||||
|
||||
private void setDefaultTag(ItemStack itemstack) {
|
||||
if (!IDtoNameMap.containsKey(itemstack.getItemDamage()))
|
||||
itemstack.setItemDamage(idPig);
|
||||
@@ -0,0 +1,229 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.lib.vec.Rectangle4i;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import static codechicken.lib.gui.GuiDraw.drawRect;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class ItemPanel extends PanelWidget
|
||||
{
|
||||
|
||||
/**
|
||||
* Backwards compat :-/
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
@Deprecated
|
||||
private int itemsPerPage = 0;
|
||||
|
||||
@Deprecated
|
||||
public static ArrayList<ItemStack> items = new ArrayList<>();
|
||||
|
||||
@Deprecated
|
||||
public ArrayList<ItemStack> realItems = new ArrayList<>();
|
||||
|
||||
public ItemStack getStackMouseOver(int mousex, int mousey) {
|
||||
// *looks angrily at AppleCore*
|
||||
return super.getStackMouseOver(mousex, mousey);
|
||||
};
|
||||
|
||||
public Button more;
|
||||
public Button less;
|
||||
public ItemQuantityField quantity;
|
||||
|
||||
public static class ItemPanelSlot
|
||||
{
|
||||
public ItemStack item;
|
||||
public int slotIndex;
|
||||
|
||||
public ItemPanelSlot(int idx, ItemStack stack)
|
||||
{
|
||||
slotIndex = idx;
|
||||
item = stack;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public ItemPanelSlot(int idx)
|
||||
{
|
||||
this(idx, ItemPanels.itemPanel.getGrid().getItem(idx));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected static class ItemPanelGrid extends ItemsGrid
|
||||
{
|
||||
public ArrayList<ItemStack> newItems;
|
||||
|
||||
public void setItems(ArrayList<ItemStack> items)
|
||||
{
|
||||
newItems = items;
|
||||
}
|
||||
|
||||
public void refresh(GuiContainer gui)
|
||||
{
|
||||
|
||||
if (newItems != null) {
|
||||
realItems = newItems;
|
||||
newItems = null;
|
||||
refreshBuffer = true;
|
||||
}
|
||||
|
||||
super.refresh(gui);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void drawSlotOutline(@Nullable ItemPanelSlot focused, int slotIdx, Rectangle4i rect) {
|
||||
if (PresetsWidget.inEditMode()) {
|
||||
if(!PresetsWidget.isHidden(getItem(slotIdx)))
|
||||
drawRect(rect.x, rect.y, rect.w, rect.h, 0xee555555);
|
||||
} else {
|
||||
super.drawSlotOutline(focused, slotIdx, rect);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public ItemPanel()
|
||||
{
|
||||
grid = new ItemPanelGrid();
|
||||
}
|
||||
|
||||
public static void updateItemList(ArrayList<ItemStack> newItems)
|
||||
{
|
||||
((ItemPanelGrid) ItemPanels.itemPanel.getGrid()).setItems(newItems);
|
||||
ItemPanels.itemPanel.realItems = newItems;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init()
|
||||
{
|
||||
super.init();
|
||||
|
||||
more = new Button("+")
|
||||
{
|
||||
@Override
|
||||
public boolean onButtonPress(boolean rightclick) {
|
||||
if (rightclick)
|
||||
return false;
|
||||
|
||||
int modifier = NEIClientUtils.controlKey() ? 64 : NEIClientUtils.shiftKey() ? 10 : 1;
|
||||
int quantity = NEIClientConfig.getItemQuantity() + modifier;
|
||||
|
||||
if (quantity < 0) {
|
||||
quantity = 0;
|
||||
}
|
||||
|
||||
ItemPanels.itemPanel.quantity.setText(Integer.toString(quantity));
|
||||
return true;
|
||||
}
|
||||
};
|
||||
less = new Button("-")
|
||||
{
|
||||
@Override
|
||||
public boolean onButtonPress(boolean rightclick) {
|
||||
if (rightclick)
|
||||
return false;
|
||||
|
||||
int modifier = NEIClientUtils.controlKey() ? -64 : NEIClientUtils.shiftKey() ? -10 : -1;
|
||||
int quantity = NEIClientConfig.getItemQuantity() + modifier;
|
||||
|
||||
if (quantity < 0) {
|
||||
quantity = 0;
|
||||
}
|
||||
|
||||
ItemPanels.itemPanel.quantity.setText(Integer.toString(quantity));
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
quantity = new ItemQuantityField("quantity");
|
||||
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void scroll(int i)
|
||||
{
|
||||
grid.shiftPage(i);
|
||||
}
|
||||
|
||||
public String getLabelText()
|
||||
{
|
||||
return String.format("(%d/%d)", getPage(), Math.max(1, getNumPages()));
|
||||
}
|
||||
|
||||
protected String getPositioningSettingName()
|
||||
{
|
||||
return "world.panels.items";
|
||||
}
|
||||
|
||||
public int getMarginLeft(GuiContainer gui)
|
||||
{
|
||||
return (gui.width + gui.xSize) / 2 + PADDING;
|
||||
}
|
||||
|
||||
public int getMarginTop(GuiContainer gui)
|
||||
{
|
||||
return PADDING;
|
||||
}
|
||||
|
||||
public int getWidth(GuiContainer gui)
|
||||
{
|
||||
return gui.width - (gui.xSize + gui.width) / 2 - PADDING * 2;
|
||||
}
|
||||
|
||||
public int getHeight(GuiContainer gui)
|
||||
{
|
||||
return gui.height - getMarginTop(gui) - PADDING;
|
||||
}
|
||||
|
||||
protected int resizeFooter(GuiContainer gui)
|
||||
{
|
||||
final int BUTTON_SIZE = 16;
|
||||
|
||||
more.w = less.w = BUTTON_SIZE;
|
||||
more.h = less.h = quantity.h = BUTTON_SIZE;
|
||||
|
||||
less.x = x;
|
||||
more.x = x + w - BUTTON_SIZE;
|
||||
more.y = less.y = quantity.y = y + h - BUTTON_SIZE;
|
||||
|
||||
quantity.x = x + BUTTON_SIZE + 2;
|
||||
quantity.w = more.x - quantity.x - 2;
|
||||
|
||||
return BUTTON_SIZE + 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setVisible()
|
||||
{
|
||||
super.setVisible();
|
||||
|
||||
if (grid.getPerPage() > 0) {
|
||||
LayoutManager.addWidget(more);
|
||||
LayoutManager.addWidget(less);
|
||||
LayoutManager.addWidget(quantity);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected ItemStack getDraggedStackWithQuantity(int mouseDownSlot)
|
||||
{
|
||||
ItemStack stack = grid.getItem(mouseDownSlot);
|
||||
|
||||
if (stack != null) {
|
||||
int amount = NEIClientConfig.getItemQuantity();
|
||||
|
||||
if (amount == 0) {
|
||||
amount = stack.getMaxStackSize();
|
||||
}
|
||||
|
||||
return NEIServerUtils.copyStack(stack, amount);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
File renamed without changes.
+9
-15
@@ -7,30 +7,25 @@ public class ItemQuantityField extends TextField
|
||||
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);
|
||||
return Math.max(0, Integer.parseInt(s));
|
||||
} catch (NumberFormatException nfe) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void gainFocus() {
|
||||
if (text().equals("0")) {
|
||||
setText("");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loseFocus() {
|
||||
setText(Integer.toString(NEIClientConfig.getItemQuantity()));
|
||||
@@ -38,7 +33,6 @@ public class ItemQuantityField extends TextField
|
||||
|
||||
@Override
|
||||
public void onTextChange(String oldText) {
|
||||
if (intValue(oldText) != intValue())//hacky recursion stopper
|
||||
NEIClientUtils.setItemQuantity(intValue());
|
||||
NEIClientUtils.setItemQuantity(intValue());
|
||||
}
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,332 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.lib.vec.Rectangle4i;
|
||||
import codechicken.nei.api.GuiInfo;
|
||||
import codechicken.nei.guihook.GuiContainerManager;
|
||||
import codechicken.nei.recipe.StackInfo;
|
||||
import codechicken.nei.ItemPanel.ItemPanelSlot;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.ScaledResolution;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.client.renderer.OpenGlHelper;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.client.shader.Framebuffer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static codechicken.lib.gui.GuiDraw.drawRect;
|
||||
|
||||
public class ItemsGrid
|
||||
{
|
||||
public static final int SLOT_SIZE = 18;
|
||||
|
||||
protected int width;
|
||||
protected int height;
|
||||
|
||||
protected int marginLeft;
|
||||
protected int marginTop;
|
||||
|
||||
protected int paddingLeft;
|
||||
|
||||
protected ArrayList<ItemStack> realItems = new ArrayList<>();
|
||||
|
||||
protected int page;
|
||||
protected int perPage;
|
||||
|
||||
protected int firstIndex;
|
||||
protected int numPages;
|
||||
|
||||
protected int rows;
|
||||
protected int columns;
|
||||
|
||||
protected boolean[] validSlotMap;
|
||||
protected boolean[] invalidSlotMap;
|
||||
|
||||
@Nullable
|
||||
private Framebuffer framebuffer = null;
|
||||
protected boolean refreshBuffer = true;
|
||||
|
||||
public ArrayList<ItemStack> getItems()
|
||||
{
|
||||
return realItems;
|
||||
}
|
||||
|
||||
public ItemStack getItem(int idx)
|
||||
{
|
||||
return realItems.get(idx);
|
||||
}
|
||||
|
||||
public int size()
|
||||
{
|
||||
return realItems.size();
|
||||
}
|
||||
|
||||
public int indexOf(ItemStack stackA, boolean useNBT)
|
||||
{
|
||||
|
||||
for (int idx = 0; idx < realItems.size(); idx++) {
|
||||
if (StackInfo.equalItemAndNBT(stackA, realItems.get(idx), useNBT)) {
|
||||
return idx;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
public int getPage()
|
||||
{
|
||||
return page + 1;
|
||||
}
|
||||
|
||||
public int getPerPage()
|
||||
{
|
||||
return perPage;
|
||||
}
|
||||
|
||||
public int getNumPages()
|
||||
{
|
||||
return numPages;
|
||||
}
|
||||
|
||||
public int getRows()
|
||||
{
|
||||
return rows;
|
||||
}
|
||||
|
||||
public int getColumns()
|
||||
{
|
||||
return columns;
|
||||
}
|
||||
|
||||
public void setGridSize(int mleft, int mtop, int w, int h)
|
||||
{
|
||||
if(width != w || height != h || mleft != marginLeft || mtop != marginTop)
|
||||
refreshBuffer = true;
|
||||
|
||||
marginLeft = mleft;
|
||||
marginTop = mtop;
|
||||
|
||||
width = Math.max(0, w);
|
||||
height = Math.max(0, h);
|
||||
|
||||
columns = width / SLOT_SIZE;
|
||||
rows = height / SLOT_SIZE;
|
||||
|
||||
paddingLeft = (width % SLOT_SIZE) / 2;
|
||||
}
|
||||
|
||||
public void shiftPage(int shift)
|
||||
{
|
||||
if (perPage == 0) {
|
||||
numPages = 0;
|
||||
page = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
numPages = (int) Math.ceil((float) realItems.size() / (float) perPage);
|
||||
|
||||
page += shift;
|
||||
|
||||
if (page >= numPages) {
|
||||
page = page - numPages;
|
||||
}
|
||||
|
||||
if (page < 0) {
|
||||
page = numPages + page;
|
||||
}
|
||||
|
||||
page = Math.max(0, Math.min(page, numPages - 1));
|
||||
if(shift != 0)
|
||||
refreshBuffer = true;
|
||||
}
|
||||
|
||||
public void refresh(GuiContainer gui)
|
||||
{
|
||||
updateGuiOverlapSlots(gui);
|
||||
shiftPage(0);
|
||||
}
|
||||
|
||||
private void updateGuiOverlapSlots(GuiContainer gui)
|
||||
{
|
||||
boolean[] oldSlotMap = invalidSlotMap;
|
||||
invalidSlotMap = new boolean[rows * columns];
|
||||
perPage = columns * rows;
|
||||
|
||||
checkGuiOverlap(gui, 0, columns - 2, 1);
|
||||
checkGuiOverlap(gui, columns - 1, 1, -1);
|
||||
if(NEIClientConfig.shouldCacheItemRendering() && !Arrays.equals(oldSlotMap, invalidSlotMap)) {
|
||||
refreshBuffer = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void checkGuiOverlap(GuiContainer gui, int start, int end, int dir)
|
||||
{
|
||||
boolean validColumn = false;
|
||||
|
||||
for (int c = start; c != end && !validColumn; c += dir) {
|
||||
validColumn = true;
|
||||
|
||||
for (int r = 0; r < rows; r++) {
|
||||
final int idx = columns * r + c;
|
||||
if (GuiInfo.hideItemPanelSlot(gui, getSlotRect(r, c)) && idx >= 0 && idx < invalidSlotMap.length && !invalidSlotMap[idx]) {
|
||||
invalidSlotMap[idx] = true;
|
||||
validColumn = false;
|
||||
perPage--;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public Rectangle4i getSlotRect(int i)
|
||||
{
|
||||
return getSlotRect(i / columns, i % columns);
|
||||
}
|
||||
|
||||
public Rectangle4i getSlotRect(int row, int column)
|
||||
{
|
||||
return new Rectangle4i(marginLeft + paddingLeft + column * SLOT_SIZE, marginTop + row * SLOT_SIZE, SLOT_SIZE, SLOT_SIZE);
|
||||
}
|
||||
|
||||
public boolean isInvalidSlot(int idx)
|
||||
{
|
||||
return invalidSlotMap[idx];
|
||||
}
|
||||
|
||||
private void drawSlotOutlines(int mousex, int mousey)
|
||||
{
|
||||
ItemPanelSlot focused = getSlotMouseOver(mousex, mousey);
|
||||
int idx = page * perPage;
|
||||
for (int i = 0; i < rows * columns && idx < size(); i++) {
|
||||
if(!invalidSlotMap[i]) {
|
||||
drawSlotOutline(focused, idx, getSlotRect(i));
|
||||
idx++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void drawSlotOutline(@Nullable ItemPanelSlot focused, int slotIdx, Rectangle4i rect) {
|
||||
if(focused != null && focused.slotIndex == slotIdx)
|
||||
drawRect(rect.x, rect.y, rect.w, rect.h, 0xee555555);//highlight
|
||||
}
|
||||
|
||||
private void blitExistingBuffer() {
|
||||
Minecraft minecraft = Minecraft.getMinecraft();
|
||||
GL11.glEnable(GL11.GL_BLEND);
|
||||
OpenGlHelper.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
framebuffer.bindFramebufferTexture();
|
||||
GL11.glEnable(GL11.GL_TEXTURE_2D);
|
||||
ScaledResolution res = new ScaledResolution(minecraft, minecraft.displayWidth, minecraft.displayHeight);
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
tessellator.startDrawingQuads();
|
||||
tessellator.addVertexWithUV(0, res.getScaledHeight_double(), 0.0, 0, 0);
|
||||
tessellator.addVertexWithUV(res.getScaledWidth_double(), res.getScaledHeight_double(), 0.0, 1, 0);
|
||||
tessellator.addVertexWithUV(res.getScaledWidth_double(), 0, 0.0, 1, 1);
|
||||
tessellator.addVertexWithUV(0, 0, 0, 0, 1);
|
||||
tessellator.draw();
|
||||
OpenGlHelper.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
|
||||
}
|
||||
|
||||
public void draw(int mousex, int mousey)
|
||||
{
|
||||
if (getPerPage() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
boolean shouldCache = NEIClientConfig.shouldCacheItemRendering() && !PresetsWidget.inEditMode();
|
||||
if(shouldCache) {
|
||||
Minecraft minecraft = Minecraft.getMinecraft();
|
||||
if (framebuffer == null) {
|
||||
framebuffer = new Framebuffer(minecraft.displayWidth, minecraft.displayHeight, true);
|
||||
framebuffer.framebufferColor[0] = 0.0F;
|
||||
framebuffer.framebufferColor[1] = 0.0F;
|
||||
framebuffer.framebufferColor[2] = 0.0F;
|
||||
}
|
||||
drawSlotOutlines(mousex, mousey);
|
||||
if (refreshBuffer) {
|
||||
framebuffer.createBindFramebuffer(minecraft.displayWidth, minecraft.displayHeight);
|
||||
framebuffer.framebufferClear();
|
||||
framebuffer.bindFramebuffer(false);
|
||||
/* Set up some rendering state needed for items to work correctly */
|
||||
GL11.glDisable(GL11.GL_BLEND);
|
||||
GL11.glDepthMask(true);
|
||||
OpenGlHelper.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
} else {
|
||||
blitExistingBuffer();
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
drawSlotOutlines(mousex, mousey);
|
||||
}
|
||||
|
||||
GuiContainerManager.enableMatrixStackLogging();
|
||||
|
||||
int idx = page * perPage;
|
||||
for (int i = 0; i < rows * columns && idx < size(); i++) {
|
||||
if (!invalidSlotMap[i]) {
|
||||
drawItem(getSlotRect(i), idx);
|
||||
idx ++;
|
||||
}
|
||||
}
|
||||
|
||||
GuiContainerManager.disableMatrixStackLogging();
|
||||
|
||||
if (refreshBuffer && shouldCache) {
|
||||
refreshBuffer = false;
|
||||
Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(false);
|
||||
blitExistingBuffer();
|
||||
}
|
||||
}
|
||||
|
||||
protected void drawItem(Rectangle4i rect, int idx)
|
||||
{
|
||||
GuiContainerManager.drawItem(rect.x + 1, rect.y + 1, getItem(idx));
|
||||
}
|
||||
|
||||
public ItemPanelSlot getSlotMouseOver(int mousex, int mousey)
|
||||
{
|
||||
if (!contains(mousex, mousey)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final int overRow = (int) ((mousey - marginTop) / SLOT_SIZE);
|
||||
final int overColumn = (int) ((mousex - marginLeft - paddingLeft) / SLOT_SIZE);
|
||||
final int slt = columns * overRow + overColumn;
|
||||
int idx = page * perPage + slt;
|
||||
|
||||
if (overRow >= rows || overColumn >= columns) {
|
||||
return null;
|
||||
}
|
||||
|
||||
for (int i = 0; i < slt; i++) {
|
||||
if (invalidSlotMap[i]) {
|
||||
idx--;
|
||||
}
|
||||
}
|
||||
|
||||
return idx < size()? new ItemPanelSlot(idx, realItems.get(idx)): null;
|
||||
}
|
||||
|
||||
public boolean contains(int px, int py)
|
||||
{
|
||||
|
||||
if (!(new Rectangle4i(marginLeft + paddingLeft, marginTop, columns * SLOT_SIZE, height)).contains(px, py)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final int r = (int) ((py - marginTop) / SLOT_SIZE);
|
||||
final int c = (int) ((px - marginLeft - paddingLeft) / SLOT_SIZE);
|
||||
final int slt = columns * r + c;
|
||||
|
||||
return r >= rows || c >= columns || !invalidSlotMap[slt];
|
||||
}
|
||||
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
+75
-75
@@ -4,7 +4,6 @@ import codechicken.lib.gui.GuiDraw;
|
||||
import codechicken.nei.KeyManager.IKeyStateTracker;
|
||||
import codechicken.nei.api.API;
|
||||
import codechicken.nei.api.GuiInfo;
|
||||
import codechicken.nei.api.INEIGuiHandler;
|
||||
import codechicken.nei.api.IRecipeOverlayRenderer;
|
||||
import codechicken.nei.api.ItemInfo;
|
||||
import codechicken.nei.api.LayoutStyle;
|
||||
@@ -16,7 +15,7 @@ import codechicken.nei.guihook.IContainerInputHandler;
|
||||
import codechicken.nei.guihook.IContainerObjectHandler;
|
||||
import codechicken.nei.guihook.IContainerTooltipHandler;
|
||||
import codechicken.nei.recipe.GuiRecipeTab;
|
||||
import cpw.mods.fml.common.Loader;
|
||||
import codechicken.nei.recipe.RecipeCatalysts;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
@@ -38,7 +37,6 @@ import static codechicken.lib.gui.GuiDraw.drawRect;
|
||||
import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect;
|
||||
import static codechicken.nei.NEIClientConfig.canPerformAction;
|
||||
import static codechicken.nei.NEIClientConfig.disabledActions;
|
||||
import static codechicken.nei.NEIClientConfig.getItemQuantity;
|
||||
import static codechicken.nei.NEIClientConfig.getKeyBinding;
|
||||
import static codechicken.nei.NEIClientConfig.getOptionList;
|
||||
import static codechicken.nei.NEIClientConfig.getSearchExpression;
|
||||
@@ -50,7 +48,6 @@ import static codechicken.nei.NEIClientConfig.isHidden;
|
||||
import static codechicken.nei.NEIClientConfig.showIDs;
|
||||
import static codechicken.nei.NEIClientConfig.toggleBooleanSetting;
|
||||
import static codechicken.nei.NEIClientConfig.world;
|
||||
import static codechicken.nei.NEIClientUtils.controlKey;
|
||||
import static codechicken.nei.NEIClientUtils.cycleGamemode;
|
||||
import static codechicken.nei.NEIClientUtils.decreaseSlotStack;
|
||||
import static codechicken.nei.NEIClientUtils.deleteEverything;
|
||||
@@ -63,7 +60,6 @@ import static codechicken.nei.NEIClientUtils.getNextGamemode;
|
||||
import static codechicken.nei.NEIClientUtils.healPlayer;
|
||||
import static codechicken.nei.NEIClientUtils.isValidGamemode;
|
||||
import static codechicken.nei.NEIClientUtils.setHourForward;
|
||||
import static codechicken.nei.NEIClientUtils.setItemQuantity;
|
||||
import static codechicken.nei.NEIClientUtils.shiftKey;
|
||||
import static codechicken.nei.NEIClientUtils.toggleMagnetMode;
|
||||
import static codechicken.nei.NEIClientUtils.toggleRaining;
|
||||
@@ -73,26 +69,32 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
{
|
||||
private static LayoutManager instance;
|
||||
|
||||
/** Note: this variable isn't actually used by this mod, but NEI add-ons might need it. */
|
||||
private static Widget inputFocused;
|
||||
|
||||
/**
|
||||
* Sorted bottom first
|
||||
*/
|
||||
private static TreeSet<Widget> drawWidgets;
|
||||
private static TreeSet<Widget> drawWidgets = new TreeSet<>(new WidgetZOrder(false));
|
||||
/**
|
||||
* Sorted top first
|
||||
*/
|
||||
private static TreeSet<Widget> controlWidgets;
|
||||
private static TreeSet<Widget> controlWidgets = new TreeSet<>(new WidgetZOrder(true));
|
||||
|
||||
public static ItemPanel itemPanel;
|
||||
public static BookmarkPanel bookmarkPanel;
|
||||
public static SubsetWidget dropDown;
|
||||
public static PresetsWidget presetsPanel;
|
||||
public static TextField searchField;
|
||||
|
||||
public static ButtonCycled options;
|
||||
public static ButtonCycled bookmarksButton;
|
||||
|
||||
@Deprecated
|
||||
public static Button more;
|
||||
@Deprecated
|
||||
public static Button less;
|
||||
@Deprecated
|
||||
public static ItemQuantityField quantity;
|
||||
|
||||
public static Button delete;
|
||||
@@ -108,6 +110,11 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
|
||||
public static boolean itemsLoaded = false;
|
||||
|
||||
/**
|
||||
* Not present, Present
|
||||
*/
|
||||
public static Image[] itemPresenceOverlays = new Image[2];
|
||||
|
||||
public static void load() {
|
||||
API.addLayoutStyle(0, new LayoutStyleMinecraft());
|
||||
|
||||
@@ -136,9 +143,12 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static int getSideWidth(GuiContainer gui) {
|
||||
return gui.width - 3;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static int getLeftSize(GuiContainer gui) {
|
||||
return getSideWidth(gui);
|
||||
}
|
||||
@@ -172,7 +182,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
@Override
|
||||
public boolean objectUnderMouse(GuiContainer gui, int mousex, int mousey) {
|
||||
if (!isHidden() && isEnabled())
|
||||
for (Widget widget : controlWidgets)
|
||||
for (Widget widget : drawWidgets)
|
||||
if (widget.contains(mousex, mousey))
|
||||
return true;
|
||||
|
||||
@@ -233,7 +243,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
@Override
|
||||
public ItemStack getStackUnderMouse(GuiContainer gui, int mousex, int mousey) {
|
||||
if (!isHidden() && isEnabled()) {
|
||||
for (Widget widget : controlWidgets) {
|
||||
for (Widget widget : drawWidgets) {
|
||||
ItemStack stack = widget.getStackMouseOver(mousex, mousey);
|
||||
if (stack != null)
|
||||
return stack;
|
||||
@@ -258,7 +268,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
GL11.glEnable(GL11.GL_DEPTH_TEST);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void postRenderObjects(GuiContainer gui, int mousex, int mousey) {
|
||||
if (!isHidden() && isEnabled()) {
|
||||
@@ -270,7 +280,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
@Override
|
||||
public List<String> handleTooltip(GuiContainer gui, int mousex, int mousey, List<String> currenttip) {
|
||||
if (!isHidden() && isEnabled() && GuiContainerManager.shouldShowTooltip(gui)) {
|
||||
for (Widget widget : controlWidgets)
|
||||
for (Widget widget : drawWidgets)
|
||||
currenttip = widget.handleTooltip(mousex, mousey, currenttip);
|
||||
}
|
||||
return currenttip;
|
||||
@@ -301,20 +311,31 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
|
||||
public static void layout(GuiContainer gui) {
|
||||
VisiblityData visiblity = new VisiblityData();
|
||||
|
||||
if (isHidden())
|
||||
visiblity.showNEI = false;
|
||||
|
||||
|
||||
if (isBookmarkPanelHidden())
|
||||
visiblity.showBookmarkPanel = false;
|
||||
|
||||
|
||||
if (gui.height - gui.ySize <= 40)
|
||||
visiblity.showSearchSection = false;
|
||||
|
||||
|
||||
if (visiblity.showBookmarkPanel || gui.guiTop <= 20)
|
||||
visiblity.showSubsetDropdown = false;
|
||||
|
||||
if (!visiblity.showBookmarkPanel || gui.guiTop <= 20)
|
||||
visiblity.showPresetsDropdown = false;
|
||||
|
||||
if (gui.guiLeft - 4 < 76)
|
||||
visiblity.showWidgets = false;
|
||||
|
||||
for (INEIGuiHandler handler : GuiInfo.guiHandlers)
|
||||
handler.modifyVisiblity(gui, visiblity);
|
||||
try {
|
||||
GuiInfo.readLock.lock();
|
||||
GuiInfo.guiHandlers.forEach(handler -> handler.modifyVisiblity(gui, visiblity));
|
||||
} finally {
|
||||
GuiInfo.readLock.unlock();
|
||||
}
|
||||
|
||||
visiblity.translateDependancies();
|
||||
|
||||
@@ -331,6 +352,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
bookmarkPanel.init();
|
||||
|
||||
dropDown = new SubsetWidget();
|
||||
presetsPanel = new PresetsWidget();
|
||||
searchField = new SearchField("search");
|
||||
|
||||
options = new ButtonCycled(3)
|
||||
@@ -341,7 +363,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
this.icons[1] = new DrawableBuilder("nei:textures/nei_tabbed_sprites.png", 48, 0, 16, 16).build();
|
||||
this.icons[2] = new DrawableBuilder("nei:textures/nei_tabbed_sprites.png", 64, 0, 16, 16).build();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onButtonPress(boolean rightclick) {
|
||||
if (!rightclick) {
|
||||
@@ -350,6 +372,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
} else {
|
||||
if (Keyboard.getEventKeyState() && (Keyboard.getEventKey() == Keyboard.KEY_LSHIFT || Keyboard.getEventKey() == Keyboard.KEY_RSHIFT)) {
|
||||
GuiRecipeTab.loadHandlerInfo();
|
||||
RecipeCatalysts.loadCatalystInfo();
|
||||
}
|
||||
getOptionList().openGui(getGuiContainer(), false);
|
||||
}
|
||||
@@ -357,7 +380,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void addTooltips(List<String> tooltip) {
|
||||
tooltip.add(translate("inventory.options.tip"));
|
||||
@@ -370,9 +393,9 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
String controlKeyLocalization = translate(Minecraft.isRunningOnMac ? "key.ctrl.mac" : "key.ctrl");
|
||||
tooltip.add(modeColor + translate("inventory.options.tip.cheatmode." + cheatMode));
|
||||
tooltip.add(modeColor + translate("inventory.options.tip.cheatmode.disable", controlKeyLocalization));
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getRenderLabel() {
|
||||
return translate("inventory.options");
|
||||
@@ -386,7 +409,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
this.icons[0] = new DrawableBuilder("nei:textures/nei_tabbed_sprites.png", 0, 0, 16, 16).build();
|
||||
this.icons[1] = new DrawableBuilder("nei:textures/nei_tabbed_sprites.png", 16, 0, 16, 16).build();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onButtonPress(boolean rightclick) {
|
||||
NEIClientConfig.toggleBooleanSetting("inventory.bookmarksEnabled");
|
||||
@@ -402,43 +425,10 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
return translate("bookmark.toggle");
|
||||
}
|
||||
};
|
||||
more = new Button("+")
|
||||
{
|
||||
@Override
|
||||
public boolean onButtonPress(boolean rightclick) {
|
||||
if (rightclick)
|
||||
return false;
|
||||
|
||||
int modifier = controlKey() ? 64 : shiftKey() ? 10 : 1;
|
||||
|
||||
int quantity = getItemQuantity() + modifier;
|
||||
if (quantity < 0)
|
||||
quantity = 0;
|
||||
|
||||
setItemQuantity(quantity);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
less = new Button("-")
|
||||
{
|
||||
@Override
|
||||
public boolean onButtonPress(boolean rightclick) {
|
||||
if (rightclick)
|
||||
return false;
|
||||
|
||||
int modifier = controlKey() ? -64 : shiftKey() ? -10 : -1;
|
||||
|
||||
int quantity = getItemQuantity() + modifier;
|
||||
if (quantity < 0)
|
||||
quantity = 0;
|
||||
|
||||
setItemQuantity(quantity);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
quantity = new ItemQuantityField("quantity");
|
||||
|
||||
|
||||
more = ItemPanels.itemPanel.more;
|
||||
less = ItemPanels.itemPanel.less;
|
||||
quantity = ItemPanels.itemPanel.quantity;
|
||||
delete = new Button()
|
||||
{
|
||||
@Override
|
||||
@@ -609,7 +599,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public static void markItemsDirty() {
|
||||
// If anything has modified data this depends on, we'll need to reload the item list
|
||||
itemsLoaded = false;
|
||||
@@ -662,20 +652,24 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
addWidget(options);
|
||||
addWidget(bookmarksButton);
|
||||
if (visiblity.showItemPanel) {
|
||||
addWidget(itemPanel);
|
||||
itemPanel.setVisible();
|
||||
|
||||
if (canPerformAction("item")) {
|
||||
addWidget(more);
|
||||
addWidget(less);
|
||||
addWidget(quantity);
|
||||
if (PresetsWidget.inEditMode()) {
|
||||
drawWidgets.add(itemPanel);
|
||||
} else {
|
||||
addWidget(itemPanel);
|
||||
}
|
||||
|
||||
itemPanel.setVisible();
|
||||
}
|
||||
|
||||
if (visiblity.showBookmarkPanel) {
|
||||
addWidget(bookmarkPanel);
|
||||
bookmarkPanel.setVisible();
|
||||
}
|
||||
}
|
||||
|
||||
if (visiblity.showPresetsDropdown) {
|
||||
addWidget(presetsPanel);
|
||||
}
|
||||
|
||||
if (visiblity.showSearchSection) {
|
||||
addWidget(searchField);
|
||||
@@ -699,8 +693,8 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
if (canPerformAction("delete"))
|
||||
addWidget(delete);
|
||||
}
|
||||
|
||||
if (!visiblity.showBookmarkPanel) {
|
||||
|
||||
if (visiblity.showSubsetDropdown) {
|
||||
// Bookmarks or Subset/dropdown
|
||||
addWidget(dropDown);
|
||||
}
|
||||
@@ -731,7 +725,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
if (!isEnabled())
|
||||
return;
|
||||
|
||||
for (Widget widget : controlWidgets)
|
||||
for (Widget widget : drawWidgets)
|
||||
widget.update();
|
||||
}
|
||||
|
||||
@@ -740,7 +734,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
if (isHidden() || !isEnabled())
|
||||
return false;
|
||||
|
||||
for (Widget widget : controlWidgets)
|
||||
for (Widget widget : drawWidgets)
|
||||
if (widget.onMouseWheel(scrolled, mousex, mousey))
|
||||
return true;
|
||||
|
||||
@@ -753,13 +747,15 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
|
||||
@Override
|
||||
public boolean shouldShowTooltip(GuiContainer gui) {
|
||||
return itemPanel.draggedStack == null;
|
||||
return itemPanel.draggedStack == null && bookmarkPanel.sortedStackIndex == -1;
|
||||
}
|
||||
|
||||
/** Note: this method isn't actually used by this mod, but NEI add-ons might need it. */
|
||||
public static Widget getInputFocused() {
|
||||
return inputFocused;
|
||||
}
|
||||
|
||||
/** Note: this method isn't actually used by this mod, but NEI add-ons might need it. */
|
||||
public static void setInputFocused(Widget widget) {
|
||||
if (inputFocused != null)
|
||||
inputFocused.loseFocus();
|
||||
@@ -778,7 +774,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
@Override
|
||||
public void renderSlotOverlay(GuiContainer window, Slot slot) {
|
||||
ItemStack item = slot.getStack();
|
||||
if (world.nbt.getBoolean("searchinventories") && (item == null ? !getSearchExpression().equals("") : !ItemList.getItemListFilter().matches(item))) {
|
||||
if (world.nbt.getBoolean("searchinventories") && (item == null ? !getSearchExpression().equals("") : !((SearchField) searchField).getFilter().matches(item))) {
|
||||
GL11.glDisable(GL11.GL_LIGHTING);
|
||||
GL11.glTranslatef(0, 0, 150);
|
||||
drawRect(slot.xDisplayPosition, slot.yDisplayPosition, 16, 16, 0x80000000);
|
||||
@@ -789,16 +785,16 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
|
||||
public static void drawIcon(int x, int y, Image image) {
|
||||
final boolean isDrawableResource = image instanceof DrawableResource;
|
||||
|
||||
|
||||
if (!isDrawableResource)
|
||||
changeTexture("nei:textures/nei_sprites.png");
|
||||
|
||||
|
||||
GL11.glColor4f(1, 1, 1, 1);
|
||||
GL11.glEnable(GL11.GL_BLEND);
|
||||
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||
if(!isDrawableResource)
|
||||
drawTexturedModalRect(x, y, image.x, image.y, image.width, image.height);
|
||||
else
|
||||
else
|
||||
((DrawableResource)image).draw(x, y);
|
||||
GL11.glDisable(GL11.GL_BLEND);
|
||||
}
|
||||
@@ -843,6 +839,11 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
drawTexturedModalRect(x2, y2, tx2, ty2, w2, h2);//bottom right
|
||||
}
|
||||
|
||||
public static void drawItemPresenceOverlay(int slotX, int slotY, boolean isPresent) {
|
||||
Image icon = itemPresenceOverlays[isPresent ? 1 : 0];
|
||||
drawIcon(slotX + 16 - icon.width, slotY + 16 - icon.height, icon);
|
||||
}
|
||||
|
||||
public static LayoutManager instance() {
|
||||
return instance;
|
||||
}
|
||||
@@ -869,4 +870,3 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+16
-19
@@ -1,6 +1,7 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.nei.api.LayoutStyle;
|
||||
import codechicken.nei.drawable.DrawableBuilder;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
@@ -9,14 +10,13 @@ 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.presetsPanel;
|
||||
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.itemPresenceOverlays;
|
||||
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;
|
||||
@@ -49,6 +49,8 @@ public class LayoutStyleMinecraft extends LayoutStyle
|
||||
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);
|
||||
itemPresenceOverlays[0] = new DrawableBuilder("nei:textures/nei_tabbed_sprites.png", 0, 40, 8, 8).build();
|
||||
itemPresenceOverlays[1] = new DrawableBuilder("nei:textures/nei_tabbed_sprites.png", 8, 40, 8, 8).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -114,16 +116,6 @@ public class LayoutStyleMinecraft extends LayoutStyle
|
||||
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;
|
||||
@@ -134,15 +126,20 @@ public class LayoutStyleMinecraft extends LayoutStyle
|
||||
bookmarksButton.w = 22;
|
||||
bookmarksButton.h = 22;
|
||||
|
||||
searchField.y = gui.height - searchField.h - 2;
|
||||
dropDown.h = 18;
|
||||
dropDown.w = 150;
|
||||
dropDown.y = 0;
|
||||
dropDown.x = (gui.width - gui.xSize) / 2 + gui.xSize - dropDown.w;
|
||||
|
||||
dropDown.x = Math.min(numButtons, buttonCount) * 20 + 3;
|
||||
dropDown.h = 20;
|
||||
dropDown.w = itemPanel.x - dropDown.x - 3;
|
||||
presetsPanel.h = 16;
|
||||
presetsPanel.w = 150;
|
||||
presetsPanel.y = 2;
|
||||
presetsPanel.x = (gui.width - gui.xSize) / 2 + gui.xSize - presetsPanel.w;
|
||||
|
||||
searchField.h = 20;
|
||||
searchField.w = 150;
|
||||
searchField.x = (gui.width - searchField.w) / 2;
|
||||
searchField.y = gui.height - searchField.h - 2;
|
||||
|
||||
if (!visiblity.showItemSection) {
|
||||
searchField.setFocus(false);
|
||||
@@ -151,8 +148,8 @@ public class LayoutStyleMinecraft extends LayoutStyle
|
||||
}
|
||||
|
||||
public void layoutButton(Button button) {
|
||||
button.x = 2 + (buttonCount % numButtons) * 20;
|
||||
button.y = (buttonCount / numButtons) * 18;
|
||||
button.x = 2 + (buttonCount % numButtons) * 19;
|
||||
button.y = 2 + (buttonCount / numButtons) * 18;
|
||||
|
||||
button.h = 17;
|
||||
button.w = button.contentWidth() + 6;
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
+183
-17
@@ -16,6 +16,7 @@ import codechicken.nei.config.ConfigSet;
|
||||
import codechicken.nei.config.GuiHighlightTips;
|
||||
import codechicken.nei.config.GuiNEIOptionList;
|
||||
import codechicken.nei.config.GuiOptionList;
|
||||
import codechicken.nei.config.GuiPanelSettings;
|
||||
import codechicken.nei.config.OptionCycled;
|
||||
import codechicken.nei.config.OptionGamemodes;
|
||||
import codechicken.nei.config.OptionList;
|
||||
@@ -24,27 +25,37 @@ import codechicken.nei.config.OptionTextField;
|
||||
import codechicken.nei.config.OptionToggleButton;
|
||||
import codechicken.nei.config.OptionToggleButtonBoubs;
|
||||
import codechicken.nei.config.OptionUtilities;
|
||||
import codechicken.nei.event.NEIConfigsLoadedEvent;
|
||||
import codechicken.nei.recipe.GuiRecipeTab;
|
||||
import codechicken.nei.recipe.IRecipeHandler;
|
||||
import codechicken.nei.recipe.RecipeCatalysts;
|
||||
import codechicken.nei.recipe.RecipeInfo;
|
||||
import codechicken.obfuscator.ObfuscationRun;
|
||||
import com.google.common.base.Objects;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import net.minecraft.client.renderer.OpenGlHelper;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.storage.SaveFormatComparator;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class NEIClientConfig
|
||||
{
|
||||
public class NEIClientConfig {
|
||||
private static boolean configLoaded;
|
||||
private static boolean enabledOverride;
|
||||
private static String worldPath;
|
||||
|
||||
public static Logger logger = LogManager.getLogger("NotEnoughItems");
|
||||
public static File configDir = new File(CommonUtils.getMinecraftDir(), "config/NEI/");
|
||||
@@ -52,8 +63,40 @@ public class NEIClientConfig
|
||||
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 final File catalystFile = new File(configDir, "catalysts.csv");
|
||||
public static final File serialHandlersFile = new File(configDir, "serialhandlers.cfg");
|
||||
public static final File heightHackHandlersFile = new File(configDir, "heighthackhandlers.cfg");
|
||||
public static final File handlerOrderingFile = new File(configDir, "handlerordering.csv");
|
||||
|
||||
@Deprecated
|
||||
public static File bookmarkFile;
|
||||
|
||||
// Set of handlers that need to be run in serial
|
||||
public static HashSet<String> serialHandlers = new HashSet<>();
|
||||
|
||||
// Set of regexes matching handler ID of handlers that need the hack in GuiRecipe.startHeightHack().
|
||||
// We use regex here so that we can apply the height hack to entire mods with one entry.
|
||||
public static HashSet<Pattern> heightHackHandlerRegex = new HashSet<>();
|
||||
|
||||
// Map of handler ID to sort order.
|
||||
// Handlers will be sorted in ascending order, so smaller numbers show up earlier.
|
||||
// Any handler not in the map will be assigned to 0, and negative numbers are fine.
|
||||
public static HashMap<String, Integer> handlerOrdering = new HashMap<>();
|
||||
|
||||
// Function that extracts the handler ID from a handler, with special logic for
|
||||
// TemplateRecipeHandler: prefer using the overlay ID if it exists.
|
||||
public static final Function<IRecipeHandler, String> HANDLER_ID_FUNCTION =
|
||||
handler -> Objects.firstNonNull(
|
||||
handler.getOverlayIdentifier(),
|
||||
handler.getHandlerId());
|
||||
|
||||
// Comparator that compares handlers using the handlerOrdering map.
|
||||
public static final Comparator<IRecipeHandler> HANDLER_COMPARATOR =
|
||||
Comparator.comparingInt(
|
||||
handler -> handlerOrdering.getOrDefault(
|
||||
HANDLER_ID_FUNCTION.apply(handler), 0));
|
||||
|
||||
|
||||
public static ItemStack[] creativeInv;
|
||||
|
||||
@@ -80,7 +123,7 @@ public class NEIClientConfig
|
||||
|
||||
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);
|
||||
@@ -113,6 +156,20 @@ public class NEIClientConfig
|
||||
tag.getTag("world.highlight_tips.y").getIntValue(100);
|
||||
API.addOption(new OptionOpenGui("world.highlight_tips", GuiHighlightTips.class));
|
||||
|
||||
|
||||
tag.getTag("world.panels.bookmarks.left").getIntValue(0);
|
||||
tag.getTag("world.panels.bookmarks.right").getIntValue(0);
|
||||
tag.getTag("world.panels.bookmarks.top").getIntValue(0);
|
||||
tag.getTag("world.panels.bookmarks.bottom").getIntValue(0);
|
||||
|
||||
tag.getTag("world.panels.items.left").getIntValue(0);
|
||||
tag.getTag("world.panels.items.right").getIntValue(0);
|
||||
tag.getTag("world.panels.items.top").getIntValue(0);
|
||||
tag.getTag("world.panels.items.bottom").getIntValue(0);
|
||||
|
||||
API.addOption(new OptionOpenGui("world.panels", GuiPanelSettings.class));
|
||||
|
||||
|
||||
tag.getTag("inventory.profileRecipes").getBooleanValue(false);
|
||||
API.addOption(new OptionToggleButton("inventory.profileRecipes", true));
|
||||
|
||||
@@ -127,6 +184,11 @@ public class NEIClientConfig
|
||||
}
|
||||
});
|
||||
|
||||
tag.getTag("inventory.cacheItemRendering").getBooleanValue(false);
|
||||
API.addOption(new OptionToggleButton("inventory.cacheItemRendering", true));
|
||||
|
||||
tag.getTag("itemLoadingTimeout").getIntValue(500);
|
||||
|
||||
tag.getTag("command.creative").setDefaultValue("/gamemode {0} {1}");
|
||||
API.addOption(new OptionTextField("command.creative"));
|
||||
tag.getTag("command.item").setDefaultValue("/give {0} {1} {2} {3} {4}");
|
||||
@@ -137,15 +199,50 @@ public class NEIClientConfig
|
||||
API.addOption(new OptionTextField("command.rain"));
|
||||
tag.getTag("command.heal").setDefaultValue("");
|
||||
API.addOption(new OptionTextField("command.heal"));
|
||||
|
||||
|
||||
tag.getTag("inventory.worldSpecificBookmarks").setComment("Global or world specific bookmarks").getBooleanValue(false);
|
||||
API.addOption(new OptionToggleButton("inventory.worldSpecificBookmarks", true) {
|
||||
@Override
|
||||
public boolean onClick(int button) {
|
||||
super.onClick(button);
|
||||
initBookmarkFile(worldPath);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
tag.getTag("inventory.worldSpecificPresets").setComment("Global or world specific presets").getBooleanValue(false);
|
||||
API.addOption(new OptionToggleButton("inventory.worldSpecificPresets", true) {
|
||||
@Override
|
||||
public boolean onClick(int button) {
|
||||
super.onClick(button);
|
||||
initPresetsFile(worldPath);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
tag.getTag("inventory.bookmarksEnabled").setComment("Enable/disable bookmarks").getBooleanValue(true);
|
||||
API.addOption(new OptionToggleButton("inventory.bookmarksEnabled", true));
|
||||
tag.getTag("inventory.saveCurrentRecipeInBookmarksEnabled").setComment("Save Current Recipe in Bookmarks").getBooleanValue(true);
|
||||
API.addOption(new OptionToggleButton("inventory.saveCurrentRecipeInBookmarksEnabled", true));
|
||||
tag.getTag("inventory.useNBTInBookmarks").setComment("Use NBT in Bookmarks").getBooleanValue(true);
|
||||
API.addOption(new OptionToggleButton("inventory.useNBTInBookmarks", true));
|
||||
tag.getTag("inventory.showRecipeMarker").setComment("Show Recipe Marker").getBooleanValue(false);
|
||||
API.addOption(new OptionToggleButton("inventory.showRecipeMarker", true));
|
||||
|
||||
tag.getTag("inventory.jei_style_tabs").setComment("Enable/disable JEI Style Tabs").getBooleanValue(true);
|
||||
API.addOption(new OptionToggleButtonBoubs("inventory.jei_style_tabs", true));
|
||||
|
||||
tag.getTag("inventory.jei_style_item_presence_overlay").setComment("Enable/disable JEI Style item presence overlay on ?-hover").getBooleanValue(true);
|
||||
API.addOption(new OptionToggleButton("inventory.jei_style_item_presence_overlay", true));
|
||||
tag.getTag("inventory.jei_style_recipe_catalyst").setComment("Enable/disable JEI Style Recipe Catalysts").getBooleanValue(true);
|
||||
API.addOption(new OptionToggleButton("inventory.jei_style_recipe_catalyst", 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("inventory.ignore_potion_overlap").setComment("Ignore overlap with potion effect HUD").getBooleanValue(false);
|
||||
API.addOption(new OptionToggleButton("inventory.ignore_potion_overlap", true));
|
||||
|
||||
tag.getTag("tools.handler_load_from_config").setComment("ADVANCED: Load handlers from config").getBooleanValue(false);
|
||||
API.addOption(new OptionToggleButton("tools.handler_load_from_config", true) {
|
||||
@Override
|
||||
@@ -155,6 +252,17 @@ public class NEIClientConfig
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
tag.getTag("tools.catalyst_load_from_config").setComment("ADVANCED: Load catalysts from config").getBooleanValue(false);
|
||||
API.addOption(new OptionToggleButton("tools.catalyst_load_from_config", true) {
|
||||
@Override
|
||||
public boolean onClick(int button) {
|
||||
super.onClick(button);
|
||||
RecipeCatalysts.loadCatalystInfo();
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
setDefaultKeyBindings();
|
||||
}
|
||||
|
||||
@@ -198,6 +306,7 @@ public class NEIClientConfig
|
||||
API.addKeyBind("gui.hide", Keyboard.KEY_O);
|
||||
API.addKeyBind("gui.search", Keyboard.KEY_F);
|
||||
API.addKeyBind("gui.bookmark", Keyboard.KEY_A);
|
||||
API.addKeyBind("gui.overlay", Keyboard.KEY_S);
|
||||
API.addKeyBind("gui.hide_bookmarks", Keyboard.KEY_B);
|
||||
API.addKeyBind("world.chunkoverlay", Keyboard.KEY_F9);
|
||||
API.addKeyBind("world.moboverlay", Keyboard.KEY_F7);
|
||||
@@ -215,17 +324,23 @@ public class NEIClientConfig
|
||||
return OptionList.getOptionList("nei.options");
|
||||
}
|
||||
|
||||
public static void loadWorld(String saveName) {
|
||||
public static void loadWorld(String worldPath) {
|
||||
NEIClientConfig.worldPath = worldPath;
|
||||
|
||||
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();
|
||||
final File specificDir = new File(CommonUtils.getMinecraftDir(), "saves/NEI/" + worldPath);
|
||||
final boolean newWorld = !specificDir.exists();
|
||||
|
||||
world = new ConfigSet(new File(saveDir, "NEI.dat"), new ConfigFile(new File(saveDir, "NEI.cfg")));
|
||||
if (newWorld) {
|
||||
specificDir.mkdirs();
|
||||
}
|
||||
|
||||
initBookmarkFile(worldPath);
|
||||
initPresetsFile(worldPath);
|
||||
world = new ConfigSet(new File(specificDir, "NEI.dat"), new ConfigFile(new File(specificDir, "NEI.cfg")));
|
||||
onWorldLoad(newWorld);
|
||||
}
|
||||
|
||||
@@ -235,7 +350,7 @@ public class NEIClientConfig
|
||||
setWorldDefaults();
|
||||
creativeInv = new ItemStack[54];
|
||||
LayoutManager.searchField.setText(getSearchExpression());
|
||||
LayoutManager.quantity.setText(Integer.toString(getItemQuantity()));
|
||||
ItemPanels.itemPanel.quantity.setText(Integer.toString(getItemQuantity()));
|
||||
SubsetWidget.loadHidden();
|
||||
|
||||
if (newWorld && Minecraft.getMinecraft().isSingleplayer())
|
||||
@@ -269,8 +384,8 @@ public class NEIClientConfig
|
||||
GuiInfo.load();
|
||||
RecipeInfo.load();
|
||||
LayoutManager.load();
|
||||
ItemPanels.bookmarkPanel.loadBookmarks();
|
||||
NEIController.load();
|
||||
RecipeCatalysts.loadCatalystInfo();
|
||||
|
||||
configLoaded = true;
|
||||
|
||||
@@ -291,11 +406,33 @@ public class NEIClientConfig
|
||||
logger.error("Failed to Load " + clazz.getName(), e);
|
||||
}
|
||||
}
|
||||
|
||||
MinecraftForge.EVENT_BUS.post(new NEIConfigsLoadedEvent());
|
||||
}
|
||||
}.start();
|
||||
ItemSorter.loadConfig();
|
||||
}
|
||||
|
||||
private static void initBookmarkFile(String worldPath)
|
||||
{
|
||||
|
||||
if (!global.config.getTag("inventory.worldSpecificBookmarks").getBooleanValue()) {
|
||||
worldPath = "global";
|
||||
}
|
||||
|
||||
ItemPanels.bookmarkPanel.setBookmarkFile(worldPath);
|
||||
}
|
||||
|
||||
private static void initPresetsFile(String worldPath)
|
||||
{
|
||||
|
||||
if (!global.config.getTag("inventory.worldSpecificPresets").getBooleanValue()) {
|
||||
worldPath = "global";
|
||||
}
|
||||
|
||||
PresetsWidget.loadPresets(worldPath);
|
||||
}
|
||||
|
||||
public static boolean isWorldSpecific(String setting) {
|
||||
if(world == null) return false;
|
||||
ConfigTag tag = world.config.getTag(setting, false);
|
||||
@@ -316,17 +453,38 @@ public class NEIClientConfig
|
||||
public static boolean isBookmarkPanelHidden() {
|
||||
return !getBooleanSetting("inventory.bookmarksEnabled");
|
||||
}
|
||||
public static boolean saveCurrentRecipeInBookmarksEnabled() {
|
||||
return getBooleanSetting("inventory.saveCurrentRecipeInBookmarksEnabled");
|
||||
}
|
||||
public static boolean useNBTInBookmarks() {
|
||||
return getBooleanSetting("inventory.useNBTInBookmarks");
|
||||
}
|
||||
public static boolean showRecipeMarker() {
|
||||
return getBooleanSetting("inventory.showRecipeMarker");
|
||||
}
|
||||
public static boolean areJEIStyleTabsVisible() {
|
||||
return getBooleanSetting("inventory.jei_style_tabs");
|
||||
}
|
||||
public static boolean isJEIStyleItemPresenceOverlayVisible() {
|
||||
return getBooleanSetting("inventory.jei_style_item_presence_overlay");
|
||||
}
|
||||
public static boolean areJEIStyleRecipeCatalystsVisible() {
|
||||
return getBooleanSetting("inventory.jei_style_recipe_catalyst");
|
||||
}
|
||||
public static boolean useCreativeTabStyle() {
|
||||
return getBooleanSetting("inventory.creative_tab_style");
|
||||
}
|
||||
public static boolean ignorePotionOverlap() {
|
||||
return getBooleanSetting("inventory.ignore_potion_overlap");
|
||||
}
|
||||
public static boolean isEnabled() {
|
||||
return enabledOverride && getBooleanSetting("inventory.widgetsenabled");
|
||||
}
|
||||
public static boolean loadHandlersFromJar() {
|
||||
return !getBooleanSetting("tools.handler_load_from_config");
|
||||
return !getBooleanSetting("tools.handler_load_from_config");
|
||||
}
|
||||
public static boolean loadCatalystsFromJar() {
|
||||
return !getBooleanSetting("tools.catalyst_load_from_config");
|
||||
}
|
||||
|
||||
public static void setEnabled(boolean flag) {
|
||||
@@ -362,6 +520,10 @@ public class NEIClientConfig
|
||||
int i = getIntSetting("inventory.itemIDs");
|
||||
return i == 2 || (i == 1 && isEnabled() && !isHidden());
|
||||
}
|
||||
|
||||
public static int getItemLoadingTimeout() {
|
||||
return getIntSetting("itemLoadingTimeout");
|
||||
}
|
||||
|
||||
public static void toggleBooleanSetting(String setting) {
|
||||
ConfigTag tag = getSetting(setting);
|
||||
@@ -397,7 +559,11 @@ public class NEIClientConfig
|
||||
public static boolean shouldInvertMouseScrollTransfer() {
|
||||
return !getBooleanSetting("inventory.invertMouseScrollTransfer");
|
||||
}
|
||||
|
||||
|
||||
public static boolean shouldCacheItemRendering() {
|
||||
return getBooleanSetting("inventory.cacheItemRendering") && OpenGlHelper.framebufferSupported;
|
||||
}
|
||||
|
||||
public static boolean getMagnetMode() {
|
||||
return enabledActions.contains("magnet");
|
||||
}
|
||||
@@ -484,5 +650,5 @@ public class NEIClientConfig
|
||||
if (file.isDirectory() && !saveFileNames.contains(file.getName()))
|
||||
ObfuscationRun.deleteDir(file, true);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+12
-9
@@ -5,7 +5,6 @@ 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;
|
||||
@@ -27,6 +26,7 @@ import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static codechicken.nei.NEIClientConfig.canCheatItem;
|
||||
import static codechicken.nei.NEIClientConfig.canPerformAction;
|
||||
@@ -135,10 +135,7 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
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);
|
||||
giveStack(stack);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -157,9 +154,16 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
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));
|
||||
final List<Iterable<Integer>> handlerSlots;
|
||||
try {
|
||||
GuiInfo.readLock.lock();
|
||||
handlerSlots = GuiInfo.guiHandlers.stream()
|
||||
.map(handler -> handler.getItemSpawnSlots(gui, typestack))
|
||||
.filter(x -> x != null)
|
||||
.collect(Collectors.toCollection(LinkedList::new));
|
||||
} finally {
|
||||
GuiInfo.readLock.unlock();
|
||||
}
|
||||
|
||||
int increment = typestack.getMaxStackSize();
|
||||
int given = 0;
|
||||
@@ -347,7 +351,6 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
public static void setItemQuantity(int i) {
|
||||
world.nbt.setInteger("quantity", i);
|
||||
world.saveNBT();
|
||||
LayoutManager.quantity.setText(Integer.toString(i));
|
||||
}
|
||||
|
||||
public static GuiContainer getGuiContainer() {
|
||||
File renamed without changes.
+7
@@ -8,6 +8,7 @@ import codechicken.nei.api.ItemInfo;
|
||||
import codechicken.nei.guihook.GuiContainerManager;
|
||||
import codechicken.nei.guihook.IContainerInputHandler;
|
||||
import codechicken.nei.guihook.IContainerSlotClickHandler;
|
||||
import codechicken.nei.recipe.GuiRecipe;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.client.gui.inventory.GuiContainerCreative;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
@@ -137,6 +138,7 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
|
||||
}
|
||||
|
||||
if (NEIClientUtils.controlKey()
|
||||
&& modifier != 4//Drop key pressed: net.minecraft.client.gui.inventory.GuiContainer.keyTyped
|
||||
&& slot != null && slot.getStack() != null
|
||||
&& slot.isItemValid(slot.getStack())) {
|
||||
NEIClientUtils.cheatItem(slot.getStack(), button, 1);
|
||||
@@ -227,6 +229,11 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
|
||||
if (!NEIClientConfig.isEnabled() || GuiInfo.hasCustomSlots(gui) || !NEIClientConfig.isMouseScrollTransferEnabled())
|
||||
return false;
|
||||
|
||||
// slot in GuiRecipe does not contain actual stack
|
||||
// and scroll should be handled by GuiRecipe, not here
|
||||
if (gui instanceof GuiRecipe)
|
||||
return false;
|
||||
|
||||
Point mousePos = getMousePosition();
|
||||
Slot mouseover = manager.window.getSlotAtPosition(mousePos.x, mousePos.y);
|
||||
if (mouseover != null && mouseover.getHasStack()) {
|
||||
File renamed without changes.
File renamed without changes.
+30
-26
@@ -6,41 +6,53 @@ import codechicken.nei.api.IConfigureNEI;
|
||||
import codechicken.nei.asm.NEICorePlugin;
|
||||
import codechicken.nei.config.IMCHandler;
|
||||
import codechicken.nei.recipe.GuiRecipeTab;
|
||||
import com.google.common.collect.ArrayListMultimap;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import codechicken.nei.recipe.RecipeCatalysts;
|
||||
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.Loader;
|
||||
import cpw.mods.fml.common.ModMetadata;
|
||||
import cpw.mods.fml.common.event.FMLInitializationEvent;
|
||||
import cpw.mods.fml.common.event.FMLInterModComms;
|
||||
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
|
||||
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
|
||||
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
|
||||
import cpw.mods.fml.common.versioning.ArtifactVersion;
|
||||
import cpw.mods.fml.common.versioning.VersionParser;
|
||||
import cpw.mods.fml.common.versioning.VersionRange;
|
||||
import net.minecraft.util.EnumChatFormatting;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
|
||||
public class NEIModContainer extends DummyModContainer
|
||||
{
|
||||
public static LinkedList<IConfigureNEI> plugins = new LinkedList<>();
|
||||
|
||||
private static boolean gregTech5Loaded;
|
||||
|
||||
public NEIModContainer() {
|
||||
super(MetadataCollection.from(MetadataCollection.class.getResourceAsStream("/neimod.info"), "NotEnoughItems").getMetadataForId("NotEnoughItems", null));
|
||||
super(getModMetadata());
|
||||
loadMetadata();
|
||||
}
|
||||
|
||||
private static ModMetadata getModMetadata() {
|
||||
final ModMetadata modMetadata = new ModMetadata();
|
||||
modMetadata.name = "GRADLETOKEN_MODNAME";
|
||||
modMetadata.modId = "GRADLETOKEN_MODID";
|
||||
modMetadata.version = "GRADLETOKEN_VERSION";
|
||||
modMetadata.authorList = Arrays.asList( "ChickenBones", "mitchej123" );
|
||||
modMetadata.url = "https://github.com/GTNewHorizons/NotEnoughItems";
|
||||
modMetadata.description = "Recipe Viewer, Inventory Manager, Item Spawner, Cheats and more; GTNH Version includes many enhancements.";
|
||||
return modMetadata;
|
||||
}
|
||||
|
||||
public static boolean isGT5Loaded() {
|
||||
return gregTech5Loaded;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<ArtifactVersion> getRequirements() {
|
||||
Set<ArtifactVersion> deps = new HashSet<>();
|
||||
@@ -87,6 +99,7 @@ public class NEIModContainer extends DummyModContainer
|
||||
|
||||
@Subscribe
|
||||
public void preInit(FMLPreInitializationEvent event) {
|
||||
gregTech5Loaded = Loader.isModLoaded("gregtech") && !Loader.isModLoaded("gregapi_post");
|
||||
if (CommonUtils.isClient())
|
||||
ClientHandler.preInit();
|
||||
}
|
||||
@@ -100,26 +113,17 @@ public class NEIModContainer extends DummyModContainer
|
||||
}
|
||||
@Subscribe
|
||||
public void postInit(FMLPostInitializationEvent event) {
|
||||
if (CommonUtils.isClient())
|
||||
if (CommonUtils.isClient()) {
|
||||
GuiRecipeTab.loadHandlerInfo();
|
||||
handleIMCMessages();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void handleIMCMessages() {
|
||||
try {
|
||||
/* Pay no attention to these unholy hacks:
|
||||
* NEI Apparently doesn't have a registered mod container, so let's use some reflection to simulate what `fetchRuntimeMessages` does
|
||||
*/
|
||||
Field modMessagesField = FMLInterModComms.class.getDeclaredField("modMessages");
|
||||
modMessagesField.setAccessible(true);
|
||||
IMCHandler.processIMC(ImmutableList.copyOf(((ArrayListMultimap<String, FMLInterModComms.IMCMessage>)modMessagesField.get(FMLInterModComms.class)).removeAll("NotEnoughItems")));
|
||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
ClientHandler.postInit();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Subscribe
|
||||
public void handleIMCMessages(FMLInterModComms.IMCEvent event) {
|
||||
IMCHandler.processIMC(event.getMessages());
|
||||
}
|
||||
|
||||
@Override
|
||||
public VersionRange acceptableMinecraftVersionRange() {
|
||||
return VersionParser.parseRange(CodeChickenCorePlugin.mcVersion);
|
||||
@@ -0,0 +1,52 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.lib.vec.Rectangle4i;
|
||||
import codechicken.nei.api.INEIGuiAdapter;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.entity.EntityPlayerSP;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.client.renderer.InventoryEffectRenderer;
|
||||
import net.minecraft.potion.PotionEffect;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* Inspired by InventoryEffectRendererGuiHandler.java in JEI
|
||||
*/
|
||||
public class NEIPotionGuiHandler extends INEIGuiAdapter {
|
||||
@Override
|
||||
public boolean hideItemPanelSlot(GuiContainer guiContainer, int slotX, int slotY, int slotW, int slotH) {
|
||||
if (NEIClientConfig.ignorePotionOverlap()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(guiContainer instanceof InventoryEffectRenderer) {
|
||||
int x = guiContainer.guiLeft - 124;
|
||||
int y = guiContainer.guiTop;
|
||||
Minecraft minecraft = guiContainer.mc;
|
||||
if (minecraft == null) {
|
||||
return false;
|
||||
}
|
||||
EntityPlayerSP player = minecraft.thePlayer;
|
||||
if (player == null) {
|
||||
return false;
|
||||
}
|
||||
Collection<PotionEffect> activePotionEffects = player.getActivePotionEffects();
|
||||
if (activePotionEffects.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
int height = 33;
|
||||
if (activePotionEffects.size() > 5) {
|
||||
height = 132 / (activePotionEffects.size() - 1);
|
||||
}
|
||||
Rectangle4i slotRect = new Rectangle4i(slotX, slotY, slotW, slotH);
|
||||
for (PotionEffect potioneffect : activePotionEffects) {
|
||||
Rectangle4i box = new Rectangle4i(x, y, 140, 32);
|
||||
if(box.intersects(slotRect))
|
||||
return true;
|
||||
y += height;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
+86
@@ -5,6 +5,9 @@ import codechicken.core.ServerUtils;
|
||||
import codechicken.lib.inventory.InventoryRange;
|
||||
import codechicken.lib.inventory.InventoryUtils;
|
||||
import codechicken.lib.packet.PacketCustom;
|
||||
import codechicken.nei.util.NBTHelper;
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
import cpw.mods.fml.common.registry.GameRegistry;
|
||||
import net.minecraft.command.ICommandSender;
|
||||
import net.minecraft.enchantment.Enchantment;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
@@ -14,6 +17,9 @@ import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.CompressedStreamTools;
|
||||
import net.minecraft.nbt.JsonToNBT;
|
||||
import net.minecraft.nbt.NBTBase;
|
||||
import net.minecraft.nbt.NBTException;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
@@ -24,6 +30,7 @@ import net.minecraft.world.World;
|
||||
import net.minecraft.world.WorldServer;
|
||||
import net.minecraft.world.WorldSettings.GameType;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
import org.apache.logging.log4j.Level;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
@@ -143,6 +150,19 @@ public class NEIServerUtils
|
||||
ItemStack.areItemStackTagsEqual(stack2, stack1));
|
||||
}
|
||||
|
||||
/**
|
||||
* NBT-friendly version of {@link #areStacksSameType(ItemStack, ItemStack)}
|
||||
* @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 itemID, damage and NBT.
|
||||
*/
|
||||
public static boolean areStacksSameTypeWithNBT(ItemStack stack1, ItemStack stack2) {
|
||||
return stack1 != null && stack2 != null &&
|
||||
stack1.getItem() == stack2.getItem() &&
|
||||
(!stack2.getHasSubtypes() || stack2.getItemDamage() == stack1.getItemDamage()) &&
|
||||
NBTHelper.matchTag(stack1.getTagCompound(), stack2.getTagCompound());
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link ItemStack}s with damage -1 are wildcards allowing all damages. Eg all colours of wool are allowed to create Beds.
|
||||
*
|
||||
@@ -156,6 +176,24 @@ public class NEIServerUtils
|
||||
(stack1.getItemDamage() == stack2.getItemDamage() || stack1.getItemDamage() == OreDictionary.WILDCARD_VALUE || stack2.getItemDamage() == OreDictionary.WILDCARD_VALUE || stack1.getItem().isDamageable());
|
||||
}
|
||||
|
||||
/**
|
||||
* NBT-friendly version of {@link #areStacksSameTypeCrafting(ItemStack, ItemStack)}
|
||||
* @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 areStacksSameTypeCraftingWithNBT(ItemStack stack1, ItemStack stack2) {
|
||||
return stack1 != null && stack2 != null &&
|
||||
stack1.getItem() == stack2.getItem() &&
|
||||
(
|
||||
stack1.getItemDamage() == stack2.getItemDamage() ||
|
||||
stack1.getItemDamage() == OreDictionary.WILDCARD_VALUE ||
|
||||
stack2.getItemDamage() == OreDictionary.WILDCARD_VALUE ||
|
||||
stack1.getItem().isDamageable()
|
||||
) &&
|
||||
NBTHelper.matchTag(stack1.getTagCompound(), stack2.getTagCompound());
|
||||
}
|
||||
|
||||
/**
|
||||
* A simple function for comparing ItemStacks in a compatible with comparators.
|
||||
*
|
||||
@@ -387,6 +425,50 @@ public class NEIServerUtils
|
||||
}
|
||||
}
|
||||
|
||||
public static ItemStack getModdedItem(String itemId, String nbtString) {
|
||||
int meta = -1;
|
||||
ItemStack itemStack;
|
||||
|
||||
if (!itemId.contains(":")) {
|
||||
NEIClientConfig.logger.info(String.format("Item ID %s is missing colon", itemId));
|
||||
return null;
|
||||
}
|
||||
final String[] split = itemId.split(":");
|
||||
// ModID:ItemID
|
||||
String itemLookupId = split[0] + ":" + split[1];
|
||||
|
||||
if (split.length >= 3) {
|
||||
int mIdx = -1;
|
||||
if (split[2].matches("\\d+")) {
|
||||
mIdx = 2;
|
||||
} else {
|
||||
itemLookupId += ":" + split[2];
|
||||
if (split.length >= 4) mIdx = 3;
|
||||
}
|
||||
if (mIdx != -1) meta = Integer.parseInt(split[mIdx]);
|
||||
}
|
||||
|
||||
if (meta != -1) {
|
||||
itemStack = GameRegistry.makeItemStack(itemLookupId, meta, 1, nbtString == null ? "" : nbtString);
|
||||
} else {
|
||||
itemStack = GameRegistry.findItemStack(split[0], split[1], 1);
|
||||
if (nbtString != null && !nbtString.isEmpty()) {
|
||||
try {
|
||||
final NBTBase nbttag = JsonToNBT.func_150315_a(nbtString);
|
||||
if (!(nbttag instanceof NBTTagCompound)) {
|
||||
NEIClientConfig.logger.info("Unexpected NBT string - multiple values {}", nbtString);
|
||||
return null;
|
||||
}
|
||||
itemStack.setTagCompound((NBTTagCompound) nbttag);
|
||||
} catch (NBTException e) {
|
||||
FMLLog.getLogger().log(Level.WARN, "Encountered an exception parsing ItemStack NBT string {}", nbtString, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
public static NBTTagCompound readNBT(File file) throws IOException {
|
||||
if(!file.exists()) return null;
|
||||
FileInputStream in = new FileInputStream(file);
|
||||
@@ -408,4 +490,8 @@ public class NEIServerUtils
|
||||
CompressedStreamTools.writeCompressed(tag, out);
|
||||
out.close();
|
||||
}
|
||||
|
||||
public static int divideCeil(int numerator, int denominator) {
|
||||
return (int) Math.ceil((float) numerator / denominator);
|
||||
}
|
||||
}
|
||||
File renamed without changes.
@@ -0,0 +1,375 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.nei.api.GuiInfo;
|
||||
import codechicken.nei.api.INEIGuiHandler;
|
||||
import codechicken.nei.guihook.GuiContainerManager;
|
||||
import codechicken.nei.recipe.GuiCraftingRecipe;
|
||||
import codechicken.nei.recipe.GuiRecipe;
|
||||
import codechicken.nei.recipe.GuiUsageRecipe;
|
||||
import codechicken.lib.vec.Rectangle4i;
|
||||
import codechicken.nei.ItemPanel.ItemPanelSlot;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public abstract class PanelWidget extends Widget
|
||||
{
|
||||
protected static final int PADDING = 2;
|
||||
|
||||
public ItemStack draggedStack;
|
||||
public int mouseDownSlot = -1;
|
||||
|
||||
public Button pagePrev;
|
||||
public Button pageNext;
|
||||
public Label pageLabel;
|
||||
|
||||
protected ItemsGrid grid;
|
||||
|
||||
public ArrayList<ItemStack> getItems()
|
||||
{
|
||||
return grid.getItems();
|
||||
}
|
||||
|
||||
public ItemsGrid getGrid()
|
||||
{
|
||||
return grid;
|
||||
}
|
||||
|
||||
public void init() {
|
||||
pageLabel = new Label("0/0", true);
|
||||
|
||||
pagePrev = new Button("Prev")
|
||||
{
|
||||
public boolean onButtonPress(boolean rightclick) {
|
||||
if (!rightclick) {
|
||||
grid.shiftPage(-1);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRenderLabel() {
|
||||
return "<";
|
||||
}
|
||||
};
|
||||
pageNext = new Button("Next")
|
||||
{
|
||||
public boolean onButtonPress(boolean rightclick) {
|
||||
if (!rightclick) {
|
||||
grid.shiftPage(1);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRenderLabel() {
|
||||
return ">";
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
public abstract String getLabelText();
|
||||
|
||||
protected abstract String getPositioningSettingName();
|
||||
|
||||
public abstract int getMarginLeft(GuiContainer gui);
|
||||
|
||||
public abstract int getMarginTop(GuiContainer gui);
|
||||
|
||||
public abstract int getWidth(GuiContainer gui);
|
||||
|
||||
public abstract int getHeight(GuiContainer gui);
|
||||
|
||||
public void resize(GuiContainer gui)
|
||||
{
|
||||
final Rectangle4i margin = new Rectangle4i(getMarginLeft(gui), getMarginTop(gui), getWidth(gui), getHeight(gui));
|
||||
|
||||
|
||||
final int minWidth = 5 * ItemsGrid.SLOT_SIZE;
|
||||
final int minHeight = 9 * ItemsGrid.SLOT_SIZE;
|
||||
|
||||
final String settingName = getPositioningSettingName();
|
||||
int paddingLeft = (int)Math.ceil(margin.w * NEIClientConfig.getSetting(settingName + ".left").getIntValue() / 100000.0);
|
||||
int paddingTop = (int)Math.ceil(margin.h * NEIClientConfig.getSetting(settingName + ".top").getIntValue() / 100000.0);
|
||||
int paddingRight = (int)Math.ceil(margin.w * NEIClientConfig.getSetting(settingName + ".right").getIntValue()/ 100000.0);
|
||||
int paddingBottom = (int)Math.ceil(margin.h * NEIClientConfig.getSetting(settingName + ".bottom").getIntValue() / 100000.0);
|
||||
|
||||
int deltaHeight = Math.min(0, margin.h - paddingTop - paddingBottom - minHeight) / 2;
|
||||
|
||||
paddingLeft = Math.min(paddingLeft, Math.max(0, margin.w - paddingRight - minWidth));
|
||||
paddingRight = Math.min(paddingRight, Math.max(0, margin.w - paddingLeft - minWidth));
|
||||
paddingTop = Math.min(margin.h - minHeight, Math.max(0, paddingTop + deltaHeight));
|
||||
paddingBottom = Math.min(margin.h - paddingTop - minHeight, Math.max(0, paddingBottom - deltaHeight));
|
||||
|
||||
x = margin.x + paddingLeft;
|
||||
y = margin.y + paddingTop;
|
||||
w = margin.w - paddingLeft - paddingRight;
|
||||
h = margin.h - paddingTop - paddingBottom;
|
||||
|
||||
final int header = resizeHeader(gui);
|
||||
final int footer = resizeFooter(gui);
|
||||
|
||||
grid.setGridSize(x, y + header, w, h - header - footer);
|
||||
grid.refresh(gui);
|
||||
}
|
||||
|
||||
protected int resizeHeader(GuiContainer gui)
|
||||
{
|
||||
final int BUTTON_SIZE = 16;
|
||||
int paddingLeft = 0;
|
||||
int paddingRight = 0;
|
||||
|
||||
while (paddingLeft < w && GuiInfo.hideItemPanelSlot(gui, new Rectangle4i(x + paddingLeft, y, ItemsGrid.SLOT_SIZE, ItemsGrid.SLOT_SIZE))) {
|
||||
paddingLeft += ItemsGrid.SLOT_SIZE;
|
||||
}
|
||||
|
||||
while (paddingRight < w && GuiInfo.hideItemPanelSlot(gui, new Rectangle4i(x + w - paddingRight - ItemsGrid.SLOT_SIZE, y, ItemsGrid.SLOT_SIZE, ItemsGrid.SLOT_SIZE))) {
|
||||
paddingRight += ItemsGrid.SLOT_SIZE;
|
||||
}
|
||||
|
||||
if (paddingLeft + paddingRight >= w) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
pagePrev.w = pageNext.w = BUTTON_SIZE;
|
||||
pagePrev.h = pageNext.h = BUTTON_SIZE;
|
||||
pagePrev.y = pageNext.y = y;
|
||||
|
||||
pagePrev.x = x + paddingLeft;
|
||||
pageNext.x = x + w - pageNext.w - paddingRight;
|
||||
|
||||
pageLabel.x = x + paddingLeft + (w - paddingLeft - paddingRight) / 2;
|
||||
pageLabel.y = y + 5;
|
||||
pageLabel.text = getLabelText();
|
||||
|
||||
return BUTTON_SIZE + 2;
|
||||
}
|
||||
|
||||
protected abstract int resizeFooter(GuiContainer gui);
|
||||
|
||||
public void setVisible()
|
||||
{
|
||||
if (grid.getPerPage() > 0) {
|
||||
LayoutManager.addWidget(pagePrev);
|
||||
LayoutManager.addWidget(pageNext);
|
||||
LayoutManager.addWidget(pageLabel);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(int mousex, int mousey)
|
||||
{
|
||||
grid.draw(mousex, mousey);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postDraw(int mousex, int mousey)
|
||||
{
|
||||
if (draggedStack != null) {
|
||||
GuiContainerManager.drawItems.zLevel += 100;
|
||||
GuiContainerManager.drawItem(mousex - 8, mousey - 8, draggedStack);
|
||||
GuiContainerManager.drawItems.zLevel -= 100;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseDragged(int mousex, int mousey, int button, long heldTime)
|
||||
{
|
||||
if (mouseDownSlot >= 0 && draggedStack == null && NEIClientUtils.getHeldItem() == null &&
|
||||
NEIClientConfig.hasSMPCounterPart() && !GuiInfo.hasCustomSlots(NEIClientUtils.getGuiContainer())) {
|
||||
ItemPanelSlot mouseOverSlot = getSlotMouseOver(mousex, mousey);
|
||||
|
||||
if (mouseOverSlot == null || mouseOverSlot.slotIndex != mouseDownSlot || heldTime > 500) {
|
||||
draggedStack = getDraggedStackWithQuantity(mouseDownSlot);
|
||||
mouseDownSlot = -1;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract ItemStack getDraggedStackWithQuantity(int mouseDownSlot);
|
||||
|
||||
@Override
|
||||
public boolean handleClick(int mousex, int mousey, int button)
|
||||
{
|
||||
|
||||
if (handleClickExt(mousex, mousey, button))
|
||||
return true;
|
||||
|
||||
if (NEIClientUtils.getHeldItem() != null) {
|
||||
|
||||
if (!grid.contains(mousex, mousey)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (NEIClientConfig.canPerformAction("delete") && NEIClientConfig.canPerformAction("item"))
|
||||
if (button == 1)
|
||||
NEIClientUtils.decreaseSlotStack(-999);
|
||||
else
|
||||
NEIClientUtils.deleteHeldItem();
|
||||
else
|
||||
NEIClientUtils.dropHeldItem();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
ItemPanelSlot hoverSlot = getSlotMouseOver(mousex, mousey);
|
||||
if (hoverSlot != null) {
|
||||
|
||||
if (button == 2) {
|
||||
|
||||
if (hoverSlot.item != null) {
|
||||
draggedStack = getDraggedStackWithQuantity(hoverSlot.slotIndex);
|
||||
}
|
||||
|
||||
} else {
|
||||
mouseDownSlot = hoverSlot.slotIndex;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handleClickExt(int mouseX, int mouseY, int button)
|
||||
{
|
||||
if (ItemPanels.itemPanel.draggedStack != null) {
|
||||
return ItemPanels.itemPanel.handleDraggedClick(mouseX, mouseY, button);
|
||||
}
|
||||
|
||||
if (ItemPanels.bookmarkPanel.draggedStack != null) {
|
||||
return ItemPanels.bookmarkPanel.handleDraggedClick(mouseX, mouseY, button);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
protected boolean handleDraggedClick(int mouseX, int mouseY, int button)
|
||||
{
|
||||
if (draggedStack == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (handleGUIContainerClick(mouseX, mouseY, button)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
final GuiContainer gui = NEIClientUtils.getGuiContainer();
|
||||
if (mouseX < gui.guiLeft || mouseY < gui.guiTop || mouseX >= gui.guiLeft + gui.xSize || mouseY >= gui.guiTop + gui.ySize) {
|
||||
draggedStack = null;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
protected boolean handleGUIContainerClick(int mouseX, int mouseY, int button)
|
||||
{
|
||||
final GuiContainer gui = NEIClientUtils.getGuiContainer();
|
||||
boolean handled = false;
|
||||
|
||||
try {
|
||||
GuiInfo.readLock.lock();
|
||||
for (INEIGuiHandler handler : GuiInfo.guiHandlers) {
|
||||
if (handler.handleDragNDrop(gui, mouseX, mouseY, draggedStack, button)) {
|
||||
handled = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
GuiInfo.readLock.unlock();
|
||||
}
|
||||
|
||||
if (draggedStack.stackSize == 0) {
|
||||
draggedStack = null;
|
||||
}
|
||||
|
||||
return handled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseUp(int mousex, int mousey, int button)
|
||||
{
|
||||
ItemPanelSlot hoverSlot = getSlotMouseOver(mousex, mousey);
|
||||
|
||||
if (hoverSlot != null && hoverSlot.slotIndex == mouseDownSlot && draggedStack == null) {
|
||||
ItemStack item = hoverSlot.item;
|
||||
|
||||
if (NEIController.manager.window instanceof GuiRecipe || !NEIClientConfig.canCheatItem(item)) {
|
||||
|
||||
if (button == 0) {
|
||||
GuiCraftingRecipe.openRecipeGui("item", item);
|
||||
} else if (button == 1) {
|
||||
GuiUsageRecipe.openRecipeGui("item", item);
|
||||
}
|
||||
|
||||
mouseDownSlot = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
NEIClientUtils.cheatItem(getDraggedStackWithQuantity(hoverSlot.slotIndex), button, -1);
|
||||
}
|
||||
|
||||
mouseDownSlot = -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onMouseWheel(int i, int mousex, int mousey)
|
||||
{
|
||||
if (!contains(mousex, mousey))
|
||||
return false;
|
||||
|
||||
grid.shiftPage(-i);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handleKeyPress(int keyID, char keyChar)
|
||||
{
|
||||
|
||||
if (keyID == NEIClientConfig.getKeyBinding("gui.next")) {
|
||||
grid.shiftPage(1);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (keyID == NEIClientConfig.getKeyBinding("gui.prev")) {
|
||||
grid.shiftPage(-1);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getStackMouseOver(int mousex, int mousey)
|
||||
{
|
||||
ItemPanelSlot slot = getSlotMouseOver(mousex, mousey);
|
||||
return slot == null ? null : slot.item;
|
||||
}
|
||||
|
||||
public ItemPanelSlot getSlotMouseOver(int mousex, int mousey)
|
||||
{
|
||||
return grid.getSlotMouseOver(mousex, mousey);
|
||||
}
|
||||
|
||||
public int getPage() {
|
||||
return grid.page + 1;
|
||||
}
|
||||
|
||||
public int getNumPages() {
|
||||
return grid.numPages;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(int px, int py)
|
||||
{
|
||||
return grid.contains(px, py);
|
||||
}
|
||||
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
+27
-22
@@ -22,8 +22,7 @@ public class PositionedStack
|
||||
|
||||
private boolean permutated = false;
|
||||
|
||||
public PositionedStack(Object object, int x, int y, boolean genPerms)
|
||||
{
|
||||
public PositionedStack(Object object, int x, int y, boolean genPerms) {
|
||||
items = NEIServerUtils.extractRecipeItems(object);
|
||||
relx = x;
|
||||
rely = y;
|
||||
@@ -39,27 +38,22 @@ public class PositionedStack
|
||||
this(object, x, y, true);
|
||||
}
|
||||
|
||||
public void generatePermutations()
|
||||
{
|
||||
public void generatePermutations() {
|
||||
if(permutated)
|
||||
return;
|
||||
|
||||
ArrayList<ItemStack> stacks = new ArrayList<>();
|
||||
for(ItemStack item : items)
|
||||
{
|
||||
for(ItemStack item : items) {
|
||||
if(item == null || item.getItem() == null)
|
||||
continue;
|
||||
|
||||
if(item.getItemDamage() == Short.MAX_VALUE)
|
||||
{
|
||||
if(item.getItemDamage() == Short.MAX_VALUE) {
|
||||
List<ItemStack> permutations = ItemList.itemMap.get(item.getItem());
|
||||
if(!permutations.isEmpty())
|
||||
{
|
||||
if(!permutations.isEmpty()) {
|
||||
for(ItemStack stack : permutations)
|
||||
stacks.add(stack.copy());
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
ItemStack base = new ItemStack(item.getItem(), item.stackSize);
|
||||
base.stackTagCompound = item.stackTagCompound;
|
||||
stacks.add(base);
|
||||
@@ -78,20 +72,17 @@ public class PositionedStack
|
||||
setPermutationToRender(0);
|
||||
}
|
||||
|
||||
public void setMaxSize(int i)
|
||||
{
|
||||
public void setMaxSize(int i) {
|
||||
for(ItemStack item : items)
|
||||
if(item.stackSize > i)
|
||||
item.stackSize = i;
|
||||
}
|
||||
|
||||
public PositionedStack copy()
|
||||
{
|
||||
public PositionedStack copy() {
|
||||
return new PositionedStack(items, relx, rely);
|
||||
}
|
||||
|
||||
public void setPermutationToRender(int index)
|
||||
{
|
||||
public void setPermutationToRender(int index) {
|
||||
item = items[index].copy();
|
||||
if(item.getItem() == null)
|
||||
item = new ItemStack(Blocks.fire);
|
||||
@@ -99,8 +90,7 @@ public class PositionedStack
|
||||
item.setItemDamage(0);
|
||||
}
|
||||
|
||||
public boolean contains(ItemStack ingredient)
|
||||
{
|
||||
public boolean contains(ItemStack ingredient) {
|
||||
for(ItemStack item : items)
|
||||
if(NEIServerUtils.areStacksSameTypeCrafting(item, ingredient))
|
||||
return true;
|
||||
@@ -108,12 +98,27 @@ public class PositionedStack
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean contains(Item ingred)
|
||||
{
|
||||
/**
|
||||
* NBT-friendly version of {@link #contains(ItemStack)}
|
||||
*/
|
||||
public boolean containsWithNBT(ItemStack ingredient) {
|
||||
for(ItemStack item : items)
|
||||
if(NEIServerUtils.areStacksSameTypeCraftingWithNBT(item, ingredient))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean contains(Item ingred) {
|
||||
for(ItemStack item : items)
|
||||
if(item.getItem() == ingred)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "PositionedStack(output='" + item.toString() + "')";
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
File renamed without changes.
+3
-2
@@ -63,8 +63,9 @@ public class SearchField extends TextField implements ItemFilterProvider
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTextColour() {
|
||||
if(ItemPanels.itemPanel.realItems.size() == 0) {
|
||||
public int getTextColour()
|
||||
{
|
||||
if (ItemPanels.itemPanel.getItems().isEmpty()) {
|
||||
return focused() ? 0xFFcc3300 : 0xFF993300;
|
||||
} else {
|
||||
return focused() ? 0xFFE0E0E0 : 0xFF909090;
|
||||
File renamed without changes.
File renamed without changes.
+2
@@ -33,6 +33,7 @@ public class SpawnerRenderer implements IItemRenderer
|
||||
|
||||
String bossName = BossStatus.bossName;
|
||||
int bossTimeout = BossStatus.statusBarTime;
|
||||
boolean bossHasColorModifier = BossStatus.hasColorModifier;
|
||||
try
|
||||
{
|
||||
World world = NEIClientUtils.mc().theWorld;
|
||||
@@ -66,6 +67,7 @@ public class SpawnerRenderer implements IItemRenderer
|
||||
}
|
||||
BossStatus.bossName = bossName;
|
||||
BossStatus.statusBarTime = bossTimeout;
|
||||
BossStatus.hasColorModifier = bossHasColorModifier;
|
||||
}
|
||||
|
||||
@SuppressWarnings("incomplete-switch")
|
||||
+2
@@ -217,6 +217,7 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
|
||||
for(SubsetTag tag : sorted)
|
||||
tag.cacheState();
|
||||
}
|
||||
|
||||
public void addFiltersWithItem(List<ItemFilter> filters, String itemSearch) {
|
||||
if(itemSearch == null) {
|
||||
addFilters(filters);
|
||||
@@ -229,6 +230,7 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public void addFilters(List<ItemFilter> filters) {
|
||||
if(filter != null)
|
||||
filters.add(filter);
|
||||
@@ -79,6 +79,7 @@ public abstract class TextField extends Widget
|
||||
if (!focused())
|
||||
return false;
|
||||
|
||||
String oldText = text();
|
||||
boolean handled = field.textboxKeyTyped(keyChar, keyID);
|
||||
if(!handled) {
|
||||
if (keyID == Keyboard.KEY_RETURN || keyID == Keyboard.KEY_NUMPADENTER || keyID == Keyboard.KEY_ESCAPE) {
|
||||
@@ -88,7 +89,7 @@ public abstract class TextField extends Widget
|
||||
}
|
||||
|
||||
if(handled) {
|
||||
onTextChange(text());
|
||||
onTextChange(oldText);
|
||||
}
|
||||
|
||||
return handled;
|
||||
@@ -120,8 +121,10 @@ public abstract class TextField extends Widget
|
||||
if (focus) {
|
||||
previousKeyboardRepeatEnabled = Keyboard.areRepeatEventsEnabled();
|
||||
Keyboard.enableRepeatEvents(true);
|
||||
gainFocus();
|
||||
} else {
|
||||
Keyboard.enableRepeatEvents(previousKeyboardRepeatEnabled);
|
||||
loseFocus();
|
||||
}
|
||||
|
||||
}
|
||||
+5
-2
@@ -55,8 +55,11 @@ public class ThreadOperationTimer extends Thread
|
||||
|
||||
while (thread.isAlive()) {
|
||||
synchronized (this) {
|
||||
if (operation != null && System.currentTimeMillis() - opTime > limit)
|
||||
thread.stop(new TimeoutException("Operation took too long", operation));
|
||||
if (operation != null && System.currentTimeMillis() - opTime > limit) {
|
||||
// Thread.stop(Throwable) is hard-deprecated and IntelliJ complains about it.
|
||||
//thread.stop(new TimeoutException("Operation took too long", operation));
|
||||
thread.stop();
|
||||
}
|
||||
}
|
||||
try {
|
||||
Thread.sleep(50);
|
||||
+9
-1
@@ -11,6 +11,14 @@ public class VisiblityData
|
||||
* Bookmark panel and associated buttons
|
||||
*/
|
||||
public boolean showBookmarkPanel = true;
|
||||
/**
|
||||
* Subset dropdown
|
||||
*/
|
||||
public boolean showSubsetDropdown = true;
|
||||
/**
|
||||
* Presets dropdown
|
||||
*/
|
||||
public boolean showPresetsDropdown = true;
|
||||
/**
|
||||
* Item and search section
|
||||
*/
|
||||
@@ -40,6 +48,6 @@ public class VisiblityData
|
||||
if(!showWidgets)
|
||||
showItemSection = showUtilityButtons = false;
|
||||
if(!showItemSection)
|
||||
showBookmarkPanel = showSearchSection = showItemPanel = false;
|
||||
showBookmarkPanel = showSubsetDropdown = showPresetsDropdown = showSearchSection = showItemPanel = false;
|
||||
}
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,329 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.lib.math.MathHelper;
|
||||
import codechicken.lib.render.RenderUtils;
|
||||
import codechicken.nei.KeyManager.IKeyStateTracker;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EnumCreatureType;
|
||||
import net.minecraft.entity.passive.EntityPig;
|
||||
import net.minecraft.util.AxisAlignedBB;
|
||||
import net.minecraft.world.EnumSkyBlock;
|
||||
import net.minecraft.world.SpawnerAnimals;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.biome.BiomeGenBase;
|
||||
import net.minecraft.world.chunk.Chunk;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
public class WorldOverlayRenderer implements IKeyStateTracker {
|
||||
|
||||
public static int chunkOverlay = 0;
|
||||
|
||||
public static int mobOverlay = 0;
|
||||
private static byte[] mobSpawnCache;
|
||||
private static long mobOverlayUpdateTime;
|
||||
|
||||
public static void reset() {
|
||||
mobOverlay = 0;
|
||||
chunkOverlay = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tickKeyStates() {
|
||||
if (Minecraft.getMinecraft().currentScreen != null)
|
||||
return;
|
||||
|
||||
if (KeyManager.keyStates.get("world.moboverlay").down)
|
||||
mobOverlay = (mobOverlay + 1) % 2;
|
||||
if (KeyManager.keyStates.get("world.chunkoverlay").down)
|
||||
chunkOverlay = (chunkOverlay + 1) % (NEIModContainer.isGT5Loaded() ? 4 : 3);
|
||||
}
|
||||
|
||||
public static void render(float frame) {
|
||||
GL11.glPushMatrix();
|
||||
Entity entity = Minecraft.getMinecraft().renderViewEntity;
|
||||
RenderUtils.translateToWorldCoords(entity, frame);
|
||||
|
||||
renderChunkBounds(entity);
|
||||
renderMobSpawnOverlay(entity);
|
||||
GL11.glPopMatrix();
|
||||
}
|
||||
|
||||
private static void buildMobSpawnOverlay(Entity entity) {
|
||||
if (mobSpawnCache == null) {
|
||||
mobSpawnCache = new byte[33 * 33 * 33]; // 35kB
|
||||
}
|
||||
|
||||
World world = entity.worldObj;
|
||||
int x1 = (int) entity.posX;
|
||||
int z1 = (int) entity.posZ;
|
||||
int y1 = (int) MathHelper.clip(entity.posY, 16, world.getHeight() - 16);
|
||||
|
||||
for (int i = 0; i <= 32; i++) {
|
||||
int x = x1 - 16 + i;
|
||||
for (int j = 0; j <= 32; j++) {
|
||||
int z = z1 - 16 + j;
|
||||
int bufIndex = (i * 33 + j) * 33;
|
||||
|
||||
Chunk chunk = world.getChunkFromBlockCoords(x, z);
|
||||
BiomeGenBase biome = world.getBiomeGenForCoords(x, z);
|
||||
if (biome.getSpawnableList(EnumCreatureType.monster).isEmpty() || biome.getSpawningChance() <= 0) {
|
||||
mobSpawnCache[bufIndex] = -1;
|
||||
continue;
|
||||
}
|
||||
|
||||
int maxHeight = chunk.worldObj.getHeightValue(x, z);
|
||||
|
||||
for (int k = 0; k <= 32; k++) {
|
||||
int y = y1 - 16 + k;
|
||||
if (y > maxHeight) {
|
||||
mobSpawnCache[bufIndex + k] = -1;
|
||||
break;
|
||||
}
|
||||
mobSpawnCache[bufIndex + k] = getSpawnMode(chunk, x, y, z);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void renderMobSpawnOverlay(Entity entity) {
|
||||
if (mobOverlay == 0) {
|
||||
if (mobSpawnCache != null) {
|
||||
mobSpawnCache = null;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
long worldTime = entity.worldObj.getTotalWorldTime();
|
||||
if (mobSpawnCache == null || mobOverlayUpdateTime != worldTime) {
|
||||
mobOverlayUpdateTime = worldTime;
|
||||
buildMobSpawnOverlay(entity);
|
||||
}
|
||||
|
||||
GL11.glDisable(GL11.GL_TEXTURE_2D);
|
||||
GL11.glEnable(GL11.GL_BLEND);
|
||||
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||
GL11.glDisable(GL11.GL_LIGHTING);
|
||||
GL11.glLineWidth(1.5F);
|
||||
GL11.glBegin(GL11.GL_LINES);
|
||||
|
||||
GL11.glColor4f(1, 0, 0, 1);
|
||||
int curSpawnMode = 2;
|
||||
|
||||
World world = entity.worldObj;
|
||||
int x1 = (int) entity.posX;
|
||||
int z1 = (int) entity.posZ;
|
||||
int y1 = (int) MathHelper.clip(entity.posY, 16, world.getHeight() - 16);
|
||||
|
||||
for (int i = 0; i <= 32; i++) {
|
||||
int x = x1 - 16 + i;
|
||||
for (int j = 0; j <= 32; j++) {
|
||||
int z = z1 - 16 + j;
|
||||
int cacheIndex = (i * 33 + j) * 33;
|
||||
|
||||
for (int k = 0; k <= 32; k++) {
|
||||
int y = y1 - 16 + k;
|
||||
int spawnMode = mobSpawnCache[cacheIndex + k];
|
||||
if (spawnMode == 0) {
|
||||
continue;
|
||||
} else if (spawnMode == -1) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (spawnMode != curSpawnMode) {
|
||||
if (spawnMode == 1) {
|
||||
GL11.glColor4f(1, 1, 0, 1);
|
||||
} else {
|
||||
GL11.glColor4f(1, 0, 0, 1);
|
||||
}
|
||||
curSpawnMode = spawnMode;
|
||||
}
|
||||
|
||||
GL11.glVertex3d(x, y + 0.02, z);
|
||||
GL11.glVertex3d(x + 1, y + 0.02, z + 1);
|
||||
GL11.glVertex3d(x + 1, y + 0.02, z);
|
||||
GL11.glVertex3d(x, y + 0.02, z + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GL11.glEnd();
|
||||
GL11.glEnable(GL11.GL_LIGHTING);
|
||||
GL11.glEnable(GL11.GL_TEXTURE_2D);
|
||||
GL11.glDisable(GL11.GL_BLEND);
|
||||
}
|
||||
|
||||
private static final Entity dummyEntity = new EntityPig(null);
|
||||
private static final AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(0, 0, 0, 0, 0, 0);
|
||||
|
||||
private static byte getSpawnMode(Chunk chunk, int x, int y, int z) {
|
||||
if (!SpawnerAnimals.canCreatureTypeSpawnAtLocation(EnumCreatureType.monster, chunk.worldObj, x, y, z) ||
|
||||
chunk.getSavedLightValue(EnumSkyBlock.Block, x & 15, y, z & 15) >= 8) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
aabb.minX = x + 0.2;
|
||||
aabb.maxX = x + 0.8;
|
||||
aabb.minY = y + 0.01;
|
||||
aabb.maxY = y + 1.8;
|
||||
aabb.minZ = z + 0.2;
|
||||
aabb.maxZ = z + 0.8;
|
||||
if (!chunk.worldObj.getCollidingBoundingBoxes(dummyEntity, aabb).isEmpty() || chunk.worldObj.isAnyLiquid(aabb)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (byte) (chunk.getSavedLightValue(EnumSkyBlock.Sky, x & 15, y, z & 15) >= 8 ? 1 : 2);
|
||||
}
|
||||
|
||||
private static void renderChunkBounds(Entity entity) {
|
||||
if (chunkOverlay == 0)
|
||||
return;
|
||||
|
||||
GL11.glDisable(GL11.GL_TEXTURE_2D);
|
||||
GL11.glEnable(GL11.GL_BLEND);
|
||||
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||
GL11.glDisable(GL11.GL_LIGHTING);
|
||||
GL11.glLineWidth(1.5F);
|
||||
GL11.glBegin(GL11.GL_LINES);
|
||||
|
||||
for (int cx = -4; cx <= 4; cx++)
|
||||
for (int cz = -4; cz <= 4; cz++) {
|
||||
double x1 = (entity.chunkCoordX + cx) << 4;
|
||||
double z1 = (entity.chunkCoordZ + cz) << 4;
|
||||
double x2 = x1 + 16;
|
||||
double z2 = z1 + 16;
|
||||
|
||||
double dy = 128;
|
||||
double y1 = Math.floor(entity.posY - dy / 2);
|
||||
double y2 = y1 + dy;
|
||||
if (y1 < 0) {
|
||||
y1 = 0;
|
||||
y2 = dy;
|
||||
}
|
||||
|
||||
if (y1 > entity.worldObj.getHeight()) {
|
||||
y2 = entity.worldObj.getHeight();
|
||||
y1 = y2 - dy;
|
||||
}
|
||||
|
||||
double dist = Math.pow(1.5, -(cx * cx + cz * cz));
|
||||
|
||||
GL11.glColor4d(0.9, 0, 0, dist);
|
||||
if (cx >= 0 && cz >= 0) {
|
||||
GL11.glVertex3d(x2, y1, z2);
|
||||
GL11.glVertex3d(x2, y2, z2);
|
||||
}
|
||||
if (cx >= 0 && cz <= 0) {
|
||||
GL11.glVertex3d(x2, y1, z1);
|
||||
GL11.glVertex3d(x2, y2, z1);
|
||||
}
|
||||
if (cx <= 0 && cz >= 0) {
|
||||
GL11.glVertex3d(x1, y1, z2);
|
||||
GL11.glVertex3d(x1, y2, z2);
|
||||
}
|
||||
if (cx <= 0 && cz <= 0) {
|
||||
GL11.glVertex3d(x1, y1, z1);
|
||||
GL11.glVertex3d(x1, y2, z1);
|
||||
}
|
||||
|
||||
if (cx == 0 && cz == 0) {
|
||||
if (chunkOverlay == 2) {
|
||||
dy = 32;
|
||||
y1 = Math.floor(entity.posY - dy / 2);
|
||||
y2 = y1 + dy;
|
||||
if (y1 < 0) {
|
||||
y1 = 0;
|
||||
y2 = dy;
|
||||
}
|
||||
|
||||
if (y1 > entity.worldObj.getHeight()) {
|
||||
y2 = entity.worldObj.getHeight();
|
||||
y1 = y2 - dy;
|
||||
}
|
||||
|
||||
GL11.glColor4d(0, 0.9, 0, 0.4);
|
||||
for (double y = (int) y1; y <= y2; y++) {
|
||||
GL11.glVertex3d(x2, y, z1);
|
||||
GL11.glVertex3d(x2, y, z2);
|
||||
GL11.glVertex3d(x1, y, z1);
|
||||
GL11.glVertex3d(x1, y, z2);
|
||||
GL11.glVertex3d(x1, y, z2);
|
||||
GL11.glVertex3d(x2, y, z2);
|
||||
GL11.glVertex3d(x1, y, z1);
|
||||
GL11.glVertex3d(x2, y, z1);
|
||||
}
|
||||
for (double h = 1; h <= 15; h++) {
|
||||
GL11.glVertex3d(x1 + h, y1, z1);
|
||||
GL11.glVertex3d(x1 + h, y2, z1);
|
||||
GL11.glVertex3d(x1 + h, y1, z2);
|
||||
GL11.glVertex3d(x1 + h, y2, z2);
|
||||
GL11.glVertex3d(x1, y1, z1 + h);
|
||||
GL11.glVertex3d(x1, y2, z1 + h);
|
||||
GL11.glVertex3d(x2, y1, z1 + h);
|
||||
GL11.glVertex3d(x2, y2, z1 + h);
|
||||
}
|
||||
} else if (chunkOverlay == 3) {
|
||||
int gx1 = ((entity.chunkCoordX < 0 ? entity.chunkCoordX - 3 : entity.chunkCoordX) / 3 * 3) << 4;
|
||||
int gz1 = ((entity.chunkCoordZ < 0 ? entity.chunkCoordZ - 3 : entity.chunkCoordZ) / 3 * 3) << 4;
|
||||
if (entity.chunkCoordX < 0) {
|
||||
gx1 += 16;
|
||||
}
|
||||
if (entity.chunkCoordZ < 0) {
|
||||
gz1 += 16;
|
||||
}
|
||||
int gx2 = gx1 + 48;
|
||||
int gz2 = gz1 + 48;
|
||||
|
||||
GL11.glColor4d(0, 0.9, 0, 0.4);
|
||||
for (double y = (int) y1; y <= y2; y++) {
|
||||
GL11.glVertex3d(gx2, y, gz1);
|
||||
GL11.glVertex3d(gx2, y, gz2);
|
||||
GL11.glVertex3d(gx1, y, gz1);
|
||||
GL11.glVertex3d(gx1, y, gz2);
|
||||
GL11.glVertex3d(gx1, y, gz2);
|
||||
GL11.glVertex3d(gx2, y, gz2);
|
||||
GL11.glVertex3d(gx1, y, gz1);
|
||||
GL11.glVertex3d(gx2, y, gz1);
|
||||
}
|
||||
for (double h = 4; h <= 44; h += 4) {
|
||||
if (h % 16 == 0) {
|
||||
continue;
|
||||
}
|
||||
GL11.glVertex3d(gx1 + h, y1, gz1);
|
||||
GL11.glVertex3d(gx1 + h, y2, gz1);
|
||||
GL11.glVertex3d(gx1 + h, y1, gz2);
|
||||
GL11.glVertex3d(gx1 + h, y2, gz2);
|
||||
GL11.glVertex3d(gx1, y1, gz1 + h);
|
||||
GL11.glVertex3d(gx1, y2, gz1 + h);
|
||||
GL11.glVertex3d(gx2, y1, gz1 + h);
|
||||
GL11.glVertex3d(gx2, y2, gz1 + h);
|
||||
}
|
||||
|
||||
GL11.glColor4d(0, 0, 0.9, 0.4);
|
||||
gx1 += 23;
|
||||
gz1 += 23;
|
||||
gx2 = gx1 + 1;
|
||||
gz2 = gz1 + 1;
|
||||
|
||||
GL11.glVertex3d(gx1, y1, gz1);
|
||||
GL11.glVertex3d(gx1, y2, gz1);
|
||||
GL11.glVertex3d(gx2, y1, gz1);
|
||||
GL11.glVertex3d(gx2, y2, gz1);
|
||||
GL11.glVertex3d(gx1, y1, gz2);
|
||||
GL11.glVertex3d(gx1, y2, gz2);
|
||||
GL11.glVertex3d(gx2, y1, gz2);
|
||||
GL11.glVertex3d(gx2, y2, gz2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GL11.glEnd();
|
||||
GL11.glEnable(GL11.GL_LIGHTING);
|
||||
GL11.glEnable(GL11.GL_TEXTURE_2D);
|
||||
GL11.glDisable(GL11.GL_BLEND);
|
||||
}
|
||||
|
||||
public static void load() {
|
||||
KeyManager.trackers.add(new WorldOverlayRenderer());
|
||||
}
|
||||
}
|
||||
@@ -15,11 +15,15 @@ import codechicken.nei.SubsetWidget.SubsetTag;
|
||||
import codechicken.nei.api.ItemFilter.ItemFilterProvider;
|
||||
import codechicken.nei.config.Option;
|
||||
import codechicken.nei.config.OptionKeyBind;
|
||||
import codechicken.nei.recipe.CatalystInfo;
|
||||
import codechicken.nei.recipe.GuiCraftingRecipe;
|
||||
import codechicken.nei.recipe.GuiUsageRecipe;
|
||||
import codechicken.nei.recipe.ICraftingHandler;
|
||||
import codechicken.nei.recipe.IRecipeHandler;
|
||||
import codechicken.nei.recipe.IUsageHandler;
|
||||
import codechicken.nei.recipe.RecipeCatalysts;
|
||||
import codechicken.nei.recipe.RecipeInfo;
|
||||
import codechicken.nei.recipe.StackInfo;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.inventory.Slot;
|
||||
@@ -29,6 +33,7 @@ import org.lwjgl.input.Keyboard;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* This is the main class that handles item property configuration.
|
||||
@@ -112,7 +117,12 @@ public class API
|
||||
}
|
||||
|
||||
public static void registerNEIGuiHandler(INEIGuiHandler handler) {
|
||||
GuiInfo.guiHandlers.add(handler);
|
||||
try {
|
||||
GuiInfo.writeLock.lock();
|
||||
GuiInfo.guiHandlers.add(handler);
|
||||
} finally {
|
||||
GuiInfo.writeLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -279,4 +289,78 @@ public class API
|
||||
ItemInfo.itemVariants.put(item, variant);
|
||||
LayoutManager.markItemsDirty();
|
||||
}
|
||||
|
||||
public static void registerStackStringifyHandler(IStackStringifyHandler handler)
|
||||
{
|
||||
StackInfo.stackStringifyHandlers.add(handler);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an association between an ingredient and what it can craft. (i.e. Furnace ItemStack -> Smelting and Fuel Recipes)
|
||||
* Allows players to see what ingredient they need to craft in order to make recipes from a recipe category.
|
||||
* @param stack the ingredient that can craft recipes (like a furnace or crafting table)
|
||||
* @param handler the recipe category handled by the ingredient
|
||||
* @param priority higher priority comes first, default to 0
|
||||
*/
|
||||
public static void addRecipeCatalyst(ItemStack stack, IRecipeHandler handler, int priority) {
|
||||
String handlerID = RecipeCatalysts.getRecipeID(handler);
|
||||
addRecipeCatalyst(stack, handlerID, priority);
|
||||
}
|
||||
|
||||
/**
|
||||
* See {@link API#addRecipeCatalyst(ItemStack, IRecipeHandler, int)}
|
||||
*/
|
||||
public static void addRecipeCatalyst(ItemStack stack, IRecipeHandler handler) {
|
||||
addRecipeCatalyst(stack, handler, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an association between an ingredient and what it can craft. (i.e. Furnace ItemStack -> Smelting and Fuel Recipes)
|
||||
* Allows players to see what ingredient they need to craft in order to make recipes from a recipe category.
|
||||
* @param stack the ingredient that can craft recipes (like a furnace or crafting table)
|
||||
* @param handlerID recipe category identifier (see also {@link RecipeCatalysts#getRecipeID(IRecipeHandler)})
|
||||
* @param priority higher priority comes first, default to 0
|
||||
*/
|
||||
public static void addRecipeCatalyst(ItemStack stack, String handlerID, int priority) {
|
||||
RecipeCatalysts.addRecipeCatalyst(handlerID, new CatalystInfo(stack, priority));
|
||||
}
|
||||
|
||||
/**
|
||||
* See {@link API#addRecipeCatalyst(ItemStack, String, int)}
|
||||
*/
|
||||
public static void addRecipeCatalyst(ItemStack stack, String handlerID) {
|
||||
addRecipeCatalyst(stack, handlerID, 0);
|
||||
}
|
||||
|
||||
public static void removeRecipeCatalyst(ItemStack stack, IRecipeHandler handler) {
|
||||
String handlerID = RecipeCatalysts.getRecipeID(handler);
|
||||
removeRecipeCatalyst(stack, handlerID);
|
||||
}
|
||||
|
||||
public static void removeRecipeCatalyst(ItemStack stack, String handlerID) {
|
||||
RecipeCatalysts.removeRecipeCatalyst(handlerID, stack);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static void addRecipeCatalyst(List<ItemStack> stacks, IRecipeHandler handler) {
|
||||
for (ItemStack stack : stacks) {
|
||||
addRecipeCatalyst(stack, handler);
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static void addRecipeCatalyst(List<ItemStack> stacks, String handlerID) {
|
||||
for (ItemStack stack : stacks) {
|
||||
addRecipeCatalyst(stack, handlerID);
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static void addRecipeCatalyst(ItemStack stack, Class<? extends IRecipeHandler> handler) {
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static void addRecipeCatalyst(List<ItemStack> stacks, Class<? extends IRecipeHandler> handler) {
|
||||
}
|
||||
|
||||
}
|
||||
File renamed without changes.
@@ -0,0 +1,77 @@
|
||||
package codechicken.nei.api;
|
||||
|
||||
import codechicken.lib.vec.Rectangle4i;
|
||||
import codechicken.nei.NEIChestGuiHandler;
|
||||
import codechicken.nei.NEICreativeGuiHandler;
|
||||
import codechicken.nei.NEIDummySlotHandler;
|
||||
import codechicken.nei.NEIPotionGuiHandler;
|
||||
import codechicken.nei.recipe.GuiRecipeCatalyst;
|
||||
import codechicken.nei.recipe.SearchInputDropHandler;
|
||||
import codechicken.nei.recipe.FillFluidContainerHandler;
|
||||
import codechicken.nei.recipe.CheatItemHandler;
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.client.gui.inventory.GuiContainerCreative;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
|
||||
public class GuiInfo {
|
||||
public static final LinkedList<INEIGuiHandler> guiHandlers = new LinkedList<>();
|
||||
public static final HashSet<Class<? extends GuiContainer>> customSlotGuis = new HashSet<>();
|
||||
public static ReentrantReadWriteLock guiHandlersLock = new ReentrantReadWriteLock();
|
||||
public static Lock writeLock = guiHandlersLock.writeLock();
|
||||
public static Lock readLock = guiHandlersLock.readLock();
|
||||
|
||||
|
||||
public static void load() {
|
||||
API.registerNEIGuiHandler(new NEICreativeGuiHandler());
|
||||
API.registerNEIGuiHandler(new NEIChestGuiHandler());
|
||||
API.registerNEIGuiHandler(new NEIDummySlotHandler());
|
||||
API.registerNEIGuiHandler(new GuiRecipeCatalyst(null));
|
||||
API.registerNEIGuiHandler(new SearchInputDropHandler());
|
||||
API.registerNEIGuiHandler(new FillFluidContainerHandler());
|
||||
API.registerNEIGuiHandler(new CheatItemHandler());
|
||||
API.registerNEIGuiHandler(new NEIPotionGuiHandler());
|
||||
customSlotGuis.add(GuiContainerCreative.class);
|
||||
}
|
||||
|
||||
public static void clearGuiHandlers() {
|
||||
try {
|
||||
GuiInfo.writeLock.lock();
|
||||
guiHandlers.removeIf(ineiGuiHandler -> ineiGuiHandler instanceof GuiContainer);
|
||||
} finally {
|
||||
GuiInfo.writeLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean hasCustomSlots(GuiContainer gui) {
|
||||
return customSlotGuis.contains(gui.getClass());
|
||||
}
|
||||
|
||||
public static boolean hideItemPanelSlot(GuiContainer gui, Rectangle4i rect)
|
||||
{
|
||||
try {
|
||||
readLock.lock();
|
||||
if (guiHandlers.stream().anyMatch(handler -> handler.hideItemPanelSlot(gui, rect.x, rect.y, rect.w, rect.h))) {
|
||||
return true;
|
||||
}
|
||||
} finally {
|
||||
readLock.unlock();
|
||||
}
|
||||
|
||||
for (Object item : gui.buttonList) {
|
||||
GuiButton button = (GuiButton) item;
|
||||
|
||||
if ((new Rectangle4i(button.xPosition, button.yPosition, button.width, button.height)).intersects(rect)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
File renamed without changes.
Loaded 100 of 229 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user